This reference documents wallet management with the Dynamic Swift SDK. Wallets are automatically created for authenticated users. Access them via sdk.wallets.userWallets and observe changes using Combine publishers.
Accessing User Wallets
Wallets are automatically created for authenticated users. Access them via the SDK:
let sdk = DynamicSDK.instance()
// Get all user wallets
let wallets = sdk.wallets.userWallets
// Observe wallet changes
sdk.wallets.userWalletsChanges
.receive(on: DispatchQueue.main)
.sink { wallets in
print("User has \(wallets.count) wallet(s)")
}
.store(in: &cancellables)
BaseWallet Properties
- address (String) - Wallet address
- chain (String) - Chain identifier (e.g., “EVM”, “SOL”)
- walletName (String?) - Optional wallet name
- id (String?) - Optional wallet ID
sdk.wallets
Wallet management module for accessing and managing user wallets.
userWallets
Get the current user’s wallets.
let wallets = sdk.wallets.userWallets // [BaseWallet]
Example
let sdk = DynamicSDK.instance()
let wallets = sdk.wallets.userWallets
for wallet in wallets {
print("Address: \(wallet.address)")
print("Chain: \(wallet.chain)")
}
userWalletsChanges
Combine publisher that emits when wallets change.
sdk.wallets.userWalletsChanges // Publisher<[BaseWallet], Never>
Example
import Combine
let sdk = DynamicSDK.instance()
var cancellables = Set<AnyCancellable>()
sdk.wallets.userWalletsChanges
.receive(on: DispatchQueue.main)
.sink { wallets in
print("Wallets updated: \(wallets.count) wallets")
for wallet in wallets {
print(" - \(wallet.chain): \(wallet.address)")
}
}
.store(in: &cancellables)
getBalance
Get the balance of a wallet.
try await sdk.wallets.getBalance(wallet: BaseWallet) -> String
Parameters
- wallet (BaseWallet) - The wallet to get balance for
Returns
- String - The wallet balance
Example
let sdk = DynamicSDK.instance()
if let wallet = sdk.wallets.userWallets.first {
do {
let balance = try await sdk.wallets.getBalance(wallet: wallet)
print("Balance: \(balance)")
} catch {
print("Failed to get balance: \(error)")
}
}
getNetwork
Get the current network of a wallet.
try await sdk.wallets.getNetwork(wallet: BaseWallet) -> NetworkResult
Parameters
- wallet (BaseWallet) - The wallet to get network for
Returns
- NetworkResult - The current network information
Example
let sdk = DynamicSDK.instance()
if let wallet = sdk.wallets.userWallets.first {
do {
let network = try await sdk.wallets.getNetwork(wallet: wallet)
print("Current network: \(network)")
} catch {
print("Failed to get network: \(error)")
}
}
switchNetwork
Switch a wallet to a different network.
try await sdk.wallets.switchNetwork(wallet: BaseWallet, network: GenericNetwork)
Parameters
- wallet (BaseWallet) - The wallet to switch network for
- network (GenericNetwork) - The target network
Example
let sdk = DynamicSDK.instance()
if let wallet = sdk.wallets.userWallets.first,
let targetNetwork = sdk.networks.evm.first {
do {
try await sdk.wallets.switchNetwork(wallet: wallet, network: targetNetwork)
print("Switched to \(targetNetwork.name)")
} catch {
print("Failed to switch network: \(error)")
}
}
setPrimary
Set a wallet as the user’s primary wallet.
try await sdk.wallets.setPrimary(walletId: String)
Parameters
- walletId (String) - The ID of the wallet to set as primary
Example
let sdk = DynamicSDK.instance()
if let wallet = sdk.wallets.userWallets.first,
let walletId = wallet.id {
do {
try await sdk.wallets.setPrimary(walletId: walletId)
print("Primary wallet set successfully")
} catch {
print("Failed to set primary wallet: \(error)")
}
}
signMessage
Sign a message with a wallet.
try await sdk.wallets.signMessage(wallet: BaseWallet, message: String) -> String
Parameters
- wallet (BaseWallet) - The wallet to sign with
- message (String) - The message to sign
Returns
Example
let sdk = DynamicSDK.instance()
if let wallet = sdk.wallets.userWallets.first {
do {
let signature = try await sdk.wallets.signMessage(
wallet: wallet,
message: "Hello, World!"
)
print("Signature: \(signature)")
} catch {
print("Failed to sign message: \(error)")
}
}
signTypedData
Sign EIP-712 typed data with a wallet.
try await sdk.wallets.signTypedData(wallet: BaseWallet, typedDataJson: String) -> String
Parameters
- wallet (BaseWallet) - The wallet to sign with
- typedDataJson (String) - The typed data as a JSON string
Returns
Example
let sdk = DynamicSDK.instance()
let typedData = """
{
"types": {
"EIP712Domain": [
{"name": "name", "type": "string"},
{"name": "version", "type": "string"},
{"name": "chainId", "type": "uint256"}
],
"Message": [
{"name": "content", "type": "string"}
]
},
"primaryType": "Message",
"domain": {
"name": "Example",
"version": "1",
"chainId": 1
},
"message": {
"content": "Hello!"
}
}
"""
if let wallet = sdk.wallets.userWallets.first {
do {
let signature = try await sdk.wallets.signTypedData(
wallet: wallet,
typedDataJson: typedData
)
print("Signature: \(signature)")
} catch {
print("Failed to sign typed data: \(error)")
}
}
verifySignature
Verify a message signature.
try await sdk.wallets.verifySignature(
message: String,
signature: String,
walletAddress: String
) -> Bool
Parameters
- message (String) - Original message that was signed
- signature (String) - Signature to verify
- walletAddress (String) - Wallet address that signed the message
Returns
- Bool - True if signature is valid, false otherwise
Example
let sdk = DynamicSDK.instance()
let message = "Hello There!"
let signature = "0x..." // Signature from signing step
let walletAddress = wallet.address
do {
let verificationResult = try await sdk.wallets.verifySignature(
message: message,
signature: signature,
walletAddress: walletAddress
)
print("Verification Result: \(verificationResult)")
} catch {
print("Failed to verify signature: \(error)")
}
checkKeySharesAvailability
Check if key shares are available for a wallet address.
let hasKeyShares = checkKeySharesAvailability(
client: dynamicClient,
walletAddress: ethereumWallet.address.asString()
)
print("Key shares available: \(hasKeyShares)")
Wallet Filtering
Filter by Chain
let sdk = DynamicSDK.instance()
// Get EVM wallets
let evmWallets = sdk.wallets.userWallets.filter {
$0.chain.uppercased() == "EVM"
}
// Get Solana wallets
let solanaWallets = sdk.wallets.userWallets.filter {
$0.chain.uppercased() == "SOL"
}
Complete Wallet Management Example
import SwiftUI
import DynamicSDKSwift
import Combine
@MainActor
class WalletViewModel: ObservableObject {
@Published var wallets: [BaseWallet] = []
@Published var selectedWallet: BaseWallet?
@Published var balance: String?
@Published var isLoading = false
private let sdk = DynamicSDK.instance()
private var cancellables = Set<AnyCancellable>()
func startListening() {
// Get current wallets
wallets = sdk.wallets.userWallets
selectedWallet = wallets.first
// Listen for updates
sdk.wallets.userWalletsChanges
.receive(on: DispatchQueue.main)
.sink { [weak self] newWallets in
self?.wallets = newWallets
if self?.selectedWallet == nil {
self?.selectedWallet = newWallets.first
}
}
.store(in: &cancellables)
}
func refreshBalance() {
guard let wallet = selectedWallet else { return }
isLoading = true
Task {
do {
balance = try await sdk.wallets.getBalance(wallet: wallet)
} catch {
print("Balance error: \(error)")
}
isLoading = false
}
}
func signMessage(_ message: String) async -> String? {
guard let wallet = selectedWallet else { return nil }
do {
return try await sdk.wallets.signMessage(wallet: wallet, message: message)
} catch {
print("Sign error: \(error)")
return nil
}
}
}