Skip to main content

Dynamic Wallet SDK for Python

A Python SDK for Dynamic's MPC (Multi-Party Computation) wallet infrastructure. Create, sign with, broadcast from, and manage non-custodial wallets from Python — no browser required.

Installation

pip install dynamic-wallet-sdk

Pre-built wheels are provided for Linux (x86_64, ARM64) and macOS (x86_64, Apple Silicon). No Rust toolchain required.

Requirements

Quick Start

EVM Wallet

import asyncio
from dynamic_wallet_sdk.evm.client import DynamicEvmWalletClient

async def main():
    async with DynamicEvmWalletClient("your-environment-id") as client:
        await client.authenticate_api_token("your-api-token")

        # Create wallet (MPC keygen). Returns WalletProperties.
        wp = await client.create_wallet_account(password="backup-password")
        address = wp.account_address
        print(f"Created EVM wallet: {address}")

        # Sign a message (EIP-191)
        signature = await client.sign_message(message="Hello, Dynamic!", address=address)
        print(f"Signature: {signature}")

        # Sign EIP-712 typed data
        typed_data = {
            "types": {...},
            "primaryType": "...",
            "domain": {...},
            "message": {...},
        }
        sig = await client.sign_typed_data(address, typed_data)

        # Sign a legacy transaction and broadcast it
        tx = {
            "to": "0xRecipient...",
            "value": 0,
            "nonce": 0,
            "gas": 21000,
            "gasPrice": 20_000_000_000,
            "chainId": 1,
            "data": "0x",
        }
        tx_hash = await client.send_transaction(
            address=address, tx=tx, rpc_url="https://mainnet.infura.io/v3/YOUR_KEY"
        )
        print(f"Tx hash: {tx_hash}")

asyncio.run(main())

Solana (SVM) Wallet

import asyncio
from dynamic_wallet_sdk.svm.client import DynamicSvmWalletClient

async def main():
    async with DynamicSvmWalletClient("your-environment-id") as client:
        await client.authenticate_api_token("your-api-token")

        wp = await client.create_wallet_account(password="backup-password")
        address = wp.account_address
        print(f"Created Solana wallet: {address}")

        signature = await client.sign_message(message="Hello from Solana!", address=address)
        print(f"Signature (base58): {signature}")

        # Sign a transaction message and broadcast it
        message_bytes = bytes(...)   # serialized Solana tx message
        tx_sig = await client.send_transaction(
            address=address,
            message_bytes=message_bytes,
            rpc_url="https://api.mainnet-beta.solana.com",
        )
        print(f"Tx signature: {tx_sig}")

asyncio.run(main())

Delegated Signing

For server-side signing where key shares are held by your server:

from dynamic_wallet_sdk.delegated.client import (
    create_delegated_evm_client,
    delegated_sign_message,
)
from dynamic_wallet_sdk.delegated.decrypt import decrypt_delegated_webhook_data

# 1. Decrypt the webhook payload you received from Dynamic
decrypted = decrypt_delegated_webhook_data(
    private_key_pem=rsa_private_key,
    encrypted_delegated_key_share=webhook["encryptedDelegatedShare"],
    encrypted_wallet_api_key=webhook["encryptedWalletApiKey"],
)

# 2. Create a client and sign
client = await create_delegated_evm_client("env-id", "api-key")
sig = await delegated_sign_message(
    client,
    wallet_id="wallet-id",
    wallet_api_key=decrypted.decrypted_wallet_api_key,
    key_share=decrypted.decrypted_delegated_share["secretShare"],
    message="0x...",
    chain_name="EVM",
    is_formatted=True,
)

Key Concepts

Key Backup and Recovery

Pass a password to create_wallet_account() to encrypt and back up key shares at keygen time. The password is never sent to Dynamic — only AES-256-GCM ciphertext is stored.

Auto-recovery on sign: pass password= directly to any sign call and the SDK will recover shares automatically if they are not already in memory:

# Shares were lost (process restarted, etc.) — just pass password= and signing works
signature = await client.sign_message(
    message="Hello!", address=address, password="backup-password"
)

Explicit recovery:

shares = await client.recover_key_shares(address, password="backup-password")

Session Rehydration

To rehydrate a known wallet in a new session without fetching all user wallets:

wp = await client.load_wallet(address)
# wp.account_address, wp.wallet_id, and backup metadata are populated
# Signing with password= will auto-recover key shares as needed

Transaction Broadcasting

Every chain client exposes two broadcast patterns:

send_transaction() — sign and broadcast in one call:

# EVM
tx_hash = await evm_client.send_transaction(address, tx, rpc_url="https://...")

# SVM
tx_sig = await svm_client.send_transaction(address, message_bytes, rpc_url="https://...")

Standalone utilities — sign first, broadcast separately:

from dynamic_wallet_sdk.evm import broadcast_raw_transaction
from dynamic_wallet_sdk.svm import attach_signature, broadcast_raw_transaction as svm_broadcast

# EVM: build the signed raw tx yourself, then broadcast
tx_hash = await broadcast_raw_transaction(signed_tx_hex, rpc_url)

# SVM: attach signature to message bytes, then broadcast
signed_tx = attach_signature(message_bytes, sig_hex)   # → bytes
tx_sig    = await svm_broadcast(signed_tx, rpc_url)

RPC URLs are supplied by the developer — use any JSON-RPC node (Infura, Alchemy, Helius, QuickNode, a local node, etc.). The SDK is RPC-provider-agnostic.

Threshold Signature Schemes

The SDK supports two TSS configurations:

Scheme Parties Threshold Client Shares Server Shares
TWO_OF_TWO 2 2 1 1
TWO_OF_THREE 3 2 2 1

Chain Support

Chain Algorithm Client Class
EVM ECDSA DynamicEvmWalletClient
SVM (Solana) Ed25519 DynamicSvmWalletClient

Metadata

Release files for dynamic-wallet-sdk 0.6.2

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for dynamic-wallet-sdk 0.6.2
File Size Uploaded
dynamic_wallet_sdk-0.6.2.tar.gz 110.8 kB Details

Built distributions (wheels)

Table of built distributions (wheels) for dynamic-wallet-sdk 0.6.2
File
dynamic_wallet_sdk-0.6.2-cp311-abi3-manylinux_2_28_x86_64.whl CPython 3.11 abi3 Linux glibc 2.28+ x86-64 Details
dynamic_wallet_sdk-0.6.2-cp311-abi3-manylinux_2_28_aarch64.whl CPython 3.11 abi3 Linux glibc 2.28+ ARM64 Details
dynamic_wallet_sdk-0.6.2-cp311-abi3-macosx_11_0_arm64.whl CPython 3.11 abi3 macOS 11.0+ ARM64 Details
dynamic_wallet_sdk-0.6.2-cp311-abi3-macosx_10_12_x86_64.whl CPython 3.11 abi3 macOS 10.12+ x86-64 Details

Total release size: 19.3 MB

Release files / dynamic_wallet_sdk-0.6.2.tar.gz

Download URL dynamic_wallet_sdk-0.6.2.tar.gz
Size 110.8 kB
Tags Source
SHA-256 checksum
How to use checksums
5c8ed3ca66151a39628af95f0d9dae7ed6ce6daf4e6687389acad305457d06c9
BLAKE2b-256 checksum
How to use checksums
96a60689b9e076d7d663b22b5b595dd7a05a964c8a6b89f7b115974f09e2c7e3
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on May 14, 2026.

Transparency log

Release files / dynamic_wallet_sdk-0.6.2-cp311-abi3-manylinux_2_28_x86_64.whl

Download URL dynamic_wallet_sdk-0.6.2-cp311-abi3-manylinux_2_28_x86_64.whl
Size 4.6 MB
Tags CPython 3.11 Linux glibc 2.28+ x86-64 abi3
SHA-256 checksum
How to use checksums
31f38afde770d478faac95c03a72e02b680a02fea413546fd74de5eb1d487cfb
BLAKE2b-256 checksum
How to use checksums
9714d045360ddb73e7cfe0aed76ccd7efc5af602c93c30bf6e26cd5d509a8251
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on May 14, 2026.

Transparency log

Release files / dynamic_wallet_sdk-0.6.2-cp311-abi3-manylinux_2_28_aarch64.whl

Download URL dynamic_wallet_sdk-0.6.2-cp311-abi3-manylinux_2_28_aarch64.whl
Size 4.7 MB
Tags CPython 3.11 Linux glibc 2.28+ ARM64 abi3
SHA-256 checksum
How to use checksums
528c276dbb5583d26ed0b463d198f91d478a1e8f5e380ac859a71c585533f294
BLAKE2b-256 checksum
How to use checksums
04af82e478b3ad632d87e5ce3c5670eb2f7f8190bc3fa8722193b0eced7aaa55
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on May 14, 2026.

Transparency log

Release files / dynamic_wallet_sdk-0.6.2-cp311-abi3-macosx_11_0_arm64.whl

Download URL dynamic_wallet_sdk-0.6.2-cp311-abi3-macosx_11_0_arm64.whl
Size 4.9 MB
Tags CPython 3.11 abi3 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
332554ad1f85780c4a1cfbb7480ec661c585ee183f04142aece7386eaa5ba7e0
BLAKE2b-256 checksum
How to use checksums
561fae3398a1093af16369733e5ad600a140d4a2b99dc69a1673ec3e74d7462c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on May 14, 2026.

Transparency log

Release files / dynamic_wallet_sdk-0.6.2-cp311-abi3-macosx_10_12_x86_64.whl

Download URL dynamic_wallet_sdk-0.6.2-cp311-abi3-macosx_10_12_x86_64.whl
Size 5.0 MB
Tags CPython 3.11 abi3 macOS 10.12+ x86-64
SHA-256 checksum
How to use checksums
2a0cfa5675739b172f72174ed44100b8cecef4a6e7f0225d0a32fc35f2aea885
BLAKE2b-256 checksum
How to use checksums
d388b5265cd76a8fea48be367299400492dfb275b44f1eb8a08e6ccf6e5b4995
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on May 14, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

0.6.2 This release

5 release files

0.6.1

5 release files

0.6.0

5 release files

0.5.0

5 release files

0.4.0

5 release files

0.3.0

5 release files

0.2.1

5 release files

0.2.0

5 release files

0.1.1

5 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page