{"_id":"@arcanahq/sdk-integrations","_rev":"2-9eb6e999af90b62cce55dfe97d1b9c4f","name":"@arcanahq/sdk-integrations","dist-tags":{"latest":"0.1.1"},"versions":{"0.1.0":{"name":"@arcanahq/sdk-integrations","version":"0.1.0","license":"MIT","_id":"@arcanahq/sdk-integrations@0.1.0","maintainers":[{"name":"tapone","email":"johnny@empyrealsdk.com"}],"dist":{"shasum":"615396d4122a884e3da047ea81905c58d5896416","tarball":"https://registry.npmjs.org/@arcanahq/sdk-integrations/-/sdk-integrations-0.1.0.tgz","fileCount":30,"integrity":"sha512-NRJpvMAknb2zjX4xUcbQfu9TfVVWxhK/r2ztQlsGAHOdPahfkOX+Rwvnz2JbzZwxftJrl0+I8x3W/9z1NUHdIA==","signatures":[{"sig":"MEQCIBv6EjPQeH7o4QPHyPwMVbAfSP0iE1TN5Sh/qYHNcgq+AiBODkN1mQUFmz2HmA/nnI9OcRwMX68piUmFqkkWlkx40w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":63682},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./test":{"types":"./dist/test.d.ts","import":"./dist/test.js","default":"./dist/test.js"},"./privy":{"types":"./dist/privy.d.ts","import":"./dist/privy.js","default":"./dist/privy.js"},"./dynamic":{"types":"./dist/dynamic.d.ts","import":"./dist/dynamic.js","default":"./dist/dynamic.js"},"./zerodev":{"types":"./dist/zerodev.d.ts","import":"./dist/zerodev.js","default":"./dist/zerodev.js"},"./authenticate":{"types":"./dist/authenticate.d.ts","import":"./dist/authenticate.js","default":"./dist/authenticate.js"},"./privy-zerodev":{"types":"./dist/privy-zerodev.d.ts","import":"./dist/privy-zerodev.js","default":"./dist/privy-zerodev.js"},"./dynamic-zerodev":{"types":"./dist/dynamic-zerodev.d.ts","import":"./dist/dynamic-zerodev.js","default":"./dist/dynamic-zerodev.js"}},"gitHead":"c9e8a602e25807fbcc843c2419f89a89a93bdc25","scripts":{"dev":"tsc --watch","test":"vitest run","build":"tsc","prepublishOnly":"npm run build"},"_npmUser":{"name":"tapone","email":"johnny@empyrealsdk.com"},"_npmVersion":"11.6.2","description":"Optional wallet and account-abstraction integrations for @arcanahq/sdk","directories":{},"_nodeVersion":"25.2.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"viem":"^2.0.0","vitest":"^4.1.8","typescript":"^5.3.0","@types/node":"^20.19.41","@arcanahq/sdk":"file:../sdk"},"peerDependencies":{"viem":"^2.0.0","@zerodev/sdk":"*","@arcanahq/sdk":"^0.1.0","@privy-io/react-auth":"*","@dynamic-labs-sdk/evm":"*","@dynamic-labs-sdk/client":"*","@dynamic-labs/viem-utils":"*","@dynamic-labs-sdk/zerodev":"*","@dynamic-labs/sdk-react-core":"*","@dynamic-labs-sdk/react-hooks":"*"},"peerDependenciesMeta":{"viem":{"optional":true},"@zerodev/sdk":{"optional":true},"@privy-io/react-auth":{"optional":true},"@dynamic-labs-sdk/evm":{"optional":true},"@dynamic-labs-sdk/client":{"optional":true},"@dynamic-labs/viem-utils":{"optional":true},"@dynamic-labs-sdk/zerodev":{"optional":true},"@dynamic-labs/sdk-react-core":{"optional":true},"@dynamic-labs-sdk/react-hooks":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/sdk-integrations_0.1.0_1782368388547_0.0067727971589404135","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@arcanahq/sdk-integrations","version":"0.1.1","description":"Optional wallet and account-abstraction integrations for @arcanahq/sdk","license":"MIT","type":"module","publishConfig":{"access":"public"},"main":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"import":"./dist/index.js","types":"./dist/index.d.ts","default":"./dist/index.js"},"./privy":{"import":"./dist/privy.js","types":"./dist/privy.d.ts","default":"./dist/privy.js"},"./dynamic":{"import":"./dist/dynamic.js","types":"./dist/dynamic.d.ts","default":"./dist/dynamic.js"},"./zerodev":{"import":"./dist/zerodev.js","types":"./dist/zerodev.d.ts","default":"./dist/zerodev.js"},"./authenticate":{"import":"./dist/authenticate.js","types":"./dist/authenticate.d.ts","default":"./dist/authenticate.js"},"./test":{"import":"./dist/test.js","types":"./dist/test.d.ts","default":"./dist/test.js"},"./privy-zerodev":{"import":"./dist/privy-zerodev.js","types":"./dist/privy-zerodev.d.ts","default":"./dist/privy-zerodev.js"},"./dynamic-zerodev":{"import":"./dist/dynamic-zerodev.js","types":"./dist/dynamic-zerodev.d.ts","default":"./dist/dynamic-zerodev.js"}},"scripts":{"build":"tsc","dev":"tsc --watch","test":"vitest run","prepublishOnly":"npm run build"},"peerDependencies":{"@arcanahq/sdk":"^0.1.0","@dynamic-labs-sdk/client":"*","@dynamic-labs-sdk/evm":"*","@dynamic-labs-sdk/react-hooks":"*","@dynamic-labs-sdk/zerodev":"*","@dynamic-labs/sdk-react-core":"*","@dynamic-labs/viem-utils":"*","@privy-io/react-auth":"*","@zerodev/sdk":"*","viem":"^2.0.0"},"peerDependenciesMeta":{"@dynamic-labs-sdk/client":{"optional":true},"@dynamic-labs-sdk/evm":{"optional":true},"@dynamic-labs-sdk/react-hooks":{"optional":true},"@dynamic-labs-sdk/zerodev":{"optional":true},"@dynamic-labs/sdk-react-core":{"optional":true},"@dynamic-labs/viem-utils":{"optional":true},"@privy-io/react-auth":{"optional":true},"@zerodev/sdk":{"optional":true},"viem":{"optional":true}},"devDependencies":{"@arcanahq/sdk":"file:../sdk","@types/node":"^20.19.41","typescript":"^5.3.0","viem":"^2.0.0","vitest":"^4.1.8"},"gitHead":"d6717a1f77ea48b9ac16d75b57d6e727f6b8dd21","_id":"@arcanahq/sdk-integrations@0.1.1","_nodeVersion":"25.2.1","_npmVersion":"11.6.2","dist":{"integrity":"sha512-v2FgUem277LYCyHrc86602rw53XXF+amo8bEfpoW4mOJM0rO5TJukv/750ySnvwXSbhFzk0zFkXjZZTY2s8uhg==","shasum":"880953f03c0123a395ca0e96fffa3b55b0e9a53a","tarball":"https://registry.npmjs.org/@arcanahq/sdk-integrations/-/sdk-integrations-0.1.1.tgz","fileCount":30,"unpackedSize":63682,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCTaV5AmxDEStfKSc1Nak7jwU0I7WffULSpZAObWI3yugIhAPBMocj+hh2dvTVEfKWOjLNnw3oSmSL5Cq1myddpph4R"}]},"_npmUser":{"name":"tapone","email":"johnny@empyrealsdk.com"},"directories":{},"maintainers":[{"name":"tapone","email":"johnny@empyrealsdk.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/sdk-integrations_0.1.1_1782369145642_0.5630293026694939"},"_hasShrinkwrap":false}},"time":{"created":"2026-06-25T06:19:48.381Z","modified":"2026-06-25T06:32:25.953Z","0.1.0":"2026-06-25T06:19:48.680Z","0.1.1":"2026-06-25T06:32:25.811Z"},"license":"MIT","description":"Optional wallet and account-abstraction integrations for @arcanahq/sdk","maintainers":[{"name":"tapone","email":"johnny@empyrealsdk.com"}],"readme":"# Arcana SDK Integrations\n\nOptional wallet and account-abstraction integrations for `@arcanahq/sdk`.\n\nThe base SDK remains provider-agnostic. This package normalizes Privy, Dynamic,\nand ZeroDev setup into Arcana's device-auth flow without making those providers\nrequired dependencies of `@arcanahq/sdk`.\n\nFor environment variables, provider dashboard setup, and complete project setup,\nsee [SETUP.md](./SETUP.md).\n\n## Install\n\n```bash\nnpm install @arcanahq/sdk @arcanahq/sdk-integrations viem\n```\n\nInstall only the provider packages your app uses.\n\nPrivy:\n\n```bash\nnpm install @privy-io/react-auth\n```\n\nDynamic JavaScript SDK:\n\n```bash\nnpm install @dynamic-labs-sdk/client @dynamic-labs-sdk/evm\n```\n\nDynamic React SDK:\n\n```bash\nnpm install @dynamic-labs/sdk-react-core @dynamic-labs/ethereum\n```\n\nDynamic + ZeroDev:\n\n```bash\nnpm install @dynamic-labs-sdk/client @dynamic-labs-sdk/evm @dynamic-labs-sdk/zerodev\n```\n\nLocal test auth:\n\n```bash\nnpm install @arcanahq/sdk-integrations viem\n```\n\nZeroDev:\n\n```bash\nnpm install @zerodev/sdk @zerodev/ecdsa-validator\n```\n\n## How Arcana Auth Works With Account Abstraction\n\nArcana device registration currently verifies an EIP-712 ECDSA signature by\nrecovering the signer address and requiring it to match `user_address`.\n\nThat means Arcana auth must use the EOA or embedded signer that controls the\nsmart account. Do not pass a Kernel/smart-account client as the Arcana auth\nsigner. Use ZeroDev/Kernel for onchain account-abstraction transactions after\nArcana auth is complete.\n\nThe ZeroDev helpers in this package enforce that: they require\n`ownerWalletClient` or `signerWalletClient` and keep the smart-account address\nonly as metadata for your app.\n\n## Privy\n\nPrivy wallets expose an EIP-1193 provider through `wallet.getEthereumProvider()`.\nThis package can use that directly.\n\n```typescript\nimport { ArcanaClient } from '@arcanahq/sdk';\nimport {\n  createPrivyArcanaWalletAdapter,\n  registerArcanaDeviceWithAdapter,\n} from '@arcanahq/sdk-integrations/privy';\n\nconst client = new ArcanaClient({ apiUrl: 'http://localhost:3003' });\nawait client.init();\n\nconst adapter = await createPrivyArcanaWalletAdapter({\n  wallet: privyWallet,\n});\n\nawait registerArcanaDeviceWithAdapter(client, adapter, {\n  deviceName: 'Privy wallet',\n});\n```\n\nIf you already converted a Privy wallet to a Viem account with Privy's\n`toViemAccount`, pass it as `account`:\n\n```typescript\nconst adapter = await createPrivyArcanaWalletAdapter({ account });\nawait registerArcanaDeviceWithAdapter(client, adapter);\n```\n\n## Dynamic\n\nDynamic's current JavaScript SDK exposes Viem wallet clients through\n`createWalletClientForWalletAccount` from `@dynamic-labs-sdk/evm/viem`.\n\n```typescript\nimport { getPrimaryWalletAccount } from '@dynamic-labs-sdk/client';\nimport { createWalletClientForWalletAccount } from '@dynamic-labs-sdk/evm/viem';\nimport {\n  ensureArcanaSessionWithDynamic,\n} from '@arcanahq/sdk-integrations/dynamic';\n\nconst walletAccount = getPrimaryWalletAccount();\nif (!walletAccount) {\n  throw new Error('No Dynamic wallet account is connected');\n}\n\nconst walletClient = await createWalletClientForWalletAccount({\n  walletAccount,\n});\n\nconst session = await ensureArcanaSessionWithDynamic({\n  client,\n  walletClient,\n  deviceName: 'Dynamic wallet',\n});\nconsole.log(`Arcana ${session.status} for ${session.address}`);\n```\n\nFor Dynamic React projects using wallet objects that expose `getWalletClient()`\nor `getEthereumProvider()`, you can pass the wallet directly:\n\n```typescript\nconst session = await ensureArcanaSessionWithDynamic({\n  client,\n  wallet: primaryWallet,\n  chainId: 57073,\n  deviceName: 'Dynamic wallet',\n});\n```\n\nUse `ensureArcanaSessionWithDynamic` from the sign-in button after Dynamic has a\nconnected wallet. It restores an existing Arcana device session for that wallet\nor registers a new one. Keep action guards separate: submit actions only after\nthis helper returns a `userId`.\n\n## Local Test Auth\n\nUse the test adapter for local automation and agentic E2E runs where OTP or\nhosted embedded-wallet flows would slow the loop down. It exposes the same\n`ArcanaWalletAdapter` shape as Privy and Dynamic, but signs with a deterministic\nlocal private key.\n\n```typescript\nimport {\n  createTestArcanaWalletAdapter,\n  registerArcanaDeviceWithAdapter,\n} from '@arcanahq/sdk-integrations/test';\n\nconst adapter = createTestArcanaWalletAdapter({\n  chainId: 31337,\n  privateKey: import.meta.env.VITE_ARCANA_TEST_PRIVATE_KEY,\n});\n\nawait registerArcanaDeviceWithAdapter(client, adapter, {\n  deviceName: 'Arcana test user',\n});\n```\n\nThe default private key is Anvil's first account. Only enable this in local or\ntest environments.\n\n## Dynamic + ZeroDev\n\nDynamic's ZeroDev extension can return the EOA signer for a smart wallet account\nwith `getSignerForSmartWalletAccount`. Use that signer for Arcana auth, and use\nthe Kernel client for onchain UserOps.\n\n```typescript\nimport { getPrimaryWalletAccount } from '@dynamic-labs-sdk/client';\nimport { createKernelClientForWalletAccount } from '@dynamic-labs-sdk/zerodev';\nimport {\n  getSignerForSmartWalletAccount,\n} from '@dynamic-labs-sdk/zerodev';\nimport {\n  createDynamicZeroDevArcanaWalletAdapter,\n  registerArcanaDeviceWithAdapter,\n} from '@arcanahq/sdk-integrations/dynamic-zerodev';\n\nconst smartWalletAccount = getPrimaryWalletAccount();\nif (!smartWalletAccount) {\n  throw new Error('No Dynamic smart wallet account is connected');\n}\n\nconst signerWalletClient = await getSignerForSmartWalletAccount({\n  smartWalletAccount,\n});\n\nconst kernelClient = await createKernelClientForWalletAccount({\n  walletAccount: smartWalletAccount,\n});\n\nconst adapter = createDynamicZeroDevArcanaWalletAdapter({\n  signerWalletClient,\n  smartAccountAddress: kernelClient.account.address,\n});\n\nawait registerArcanaDeviceWithAdapter(client, adapter, {\n  deviceName: 'Dynamic + ZeroDev',\n});\n\nconst smartAccountAddress = adapter.getSmartAccountAddress();\n```\n\n## Privy + ZeroDev\n\nPrivy smart wallets are controlled by an embedded signer. Use the embedded\nwallet signer for Arcana auth, then use your ZeroDev Kernel client for onchain\naccount-abstraction transactions.\n\n```typescript\nimport {\n  createPrivyArcanaWalletAdapter,\n  registerArcanaDeviceWithAdapter,\n} from '@arcanahq/sdk-integrations/privy';\n\nconst authAdapter = await createPrivyArcanaWalletAdapter({\n  wallet: privyEmbeddedWallet,\n});\n\nawait registerArcanaDeviceWithAdapter(client, authAdapter, {\n  deviceName: 'Privy + ZeroDev',\n});\n```\n\nIf you build Kernel manually, pass the same owner signer you used for\n`signerToEcdsaValidator` to Arcana:\n\n```typescript\nimport {\n  createPrivyZeroDevArcanaWalletAdapter,\n  registerArcanaDeviceWithAdapter,\n} from '@arcanahq/sdk-integrations/privy-zerodev';\n\nconst adapter = createPrivyZeroDevArcanaWalletAdapter({\n  ownerWalletClient,\n  smartAccountAddress: kernelClient.account.address,\n});\n\nawait registerArcanaDeviceWithAdapter(client, adapter);\n```\n\n## ZeroDev\n\nZeroDev Kernel accounts are smart accounts owned by a signer. Use the signer for\nArcana auth:\n\n```typescript\nimport {\n  createZeroDevArcanaWalletAdapter,\n  registerArcanaDeviceWithAdapter,\n} from '@arcanahq/sdk-integrations/zerodev';\n\nconst adapter = createZeroDevArcanaWalletAdapter({\n  ownerWalletClient,\n  smartAccountAddress: kernelClient.account.address,\n});\n\nawait registerArcanaDeviceWithAdapter(client, adapter, {\n  deviceName: 'ZeroDev owner signer',\n});\n```\n\n## Failure Behavior\n\nThe adapters intentionally fail loudly when required integration pieces are\nmissing:\n\n- invalid or missing EVM address\n- missing `signTypedData`\n- malformed `eth_accounts` or `eth_chainId` provider responses\n- missing Arcana `deviceAuth`\n- Kernel/smart-account client passed without an owner signer\n\nThere is no silent fallback from a smart account to an EOA signer. The app must\nchoose and pass the correct signer explicitly.\n","readmeFilename":"README.md"}