@stableops/wallet-sdk 0.1.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/LICENSE +184 -0
- package/README.md +148 -0
- package/README.zh-CN.md +133 -0
- package/dist/index.d.mts +131 -0
- package/dist/index.d.ts +131 -0
- package/dist/index.js +655 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +610 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +58 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import type {\n Connection,\n PublicKey,\n Transaction,\n TransactionInstruction,\n} from '@solana/web3.js'\n\n// @solana/web3.js 是可选 peer 依赖:仅 Solana 支付路径需要,懒加载以免\n// 只用 EVM/TRON 的使用者被迫安装,且缺失时抛出友好异常而非模块加载崩溃。\ntype SolanaWeb3 = typeof import('@solana/web3.js')\n\nlet solanaWeb3Promise: Promise<SolanaWeb3> | undefined\n\nasync function loadSolanaWeb3(): Promise<SolanaWeb3> {\n if (!solanaWeb3Promise) {\n solanaWeb3Promise = import('@solana/web3.js').catch((err) => {\n solanaWeb3Promise = undefined\n throw new StableOpsWalletError(\n 'Solana 支付需要可选依赖 @solana/web3.js,请先安装:npm install @solana/web3.js',\n 'solana_dependency_missing',\n { cause: err },\n )\n })\n }\n return solanaWeb3Promise\n}\n\nexport type ChainId =\n | 'ethereum'\n | 'base'\n | 'base-sepolia'\n | 'arbitrum'\n | 'polygon'\n | 'tron'\n | 'solana'\n | 'ethereum-sepolia'\n | 'arbitrum-sepolia'\n | 'polygon-amoy'\n | 'solana-devnet'\n | 'tron-nile'\n\nexport type Asset = 'USDC' | 'USDT'\n\ntype EvmWalletChainId = Exclude<ChainId, 'tron' | 'solana' | 'tron-nile' | 'solana-devnet'>\n\ntype WalletTokenContract = {\n chain: ChainId\n asset: Asset\n address: string\n decimals: number\n}\n\nconst WALLET_TOKEN_CONTRACTS: readonly WalletTokenContract[] = [\n {\n chain: 'ethereum',\n asset: 'USDC',\n address: '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48',\n decimals: 6,\n },\n {\n chain: 'ethereum',\n asset: 'USDT',\n address: '0xdac17f958d2ee523a2206206994597c13d831ec7',\n decimals: 6,\n },\n {\n chain: 'base',\n asset: 'USDC',\n address: '0x833589fcd6edb6e08f4c7c32d4f71b54bda02913',\n decimals: 6,\n },\n {\n chain: 'base-sepolia',\n asset: 'USDC',\n address: '0x036cbd53842c5426634e7929541ec2318f3dcf7e',\n decimals: 6,\n },\n {\n chain: 'arbitrum',\n asset: 'USDC',\n address: '0xaf88d065e77cc2239327c5edb3a432268e5831',\n decimals: 6,\n },\n {\n chain: 'polygon',\n asset: 'USDC',\n address: '0x3c499c542cef5e3811e1192ce70d8cc03d5c3359',\n decimals: 6,\n },\n {\n chain: 'tron',\n asset: 'USDT',\n address: 'TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t',\n decimals: 6,\n },\n {\n chain: 'solana',\n asset: 'USDC',\n address: 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v',\n decimals: 6,\n },\n {\n chain: 'solana',\n asset: 'USDT',\n address: 'Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB',\n decimals: 6,\n },\n {\n chain: 'ethereum-sepolia',\n asset: 'USDC',\n address: '0x1c7d4b196cb0c7b01d743fbc6116a902379c7238',\n decimals: 6,\n },\n {\n chain: 'arbitrum-sepolia',\n asset: 'USDC',\n address: '0x75faf114eafb1bdbe2f0316df893fd58ce46aa4d',\n decimals: 6,\n },\n {\n chain: 'polygon-amoy',\n asset: 'USDC',\n address: '0x41e94eb019c0762f9bfcf9fb1e58725bfb0e7582',\n decimals: 6,\n },\n {\n chain: 'solana-devnet',\n asset: 'USDC',\n address: '4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU',\n decimals: 6,\n },\n {\n chain: 'tron-nile',\n asset: 'USDT',\n address: 'TXYZopYRdj2D9XRtbG411XZZ3kM5VkAeBf',\n decimals: 6,\n },\n]\n\nconst EVM_WALLET_CHAINS = [\n 'ethereum',\n 'base',\n 'base-sepolia',\n 'arbitrum',\n 'polygon',\n 'ethereum-sepolia',\n 'arbitrum-sepolia',\n 'polygon-amoy',\n] as const\nconst TRON_WALLET_CHAINS = ['tron', 'tron-nile'] as const\nconst SOLANA_WALLET_CHAINS = ['solana', 'solana-devnet'] as const\nconst ERC20_TRANSFER_SELECTOR = 'a9059cbb'\nconst SOLANA_MAINNET_RPC_URL = 'https://api.mainnet-beta.solana.com'\nconst SOLANA_TOKEN_PROGRAM_ID_BASE58 = 'TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA'\nconst SOLANA_ASSOCIATED_TOKEN_PROGRAM_ID_BASE58 = 'ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL'\nconst SOLANA_TRANSFER_CHECKED_INSTRUCTION = 12\nconst SOLANA_CREATE_ASSOCIATED_TOKEN_ACCOUNT_IDEMPOTENT_INSTRUCTION = 1\n\nexport type Eip1193Provider = {\n request<T = unknown>(args: { method: string; params?: unknown[] | Record<string, unknown> }): Promise<T>\n}\n\nexport type TronWalletProvider =\n | TronWebLike\n | {\n tronWeb?: TronWebLike\n tronLink?: { request: <T = unknown>(args: { method: string; params?: unknown }) => Promise<T> }\n request?<T = unknown>(args: { method: string; params?: unknown }): Promise<T>\n }\n\nexport type SolanaWalletProvider = {\n publicKey?: SolanaPublicKeyLike | string | null\n connect?(): Promise<{ publicKey?: SolanaPublicKeyLike | string | null } | void>\n signAndSendTransaction?(transaction: Transaction): Promise<string | { signature?: string }>\n signTransaction?(transaction: Transaction): Promise<Transaction>\n}\n\nexport type WalletProvider = Eip1193Provider | TronWalletProvider | SolanaWalletProvider\n\ntype TronWebLike = {\n defaultAddress?: { base58?: string }\n transactionBuilder: {\n triggerSmartContract(\n contractAddress: string,\n functionSelector: string,\n options: Record<string, unknown>,\n parameters: Array<{ type: string; value: string | bigint }>,\n issuerAddress?: string,\n ): Promise<{ transaction?: unknown; result?: { result?: boolean; message?: string } }>\n }\n trx: {\n sign(transaction: unknown): Promise<unknown>\n sendRawTransaction(transaction: unknown): Promise<{ txid?: string; transaction?: { txID?: string }; result?: boolean }>\n }\n}\n\ntype SolanaPublicKeyLike = { toBase58(): string }\n\nexport type WalletPaymentInstruction = {\n chain: ChainId\n asset: Asset\n address: string\n}\n\nexport type WalletPaymentOrder = {\n amount: string\n paymentInstructions: WalletPaymentInstruction[]\n}\n\nexport type EvmWalletChainConfig = {\n chainId: EvmWalletChainId\n eip155ChainId: number\n chainName: string\n nativeCurrency: { name: string; symbol: string; decimals: number }\n rpcUrls: string[]\n blockExplorerUrls?: string[]\n}\n\nexport type SendWalletPaymentInput = {\n provider: WalletProvider\n instruction: WalletPaymentInstruction | null\n amount: string\n fromAddress?: string\n chainConfigs?: Partial<Record<EvmWalletChainId, EvmWalletChainConfig>>\n solanaRpcUrl?: string\n solanaConnection?: Pick<Connection, 'getLatestBlockhash' | 'sendRawTransaction'>\n}\n\nexport type WalletProviderByChain = Partial<Record<ChainId, WalletProvider | undefined>>\n\nexport type SendOrderWalletPaymentInput = Omit<SendWalletPaymentInput, 'provider' | 'instruction' | 'amount'> & {\n order: WalletPaymentOrder\n providers: WalletProviderByChain\n preferredChains?: ChainId[]\n}\n\nexport type SentWalletPayment = {\n txHash: string\n chain: ChainId\n asset: Asset\n fromAddress: string\n toAddress: string\n tokenContract: string\n amount: string\n amountUnits: string\n}\n\nexport class StableOpsWalletError extends Error {\n constructor(\n message: string,\n readonly code: string,\n readonly details?: unknown,\n ) {\n super(message)\n this.name = 'StableOpsWalletError'\n }\n}\n\nexport const EvmWalletChainConfigs: Readonly<Record<EvmWalletChainId, EvmWalletChainConfig>> = {\n ethereum: {\n chainId: 'ethereum',\n eip155ChainId: 1,\n chainName: 'Ethereum Mainnet',\n nativeCurrency: { name: 'Ether', symbol: 'ETH', decimals: 18 },\n rpcUrls: ['https://cloudflare-eth.com'],\n blockExplorerUrls: ['https://etherscan.io'],\n },\n base: {\n chainId: 'base',\n eip155ChainId: 8453,\n chainName: 'Base',\n nativeCurrency: { name: 'Ether', symbol: 'ETH', decimals: 18 },\n rpcUrls: ['https://mainnet.base.org'],\n blockExplorerUrls: ['https://basescan.org'],\n },\n 'base-sepolia': {\n chainId: 'base-sepolia',\n eip155ChainId: 84532,\n chainName: 'Base Sepolia',\n nativeCurrency: { name: 'Sepolia Ether', symbol: 'ETH', decimals: 18 },\n rpcUrls: ['https://sepolia.base.org'],\n blockExplorerUrls: ['https://sepolia.basescan.org'],\n },\n arbitrum: {\n chainId: 'arbitrum',\n eip155ChainId: 42161,\n chainName: 'Arbitrum One',\n nativeCurrency: { name: 'Ether', symbol: 'ETH', decimals: 18 },\n rpcUrls: ['https://arb1.arbitrum.io/rpc'],\n blockExplorerUrls: ['https://arbiscan.io'],\n },\n polygon: {\n chainId: 'polygon',\n eip155ChainId: 137,\n chainName: 'Polygon',\n nativeCurrency: { name: 'POL', symbol: 'POL', decimals: 18 },\n rpcUrls: ['https://polygon-rpc.com'],\n blockExplorerUrls: ['https://polygonscan.com'],\n },\n 'ethereum-sepolia': {\n chainId: 'ethereum-sepolia',\n eip155ChainId: 11155111,\n chainName: 'Sepolia',\n nativeCurrency: { name: 'Sepolia Ether', symbol: 'ETH', decimals: 18 },\n rpcUrls: ['https://ethereum-sepolia-rpc.publicnode.com'],\n blockExplorerUrls: ['https://sepolia.etherscan.io'],\n },\n 'arbitrum-sepolia': {\n chainId: 'arbitrum-sepolia',\n eip155ChainId: 421614,\n chainName: 'Arbitrum Sepolia',\n nativeCurrency: { name: 'Ether', symbol: 'ETH', decimals: 18 },\n rpcUrls: ['https://sepolia-rollup.arbitrum.io/rpc'],\n blockExplorerUrls: ['https://sepolia.arbiscan.io'],\n },\n 'polygon-amoy': {\n chainId: 'polygon-amoy',\n eip155ChainId: 80002,\n chainName: 'Polygon Amoy',\n nativeCurrency: { name: 'POL', symbol: 'POL', decimals: 18 },\n rpcUrls: ['https://rpc-amoy.polygon.technology'],\n blockExplorerUrls: ['https://amoy.polygonscan.com'],\n },\n}\n\nexport function getInjectedEthereumProvider(): Eip1193Provider | undefined {\n const maybeGlobal = globalThis as typeof globalThis & { ethereum?: Eip1193Provider }\n return maybeGlobal.ethereum\n}\n\nexport function getInjectedTronProvider(): TronWalletProvider | undefined {\n const maybeGlobal = globalThis as typeof globalThis & {\n tronLink?: { request: <T = unknown>(args: { method: string; params?: unknown }) => Promise<T> }\n tronWeb?: TronWebLike\n }\n if (!maybeGlobal.tronWeb) return undefined\n return { tronLink: maybeGlobal.tronLink, tronWeb: maybeGlobal.tronWeb }\n}\n\nexport function getInjectedSolanaProvider(): SolanaWalletProvider | undefined {\n const maybeGlobal = globalThis as typeof globalThis & {\n phantom?: { solana?: SolanaWalletProvider }\n solana?: SolanaWalletProvider\n }\n return maybeGlobal.phantom?.solana ?? maybeGlobal.solana\n}\n\nexport function getInjectedWalletProviders(): WalletProviderByChain {\n const providers: WalletProviderByChain = {}\n const evmProvider = getInjectedEthereumProvider()\n if (evmProvider) {\n for (const chain of EVM_WALLET_CHAINS) providers[chain] = evmProvider\n }\n const tronProvider = getInjectedTronProvider()\n if (tronProvider) {\n for (const chain of TRON_WALLET_CHAINS) providers[chain] = tronProvider\n }\n const solanaProvider = getInjectedSolanaProvider()\n if (solanaProvider) {\n for (const chain of SOLANA_WALLET_CHAINS) providers[chain] = solanaProvider\n }\n return providers\n}\n\nexport function selectWalletPaymentInstruction(\n instructions: readonly WalletPaymentInstruction[],\n providers: WalletProviderByChain,\n preferredChains: readonly ChainId[] = [],\n): { instruction: WalletPaymentInstruction; provider: WalletProvider } {\n if (instructions.length === 0) {\n throw new StableOpsWalletError('订单还没有可支付的链上收款指令', 'payment_instruction_not_found')\n }\n const preferred = preferredChains\n .map((chain) => instructions.find((instruction) => instruction.chain === chain))\n .filter((instruction): instruction is WalletPaymentInstruction => Boolean(instruction))\n const candidates = [...preferred, ...instructions.filter((instruction) => !preferred.includes(instruction))]\n for (const instruction of candidates) {\n const provider = providers[instruction.chain]\n if (provider) return { instruction, provider }\n }\n throw new StableOpsWalletError('未找到订单候选链对应的钱包 provider', 'wallet_provider_not_found', {\n chains: instructions.map((instruction) => instruction.chain),\n })\n}\n\nexport async function sendOrderWalletPayment(input: SendOrderWalletPaymentInput): Promise<SentWalletPayment> {\n const selected = selectWalletPaymentInstruction(\n input.order.paymentInstructions,\n input.providers,\n input.preferredChains,\n )\n return sendWalletPayment({\n ...input,\n provider: selected.provider,\n instruction: selected.instruction,\n amount: input.order.amount,\n })\n}\n\nexport async function sendWalletPayment(input: SendWalletPaymentInput): Promise<SentWalletPayment> {\n const instruction = requireInstruction(input.instruction)\n const token = findWalletTokenContract(instruction.chain, instruction.asset)\n if (!token) {\n throw new StableOpsWalletError('未找到该链与资产的默认代币合约', 'token_contract_not_found', {\n chain: instruction.chain,\n asset: instruction.asset,\n })\n }\n\n if (isEvmWalletChain(instruction.chain)) {\n return sendEvmWalletPayment(input, { ...instruction, chain: instruction.chain }, token)\n }\n if (isTronWalletChain(instruction.chain)) {\n return sendTronWalletPayment(input, instruction, token)\n }\n if (isSolanaWalletChain(instruction.chain)) {\n return sendSolanaWalletPayment(input, instruction, token)\n }\n throw new StableOpsWalletError('当前钱包 SDK 不支持该链', 'unsupported_chain', { chain: instruction.chain })\n}\n\nexport function encodeErc20Transfer(toAddress: string, amountUnits: bigint): string {\n const normalizedTo = normalizeEvmAddress(toAddress)\n if (amountUnits < 0n) {\n throw new StableOpsWalletError('转账金额不能为负数', 'invalid_amount', { amountUnits: amountUnits.toString() })\n }\n return `0x${ERC20_TRANSFER_SELECTOR}${padHex(normalizedTo.slice(2))}${padHex(amountUnits.toString(16))}`\n}\n\nexport function parseTokenAmount(amount: string, decimals: number): bigint {\n if (!Number.isInteger(decimals) || decimals < 0) {\n throw new StableOpsWalletError('代币精度配置无效', 'invalid_decimals', { decimals })\n }\n\n const trimmed = amount.trim()\n const match = /^(\\d+)(?:\\.(\\d+))?$/u.exec(trimmed)\n if (!match) {\n throw new StableOpsWalletError('转账金额格式无效', 'invalid_amount', { amount })\n }\n\n const whole = match[1]\n const fraction = match[2] ?? ''\n if (fraction.length > decimals) {\n throw new StableOpsWalletError('转账金额小数位超过代币精度', 'amount_precision_exceeded', {\n amount,\n decimals,\n })\n }\n\n const units = BigInt(whole) * 10n ** BigInt(decimals) + BigInt(fraction.padEnd(decimals, '0') || '0')\n if (units <= 0n) {\n throw new StableOpsWalletError('转账金额必须大于 0', 'invalid_amount', { amount })\n }\n return units\n}\n\nasync function sendEvmWalletPayment(\n input: SendWalletPaymentInput,\n instruction: WalletPaymentInstruction & { chain: EvmWalletChainId },\n token: WalletTokenContract,\n): Promise<SentWalletPayment> {\n const provider = input.provider as Eip1193Provider\n if (!isEip1193Provider(provider)) {\n throw new StableOpsWalletError('EVM 支付需要 EIP-1193 钱包 provider', 'wallet_provider_mismatch')\n }\n\n const config = resolveChainConfig(instruction.chain, input.chainConfigs)\n const fromAddress = normalizeEvmAddress(input.fromAddress ?? (await requestFirstEvmAccount(provider)))\n await ensureEvmChain(provider, config)\n\n const amountUnits = parseTokenAmount(input.amount, token.decimals)\n const txHash = await provider.request<string>({\n method: 'eth_sendTransaction',\n params: [\n {\n from: fromAddress,\n to: token.address,\n value: '0x0',\n data: encodeErc20Transfer(instruction.address, amountUnits),\n },\n ],\n })\n\n return buildSentPayment(txHash, instruction, token, fromAddress, input.amount, amountUnits)\n}\n\nasync function sendTronWalletPayment(\n input: SendWalletPaymentInput,\n instruction: WalletPaymentInstruction,\n token: WalletTokenContract,\n): Promise<SentWalletPayment> {\n const tronWeb = getTronWeb(input.provider)\n const accountRequester = getTronAccountRequester(input.provider)\n if (accountRequester) {\n await accountRequester({ method: 'tron_requestAccounts' })\n }\n\n const fromAddress = normalizeTronAddress(input.fromAddress ?? tronWeb.defaultAddress?.base58)\n const toAddress = normalizeTronAddress(instruction.address)\n const amountUnits = parseTokenAmount(input.amount, token.decimals)\n const built = await tronWeb.transactionBuilder.triggerSmartContract(\n token.address,\n 'transfer(address,uint256)',\n { feeLimit: 100_000_000 },\n [\n { type: 'address', value: toAddress },\n { type: 'uint256', value: amountUnits.toString() },\n ],\n fromAddress,\n )\n\n if (!built.transaction) {\n throw new StableOpsWalletError('TRON 钱包未能创建 TRC-20 转账交易', 'tron_transaction_build_failed', built)\n }\n\n const signed = await tronWeb.trx.sign(built.transaction)\n const sent = await tronWeb.trx.sendRawTransaction(signed)\n const txHash = sent.txid ?? sent.transaction?.txID ?? getTronSignedTransactionId(signed)\n if (!txHash) {\n throw new StableOpsWalletError('TRON 钱包未返回交易哈希', 'wallet_transaction_hash_not_found', sent)\n }\n\n return buildSentPayment(txHash, instruction, token, fromAddress, input.amount, amountUnits)\n}\n\nasync function sendSolanaWalletPayment(\n input: SendWalletPaymentInput,\n instruction: WalletPaymentInstruction,\n token: WalletTokenContract,\n): Promise<SentWalletPayment> {\n const web3 = await loadSolanaWeb3()\n const provider = input.provider as SolanaWalletProvider\n const payer = publicKeyFromString(web3, input.fromAddress ?? (await requestSolanaPublicKey(provider)))\n const recipient = publicKeyFromString(web3, instruction.address)\n const mint = publicKeyFromString(web3, token.address)\n const amountUnits = parseTokenAmount(input.amount, token.decimals)\n const connection = input.solanaConnection ?? new web3.Connection(input.solanaRpcUrl ?? SOLANA_MAINNET_RPC_URL, 'confirmed')\n const tokenProgramId = new web3.PublicKey(SOLANA_TOKEN_PROGRAM_ID_BASE58)\n const associatedTokenProgramId = new web3.PublicKey(SOLANA_ASSOCIATED_TOKEN_PROGRAM_ID_BASE58)\n const sourceTokenAccount = findAssociatedTokenAddress(web3, payer, mint, tokenProgramId, associatedTokenProgramId)\n const destinationTokenAccount = findAssociatedTokenAddress(web3, recipient, mint, tokenProgramId, associatedTokenProgramId)\n const latest = await connection.getLatestBlockhash()\n const transaction = new web3.Transaction({\n feePayer: payer,\n recentBlockhash: latest.blockhash,\n })\n\n transaction.add(\n createAssociatedTokenAccountIdempotentInstruction(\n web3,\n payer,\n destinationTokenAccount,\n recipient,\n mint,\n tokenProgramId,\n associatedTokenProgramId,\n ),\n )\n transaction.add(\n createSplTokenTransferCheckedInstruction(\n web3,\n sourceTokenAccount,\n mint,\n destinationTokenAccount,\n payer,\n amountUnits,\n token.decimals,\n tokenProgramId,\n ),\n )\n\n const txHash = await sendSolanaTransaction(provider, connection, transaction)\n return buildSentPayment(txHash, instruction, token, payer.toBase58(), input.amount, amountUnits)\n}\n\nfunction buildSentPayment(\n txHash: string,\n instruction: WalletPaymentInstruction,\n token: WalletTokenContract,\n fromAddress: string,\n amount: string,\n amountUnits: bigint,\n): SentWalletPayment {\n return {\n txHash,\n chain: instruction.chain,\n asset: instruction.asset,\n fromAddress,\n toAddress: instruction.address,\n tokenContract: token.address,\n amount,\n amountUnits: amountUnits.toString(),\n }\n}\n\nfunction isEvmWalletChain(chain: ChainId): chain is EvmWalletChainId {\n return (EVM_WALLET_CHAINS as readonly string[]).includes(chain)\n}\n\nfunction isTronWalletChain(chain: ChainId): boolean {\n return (TRON_WALLET_CHAINS as readonly string[]).includes(chain)\n}\n\nfunction isSolanaWalletChain(chain: ChainId): boolean {\n return (SOLANA_WALLET_CHAINS as readonly string[]).includes(chain)\n}\n\nfunction findWalletTokenContract(chain: ChainId, asset: Asset): WalletTokenContract | undefined {\n return WALLET_TOKEN_CONTRACTS.find((entry) => entry.chain === chain && entry.asset === asset)\n}\n\nfunction isEip1193Provider(provider: WalletProvider): provider is Eip1193Provider {\n return typeof (provider as Eip1193Provider).request === 'function'\n}\n\nasync function requestFirstEvmAccount(provider: Eip1193Provider): Promise<string> {\n const accounts = await provider.request<string[]>({ method: 'eth_requestAccounts' })\n const first = accounts[0]\n if (!first) {\n throw new StableOpsWalletError('钱包未返回可用账户', 'wallet_account_not_found')\n }\n return first\n}\n\nasync function ensureEvmChain(provider: Eip1193Provider, config: EvmWalletChainConfig): Promise<void> {\n try {\n await provider.request({\n method: 'wallet_switchEthereumChain',\n params: [{ chainId: toHexChainId(config.eip155ChainId) }],\n })\n } catch (err) {\n if (!isUnknownChainError(err)) throw err\n await provider.request({ method: 'wallet_addEthereumChain', params: [toWalletAddChainParams(config)] })\n await provider.request({\n method: 'wallet_switchEthereumChain',\n params: [{ chainId: toHexChainId(config.eip155ChainId) }],\n })\n }\n}\n\nfunction requireInstruction(instruction: WalletPaymentInstruction | null): WalletPaymentInstruction {\n if (!instruction) {\n throw new StableOpsWalletError('订单还没有可支付的链上收款指令', 'payment_instruction_not_found')\n }\n return instruction\n}\n\nfunction resolveChainConfig(\n chain: EvmWalletChainId,\n overrides: Partial<Record<EvmWalletChainId, EvmWalletChainConfig>> | undefined,\n): EvmWalletChainConfig {\n const config = overrides?.[chain] ?? EvmWalletChainConfigs[chain]\n if (!config) {\n throw new StableOpsWalletError('未找到钱包切链配置', 'chain_config_not_found', { chain })\n }\n return config\n}\n\nfunction toWalletAddChainParams(config: EvmWalletChainConfig) {\n return {\n chainId: toHexChainId(config.eip155ChainId),\n chainName: config.chainName,\n nativeCurrency: config.nativeCurrency,\n rpcUrls: config.rpcUrls,\n blockExplorerUrls: config.blockExplorerUrls,\n }\n}\n\nfunction toHexChainId(chainId: number): string {\n return `0x${chainId.toString(16)}`\n}\n\nfunction isUnknownChainError(err: unknown): boolean {\n if (typeof err !== 'object' || err === null) return false\n const code = Number((err as { code?: unknown }).code)\n if (code === 4902) return true\n const data = (err as { data?: unknown }).data\n if (typeof data !== 'object' || data === null) return false\n const originalError = (data as { originalError?: unknown }).originalError\n if (typeof originalError !== 'object' || originalError === null) return false\n return Number((originalError as { code?: unknown }).code) === 4902\n}\n\nfunction getTronWeb(provider: WalletProvider): TronWebLike {\n const tronWeb = (provider as { tronWeb?: TronWebLike }).tronWeb ?? (provider as TronWebLike)\n if (\n !tronWeb ||\n typeof tronWeb.transactionBuilder?.triggerSmartContract !== 'function' ||\n typeof tronWeb.trx?.sign !== 'function' ||\n typeof tronWeb.trx?.sendRawTransaction !== 'function'\n ) {\n throw new StableOpsWalletError('TRON 支付需要 TronLink / TronWeb 钱包 provider', 'wallet_provider_mismatch')\n }\n return tronWeb\n}\n\nfunction getTronAccountRequester(\n provider: WalletProvider,\n): ((args: { method: string; params?: unknown }) => Promise<unknown>) | undefined {\n const wrapper = provider as {\n tronLink?: { request: <T = unknown>(args: { method: string; params?: unknown }) => Promise<T> }\n request?<T = unknown>(args: { method: string; params?: unknown }): Promise<T>\n }\n return wrapper.tronLink?.request?.bind(wrapper.tronLink) ?? wrapper.request?.bind(wrapper)\n}\n\nfunction getTronSignedTransactionId(signed: unknown): string | undefined {\n if (typeof signed !== 'object' || signed === null) return undefined\n return (signed as { txID?: string }).txID\n}\n\nasync function requestSolanaPublicKey(provider: SolanaWalletProvider): Promise<string> {\n const existing = solanaPublicKeyToString(provider.publicKey)\n if (existing) return existing\n const connected = await provider.connect?.()\n const connectedKey = connected ? solanaPublicKeyToString(connected.publicKey) : undefined\n const providerKey = solanaPublicKeyToString(provider.publicKey)\n const publicKey = connectedKey ?? providerKey\n if (!publicKey) {\n throw new StableOpsWalletError('Solana 钱包未返回可用账户', 'wallet_account_not_found')\n }\n return publicKey\n}\n\nasync function sendSolanaTransaction(\n provider: SolanaWalletProvider,\n connection: Pick<Connection, 'sendRawTransaction'>,\n transaction: Transaction,\n): Promise<string> {\n if (typeof provider.signAndSendTransaction === 'function') {\n const result = await provider.signAndSendTransaction(transaction)\n const signature = typeof result === 'string' ? result : result.signature\n if (!signature) {\n throw new StableOpsWalletError('Solana 钱包未返回交易签名', 'wallet_transaction_hash_not_found', result)\n }\n return signature\n }\n\n if (typeof provider.signTransaction !== 'function') {\n throw new StableOpsWalletError('Solana 支付需要钱包支持 signAndSendTransaction 或 signTransaction', 'wallet_provider_mismatch')\n }\n const signed = await provider.signTransaction(transaction)\n return connection.sendRawTransaction(signed.serialize())\n}\n\nfunction solanaPublicKeyToString(publicKey: SolanaPublicKeyLike | string | null | undefined): string | undefined {\n if (!publicKey) return undefined\n if (typeof publicKey === 'string') return publicKey\n return publicKey.toBase58()\n}\n\nfunction publicKeyFromString(web3: SolanaWeb3, address: string): PublicKey {\n try {\n return new web3.PublicKey(address)\n } catch (err) {\n throw new StableOpsWalletError('Solana 地址格式无效', 'invalid_solana_address', { address, cause: err })\n }\n}\n\nfunction findAssociatedTokenAddress(\n web3: SolanaWeb3,\n owner: PublicKey,\n mint: PublicKey,\n tokenProgramId: PublicKey,\n associatedTokenProgramId: PublicKey,\n): PublicKey {\n return web3.PublicKey.findProgramAddressSync(\n [owner.toBuffer(), tokenProgramId.toBuffer(), mint.toBuffer()],\n associatedTokenProgramId,\n )[0]\n}\n\nfunction createAssociatedTokenAccountIdempotentInstruction(\n web3: SolanaWeb3,\n payer: PublicKey,\n associatedToken: PublicKey,\n owner: PublicKey,\n mint: PublicKey,\n tokenProgramId: PublicKey,\n associatedTokenProgramId: PublicKey,\n): TransactionInstruction {\n return new web3.TransactionInstruction({\n programId: associatedTokenProgramId,\n keys: [\n { pubkey: payer, isSigner: true, isWritable: true },\n { pubkey: associatedToken, isSigner: false, isWritable: true },\n { pubkey: owner, isSigner: false, isWritable: false },\n { pubkey: mint, isSigner: false, isWritable: false },\n { pubkey: web3.SystemProgram.programId, isSigner: false, isWritable: false },\n { pubkey: tokenProgramId, isSigner: false, isWritable: false },\n ],\n data: new Uint8Array([SOLANA_CREATE_ASSOCIATED_TOKEN_ACCOUNT_IDEMPOTENT_INSTRUCTION]) as unknown as Buffer,\n })\n}\n\nfunction createSplTokenTransferCheckedInstruction(\n web3: SolanaWeb3,\n source: PublicKey,\n mint: PublicKey,\n destination: PublicKey,\n owner: PublicKey,\n amountUnits: bigint,\n decimals: number,\n tokenProgramId: PublicKey,\n): TransactionInstruction {\n const data = new Uint8Array(10)\n data[0] = SOLANA_TRANSFER_CHECKED_INSTRUCTION\n writeBigUInt64LE(data, amountUnits, 1)\n data[9] = decimals\n return new web3.TransactionInstruction({\n programId: tokenProgramId,\n keys: [\n { pubkey: source, isSigner: false, isWritable: true },\n { pubkey: mint, isSigner: false, isWritable: false },\n { pubkey: destination, isSigner: false, isWritable: true },\n { pubkey: owner, isSigner: true, isWritable: false },\n ],\n data: data as unknown as Buffer,\n })\n}\n\nfunction writeBigUInt64LE(bytes: Uint8Array, value: bigint, offset: number): void {\n if (value > 0xffffffffffffffffn) {\n throw new StableOpsWalletError('转账金额超出 u64 范围', 'invalid_amount', { amountUnits: value.toString() })\n }\n let remaining = value\n for (let index = 0; index < 8; index++) {\n bytes[offset + index] = Number(remaining & 0xffn)\n remaining >>= 8n\n }\n}\n\nfunction normalizeEvmAddress(address: string): string {\n if (!/^0x[0-9a-fA-F]{40}$/u.test(address)) {\n throw new StableOpsWalletError('EVM 地址格式无效', 'invalid_evm_address', { address })\n }\n return address.toLowerCase()\n}\n\nfunction normalizeTronAddress(address: string | undefined): string {\n if (!address || !/^T[1-9A-HJ-NP-Za-km-z]{33}$/u.test(address)) {\n throw new StableOpsWalletError('TRON 地址格式无效', 'invalid_tron_address', { address })\n }\n return address\n}\n\nfunction padHex(hex: string): string {\n return hex.padStart(64, '0')\n}\n"],"mappings":"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","names":[]}
|