Skip to main content
Spin up millions of secure, server-controlled wallets with battle-tested MPC infrastructure. Built for onchain automation, Dynamic Server Wallets let you trigger transactions, interact with contracts, and run complex flows—all without user involvement, and fully owned by your backend.
The server wallet SDK (@dynamic-labs-wallet/node-evm, @dynamic-labs-wallet/node-svm) relies on native binary addons for MPC cryptography, so it runs only on a standard Node.js 18+ runtime — Linux (x64/arm64) or macOS (arm64).It will not run in environments without native addon support, including browsers, edge runtimes (Cloudflare Workers, Vercel Edge Functions), or alternative runtimes (Deno, Bun). For serverless, deploy to a Node.js runtime such as an AWS Lambda Node function or Cloud Function — not an edge or custom runtime.
Find pricing for server wallets here.

Setup

Reference example: GitHub example
1

Enable multiple embedded wallets per chain

Navigate to the Dynamic Dashboard and enable multiple embedded wallets per chain.
2

Retrieve your auth token

Navigate to the Dynamic Dashboard and create a new API token.
3

Install desired Node SDKs

4

Create client with authenticateApiToken

Separate clients are needed for each chain.
5

Access MPC functionality by creating a new wallet account

The Node SDK is stateless. createWalletAccount() returns two pieces of state that you must persist on the customer side:
  • walletMetadata — non-sensitive identity + backup-pointer info. Cache it in Redis, Postgres, or similar. You’ll pass it to every subsequent sign / export / backup operation.
  • externalServerKeyShares — sensitive MPC key material. Store in a secrets vault (HSM, KMS-wrapped column, Secret Manager).
See Storage Best Practices for the cache + vault split. The wallet’s address is at walletMetadata.accountAddress — pass walletMetadata to subsequent calls rather than reconstructing args from individual fields.
Removed in V1. The Node SDK no longer holds wallet state internally. If you are migrating from a pre-V1 SDK, the following have been removed: the in-memory walletMap, client.getWallet(address), initializeWalletMapEntry, and ensureCeremonyCompletionBeforeBackup. recoverEncryptedBackupByWallet no longer accepts storeRecoveredShares — the caller now decides what to do with the returned shares. Every sign / export / backup operation now takes explicit walletMetadata (and externalServerKeyShares when supplying shares yourself), so the caller owns persistence.
backUpToDynamic is false by default, which means Dynamic will not store the key shares for you. You are responsible for securely storing the externalServerKeyShares returned by createWalletAccount. Losing these shares means losing access to the wallet. See Storage Best Practices for guidance on secure storage.Alternatively, set backUpToDynamic: true to leverage Dynamic’s key share service, in which case you do not need to manage storage yourself.
6

Example: Sign a message with the MPC wallet account

End-to-end example: agent signs a transaction

A complete example showing a backend agent that receives a webhook, recovers key shares, signs an EVM transaction, and broadcasts it:
This pattern works for any automation: cron jobs, webhook handlers, AI agents, or queue consumers. The SDK is stateless — load walletMetadata and key shares per operation, sign, then discard.

Custom EVM networks

Server wallets work on any EVM-compatible chain — you are not limited to chains pre-configured in the dashboard. Pass chainId and rpcUrl when creating a Viem wallet client:
When using chainId, you must also provide rpcUrl. The SDK configures the chain with default ETH currency settings. For full details, see Get a Viem wallet client — Custom chain configuration.Signing is chain-agnostic — the SDK signs transactions via MPC and does not require the network to be enabled in your Dynamic dashboard, so any custom or non-listed EVM network works (you just supply the rpcUrl above).

Next Steps

You can find the full SDK reference for server wallets for each chain below:

EVM

EVM Guides

SVM

SVM Guides
Last modified on July 3, 2026