Overview
This guide explains how to use Dynamic embedded wallets with Particle Universal Accounts in EIP-7702 mode, using the JavaScript SDK. In that mode, the user keeps the same EOA address while delegating execution to Particle’s Universal Account contract via a Type-4 transaction — Particle’s docs describe the model in EIP-7702 compatible embedded wallets. Universal Accounts provide users with a single account and balance that works across any chain, eliminating the need to manage multiple wallets or manually bridge assets. Particle Network’s infrastructure handles all cross-chain liquidity routing and bridging behind the scenes, making the entire Web3 ecosystem feel like one unified network. Developers can easily integrate them via the Universal SDK, with built-in support for social logins, wallet connections, and gasless cross-chain transactions. EIP-7702 uses anauthorizationList on the transaction; each authorization must be signed by the EOA key. Standard JSON-RPC wallets (for example MetaMask or Rabby) typically do not expose what you need, so Particle documents embedded signers for this path — including Dynamic.
Dynamic’s embedded wallets expose a viem WalletClient, and viem’s walletClient.signAuthorization() can sign for any contract address — so your app can satisfy Particle’s delegation and inline-auth steps. This is different from Dynamic’s own sign7702Authorization helper, which is hardcoded to Dynamic’s gasless delegation contract and cannot target Particle’s Universal Account contract. Use the setup below together with Particle’s Universal Account SDK.
Setup
What you need to know: Before this, create and initialize a Dynamic client (see Creating a Dynamic Client, Initializing the Dynamic Client) and register the WaaS EVM extension so the client provisions an embedded EVM wallet.
Get the embedded wallet with
isEvmWalletAccount(), then create its viem wallet client:
- JavaScript
- React
Delegation flow with Universal Accounts
Particle’s client drives status, auth parameters, and broadcast; your embedded wallet’s viem client signs. The shape usually matches:- Check status — Universal Account client (for example
getEIP7702Deployments()). - Fetch auth parameters — Per chain from the client (for example
getEIP7702Auth([chainId])), which returns the Universal Account contractaddressto delegate to. - Sign —
walletClient.signAuthorization({ address, chainId, nonce })on the viem wallet client for the embedded wallet (see Setup). Pass Particle’s contractaddresshere — Dynamic’ssign7702Authorizationcannot be used, since it only targets Dynamic’s own gasless delegation contract. - Broadcast — Type-4 transaction with
authorizationList(often viawalletClient.sendTransaction). - Later steps — Particle may require a
rootHashor message signature via normal signing, thensendTransactionon the Universal Account client.
- JavaScript
- React
isEvmWalletAccount(). Method names on the Particle side follow their reference.
Inline authorizations on later transactions
After delegation, Universal Account transactions can include pending EIP-7702 authorizations on individual user operations. Sign each with the same viem wallet client’ssignAuthorization, serialize as your integration expects (for example ethers Signature.from()), and pass them into Particle’s sendTransaction flow along with the rootHash signature. The demo in the next section does this for a cross-chain convert.
Reference demo: Next.js, Dynamic, and Particle
The open-source app ua-dynamic-7702 implements Dynamic embedded wallet login, EIP-7702 delegation on Arbitrum, and a cross-chain convert with Particle’s Universal Account SDK. Use it as the working reference for:- Network — Switching to the chain used for delegation before sending the Type-4 transaction
- Signature shape — Using
ethersSignature.from()when the downstream SDK expects serialized authorizations - Provider edge cases — The repo documents a
getSigner()/accountworkaround inhooks/universal-account-provider.tsxfor their Universal Account integration
The demo repo predates the JavaScript SDK and signs with the React SDK’s WaaS connector (
isDynamicWaasConnector() + signAuthorization()). Porting it: replace that connector check with isEvmWalletAccount(), get a viem wallet client with createWalletClientForWalletAccount() (see Setup), and call walletClient.signAuthorization() in its place. The Particle Universal Account client calls, ethers serialization, and provider workaround stay the same.package.json, lockfile, and README for exact versions and .env.local keys, swapping the Dynamic packages for @dynamic-labs-sdk/client, @dynamic-labs-sdk/evm, and (in React) @dynamic-labs-sdk/react-hooks.
ua-dynamic-7702 on GitHub
Next.js demo: Dynamic embedded wallet, EIP-7702 delegation, and Universal Accounts cross-chain convert.
Related
- Getting a Viem WalletClient
- Checking EVM Wallet Account Type
- Managing EIP-7702 delegation — Dynamic’s own gasless delegation contract, for contrast with Particle’s
- React Quickstart (JS SDK)