Dynamic MPC Wallet SDK for Python — create and manage multi-party computation wallets for EVM and Solana
Project description
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
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distributions
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file dynamic_wallet_sdk-0.5.0.tar.gz.
File metadata
- Download URL: dynamic_wallet_sdk-0.5.0.tar.gz
- Upload date:
- Size: 105.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
832d3e87ed6be7be61f1460b8e5bc590bf7deea65a51618f0f98f281768da400
|
|
| MD5 |
5f126555e8744851f50a8cde771f3187
|
|
| BLAKE2b-256 |
6968173ad16814920a16c8520b13db3ab3c1148ba03ae61401daa24282e93c28
|
Provenance
The following attestation bundles were made for dynamic_wallet_sdk-0.5.0.tar.gz:
Publisher:
python-publish.yml on dynamic-labs/dynamic-waas-sdk
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
dynamic_wallet_sdk-0.5.0.tar.gz -
Subject digest:
832d3e87ed6be7be61f1460b8e5bc590bf7deea65a51618f0f98f281768da400 - Sigstore transparency entry: 1227238000
- Sigstore integration time:
-
Permalink:
dynamic-labs/dynamic-waas-sdk@cef2ce691f23be70d836cacab6ae2d438e5fb481 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/dynamic-labs
-
Access:
internal
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
python-publish.yml@cef2ce691f23be70d836cacab6ae2d438e5fb481 -
Trigger Event:
workflow_dispatch
-
Statement type:
File details
Details for the file dynamic_wallet_sdk-0.5.0-cp311-abi3-manylinux_2_28_x86_64.whl.
File metadata
- Download URL: dynamic_wallet_sdk-0.5.0-cp311-abi3-manylinux_2_28_x86_64.whl
- Upload date:
- Size: 4.6 MB
- Tags: CPython 3.11+, manylinux: glibc 2.28+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
608e2b4beaf5b0a5d6b631f55dbdc76f879a230901315cc2ce7c848ff97bcc9a
|
|
| MD5 |
215ab44c7bf3a439614fd2e339df3f1f
|
|
| BLAKE2b-256 |
a163b0a349bcce5d9eaf49ded09120f9c8e3e9cb7508a29646b51c4eddd531fe
|
Provenance
The following attestation bundles were made for dynamic_wallet_sdk-0.5.0-cp311-abi3-manylinux_2_28_x86_64.whl:
Publisher:
python-publish.yml on dynamic-labs/dynamic-waas-sdk
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
dynamic_wallet_sdk-0.5.0-cp311-abi3-manylinux_2_28_x86_64.whl -
Subject digest:
608e2b4beaf5b0a5d6b631f55dbdc76f879a230901315cc2ce7c848ff97bcc9a - Sigstore transparency entry: 1227238297
- Sigstore integration time:
-
Permalink:
dynamic-labs/dynamic-waas-sdk@cef2ce691f23be70d836cacab6ae2d438e5fb481 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/dynamic-labs
-
Access:
internal
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
python-publish.yml@cef2ce691f23be70d836cacab6ae2d438e5fb481 -
Trigger Event:
workflow_dispatch
-
Statement type:
File details
Details for the file dynamic_wallet_sdk-0.5.0-cp311-abi3-manylinux_2_28_aarch64.whl.
File metadata
- Download URL: dynamic_wallet_sdk-0.5.0-cp311-abi3-manylinux_2_28_aarch64.whl
- Upload date:
- Size: 4.7 MB
- Tags: CPython 3.11+, manylinux: glibc 2.28+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b5b1efc7a5e0f77f0d2462e60396a82d04b40695e5148f2ac88097d8a884001b
|
|
| MD5 |
473b6c4e420e1af87f1755cbde778c03
|
|
| BLAKE2b-256 |
e57f87aa29a2eeec1e77e6d3c923c75098b06b945cb8cfd236911478418e0f6b
|
Provenance
The following attestation bundles were made for dynamic_wallet_sdk-0.5.0-cp311-abi3-manylinux_2_28_aarch64.whl:
Publisher:
python-publish.yml on dynamic-labs/dynamic-waas-sdk
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
dynamic_wallet_sdk-0.5.0-cp311-abi3-manylinux_2_28_aarch64.whl -
Subject digest:
b5b1efc7a5e0f77f0d2462e60396a82d04b40695e5148f2ac88097d8a884001b - Sigstore transparency entry: 1227238123
- Sigstore integration time:
-
Permalink:
dynamic-labs/dynamic-waas-sdk@cef2ce691f23be70d836cacab6ae2d438e5fb481 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/dynamic-labs
-
Access:
internal
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
python-publish.yml@cef2ce691f23be70d836cacab6ae2d438e5fb481 -
Trigger Event:
workflow_dispatch
-
Statement type:
File details
Details for the file dynamic_wallet_sdk-0.5.0-cp311-abi3-macosx_11_0_arm64.whl.
File metadata
- Download URL: dynamic_wallet_sdk-0.5.0-cp311-abi3-macosx_11_0_arm64.whl
- Upload date:
- Size: 4.9 MB
- Tags: CPython 3.11+, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
198d81cdcb4e139ab408293d51aafd6219b3bc37acb05f2ccca2a72cc1ba69e8
|
|
| MD5 |
ac88f75438b7aadb088280d461a88ad7
|
|
| BLAKE2b-256 |
d056bccfcdceea73d0e80428c104b97c1173dc535f824b5347de19b085ba4a07
|
Provenance
The following attestation bundles were made for dynamic_wallet_sdk-0.5.0-cp311-abi3-macosx_11_0_arm64.whl:
Publisher:
python-publish.yml on dynamic-labs/dynamic-waas-sdk
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
dynamic_wallet_sdk-0.5.0-cp311-abi3-macosx_11_0_arm64.whl -
Subject digest:
198d81cdcb4e139ab408293d51aafd6219b3bc37acb05f2ccca2a72cc1ba69e8 - Sigstore transparency entry: 1227238068
- Sigstore integration time:
-
Permalink:
dynamic-labs/dynamic-waas-sdk@cef2ce691f23be70d836cacab6ae2d438e5fb481 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/dynamic-labs
-
Access:
internal
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
python-publish.yml@cef2ce691f23be70d836cacab6ae2d438e5fb481 -
Trigger Event:
workflow_dispatch
-
Statement type:
File details
Details for the file dynamic_wallet_sdk-0.5.0-cp311-abi3-macosx_10_12_x86_64.whl.
File metadata
- Download URL: dynamic_wallet_sdk-0.5.0-cp311-abi3-macosx_10_12_x86_64.whl
- Upload date:
- Size: 5.0 MB
- Tags: CPython 3.11+, macOS 10.12+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c533cea81d6385b2a338b3ae4dc08a6fbe3478f1ad16fa157c7b6899a5abc37f
|
|
| MD5 |
0efdb9197c6b2ce55efb46aeb66a1b42
|
|
| BLAKE2b-256 |
9ee7a19e881cf6ed77d2952d1db177825648875ee427d01bcb6e07e478d609d8
|
Provenance
The following attestation bundles were made for dynamic_wallet_sdk-0.5.0-cp311-abi3-macosx_10_12_x86_64.whl:
Publisher:
python-publish.yml on dynamic-labs/dynamic-waas-sdk
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
dynamic_wallet_sdk-0.5.0-cp311-abi3-macosx_10_12_x86_64.whl -
Subject digest:
c533cea81d6385b2a338b3ae4dc08a6fbe3478f1ad16fa157c7b6899a5abc37f - Sigstore transparency entry: 1227238222
- Sigstore integration time:
-
Permalink:
dynamic-labs/dynamic-waas-sdk@cef2ce691f23be70d836cacab6ae2d438e5fb481 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/dynamic-labs
-
Access:
internal
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
python-publish.yml@cef2ce691f23be70d836cacab6ae2d438e5fb481 -
Trigger Event:
workflow_dispatch
-
Statement type: