Skip to main content

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 an authorizationList 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.
Particle’s EIP-7702 Universal Account mode expects an embedded wallet that can sign EIP-7702 authorizations. External wallets generally do not implement signAuthorization on the user’s EOA. If you must support only external wallets with Particle, use the account mode their docs describe for JSON-RPC wallets instead of strict EIP-7702 delegation from that EOA.

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:
See Getting a Viem WalletClient and Checking EVM Wallet Account Type for more on both functions.

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:
  1. Check status — Universal Account client (for example getEIP7702Deployments()).
  2. Fetch auth parameters — Per chain from the client (for example getEIP7702Auth([chainId])), which returns the Universal Account contract address to delegate to.
  3. Sign — walletClient.signAuthorization({ address, chainId, nonce }) on the viem wallet client for the embedded wallet (see Setup). Pass Particle’s contract address here — Dynamic’s sign7702Authorization cannot be used, since it only targets Dynamic’s own gasless delegation contract.
  4. Broadcast — Type-4 transaction with authorizationList (often via walletClient.sendTransaction).
  5. Later steps — Particle may require a rootHash or message signature via normal signing, then sendTransaction on the Universal Account client.
Signing (step 3) reuses the wallet client from Setup:
Steps 3 and 4 require an embedded EVM wallet. Confirm with 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’s signAuthorization, 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 ethers Signature.from() when the downstream SDK expects serialized authorizations
  • Provider edge cases — The repo documents a getSigner() / account workaround in hooks/universal-account-provider.tsx for 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.
Dependencies and env vars — Match the stack table; use the demo 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.
For the full Particle-side API and provider comparison, see EIP-7702 compatible embedded wallets.
Last modified on October 24, 2026