A standalone Rust SDK for the Swig wallet protocol on Solana.
The original Swig SDK has not been updated with newer dependency versions, which may conflict with modern Solana projects.
bitrouter-swig-sdk is a from-scratch reimplementation that provides the same Swig wallet functionality with up-to-date dependencies (Solana SDK v3–v4), so you can integrate Swig wallets without version conflicts.
Pure Rust, no system dependencies, no openssl-sys.
Add the crate to your project with Cargo:
cargo add bitrouter-swig-sdkOr add it directly to your Cargo.toml:
[dependencies]
bitrouter-swig-sdk = "0.1"| Feature | Default | Description |
|---|---|---|
rpc |
✓ | Enables solana-transaction and solana-keypair for building and signing transactions |
token |
✓ | Enables SPL Token and Associated Token Account support |
alloy |
— | Enables Ethereum-compatible signing via Alloy (secp256k1) |
openssl-vendored |
— | Vendor OpenSSL for secp256r1 support (useful in CI/Docker) |
The SDK covers the full Swig wallet lifecycle:
- Wallet creation —
instruction::create::create_v1 - Authority management — add, update, remove authorities with granular permissions
- Session keys — slot-based expiring session keys for delegated signing
- Delegated execution —
sign_v2to execute arbitrary instructions through the wallet - Sub-accounts — create, sign, withdraw, and toggle sub-accounts
- Asset transfers — transfer assets out of the wallet
- Close wallet — reclaim rent
use bitrouter_swig_sdk::auth::ed25519::Ed25519ClientRole;
use bitrouter_swig_sdk::auth::ClientRole;
use bitrouter_swig_sdk::instruction;
use bitrouter_swig_sdk::types::{AuthorityConfig, AuthorityType, Permission};
use bitrouter_swig_sdk::{pda, PROGRAM_ID};
// Derive the Swig PDA
let swig_id: [u8; 32] = rand::random();
let (swig_pk, bump) = pda::swig_account(&swig_id);
let (wallet_addr, wallet_bump) = pda::swig_wallet_address(&swig_pk);
// Create a wallet with full permissions
let ix = instruction::create::create_v1(
swig_pk,
payer_pk,
wallet_addr,
swig_id,
bump,
wallet_bump,
AuthorityType::Ed25519,
&authority_pk.to_bytes(),
&[Permission::All],
);
// Build a role handle for subsequent operations
let role = Ed25519ClientRole::new(authority_pk);
// Add a delegated authority with specific permissions
let new_auth = AuthorityConfig {
authority_type: AuthorityType::Ed25519,
authority_bytes: delegate_pk.to_bytes().to_vec(),
};
let ixs = role.add_authority(
swig_pk,
authority_pk,
0, // signing role id
new_auth,
vec![
Permission::Sol { amount: 5_000_000 },
Permission::Token { mint: token_mint, amount: 10_000_000 },
],
None,
).expect("add_authority");
// Execute an instruction through the wallet via SignV2
let inner_ix = sol_transfer_ix(wallet_addr, destination, lamports);
let ixs = role
.sign_v2(swig_pk, wallet_addr, 0, vec![inner_ix], None, &[])
.expect("sign_v2");The examples/round_trip.rs example exercises every major SDK feature on-chain using a single Ed25519 keypair. It covers:
- Wallet creation
- Adding delegated authorities with rich permission sets
- Updating authority permissions (AddActions, RemoveActionsByType, RemoveActionsByIndex, ReplaceAll)
- Creating session keys with slot-based expiry
- Delegated SOL transfers via SignV2
- Sub-account lifecycle (create, sign, withdraw, toggle)
- Removing authorities
- Transferring assets
- Fee-payer separation (payer ≠ authority)
Run it against devnet:
SWIG_PRIVATE_KEY=<base58-64-byte-keypair> cargo run --example round_trip
# With airdrop enabled:
AIRDROP=true SWIG_PRIVATE_KEY=<base58-keypair> cargo run --example round_trip
# Custom RPC:
SOLANA_RPC_URL=https://api.devnet.solana.com SWIG_PRIVATE_KEY=<base58-keypair> cargo run --example round_tripApache-2.0