@ghostlytools/cli 1.2.0 → 1.2.1
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/README.md +11 -8
- package/SKILL.md +13 -5
- package/dist/assets/{arkade-3szZ1IpP.js → arkade-CtCpFaF7.js} +2 -2
- package/dist/assets/{arkade-3szZ1IpP.js.map → arkade-CtCpFaF7.js.map} +1 -1
- package/dist/assets/{hyperdhtRelay-DmTrpmba.js → hyperdhtRelay-C0XRWySP.js} +3 -3
- package/dist/assets/{hyperdhtRelay-DmTrpmba.js.map → hyperdhtRelay-C0XRWySP.js.map} +1 -1
- package/dist/assets/{mainline-BueFJx3f.js → mainline-DVYdrus6.js} +2 -2
- package/dist/assets/{mainline-BueFJx3f.js.map → mainline-DVYdrus6.js.map} +1 -1
- package/dist/assets/{server-BGXmSYx_.js → server-D5FBZYW8.js} +412 -74
- package/dist/assets/server-D5FBZYW8.js.map +1 -0
- package/dist/assets/{src-BMUcYQ7b.js → src-aKGjb_yz.js} +107 -22
- package/dist/assets/src-aKGjb_yz.js.map +1 -0
- package/dist/assets/{usdt-DklGBSeq.js → usdt-CUfucwZf.js} +2 -2
- package/dist/assets/{usdt-DklGBSeq.js.map → usdt-CUfucwZf.js.map} +1 -1
- package/dist/ghostly.mjs +478 -135
- package/dist/ghostly.mjs.map +1 -1
- package/package.json +1 -1
- package/dist/assets/server-BGXmSYx_.js.map +0 -1
- package/dist/assets/src-BMUcYQ7b.js.map +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { $n as engineError, $t as PaymentPreflightError, Zt as EVM_TEST_CHAINS, cn as validatePaymentTarget, en as SEPOLIA_TEST_USDT, nn as TEST_USDT_FAUCET_AMOUNT, rn as USDT_PUBLIC_RPC, tn as SEPOLIA_TEST_USDT_FAUCET } from "./src-
|
|
1
|
+
import { $n as engineError, $t as PaymentPreflightError, Zt as EVM_TEST_CHAINS, cn as validatePaymentTarget, en as SEPOLIA_TEST_USDT, nn as TEST_USDT_FAUCET_AMOUNT, rn as USDT_PUBLIC_RPC, tn as SEPOLIA_TEST_USDT_FAUCET } from "./src-aKGjb_yz.js";
|
|
2
2
|
import { F as sealSeed, I as unsealSeed, h as rpcHost, m as networkReason } from "../ghostly.mjs";
|
|
3
3
|
import { mnemonicToSeedSync } from "@scure/bip39";
|
|
4
4
|
import WalletManagerEvm from "@tetherto/wdk-wallet-evm";
|
|
@@ -407,4 +407,4 @@ var UsdtAdapter = class UsdtAdapter {
|
|
|
407
407
|
//#endregion
|
|
408
408
|
export { UsdtAdapter, wireProvider };
|
|
409
409
|
|
|
410
|
-
//# sourceMappingURL=usdt-
|
|
410
|
+
//# sourceMappingURL=usdt-CUfucwZf.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"usdt-DklGBSeq.js","names":[],"sources":["../../../browser/src/engine/paymentAdapters/usdt.ts"],"sourcesContent":["import { mnemonicToSeedSync } from '@scure/bip39';\nimport WalletManagerEvm, { type WalletAccountEvm } from '@tetherto/wdk-wallet-evm';\nimport { Interface, Transaction, getAddress, keccak256 } from 'ethers';\nimport { ETHEREUM_USDT, EVM_TEST_CHAINS, USDT_PUBLIC_RPC, SEPOLIA_TEST_USDT, SEPOLIA_TEST_USDT_FAUCET, TEST_USDT_FAUCET_AMOUNT, PaymentPreflightError, engineError, validatePaymentTarget, type PaymentAdapter, type PaymentExecution, type PaymentReview, type PaymentTarget } from '@ghostly/core';\nimport { sealSeed, unsealSeed, type EncryptedSeed } from './persistence';\nimport { networkReason, rpcHost } from './networkReason';\n\nexport interface UsdtConfig {\n network: 'ethereum' | 'sepolia' | 'evm-local';\n provider: string;\n chainId: 1 | 11155111 | 31337;\n token: string;\n decimals: number;\n codeHash: string;\n}\nexport interface UsdtPrepared {\n from: string; to: string; data: string; value: string; chainId: number; nonce: number;\n gasLimit: string; maxFeePerGas: string; maxPriorityFeePerGas: string;\n signed?: EncryptedSeed; hash?: string;\n}\nconst faucet = new Interface(['function mint(address token,address to,uint256 amount) returns (uint256)']);\nconst erc20 = new Interface(['function decimals() view returns(uint8)', 'function balanceOf(address) view returns(uint256)', 'function transfer(address,uint256) returns(bool)', 'event Transfer(address indexed from,address indexed to,uint256 value)']);\nconst same = (a: string, b: string) => a.toLowerCase() === b.toLowerCase();\nconst CONFIRMATIONS = 2;\n/** The JSON-RPC methods that only read: asked again once when they fail (see `UsdtAdapter.rpc`). */\nconst RETRIED_READS = new Set(['eth_chainId', 'eth_getCode', 'eth_call', 'eth_getBalance', 'eth_blockNumber', 'eth_getLogs', 'eth_getTransactionCount', 'eth_estimateGas', 'eth_getBlockByNumber', 'eth_maxPriorityFeePerGas', 'eth_gasPrice', 'eth_feeHistory', 'eth_getTransactionByHash', 'eth_getTransactionReceipt']);\nconst RETRY_AFTER_MS = 1000;\n/** Failures that would fail the same way again at once: not retried. */\nconst FINAL = new WeakSet<object>();\nconst timedOut = (error: unknown) => error instanceof Error && (error.name === 'AbortError' || error.name === 'TimeoutError');\n\n/**\n * The `provider` a request carries to the contact. Which RPC pays is the payer's own choice, so it names none of\n * this wallet's: a typed RPC URL may hold an API key (`/v3/<key>`), and every contact would read it. Older apps\n * require a URL here and pay only when it equals their own RPC, so it is the chain's public RPC (the default both\n * start with), and a local test chain's origin, without its path.\n */\nexport function wireProvider(config: Pick<UsdtConfig, 'network' | 'provider'>): string {\n return config.network === 'evm-local' ? new URL(config.provider).origin : USDT_PUBLIC_RPC[config.network];\n}\n\n/** WDK signs locally. Every network call uses the configured RPC, never a peer-supplied URL. */\nexport class UsdtAdapter implements PaymentAdapter<UsdtPrepared> {\n readonly method = 'usdt' as const;\n private manager?: WalletManagerEvm;\n private account?: WalletAccountEvm;\n private mnemonic = '';\n private nextId = 0;\n private queue: Promise<unknown> = Promise.resolve();\n private constructor(readonly config: UsdtConfig) {}\n\n static async inspect(config: Omit<UsdtConfig, 'decimals' | 'codeHash'>): Promise<UsdtConfig> {\n if (config.network === 'ethereum' ? config.chainId !== 1 || !same(config.token, ETHEREUM_USDT) : !(config.network in EVM_TEST_CHAINS) || config.chainId !== EVM_TEST_CHAINS[config.network]) throw new Error('Unsupported USDT network or contract');\n const token = getAddress(config.token);\n const url = new URL(config.provider);\n if (url.username || url.password || url.search || url.hash || (url.protocol !== 'https:' && !(url.protocol === 'http:' && ['localhost','127.0.0.1','[::1]'].includes(url.hostname)))) throw new Error('Use HTTPS or a loopback test RPC');\n const adapter = new UsdtAdapter({...config, token, decimals: 6, codeHash: ''});\n await adapter.chain();\n const code = await adapter.rpc<string>('eth_getCode', [token, 'latest']);\n if (code === '0x') throw new Error('No token contract exists on this chain');\n const result = await adapter.rpc<string>('eth_call', [{to: token, data: erc20.encodeFunctionData('decimals')}, 'latest']);\n const decimals = Number(erc20.decodeFunctionResult('decimals', result)[0]);\n if (!Number.isInteger(decimals) || decimals < 0 || decimals > 18 || (config.chainId === 1 && decimals !== 6)) throw new Error('Unexpected token decimals');\n return {...config, token, decimals, codeHash: keccak256(code)};\n }\n static async connect(config: UsdtConfig, mnemonic: string): Promise<UsdtAdapter> {\n const inspected = await UsdtAdapter.inspect(config);\n if (inspected.decimals !== config.decimals || inspected.codeHash !== config.codeHash) throw new Error('Token metadata changed; do not use this wallet configuration');\n const adapter = new UsdtAdapter(config);\n adapter.mnemonic = mnemonic;\n // Pass standard BIP-39 seed bytes: WDK's string helper assumes a Node Buffer global.\n const seed = mnemonicToSeedSync(mnemonic);\n try { adapter.manager = new WalletManagerEvm(seed, {provider: {request: ({method, params}) => adapter.rpc(method, params as unknown[] ?? [])}, chainId: config.chainId}); } finally { seed.fill(0); }\n adapter.account = await adapter.manager.getAccount(0);\n return adapter;\n }\n /**\n * A read that fails is asked again, once, a moment later: a public RPC drops a request now and then, and a chain that\n * just made a block can refuse a read of \"latest\" it no longer holds. Without it a network switch, a restore or New\n * gave up on the first such answer. Never a broadcast or anything else that writes, nor a request that did not answer\n * in time (the person would wait twice as long), nor one the server refused as such (4xx).\n */\n async rpc<T>(method: string, params: unknown[] = []): Promise<T> {\n try { return await this.ask<T>(method, params); }\n catch (error) {\n if (!RETRIED_READS.has(method) || FINAL.has(error as object)) throw error;\n await new Promise((resolve) => setTimeout(resolve, RETRY_AFTER_MS));\n return this.ask<T>(method, params);\n }\n }\n private async ask<T>(method: string, params: unknown[]): Promise<T> {\n let response: Response;\n // The browser's words for a request that got no answer (\"Fetch is aborted\") say nothing: the RPC's host does.\n try { response = await fetch(this.config.provider, {method:'POST', headers:{'Content-Type':'application/json'}, body:JSON.stringify({jsonrpc:'2.0',id:++this.nextId,method,params}), signal:AbortSignal.timeout(15000)}); }\n catch (error) {\n const reason = networkReason(error, rpcHost(this.config.provider));\n const thrown = reason ? Object.assign(new Error(reason), {cause: error}) : error;\n if (timedOut(error) && thrown && typeof thrown === 'object') FINAL.add(thrown);\n throw thrown;\n }\n if (!response.ok) { const error = engineError('usdtRpcUnavailable'); if (response.status !== 429 && response.status < 500) FINAL.add(error); throw error; }\n const result = await response.json();\n if (result.error || !Object.prototype.hasOwnProperty.call(result, 'result')) throw new Error('USDT RPC rejected the operation');\n return result.result as T;\n }\n private async chain() {\n if (BigInt(await this.rpc<string>('eth_chainId')) !== BigInt(this.config.chainId)) throw new Error('RPC chain does not match this wallet');\n }\n private async assertToken() {\n await this.chain();\n const code = await this.rpc<string>('eth_getCode', [this.config.token, 'latest']);\n if (code === '0x' || keccak256(code) !== this.config.codeHash) throw new Error('Token contract changed');\n }\n /**\n * Sepolia only: asks Aave's public faucet for test USDT, to this wallet, paid with its own test ETH.\n * Everything is fixed here (chain, contract, token, amount, recipient): nothing comes from outside.\n */\n mintTestTokens(): Promise<string> { return this.serial(async () => {\n if (this.config.chainId !== EVM_TEST_CHAINS.sepolia || !same(this.config.token, SEPOLIA_TEST_USDT)) throw new Error('Test USDT comes from a faucet on Sepolia only');\n await this.chain();\n const account = this.current(), from = await account.getAddress();\n const data = faucet.encodeFunctionData('mint', [SEPOLIA_TEST_USDT, from, BigInt(TEST_USDT_FAUCET_AMOUNT)]);\n const nonce = Number(BigInt(await this.rpc<string>('eth_getTransactionCount', [from, 'pending'])));\n const estimate = BigInt(await this.rpc<string>('eth_estimateGas', [{ from, to: SEPOLIA_TEST_USDT_FAUCET, data, value: '0x0' }]));\n const block = await this.rpc<{ baseFeePerGas?: string }>('eth_getBlockByNumber', ['latest', false]);\n if (!block.baseFeePerGas) throw new Error('This wallet requires an EIP-1559 chain');\n const priority = BigInt(await this.rpc<string>('eth_maxPriorityFeePerGas'));\n const maxFeePerGas = BigInt(block.baseFeePerGas) * 2n + priority, gasLimit = (estimate * 120n + 99n) / 100n;\n if (BigInt((await this.balances()).gasBalance) < gasLimit * maxFeePerGas) throw engineError('usdtNeedsSepoliaGas');\n const raw = await account.signTransaction({ type: 2, to: SEPOLIA_TEST_USDT_FAUCET, data, value: 0n, chainId: this.config.chainId, nonce, gasLimit, maxFeePerGas, maxPriorityFeePerGas: priority });\n await account.sendTransaction(raw);\n return Transaction.from(raw).hash!;\n }); }\n private current(): WalletAccountEvm { if (!this.account) throw new Error('Unlock the USDT wallet first'); return this.account; }\n address() { return this.current().getAddress(); }\n async balances() {\n await this.assertToken();\n const address = await this.address();\n const [token, gas] = await Promise.all([this.rpc<string>('eth_call',[{to:this.config.token,data:erc20.encodeFunctionData('balanceOf',[address])},'latest']),this.rpc<string>('eth_getBalance',[address,'pending'])]);\n return {balance:erc20.decodeFunctionResult('balanceOf',token)[0].toString(),gasBalance:BigInt(gas).toString()};\n }\n async target(): Promise<PaymentTarget> {\n const now = Date.now();\n return {method:'usdt',network:this.config.network,provider:wireProvider(this.config),asset:this.config.chainId === 1 ? 'USDT':'TEST-USDT',unit:'token-base',address:await this.address(),chainId:this.config.chainId,token:this.config.token,decimals:this.config.decimals,issuedAt:now,expiresAt:now+15*60*1000};\n }\n /** The request is for this wallet's token on its chain. Its `provider` is not compared: this wallet's own RPC pays. */\n private matches(target: PaymentTarget) {\n validatePaymentTarget(target);\n if (target.method !== 'usdt' || target.network !== this.config.network || target.chainId !== this.config.chainId || !same(target.token!,this.config.token) || target.decimals !== this.config.decimals) throw new Error('Request does not match the configured token and network');\n }\n prepare(target: PaymentTarget, amount: number, feeCap: number) { return this.serial(async () => {\n this.matches(target);\n await this.assertToken();\n const from = await this.address(), to = this.config.token;\n if (same(target.address, from) || same(target.address, to)) throw new Error('Choose a different recipient address');\n const {balance,gasBalance} = await this.balances();\n if (BigInt(balance) < BigInt(amount)) throw engineError('usdtNotEnoughTokens');\n const data = erc20.encodeFunctionData('transfer', [getAddress(target.address),BigInt(amount)]);\n const nonce = Number(BigInt(await this.rpc<string>('eth_getTransactionCount',[from,'pending'])));\n if (!Number.isSafeInteger(nonce)) throw new Error('Invalid account nonce');\n const estimate = BigInt(await this.rpc<string>('eth_estimateGas',[{from,to,data,value:'0x0'}]));\n const block = await this.rpc<{baseFeePerGas?:string}>('eth_getBlockByNumber',['latest',false]);\n if (!block.baseFeePerGas) throw new Error('This wallet requires an EIP-1559 chain');\n const priority = BigInt(await this.rpc<string>('eth_maxPriorityFeePerGas'));\n const maxFee = BigInt(block.baseFeePerGas)*2n + priority;\n const gasLimit = (estimate*120n+99n)/100n;\n const maximum = gasLimit*maxFee;\n if (maximum > BigInt(feeCap) || maximum > BigInt(Number.MAX_SAFE_INTEGER)) throw engineError('usdtGasAboveLimit');\n if (BigInt(gasBalance) < maximum) throw engineError('usdtNotEnoughGas');\n const prepared:UsdtPrepared = {from,to,data,value:'0',chainId:this.config.chainId,nonce,gasLimit:gasLimit.toString(),maxFeePerGas:maxFee.toString(),maxPriorityFeePerGas:priority.toString()};\n return {fee:Number(maximum),prepared,evm:{from,nonce,gasLimit:prepared.gasLimit,maxFeePerGas:prepared.maxFeePerGas,maxPriorityFeePerGas:prepared.maxPriorityFeePerGas,confirmations:CONFIRMATIONS}};\n }); }\n private verifyPrepared(review: PaymentReview, tx: UsdtPrepared) {\n if (tx.chainId !== this.config.chainId || !same(tx.to,this.config.token) || tx.value !== '0' || tx.data !== erc20.encodeFunctionData('transfer',[getAddress(review.address),BigInt(review.amount)]) || BigInt(tx.gasLimit)*BigInt(tx.maxFeePerGas) !== BigInt(review.fee) || review.fee > review.feeCap || tx.nonce !== review.evm?.nonce || !same(tx.from,review.evm?.from ?? '')) throw new Error('Transaction no longer matches the approved review');\n }\n private verifySigned(raw: string, saved: UsdtPrepared) {\n const tx = Transaction.from(raw);\n if (!tx.hash || !tx.from || !same(tx.from,saved.from) || tx.chainId !== BigInt(saved.chainId) || !tx.to || !same(tx.to,saved.to) || tx.data !== saved.data || tx.value !== 0n || tx.nonce !== saved.nonce || tx.gasLimit !== BigInt(saved.gasLimit) || tx.maxFeePerGas !== BigInt(saved.maxFeePerGas) || tx.maxPriorityFeePerGas !== BigInt(saved.maxPriorityFeePerGas)) throw new Error('Signature does not match the approved transaction');\n return tx.hash;\n }\n execute(review: PaymentReview, prepared: UsdtPrepared, persist?:()=>Promise<void>) { return this.serial(async () => {\n let account:WalletAccountEvm;\n try {\n this.matches(review); this.verifyPrepared(review,prepared);\n await this.assertToken(); account=this.current();\n if (!same(await account.getAddress(),prepared.from)) throw new Error('Wrong wallet');\n const nonce = Number(BigInt(await this.rpc<string>('eth_getTransactionCount',[prepared.from,'pending'])));\n if (nonce !== prepared.nonce) throw new Error('Account nonce changed. Create a new review');\n const balances = await this.balances();\n if (BigInt(balances.balance)<BigInt(review.amount) || BigInt(balances.gasBalance)<BigInt(review.fee)) throw new Error('Token or gas balance changed. Create a new review');\n if (!persist) throw new Error('Durable payment journal required');\n } catch (error) { throw new PaymentPreflightError(error instanceof Error ? error.message : 'Could not validate payment'); }\n const raw = await account.signTransaction({type:2,to:prepared.to,data:prepared.data,value:0n,chainId:prepared.chainId,nonce:prepared.nonce,gasLimit:BigInt(prepared.gasLimit),maxFeePerGas:BigInt(prepared.maxFeePerGas),maxPriorityFeePerGas:BigInt(prepared.maxPriorityFeePerGas)});\n prepared.hash = this.verifySigned(raw,prepared);\n prepared.signed = await sealSeed(raw,this.mnemonic);\n await persist!(); // Nothing may broadcast before the encrypted bytes are durable.\n await account.sendTransaction(raw);\n return this.receipt(prepared.hash,review,prepared.from);\n }); }\n reconcile(review: PaymentReview, prepared: UsdtPrepared) { return this.serial(async () => {\n await this.assertToken(); this.verifyPrepared(review,prepared);\n if (!prepared.signed || !prepared.hash) return {settled:false,failed:true,error:'No signed transaction was submitted. Create a new review.'};\n const result = await this.receipt(prepared.hash,review,prepared.from);\n if (result.settled || result.failed || result.pending) return result;\n // An uncertain network response permits only replay of exactly the saved bytes.\n const nonce = Number(BigInt(await this.rpc<string>('eth_getTransactionCount',[prepared.from,'pending'])));\n if (nonce > prepared.nonce) return result;\n const raw = await unsealSeed(prepared.signed,this.mnemonic);\n if (this.verifySigned(raw,prepared) !== prepared.hash || !same(await this.address(),prepared.from)) throw new Error('Recovery wallet mismatch');\n await this.current().sendTransaction(raw);\n return this.receipt(prepared.hash,review,prepared.from);\n }); }\n async receipt(hash: string, target: PaymentTarget & {amount:number}, expectedFrom?:string): Promise<PaymentExecution> {\n if (!/^0x[0-9a-fA-F]{64}$/.test(hash) || target.chainId !== this.config.chainId || !same(target.token ?? '',this.config.token) || target.decimals !== this.config.decimals) throw new Error('Invalid receipt target');\n await this.assertToken();\n const tx = await this.rpc<{from:string;to:string;input:string;value:string;nonce:string}|null>('eth_getTransactionByHash',[hash]);\n if (!tx) return {txid:hash,settled:false};\n if (!same(tx.to,this.config.token) || (expectedFrom && !same(tx.from,expectedFrom)) || BigInt(tx.value)!==0n || tx.input !== erc20.encodeFunctionData('transfer',[getAddress(target.address),BigInt(target.amount)])) throw new Error('Transaction is not the requested token transfer');\n const receipt = await this.rpc<{status:string;blockNumber:string;blockHash:string;logs:Array<{address:string;topics:string[];data:string}>}|null>('eth_getTransactionReceipt',[hash]);\n if (!receipt) return {txid:hash,settled:false,pending:true};\n const block = await this.rpc<{hash:string;timestamp:string}>('eth_getBlockByNumber',[receipt.blockNumber,false]);\n if (!block || block.hash !== receipt.blockHash || BigInt(block.timestamp)*1000n < BigInt((target.issuedAt ?? 0)-1000)) return {txid:hash,settled:false};\n const height = BigInt(await this.rpc<string>('eth_blockNumber'));\n if (height-BigInt(receipt.blockNumber)+1n < BigInt(CONFIRMATIONS)) return {txid:hash,settled:false,pending:true};\n if (BigInt(receipt.status)!==1n) return {txid:hash,settled:false,failed:true,error:'Transaction reverted. Tokens were not sent; gas was spent.'};\n const transfer = receipt.logs.some(log=>{\n if (!same(log.address,this.config.token)) return false;\n try {const event=erc20.parseLog(log);return event?.name==='Transfer' && same(event.args[0],tx.from) && same(event.args[1],target.address) && event.args[2]===BigInt(target.amount);} catch {return false;}\n });\n if (!transfer) throw new Error('Receipt has no matching token Transfer');\n return {txid:hash,settled:true};\n }\n async dispose() { await this.queue.catch(()=>{}); this.account=undefined;this.manager?.dispose();this.manager=undefined;this.mnemonic=''; }\n private serial<T>(work:()=>Promise<T>):Promise<T> { const operation=this.queue.then(work,work);this.queue=operation.catch(()=>{});return operation; }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"usdt-CUfucwZf.js","names":[],"sources":["../../../browser/src/engine/paymentAdapters/usdt.ts"],"sourcesContent":["import { mnemonicToSeedSync } from '@scure/bip39';\nimport WalletManagerEvm, { type WalletAccountEvm } from '@tetherto/wdk-wallet-evm';\nimport { Interface, Transaction, getAddress, keccak256 } from 'ethers';\nimport { ETHEREUM_USDT, EVM_TEST_CHAINS, USDT_PUBLIC_RPC, SEPOLIA_TEST_USDT, SEPOLIA_TEST_USDT_FAUCET, TEST_USDT_FAUCET_AMOUNT, PaymentPreflightError, engineError, validatePaymentTarget, type PaymentAdapter, type PaymentExecution, type PaymentReview, type PaymentTarget } from '@ghostly/core';\nimport { sealSeed, unsealSeed, type EncryptedSeed } from './persistence';\nimport { networkReason, rpcHost } from './networkReason';\n\nexport interface UsdtConfig {\n network: 'ethereum' | 'sepolia' | 'evm-local';\n provider: string;\n chainId: 1 | 11155111 | 31337;\n token: string;\n decimals: number;\n codeHash: string;\n}\nexport interface UsdtPrepared {\n from: string; to: string; data: string; value: string; chainId: number; nonce: number;\n gasLimit: string; maxFeePerGas: string; maxPriorityFeePerGas: string;\n signed?: EncryptedSeed; hash?: string;\n}\nconst faucet = new Interface(['function mint(address token,address to,uint256 amount) returns (uint256)']);\nconst erc20 = new Interface(['function decimals() view returns(uint8)', 'function balanceOf(address) view returns(uint256)', 'function transfer(address,uint256) returns(bool)', 'event Transfer(address indexed from,address indexed to,uint256 value)']);\nconst same = (a: string, b: string) => a.toLowerCase() === b.toLowerCase();\nconst CONFIRMATIONS = 2;\n/** The JSON-RPC methods that only read: asked again once when they fail (see `UsdtAdapter.rpc`). */\nconst RETRIED_READS = new Set(['eth_chainId', 'eth_getCode', 'eth_call', 'eth_getBalance', 'eth_blockNumber', 'eth_getLogs', 'eth_getTransactionCount', 'eth_estimateGas', 'eth_getBlockByNumber', 'eth_maxPriorityFeePerGas', 'eth_gasPrice', 'eth_feeHistory', 'eth_getTransactionByHash', 'eth_getTransactionReceipt']);\nconst RETRY_AFTER_MS = 1000;\n/** Failures that would fail the same way again at once: not retried. */\nconst FINAL = new WeakSet<object>();\nconst timedOut = (error: unknown) => error instanceof Error && (error.name === 'AbortError' || error.name === 'TimeoutError');\n\n/**\n * The `provider` a request carries to the contact. Which RPC pays is the payer's own choice, so it names none of\n * this wallet's: a typed RPC URL may hold an API key (`/v3/<key>`), and every contact would read it. Older apps\n * require a URL here and pay only when it equals their own RPC, so it is the chain's public RPC (the default both\n * start with), and a local test chain's origin, without its path.\n */\nexport function wireProvider(config: Pick<UsdtConfig, 'network' | 'provider'>): string {\n return config.network === 'evm-local' ? new URL(config.provider).origin : USDT_PUBLIC_RPC[config.network];\n}\n\n/** WDK signs locally. Every network call uses the configured RPC, never a peer-supplied URL. */\nexport class UsdtAdapter implements PaymentAdapter<UsdtPrepared> {\n readonly method = 'usdt' as const;\n private manager?: WalletManagerEvm;\n private account?: WalletAccountEvm;\n private mnemonic = '';\n private nextId = 0;\n private queue: Promise<unknown> = Promise.resolve();\n private constructor(readonly config: UsdtConfig) {}\n\n static async inspect(config: Omit<UsdtConfig, 'decimals' | 'codeHash'>): Promise<UsdtConfig> {\n if (config.network === 'ethereum' ? config.chainId !== 1 || !same(config.token, ETHEREUM_USDT) : !(config.network in EVM_TEST_CHAINS) || config.chainId !== EVM_TEST_CHAINS[config.network]) throw new Error('Unsupported USDT network or contract');\n const token = getAddress(config.token);\n const url = new URL(config.provider);\n if (url.username || url.password || url.search || url.hash || (url.protocol !== 'https:' && !(url.protocol === 'http:' && ['localhost','127.0.0.1','[::1]'].includes(url.hostname)))) throw new Error('Use HTTPS or a loopback test RPC');\n const adapter = new UsdtAdapter({...config, token, decimals: 6, codeHash: ''});\n await adapter.chain();\n const code = await adapter.rpc<string>('eth_getCode', [token, 'latest']);\n if (code === '0x') throw new Error('No token contract exists on this chain');\n const result = await adapter.rpc<string>('eth_call', [{to: token, data: erc20.encodeFunctionData('decimals')}, 'latest']);\n const decimals = Number(erc20.decodeFunctionResult('decimals', result)[0]);\n if (!Number.isInteger(decimals) || decimals < 0 || decimals > 18 || (config.chainId === 1 && decimals !== 6)) throw new Error('Unexpected token decimals');\n return {...config, token, decimals, codeHash: keccak256(code)};\n }\n static async connect(config: UsdtConfig, mnemonic: string): Promise<UsdtAdapter> {\n const inspected = await UsdtAdapter.inspect(config);\n if (inspected.decimals !== config.decimals || inspected.codeHash !== config.codeHash) throw new Error('Token metadata changed; do not use this wallet configuration');\n const adapter = new UsdtAdapter(config);\n adapter.mnemonic = mnemonic;\n // Pass standard BIP-39 seed bytes: WDK's string helper assumes a Node Buffer global.\n const seed = mnemonicToSeedSync(mnemonic);\n try { adapter.manager = new WalletManagerEvm(seed, {provider: {request: ({method, params}) => adapter.rpc(method, params as unknown[] ?? [])}, chainId: config.chainId}); } finally { seed.fill(0); }\n adapter.account = await adapter.manager.getAccount(0);\n return adapter;\n }\n /**\n * A read that fails is asked again, once, a moment later: a public RPC drops a request now and then, and a chain that\n * just made a block can refuse a read of \"latest\" it no longer holds. Without it a network switch, a restore or New\n * gave up on the first such answer. Never a broadcast or anything else that writes, nor a request that did not answer\n * in time (the person would wait twice as long), nor one the server refused as such (4xx).\n */\n async rpc<T>(method: string, params: unknown[] = []): Promise<T> {\n try { return await this.ask<T>(method, params); }\n catch (error) {\n if (!RETRIED_READS.has(method) || FINAL.has(error as object)) throw error;\n await new Promise((resolve) => setTimeout(resolve, RETRY_AFTER_MS));\n return this.ask<T>(method, params);\n }\n }\n private async ask<T>(method: string, params: unknown[]): Promise<T> {\n let response: Response;\n // The browser's words for a request that got no answer (\"Fetch is aborted\") say nothing: the RPC's host does.\n try { response = await fetch(this.config.provider, {method:'POST', headers:{'Content-Type':'application/json'}, body:JSON.stringify({jsonrpc:'2.0',id:++this.nextId,method,params}), signal:AbortSignal.timeout(15000)}); }\n catch (error) {\n const reason = networkReason(error, rpcHost(this.config.provider));\n const thrown = reason ? Object.assign(new Error(reason), {cause: error}) : error;\n if (timedOut(error) && thrown && typeof thrown === 'object') FINAL.add(thrown);\n throw thrown;\n }\n if (!response.ok) { const error = engineError('usdtRpcUnavailable'); if (response.status !== 429 && response.status < 500) FINAL.add(error); throw error; }\n const result = await response.json();\n if (result.error || !Object.prototype.hasOwnProperty.call(result, 'result')) throw new Error('USDT RPC rejected the operation');\n return result.result as T;\n }\n private async chain() {\n if (BigInt(await this.rpc<string>('eth_chainId')) !== BigInt(this.config.chainId)) throw new Error('RPC chain does not match this wallet');\n }\n private async assertToken() {\n await this.chain();\n const code = await this.rpc<string>('eth_getCode', [this.config.token, 'latest']);\n if (code === '0x' || keccak256(code) !== this.config.codeHash) throw new Error('Token contract changed');\n }\n /**\n * Sepolia only: asks Aave's public faucet for test USDT, to this wallet, paid with its own test ETH.\n * Everything is fixed here (chain, contract, token, amount, recipient): nothing comes from outside.\n */\n mintTestTokens(): Promise<string> { return this.serial(async () => {\n if (this.config.chainId !== EVM_TEST_CHAINS.sepolia || !same(this.config.token, SEPOLIA_TEST_USDT)) throw new Error('Test USDT comes from a faucet on Sepolia only');\n await this.chain();\n const account = this.current(), from = await account.getAddress();\n const data = faucet.encodeFunctionData('mint', [SEPOLIA_TEST_USDT, from, BigInt(TEST_USDT_FAUCET_AMOUNT)]);\n const nonce = Number(BigInt(await this.rpc<string>('eth_getTransactionCount', [from, 'pending'])));\n const estimate = BigInt(await this.rpc<string>('eth_estimateGas', [{ from, to: SEPOLIA_TEST_USDT_FAUCET, data, value: '0x0' }]));\n const block = await this.rpc<{ baseFeePerGas?: string }>('eth_getBlockByNumber', ['latest', false]);\n if (!block.baseFeePerGas) throw new Error('This wallet requires an EIP-1559 chain');\n const priority = BigInt(await this.rpc<string>('eth_maxPriorityFeePerGas'));\n const maxFeePerGas = BigInt(block.baseFeePerGas) * 2n + priority, gasLimit = (estimate * 120n + 99n) / 100n;\n if (BigInt((await this.balances()).gasBalance) < gasLimit * maxFeePerGas) throw engineError('usdtNeedsSepoliaGas');\n const raw = await account.signTransaction({ type: 2, to: SEPOLIA_TEST_USDT_FAUCET, data, value: 0n, chainId: this.config.chainId, nonce, gasLimit, maxFeePerGas, maxPriorityFeePerGas: priority });\n await account.sendTransaction(raw);\n return Transaction.from(raw).hash!;\n }); }\n private current(): WalletAccountEvm { if (!this.account) throw new Error('Unlock the USDT wallet first'); return this.account; }\n address() { return this.current().getAddress(); }\n async balances() {\n await this.assertToken();\n const address = await this.address();\n const [token, gas] = await Promise.all([this.rpc<string>('eth_call',[{to:this.config.token,data:erc20.encodeFunctionData('balanceOf',[address])},'latest']),this.rpc<string>('eth_getBalance',[address,'pending'])]);\n return {balance:erc20.decodeFunctionResult('balanceOf',token)[0].toString(),gasBalance:BigInt(gas).toString()};\n }\n async target(): Promise<PaymentTarget> {\n const now = Date.now();\n return {method:'usdt',network:this.config.network,provider:wireProvider(this.config),asset:this.config.chainId === 1 ? 'USDT':'TEST-USDT',unit:'token-base',address:await this.address(),chainId:this.config.chainId,token:this.config.token,decimals:this.config.decimals,issuedAt:now,expiresAt:now+15*60*1000};\n }\n /** The request is for this wallet's token on its chain. Its `provider` is not compared: this wallet's own RPC pays. */\n private matches(target: PaymentTarget) {\n validatePaymentTarget(target);\n if (target.method !== 'usdt' || target.network !== this.config.network || target.chainId !== this.config.chainId || !same(target.token!,this.config.token) || target.decimals !== this.config.decimals) throw new Error('Request does not match the configured token and network');\n }\n prepare(target: PaymentTarget, amount: number, feeCap: number) { return this.serial(async () => {\n this.matches(target);\n await this.assertToken();\n const from = await this.address(), to = this.config.token;\n if (same(target.address, from) || same(target.address, to)) throw new Error('Choose a different recipient address');\n const {balance,gasBalance} = await this.balances();\n if (BigInt(balance) < BigInt(amount)) throw engineError('usdtNotEnoughTokens');\n const data = erc20.encodeFunctionData('transfer', [getAddress(target.address),BigInt(amount)]);\n const nonce = Number(BigInt(await this.rpc<string>('eth_getTransactionCount',[from,'pending'])));\n if (!Number.isSafeInteger(nonce)) throw new Error('Invalid account nonce');\n const estimate = BigInt(await this.rpc<string>('eth_estimateGas',[{from,to,data,value:'0x0'}]));\n const block = await this.rpc<{baseFeePerGas?:string}>('eth_getBlockByNumber',['latest',false]);\n if (!block.baseFeePerGas) throw new Error('This wallet requires an EIP-1559 chain');\n const priority = BigInt(await this.rpc<string>('eth_maxPriorityFeePerGas'));\n const maxFee = BigInt(block.baseFeePerGas)*2n + priority;\n const gasLimit = (estimate*120n+99n)/100n;\n const maximum = gasLimit*maxFee;\n if (maximum > BigInt(feeCap) || maximum > BigInt(Number.MAX_SAFE_INTEGER)) throw engineError('usdtGasAboveLimit');\n if (BigInt(gasBalance) < maximum) throw engineError('usdtNotEnoughGas');\n const prepared:UsdtPrepared = {from,to,data,value:'0',chainId:this.config.chainId,nonce,gasLimit:gasLimit.toString(),maxFeePerGas:maxFee.toString(),maxPriorityFeePerGas:priority.toString()};\n return {fee:Number(maximum),prepared,evm:{from,nonce,gasLimit:prepared.gasLimit,maxFeePerGas:prepared.maxFeePerGas,maxPriorityFeePerGas:prepared.maxPriorityFeePerGas,confirmations:CONFIRMATIONS}};\n }); }\n private verifyPrepared(review: PaymentReview, tx: UsdtPrepared) {\n if (tx.chainId !== this.config.chainId || !same(tx.to,this.config.token) || tx.value !== '0' || tx.data !== erc20.encodeFunctionData('transfer',[getAddress(review.address),BigInt(review.amount)]) || BigInt(tx.gasLimit)*BigInt(tx.maxFeePerGas) !== BigInt(review.fee) || review.fee > review.feeCap || tx.nonce !== review.evm?.nonce || !same(tx.from,review.evm?.from ?? '')) throw new Error('Transaction no longer matches the approved review');\n }\n private verifySigned(raw: string, saved: UsdtPrepared) {\n const tx = Transaction.from(raw);\n if (!tx.hash || !tx.from || !same(tx.from,saved.from) || tx.chainId !== BigInt(saved.chainId) || !tx.to || !same(tx.to,saved.to) || tx.data !== saved.data || tx.value !== 0n || tx.nonce !== saved.nonce || tx.gasLimit !== BigInt(saved.gasLimit) || tx.maxFeePerGas !== BigInt(saved.maxFeePerGas) || tx.maxPriorityFeePerGas !== BigInt(saved.maxPriorityFeePerGas)) throw new Error('Signature does not match the approved transaction');\n return tx.hash;\n }\n execute(review: PaymentReview, prepared: UsdtPrepared, persist?:()=>Promise<void>) { return this.serial(async () => {\n let account:WalletAccountEvm;\n try {\n this.matches(review); this.verifyPrepared(review,prepared);\n await this.assertToken(); account=this.current();\n if (!same(await account.getAddress(),prepared.from)) throw new Error('Wrong wallet');\n const nonce = Number(BigInt(await this.rpc<string>('eth_getTransactionCount',[prepared.from,'pending'])));\n if (nonce !== prepared.nonce) throw new Error('Account nonce changed. Create a new review');\n const balances = await this.balances();\n if (BigInt(balances.balance)<BigInt(review.amount) || BigInt(balances.gasBalance)<BigInt(review.fee)) throw new Error('Token or gas balance changed. Create a new review');\n if (!persist) throw new Error('Durable payment journal required');\n } catch (error) { throw new PaymentPreflightError(error instanceof Error ? error.message : 'Could not validate payment'); }\n const raw = await account.signTransaction({type:2,to:prepared.to,data:prepared.data,value:0n,chainId:prepared.chainId,nonce:prepared.nonce,gasLimit:BigInt(prepared.gasLimit),maxFeePerGas:BigInt(prepared.maxFeePerGas),maxPriorityFeePerGas:BigInt(prepared.maxPriorityFeePerGas)});\n prepared.hash = this.verifySigned(raw,prepared);\n prepared.signed = await sealSeed(raw,this.mnemonic);\n await persist!(); // Nothing may broadcast before the encrypted bytes are durable.\n await account.sendTransaction(raw);\n return this.receipt(prepared.hash,review,prepared.from);\n }); }\n reconcile(review: PaymentReview, prepared: UsdtPrepared) { return this.serial(async () => {\n await this.assertToken(); this.verifyPrepared(review,prepared);\n if (!prepared.signed || !prepared.hash) return {settled:false,failed:true,error:'No signed transaction was submitted. Create a new review.'};\n const result = await this.receipt(prepared.hash,review,prepared.from);\n if (result.settled || result.failed || result.pending) return result;\n // An uncertain network response permits only replay of exactly the saved bytes.\n const nonce = Number(BigInt(await this.rpc<string>('eth_getTransactionCount',[prepared.from,'pending'])));\n if (nonce > prepared.nonce) return result;\n const raw = await unsealSeed(prepared.signed,this.mnemonic);\n if (this.verifySigned(raw,prepared) !== prepared.hash || !same(await this.address(),prepared.from)) throw new Error('Recovery wallet mismatch');\n await this.current().sendTransaction(raw);\n return this.receipt(prepared.hash,review,prepared.from);\n }); }\n async receipt(hash: string, target: PaymentTarget & {amount:number}, expectedFrom?:string): Promise<PaymentExecution> {\n if (!/^0x[0-9a-fA-F]{64}$/.test(hash) || target.chainId !== this.config.chainId || !same(target.token ?? '',this.config.token) || target.decimals !== this.config.decimals) throw new Error('Invalid receipt target');\n await this.assertToken();\n const tx = await this.rpc<{from:string;to:string;input:string;value:string;nonce:string}|null>('eth_getTransactionByHash',[hash]);\n if (!tx) return {txid:hash,settled:false};\n if (!same(tx.to,this.config.token) || (expectedFrom && !same(tx.from,expectedFrom)) || BigInt(tx.value)!==0n || tx.input !== erc20.encodeFunctionData('transfer',[getAddress(target.address),BigInt(target.amount)])) throw new Error('Transaction is not the requested token transfer');\n const receipt = await this.rpc<{status:string;blockNumber:string;blockHash:string;logs:Array<{address:string;topics:string[];data:string}>}|null>('eth_getTransactionReceipt',[hash]);\n if (!receipt) return {txid:hash,settled:false,pending:true};\n const block = await this.rpc<{hash:string;timestamp:string}>('eth_getBlockByNumber',[receipt.blockNumber,false]);\n if (!block || block.hash !== receipt.blockHash || BigInt(block.timestamp)*1000n < BigInt((target.issuedAt ?? 0)-1000)) return {txid:hash,settled:false};\n const height = BigInt(await this.rpc<string>('eth_blockNumber'));\n if (height-BigInt(receipt.blockNumber)+1n < BigInt(CONFIRMATIONS)) return {txid:hash,settled:false,pending:true};\n if (BigInt(receipt.status)!==1n) return {txid:hash,settled:false,failed:true,error:'Transaction reverted. Tokens were not sent; gas was spent.'};\n const transfer = receipt.logs.some(log=>{\n if (!same(log.address,this.config.token)) return false;\n try {const event=erc20.parseLog(log);return event?.name==='Transfer' && same(event.args[0],tx.from) && same(event.args[1],target.address) && event.args[2]===BigInt(target.amount);} catch {return false;}\n });\n if (!transfer) throw new Error('Receipt has no matching token Transfer');\n return {txid:hash,settled:true};\n }\n async dispose() { await this.queue.catch(()=>{}); this.account=undefined;this.manager?.dispose();this.manager=undefined;this.mnemonic=''; }\n private serial<T>(work:()=>Promise<T>):Promise<T> { const operation=this.queue.then(work,work);this.queue=operation.catch(()=>{});return operation; }\n}\n"],"mappings":"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"}
|