@t402/wdk 2.4.0 → 2.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/adapters/index.d.ts +198 -1
- package/dist/cjs/adapters/index.js +255 -0
- package/dist/cjs/adapters/index.js.map +1 -1
- package/dist/cjs/adapters/svm-adapter.d.ts +146 -2
- package/dist/cjs/adapters/svm-adapter.js +255 -2
- package/dist/cjs/adapters/svm-adapter.js.map +1 -1
- package/dist/cjs/adapters/ton-adapter.d.ts +57 -2
- package/dist/cjs/adapters/ton-adapter.js +75 -2
- package/dist/cjs/adapters/ton-adapter.js.map +1 -1
- package/dist/cjs/adapters/tron-adapter.d.ts +57 -2
- package/dist/cjs/adapters/tron-adapter.js +101 -0
- package/dist/cjs/adapters/tron-adapter.js.map +1 -1
- package/dist/cjs/index-DnEI5M6d.d.ts +1798 -0
- package/dist/cjs/index.d.ts +702 -1118
- package/dist/cjs/index.js +3905 -246
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/integrations/index.d.ts +9 -0
- package/dist/cjs/integrations/index.js +249 -0
- package/dist/cjs/integrations/index.js.map +1 -0
- package/dist/cjs/testing/index.d.ts +62 -0
- package/dist/cjs/testing/index.js +129 -0
- package/dist/cjs/testing/index.js.map +1 -0
- package/dist/cjs/types-BwK8Xgvg.d.ts +967 -0
- package/dist/esm/adapters/index.d.mts +198 -1
- package/dist/esm/adapters/index.mjs +14 -3
- package/dist/esm/adapters/svm-adapter.d.mts +146 -2
- package/dist/esm/adapters/svm-adapter.mjs +18 -3
- package/dist/esm/adapters/ton-adapter.d.mts +57 -2
- package/dist/esm/adapters/ton-adapter.mjs +8 -3
- package/dist/esm/adapters/tron-adapter.d.mts +57 -2
- package/dist/esm/adapters/tron-adapter.mjs +2 -1
- package/dist/esm/chunk-2KWVW77U.mjs +353 -0
- package/dist/esm/chunk-2KWVW77U.mjs.map +1 -0
- package/dist/esm/chunk-7CG77QAN.mjs +153 -0
- package/dist/esm/chunk-7CG77QAN.mjs.map +1 -0
- package/dist/esm/chunk-BJTO5JO5.mjs +11 -0
- package/dist/esm/chunk-BJTO5JO5.mjs.map +1 -0
- package/dist/esm/{chunk-YWBJJV5M.mjs → chunk-KWX6CJIH.mjs} +72 -1
- package/dist/esm/chunk-KWX6CJIH.mjs.map +1 -0
- package/dist/esm/{chunk-HB2DGKQ3.mjs → chunk-QZKUU2O6.mjs} +102 -1
- package/dist/esm/chunk-QZKUU2O6.mjs.map +1 -0
- package/dist/esm/chunk-TVSNUSFZ.mjs +219 -0
- package/dist/esm/chunk-TVSNUSFZ.mjs.map +1 -0
- package/dist/esm/index-D5kvtDfm.d.mts +1798 -0
- package/dist/esm/index.d.mts +702 -1118
- package/dist/esm/index.mjs +2934 -70
- package/dist/esm/index.mjs.map +1 -1
- package/dist/esm/integrations/index.d.mts +9 -0
- package/dist/esm/integrations/index.mjs +16 -0
- package/dist/esm/integrations/index.mjs.map +1 -0
- package/dist/esm/testing/index.d.mts +62 -0
- package/dist/esm/testing/index.mjs +101 -0
- package/dist/esm/testing/index.mjs.map +1 -0
- package/dist/esm/types-BwK8Xgvg.d.mts +967 -0
- package/package.json +69 -20
- package/dist/cjs/types-V7c-qhn6.d.ts +0 -489
- package/dist/esm/chunk-HB2DGKQ3.mjs.map +0 -1
- package/dist/esm/chunk-MCFHZSF7.mjs +0 -107
- package/dist/esm/chunk-MCFHZSF7.mjs.map +0 -1
- package/dist/esm/chunk-YWBJJV5M.mjs.map +0 -1
- package/dist/esm/types-V7c-qhn6.d.mts +0 -489
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/adapters/index.ts","../../../src/adapters/ton-adapter.ts","../../../src/adapters/svm-adapter.ts","../../../src/adapters/tron-adapter.ts"],"sourcesContent":["/**\n * Multi-chain WDK adapters for T402\n *\n * These adapters wrap Tether WDK wallet accounts to implement\n * T402's existing signer interfaces for each chain.\n */\n\nexport { WDKTonSignerAdapter, createWDKTonSigner } from './ton-adapter.js'\nexport { WDKSvmSignerAdapter, createWDKSvmSigner } from './svm-adapter.js'\nexport { WDKTronSignerAdapter, createWDKTronSigner } from './tron-adapter.js'\n","/**\n * TON Signer Adapter for WDK\n *\n * Wraps a Tether WDK TON account to implement T402's ClientTonSigner interface.\n * This allows WDK-managed TON wallets to be used for T402 payments.\n */\n\nimport type { WDKTonAccount } from '../types.js'\n\n/**\n * TON Address type (compatible with @ton/core Address)\n * We define our own interface to avoid direct import\n */\nexport interface TonAddress {\n toString(): string\n toRawString(): string\n}\n\n/**\n * TON Cell type (compatible with @ton/core Cell)\n * We define our own interface to avoid direct import\n */\nexport interface TonCell {\n hash(): Uint8Array\n toBoc(): Uint8Array\n}\n\n/**\n * SignMessageParams type matching T402's @t402/ton interface\n */\nexport interface SignMessageParams {\n /** Destination address */\n to: TonAddress\n /** Amount of TON to attach (for gas) in nanoTON */\n value: bigint\n /** Message body (Jetton transfer cell) */\n body: TonCell\n /** Send mode flags (from @ton/core SendMode) */\n sendMode?: number\n /** Bounce flag */\n bounce?: boolean\n /** Message validity timeout in seconds */\n timeout?: number\n}\n\n/**\n * ClientTonSigner interface matching T402's @t402/ton\n */\nexport interface ClientTonSigner {\n readonly address: TonAddress\n signMessage(params: SignMessageParams): Promise<TonCell>\n getSeqno(): Promise<number>\n}\n\n/**\n * Simple TonAddress implementation for WDK\n */\nclass WDKTonAddress implements TonAddress {\n constructor(private _address: string) {}\n\n toString(): string {\n return this._address\n }\n\n toRawString(): string {\n return this._address\n }\n}\n\n/**\n * WDKTonSignerAdapter - Adapts a WDK TON account to T402's ClientTonSigner\n *\n * This adapter wraps a Tether WDK TON account and provides T402-compatible\n * signing functionality. The actual message building and signing is delegated\n * to the WDK account, which handles TON-specific details internally.\n *\n * @example\n * ```typescript\n * const adapter = await createWDKTonSigner(wdkTonAccount);\n * const signed = await adapter.signMessage({\n * to: jettonWalletAddress,\n * value: toNano('0.05'),\n * body: jettonTransferBody,\n * });\n * ```\n */\nexport class WDKTonSignerAdapter implements ClientTonSigner {\n private _account: WDKTonAccount\n private _address: TonAddress | null = null\n private _initialized = false\n\n constructor(account: WDKTonAccount) {\n if (!account) {\n throw new Error('WDK TON account is required')\n }\n this._account = account\n }\n\n /**\n * Get the wallet address\n * @throws Error if not initialized\n */\n get address(): TonAddress {\n if (!this._address) {\n throw new Error(\n 'TON signer not initialized. Call initialize() first or use createWDKTonSigner().',\n )\n }\n return this._address\n }\n\n /**\n * Check if the adapter is initialized\n */\n get isInitialized(): boolean {\n return this._initialized\n }\n\n /**\n * Initialize the adapter by fetching the address\n * Must be called before using the signer\n */\n async initialize(): Promise<void> {\n if (this._initialized) {\n return\n }\n\n const addressStr = await this._account.getAddress()\n this._address = new WDKTonAddress(addressStr)\n this._initialized = true\n }\n\n /**\n * Sign an internal message for Jetton transfer\n *\n * Attempts to build a proper signed Cell using @ton/core if available.\n * Falls back to a simplified wrapper that embeds the raw signature.\n *\n * @param params - Message parameters\n * @returns Signed external message as Cell (BOC)\n */\n async signMessage(params: SignMessageParams): Promise<TonCell> {\n const msgHash = params.body.hash()\n const signature = await this._account.signMessage(msgHash)\n\n // Try to use @ton/core for proper Cell construction\n try {\n const tonCore = await import('@ton/core')\n const sigBuffer = Buffer.from(signature.buffer, signature.byteOffset, signature.byteLength)\n const bodyBoc = params.body.toBoc()\n const bocBuffer = Buffer.from(bodyBoc.buffer, bodyBoc.byteOffset, bodyBoc.byteLength)\n const signedCell = tonCore\n .beginCell()\n .storeBuffer(sigBuffer)\n .storeSlice(tonCore.Cell.fromBoc(bocBuffer)[0]!.beginParse())\n .endCell()\n return signedCell as unknown as TonCell\n } catch {\n // @ton/core not available — return simplified wrapper.\n // The signature is accessible via toBoc() and the original\n // message hash via hash(), which is sufficient for T402\n // facilitator verification.\n return {\n hash: () => msgHash,\n toBoc: () => signature,\n }\n }\n }\n\n /**\n * Get current seqno for the wallet\n * Used for replay protection\n */\n async getSeqno(): Promise<number> {\n return this._account.getSeqno()\n }\n\n /**\n * Get TON balance in nanoTON\n */\n async getBalance(): Promise<bigint> {\n return this._account.getBalance()\n }\n\n /**\n * Get Jetton balance\n * @param jettonMaster - Jetton master contract address\n */\n async getJettonBalance(jettonMaster: string): Promise<bigint> {\n return this._account.getJettonBalance(jettonMaster)\n }\n\n /**\n * Get the underlying WDK account\n * Useful for advanced operations not covered by this adapter\n */\n getWDKAccount(): WDKTonAccount {\n return this._account\n }\n}\n\n/**\n * Create an initialized WDK TON signer\n *\n * @param account - WDK TON account from @tetherto/wdk-wallet-ton\n * @returns Initialized ClientTonSigner\n *\n * @example\n * ```typescript\n * import { T402WDK } from '@t402/wdk';\n *\n * const wallet = new T402WDK(seedPhrase, config);\n * const tonSigner = await wallet.getTonSigner();\n *\n * // Use with T402 client\n * const client = createT402HTTPClient({\n * signers: [{ scheme: 'exact', network: 'ton:mainnet', signer: tonSigner }]\n * });\n * ```\n */\nexport async function createWDKTonSigner(account: WDKTonAccount): Promise<WDKTonSignerAdapter> {\n const adapter = new WDKTonSignerAdapter(account)\n await adapter.initialize()\n return adapter\n}\n","/**\n * Solana (SVM) Signer Adapter for WDK\n *\n * Wraps a Tether WDK Solana account to implement T402's ClientSvmSigner interface.\n * ClientSvmSigner is just TransactionSigner from @solana/kit.\n */\n\nimport type { WDKSolanaAccount } from '../types.js'\n\n/**\n * Address type from @solana/kit (base58 string)\n * We use a branded type for compatibility\n */\nexport type SolanaAddress = string & { readonly __brand?: unique symbol }\n\n/**\n * TransactionSigner interface matching @solana/kit\n * This is what T402's ClientSvmSigner expects\n */\nexport interface TransactionSigner {\n readonly address: SolanaAddress\n signTransactions<T extends { messageBytes: Uint8Array; signatures: Record<string, unknown> }>(\n transactions: readonly T[],\n ): Promise<readonly Record<string, Uint8Array>[]>\n}\n\n/**\n * WDKSvmSignerAdapter - Adapts a WDK Solana account to T402's ClientSvmSigner\n *\n * ClientSvmSigner is TransactionSigner from @solana/kit which requires:\n * - address: The public key as Address type\n * - signTransactions: Sign multiple transactions, returning signature dictionaries\n *\n * @example\n * ```typescript\n * const adapter = await createWDKSvmSigner(wdkSolanaAccount);\n *\n * // Use with T402 client\n * const client = createT402HTTPClient({\n * signers: [{ scheme: 'exact', network: 'solana:mainnet', signer: adapter }]\n * });\n * ```\n */\nexport class WDKSvmSignerAdapter implements TransactionSigner {\n private _account: WDKSolanaAccount\n private _address: SolanaAddress | null = null\n private _initialized = false\n\n constructor(account: WDKSolanaAccount) {\n if (!account) {\n throw new Error('WDK Solana account is required')\n }\n this._account = account\n }\n\n /**\n * Get the wallet address (base58)\n * @throws Error if not initialized\n */\n get address(): SolanaAddress {\n if (!this._address) {\n throw new Error(\n 'Solana signer not initialized. Call initialize() first or use createWDKSvmSigner().',\n )\n }\n return this._address\n }\n\n /**\n * Check if the adapter is initialized\n */\n get isInitialized(): boolean {\n return this._initialized\n }\n\n /**\n * Initialize the adapter by fetching the address\n * Must be called before using the signer\n */\n async initialize(): Promise<void> {\n if (this._initialized) {\n return\n }\n\n const addressStr = await this._account.getAddress()\n this._address = addressStr as SolanaAddress\n this._initialized = true\n }\n\n /**\n * Sign transactions with this signer\n *\n * This method signs the message bytes of each transaction and returns\n * signature dictionaries mapping address to signature.\n *\n * @param transactions - Array of transactions to sign\n * @returns Array of signature dictionaries\n */\n async signTransactions<\n T extends { messageBytes: Uint8Array; signatures: Record<string, unknown> },\n >(transactions: readonly T[]): Promise<readonly Record<string, Uint8Array>[]> {\n if (!transactions || transactions.length === 0) {\n return []\n }\n\n const results: Record<string, Uint8Array>[] = []\n\n for (const tx of transactions) {\n if (!tx.messageBytes || tx.messageBytes.length === 0) {\n throw new Error('Transaction messageBytes must not be empty')\n }\n\n // Sign the message bytes using WDK account\n const signature = await this._account.sign(tx.messageBytes)\n\n // Return as a dictionary mapping our address to the signature\n results.push({\n [this._address as string]: signature,\n })\n }\n\n return results\n }\n\n /**\n * Sign a single message (utility method)\n * @param message - Message bytes to sign\n * @returns Signature bytes\n */\n async sign(message: Uint8Array): Promise<Uint8Array> {\n return this._account.sign(message)\n }\n\n /**\n * Get SOL balance in lamports\n */\n async getBalance(): Promise<bigint> {\n return this._account.getBalance()\n }\n\n /**\n * Get SPL token balance\n * @param mint - Token mint address\n */\n async getTokenBalance(mint: string): Promise<bigint> {\n return this._account.getTokenBalance(mint)\n }\n\n /**\n * Transfer SPL tokens\n * @param params - Transfer parameters\n * @returns Transaction signature\n */\n async transfer(params: { token: string; recipient: string; amount: bigint }): Promise<string> {\n return this._account.transfer(params)\n }\n}\n\n/**\n * Create an initialized WDK Solana signer\n *\n * @param account - WDK Solana account from @tetherto/wdk-wallet-solana\n * @returns Initialized TransactionSigner (ClientSvmSigner)\n *\n * @example\n * ```typescript\n * import { T402WDK } from '@t402/wdk';\n *\n * const wallet = new T402WDK(seedPhrase, config);\n * const svmSigner = await wallet.getSvmSigner();\n *\n * // Use with T402 client\n * const client = createT402HTTPClient({\n * signers: [{ scheme: 'exact', network: 'solana:mainnet', signer: svmSigner }]\n * });\n * ```\n */\nexport async function createWDKSvmSigner(account: WDKSolanaAccount): Promise<WDKSvmSignerAdapter> {\n const adapter = new WDKSvmSignerAdapter(account)\n await adapter.initialize()\n return adapter\n}\n","/**\n * TRON Signer Adapter for WDK\n *\n * Wraps a Tether WDK TRON account to implement T402's ClientTronSigner interface.\n * This allows WDK-managed TRON wallets to be used for T402 payments.\n */\n\nimport type { WDKTronAccount } from '../types.js'\n\n/**\n * SignTransactionParams matching T402's @t402/tron interface\n */\nexport interface SignTransactionParams {\n /** TRC20 contract address */\n contractAddress: string\n /** Recipient address (T-prefix base58check) */\n to: string\n /** Amount to transfer (in smallest units) */\n amount: string\n /** Fee limit in SUN (optional, defaults to 100 TRX) */\n feeLimit?: number\n /** Transaction expiration time in milliseconds (optional) */\n expiration?: number\n}\n\n/**\n * Block info for transaction building\n */\nexport interface BlockInfo {\n /** Reference block bytes (hex) */\n refBlockBytes: string\n /** Reference block hash (hex) */\n refBlockHash: string\n /** Expiration timestamp in milliseconds */\n expiration: number\n}\n\n/**\n * ClientTronSigner interface matching T402's @t402/tron\n */\nexport interface ClientTronSigner {\n readonly address: string\n signTransaction(params: SignTransactionParams): Promise<string>\n getBlockInfo(): Promise<BlockInfo>\n}\n\n// TronWeb-compatible types\ninterface TronWebTransaction {\n txID: string\n raw_data: {\n contract: unknown[]\n ref_block_bytes: string\n ref_block_hash: string\n expiration: number\n timestamp: number\n }\n raw_data_hex: string\n signature?: string[]\n}\n\ninterface TronWebBlock {\n block_header: {\n raw_data: {\n number: number\n txTrieRoot: string\n witness_address: string\n parentHash: string\n version: number\n timestamp: number\n }\n witness_signature: string\n }\n blockID: string\n}\n\n/**\n * WDKTronSignerAdapter - Adapts a WDK TRON account to T402's ClientTronSigner\n *\n * @example\n * ```typescript\n * const adapter = await createWDKTronSigner(wdkTronAccount);\n * const signedTx = await adapter.signTransaction({\n * contractAddress: 'TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t',\n * to: 'TRecipientAddress...',\n * amount: '1000000', // 1 USDT\n * });\n * ```\n */\nexport class WDKTronSignerAdapter implements ClientTronSigner {\n private _account: WDKTronAccount\n private _address: string | null = null\n private _initialized = false\n private _rpcUrl: string\n\n constructor(account: WDKTronAccount, rpcUrl = 'https://api.trongrid.io') {\n if (!account) {\n throw new Error('WDK TRON account is required')\n }\n this._account = account\n this._rpcUrl = rpcUrl\n }\n\n /**\n * Get the wallet address (T-prefix base58check)\n * @throws Error if not initialized\n */\n get address(): string {\n if (!this._address) {\n throw new Error(\n 'TRON signer not initialized. Call initialize() first or use createWDKTronSigner().',\n )\n }\n return this._address\n }\n\n /**\n * Check if the adapter is initialized\n */\n get isInitialized(): boolean {\n return this._initialized\n }\n\n /**\n * Initialize the adapter by fetching the address\n * Must be called before using the signer\n */\n async initialize(): Promise<void> {\n if (this._initialized) {\n return\n }\n\n this._address = await this._account.getAddress()\n this._initialized = true\n }\n\n /**\n * Sign a TRC20 transfer transaction\n *\n * This method:\n * 1. Builds a TRC20 transfer transaction\n * 2. Signs it using the WDK account\n * 3. Returns the hex-encoded signed transaction\n *\n * @param params - Transaction parameters\n * @returns Hex-encoded signed transaction\n */\n async signTransaction(params: SignTransactionParams): Promise<string> {\n if (!params.contractAddress) {\n throw new Error('contractAddress is required')\n }\n if (!params.to) {\n throw new Error('recipient address (to) is required')\n }\n if (!params.amount || BigInt(params.amount) <= 0n) {\n throw new Error('amount must be a positive value')\n }\n\n // Get block info for transaction\n const blockInfo = await this.getBlockInfo()\n\n // Default fee limit: 100 TRX = 100_000_000 SUN\n const feeLimit = params.feeLimit ?? 100_000_000\n\n // Build the TRC20 transfer transaction\n const transaction = await this.buildTrc20Transaction({\n contractAddress: params.contractAddress,\n to: params.to,\n amount: params.amount,\n feeLimit,\n refBlockBytes: blockInfo.refBlockBytes,\n refBlockHash: blockInfo.refBlockHash,\n expiration: params.expiration ?? blockInfo.expiration,\n })\n\n // Sign the transaction using WDK account\n const signedTx = await this._account.signTransaction(transaction)\n\n // Serialize to hex format\n return this.serializeTransaction(signedTx as TronWebTransaction)\n }\n\n /**\n * Get the current reference block info for transaction building\n * This is required for TRON's replay protection mechanism\n */\n async getBlockInfo(): Promise<BlockInfo> {\n try {\n const response = await fetch(`${this._rpcUrl}/wallet/getnowblock`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({}),\n })\n\n if (!response.ok) {\n throw new Error(`Failed to get block info: ${response.status}`)\n }\n\n const block = (await response.json()) as TronWebBlock\n\n // Extract reference block bytes (last 4 bytes of block number)\n const blockNum = block.block_header.raw_data.number\n const refBlockBytes = blockNum.toString(16).padStart(8, '0').slice(-4)\n\n // Reference block hash (first 8 bytes of block ID)\n const refBlockHash = block.blockID.slice(16, 32)\n\n // Expiration: block timestamp + 60 seconds\n const expiration = block.block_header.raw_data.timestamp + 60000\n\n return {\n refBlockBytes,\n refBlockHash,\n expiration,\n }\n } catch (error) {\n throw new Error(\n `Failed to get TRON block info: ${error instanceof Error ? error.message : String(error)}`,\n )\n }\n }\n\n /**\n * Build a TRC20 transfer transaction\n */\n private async buildTrc20Transaction(params: {\n contractAddress: string\n to: string\n amount: string\n feeLimit: number\n refBlockBytes: string\n refBlockHash: string\n expiration: number\n }): Promise<TronWebTransaction> {\n // Build TRC20 transfer function call\n // transfer(address,uint256) = 0xa9059cbb\n const functionSelector = 'transfer(address,uint256)'\n\n // Encode parameters\n const toAddressHex = this.addressToHex(params.to).slice(2).padStart(64, '0')\n const amountHex = BigInt(params.amount).toString(16).padStart(64, '0')\n const parameter = toAddressHex + amountHex\n\n try {\n const response = await fetch(`${this._rpcUrl}/wallet/triggersmartcontract`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n owner_address: this.addressToHex(this._address!),\n contract_address: this.addressToHex(params.contractAddress),\n function_selector: functionSelector,\n parameter,\n fee_limit: params.feeLimit,\n }),\n })\n\n if (!response.ok) {\n throw new Error(`Failed to build transaction: ${response.status}`)\n }\n\n const result = await response.json()\n\n if (result.result?.code) {\n throw new Error(`Transaction build failed: ${result.result.message}`)\n }\n\n return result.transaction as TronWebTransaction\n } catch (error) {\n throw new Error(\n `Failed to build TRC20 transaction: ${error instanceof Error ? error.message : String(error)}`,\n )\n }\n }\n\n /**\n * Serialize a signed transaction to hex format\n */\n private serializeTransaction(signedTx: TronWebTransaction): string {\n // Return the raw_data_hex with signature appended\n if (signedTx.signature && signedTx.signature.length > 0) {\n return JSON.stringify(signedTx)\n }\n return signedTx.raw_data_hex\n }\n\n /**\n * Convert TRON base58 address to hex format\n */\n private addressToHex(address: string): string {\n // If already hex, return as-is\n if (address.startsWith('41') || address.startsWith('0x')) {\n return address.startsWith('0x') ? '41' + address.slice(2) : address\n }\n\n // Convert base58 to hex using simple algorithm\n const ALPHABET = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'\n let num = BigInt(0)\n for (const char of address) {\n num = num * BigInt(58) + BigInt(ALPHABET.indexOf(char))\n }\n\n // Convert to hex and take first 42 chars (21 bytes)\n let hex = num.toString(16)\n // Handle leading zeros\n let leadingZeros = 0\n for (const char of address) {\n if (char === '1') leadingZeros++\n else break\n }\n hex = '00'.repeat(leadingZeros) + hex\n\n // TRON address is 21 bytes = 42 hex chars\n return hex.slice(0, 42)\n }\n\n /**\n * Get TRX balance in SUN\n */\n async getBalance(): Promise<bigint> {\n return this._account.getBalance()\n }\n\n /**\n * Get TRC20 token balance\n * @param contractAddress - TRC20 contract address\n */\n async getTrc20Balance(contractAddress: string): Promise<bigint> {\n return this._account.getTrc20Balance(contractAddress)\n }\n}\n\n/**\n * Create an initialized WDK TRON signer\n *\n * @param account - WDK TRON account from @tetherto/wdk-wallet-tron\n * @param rpcUrl - Optional custom RPC URL (default: https://api.trongrid.io)\n * @returns Initialized ClientTronSigner\n *\n * @example\n * ```typescript\n * import { T402WDK } from '@t402/wdk';\n *\n * const wallet = new T402WDK(seedPhrase, config);\n * const tronSigner = await wallet.getTronSigner();\n *\n * // Use with T402 client\n * const client = createT402HTTPClient({\n * signers: [{ scheme: 'exact', network: 'tron:mainnet', signer: tronSigner }]\n * });\n * ```\n */\nexport async function createWDKTronSigner(\n account: WDKTronAccount,\n rpcUrl?: string,\n): Promise<WDKTronSignerAdapter> {\n const adapter = new WDKTronSignerAdapter(account, rpcUrl)\n await adapter.initialize()\n return adapter\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../src/adapters/index.ts","../../../src/adapters/ton-adapter.ts","../../../src/adapters/svm-adapter.ts","../../../src/adapters/tron-adapter.ts","../../../src/adapters/spark-adapter.ts","../../../src/adapters/btc-adapter.ts"],"sourcesContent":["/**\n * Multi-chain WDK adapters for T402\n *\n * These adapters wrap Tether WDK wallet accounts to implement\n * T402's existing signer interfaces for each chain.\n */\n\nexport { WDKTonSignerAdapter, createWDKTonSigner } from './ton-adapter.js'\nexport { WDKSvmSignerAdapter, createWDKSvmSigner } from './svm-adapter.js'\nexport { WDKTronSignerAdapter, createWDKTronSigner } from './tron-adapter.js'\nexport { WDKSparkSignerAdapter, createWDKSparkSigner } from './spark-adapter.js'\nexport { WDKBtcSignerAdapter, createWDKBtcSigner } from './btc-adapter.js'\n","/**\n * TON Signer Adapter for WDK\n *\n * Wraps a Tether WDK TON account to implement T402's ClientTonSigner interface.\n * This allows WDK-managed TON wallets to be used for T402 payments.\n */\n\nimport type { WDKTonAccount } from '../types.js'\n\n/**\n * TON Address type (compatible with @ton/core Address)\n * We define our own interface to avoid direct import\n */\nexport interface TonAddress {\n toString(): string\n toRawString(): string\n}\n\n/**\n * TON Cell type (compatible with @ton/core Cell)\n * We define our own interface to avoid direct import\n */\nexport interface TonCell {\n hash(): Uint8Array\n toBoc(): Uint8Array\n}\n\n/**\n * SignMessageParams type matching T402's @t402/ton interface\n */\nexport interface SignMessageParams {\n /** Destination address */\n to: TonAddress\n /** Amount of TON to attach (for gas) in nanoTON */\n value: bigint\n /** Message body (Jetton transfer cell) */\n body: TonCell\n /** Send mode flags (from @ton/core SendMode) */\n sendMode?: number\n /** Bounce flag */\n bounce?: boolean\n /** Message validity timeout in seconds */\n timeout?: number\n}\n\n/**\n * ClientTonSigner interface matching T402's @t402/ton\n */\nexport interface ClientTonSigner {\n readonly address: TonAddress\n signMessage(params: SignMessageParams): Promise<TonCell>\n getSeqno(): Promise<number>\n}\n\n/**\n * Simple TonAddress implementation for WDK\n */\nclass WDKTonAddress implements TonAddress {\n constructor(private _address: string) {}\n\n toString(): string {\n return this._address\n }\n\n toRawString(): string {\n return this._address\n }\n}\n\n/**\n * WDKTonSignerAdapter - Adapts a WDK TON account to T402's ClientTonSigner\n *\n * This adapter wraps a Tether WDK TON account and provides T402-compatible\n * signing functionality. The actual message building and signing is delegated\n * to the WDK account, which handles TON-specific details internally.\n *\n * @example\n * ```typescript\n * const adapter = await createWDKTonSigner(wdkTonAccount);\n * const signed = await adapter.signMessage({\n * to: jettonWalletAddress,\n * value: toNano('0.05'),\n * body: jettonTransferBody,\n * });\n * ```\n */\nexport class WDKTonSignerAdapter implements ClientTonSigner {\n private _account: WDKTonAccount\n private _address: TonAddress | null = null\n private _initialized = false\n\n constructor(account: WDKTonAccount) {\n if (!account) {\n throw new Error('WDK TON account is required')\n }\n this._account = account\n }\n\n /**\n * Get the wallet address\n * @throws Error if not initialized\n */\n get address(): TonAddress {\n if (!this._address) {\n throw new Error(\n 'TON signer not initialized. Call initialize() first or use createWDKTonSigner().',\n )\n }\n return this._address\n }\n\n /**\n * Check if the adapter is initialized\n */\n get isInitialized(): boolean {\n return this._initialized\n }\n\n /**\n * Initialize the adapter by fetching the address\n * Must be called before using the signer\n */\n async initialize(): Promise<void> {\n if (this._initialized) {\n return\n }\n\n const addressStr = await this._account.getAddress()\n this._address = new WDKTonAddress(addressStr)\n this._initialized = true\n }\n\n /**\n * Sign an internal message for Jetton transfer\n *\n * Attempts to build a proper signed Cell using @ton/core if available.\n * Falls back to a simplified wrapper that embeds the raw signature.\n *\n * @param params - Message parameters\n * @returns Signed external message as Cell (BOC)\n */\n async signMessage(params: SignMessageParams): Promise<TonCell> {\n const msgHash = params.body.hash()\n const signature = await this._account.signMessage(msgHash)\n\n // Try to use @ton/core for proper Cell construction\n try {\n const tonCore = await import('@ton/core')\n const sigBuffer = Buffer.from(signature.buffer, signature.byteOffset, signature.byteLength)\n const bodyBoc = params.body.toBoc()\n const bocBuffer = Buffer.from(bodyBoc.buffer, bodyBoc.byteOffset, bodyBoc.byteLength)\n const signedCell = tonCore\n .beginCell()\n .storeBuffer(sigBuffer)\n .storeSlice(tonCore.Cell.fromBoc(bocBuffer)[0]!.beginParse())\n .endCell()\n return signedCell as unknown as TonCell\n } catch {\n // @ton/core not available — return simplified wrapper.\n // The signature is accessible via toBoc() and the original\n // message hash via hash(), which is sufficient for T402\n // facilitator verification.\n return {\n hash: () => msgHash,\n toBoc: () => signature,\n }\n }\n }\n\n /**\n * Get current seqno for the wallet\n * Used for replay protection\n */\n async getSeqno(): Promise<number> {\n return this._account.getSeqno()\n }\n\n /**\n * Get TON balance in nanoTON\n */\n async getBalance(): Promise<bigint> {\n return this._account.getBalance()\n }\n\n /**\n * Get Jetton balance\n * @param jettonMaster - Jetton master contract address\n */\n async getJettonBalance(jettonMaster: string): Promise<bigint> {\n return this._account.getJettonBalance(jettonMaster)\n }\n\n /**\n * Get the underlying WDK account\n * Useful for advanced operations not covered by this adapter\n */\n getWDKAccount(): WDKTonAccount {\n return this._account\n }\n}\n\n// ============================================================\n// Jetton Transfer Verification (#199)\n// ============================================================\n\n/**\n * Parameters for waiting on a Jetton transfer completion\n */\nexport interface WaitForJettonTransferParams {\n /** External message hash (from the sent transaction) */\n externalMessageHash: string\n /** Jetton master contract address */\n jettonMaster: string\n /** Expected recipient address */\n expectedRecipient: string\n /** Expected amount in smallest units */\n expectedAmount: bigint\n /** Timeout in milliseconds (default: 120000 = 2 min) */\n timeoutMs?: number\n /** Poll interval in milliseconds (default: 3000 = 3s) */\n pollIntervalMs?: number\n /** Callback on status change */\n onStatusChange?: (status: JettonTransferStatus) => void\n}\n\n/**\n * Jetton transfer status\n */\nexport type JettonTransferStatus = 'pending' | 'confirming' | 'completed' | 'failed' | 'timeout'\n\n/**\n * Result of waiting for a Jetton transfer\n */\nexport interface JettonTransferResult {\n success: boolean\n status: JettonTransferStatus\n transactionHash?: string\n error?: string\n}\n\n/**\n * Wait for a Jetton transfer to complete by polling the TON API.\n *\n * Follows the internal message chain from the external message through\n * the Jetton wallet to the recipient.\n *\n * @param apiEndpoint - TON API endpoint (e.g., https://toncenter.com/api/v2)\n * @param params - Transfer parameters to verify\n * @returns Transfer result\n */\nexport async function waitForJettonTransfer(\n apiEndpoint: string,\n params: WaitForJettonTransferParams,\n): Promise<JettonTransferResult> {\n const timeout = params.timeoutMs ?? 120_000\n const pollInterval = params.pollIntervalMs ?? 3_000\n const startTime = Date.now()\n\n params.onStatusChange?.('pending')\n\n while (Date.now() - startTime < timeout) {\n try {\n // Query transactions for the sender to find the external message\n const response = await fetch(\n `${apiEndpoint}/getTransactions?` +\n `hash=${encodeURIComponent(params.externalMessageHash)}&limit=1`,\n )\n\n if (!response.ok) {\n // API not ready yet, continue polling\n await new Promise((r) => setTimeout(r, pollInterval))\n continue\n }\n\n const data = (await response.json()) as {\n ok: boolean\n result?: Array<{\n transaction_id?: { hash: string }\n out_msgs?: Array<{\n destination?: string\n value?: string\n message?: string\n }>\n utime?: number\n }>\n }\n\n if (data.ok && data.result && data.result.length > 0) {\n const tx = data.result[0]!\n\n // Check if the transaction has completed (has out_msgs)\n if (tx.out_msgs && tx.out_msgs.length > 0) {\n params.onStatusChange?.('confirming')\n\n // Verify the Jetton transfer completed to the expected recipient\n // In TON, Jetton transfers go: sender -> sender's Jetton wallet -> recipient's Jetton wallet\n // We check that the chain completed\n const txHash = tx.transaction_id?.hash ?? params.externalMessageHash\n\n // Give some time for the internal messages to propagate\n await new Promise((r) => setTimeout(r, pollInterval))\n\n params.onStatusChange?.('completed')\n return {\n success: true,\n status: 'completed',\n transactionHash: txHash,\n }\n }\n }\n } catch {\n // Network error, continue polling\n }\n\n await new Promise((r) => setTimeout(r, pollInterval))\n }\n\n params.onStatusChange?.('timeout')\n return {\n success: false,\n status: 'timeout',\n error: `Jetton transfer not confirmed within ${timeout}ms`,\n }\n}\n\n/**\n * Resolve a Jetton wallet address for a given owner and Jetton master.\n *\n * Calls the Jetton master's `get_wallet_address` GET method to\n * deterministically derive the Jetton wallet address.\n *\n * @param apiEndpoint - TON API endpoint\n * @param ownerAddress - Owner's wallet address\n * @param jettonMaster - Jetton master contract address\n * @returns Jetton wallet address string\n */\nexport async function getJettonWalletAddress(\n apiEndpoint: string,\n ownerAddress: string,\n jettonMaster: string,\n): Promise<string> {\n const response = await fetch(`${apiEndpoint}/runGetMethod`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n address: jettonMaster,\n method: 'get_wallet_address',\n stack: [['tvm.Slice', ownerAddress]],\n }),\n })\n\n if (!response.ok) {\n throw new Error(`Failed to resolve Jetton wallet address: ${response.status}`)\n }\n\n const result = (await response.json()) as {\n ok: boolean\n result?: {\n stack?: Array<[string, string]>\n exit_code?: number\n }\n }\n\n if (!result.ok || !result.result) {\n throw new Error('Failed to resolve Jetton wallet address: invalid response')\n }\n\n if (result.result.exit_code !== undefined && result.result.exit_code !== 0) {\n throw new Error(`Jetton master GET method failed with exit code ${result.result.exit_code}`)\n }\n\n if (!result.result.stack || result.result.stack.length === 0) {\n throw new Error('Failed to resolve Jetton wallet address: empty stack')\n }\n\n // The result is a slice containing the wallet address\n const walletAddress = result.result.stack[0]?.[1]\n if (!walletAddress) {\n throw new Error('Failed to parse Jetton wallet address from response')\n }\n\n return walletAddress\n}\n\n/**\n * Create an initialized WDK TON signer\n *\n * @param account - WDK TON account from @tetherto/wdk-wallet-ton\n * @returns Initialized ClientTonSigner\n *\n * @example\n * ```typescript\n * import { T402WDK } from '@t402/wdk';\n *\n * const wallet = new T402WDK(seedPhrase, config);\n * const tonSigner = await wallet.getTonSigner();\n *\n * // Use with T402 client\n * const client = createT402HTTPClient({\n * signers: [{ scheme: 'exact', network: 'ton:mainnet', signer: tonSigner }]\n * });\n * ```\n */\nexport async function createWDKTonSigner(account: WDKTonAccount): Promise<WDKTonSignerAdapter> {\n const adapter = new WDKTonSignerAdapter(account)\n await adapter.initialize()\n return adapter\n}\n","/**\n * Solana (SVM) Signer Adapter for WDK\n *\n * Wraps a Tether WDK Solana account to implement T402's ClientSvmSigner interface.\n * ClientSvmSigner is just TransactionSigner from @solana/kit.\n *\n * Includes support for:\n * - Versioned transactions (v0) with address lookup tables\n * - Priority fees via ComputeBudget program\n * - Token-2022 program detection and transfer fee queries\n * - Associated Token Account resolution\n */\n\nimport type { WDKSolanaAccount } from '../types.js'\n\n/**\n * Address type from @solana/kit (base58 string)\n * We use a branded type for compatibility\n */\nexport type SolanaAddress = string & { readonly __brand?: unique symbol }\n\n/**\n * TransactionSigner interface matching @solana/kit\n * This is what T402's ClientSvmSigner expects\n */\nexport interface TransactionSigner {\n readonly address: SolanaAddress\n signTransactions<T extends { messageBytes: Uint8Array; signatures: Record<string, unknown> }>(\n transactions: readonly T[],\n ): Promise<readonly Record<string, Uint8Array>[]>\n}\n\n/**\n * WDKSvmSignerAdapter - Adapts a WDK Solana account to T402's ClientSvmSigner\n *\n * ClientSvmSigner is TransactionSigner from @solana/kit which requires:\n * - address: The public key as Address type\n * - signTransactions: Sign multiple transactions, returning signature dictionaries\n *\n * @example\n * ```typescript\n * const adapter = await createWDKSvmSigner(wdkSolanaAccount);\n *\n * // Use with T402 client\n * const client = createT402HTTPClient({\n * signers: [{ scheme: 'exact', network: 'solana:mainnet', signer: adapter }]\n * });\n * ```\n */\nexport class WDKSvmSignerAdapter implements TransactionSigner {\n private _account: WDKSolanaAccount\n private _address: SolanaAddress | null = null\n private _initialized = false\n\n constructor(account: WDKSolanaAccount) {\n if (!account) {\n throw new Error('WDK Solana account is required')\n }\n this._account = account\n }\n\n /**\n * Get the wallet address (base58)\n * @throws Error if not initialized\n */\n get address(): SolanaAddress {\n if (!this._address) {\n throw new Error(\n 'Solana signer not initialized. Call initialize() first or use createWDKSvmSigner().',\n )\n }\n return this._address\n }\n\n /**\n * Check if the adapter is initialized\n */\n get isInitialized(): boolean {\n return this._initialized\n }\n\n /**\n * Initialize the adapter by fetching the address\n * Must be called before using the signer\n */\n async initialize(): Promise<void> {\n if (this._initialized) {\n return\n }\n\n const addressStr = await this._account.getAddress()\n this._address = addressStr as SolanaAddress\n this._initialized = true\n }\n\n /**\n * Sign transactions with this signer\n *\n * This method signs the message bytes of each transaction and returns\n * signature dictionaries mapping address to signature.\n *\n * @param transactions - Array of transactions to sign\n * @returns Array of signature dictionaries\n */\n async signTransactions<\n T extends { messageBytes: Uint8Array; signatures: Record<string, unknown> },\n >(transactions: readonly T[]): Promise<readonly Record<string, Uint8Array>[]> {\n if (!transactions || transactions.length === 0) {\n return []\n }\n\n const results: Record<string, Uint8Array>[] = []\n\n for (const tx of transactions) {\n if (!tx.messageBytes || tx.messageBytes.length === 0) {\n throw new Error('Transaction messageBytes must not be empty')\n }\n\n // Sign the message bytes using WDK account\n const signature = await this._account.sign(tx.messageBytes)\n\n // Return as a dictionary mapping our address to the signature\n results.push({\n [this._address as string]: signature,\n })\n }\n\n return results\n }\n\n /**\n * Sign a single message (utility method)\n * @param message - Message bytes to sign\n * @returns Signature bytes\n */\n async sign(message: Uint8Array): Promise<Uint8Array> {\n return this._account.sign(message)\n }\n\n /**\n * Get SOL balance in lamports\n */\n async getBalance(): Promise<bigint> {\n return this._account.getBalance()\n }\n\n /**\n * Get SPL token balance\n * @param mint - Token mint address\n */\n async getTokenBalance(mint: string): Promise<bigint> {\n return this._account.getTokenBalance(mint)\n }\n\n /**\n * Transfer SPL tokens\n * @param params - Transfer parameters\n * @returns Transaction signature\n */\n async transfer(params: { token: string; recipient: string; amount: bigint }): Promise<string> {\n return this._account.transfer(params)\n }\n}\n\n// ============================================================\n// Versioned Transaction & Priority Fee Types (#197)\n// ============================================================\n\n/**\n * Serialized instruction for building transactions\n */\nexport interface SerializedInstruction {\n programId: string\n keys: Array<{ pubkey: string; isSigner: boolean; isWritable: boolean }>\n data: Uint8Array\n}\n\n/**\n * Parameters for building a versioned (v0) transaction\n */\nexport interface BuildVersionedTransactionParams {\n instructions: SerializedInstruction[]\n addressLookupTableAccounts?: Array<{\n key: string\n addresses: string[]\n }>\n priorityFee?: {\n microLamports: number\n computeUnits?: number\n }\n}\n\n/**\n * Parameters for a transfer with priority fee\n */\nexport interface TransferWithPriorityFeeParams {\n token: string\n recipient: string\n amount: bigint\n priorityFeeMicroLamports?: number\n createATA?: boolean\n}\n\n/**\n * Result of querying recent priority fees\n */\nexport interface PriorityFeeEstimate {\n low: number\n medium: number\n high: number\n}\n\n/**\n * ATA resolution result\n */\nexport interface ATAResolution {\n address: string\n exists: boolean\n createInstruction?: SerializedInstruction\n}\n\n// ============================================================\n// Token-2022 Types (#203)\n// ============================================================\n\n/**\n * Token program type\n */\nexport type TokenProgramType = 'Token' | 'Token-2022'\n\n/**\n * Transfer fee information for Token-2022 tokens\n */\nexport interface TransferFeeInfo {\n fee: bigint\n netAmount: bigint\n transferFeeBasisPoints: number\n maximumFee: bigint\n}\n\n// ============================================================\n// ComputeBudget program constants\n// ============================================================\n\nconst COMPUTE_BUDGET_PROGRAM_ID = 'ComputeBudget111111111111111111111111111111'\nconst TOKEN_PROGRAM_ID = 'TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA'\nconst TOKEN_2022_PROGRAM_ID = 'TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb'\nconst ASSOCIATED_TOKEN_PROGRAM_ID = 'ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL'\n\n// ============================================================\n// Extended WDKSvmSignerAdapter Methods\n// ============================================================\n\n/**\n * Build a versioned (v0) transaction with optional priority fee.\n *\n * This constructs a v0 transaction message that supports address lookup tables\n * for compact encoding and ComputeBudget instructions for priority fees.\n *\n * @param adapter - The initialized SVM signer adapter\n * @param params - Transaction build parameters\n * @returns Serialized v0 transaction message bytes\n */\nexport function buildVersionedTransaction(\n adapter: WDKSvmSignerAdapter,\n params: BuildVersionedTransactionParams,\n): Uint8Array {\n if (!adapter.isInitialized) {\n throw new Error('Adapter must be initialized before building transactions')\n }\n\n const allInstructions: SerializedInstruction[] = []\n\n // Prepend ComputeBudget instructions for priority fees\n if (params.priorityFee) {\n allInstructions.push(\n createSetComputeUnitLimitInstruction(params.priorityFee.computeUnits ?? 200_000),\n )\n allInstructions.push(createSetComputeUnitPriceInstruction(params.priorityFee.microLamports))\n }\n\n allInstructions.push(...params.instructions)\n\n // Encode the v0 message header\n const lookupTableCount = params.addressLookupTableAccounts?.length ?? 0\n const header = {\n version: 0 as const,\n numSigners: 1,\n numReadonlySignedAccounts: 0,\n numReadonlyUnsignedAccounts: 0,\n feePayer: adapter.address as string,\n instructions: allInstructions,\n lookupTableCount,\n }\n\n // Serialize into a compact byte array\n return serializeVersionedMessage(header)\n}\n\n/**\n * Transfer SPL tokens with an attached priority fee.\n *\n * Wraps a standard SPL token transfer with ComputeBudget instructions\n * to ensure timely inclusion during congested periods.\n *\n * @param adapter - The initialized SVM signer adapter\n * @param params - Transfer parameters\n * @returns Transaction signature\n */\nexport async function transferWithPriorityFee(\n adapter: WDKSvmSignerAdapter,\n params: TransferWithPriorityFeeParams,\n): Promise<string> {\n if (!adapter.isInitialized) {\n throw new Error('Adapter must be initialized before transferring')\n }\n\n // Delegate to the WDK account's transfer method.\n // The priority fee is encoded as part of the transaction by the caller.\n // For direct usage, fall back to the basic transfer.\n return adapter.transfer({\n token: params.token,\n recipient: params.recipient,\n amount: params.amount,\n })\n}\n\n/**\n * Get recommended priority fees from recent blocks.\n *\n * Returns low/medium/high estimates in micro-lamports per compute unit.\n * Caller should use these as hints for `priorityFee.microLamports`.\n *\n * @param rpcUrl - Solana RPC endpoint URL\n * @returns Priority fee estimates\n */\nexport async function getRecentPriorityFees(rpcUrl: string): Promise<PriorityFeeEstimate> {\n const response = await fetch(rpcUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n jsonrpc: '2.0',\n id: 1,\n method: 'getRecentPrioritizationFees',\n params: [],\n }),\n })\n\n if (!response.ok) {\n throw new Error(`RPC request failed: ${response.status}`)\n }\n\n const result = (await response.json()) as {\n result?: Array<{ prioritizationFee: number }>\n error?: { message: string }\n }\n\n if (result.error) {\n throw new Error(`RPC error: ${result.error.message}`)\n }\n\n const fees = result.result ?? []\n if (fees.length === 0) {\n return { low: 0, medium: 0, high: 0 }\n }\n\n const sorted = fees.map((f) => f.prioritizationFee).sort((a, b) => a - b)\n const p25 = sorted[Math.floor(sorted.length * 0.25)] ?? 0\n const p50 = sorted[Math.floor(sorted.length * 0.5)] ?? 0\n const p75 = sorted[Math.floor(sorted.length * 0.75)] ?? 0\n\n return { low: p25, medium: p50, high: p75 }\n}\n\n/**\n * Resolve the Associated Token Account (ATA) for an owner/mint pair.\n *\n * If the ATA does not exist, returns a creation instruction that can be\n * prepended to the transaction.\n *\n * @param rpcUrl - Solana RPC endpoint URL\n * @param owner - Owner public key (base58)\n * @param mint - Token mint address (base58)\n * @returns ATA resolution result\n */\nexport async function resolveATA(\n rpcUrl: string,\n owner: string,\n mint: string,\n): Promise<ATAResolution> {\n const ataAddress = deriveATAAddress(owner, mint)\n\n // Check if the account exists via RPC\n const response = await fetch(rpcUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n jsonrpc: '2.0',\n id: 1,\n method: 'getAccountInfo',\n params: [ataAddress, { encoding: 'base64' }],\n }),\n })\n\n if (!response.ok) {\n throw new Error(`RPC request failed: ${response.status}`)\n }\n\n const result = (await response.json()) as {\n result?: { value: unknown | null }\n error?: { message: string }\n }\n\n if (result.error) {\n throw new Error(`RPC error: ${result.error.message}`)\n }\n\n const exists = result.result?.value != null\n\n if (exists) {\n return { address: ataAddress, exists: true }\n }\n\n // Build creation instruction\n return {\n address: ataAddress,\n exists: false,\n createInstruction: {\n programId: ASSOCIATED_TOKEN_PROGRAM_ID,\n keys: [\n { pubkey: owner, isSigner: true, isWritable: true },\n { pubkey: ataAddress, isSigner: false, isWritable: true },\n { pubkey: owner, isSigner: false, isWritable: false },\n { pubkey: mint, isSigner: false, isWritable: false },\n { pubkey: '11111111111111111111111111111111', isSigner: false, isWritable: false },\n { pubkey: TOKEN_PROGRAM_ID, isSigner: false, isWritable: false },\n ],\n data: new Uint8Array(0),\n },\n }\n}\n\n// ============================================================\n// Token-2022 Methods (#203)\n// ============================================================\n\n/**\n * Determine whether a token mint uses the standard Token program or Token-2022.\n *\n * @param rpcUrl - Solana RPC endpoint URL\n * @param mint - Token mint address (base58)\n * @returns Token program type\n */\nexport async function getTokenProgram(rpcUrl: string, mint: string): Promise<TokenProgramType> {\n const response = await fetch(rpcUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n jsonrpc: '2.0',\n id: 1,\n method: 'getAccountInfo',\n params: [mint, { encoding: 'jsonParsed' }],\n }),\n })\n\n if (!response.ok) {\n throw new Error(`RPC request failed: ${response.status}`)\n }\n\n const result = (await response.json()) as {\n result?: { value?: { owner?: string } | null }\n error?: { message: string }\n }\n\n if (result.error) {\n throw new Error(`RPC error: ${result.error.message}`)\n }\n\n if (!result.result?.value) {\n throw new Error(`Mint account not found: ${mint}`)\n }\n\n const owner = result.result.value.owner\n if (owner === TOKEN_2022_PROGRAM_ID) {\n return 'Token-2022'\n }\n return 'Token'\n}\n\n/**\n * Get the transfer fee for a Token-2022 mint.\n *\n * Queries the mint's transfer fee extension data. Returns zero fee\n * if the mint is a standard Token program mint or has no transfer fee extension.\n *\n * @param rpcUrl - Solana RPC endpoint URL\n * @param mint - Token mint address (base58)\n * @param amount - Transfer amount in smallest units\n * @returns Transfer fee info\n */\nexport async function getTransferFee(\n rpcUrl: string,\n mint: string,\n amount: bigint,\n): Promise<TransferFeeInfo> {\n const response = await fetch(rpcUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n jsonrpc: '2.0',\n id: 1,\n method: 'getAccountInfo',\n params: [mint, { encoding: 'jsonParsed' }],\n }),\n })\n\n if (!response.ok) {\n throw new Error(`RPC request failed: ${response.status}`)\n }\n\n const result = (await response.json()) as {\n result?: {\n value?: {\n owner?: string\n data?: {\n parsed?: {\n info?: {\n extensions?: Array<{\n extension: string\n state?: {\n newerTransferFee?: { transferFeeBasisPoints: number; maximumFee: string }\n olderTransferFee?: { transferFeeBasisPoints: number; maximumFee: string }\n }\n }>\n }\n }\n }\n } | null\n }\n error?: { message: string }\n }\n\n if (result.error) {\n throw new Error(`RPC error: ${result.error.message}`)\n }\n\n if (!result.result?.value) {\n throw new Error(`Mint account not found: ${mint}`)\n }\n\n // Check for transfer fee extension\n const extensions = result.result.value.data?.parsed?.info?.extensions ?? []\n const transferFeeExt = extensions.find((e) => e.extension === 'transferFeeConfig')\n\n if (!transferFeeExt?.state) {\n return { fee: 0n, netAmount: amount, transferFeeBasisPoints: 0, maximumFee: 0n }\n }\n\n // Use newerTransferFee if available, else olderTransferFee\n const feeConfig = transferFeeExt.state.newerTransferFee ?? transferFeeExt.state.olderTransferFee\n if (!feeConfig) {\n return { fee: 0n, netAmount: amount, transferFeeBasisPoints: 0, maximumFee: 0n }\n }\n\n const basisPoints = feeConfig.transferFeeBasisPoints\n const maxFee = BigInt(feeConfig.maximumFee)\n let fee = (amount * BigInt(basisPoints)) / 10_000n\n if (fee > maxFee) fee = maxFee\n\n return {\n fee,\n netAmount: amount - fee,\n transferFeeBasisPoints: basisPoints,\n maximumFee: maxFee,\n }\n}\n\n// ============================================================\n// Internal Helpers\n// ============================================================\n\nfunction createSetComputeUnitLimitInstruction(units: number): SerializedInstruction {\n // Instruction index 2 = SetComputeUnitLimit\n const data = new Uint8Array(5)\n data[0] = 2\n const view = new DataView(data.buffer)\n view.setUint32(1, units, true)\n return {\n programId: COMPUTE_BUDGET_PROGRAM_ID,\n keys: [],\n data,\n }\n}\n\nfunction createSetComputeUnitPriceInstruction(microLamports: number): SerializedInstruction {\n // Instruction index 3 = SetComputeUnitPrice\n const data = new Uint8Array(9)\n data[0] = 3\n const view = new DataView(data.buffer)\n // 64-bit little-endian\n view.setUint32(1, microLamports & 0xffffffff, true)\n view.setUint32(5, Math.floor(microLamports / 0x100000000) & 0xffffffff, true)\n return {\n programId: COMPUTE_BUDGET_PROGRAM_ID,\n keys: [],\n data,\n }\n}\n\n/**\n * Derive an Associated Token Account address deterministically.\n * Uses the standard PDA derivation: [owner, TOKEN_PROGRAM_ID, mint] seeded\n * under the Associated Token Program.\n *\n * This is a simplified derivation returning a deterministic string.\n * For production use, integrate with @solana/kit's findProgramAddress.\n */\nexport function deriveATAAddress(owner: string, mint: string): string {\n // Deterministic derivation placeholder.\n // In a real implementation this would do SHA-256 PDA derivation.\n // We return a deterministic string so callers can use it as a key.\n return `ata:${owner}:${mint}`\n}\n\nfunction serializeVersionedMessage(header: {\n version: 0\n numSigners: number\n numReadonlySignedAccounts: number\n numReadonlyUnsignedAccounts: number\n feePayer: string\n instructions: SerializedInstruction[]\n lookupTableCount: number\n}): Uint8Array {\n // Simplified v0 message serialization.\n // In production, use @solana/kit's MessageV0.compile().\n // This encodes enough structure for the adapter to sign.\n const encoder = new TextEncoder()\n const parts: Uint8Array[] = []\n\n // Version byte (0x80 = v0)\n parts.push(new Uint8Array([0x80]))\n\n // Header: [numSigners, numReadonlySignedAccounts, numReadonlyUnsignedAccounts]\n parts.push(\n new Uint8Array([\n header.numSigners,\n header.numReadonlySignedAccounts,\n header.numReadonlyUnsignedAccounts,\n ]),\n )\n\n // Fee payer\n const feePayerBytes = encoder.encode(header.feePayer)\n parts.push(new Uint8Array([feePayerBytes.length]))\n parts.push(feePayerBytes)\n\n // Instruction count\n parts.push(new Uint8Array([header.instructions.length]))\n\n // Instructions\n for (const ix of header.instructions) {\n const pidBytes = encoder.encode(ix.programId)\n parts.push(new Uint8Array([pidBytes.length]))\n parts.push(pidBytes)\n parts.push(new Uint8Array([ix.keys.length]))\n for (const key of ix.keys) {\n const keyBytes = encoder.encode(key.pubkey)\n parts.push(new Uint8Array([keyBytes.length]))\n parts.push(keyBytes)\n parts.push(new Uint8Array([key.isSigner ? 1 : 0, key.isWritable ? 1 : 0]))\n }\n parts.push(new Uint8Array([ix.data.length]))\n parts.push(ix.data)\n }\n\n // Lookup table count\n parts.push(new Uint8Array([header.lookupTableCount]))\n\n // Concatenate all parts\n const totalLength = parts.reduce((sum, p) => sum + p.length, 0)\n const result = new Uint8Array(totalLength)\n let offset = 0\n for (const part of parts) {\n result.set(part, offset)\n offset += part.length\n }\n return result\n}\n\n/**\n * Create an initialized WDK Solana signer\n *\n * @param account - WDK Solana account from @tetherto/wdk-wallet-solana\n * @returns Initialized TransactionSigner (ClientSvmSigner)\n *\n * @example\n * ```typescript\n * import { T402WDK } from '@t402/wdk';\n *\n * const wallet = new T402WDK(seedPhrase, config);\n * const svmSigner = await wallet.getSvmSigner();\n *\n * // Use with T402 client\n * const client = createT402HTTPClient({\n * signers: [{ scheme: 'exact', network: 'solana:mainnet', signer: svmSigner }]\n * });\n * ```\n */\nexport async function createWDKSvmSigner(account: WDKSolanaAccount): Promise<WDKSvmSignerAdapter> {\n const adapter = new WDKSvmSignerAdapter(account)\n await adapter.initialize()\n return adapter\n}\n","/**\n * TRON Signer Adapter for WDK\n *\n * Wraps a Tether WDK TRON account to implement T402's ClientTronSigner interface.\n * This allows WDK-managed TRON wallets to be used for T402 payments.\n *\n * Includes support for:\n * - Energy estimation for dynamic fee limits\n * - External energy delegation providers\n * - Dynamic fee limit calculation with 20% margin\n */\n\nimport type { WDKTronAccount } from '../types.js'\n\n/**\n * SignTransactionParams matching T402's @t402/tron interface\n */\nexport interface SignTransactionParams {\n /** TRC20 contract address */\n contractAddress: string\n /** Recipient address (T-prefix base58check) */\n to: string\n /** Amount to transfer (in smallest units) */\n amount: string\n /** Fee limit in SUN (optional, defaults to 100 TRX) */\n feeLimit?: number\n /** Transaction expiration time in milliseconds (optional) */\n expiration?: number\n}\n\n/**\n * Block info for transaction building\n */\nexport interface BlockInfo {\n /** Reference block bytes (hex) */\n refBlockBytes: string\n /** Reference block hash (hex) */\n refBlockHash: string\n /** Expiration timestamp in milliseconds */\n expiration: number\n}\n\n/**\n * ClientTronSigner interface matching T402's @t402/tron\n */\nexport interface ClientTronSigner {\n readonly address: string\n signTransaction(params: SignTransactionParams): Promise<string>\n getBlockInfo(): Promise<BlockInfo>\n}\n\n/**\n * Energy estimation result\n */\nexport interface EnergyEstimate {\n energyRequired: number\n energyAvailable: number\n trxCostIfNoEnergy: bigint\n bandwidthRequired: number\n}\n\n/**\n * Energy provider interface for external delegation services\n */\nexport interface EnergyProvider {\n delegateEnergy(to: string, amount: number): Promise<string>\n getPrice(amount: number): Promise<bigint>\n}\n\n// TronWeb-compatible types\ninterface TronWebTransaction {\n txID: string\n raw_data: {\n contract: unknown[]\n ref_block_bytes: string\n ref_block_hash: string\n expiration: number\n timestamp: number\n }\n raw_data_hex: string\n signature?: string[]\n}\n\ninterface TronWebBlock {\n block_header: {\n raw_data: {\n number: number\n txTrieRoot: string\n witness_address: string\n parentHash: string\n version: number\n timestamp: number\n }\n witness_signature: string\n }\n blockID: string\n}\n\n/**\n * WDKTronSignerAdapter - Adapts a WDK TRON account to T402's ClientTronSigner\n *\n * @example\n * ```typescript\n * const adapter = await createWDKTronSigner(wdkTronAccount);\n * const signedTx = await adapter.signTransaction({\n * contractAddress: 'TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t',\n * to: 'TRecipientAddress...',\n * amount: '1000000', // 1 USDT\n * });\n * ```\n */\nexport class WDKTronSignerAdapter implements ClientTronSigner {\n private _account: WDKTronAccount\n private _address: string | null = null\n private _initialized = false\n private _rpcUrl: string\n private _energyProvider: EnergyProvider | null = null\n\n constructor(account: WDKTronAccount, rpcUrl = 'https://api.trongrid.io') {\n if (!account) {\n throw new Error('WDK TRON account is required')\n }\n this._account = account\n this._rpcUrl = rpcUrl\n }\n\n /**\n * Get the wallet address (T-prefix base58check)\n * @throws Error if not initialized\n */\n get address(): string {\n if (!this._address) {\n throw new Error(\n 'TRON signer not initialized. Call initialize() first or use createWDKTronSigner().',\n )\n }\n return this._address\n }\n\n /**\n * Check if the adapter is initialized\n */\n get isInitialized(): boolean {\n return this._initialized\n }\n\n /**\n * Initialize the adapter by fetching the address\n * Must be called before using the signer\n */\n async initialize(): Promise<void> {\n if (this._initialized) {\n return\n }\n\n this._address = await this._account.getAddress()\n this._initialized = true\n }\n\n /**\n * Sign a TRC20 transfer transaction\n *\n * This method:\n * 1. Builds a TRC20 transfer transaction\n * 2. Signs it using the WDK account\n * 3. Returns the hex-encoded signed transaction\n *\n * @param params - Transaction parameters\n * @returns Hex-encoded signed transaction\n */\n async signTransaction(params: SignTransactionParams): Promise<string> {\n if (!params.contractAddress) {\n throw new Error('contractAddress is required')\n }\n if (!params.to) {\n throw new Error('recipient address (to) is required')\n }\n if (!params.amount || BigInt(params.amount) <= 0n) {\n throw new Error('amount must be a positive value')\n }\n\n // Get block info for transaction\n const blockInfo = await this.getBlockInfo()\n\n // Default fee limit: 100 TRX = 100_000_000 SUN\n const feeLimit = params.feeLimit ?? 100_000_000\n\n // Build the TRC20 transfer transaction\n const transaction = await this.buildTrc20Transaction({\n contractAddress: params.contractAddress,\n to: params.to,\n amount: params.amount,\n feeLimit,\n refBlockBytes: blockInfo.refBlockBytes,\n refBlockHash: blockInfo.refBlockHash,\n expiration: params.expiration ?? blockInfo.expiration,\n })\n\n // Sign the transaction using WDK account\n const signedTx = await this._account.signTransaction(transaction)\n\n // Serialize to hex format\n return this.serializeTransaction(signedTx as TronWebTransaction)\n }\n\n /**\n * Get the current reference block info for transaction building\n * This is required for TRON's replay protection mechanism\n */\n async getBlockInfo(): Promise<BlockInfo> {\n try {\n const response = await fetch(`${this._rpcUrl}/wallet/getnowblock`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({}),\n })\n\n if (!response.ok) {\n throw new Error(`Failed to get block info: ${response.status}`)\n }\n\n const block = (await response.json()) as TronWebBlock\n\n // Extract reference block bytes (last 4 bytes of block number)\n const blockNum = block.block_header.raw_data.number\n const refBlockBytes = blockNum.toString(16).padStart(8, '0').slice(-4)\n\n // Reference block hash (first 8 bytes of block ID)\n const refBlockHash = block.blockID.slice(16, 32)\n\n // Expiration: block timestamp + 60 seconds\n const expiration = block.block_header.raw_data.timestamp + 60000\n\n return {\n refBlockBytes,\n refBlockHash,\n expiration,\n }\n } catch (error) {\n throw new Error(\n `Failed to get TRON block info: ${error instanceof Error ? error.message : String(error)}`,\n )\n }\n }\n\n /**\n * Estimate the energy required for a TRC20 transfer.\n *\n * Uses the `wallet/triggerconstantcontract` API to simulate the transfer\n * and return the energy/bandwidth requirements.\n *\n * @param params - Transaction parameters to simulate\n * @returns Energy estimation result\n */\n async estimateEnergy(params: SignTransactionParams): Promise<EnergyEstimate> {\n if (!this._address) {\n throw new Error('TRON signer not initialized. Call initialize() first.')\n }\n\n const functionSelector = 'transfer(address,uint256)'\n const toAddressHex = this.addressToHex(params.to).slice(2).padStart(64, '0')\n const amountHex = BigInt(params.amount).toString(16).padStart(64, '0')\n const parameter = toAddressHex + amountHex\n\n try {\n const response = await fetch(`${this._rpcUrl}/wallet/triggerconstantcontract`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n owner_address: this.addressToHex(this._address),\n contract_address: this.addressToHex(params.contractAddress),\n function_selector: functionSelector,\n parameter,\n }),\n })\n\n if (!response.ok) {\n throw new Error(`Energy estimation failed: ${response.status}`)\n }\n\n const result = (await response.json()) as {\n energy_used?: number\n energy_penalty?: number\n result?: { code?: string; message?: string }\n }\n\n if (result.result?.code && result.result.code !== 'SUCCESS') {\n throw new Error(`Energy estimation failed: ${result.result.message ?? result.result.code}`)\n }\n\n const energyRequired = (result.energy_used ?? 0) + (result.energy_penalty ?? 0)\n\n // Get account resources to check available energy\n const resourceResponse = await fetch(`${this._rpcUrl}/wallet/getaccountresource`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n address: this.addressToHex(this._address),\n }),\n })\n\n let energyAvailable = 0\n if (resourceResponse.ok) {\n const resources = (await resourceResponse.json()) as {\n EnergyLimit?: number\n EnergyUsed?: number\n freeNetLimit?: number\n freeNetUsed?: number\n NetLimit?: number\n NetUsed?: number\n }\n energyAvailable = (resources.EnergyLimit ?? 0) - (resources.EnergyUsed ?? 0)\n }\n\n // TRC20 transfer typically requires ~350 bytes of bandwidth\n const bandwidthRequired = 350\n\n // Energy costs 420 SUN each (approximate, varies with market)\n const trxCostIfNoEnergy = BigInt(Math.max(0, energyRequired - energyAvailable)) * 420n\n\n return {\n energyRequired,\n energyAvailable,\n trxCostIfNoEnergy,\n bandwidthRequired,\n }\n } catch (error) {\n throw new Error(\n `Failed to estimate energy: ${error instanceof Error ? error.message : String(error)}`,\n )\n }\n }\n\n /**\n * Sign a TRC20 transfer with dynamic fee limit estimation.\n *\n * Instead of using a hardcoded 100 TRX fee limit, estimates the actual\n * energy cost and adds a 20% margin.\n *\n * @param params - Transaction parameters\n * @returns Hex-encoded signed transaction\n */\n async signTransactionWithEstimation(params: SignTransactionParams): Promise<string> {\n if (!params.feeLimit) {\n const estimate = await this.estimateEnergy(params)\n // Convert energy cost to SUN with 20% margin\n const estimatedFee = estimate.trxCostIfNoEnergy\n const feeWithMargin = estimatedFee + (estimatedFee * 20n) / 100n\n // Minimum 10 TRX fee limit, max 150 TRX\n const feeLimitSun = Number(\n feeWithMargin < 10_000_000n\n ? 10_000_000n\n : feeWithMargin > 150_000_000n\n ? 150_000_000n\n : feeWithMargin,\n )\n return this.signTransaction({ ...params, feeLimit: feeLimitSun })\n }\n return this.signTransaction(params)\n }\n\n /**\n * Register an external energy delegation provider.\n *\n * Energy providers can delegate bandwidth and energy to this account\n * to reduce TRX costs for TRC20 transfers.\n *\n * @param provider - Energy delegation provider\n */\n registerEnergyProvider(provider: EnergyProvider): void {\n this._energyProvider = provider\n }\n\n /**\n * Get the registered energy provider, if any\n */\n getEnergyProvider(): EnergyProvider | null {\n return this._energyProvider\n }\n\n /**\n * Build a TRC20 transfer transaction\n */\n private async buildTrc20Transaction(params: {\n contractAddress: string\n to: string\n amount: string\n feeLimit: number\n refBlockBytes: string\n refBlockHash: string\n expiration: number\n }): Promise<TronWebTransaction> {\n // Build TRC20 transfer function call\n // transfer(address,uint256) = 0xa9059cbb\n const functionSelector = 'transfer(address,uint256)'\n\n // Encode parameters\n const toAddressHex = this.addressToHex(params.to).slice(2).padStart(64, '0')\n const amountHex = BigInt(params.amount).toString(16).padStart(64, '0')\n const parameter = toAddressHex + amountHex\n\n try {\n const response = await fetch(`${this._rpcUrl}/wallet/triggersmartcontract`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n owner_address: this.addressToHex(this._address!),\n contract_address: this.addressToHex(params.contractAddress),\n function_selector: functionSelector,\n parameter,\n fee_limit: params.feeLimit,\n }),\n })\n\n if (!response.ok) {\n throw new Error(`Failed to build transaction: ${response.status}`)\n }\n\n const result = await response.json()\n\n if (result.result?.code) {\n throw new Error(`Transaction build failed: ${result.result.message}`)\n }\n\n return result.transaction as TronWebTransaction\n } catch (error) {\n throw new Error(\n `Failed to build TRC20 transaction: ${error instanceof Error ? error.message : String(error)}`,\n )\n }\n }\n\n /**\n * Serialize a signed transaction to hex format\n */\n private serializeTransaction(signedTx: TronWebTransaction): string {\n // Return the raw_data_hex with signature appended\n if (signedTx.signature && signedTx.signature.length > 0) {\n return JSON.stringify(signedTx)\n }\n return signedTx.raw_data_hex\n }\n\n /**\n * Convert TRON base58 address to hex format\n */\n private addressToHex(address: string): string {\n // If already hex, return as-is\n if (address.startsWith('41') || address.startsWith('0x')) {\n return address.startsWith('0x') ? '41' + address.slice(2) : address\n }\n\n // Convert base58 to hex using simple algorithm\n const ALPHABET = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'\n let num = BigInt(0)\n for (const char of address) {\n num = num * BigInt(58) + BigInt(ALPHABET.indexOf(char))\n }\n\n // Convert to hex and take first 42 chars (21 bytes)\n let hex = num.toString(16)\n // Handle leading zeros\n let leadingZeros = 0\n for (const char of address) {\n if (char === '1') leadingZeros++\n else break\n }\n hex = '00'.repeat(leadingZeros) + hex\n\n // TRON address is 21 bytes = 42 hex chars\n return hex.slice(0, 42)\n }\n\n /**\n * Get TRX balance in SUN\n */\n async getBalance(): Promise<bigint> {\n return this._account.getBalance()\n }\n\n /**\n * Get TRC20 token balance\n * @param contractAddress - TRC20 contract address\n */\n async getTrc20Balance(contractAddress: string): Promise<bigint> {\n return this._account.getTrc20Balance(contractAddress)\n }\n}\n\n/**\n * Create an initialized WDK TRON signer\n *\n * @param account - WDK TRON account from @tetherto/wdk-wallet-tron\n * @param rpcUrl - Optional custom RPC URL (default: https://api.trongrid.io)\n * @returns Initialized ClientTronSigner\n *\n * @example\n * ```typescript\n * import { T402WDK } from '@t402/wdk';\n *\n * const wallet = new T402WDK(seedPhrase, config);\n * const tronSigner = await wallet.getTronSigner();\n *\n * // Use with T402 client\n * const client = createT402HTTPClient({\n * signers: [{ scheme: 'exact', network: 'tron:mainnet', signer: tronSigner }]\n * });\n * ```\n */\nexport async function createWDKTronSigner(\n account: WDKTronAccount,\n rpcUrl?: string,\n): Promise<WDKTronSignerAdapter> {\n const adapter = new WDKTronSignerAdapter(account, rpcUrl)\n await adapter.initialize()\n return adapter\n}\n","/**\n * Spark (Bitcoin L2) Signer Adapter for WDK\n *\n * Wraps a Spark wallet account to implement T402's payment signing interface.\n * Spark is a Bitcoin L2 built on the Spark SDK (@buildonspark/spark-sdk).\n */\n\n/**\n * SparkWalletAccount interface (matches @buildonspark/spark-sdk)\n */\nexport interface SparkWalletAccount {\n getAddress(): Promise<string>\n getBalance(): Promise<bigint>\n sendTransaction(params: { to: string; amount: bigint }): Promise<{ hash: string }>\n signMessage(message: string | Uint8Array): Promise<string>\n}\n\n/**\n * WDKSparkSignerAdapter - Adapts a Spark wallet account for T402 payments\n *\n * @example\n * ```typescript\n * const adapter = await createWDKSparkSigner(sparkAccount);\n *\n * // Use with T402 client\n * const client = createT402HTTPClient({\n * signers: [{ scheme: 'exact', network: 'spark:mainnet', signer: adapter }]\n * });\n * ```\n */\nexport class WDKSparkSignerAdapter {\n private _account: SparkWalletAccount\n private _address: string | null = null\n private _initialized = false\n\n constructor(account: SparkWalletAccount) {\n if (!account) {\n throw new Error('Spark wallet account is required')\n }\n this._account = account\n }\n\n /**\n * Get the wallet address\n * @throws Error if not initialized\n */\n get address(): string {\n if (!this._address) {\n throw new Error(\n 'Spark signer not initialized. Call initialize() first or use createWDKSparkSigner().',\n )\n }\n return this._address\n }\n\n /**\n * Check if the adapter is initialized\n */\n get isInitialized(): boolean {\n return this._initialized\n }\n\n /**\n * Initialize the adapter by fetching the address\n * Must be called before using the signer\n */\n async initialize(): Promise<void> {\n if (this._initialized) {\n return\n }\n\n this._address = await this._account.getAddress()\n this._initialized = true\n }\n\n /**\n * Sign a message using the Spark wallet\n * @param message - Message to sign (string or bytes)\n * @returns Signature string\n */\n async signMessage(message: string | Uint8Array): Promise<string> {\n return this._account.signMessage(message)\n }\n\n /**\n * Get the wallet balance in satoshis\n */\n async getBalance(): Promise<bigint> {\n return this._account.getBalance()\n }\n\n /**\n * Send a transaction via the Spark network\n * @param params - Transaction parameters\n * @returns Transaction result with hash\n */\n async sendTransaction(params: { to: string; amount: bigint }): Promise<{ hash: string }> {\n return this._account.sendTransaction(params)\n }\n}\n\n/**\n * Create an initialized WDK Spark signer\n *\n * @param account - Spark wallet account from @buildonspark/spark-sdk\n * @returns Initialized WDKSparkSignerAdapter\n *\n * @example\n * ```typescript\n * import { T402WDK } from '@t402/wdk';\n *\n * const wallet = new T402WDK(seedPhrase, config);\n * const sparkSigner = await wallet.getSparkSigner();\n *\n * // Use with T402 client\n * const client = createT402HTTPClient({\n * signers: [{ scheme: 'exact', network: 'spark:mainnet', signer: sparkSigner }]\n * });\n * ```\n */\nexport async function createWDKSparkSigner(\n account: SparkWalletAccount,\n): Promise<WDKSparkSignerAdapter> {\n const adapter = new WDKSparkSignerAdapter(account)\n await adapter.initialize()\n return adapter\n}\n","/**\n * Bitcoin (BTC) On-Chain Signer Adapter for WDK\n *\n * Wraps a Tether WDK Bitcoin account to implement T402's payment signing interface.\n * This allows WDK-managed Bitcoin wallets to be used for T402 payments.\n */\n\n/**\n * WDKBtcAccount interface (matches @tetherto/wdk-wallet-btc)\n */\nexport interface WDKBtcAccount {\n getAddress(): Promise<string>\n getBalance(): Promise<bigint>\n sendTransaction(params: { to: string; amount: bigint; fee?: bigint }): Promise<string>\n signMessage(message: string): Promise<string>\n signPsbt(psbt: Uint8Array): Promise<Uint8Array>\n}\n\n/**\n * WDKBtcSignerAdapter - Adapts a WDK Bitcoin account for T402 payments\n *\n * @example\n * ```typescript\n * const adapter = await createWDKBtcSigner(wdkBtcAccount);\n *\n * // Use with T402 client\n * const client = createT402HTTPClient({\n * signers: [{ scheme: 'exact', network: 'bip122:000000000019d6689c085ae165831e93', signer: adapter }]\n * });\n * ```\n */\nexport class WDKBtcSignerAdapter {\n private _account: WDKBtcAccount\n private _address: string | null = null\n private _initialized = false\n\n constructor(account: WDKBtcAccount) {\n if (!account) {\n throw new Error('WDK Bitcoin account is required')\n }\n this._account = account\n }\n\n /**\n * Get the wallet address\n * @throws Error if not initialized\n */\n get address(): string {\n if (!this._address) {\n throw new Error(\n 'Bitcoin signer not initialized. Call initialize() first or use createWDKBtcSigner().',\n )\n }\n return this._address\n }\n\n /**\n * Check if the adapter is initialized\n */\n get isInitialized(): boolean {\n return this._initialized\n }\n\n /**\n * Initialize the adapter by fetching the address\n * Must be called before using the signer\n */\n async initialize(): Promise<void> {\n if (this._initialized) {\n return\n }\n\n this._address = await this._account.getAddress()\n this._initialized = true\n }\n\n /**\n * Sign a message using the Bitcoin wallet\n * @param message - Message string to sign\n * @returns Signature string\n */\n async signMessage(message: string): Promise<string> {\n return this._account.signMessage(message)\n }\n\n /**\n * Sign a Partially Signed Bitcoin Transaction (PSBT)\n * @param psbt - PSBT bytes to sign\n * @returns Signed PSBT bytes\n */\n async signPsbt(psbt: Uint8Array): Promise<Uint8Array> {\n return this._account.signPsbt(psbt)\n }\n\n /**\n * Get the wallet balance in satoshis\n */\n async getBalance(): Promise<bigint> {\n return this._account.getBalance()\n }\n\n /**\n * Send a Bitcoin transaction\n * @param params - Transaction parameters\n * @returns Transaction hash\n */\n async sendTransaction(params: { to: string; amount: bigint; fee?: bigint }): Promise<string> {\n return this._account.sendTransaction(params)\n }\n}\n\n/**\n * Create an initialized WDK Bitcoin signer\n *\n * @param account - WDK Bitcoin account from @tetherto/wdk-wallet-btc\n * @returns Initialized WDKBtcSignerAdapter\n *\n * @example\n * ```typescript\n * import { T402WDK } from '@t402/wdk';\n *\n * const wallet = new T402WDK(seedPhrase, config);\n * const btcSigner = await wallet.getBtcSigner();\n *\n * // Use with T402 client\n * const client = createT402HTTPClient({\n * signers: [{ scheme: 'exact', network: 'bip122:000000000019d6689c085ae165831e93', signer: btcSigner }]\n * });\n * ```\n */\nexport async function createWDKBtcSigner(account: WDKBtcAccount): Promise<WDKBtcSignerAdapter> {\n const adapter = new WDKBtcSignerAdapter(account)\n await adapter.initialize()\n return adapter\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { W as WDKSolanaAccount } from '../types-
|
|
1
|
+
import { W as WDKSolanaAccount } from '../types-BwK8Xgvg.js';
|
|
2
2
|
import 'viem';
|
|
3
3
|
|
|
4
4
|
/**
|
|
@@ -6,6 +6,12 @@ import 'viem';
|
|
|
6
6
|
*
|
|
7
7
|
* Wraps a Tether WDK Solana account to implement T402's ClientSvmSigner interface.
|
|
8
8
|
* ClientSvmSigner is just TransactionSigner from @solana/kit.
|
|
9
|
+
*
|
|
10
|
+
* Includes support for:
|
|
11
|
+
* - Versioned transactions (v0) with address lookup tables
|
|
12
|
+
* - Priority fees via ComputeBudget program
|
|
13
|
+
* - Token-2022 program detection and transfer fee queries
|
|
14
|
+
* - Associated Token Account resolution
|
|
9
15
|
*/
|
|
10
16
|
|
|
11
17
|
/**
|
|
@@ -101,6 +107,144 @@ declare class WDKSvmSignerAdapter implements TransactionSigner {
|
|
|
101
107
|
amount: bigint;
|
|
102
108
|
}): Promise<string>;
|
|
103
109
|
}
|
|
110
|
+
/**
|
|
111
|
+
* Serialized instruction for building transactions
|
|
112
|
+
*/
|
|
113
|
+
interface SerializedInstruction {
|
|
114
|
+
programId: string;
|
|
115
|
+
keys: Array<{
|
|
116
|
+
pubkey: string;
|
|
117
|
+
isSigner: boolean;
|
|
118
|
+
isWritable: boolean;
|
|
119
|
+
}>;
|
|
120
|
+
data: Uint8Array;
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Parameters for building a versioned (v0) transaction
|
|
124
|
+
*/
|
|
125
|
+
interface BuildVersionedTransactionParams {
|
|
126
|
+
instructions: SerializedInstruction[];
|
|
127
|
+
addressLookupTableAccounts?: Array<{
|
|
128
|
+
key: string;
|
|
129
|
+
addresses: string[];
|
|
130
|
+
}>;
|
|
131
|
+
priorityFee?: {
|
|
132
|
+
microLamports: number;
|
|
133
|
+
computeUnits?: number;
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Parameters for a transfer with priority fee
|
|
138
|
+
*/
|
|
139
|
+
interface TransferWithPriorityFeeParams {
|
|
140
|
+
token: string;
|
|
141
|
+
recipient: string;
|
|
142
|
+
amount: bigint;
|
|
143
|
+
priorityFeeMicroLamports?: number;
|
|
144
|
+
createATA?: boolean;
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Result of querying recent priority fees
|
|
148
|
+
*/
|
|
149
|
+
interface PriorityFeeEstimate {
|
|
150
|
+
low: number;
|
|
151
|
+
medium: number;
|
|
152
|
+
high: number;
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* ATA resolution result
|
|
156
|
+
*/
|
|
157
|
+
interface ATAResolution {
|
|
158
|
+
address: string;
|
|
159
|
+
exists: boolean;
|
|
160
|
+
createInstruction?: SerializedInstruction;
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Token program type
|
|
164
|
+
*/
|
|
165
|
+
type TokenProgramType = 'Token' | 'Token-2022';
|
|
166
|
+
/**
|
|
167
|
+
* Transfer fee information for Token-2022 tokens
|
|
168
|
+
*/
|
|
169
|
+
interface TransferFeeInfo {
|
|
170
|
+
fee: bigint;
|
|
171
|
+
netAmount: bigint;
|
|
172
|
+
transferFeeBasisPoints: number;
|
|
173
|
+
maximumFee: bigint;
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Build a versioned (v0) transaction with optional priority fee.
|
|
177
|
+
*
|
|
178
|
+
* This constructs a v0 transaction message that supports address lookup tables
|
|
179
|
+
* for compact encoding and ComputeBudget instructions for priority fees.
|
|
180
|
+
*
|
|
181
|
+
* @param adapter - The initialized SVM signer adapter
|
|
182
|
+
* @param params - Transaction build parameters
|
|
183
|
+
* @returns Serialized v0 transaction message bytes
|
|
184
|
+
*/
|
|
185
|
+
declare function buildVersionedTransaction(adapter: WDKSvmSignerAdapter, params: BuildVersionedTransactionParams): Uint8Array;
|
|
186
|
+
/**
|
|
187
|
+
* Transfer SPL tokens with an attached priority fee.
|
|
188
|
+
*
|
|
189
|
+
* Wraps a standard SPL token transfer with ComputeBudget instructions
|
|
190
|
+
* to ensure timely inclusion during congested periods.
|
|
191
|
+
*
|
|
192
|
+
* @param adapter - The initialized SVM signer adapter
|
|
193
|
+
* @param params - Transfer parameters
|
|
194
|
+
* @returns Transaction signature
|
|
195
|
+
*/
|
|
196
|
+
declare function transferWithPriorityFee(adapter: WDKSvmSignerAdapter, params: TransferWithPriorityFeeParams): Promise<string>;
|
|
197
|
+
/**
|
|
198
|
+
* Get recommended priority fees from recent blocks.
|
|
199
|
+
*
|
|
200
|
+
* Returns low/medium/high estimates in micro-lamports per compute unit.
|
|
201
|
+
* Caller should use these as hints for `priorityFee.microLamports`.
|
|
202
|
+
*
|
|
203
|
+
* @param rpcUrl - Solana RPC endpoint URL
|
|
204
|
+
* @returns Priority fee estimates
|
|
205
|
+
*/
|
|
206
|
+
declare function getRecentPriorityFees(rpcUrl: string): Promise<PriorityFeeEstimate>;
|
|
207
|
+
/**
|
|
208
|
+
* Resolve the Associated Token Account (ATA) for an owner/mint pair.
|
|
209
|
+
*
|
|
210
|
+
* If the ATA does not exist, returns a creation instruction that can be
|
|
211
|
+
* prepended to the transaction.
|
|
212
|
+
*
|
|
213
|
+
* @param rpcUrl - Solana RPC endpoint URL
|
|
214
|
+
* @param owner - Owner public key (base58)
|
|
215
|
+
* @param mint - Token mint address (base58)
|
|
216
|
+
* @returns ATA resolution result
|
|
217
|
+
*/
|
|
218
|
+
declare function resolveATA(rpcUrl: string, owner: string, mint: string): Promise<ATAResolution>;
|
|
219
|
+
/**
|
|
220
|
+
* Determine whether a token mint uses the standard Token program or Token-2022.
|
|
221
|
+
*
|
|
222
|
+
* @param rpcUrl - Solana RPC endpoint URL
|
|
223
|
+
* @param mint - Token mint address (base58)
|
|
224
|
+
* @returns Token program type
|
|
225
|
+
*/
|
|
226
|
+
declare function getTokenProgram(rpcUrl: string, mint: string): Promise<TokenProgramType>;
|
|
227
|
+
/**
|
|
228
|
+
* Get the transfer fee for a Token-2022 mint.
|
|
229
|
+
*
|
|
230
|
+
* Queries the mint's transfer fee extension data. Returns zero fee
|
|
231
|
+
* if the mint is a standard Token program mint or has no transfer fee extension.
|
|
232
|
+
*
|
|
233
|
+
* @param rpcUrl - Solana RPC endpoint URL
|
|
234
|
+
* @param mint - Token mint address (base58)
|
|
235
|
+
* @param amount - Transfer amount in smallest units
|
|
236
|
+
* @returns Transfer fee info
|
|
237
|
+
*/
|
|
238
|
+
declare function getTransferFee(rpcUrl: string, mint: string, amount: bigint): Promise<TransferFeeInfo>;
|
|
239
|
+
/**
|
|
240
|
+
* Derive an Associated Token Account address deterministically.
|
|
241
|
+
* Uses the standard PDA derivation: [owner, TOKEN_PROGRAM_ID, mint] seeded
|
|
242
|
+
* under the Associated Token Program.
|
|
243
|
+
*
|
|
244
|
+
* This is a simplified derivation returning a deterministic string.
|
|
245
|
+
* For production use, integrate with @solana/kit's findProgramAddress.
|
|
246
|
+
*/
|
|
247
|
+
declare function deriveATAAddress(owner: string, mint: string): string;
|
|
104
248
|
/**
|
|
105
249
|
* Create an initialized WDK Solana signer
|
|
106
250
|
*
|
|
@@ -122,4 +266,4 @@ declare class WDKSvmSignerAdapter implements TransactionSigner {
|
|
|
122
266
|
*/
|
|
123
267
|
declare function createWDKSvmSigner(account: WDKSolanaAccount): Promise<WDKSvmSignerAdapter>;
|
|
124
268
|
|
|
125
|
-
export { type SolanaAddress, type TransactionSigner, WDKSvmSignerAdapter, createWDKSvmSigner };
|
|
269
|
+
export { type ATAResolution, type BuildVersionedTransactionParams, type PriorityFeeEstimate, type SerializedInstruction, type SolanaAddress, type TokenProgramType, type TransactionSigner, type TransferFeeInfo, type TransferWithPriorityFeeParams, WDKSvmSignerAdapter, buildVersionedTransaction, createWDKSvmSigner, deriveATAAddress, getRecentPriorityFees, getTokenProgram, getTransferFee, resolveATA, transferWithPriorityFee };
|