L’interface est localisée ; les présentations et documents des Skills sont traduits automatiquement par IA dans votre langue. Le code, les commandes, chemins et termes techniques restent en version originale, et le document de l’auteur fait foi.
Explorer les Skills
Développement · SKILL.md

wdk

wdk

Tether Wallet Development Kit (WDK) for building non-custodial multi-chain wallets. Use when working with @tetherto/wdk-core, wallet modules (wdk-wallet-btc, wdk-wallet-evm, wdk-wallet-evm-erc-4337, wdk-wallet-solana, wdk-wallet-spark, wdk-wallet-ton, wdk-wallet-tron, ton-gasless, tron-gasfree), and protocol modules including swap (wdk-protocol-swap-velora-…

Independent GitHub snapshot · Automated classification · Original documentation governs

Documentation de la Skill

GitHub

name: wdk description: Tether Wallet Development Kit (WDK) for building non-custodial multi-chain wallets. Use when working with @tetherto/wdk-core, wallet modules (wdk-wallet-btc, wdk-wallet-evm, wdk-wallet-evm-erc-4337, wdk-wallet-solana, wdk-wallet-spark, wdk-wallet-ton, wdk-wallet-tron, ton-gasless, tron-gasfree), and protocol modules including swap (wdk-protocol-swap-velora-evm), bridge (wdk-protocol-bridge-usdt0-evm), and lending (wdk-protocol-lending-aave-evm). Covers wallet creation, transactions, token transfers, DEX swaps, cross-chain bridges, and DeFi lending/borrowing.

Tether WDK

Multi-chain wallet SDK. All modules share common interfaces from @tetherto/wdk-wallet.

Documentation

Official Docs: https://docs.wallet.tether.io

URL Fetching Workflow

When working with WDK tasks, follow this workflow to access documentation:

Identify relevant URLs - Based on the task, determine which module documentation pages are needed (see Module Documentation Links below) Attempt to fetch - Try web_fetch on the URL directly If fetch fails - Search for the exact URL:

web_search("https://docs.wallet.tether.io/sdk/wallet-modules/wallet-spark/usage") This makes the URL appear in search results, which unlocks fetching.

Fetch after search - Now web_fetch will work on that URL

Example workflow: Task: Build a Spark wallet app

  1. Relevant URLs identified:

  2. web_fetch("https://docs.wallet.tether.io/sdk/wallet-modules/wallet-spark/usage") → If permission error, proceed to step 3

  3. web_search("https://docs.wallet.tether.io/sdk/wallet-modules/wallet-spark/usage") → URL now appears in results

  4. web_fetch("https://docs.wallet.tether.io/sdk/wallet-modules/wallet-spark/usage") → Success - full page content retrieved

For each module, documentation is organized into subpages:

/usage - Example usage and patterns /configuration - Configuration options and settings /api-reference - Complete API documentation

Architecture

@tetherto/wdk-core          # Orchestrator - registers wallets + protocols
    ├── @tetherto/wdk-wallet    # Base classes (WalletManager, IWalletAccount)
    │   ├── wdk-wallet-btc      # Bitcoin (BIP-84, SegWit)
    │   ├── wdk-wallet-evm      # Ethereum & EVM chains
    │   ├── wdk-wallet-evm-erc-4337  # EVM with Account Abstraction
    │   ├── wdk-wallet-solana   # Solana
    │   ├── wdk-wallet-spark    # Spark/Lightning
    │   ├── wdk-wallet-ton      # TON
    │   ├── wdk-wallet-ton-gasless   # TON gasless
    │   ├── wdk-wallet-tron     # TRON
    │   └── wdk-wallet-tron-gasfree  # TRON gas-free
    └── Protocol Modules
        ├── wdk-protocol-swap-velora-evm   # DEX swaps on EVM
        ├── wdk-protocol-bridge-usdt0-evm  # Cross-chain USDT0 bridge
        └── wdk-protocol-lending-aave-evm  # Aave V3 lending

Quick Start

Docs: https://docs.wallet.tether.io/sdk/get-started

With WDK Core (Multi-chain)

import WDK from '@tetherto/wdk'
import WalletManagerEvm from '@tetherto/wdk-wallet-evm'
import WalletManagerBtc from '@tetherto/wdk-wallet-btc'

const wdk = new WDK(seedPhrase)
  .registerWallet('ethereum', WalletManagerEvm, { provider: 'https://eth.drpc.org' })
  .registerWallet('bitcoin', WalletManagerBtc, { host: 'electrum.blockstream.info', port: 50001 })

const ethAccount = await wdk.getAccount('ethereum', 0)
const btcAccount = await wdk.getAccount('bitcoin', 0)

Single Chain (Direct)

import WalletManagerBtc from '@tetherto/wdk-wallet-btc'

const wallet = new WalletManagerBtc(seedPhrase, {
  host: 'electrum.blockstream.info',
  port: 50001,
  network: 'bitcoin'
})
const account = await wallet.getAccount(0)

Common Interface (All Wallets)

All wallet accounts implement IWalletAccount:

MethodReturnsDescription
getAddress()Promise<string>Account address
getBalance()Promise<bigint>Native token balance (base units)
getTokenBalance(addr)Promise<bigint>Token balance
sendTransaction({to, value})Promise<{hash, fee}>Send native tokens
quoteSendTransaction({to, value})Promise<{fee}>Estimate tx fee
transfer({token, recipient, amount})Promise<{hash, fee}>Transfer tokens
quoteTransfer(opts)Promise<{fee}>Estimate transfer fee
sign(message)Promise<string>Sign message
verify(message, signature)Promise<boolean>Verify signature
dispose()voidClear private keys from memory

Properties: index, path, keyPair (⚠️ sensitive)

Module Documentation Links

Core Module

ResourceURL
Overviewhttps://docs.wallet.tether.io/sdk/core-module
Usagehttps://docs.wallet.tether.io/sdk/core-module/usage
Configurationhttps://docs.wallet.tether.io/sdk/core-module/configuration
API Referencehttps://docs.wallet.tether.io/sdk/core-module/api-reference

Wallet Modules

ModuleDocs
Bitcoinhttps://docs.wallet.tether.io/sdk/wallet-modules/wallet-btc
EVMhttps://docs.wallet.tether.io/sdk/wallet-modules/wallet-evm
EVM ERC-4337https://docs.wallet.tether.io/sdk/wallet-modules/wallet-evm-erc-4337
Solanahttps://docs.wallet.tether.io/sdk/wallet-modules/wallet-solana
Sparkhttps://docs.wallet.tether.io/sdk/wallet-modules/wallet-spark
TONhttps://docs.wallet.tether.io/sdk/wallet-modules/wallet-ton
TON Gaslesshttps://docs.wallet.tether.io/sdk/wallet-modules/wallet-ton-gasless
TRONhttps://docs.wallet.tether.io/sdk/wallet-modules/wallet-tron
TRON Gasfreehttps://docs.wallet.tether.io/sdk/wallet-modules/wallet-tron-gasfree

Each wallet module has /usage, /configuration, and /api-reference subpages.

Protocol Modules

ModuleDocs
Swap (Velora EVM)https://docs.wallet.tether.io/sdk/swap-modules/swap-velora-evm
Bridge (USDT0 EVM)https://docs.wallet.tether.io/sdk/bridge-modules/bridge-usdt0-evm
Lending (Aave EVM)https://docs.wallet.tether.io/sdk/lending-modules/lending-aave-evm

Each protocol module has /usage, /configuration, and /api-reference subpages.

UI Kits & Examples

ResourceURL
React Native UI Kithttps://docs.wallet.tether.io/ui-kits/react-native-ui-kit/get-started
Theminghttps://docs.wallet.tether.io/ui-kits/react-native-ui-kit/theming
UI Kit API Referencehttps://docs.wallet.tether.io/ui-kits/react-native-ui-kit/api-reference
React Native Starterhttps://docs.wallet.tether.io/examples-and-starters/react-native-starter

Chain-Specific Notes

Bitcoin

  • BIP-84 (Native SegWit only, bc1... addresses)
  • Uses Electrum servers, fees in sat/vB
  • No token support (getTokenBalance, transfer throw)
  • getTransfers({direction, limit, skip}) for history

EVM

  • BIP-44 (m/44'/60'), EIP-1559 fee model
  • Supports ERC20 via transfer()
  • Fee rates: normal = base×1.1, fast = base×2.0

ERC-4337 (Account Abstraction)

  • Gasless via UserOperations + Paymaster
  • Fees paid in paymaster token (e.g., USDT)
  • getPaymasterTokenBalance() for fee balance
  • Batch transactions: sendTransaction([tx1, tx2])

Solana

  • BIP-44 (m/44'/501'), Ed25519
  • Fees in lamports (1 SOL = 1B lamports)
  • SPL tokens via transfer()

Spark

  • Bitcoin L2 with Lightning support
  • Zero fees for Spark txs
  • getSingleUseDepositAddress(), claimDeposit(txId)
  • createLightningInvoice({value, memo}), payLightningInvoice({invoice, maxFeeSats})
  • withdraw({to, value}) for L1 withdrawal

TON

  • BIP-44 (m/44'/607'), Ed25519
  • Fees in nanotons (1 TON = 1B nanotons)
  • Jettons via transfer()

TRON

  • BIP-44 (m/44'/195'), secp256k1
  • Fees in sun (1 TRX = 1M sun)
  • TRC20 via transfer()
  • Energy + bandwidth costs

Gasless Variants

  • TON Gasless: Requires tonApiClient, paymasterToken config
  • TRON Gasfree: Requires gasFreeProvider, gasFreeApiKey, serviceProvider, verifyingContract
  • Both: sendTransaction() not supported, use transfer() only

Protocol Quick Reference

Swap (DEX)

// EVM (Velora)
const velora = new VeloraProtocolEvm(evmAccount, { swapMaxFee: 200000000000000n })
await velora.swap({ tokenIn: '0x...', tokenOut: '0x...', tokenInAmount: 1000000n })

Bridge

const bridge = new Usdt0ProtocolEvm(evmAccount, { bridgeMaxFee: 1000000000000000n })
await bridge.bridge({
  targetChain: 'arbitrum',
  recipient: '0x...',
  token: '0x...',  // USDT0
  amount: 1000000n
})

Lending (Aave)

const aave = new AaveProtocolEvm(evmAccount)
await aave.supply({ token: '0x...', amount: 1000000n })
await aave.borrow({ token: '0x...', amount: 500000n })
await aave.repay({ token: '0x...', amount: 500000n })
await aave.withdraw({ token: '0x...', amount: 1000000n })
const data = await aave.getAccountData()  // healthFactor, ltv, etc.

Common Patterns

Fee Estimation Before Send

const quote = await account.quoteSendTransaction({ to, value })
if (quote.fee > maxAcceptableFee) throw new Error('Fee too high')
const result = await account.sendTransaction({ to, value })

Cleanup

try {
  // ... wallet operations
} finally {
  account.dispose()
  wallet.dispose()
}

Read-Only Account

const readOnly = await account.toReadOnlyAccount()
// Can query balances, estimate fees, but cannot sign

Package Versions

ALWAYS fetch the latest version from npm before adding any package to package.json:

npm view <package-name> version

Example workflow:

# Before writing package.json, check each package you need:
npm view @tetherto/wdk-core version
npm view @tetherto/wdk-wallet-btc version
npm view @tetherto/wdk-wallet-evm version
# ... for every @tetherto package you're using

Never hardcode or guess versions. Always verify against npm first.

Browser Compatibility

WDK uses sodium-universal for secure memory handling which requires Node.js. For browser/React apps:

  1. Add node polyfills (vite-plugin-node-polyfills or similar)
  2. Create a shim for sodium if dispose() errors occur:
// sodium-shim.js - No-op for browser
export function sodium_memzero() {}
export default { sodium_memzero }
  1. Alias in bundler config:
resolve: {
  alias: {
    'sodium-universal': './src/sodium-shim.js'
  }
}
Skills enregistrées