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
- Python 3.11+
- A Dynamic environment ID and API token — from the Dynamic dashboard
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 |
Links
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)
| File | Size | Uploaded | |
|---|---|---|---|
| dynamic_wallet_sdk-0.6.2.tar.gz | 110.8 kB | Details |
Built distributions (wheels)
| File | Reset | |||
|---|---|---|---|---|
| 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 logRelease 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 logRelease 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 logRelease 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 logRelease 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