Tier 2 and Tier 3 chains both use the same raw signing primitives from Dynamic embedded wallets. Tier 2 includes helper methods and EOA support; Tier 3 is derivation only with no official helpers. Gas handling and policies are not yet supported for either tier.Dynamic supports three Tier 1 embedded wallets: an EVM wallet (secp256k1), a Solana wallet (Ed25519), and a Bitcoin wallet (secp256k1). Because many blockchains share these same elliptic curves, you can derive addresses and sign transactions on additional chains without creating new keys.The technique is straightforward: extract the public key from the existing wallet, apply chain-specific hashing and encoding, and use Dynamic’s raw signing capability to sign chain-native transactions.
Tier 2 chains are not natively represented in Dynamic’s UI or session model. You are responsible for managing the user-facing experience: displaying derived addresses, associating them with your user records, and handling any chain-specific session or account state yourself.
Exporting the root wallet key exposes all derived addresses. The EVM and Solana embedded wallet keys are the cryptographic root of every address you derive from them. If you export the private key of the EVM wallet (secp256k1) or the Solana wallet (Ed25519) — for example via exportWaasPrivateKey — anyone with that key can independently derive and control all Tier 2 addresses generated from it, across every chain. Never expose or transmit root wallet keys unless you have explicitly designed for that use case.
Bitcoin is a Tier 1 chain with full embedded wallet support. Its secp256k1 signing primitives can also be used for Tier 2-style derivation — signing for other secp256k1 chains using the Bitcoin embedded wallet as the root, in the same way the EVM wallet is used. Complete example code is not yet published, but the signing primitives are available. Reach out if you need guidance.
Create embedded wallets — When a user authenticates, create both EVM and Solana embedded wallets using Dynamic. These wallets hold the root keys.
Use raw signing — Extract the public key from the appropriate root wallet, derive a chain-native address, and sign transactions using Dynamic’s signMessage or signRawMessage methods.
For Ed25519-based chains (Aptos, Cardano, NEAR, Mavryk), the Solana wallet’s base58 address directly decodes to the 32-byte Ed25519 public key. You apply chain-specific hashing to derive an address, and use signMessage to sign transaction digests.
import bs58 from "bs58";// Extract the Ed25519 public key from a Solana addressfunction solanaAddressToPubkey(solanaAddress: string): Uint8Array { return bs58.decode(solanaAddress); // 32-byte Ed25519 pubkey}
For secp256k1-based chains (Cosmos, XRP, Tron, Starknet), you recover the compressed public key by signing a deterministic SHA-256 digest of a recovery string with the EVM wallet using signRawMessage, then using ecrecover:
import { secp256k1 } from "@noble/curves/secp256k1";import { sha256 } from "@noble/hashes/sha2";import { createWaasProvider } from "@dynamic-labs-sdk/client/waas/core";async function recoverEvmPublicKey( recoveryMessage: string, evmWallet: WalletAccount, dynamicClient: DynamicClient,): Promise<Uint8Array> { const provider = createWaasProvider({ sdkClient: dynamicClient, chain: "EVM", }); // Hash the recovery message with SHA-256 and sign the raw digest const msgHash = sha256(new TextEncoder().encode(recoveryMessage)); const { signature } = await provider.signRawMessage({ message: bytesToHex(msgHash), walletAccount: evmWallet, }); // Parse signature: r (32 bytes) + s (32 bytes) + v (1 byte) const sigBytes = hexToBytes(strip0x(signature)); const rsHex = bytesToHex(sigBytes.slice(0, 64)); let v = sigBytes[64]; if (v >= 27) v -= 27; const sig = secp256k1.Signature.fromHex(rsHex).addRecoveryBit(v); return sig.recoverPublicKey(msgHash).toBytes(true); // 33-byte compressed}
Tron is a special case — since Tron addresses are derived from the same keccak256 hash as EVM, you can derive a Tron address directly from the EVM address without key recovery. See the Tron page for details.
Cosmos SDK chains use secp256k1 with bech32-encoded addresses. The public key is recovered from the EVM wallet via ecrecover. The same key derives addresses for any Cosmos chain by changing the bech32 prefix (e.g., cosmos for Cosmos Hub, osmo for Osmosis).
Starknet uses a unique approach: the secp256k1 public key from the EVM wallet is used to derive a Stark-curve private key via grindKey, which then produces a Stark public key and a counterfactual contract address via Pedersen hashing.
Tron uses secp256k1 with keccak256 hashing — the same cryptographic scheme as Ethereum. Since Tron addresses are derived from the same public key hash, you can derive a Tron address directly from the EVM address by swapping the 0x prefix for 0x41 and base58check-encoding the result.