Wallet infrastructure that turns crypto demand into revenue

Grow your revenue by offering onchain products like Pay with Crypto, tokenized assets, yield and more. Quickly launch secure, non-custodial wallets without crypto specialists.

Scale that's battle-tested

50M+

Users onboarded

600+

External wallets supported

< 1

Second signing speed

Crypto features your customers demand

Dynamic gives your customers the ability to trade, earn, pay, and move money on global crypto rails.

Trade

Expand what customers can trade from prediction markets to tokenized assets.

Earn

Offer yield on balances to keep customers engaged with your app.

Pay

Let customers pay with and deposit crypto from any wallet or exchange. No on/off-ramping required.

Move

Let customers send money globally, fast, cheap, and 24/7.

Designed for developers. Built for enterprise.

Build your way — from low-level APIs to full SDKs. Use primitives for full control or prebuilt flows to ship fast. Get sub-second signing and enterprise-grade security. Scale from concept to millions without rebuilding your stack.

One complete wallet stack

Dynamic is the only platform with embedded wallets, external wallets, and multi-chain connectivity in one unified SDK.

Built for security, engineered for speed

Security is the foundation of everything we do. From key management to infrastructure, every layer of Dynamic is designed for safety, reliability, and compliance.

Enterprise self-custody

Every wallet benefits from secure distributed signing, flexible thresholds, and built-in recovery paths.

Learn more

Fireblocks security

Dynamic inherits Fireblocks’ security expertise, practices, and operational rigor. Together, we deliver institutional-grade protection from custody to consumer wallets.

2,400+ institutions
$10T+ in transactions
550M+ wallets

Defense in depth

Our infrastructure is regularly audited by top firms and protected by a public bug bounty program.

Advanced authentication
Policy controls
MFA
Allowlists
Rate-limiting safeguards

Sub-second signing

Transactions complete in under a second. Users get speed and enterprise-grade security in every wallet interaction.

Recent audits

99.9% uptime

July 2025

April 2025

February 2025

September 2024

Ongoing Bounty Program

Install our SDK in minutes!

1

Get an environment ID

Set up an account to get your environment ID.

2

Install the Dynamic NPM package

This takes a few seconds.

3

Set up your snippet and customize

Once you set up your snippet, you can further customize things within your developer dashboard. You can also check out a working demo environment here:

Copied!

npm i viem @dynamic-labs/sdk-react-core @dynamic-labs/ethereum

>
Copied!

import {
 DynamicContextProvider,
 DynamicWidget,
} from "@dynamic-labs/sdk-react-core";
import { EthereumWalletConnectors } from "@dynamic-labs/ethereum";

export default function App() {
 return (
   <DynamicContextProvider
     settings={{
       // Find your environment id at https://app.dynamic.xyz/dashboard/developer
       environmentId: "REPLACE-WITH-YOUR-ENVIRONMENT-ID",
       walletConnectors: [EthereumWalletConnectors],
     }}
   >
     <DynamicWidget />
   </DynamicContextProvider>
 );
}


Copied!

npm i @dynamic-labs/viem-extension@alpha @dynamic-labs/client@alpha @dynamic-labs/react-native-extension@alpha @dynamic-labs/react-hooks@alpha react-native-webview expo-web-browser expo-linking expo-secure-store

>
Copied!

import { createClient } from "@dynamic-labs/client";
import { ReactNativeExtension } from "@dynamic-labs/react-native-extension";
import { ViemExtension } from "@dynamic-labs/viem-extension";

export const dynamicClient = createClient({
 // Find your environment id at https://app.dynamic.xyz/dashboard/developer
 environmentId: "REPLACE-WITH-YOUR-ENVIRONMENT-ID",  // Optional:
 appLogoUrl: "https://demo.dynamic.xyz/favicon-32x32.png",
 appName: "Dynamic Demo",
})
 .extend(ReactNativeExtension())
 .extend(ViemExtension());

export function App() {
 return (
   <>
     <dynamicClient.reactNative.WebView />      <SafeAreaView>
       <Text>Hello, world!</Text>
     </SafeAreaView>
   </>
 );
}


Copied!

flutter pub add dynamic_sdk dynamic_sdk_web3dart

>
Copied!

import 'package:dynamic_sdk/dynamic_sdk.dart';

void main() {
 WidgetsFlutterBinding.ensureInitialized();
 DynamicSDK.init(
   props: ClientProps(
     // Find your environment id at https://app.dynamic.xyz/dashboard/developer
     environmentId: 'REPLACE-WITH-YOUR-ENVIRONMENT-ID',      // Optional:
     appLogoUrl: 'https://demo.dynamic.xyz/favicon-32x32.png',
     appName: 'Dynamic Demo',
   ),
 );
 runApp(const MyApp());
}

class MyApp extends StatelessWidget {
 const MyApp({super.key});  

@override
 Widget build(BuildContext context) {
   return MaterialApp(
     title: 'Flutter Demo',
     theme: ThemeData(
       colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
       useMaterial3: true,
     ),
     home: Stack(
       children: [
         // Make sure the SDK is ready before using it
         StreamBuilder<bool?>(
           stream: DynamicSDK.instance.sdk.readyChanges,
           builder: (context, snapshot) {
             final sdkReady = snapshot.data ?? false;
             return sdkReady
                 ? const MyHomePage(title: 'Flutter Demo Home Page')
                 : const SizedBox.shrink();
           },
         ),
         // DynamicSDK widget must be available all the time
         DynamicSDK.instance.dynamicWidget,
       ],
     ),
   );
 }
}


Copied!

import DynamicSwiftSDK

let config = DynamicClientConfig(
   environmentId: "<your env id>"
)

let dynamicClient = createDynamicClient(config: config)

// Authenticate a user
let otpVerification: OTPVerification = try await sendEmailOtp(
   client: dynamicClient,
   email: userEmail
)

let authenticatedUser: SdkUser = try await verifyOtp(
   otpVerification: otpVerification,
   verificationToken: otpCode
)

// Create user's wallet
let accountAddress = try await createWalletAccount(client: dynamicClient)


Copied!

npm i @dynamic-labs-sdk/client @dynamic-labs-sdk/evm viem

>
Copied!

import { createDynamicClient } from "@dynamic-labs-sdk/client";

import { addEvmExtension } from "@dynamic-labs-sdk/evm";

const client = createDynamicClient({
 environmentId: "[YOUR_ENVIRONMENT_ID]",
 metadata: {
   name: "[YOUR_APP_NAME]",
   url: "[YOUR_APP_URL]",
 },
});

// Add extensions based on your chain configuration
addEvmExtension(client);