@anywalletkit/protocol-swap2-usdt0 0.1.8 → 0.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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/protocol.ts","../src/config.ts","../src/provider.ts","../src/activity.ts"],"sourcesContent":["import {SingleProviderSwap2} from \"@anywalletkit/protocol-swap2-core/swap2/single\";\nimport type {Swap2Account, Swap2EngineConfig} from \"@anywalletkit/protocol-swap2-core/swap2/base\";\nimport {usdt0 as usdt0Cfg} from \"./config.js\";\nimport {usdt0Provider, type Usdt0ProviderConfig} from \"./provider.js\";\n\nexport interface Usdt0Swap2Config extends Swap2EngineConfig, Usdt0ProviderConfig {}\n\n/** Standalone USDT0 swap2: USDT / USDT0 between the LayerZero OFT deployments in one source transaction. */\nexport class Usdt0Swap2Protocol extends SingleProviderSwap2 {\n protected readonly provider;\n constructor(account: Swap2Account | undefined, config: Usdt0Swap2Config) {\n super(account, config);\n this.provider = usdt0Provider(config);\n }\n protected override chainSupported(caip2: string): boolean {\n return usdt0Cfg.supportsChain(caip2);\n }\n protected override pairSupported(fromChain: string, toChain: string): boolean {\n return usdt0Cfg.supports(fromChain, toChain);\n }\n}\n","// USDT0 — Tether's LayerZero OFT for USDT. Source: docs.usdt0.to\n// (technical-documentation/deployments, read 2026-10-20) — every row below was\n// then re-read on-chain over public RPCs the same day: the OFT's `token()` is\n// the listed token, `endpoint()` is the listed endpoint (and reports the\n// listed eid), `approvalRequired()` is true only for the Ethereum adapter,\n// `sharedDecimals()` = 6 everywhere, and `peers(eid)` are wired between the\n// chains. `oftVersion()` = (0x02e49c2c, 1) on all of them.\n//\n// Only chains the SDK ships (swap2-assets / wallet-evm) are listed. USDT0 is\n// also deployed on Conflux eSpace (1030, eid 30212), Flare (14, 30295),\n// Hedera (295, 30316), Mantle (5000, 30181), Morph (2818, 30322), Rootstock\n// (30, 30333), Stable (988, 30396), Tempo (4217, 30410), plus HyperCore, IOTA\n// and Stellar (non-EVM) — not wallet chains here, so not routable here.\nimport {evmRef, isEvm} from \"@anywalletkit/protocol-swap2-core/util\";\n\nexport interface Usdt0Chain {\n caip2: string;\n chainId: number;\n /** LayerZero V2 endpoint id. */\n eid: number;\n name: string;\n /** The ERC-20 the user holds: USDT on Ethereum, USDT0 elsewhere (6 decimals everywhere). */\n token: string;\n /**\n * The OFT contract `quoteSend` / `send` are called on. On Ethereum it is the\n * OFT *adapter* that locks USDT (`approvalRequired()` = true, approve the\n * token to it); elsewhere it is the OUpgradeable OFT that burns the caller's\n * USDT0 through the token's mint/burn role — no approval.\n */\n oft: string;\n /** LayerZero V2 EndpointV2 on that chain (`lzReceive` retries of a stored payload go here). */\n endpoint: string;\n /** True on Ethereum: the OFT is a lockbox adapter in front of plain USDT. */\n adapter: boolean;\n}\n\nconst LZ_ENDPOINT_A = \"0x1a44076050125825900e736c501f859c50fE728c\";\nconst LZ_ENDPOINT_B = \"0x6F475642a6e85809B1c36Fa62763669b1b48DD5B\";\n\nconst c = (chainId: number, eid: number, name: string, token: string, oft: string, endpoint: string, adapter = false): Usdt0Chain => ({\n caip2: `eip155:${chainId}`, chainId, eid, name, token, oft, endpoint, adapter,\n});\n\n/** CAIP-2 → USDT0 deployment. */\nexport const USDT0_CHAINS: Readonly<Record<string, Usdt0Chain>> = Object.freeze(Object.fromEntries([\n c(1, 30101, \"Ethereum\", \"0xdAC17F958D2ee523a2206206994597C13D831ec7\", \"0x6C96dE32CEa08842dcc4058c14d3aaAD7Fa41dee\", LZ_ENDPOINT_A, true),\n c(42161, 30110, \"Arbitrum\", \"0xFd086bC7CD5C481DCC9C85ebE478A1C0b69FCbb9\", \"0x14E4A1B13bf7F943c8ff7C51fb60FA964A298D92\", LZ_ENDPOINT_A),\n c(10, 30111, \"OP Mainnet\", \"0x01bFF41798a0BcF287b996046Ca68b395DbC1071\", \"0xF03b4d9AC1D5d1E7c4cEf54C2A313b9fe051A0aD\", LZ_ENDPOINT_A),\n c(137, 30109, \"Polygon PoS\", \"0xc2132D05D31c914a87C6611C10748AEb04B58e8F\", \"0x6BA10300f0DC58B7a1e4c0e41f5daBb7D7829e13\", LZ_ENDPOINT_A),\n c(999, 30367, \"HyperEVM\", \"0xB8CE59FC3717ada4C02eaDF9682A9e934F625ebb\", \"0x904861a24F30EC96ea7CFC3bE9EA4B476d237e98\", \"0x3A73033C0b1407574C76BdBAc67f126f6b4a9AA9\"),\n c(57073, 30339, \"Ink\", \"0x0200C29006150606B650577BBE7B6248F58470c1\", \"0x1cB6De532588fCA4a21B7209DE7C456AF8434A65\", \"0xca29f3A6f966Cb2fc0dE625F8f325c0C46dbE958\"),\n c(80094, 30362, \"Berachain\", \"0x779Ded0c9e1022225f8E0630b35a9b54bE713736\", \"0x3Dc96399109df5ceb2C226664A086140bD0379cB\", LZ_ENDPOINT_B),\n c(130, 30320, \"Unichain\", \"0x9151434b16b9763660705744891fA906F660EcC5\", \"0xc07bE8994D035631c36fb4a89C918CeFB2f03EC3\", LZ_ENDPOINT_B),\n c(1329, 30280, \"Sei\", \"0x9151434b16b9763660705744891fA906F660EcC5\", \"0x56Fe74A2e3b484b921c447357203431a3485CC60\", LZ_ENDPOINT_A),\n c(9745, 30383, \"Plasma\", \"0xB8CE59FC3717ada4C02eaDF9682A9e934F625ebb\", \"0x02ca37966753bDdDf11216B73B16C1dE756A7CF9\", LZ_ENDPOINT_B),\n c(143, 30390, \"Monad\", \"0xe7cd86e13AC4309349F30B3435a9d337750fC82D\", \"0x9151434b16b9763660705744891fA906F660EcC5\", LZ_ENDPOINT_B),\n c(4326, 30398, \"MegaETH\", \"0xB8CE59FC3717ada4C02eaDF9682A9e934F625ebb\", \"0x9151434b16b9763660705744891fA906F660EcC5\", LZ_ENDPOINT_B),\n c(196, 30274, \"X Layer\", \"0x779Ded0c9e1022225f8E0630b35a9b54bE713736\", \"0x94bcCa6BdfD6a61817aB0E960BfedE4984505554\", LZ_ENDPOINT_A),\n // 2026-10-20 (evm-chains-6 batch): docs.usdt0.to deployments, re-read on-chain (token(), approvalRequired() = false,\n // sharedDecimals() = 6, endpoint(), peers(30110) = the Arbitrum OFT).\n c(5000, 30181, \"Mantle\", \"0x779Ded0c9e1022225f8E0630b35a9b54bE713736\", \"0xcb768e263FB1C62214E7cab4AA8d036D76dc59CC\", LZ_ENDPOINT_A),\n c(2818, 30322, \"Morph\", \"0xe7cd86e13AC4309349F30B3435a9d337750fC82D\", \"0xcb768e263FB1C62214E7cab4AA8d036D76dc59CC\", LZ_ENDPOINT_B),\n c(14, 30295, \"Flare\", \"0xe7cd86e13AC4309349F30B3435a9d337750fC82D\", \"0x567287d2A9829215a37e3B88843d32f9221E7588\", LZ_ENDPOINT_A),\n].map((x) => [x.caip2, x])));\n\n/** LayerZero eid → deployment. */\nexport const USDT0_BY_EID: Readonly<Record<number, Usdt0Chain>> = Object.freeze(\n Object.fromEntries(Object.values(USDT0_CHAINS).map((x) => [x.eid, x])),\n);\n\n/** LayerZero Scan — message status by source transaction hash. */\nexport const LZ_SCAN_API = \"https://scan.layerzero-api.com\";\n\n/** Token symbols the catalog uses for the same asset across chains. */\nexport const USDT0_SYMBOLS: readonly string[] = Object.freeze([\"USDT0\", \"USDT\", \"USD₮0\", \"USD₮\"]);\n\nexport const usdt0 = {\n supportsChain(chain: string): boolean {\n return isEvm(chain) && !!USDT0_CHAINS[`eip155:${evmRef(chain)}`];\n },\n supports(from: string, to: string): boolean {\n return from !== to && this.supportsChain(from) && this.supportsChain(to);\n },\n};\n","import {createPublicClient, encodeFunctionData, fallback, getAddress, http, isAddress, pad, parseAbi, type Hex} from \"viem\";\nimport {describeUsdt0Activity} from \"./activity.js\";\nimport {ccAsset} from \"@anywalletkit/swap2-assets\";\nimport {redactUrls, timeoutSignal} from \"@anywalletkit/protocol-swap2-core/util\";\nimport type {Asset, CrossChainProvider, IntentRef, IntentState, IntentStatus, Quote, QuoteParams, UnsignedTx} from \"@anywalletkit/protocol-swap2-core/types\";\nimport {LZ_SCAN_API, USDT0_BY_EID, USDT0_CHAINS, USDT0_SYMBOLS, usdt0 as usdt0Cfg, type Usdt0Chain} from \"./config.js\";\n\n/**\n * USDT0 — Tether's USDT as a LayerZero OFT. ONE source transaction:\n * `send(SendParam, MessagingFee, refund)` on the chain's OFT with the\n * LayerZero messaging fee as `msg.value`; LayerZero's DVNs verify and the\n * executor delivers on the destination (mint of USDT0, or unlock of USDT out\n * of the Ethereum adapter). No second user transaction in the normal case.\n *\n * - Quote = two `eth_call`s on the source OFT: `quoteOFT` for the limits,\n * protocol fees and the amount that really arrives after dust removal\n * (shared decimals = 6, so none today), then `quoteSend` for the native\n * fee with `minAmountLD` pinned to that received amount — the contract\n * reverts rather than deliver less. Both are sealed into the quote.\n * - `enforcedOptions` on every deployment already carry the executor gas\n * (type-3 options, lzReceive gas 80 000, read on-chain 2026-10-20), so\n * `extraOptions` stays empty; LayerZero Scan confirms deliveries ran on it.\n * - Ethereum locks USDT in an adapter (`approvalRequired()` = true →\n * `approvalAddress`); every other chain's OFT burns the caller's USDT0\n * itself (`approvalRequired()` = false → no approval at all).\n * - Every address in `config.ts` is re-read on-chain before the first quote\n * on a chain (`token()`, `approvalRequired()`) and per pair (`peers(dstEid)`\n * must be the destination OFT) — a mismatch refuses the route.\n * - Status: LayerZero Scan by source hash. DELIVERED carries the destination\n * hash; PAYLOAD_STORED (delivery reverted on the destination, funds safe)\n * becomes \"action-required\" with a `buildClaim` that retries\n * `EndpointV2.lzReceive` — anyone may call it, so the user can.\n */\n\nconst OFT_ABI = parseAbi([\n \"struct SendParam { uint32 dstEid; bytes32 to; uint256 amountLD; uint256 minAmountLD; bytes extraOptions; bytes composeMsg; bytes oftCmd; }\",\n \"struct MessagingFee { uint256 nativeFee; uint256 lzTokenFee; }\",\n \"struct OFTLimit { uint256 minAmountLD; uint256 maxAmountLD; }\",\n \"struct OFTFeeDetail { int256 feeAmountLD; string description; }\",\n \"struct OFTReceipt { uint256 amountSentLD; uint256 amountReceivedLD; }\",\n \"struct MessagingReceipt { bytes32 guid; uint64 nonce; MessagingFee fee; }\",\n \"function quoteSend(SendParam s, bool payInLzToken) view returns (MessagingFee)\",\n \"function quoteOFT(SendParam s) view returns (OFTLimit, OFTFeeDetail[], OFTReceipt)\",\n \"function send(SendParam s, MessagingFee fee, address refundAddress) payable returns (MessagingReceipt, OFTReceipt)\",\n \"function token() view returns (address)\",\n \"function approvalRequired() view returns (bool)\",\n \"function peers(uint32 eid) view returns (bytes32)\",\n]);\nconst ENDPOINT_ABI = parseAbi([\n \"struct Origin { uint32 srcEid; bytes32 sender; uint64 nonce; }\",\n \"function lzReceive(Origin origin, address receiver, bytes32 guid, bytes message, bytes extraData) payable\",\n]);\n\nconst EVM_PLACEHOLDER = \"0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045\";\nconst DEFAULT_QUOTE_TTL_MS = 60_000;\nconst RPC_TIMEOUT_MS = 12_000;\nconst SCAN_TIMEOUT_MS = 12_000;\n/** A direct `send` used ~330k gas on Arbitrum and on the Ethereum adapter (2026-10-20 receipts). */\nconst GAS_SEND = \"450000\";\n/**\n * The LayerZero fee is quoted at quote time but paid at send time, and it moves\n * with source and destination gas (live: +1.7 % within a minute on Ethereum).\n * The sealed `msg.value` carries this headroom; EndpointV2 charges the current\n * fee and refunds the surplus to `refundAddress` (the trader) in the same\n * transaction, so the headroom costs nothing — it only avoids a re-quote.\n */\nconst FEE_HEADROOM_BPS = 2_500n;\n/** `lzReceive` retry of a stored payload: a mint plus the endpoint bookkeeping. */\nconst GAS_CLAIM = \"300000\";\nconst ZERO_B32 = `0x${\"00\".repeat(32)}` as Hex;\n\nexport interface Usdt0ProviderConfig {\n enabled?: boolean;\n /**\n * JSON-RPC URL(s) per CAIP-2 chain. REQUIRED for every chain the provider\n * should quote from: the fee and the received amount come from the OFT\n * itself. The destination RPC is optional (used for the stored-payload retry).\n */\n rpcUrls?: Readonly<Record<string, string | readonly string[]>>;\n /** LayerZero Scan base (default https://scan.layerzero-api.com). */\n scanUrl?: string;\n /** Local lifetime of a quote (default 60 s; the sealed fee is re-checked at preflight). */\n quoteTtlMs?: number;\n /** Injectable for tests (also used by the RPC transport). */\n fetchImpl?: typeof fetch;\n}\n\ninterface ScanMessage {\n pathway?: {srcEid?: number; dstEid?: number; sender?: {address?: string}; receiver?: {address?: string}; nonce?: number};\n source?: {status?: string; tx?: {txHash?: string; payload?: string; options?: {lzReceive?: {gas?: string; value?: string}}}};\n destination?: {status?: string; tx?: {txHash?: string}};\n guid?: string;\n status?: {name?: string; message?: string};\n}\n\nconst same = (a: string | undefined | null, b: string) => !!a && a.toLowerCase() === b.toLowerCase();\nconst isHexData = (v: unknown): v is Hex => typeof v === \"string\" && /^0x(?:[0-9a-fA-F]{2})*$/.test(v);\n\n/** Does the catalog symbol on `chain` name this deployment's token? (USDT on Ethereum/Polygon, USDT0 elsewhere.) */\nfunction tokenMatches(chain: Usdt0Chain, symbolOrAddress: string): boolean {\n if (symbolOrAddress.startsWith(\"0x\")) return same(symbolOrAddress, chain.token);\n if (!USDT0_SYMBOLS.includes(symbolOrAddress.toUpperCase().replace(\"USD₮\", \"USDT\"))) return false;\n const known = ccAsset(chain.caip2, symbolOrAddress);\n // A symbol the catalog binds to another contract (OP's legacy bridged USDT) is not the OFT token.\n return !known || same(known.contract ?? \"\", chain.token);\n}\n\n/**\n * A refusal / preflight error that may reach a client: an RPC transport failure\n * becomes a fixed reason (viem's HTTP / timeout errors carry `URL: …`, and a keyed\n * endpoint's key sits in that path — scan 2026-10-23 F8); anything else loses its URLs.\n */\nfunction rpcSafeReason(err: unknown, chainName: string): string {\n const e = err as {name?: string; shortMessage?: string; message?: string} | undefined;\n const text = `${e?.shortMessage ?? \"\"}\\n${e?.message ?? String(err)}`;\n if (/HttpRequestError|TimeoutError|RpcRequestError|WebSocketRequestError/.test(String(e?.name)) || /\\bURL: |HTTP request failed|request timed out|took too long to respond/i.test(text)) {\n return `usdt0: RPC for ${chainName} unavailable — try again`;\n }\n return redactUrls(err instanceof Error ? err.message : String(err));\n}\n\nexport function usdt0Provider(config: Usdt0ProviderConfig = {}): CrossChainProvider {\n config = Object.freeze({...config});\n const scan = (config.scanUrl ?? LZ_SCAN_API).replace(/\\/+$/, \"\");\n if (!/^https?:\\/\\//.test(scan)) throw new Error(\"usdt0: scanUrl must use http or https\");\n const quoteTtlMs = config.quoteTtlMs ?? DEFAULT_QUOTE_TTL_MS;\n if (!Number.isInteger(quoteTtlMs) || quoteTtlMs <= 0 || quoteTtlMs > 300_000) throw new Error(\"usdt0: quoteTtlMs must be an integer between 1 and 300000\");\n const rpcUrls = Object.freeze({...(config.rpcUrls ?? {})});\n const doFetch: typeof fetch = (input, init) => (config.fetchImpl ?? fetch)(input, init);\n\n const client = (caip2: string) => {\n const raw = rpcUrls[caip2];\n const urls = typeof raw === \"string\" ? [raw] : [...(raw ?? [])];\n if (urls.length === 0) return null;\n const opts = {timeout: RPC_TIMEOUT_MS, ...(config.fetchImpl ? {fetchFn: config.fetchImpl} : {})} as never;\n return createPublicClient({transport: urls.length === 1 ? http(urls[0], opts) : fallback(urls.map((u) => http(u, opts)))});\n };\n\n /** Once per chain: the OFT really is the OFT of the listed token with the listed approval mode. */\n const verified = new Map<string, Promise<void>>();\n function verifyChain(chain: Usdt0Chain): Promise<void> {\n let p = verified.get(chain.caip2);\n if (!p) {\n p = (async () => {\n const c = client(chain.caip2);\n if (!c) throw new Error(`usdt0: no RPC for ${chain.caip2}`);\n const [token, approval] = await Promise.all([\n c.readContract({address: getAddress(chain.oft), abi: OFT_ABI, functionName: \"token\"}),\n c.readContract({address: getAddress(chain.oft), abi: OFT_ABI, functionName: \"approvalRequired\"}),\n ]);\n if (!same(token, chain.token)) throw new Error(`usdt0: OFT ${chain.oft} on ${chain.name} reports token ${token}, expected ${chain.token}`);\n if (approval !== chain.adapter) throw new Error(`usdt0: OFT ${chain.oft} on ${chain.name} reports approvalRequired=${String(approval)}, expected ${String(chain.adapter)}`);\n })();\n p.catch(() => verified.delete(chain.caip2));\n verified.set(chain.caip2, p);\n }\n return p;\n }\n\n /** Once per pair: the source OFT's peer for the destination eid is the destination OFT. */\n const peers = new Map<string, Promise<void>>();\n function verifyPeer(src: Usdt0Chain, dst: Usdt0Chain): Promise<void> {\n const key = `${src.eid}>${dst.eid}`;\n let p = peers.get(key);\n if (!p) {\n p = (async () => {\n const c = client(src.caip2);\n if (!c) throw new Error(`usdt0: no RPC for ${src.caip2}`);\n const peer = await c.readContract({address: getAddress(src.oft), abi: OFT_ABI, functionName: \"peers\", args: [dst.eid]});\n if (!same(peer, pad(getAddress(dst.oft), {size: 32}))) throw new Error(`usdt0: ${src.name} OFT has no peer for ${dst.name} (eid ${dst.eid}) — route not wired`);\n })();\n p.catch(() => peers.delete(key));\n peers.set(key, p);\n }\n return p;\n }\n\n function parseIntent(intentId: string): {src: Usdt0Chain; dst: Usdt0Chain} | null {\n const [tag, s, d] = intentId.split(\":\");\n if (tag !== \"usdt0\") return null;\n const src = USDT0_BY_EID[Number(s)];\n const dst = USDT0_BY_EID[Number(d)];\n return src && dst && src !== dst ? {src, dst} : null;\n }\n\n const sendParam = (dstEid: number, recipient: string, amountLD: bigint, minAmountLD: bigint) => ({\n dstEid, to: pad(getAddress(recipient), {size: 32}), amountLD, minAmountLD, extraOptions: \"0x\" as Hex, composeMsg: \"0x\" as Hex, oftCmd: \"0x\" as Hex,\n });\n\n /** The LayerZero message of a source transaction on this route, or null while Scan has not indexed it. */\n async function scanMessage(src: Usdt0Chain, dst: Usdt0Chain, sourceTxHash: string): Promise<ScanMessage | null | \"foreign\"> {\n const res = await doFetch(`${scan}/v1/messages/tx/${encodeURIComponent(sourceTxHash)}`, {headers: {accept: \"application/json\"}, signal: timeoutSignal(SCAN_TIMEOUT_MS)});\n if (res.status === 404) return null;\n if (!res.ok) throw new Error(`usdt0: LayerZero Scan → ${res.status}`);\n const body = (await res.json()) as {data?: ScanMessage[]};\n const list = Array.isArray(body?.data) ? body.data : [];\n if (list.length === 0) return null;\n const m = list.find((x) => x.pathway?.srcEid === src.eid && x.pathway?.dstEid === dst.eid && same(x.pathway?.sender?.address, src.oft));\n return m ?? \"foreign\";\n }\n\n return {\n name: \"usdt0\",\n describeActivity: describeUsdt0Activity,\n enabled: () => config.enabled ?? true,\n supportsChain: (chain: string) => usdt0Cfg.supportsChain(chain) && client(chain) !== null,\n supportsChainPair: (from: string, to: string) => usdt0Cfg.supports(from, to) && client(from) !== null,\n supportsRoute(from: Asset, to: Asset): boolean {\n const src = USDT0_CHAINS[from.chain];\n const dst = USDT0_CHAINS[to.chain];\n if (!src || !dst || src === dst || client(from.chain) === null) return false;\n return tokenMatches(src, from.token) && tokenMatches(dst, to.token);\n },\n\n async getQuote(params: QuoteParams, signal?: AbortSignal): Promise<Quote | null> {\n const refuse = (reason: string) => { params.onRefusal?.(reason); return null; };\n if (params.flex) return refuse(\"the amount is sealed into the calldata (no flexible deposits)\");\n const src = USDT0_CHAINS[params.sourceChain];\n const dst = USDT0_CHAINS[params.destChain];\n if (!src || !dst) return refuse(\"USDT0 is not deployed on this chain\");\n if (src === dst) return refuse(\"same-chain transfers are not a bridge\");\n if (!tokenMatches(src, params.sourceToken)) return refuse(`source token ${params.sourceToken} is not USDT0 (${src.token}) on ${src.name}`);\n if (!tokenMatches(dst, params.destToken)) return refuse(`destination token ${params.destToken} is not USDT0 (${dst.token}) on ${dst.name}`);\n if (!/^\\d+$/.test(params.amountIn)) return refuse(\"amount must be a base-unit integer\");\n const amount = BigInt(params.amountIn);\n if (amount <= 0n) return refuse(\"amount must be positive\");\n // The placeholder prices a dry quote; a live one without addresses would send there (round 3, H8).\n const dry = params.dry !== false;\n const recipient = params.destAddress || (dry ? EVM_PLACEHOLDER : \"\");\n if (!recipient) return refuse(\"a live quote needs a recipient\");\n if (!isAddress(recipient)) return refuse(\"destination must be an EVM address\");\n const refund = params.refundAddress || (dry ? EVM_PLACEHOLDER : \"\");\n if (!refund) return refuse(\"a live quote needs a refund address\");\n if (!isAddress(refund)) return refuse(\"refund address must be an EVM address\");\n const c = client(src.caip2);\n if (!c) return refuse(`no RPC configured for ${src.caip2}`);\n\n try {\n await Promise.all([verifyChain(src), verifyPeer(src, dst)]);\n const probe = sendParam(dst.eid, recipient, amount, 0n);\n const [limit, feeDetails, receipt] = await c.readContract({address: getAddress(src.oft), abi: OFT_ABI, functionName: \"quoteOFT\", args: [probe]});\n if (amount < limit.minAmountLD) return refuse(`amount ${amount} is below the OFT minimum ${limit.minAmountLD}`);\n if (amount > limit.maxAmountLD) return refuse(`amount ${amount} exceeds the OFT maximum ${limit.maxAmountLD}`);\n const received = receipt.amountReceivedLD;\n if (received <= 0n) return refuse(\"amount is below the OFT dust threshold — nothing would arrive\");\n if (received > amount) return refuse(\"OFT reports more received than sent — refusing\");\n if (params.minAmountOut !== undefined && received < BigInt(params.minAmountOut)) return refuse(`received ${received} is below the caller's floor ${params.minAmountOut}`);\n const sp = sendParam(dst.eid, recipient, amount, received);\n const fee = await c.readContract({address: getAddress(src.oft), abi: OFT_ABI, functionName: \"quoteSend\", args: [sp, false]});\n if (fee.lzTokenFee !== 0n) return refuse(\"OFT asks for a fee in LZ token — unsupported\");\n // Sealed with headroom: OAppSender requires msg.value == MessagingFee.nativeFee, the\n // endpoint refunds whatever the current fee does not use to `refund`.\n const nativeFee = fee.nativeFee + (fee.nativeFee * FEE_HEADROOM_BPS) / 10_000n;\n const data = encodeFunctionData({abi: OFT_ABI, functionName: \"send\", args: [sp, {nativeFee, lzTokenFee: 0n}, getAddress(refund)]});\n const protocolFees = feeDetails\n .filter((f) => f.feeAmountLD > 0n)\n .map((f) => ({type: \"protocol\" as const, amount: f.feeAmountLD.toString(), token: src.token, included: true, description: f.description || \"OFT fee\"}));\n const feeUsd = protocolFees.reduce((a, f) => a + Number(f.amount) / 1e6, 0);\n // Ethereum sources wait for 60 confirmations before the DVNs attest (~15 min live); L2 sources land in a few minutes.\n const eta = src.chainId === 1 ? 1000 : 240;\n return {\n provider: \"usdt0\",\n intentId: `usdt0:${src.eid}:${dst.eid}`,\n depositAddress: \"\",\n depositMemo: null,\n txRequest: {\n to: src.oft,\n data,\n value: nativeFee.toString(),\n chainId: src.chainId,\n gasLimit: GAS_SEND,\n ...(src.adapter ? {approvalAddress: src.oft} : {}),\n ...(nativeFee > 0n ? {nativeFee: nativeFee.toString()} : {}),\n },\n sourceAmount: amount.toString(),\n destAmount: received.toString(),\n minDestAmount: received.toString(),\n feeUsd,\n fees: protocolFees,\n etaSeconds: eta,\n reliability: 0.98,\n validUntilMs: Date.now() + quoteTtlMs,\n providerData: {\n srcEid: String(src.eid), dstEid: String(dst.eid), oft: src.oft, token: src.token, recipient: getAddress(recipient), refundAddress: getAddress(refund),\n amountLD: amount.toString(), minAmountLD: received.toString(), nativeFee: nativeFee.toString(),\n },\n };\n } catch (err) {\n return refuse(rpcSafeReason(err, src.name));\n }\n },\n\n async buildDeposit(quote: Quote): Promise<UnsignedTx> {\n const tx = quote.txRequest;\n const parsed = parseIntent(quote.intentId);\n if (!tx || !parsed) throw new Error(\"swap2: USDT0 quote has no transaction request\");\n return {\n chain: parsed.src.caip2,\n to: tx.to ?? \"\",\n value: tx.value ?? \"0\",\n ...(tx.data ? {data: tx.data} : {}),\n ...(tx.chainId !== undefined ? {chainId: tx.chainId} : {}),\n ...(tx.gasLimit ? {gasLimit: tx.gasLimit} : {}),\n ...(tx.approvalAddress ? {approvalAddress: tx.approvalAddress} : {}),\n };\n },\n\n /**\n * Right before signing: the target is the source OFT, the peer is still the\n * destination OFT, and the CURRENT LayerZero fee still fits the sealed\n * `msg.value` (quote + headroom) — the endpoint reverts a send that\n * underpays, so a fee past the headroom means re-quote rather than a\n * wasted broadcast.\n */\n async preflightDeposit(quote: Quote, tx: UnsignedTx): Promise<void> {\n const parsed = parseIntent(quote.intentId);\n if (!parsed) throw new Error(\"usdt0: malformed intent id\");\n const {src, dst} = parsed;\n if (!same(tx.to, src.oft)) throw new Error(`usdt0: deposit target ${tx.to} is not the ${src.name} OFT`);\n const pd = quote.providerData ?? {};\n if (!/^\\d+$/.test(pd.amountLD ?? \"\") || !/^\\d+$/.test(pd.minAmountLD ?? \"\") || !/^\\d+$/.test(pd.nativeFee ?? \"\") || !isAddress(pd.recipient ?? \"\")) {\n throw new Error(\"usdt0: quote carries no sealed send parameters\");\n }\n const c = client(src.caip2);\n if (!c) throw new Error(`usdt0: no RPC for ${src.caip2}`);\n const sp = sendParam(dst.eid, pd.recipient!, BigInt(pd.amountLD!), BigInt(pd.minAmountLD!));\n let fee: {nativeFee: bigint};\n try {\n await Promise.all([verifyChain(src), verifyPeer(src, dst)]);\n fee = await c.readContract({address: getAddress(src.oft), abi: OFT_ABI, functionName: \"quoteSend\", args: [sp, false]});\n } catch (err) {\n throw new Error(rpcSafeReason(err, src.name));\n }\n const sealed = BigInt(pd.nativeFee!);\n if (fee.nativeFee > sealed) throw new Error(`usdt0: LayerZero fee rose to ${fee.nativeFee} above the sealed ${sealed} (quote + ${FEE_HEADROOM_BPS / 100n} % headroom) — re-quote`);\n if (BigInt(tx.value) !== sealed) throw new Error(`usdt0: transaction value ${tx.value} is not the quoted fee ${sealed}`);\n },\n\n async trackIntent(ref: IntentRef): Promise<IntentStatus> {\n const parsed = parseIntent(ref.intentId);\n if (!parsed) return {state: \"failed\"};\n const {src, dst} = parsed;\n if (!ref.sourceTxHash) return {state: \"pending\"};\n try {\n const m = await scanMessage(src, dst, ref.sourceTxHash);\n if (m === null) return {state: \"pending\", depositReceived: false};\n if (m === \"foreign\") return {state: \"failed\"}; // the hash carries a LayerZero message, but not ours\n const name = (m.status?.name ?? \"\").toUpperCase();\n const destHash = m.destination?.tx?.txHash;\n if (name === \"DELIVERED\") return {state: \"completed\", depositReceived: true, ...(destHash ? {destTxHash: destHash} : ref.destTxHash ? {destTxHash: ref.destTxHash} : {})};\n if (name === \"PAYLOAD_STORED\") return {state: \"action-required\", depositReceived: true, claim: {chain: dst.caip2, ready: true}};\n if ([\"FAILED\", \"APPLICATION_BURNED\", \"APPLICATION_SKIPPED\", \"UNRESOLVABLE_COMMAND\", \"MALFORMED_COMMAND\"].includes(name)) return {state: \"failed\", depositReceived: true};\n // INFLIGHT, CONFIRMING, BLOCKED (an earlier nonce on the pathway is stuck — LayerZero clears it), or anything new.\n return {state: \"pending\", depositReceived: true};\n } catch {\n return {state: \"pending\"};\n }\n },\n\n /**\n * A delivery that reverted on the destination (PAYLOAD_STORED — out of\n * executor gas, paused token) is retried by anyone through the endpoint:\n * `lzReceive(origin, receiver, guid, message, extraData)` with the exact\n * packet LayerZero Scan recorded. Null while nothing is stored.\n */\n async buildClaim(ref: IntentRef): Promise<UnsignedTx | null> {\n const parsed = parseIntent(ref.intentId);\n if (!parsed || !ref.sourceTxHash) return null;\n const {src, dst} = parsed;\n const m = await scanMessage(src, dst, ref.sourceTxHash);\n if (!m || m === \"foreign\" || (m.status?.name ?? \"\").toUpperCase() !== \"PAYLOAD_STORED\") return null;\n const nonce = m.pathway?.nonce;\n const guid = m.guid;\n const message = m.source?.tx?.payload;\n if (!Number.isInteger(nonce) || !isHexData(guid) || guid.length !== 66 || !isHexData(message) || message.length <= 2) {\n throw new Error(\"usdt0: LayerZero Scan has no complete packet for the stored payload\");\n }\n if (!same(m.pathway?.receiver?.address, dst.oft)) throw new Error(\"usdt0: stored payload is addressed to another receiver\");\n const valueRaw = m.source?.tx?.options?.lzReceive?.value ?? \"0\";\n const value = /^\\d+$/.test(valueRaw) ? valueRaw : \"0\";\n return {\n chain: dst.caip2,\n to: dst.endpoint,\n value,\n data: encodeFunctionData({\n abi: ENDPOINT_ABI,\n functionName: \"lzReceive\",\n args: [{srcEid: src.eid, sender: pad(getAddress(src.oft), {size: 32}), nonce: BigInt(nonce as number)}, getAddress(dst.oft), guid, message, \"0x\"],\n }),\n chainId: dst.chainId,\n gasLimit: GAS_CLAIM,\n };\n },\n };\n}\n\n/** Exported for tests and diagnostics: the LayerZero Scan status → swap2 state mapping. */\nexport const USDT0_STATUS_MAP: Readonly<Record<string, IntentState>> = Object.freeze({\n INFLIGHT: \"pending\", CONFIRMING: \"pending\", BLOCKED: \"pending\",\n DELIVERED: \"completed\", PAYLOAD_STORED: \"action-required\",\n FAILED: \"failed\", APPLICATION_BURNED: \"failed\", APPLICATION_SKIPPED: \"failed\", UNRESOLVABLE_COMMAND: \"failed\", MALFORMED_COMMAND: \"failed\",\n});\n\nexport {ZERO_B32 as USDT0_ZERO_PEER};\n","/**\n * Activity recognition for USDT0 on every chain in `config.ts`:\n * - `send(...)` on the chain's OFT is our source leg (\"Bridged USDT0\", or\n * \"Bridged USDT\" on Ethereum where the adapter locks plain USDT);\n * - the inbound leg is the executor's delivery — the user signs nothing, so\n * it is recognized by its effect: the chain's USDT0 minted to the owner\n * (from the zero address), or USDT released by the Ethereum adapter to the\n * owner, inside a transaction that did NOT call the token itself (a plain\n * transfer is not a bridge);\n * - `lzReceive` on the LayerZero endpoint is the owner's own retry of a\n * stored payload (`claimSwap2`).\n */\nimport type {ActivityItem, ChainTx, DescribeActivityContext} from \"@anywalletkit/core\";\nimport {calledContract, chainLabel, describeSwapLike, matchesCall} from \"@anywalletkit/protocol-swap2-core/activity\";\nimport {decodeFunctionData, parseAbi, type Hex} from \"viem\";\nimport {USDT0_BY_EID, USDT0_CHAINS, type Usdt0Chain} from \"./config.js\";\n\nconst SEND_ABI = parseAbi([\n \"struct SendParam { uint32 dstEid; bytes32 to; uint256 amountLD; uint256 minAmountLD; bytes extraOptions; bytes composeMsg; bytes oftCmd; }\",\n \"struct MessagingFee { uint256 nativeFee; uint256 lzTokenFee; }\",\n \"function send(SendParam sp, MessagingFee fee, address refundAddress)\",\n]);\n\nexport const USDT0_MODULE = \"@anywalletkit/protocol-swap2-usdt0\";\n\n/** send((uint32,bytes32,uint256,uint256,bytes,bytes,bytes),(uint256,uint256),address) — IOFT */\nexport const USDT0_SEND = \"0xc7c7f5b3\";\n/** lzReceive((uint32,bytes32,uint64),address,bytes32,bytes,bytes) — EndpointV2 */\nexport const LZ_RECEIVE = \"0x0c0c389e\";\n\nconst ZERO = \"0x0000000000000000000000000000000000000000\";\n\n/** The symbol the catalog uses on each deployment: USDT where the OFT wraps Tether's USDT, USDT0 elsewhere. */\nfunction symbolFor(chain: Usdt0Chain): string {\n return chain.adapter || [42161, 10, 137].includes(chain.chainId) ? \"USDT\" : \"USDT0\";\n}\n\n/** `send(SendParam, …)` → the destination deployment (dstEid is the first word of the tuple), null when the calldata is absent or foreign. */\nfunction sendDestination(tx: ChainTx): Usdt0Chain | null {\n const data = tx.call?.data;\n if (!data || data.length < 10 + 64 * 2) return null;\n try {\n const [sp] = decodeFunctionData({abi: SEND_ABI, data: data as Hex}).args as unknown as [{dstEid: number}];\n return USDT0_BY_EID[sp.dstEid] ?? null;\n } catch {\n return null;\n }\n}\nconst lc = (a: string) => a.toLowerCase();\n\nexport function describeUsdt0Activity(tx: ChainTx, ctx: DescribeActivityContext): ActivityItem | null {\n const chain = USDT0_CHAINS[tx.chain];\n if (!chain) return null;\n const subtitle = `USDT0 · ${chainLabel(tx.chain)}`;\n if (matchesCall(tx, [chain.oft], [USDT0_SEND])) {\n // The native value is the LayerZero messaging fee (plus the headroom the\n // endpoint refunds), not an asset the owner swapped away: it rides in `fee`\n // next to the gas, and the title names both ends when the calldata says\n // where the tokens go.\n const dst = sendDestination(tx);\n const item = describeSwapLike(tx, ctx, {protocol: USDT0_MODULE, subtitle, kind: \"bridge\", outVerb: \"Bridged\"});\n if (!item) return null;\n const native = item.assetsOut.filter((a) => a.token === null).reduce((sum, a) => sum + a.amount, 0n);\n item.assetsOut = item.assetsOut.filter((a) => a.token !== null);\n if (native > 0n) item.fee = (item.fee ?? 0n) + native;\n const srcSym = item.assetsOut[0]?.symbol ?? symbolFor(chain);\n if (dst) {\n item.title = `Bridged ${srcSym} → ${symbolFor(dst)}`;\n item.subtitle = `USDT0 · ${chainLabel(tx.chain)} → ${dst.name}`;\n } else item.title = `Bridged ${srcSym}`;\n return item;\n }\n if (matchesCall(tx, [chain.endpoint], [LZ_RECEIVE])) {\n return describeSwapLike(tx, ctx, {protocol: USDT0_MODULE, subtitle, kind: \"bridge\", inSuffix: \"via LayerZero\"});\n }\n // Delivery by the LayerZero executor: the token moves out of nowhere (mint)\n // or out of the adapter into the owner, and the call target is not the token.\n const called = calledContract(tx);\n if (called && called === lc(chain.token)) return null;\n const own = new Set([...ctx.own].map(lc));\n const origin = chain.adapter ? lc(chain.oft) : ZERO;\n const delivered = tx.transfers.some((t) => t.token !== null && lc(t.token) === lc(chain.token) && lc(t.from) === origin && own.has(lc(t.to)));\n if (!delivered || own.has(lc(tx.from))) return null;\n return describeSwapLike(tx, ctx, {protocol: USDT0_MODULE, subtitle, kind: \"bridge\", inSuffix: \"via LayerZero\", counterparty: chain.oft});\n}\n"],"mappings":"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","names":["import_viem","import_util","c"]}
1
+ {"version":3,"sources":["../src/protocol.ts","../src/config.ts","../src/provider.ts","../src/activity.ts"],"sourcesContent":["import {SingleProviderSwap2} from \"@anywalletkit/protocol-swap2-core/swap2/single\";\nimport type {Swap2Account, Swap2EngineConfig} from \"@anywalletkit/protocol-swap2-core/swap2/base\";\nimport {usdt0 as usdt0Cfg} from \"./config.js\";\nimport {usdt0Provider, type Usdt0ProviderConfig} from \"./provider.js\";\n\nexport interface Usdt0Swap2Config extends Swap2EngineConfig, Usdt0ProviderConfig {}\n\n/** Standalone USDT0 swap2: USDT / USDT0 between the LayerZero OFT deployments in one source transaction. */\nexport class Usdt0Swap2Protocol extends SingleProviderSwap2 {\n protected readonly provider;\n constructor(account: Swap2Account | undefined, config: Usdt0Swap2Config) {\n super(account, config);\n this.provider = usdt0Provider(config);\n }\n protected override chainSupported(caip2: string): boolean {\n return usdt0Cfg.supportsChain(caip2);\n }\n protected override pairSupported(fromChain: string, toChain: string): boolean {\n return usdt0Cfg.supports(fromChain, toChain);\n }\n}\n","// USDT0 — Tether's LayerZero OFT for USDT. Source: docs.usdt0.to\n// (technical-documentation/deployments, read 2026-10-20) — every row below was\n// then re-read on-chain over public RPCs the same day: the OFT's `token()` is\n// the listed token, `endpoint()` is the listed endpoint (and reports the\n// listed eid), `approvalRequired()` is true only for the Ethereum adapter,\n// `sharedDecimals()` = 6 everywhere, and `peers(eid)` are wired between the\n// chains. `oftVersion()` = (0x02e49c2c, 1) on all of them.\n//\n// Only chains the SDK ships (swap2-assets / wallet-evm) are listed. USDT0 is\n// also deployed on Conflux eSpace (1030, eid 30212), Flare (14, 30295),\n// Hedera (295, 30316), Mantle (5000, 30181), Morph (2818, 30322), Rootstock\n// (30, 30333), Stable (988, 30396), Tempo (4217, 30410), plus HyperCore, IOTA\n// and Stellar (non-EVM) — not wallet chains here, so not routable here.\nimport type {RemotePins} from \"@anywalletkit/protocol-swap2-core/types\";\nimport {evmRef, isEvm} from \"@anywalletkit/protocol-swap2-core/util\";\n\nexport interface Usdt0Chain {\n caip2: string;\n chainId: number;\n /** LayerZero V2 endpoint id. */\n eid: number;\n name: string;\n /** The ERC-20 the user holds: USDT on Ethereum, USDT0 elsewhere (6 decimals everywhere). */\n token: string;\n /**\n * The OFT contract `quoteSend` / `send` are called on. On Ethereum it is the\n * OFT *adapter* that locks USDT (`approvalRequired()` = true, approve the\n * token to it); elsewhere it is the OUpgradeable OFT that burns the caller's\n * USDT0 through the token's mint/burn role — no approval.\n */\n oft: string;\n /** LayerZero V2 EndpointV2 on that chain (`lzReceive` retries of a stored payload go here). */\n endpoint: string;\n /** True on Ethereum: the OFT is a lockbox adapter in front of plain USDT. */\n adapter: boolean;\n}\n\nconst LZ_ENDPOINT_A = \"0x1a44076050125825900e736c501f859c50fE728c\";\nconst LZ_ENDPOINT_B = \"0x6F475642a6e85809B1c36Fa62763669b1b48DD5B\";\n\nconst c = (chainId: number, eid: number, name: string, token: string, oft: string, endpoint: string, adapter = false): Usdt0Chain => ({\n caip2: `eip155:${chainId}`, chainId, eid, name, token, oft, endpoint, adapter,\n});\n\n/** CAIP-2 → USDT0 deployment. */\nexport const USDT0_CHAINS: Readonly<Record<string, Usdt0Chain>> = Object.freeze(Object.fromEntries([\n c(1, 30101, \"Ethereum\", \"0xdAC17F958D2ee523a2206206994597C13D831ec7\", \"0x6C96dE32CEa08842dcc4058c14d3aaAD7Fa41dee\", LZ_ENDPOINT_A, true),\n c(42161, 30110, \"Arbitrum\", \"0xFd086bC7CD5C481DCC9C85ebE478A1C0b69FCbb9\", \"0x14E4A1B13bf7F943c8ff7C51fb60FA964A298D92\", LZ_ENDPOINT_A),\n c(10, 30111, \"OP Mainnet\", \"0x01bFF41798a0BcF287b996046Ca68b395DbC1071\", \"0xF03b4d9AC1D5d1E7c4cEf54C2A313b9fe051A0aD\", LZ_ENDPOINT_A),\n c(137, 30109, \"Polygon PoS\", \"0xc2132D05D31c914a87C6611C10748AEb04B58e8F\", \"0x6BA10300f0DC58B7a1e4c0e41f5daBb7D7829e13\", LZ_ENDPOINT_A),\n c(999, 30367, \"HyperEVM\", \"0xB8CE59FC3717ada4C02eaDF9682A9e934F625ebb\", \"0x904861a24F30EC96ea7CFC3bE9EA4B476d237e98\", \"0x3A73033C0b1407574C76BdBAc67f126f6b4a9AA9\"),\n c(57073, 30339, \"Ink\", \"0x0200C29006150606B650577BBE7B6248F58470c1\", \"0x1cB6De532588fCA4a21B7209DE7C456AF8434A65\", \"0xca29f3A6f966Cb2fc0dE625F8f325c0C46dbE958\"),\n c(80094, 30362, \"Berachain\", \"0x779Ded0c9e1022225f8E0630b35a9b54bE713736\", \"0x3Dc96399109df5ceb2C226664A086140bD0379cB\", LZ_ENDPOINT_B),\n c(130, 30320, \"Unichain\", \"0x9151434b16b9763660705744891fA906F660EcC5\", \"0xc07bE8994D035631c36fb4a89C918CeFB2f03EC3\", LZ_ENDPOINT_B),\n c(1329, 30280, \"Sei\", \"0x9151434b16b9763660705744891fA906F660EcC5\", \"0x56Fe74A2e3b484b921c447357203431a3485CC60\", LZ_ENDPOINT_A),\n c(9745, 30383, \"Plasma\", \"0xB8CE59FC3717ada4C02eaDF9682A9e934F625ebb\", \"0x02ca37966753bDdDf11216B73B16C1dE756A7CF9\", LZ_ENDPOINT_B),\n c(143, 30390, \"Monad\", \"0xe7cd86e13AC4309349F30B3435a9d337750fC82D\", \"0x9151434b16b9763660705744891fA906F660EcC5\", LZ_ENDPOINT_B),\n c(4326, 30398, \"MegaETH\", \"0xB8CE59FC3717ada4C02eaDF9682A9e934F625ebb\", \"0x9151434b16b9763660705744891fA906F660EcC5\", LZ_ENDPOINT_B),\n c(196, 30274, \"X Layer\", \"0x779Ded0c9e1022225f8E0630b35a9b54bE713736\", \"0x94bcCa6BdfD6a61817aB0E960BfedE4984505554\", LZ_ENDPOINT_A),\n // 2026-10-20 (evm-chains-6 batch): docs.usdt0.to deployments, re-read on-chain (token(), approvalRequired() = false,\n // sharedDecimals() = 6, endpoint(), peers(30110) = the Arbitrum OFT).\n c(5000, 30181, \"Mantle\", \"0x779Ded0c9e1022225f8E0630b35a9b54bE713736\", \"0xcb768e263FB1C62214E7cab4AA8d036D76dc59CC\", LZ_ENDPOINT_A),\n c(2818, 30322, \"Morph\", \"0xe7cd86e13AC4309349F30B3435a9d337750fC82D\", \"0xcb768e263FB1C62214E7cab4AA8d036D76dc59CC\", LZ_ENDPOINT_B),\n c(14, 30295, \"Flare\", \"0xe7cd86e13AC4309349F30B3435a9d337750fC82D\", \"0x567287d2A9829215a37e3B88843d32f9221E7588\", LZ_ENDPOINT_A),\n].map((x) => [x.caip2, x])));\n\n/** LayerZero eid → deployment. */\nexport const USDT0_BY_EID: Readonly<Record<number, Usdt0Chain>> = Object.freeze(\n Object.fromEntries(Object.values(USDT0_CHAINS).map((x) => [x.eid, x])),\n);\n\n/** LayerZero Scan — message status by source transaction hash. */\nexport const LZ_SCAN_API = \"https://scan.layerzero-api.com\";\n\n/** Token symbols the catalog uses for the same asset across chains. */\nexport const USDT0_SYMBOLS: readonly string[] = Object.freeze([\"USDT0\", \"USDT\", \"USD₮0\", \"USD₮\"]);\n\nexport const usdt0 = {\n supportsChain(chain: string): boolean {\n return isEvm(chain) && !!USDT0_CHAINS[`eip155:${evmRef(chain)}`];\n },\n supports(from: string, to: string): boolean {\n return from !== to && this.supportsChain(from) && this.supportsChain(to);\n },\n};\n\n/**\n * The USDT0 OFT a send calls on a chain, and the adapter it approves where one locks USDT (Ethereum) —\n * the app's pins for `remoteProvider({name: \"usdt0\", baseUrl, ...usdt0Pins})` (scan 2026-10-27 modules, F8/F16).\n */\nexport const usdt0Pins: RemotePins = Object.freeze({\n callTargets: (chain: string): readonly string[] => { const c = usdt0ChainFor(chain); return c ? [c.oft] : []; },\n spenders: (chain: string): readonly string[] => { const c = usdt0ChainFor(chain); return c?.adapter ? [c.oft] : []; },\n});\nfunction usdt0ChainFor(chain: string): Usdt0Chain | undefined {\n return Object.prototype.hasOwnProperty.call(USDT0_CHAINS, chain) ? USDT0_CHAINS[chain] : undefined;\n}\n","import {createPublicClient, encodeFunctionData, fallback, getAddress, http, isAddress, pad, parseAbi, type Hex} from \"viem\";\nimport {describeUsdt0Activity} from \"./activity.js\";\nimport {ccAsset} from \"@anywalletkit/swap2-assets\";\nimport {redactUrls, timeoutSignal} from \"@anywalletkit/protocol-swap2-core/util\";\nimport type {Asset, CrossChainProvider, IntentRef, IntentState, IntentStatus, Quote, QuoteParams, UnsignedTx} from \"@anywalletkit/protocol-swap2-core/types\";\nimport {LZ_SCAN_API, USDT0_BY_EID, USDT0_CHAINS, USDT0_SYMBOLS, usdt0 as usdt0Cfg, type Usdt0Chain} from \"./config.js\";\n\n/**\n * USDT0 — Tether's USDT as a LayerZero OFT. ONE source transaction:\n * `send(SendParam, MessagingFee, refund)` on the chain's OFT with the\n * LayerZero messaging fee as `msg.value`; LayerZero's DVNs verify and the\n * executor delivers on the destination (mint of USDT0, or unlock of USDT out\n * of the Ethereum adapter). No second user transaction in the normal case.\n *\n * - Quote = two `eth_call`s on the source OFT: `quoteOFT` for the limits,\n * protocol fees and the amount that really arrives after dust removal\n * (shared decimals = 6, so none today), then `quoteSend` for the native\n * fee with `minAmountLD` pinned to that received amount — the contract\n * reverts rather than deliver less. Both are sealed into the quote.\n * - `enforcedOptions` on every deployment already carry the executor gas\n * (type-3 options, lzReceive gas 80 000, read on-chain 2026-10-20), so\n * `extraOptions` stays empty; LayerZero Scan confirms deliveries ran on it.\n * - Ethereum locks USDT in an adapter (`approvalRequired()` = true →\n * `approvalAddress`); every other chain's OFT burns the caller's USDT0\n * itself (`approvalRequired()` = false → no approval at all).\n * - Every address in `config.ts` is re-read on-chain before the first quote\n * on a chain (`token()`, `approvalRequired()`) and per pair (`peers(dstEid)`\n * must be the destination OFT) — a mismatch refuses the route.\n * - Status: LayerZero Scan by source hash. DELIVERED carries the destination\n * hash; PAYLOAD_STORED (delivery reverted on the destination, funds safe)\n * becomes \"action-required\" with a `buildClaim` that retries\n * `EndpointV2.lzReceive` — anyone may call it, so the user can.\n */\n\nconst OFT_ABI = parseAbi([\n \"struct SendParam { uint32 dstEid; bytes32 to; uint256 amountLD; uint256 minAmountLD; bytes extraOptions; bytes composeMsg; bytes oftCmd; }\",\n \"struct MessagingFee { uint256 nativeFee; uint256 lzTokenFee; }\",\n \"struct OFTLimit { uint256 minAmountLD; uint256 maxAmountLD; }\",\n \"struct OFTFeeDetail { int256 feeAmountLD; string description; }\",\n \"struct OFTReceipt { uint256 amountSentLD; uint256 amountReceivedLD; }\",\n \"struct MessagingReceipt { bytes32 guid; uint64 nonce; MessagingFee fee; }\",\n \"function quoteSend(SendParam s, bool payInLzToken) view returns (MessagingFee)\",\n \"function quoteOFT(SendParam s) view returns (OFTLimit, OFTFeeDetail[], OFTReceipt)\",\n \"function send(SendParam s, MessagingFee fee, address refundAddress) payable returns (MessagingReceipt, OFTReceipt)\",\n \"function token() view returns (address)\",\n \"function approvalRequired() view returns (bool)\",\n \"function peers(uint32 eid) view returns (bytes32)\",\n]);\nconst ENDPOINT_ABI = parseAbi([\n \"struct Origin { uint32 srcEid; bytes32 sender; uint64 nonce; }\",\n \"function lzReceive(Origin origin, address receiver, bytes32 guid, bytes message, bytes extraData) payable\",\n]);\n\nconst EVM_PLACEHOLDER = \"0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045\";\nconst DEFAULT_QUOTE_TTL_MS = 60_000;\nconst RPC_TIMEOUT_MS = 12_000;\nconst SCAN_TIMEOUT_MS = 12_000;\n/** A direct `send` used ~330k gas on Arbitrum and on the Ethereum adapter (2026-10-20 receipts). */\nconst GAS_SEND = \"450000\";\n/**\n * The LayerZero fee is quoted at quote time but paid at send time, and it moves\n * with source and destination gas (live: +1.7 % within a minute on Ethereum).\n * The sealed `msg.value` carries this headroom; EndpointV2 charges the current\n * fee and refunds the surplus to `refundAddress` (the trader) in the same\n * transaction, so the headroom costs nothing — it only avoids a re-quote.\n */\nconst FEE_HEADROOM_BPS = 2_500n;\n/** `lzReceive` retry of a stored payload: a mint plus the endpoint bookkeeping. */\nconst GAS_CLAIM = \"300000\";\nconst ZERO_B32 = `0x${\"00\".repeat(32)}` as Hex;\n\nexport interface Usdt0ProviderConfig {\n enabled?: boolean;\n /**\n * JSON-RPC URL(s) per CAIP-2 chain. REQUIRED for every chain the provider\n * should quote from: the fee and the received amount come from the OFT\n * itself. The destination RPC is optional (used for the stored-payload retry).\n */\n rpcUrls?: Readonly<Record<string, string | readonly string[]>>;\n /** LayerZero Scan base (default https://scan.layerzero-api.com). */\n scanUrl?: string;\n /** Local lifetime of a quote (default 60 s; the sealed fee is re-checked at preflight). */\n quoteTtlMs?: number;\n /** Injectable for tests (also used by the RPC transport). */\n fetchImpl?: typeof fetch;\n}\n\ninterface ScanMessage {\n pathway?: {srcEid?: number; dstEid?: number; sender?: {address?: string}; receiver?: {address?: string}; nonce?: number};\n source?: {status?: string; tx?: {txHash?: string; payload?: string; options?: {lzReceive?: {gas?: string; value?: string}}}};\n destination?: {status?: string; tx?: {txHash?: string}};\n guid?: string;\n status?: {name?: string; message?: string};\n}\n\nconst same = (a: string | undefined | null, b: string) => !!a && a.toLowerCase() === b.toLowerCase();\nconst isHexData = (v: unknown): v is Hex => typeof v === \"string\" && /^0x(?:[0-9a-fA-F]{2})*$/.test(v);\n\n/** Does the catalog symbol on `chain` name this deployment's token? (USDT on Ethereum/Polygon, USDT0 elsewhere.) */\nfunction tokenMatches(chain: Usdt0Chain, symbolOrAddress: string): boolean {\n if (symbolOrAddress.startsWith(\"0x\")) return same(symbolOrAddress, chain.token);\n if (!USDT0_SYMBOLS.includes(symbolOrAddress.toUpperCase().replace(\"USD₮\", \"USDT\"))) return false;\n const known = ccAsset(chain.caip2, symbolOrAddress);\n // A symbol the catalog binds to another contract (OP's legacy bridged USDT) is not the OFT token.\n return !known || same(known.contract ?? \"\", chain.token);\n}\n\n/**\n * A refusal / preflight error that may reach a client: an RPC transport failure\n * becomes a fixed reason (viem's HTTP / timeout errors carry `URL: …`, and a keyed\n * endpoint's key sits in that path — scan 2026-10-23 F8); anything else loses its URLs.\n */\nfunction rpcSafeReason(err: unknown, chainName: string): string {\n const e = err as {name?: string; shortMessage?: string; message?: string} | undefined;\n const text = `${e?.shortMessage ?? \"\"}\\n${e?.message ?? String(err)}`;\n if (/HttpRequestError|TimeoutError|RpcRequestError|WebSocketRequestError/.test(String(e?.name)) || /\\bURL: |HTTP request failed|request timed out|took too long to respond/i.test(text)) {\n return `usdt0: RPC for ${chainName} unavailable — try again`;\n }\n return redactUrls(err instanceof Error ? err.message : String(err));\n}\n\nexport function usdt0Provider(config: Usdt0ProviderConfig = {}): CrossChainProvider {\n config = Object.freeze({...config});\n const scan = (config.scanUrl ?? LZ_SCAN_API).replace(/\\/+$/, \"\");\n if (!/^https?:\\/\\//.test(scan)) throw new Error(\"usdt0: scanUrl must use http or https\");\n const quoteTtlMs = config.quoteTtlMs ?? DEFAULT_QUOTE_TTL_MS;\n if (!Number.isInteger(quoteTtlMs) || quoteTtlMs <= 0 || quoteTtlMs > 300_000) throw new Error(\"usdt0: quoteTtlMs must be an integer between 1 and 300000\");\n const rpcUrls = Object.freeze({...(config.rpcUrls ?? {})});\n const doFetch: typeof fetch = (input, init) => (config.fetchImpl ?? fetch)(input, init);\n\n const client = (caip2: string) => {\n const raw = rpcUrls[caip2];\n const urls = typeof raw === \"string\" ? [raw] : [...(raw ?? [])];\n if (urls.length === 0) return null;\n const opts = {timeout: RPC_TIMEOUT_MS, ...(config.fetchImpl ? {fetchFn: config.fetchImpl} : {})} as never;\n return createPublicClient({transport: urls.length === 1 ? http(urls[0], opts) : fallback(urls.map((u) => http(u, opts))), ccipRead: false});\n };\n\n /** Once per chain: the OFT really is the OFT of the listed token with the listed approval mode. */\n const verified = new Map<string, Promise<void>>();\n function verifyChain(chain: Usdt0Chain): Promise<void> {\n let p = verified.get(chain.caip2);\n if (!p) {\n p = (async () => {\n const c = client(chain.caip2);\n if (!c) throw new Error(`usdt0: no RPC for ${chain.caip2}`);\n const [token, approval] = await Promise.all([\n c.readContract({address: getAddress(chain.oft), abi: OFT_ABI, functionName: \"token\"}),\n c.readContract({address: getAddress(chain.oft), abi: OFT_ABI, functionName: \"approvalRequired\"}),\n ]);\n if (!same(token, chain.token)) throw new Error(`usdt0: OFT ${chain.oft} on ${chain.name} reports token ${token}, expected ${chain.token}`);\n if (approval !== chain.adapter) throw new Error(`usdt0: OFT ${chain.oft} on ${chain.name} reports approvalRequired=${String(approval)}, expected ${String(chain.adapter)}`);\n })();\n p.catch(() => verified.delete(chain.caip2));\n verified.set(chain.caip2, p);\n }\n return p;\n }\n\n /** Once per pair: the source OFT's peer for the destination eid is the destination OFT. */\n const peers = new Map<string, Promise<void>>();\n function verifyPeer(src: Usdt0Chain, dst: Usdt0Chain): Promise<void> {\n const key = `${src.eid}>${dst.eid}`;\n let p = peers.get(key);\n if (!p) {\n p = (async () => {\n const c = client(src.caip2);\n if (!c) throw new Error(`usdt0: no RPC for ${src.caip2}`);\n const peer = await c.readContract({address: getAddress(src.oft), abi: OFT_ABI, functionName: \"peers\", args: [dst.eid]});\n if (!same(peer, pad(getAddress(dst.oft), {size: 32}))) throw new Error(`usdt0: ${src.name} OFT has no peer for ${dst.name} (eid ${dst.eid}) — route not wired`);\n })();\n p.catch(() => peers.delete(key));\n peers.set(key, p);\n }\n return p;\n }\n\n function parseIntent(intentId: string): {src: Usdt0Chain; dst: Usdt0Chain} | null {\n const [tag, s, d] = intentId.split(\":\");\n if (tag !== \"usdt0\") return null;\n const src = USDT0_BY_EID[Number(s)];\n const dst = USDT0_BY_EID[Number(d)];\n return src && dst && src !== dst ? {src, dst} : null;\n }\n\n const sendParam = (dstEid: number, recipient: string, amountLD: bigint, minAmountLD: bigint) => ({\n dstEid, to: pad(getAddress(recipient), {size: 32}), amountLD, minAmountLD, extraOptions: \"0x\" as Hex, composeMsg: \"0x\" as Hex, oftCmd: \"0x\" as Hex,\n });\n\n /** The LayerZero message of a source transaction on this route, or null while Scan has not indexed it. */\n async function scanMessage(src: Usdt0Chain, dst: Usdt0Chain, sourceTxHash: string): Promise<ScanMessage | null | \"foreign\"> {\n const res = await doFetch(`${scan}/v1/messages/tx/${encodeURIComponent(sourceTxHash)}`, {headers: {accept: \"application/json\"}, signal: timeoutSignal(SCAN_TIMEOUT_MS)});\n if (res.status === 404) return null;\n if (!res.ok) throw new Error(`usdt0: LayerZero Scan → ${res.status}`);\n const body = (await res.json()) as {data?: ScanMessage[]};\n const list = Array.isArray(body?.data) ? body.data : [];\n if (list.length === 0) return null;\n const m = list.find((x) => x.pathway?.srcEid === src.eid && x.pathway?.dstEid === dst.eid && same(x.pathway?.sender?.address, src.oft));\n return m ?? \"foreign\";\n }\n\n return {\n name: \"usdt0\",\n describeActivity: describeUsdt0Activity,\n enabled: () => config.enabled ?? true,\n supportsChain: (chain: string) => usdt0Cfg.supportsChain(chain) && client(chain) !== null,\n supportsChainPair: (from: string, to: string) => usdt0Cfg.supports(from, to) && client(from) !== null,\n supportsRoute(from: Asset, to: Asset): boolean {\n const src = USDT0_CHAINS[from.chain];\n const dst = USDT0_CHAINS[to.chain];\n if (!src || !dst || src === dst || client(from.chain) === null) return false;\n return tokenMatches(src, from.token) && tokenMatches(dst, to.token);\n },\n\n async getQuote(params: QuoteParams, signal?: AbortSignal): Promise<Quote | null> {\n const refuse = (reason: string) => { params.onRefusal?.(reason); return null; };\n if (params.flex) return refuse(\"the amount is sealed into the calldata (no flexible deposits)\");\n const src = USDT0_CHAINS[params.sourceChain];\n const dst = USDT0_CHAINS[params.destChain];\n if (!src || !dst) return refuse(\"USDT0 is not deployed on this chain\");\n if (src === dst) return refuse(\"same-chain transfers are not a bridge\");\n if (!tokenMatches(src, params.sourceToken)) return refuse(`source token ${params.sourceToken} is not USDT0 (${src.token}) on ${src.name}`);\n if (!tokenMatches(dst, params.destToken)) return refuse(`destination token ${params.destToken} is not USDT0 (${dst.token}) on ${dst.name}`);\n if (!/^\\d+$/.test(params.amountIn)) return refuse(\"amount must be a base-unit integer\");\n const amount = BigInt(params.amountIn);\n if (amount <= 0n) return refuse(\"amount must be positive\");\n // The placeholder prices a dry quote; a live one without addresses would send there (round 3, H8).\n const dry = params.dry !== false;\n const recipient = params.destAddress || (dry ? EVM_PLACEHOLDER : \"\");\n if (!recipient) return refuse(\"a live quote needs a recipient\");\n if (!isAddress(recipient)) return refuse(\"destination must be an EVM address\");\n const refund = params.refundAddress || (dry ? EVM_PLACEHOLDER : \"\");\n if (!refund) return refuse(\"a live quote needs a refund address\");\n if (!isAddress(refund)) return refuse(\"refund address must be an EVM address\");\n const c = client(src.caip2);\n if (!c) return refuse(`no RPC configured for ${src.caip2}`);\n\n try {\n await Promise.all([verifyChain(src), verifyPeer(src, dst)]);\n const probe = sendParam(dst.eid, recipient, amount, 0n);\n const [limit, feeDetails, receipt] = await c.readContract({address: getAddress(src.oft), abi: OFT_ABI, functionName: \"quoteOFT\", args: [probe]});\n if (amount < limit.minAmountLD) return refuse(`amount ${amount} is below the OFT minimum ${limit.minAmountLD}`);\n if (amount > limit.maxAmountLD) return refuse(`amount ${amount} exceeds the OFT maximum ${limit.maxAmountLD}`);\n const received = receipt.amountReceivedLD;\n if (received <= 0n) return refuse(\"amount is below the OFT dust threshold — nothing would arrive\");\n if (received > amount) return refuse(\"OFT reports more received than sent — refusing\");\n if (params.minAmountOut !== undefined && received < BigInt(params.minAmountOut)) return refuse(`received ${received} is below the caller's floor ${params.minAmountOut}`);\n const sp = sendParam(dst.eid, recipient, amount, received);\n const fee = await c.readContract({address: getAddress(src.oft), abi: OFT_ABI, functionName: \"quoteSend\", args: [sp, false]});\n if (fee.lzTokenFee !== 0n) return refuse(\"OFT asks for a fee in LZ token — unsupported\");\n // Sealed with headroom: OAppSender requires msg.value == MessagingFee.nativeFee, the\n // endpoint refunds whatever the current fee does not use to `refund`.\n const nativeFee = fee.nativeFee + (fee.nativeFee * FEE_HEADROOM_BPS) / 10_000n;\n const data = encodeFunctionData({abi: OFT_ABI, functionName: \"send\", args: [sp, {nativeFee, lzTokenFee: 0n}, getAddress(refund)]});\n const protocolFees = feeDetails\n .filter((f) => f.feeAmountLD > 0n)\n .map((f) => ({type: \"protocol\" as const, amount: f.feeAmountLD.toString(), token: src.token, included: true, description: f.description || \"OFT fee\"}));\n const feeUsd = protocolFees.reduce((a, f) => a + Number(f.amount) / 1e6, 0);\n // Ethereum sources wait for 60 confirmations before the DVNs attest (~15 min live); L2 sources land in a few minutes.\n const eta = src.chainId === 1 ? 1000 : 240;\n return {\n provider: \"usdt0\",\n intentId: `usdt0:${src.eid}:${dst.eid}`,\n depositAddress: \"\",\n depositMemo: null,\n txRequest: {\n to: src.oft,\n data,\n value: nativeFee.toString(),\n chainId: src.chainId,\n gasLimit: GAS_SEND,\n ...(src.adapter ? {approvalAddress: src.oft} : {}),\n ...(nativeFee > 0n ? {nativeFee: nativeFee.toString()} : {}),\n },\n sourceAmount: amount.toString(),\n destAmount: received.toString(),\n minDestAmount: received.toString(),\n feeUsd,\n fees: protocolFees,\n etaSeconds: eta,\n reliability: 0.98,\n validUntilMs: Date.now() + quoteTtlMs,\n providerData: {\n srcEid: String(src.eid), dstEid: String(dst.eid), oft: src.oft, token: src.token, recipient: getAddress(recipient), refundAddress: getAddress(refund),\n amountLD: amount.toString(), minAmountLD: received.toString(), nativeFee: nativeFee.toString(),\n },\n };\n } catch (err) {\n return refuse(rpcSafeReason(err, src.name));\n }\n },\n\n async buildDeposit(quote: Quote): Promise<UnsignedTx> {\n const tx = quote.txRequest;\n const parsed = parseIntent(quote.intentId);\n if (!tx || !parsed) throw new Error(\"swap2: USDT0 quote has no transaction request\");\n return {\n chain: parsed.src.caip2,\n to: tx.to ?? \"\",\n value: tx.value ?? \"0\",\n ...(tx.data ? {data: tx.data} : {}),\n ...(tx.chainId !== undefined ? {chainId: tx.chainId} : {}),\n ...(tx.gasLimit ? {gasLimit: tx.gasLimit} : {}),\n ...(tx.approvalAddress ? {approvalAddress: tx.approvalAddress} : {}),\n };\n },\n\n /**\n * Right before signing: the target is the source OFT, the peer is still the\n * destination OFT, and the CURRENT LayerZero fee still fits the sealed\n * `msg.value` (quote + headroom) — the endpoint reverts a send that\n * underpays, so a fee past the headroom means re-quote rather than a\n * wasted broadcast.\n */\n async preflightDeposit(quote: Quote, tx: UnsignedTx): Promise<void> {\n const parsed = parseIntent(quote.intentId);\n if (!parsed) throw new Error(\"usdt0: malformed intent id\");\n const {src, dst} = parsed;\n if (!same(tx.to, src.oft)) throw new Error(`usdt0: deposit target ${tx.to} is not the ${src.name} OFT`);\n const pd = quote.providerData ?? {};\n if (!/^\\d+$/.test(pd.amountLD ?? \"\") || !/^\\d+$/.test(pd.minAmountLD ?? \"\") || !/^\\d+$/.test(pd.nativeFee ?? \"\") || !isAddress(pd.recipient ?? \"\")) {\n throw new Error(\"usdt0: quote carries no sealed send parameters\");\n }\n const c = client(src.caip2);\n if (!c) throw new Error(`usdt0: no RPC for ${src.caip2}`);\n const sp = sendParam(dst.eid, pd.recipient!, BigInt(pd.amountLD!), BigInt(pd.minAmountLD!));\n let fee: {nativeFee: bigint};\n try {\n await Promise.all([verifyChain(src), verifyPeer(src, dst)]);\n fee = await c.readContract({address: getAddress(src.oft), abi: OFT_ABI, functionName: \"quoteSend\", args: [sp, false]});\n } catch (err) {\n throw new Error(rpcSafeReason(err, src.name));\n }\n const sealed = BigInt(pd.nativeFee!);\n if (fee.nativeFee > sealed) throw new Error(`usdt0: LayerZero fee rose to ${fee.nativeFee} above the sealed ${sealed} (quote + ${FEE_HEADROOM_BPS / 100n} % headroom) — re-quote`);\n if (BigInt(tx.value) !== sealed) throw new Error(`usdt0: transaction value ${tx.value} is not the quoted fee ${sealed}`);\n },\n\n async trackIntent(ref: IntentRef): Promise<IntentStatus> {\n const parsed = parseIntent(ref.intentId);\n if (!parsed) return {state: \"failed\"};\n const {src, dst} = parsed;\n if (!ref.sourceTxHash) return {state: \"pending\"};\n try {\n const m = await scanMessage(src, dst, ref.sourceTxHash);\n if (m === null) return {state: \"pending\", depositReceived: false};\n if (m === \"foreign\") return {state: \"failed\"}; // the hash carries a LayerZero message, but not ours\n const name = (m.status?.name ?? \"\").toUpperCase();\n const destHash = m.destination?.tx?.txHash;\n if (name === \"DELIVERED\") return {state: \"completed\", depositReceived: true, ...(destHash ? {destTxHash: destHash} : ref.destTxHash ? {destTxHash: ref.destTxHash} : {})};\n if (name === \"PAYLOAD_STORED\") return {state: \"action-required\", depositReceived: true, claim: {chain: dst.caip2, ready: true}};\n if ([\"FAILED\", \"APPLICATION_BURNED\", \"APPLICATION_SKIPPED\", \"UNRESOLVABLE_COMMAND\", \"MALFORMED_COMMAND\"].includes(name)) return {state: \"failed\", depositReceived: true};\n // INFLIGHT, CONFIRMING, BLOCKED (an earlier nonce on the pathway is stuck — LayerZero clears it), or anything new.\n return {state: \"pending\", depositReceived: true};\n } catch {\n return {state: \"pending\"};\n }\n },\n\n /**\n * A delivery that reverted on the destination (PAYLOAD_STORED — out of\n * executor gas, paused token) is retried by anyone through the endpoint:\n * `lzReceive(origin, receiver, guid, message, extraData)` with the exact\n * packet LayerZero Scan recorded. Null while nothing is stored.\n */\n async buildClaim(ref: IntentRef): Promise<UnsignedTx | null> {\n const parsed = parseIntent(ref.intentId);\n if (!parsed || !ref.sourceTxHash) return null;\n const {src, dst} = parsed;\n const m = await scanMessage(src, dst, ref.sourceTxHash);\n if (!m || m === \"foreign\" || (m.status?.name ?? \"\").toUpperCase() !== \"PAYLOAD_STORED\") return null;\n const nonce = m.pathway?.nonce;\n const guid = m.guid;\n const message = m.source?.tx?.payload;\n if (!Number.isInteger(nonce) || !isHexData(guid) || guid.length !== 66 || !isHexData(message) || message.length <= 2) {\n throw new Error(\"usdt0: LayerZero Scan has no complete packet for the stored payload\");\n }\n if (!same(m.pathway?.receiver?.address, dst.oft)) throw new Error(\"usdt0: stored payload is addressed to another receiver\");\n const valueRaw = m.source?.tx?.options?.lzReceive?.value ?? \"0\";\n const value = /^\\d+$/.test(valueRaw) ? valueRaw : \"0\";\n return {\n chain: dst.caip2,\n to: dst.endpoint,\n value,\n data: encodeFunctionData({\n abi: ENDPOINT_ABI,\n functionName: \"lzReceive\",\n args: [{srcEid: src.eid, sender: pad(getAddress(src.oft), {size: 32}), nonce: BigInt(nonce as number)}, getAddress(dst.oft), guid, message, \"0x\"],\n }),\n chainId: dst.chainId,\n gasLimit: GAS_CLAIM,\n };\n },\n };\n}\n\n/** Exported for tests and diagnostics: the LayerZero Scan status → swap2 state mapping. */\nexport const USDT0_STATUS_MAP: Readonly<Record<string, IntentState>> = Object.freeze({\n INFLIGHT: \"pending\", CONFIRMING: \"pending\", BLOCKED: \"pending\",\n DELIVERED: \"completed\", PAYLOAD_STORED: \"action-required\",\n FAILED: \"failed\", APPLICATION_BURNED: \"failed\", APPLICATION_SKIPPED: \"failed\", UNRESOLVABLE_COMMAND: \"failed\", MALFORMED_COMMAND: \"failed\",\n});\n\nexport {ZERO_B32 as USDT0_ZERO_PEER};\n","/**\n * Activity recognition for USDT0 on every chain in `config.ts`:\n * - `send(...)` on the chain's OFT is our source leg (\"Bridged USDT0\", or\n * \"Bridged USDT\" on Ethereum where the adapter locks plain USDT);\n * - the inbound leg is the executor's delivery — the user signs nothing, so\n * it is recognized by its effect: the chain's USDT0 minted to the owner\n * (from the zero address), or USDT released by the Ethereum adapter to the\n * owner, inside a transaction that did NOT call the token itself (a plain\n * transfer is not a bridge);\n * - `lzReceive` on the LayerZero endpoint is the owner's own retry of a\n * stored payload (`claimSwap2`).\n */\nimport type {ActivityItem, ChainTx, DescribeActivityContext} from \"@anywalletkit/core\";\nimport {calledContract, chainLabel, describeSwapLike, matchesCall} from \"@anywalletkit/protocol-swap2-core/activity\";\nimport {decodeFunctionData, parseAbi, type Hex} from \"viem\";\nimport {USDT0_BY_EID, USDT0_CHAINS, type Usdt0Chain} from \"./config.js\";\n\nconst SEND_ABI = parseAbi([\n \"struct SendParam { uint32 dstEid; bytes32 to; uint256 amountLD; uint256 minAmountLD; bytes extraOptions; bytes composeMsg; bytes oftCmd; }\",\n \"struct MessagingFee { uint256 nativeFee; uint256 lzTokenFee; }\",\n \"function send(SendParam sp, MessagingFee fee, address refundAddress)\",\n]);\n\nexport const USDT0_MODULE = \"@anywalletkit/protocol-swap2-usdt0\";\n\n/** send((uint32,bytes32,uint256,uint256,bytes,bytes,bytes),(uint256,uint256),address) — IOFT */\nexport const USDT0_SEND = \"0xc7c7f5b3\";\n/** lzReceive((uint32,bytes32,uint64),address,bytes32,bytes,bytes) — EndpointV2 */\nexport const LZ_RECEIVE = \"0x0c0c389e\";\n\nconst ZERO = \"0x0000000000000000000000000000000000000000\";\n\n/** The symbol the catalog uses on each deployment: USDT where the OFT wraps Tether's USDT, USDT0 elsewhere. */\nfunction symbolFor(chain: Usdt0Chain): string {\n return chain.adapter || [42161, 10, 137].includes(chain.chainId) ? \"USDT\" : \"USDT0\";\n}\n\n/** `send(SendParam, …)` → the destination deployment (dstEid is the first word of the tuple), null when the calldata is absent or foreign. */\nfunction sendDestination(tx: ChainTx): Usdt0Chain | null {\n const data = tx.call?.data;\n if (!data || data.length < 10 + 64 * 2) return null;\n try {\n const [sp] = decodeFunctionData({abi: SEND_ABI, data: data as Hex}).args as unknown as [{dstEid: number}];\n return USDT0_BY_EID[sp.dstEid] ?? null;\n } catch {\n return null;\n }\n}\nconst lc = (a: string) => a.toLowerCase();\n\nexport function describeUsdt0Activity(tx: ChainTx, ctx: DescribeActivityContext): ActivityItem | null {\n const chain = USDT0_CHAINS[tx.chain];\n if (!chain) return null;\n const subtitle = `USDT0 · ${chainLabel(tx.chain)}`;\n if (matchesCall(tx, [chain.oft], [USDT0_SEND])) {\n // The native value is the LayerZero messaging fee (plus the headroom the\n // endpoint refunds), not an asset the owner swapped away: it rides in `fee`\n // next to the gas, and the title names both ends when the calldata says\n // where the tokens go.\n const dst = sendDestination(tx);\n const item = describeSwapLike(tx, ctx, {protocol: USDT0_MODULE, subtitle, kind: \"bridge\", outVerb: \"Bridged\"});\n if (!item) return null;\n const native = item.assetsOut.filter((a) => a.token === null).reduce((sum, a) => sum + a.amount, 0n);\n item.assetsOut = item.assetsOut.filter((a) => a.token !== null);\n if (native > 0n) item.fee = (item.fee ?? 0n) + native;\n const srcSym = item.assetsOut[0]?.symbol ?? symbolFor(chain);\n if (dst) {\n item.title = `Bridged ${srcSym} → ${symbolFor(dst)}`;\n item.subtitle = `USDT0 · ${chainLabel(tx.chain)} → ${dst.name}`;\n } else item.title = `Bridged ${srcSym}`;\n return item;\n }\n if (matchesCall(tx, [chain.endpoint], [LZ_RECEIVE])) {\n return describeSwapLike(tx, ctx, {protocol: USDT0_MODULE, subtitle, kind: \"bridge\", inSuffix: \"via LayerZero\"});\n }\n // Delivery by the LayerZero executor: the token moves out of nowhere (mint)\n // or out of the adapter into the owner, and the call target is not the token.\n const called = calledContract(tx);\n if (called && called === lc(chain.token)) return null;\n const own = new Set([...ctx.own].map(lc));\n const origin = chain.adapter ? lc(chain.oft) : ZERO;\n const delivered = tx.transfers.some((t) => t.token !== null && lc(t.token) === lc(chain.token) && lc(t.from) === origin && own.has(lc(t.to)));\n if (!delivered || own.has(lc(tx.from))) return null;\n return describeSwapLike(tx, ctx, {protocol: USDT0_MODULE, subtitle, kind: \"bridge\", inSuffix: \"via LayerZero\", counterparty: chain.oft});\n}\n"],"mappings":"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","names":["c","import_viem","import_util","c"]}
package/dist/protocol.js CHANGED
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  Usdt0Swap2Protocol
3
- } from "./chunk-BMQZVIEX.js";
4
- import "./chunk-AOWDDZ4B.js";
5
- import "./chunk-SFWB4C4U.js";
6
- import "./chunk-AGN4M7OO.js";
3
+ } from "./chunk-DDUVPDD6.js";
4
+ import "./chunk-COIPAOOA.js";
5
+ import "./chunk-DGMQ563D.js";
6
+ import "./chunk-7YL2Y3QA.js";
7
7
  export {
8
8
  Usdt0Swap2Protocol
9
9
  };
package/dist/provider.cjs CHANGED
@@ -78,6 +78,19 @@ var usdt0 = {
78
78
  return from !== to && this.supportsChain(from) && this.supportsChain(to);
79
79
  }
80
80
  };
81
+ var usdt0Pins = Object.freeze({
82
+ callTargets: (chain) => {
83
+ const c2 = usdt0ChainFor(chain);
84
+ return c2 ? [c2.oft] : [];
85
+ },
86
+ spenders: (chain) => {
87
+ const c2 = usdt0ChainFor(chain);
88
+ return c2?.adapter ? [c2.oft] : [];
89
+ }
90
+ });
91
+ function usdt0ChainFor(chain) {
92
+ return Object.prototype.hasOwnProperty.call(USDT0_CHAINS, chain) ? USDT0_CHAINS[chain] : void 0;
93
+ }
81
94
 
82
95
  // src/activity.ts
83
96
  var SEND_ABI = (0, import_viem.parseAbi)([
@@ -192,7 +205,7 @@ function usdt0Provider(config = {}) {
192
205
  const urls = typeof raw === "string" ? [raw] : [...raw ?? []];
193
206
  if (urls.length === 0) return null;
194
207
  const opts = { timeout: RPC_TIMEOUT_MS, ...config.fetchImpl ? { fetchFn: config.fetchImpl } : {} };
195
- return (0, import_viem2.createPublicClient)({ transport: urls.length === 1 ? (0, import_viem2.http)(urls[0], opts) : (0, import_viem2.fallback)(urls.map((u) => (0, import_viem2.http)(u, opts))) });
208
+ return (0, import_viem2.createPublicClient)({ transport: urls.length === 1 ? (0, import_viem2.http)(urls[0], opts) : (0, import_viem2.fallback)(urls.map((u) => (0, import_viem2.http)(u, opts))), ccipRead: false });
196
209
  };
197
210
  const verified = /* @__PURE__ */ new Map();
198
211
  function verifyChain(chain) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/provider.ts","../src/activity.ts","../src/config.ts"],"sourcesContent":["import {createPublicClient, encodeFunctionData, fallback, getAddress, http, isAddress, pad, parseAbi, type Hex} from \"viem\";\nimport {describeUsdt0Activity} from \"./activity.js\";\nimport {ccAsset} from \"@anywalletkit/swap2-assets\";\nimport {redactUrls, timeoutSignal} from \"@anywalletkit/protocol-swap2-core/util\";\nimport type {Asset, CrossChainProvider, IntentRef, IntentState, IntentStatus, Quote, QuoteParams, UnsignedTx} from \"@anywalletkit/protocol-swap2-core/types\";\nimport {LZ_SCAN_API, USDT0_BY_EID, USDT0_CHAINS, USDT0_SYMBOLS, usdt0 as usdt0Cfg, type Usdt0Chain} from \"./config.js\";\n\n/**\n * USDT0 — Tether's USDT as a LayerZero OFT. ONE source transaction:\n * `send(SendParam, MessagingFee, refund)` on the chain's OFT with the\n * LayerZero messaging fee as `msg.value`; LayerZero's DVNs verify and the\n * executor delivers on the destination (mint of USDT0, or unlock of USDT out\n * of the Ethereum adapter). No second user transaction in the normal case.\n *\n * - Quote = two `eth_call`s on the source OFT: `quoteOFT` for the limits,\n * protocol fees and the amount that really arrives after dust removal\n * (shared decimals = 6, so none today), then `quoteSend` for the native\n * fee with `minAmountLD` pinned to that received amount — the contract\n * reverts rather than deliver less. Both are sealed into the quote.\n * - `enforcedOptions` on every deployment already carry the executor gas\n * (type-3 options, lzReceive gas 80 000, read on-chain 2026-10-20), so\n * `extraOptions` stays empty; LayerZero Scan confirms deliveries ran on it.\n * - Ethereum locks USDT in an adapter (`approvalRequired()` = true →\n * `approvalAddress`); every other chain's OFT burns the caller's USDT0\n * itself (`approvalRequired()` = false → no approval at all).\n * - Every address in `config.ts` is re-read on-chain before the first quote\n * on a chain (`token()`, `approvalRequired()`) and per pair (`peers(dstEid)`\n * must be the destination OFT) — a mismatch refuses the route.\n * - Status: LayerZero Scan by source hash. DELIVERED carries the destination\n * hash; PAYLOAD_STORED (delivery reverted on the destination, funds safe)\n * becomes \"action-required\" with a `buildClaim` that retries\n * `EndpointV2.lzReceive` — anyone may call it, so the user can.\n */\n\nconst OFT_ABI = parseAbi([\n \"struct SendParam { uint32 dstEid; bytes32 to; uint256 amountLD; uint256 minAmountLD; bytes extraOptions; bytes composeMsg; bytes oftCmd; }\",\n \"struct MessagingFee { uint256 nativeFee; uint256 lzTokenFee; }\",\n \"struct OFTLimit { uint256 minAmountLD; uint256 maxAmountLD; }\",\n \"struct OFTFeeDetail { int256 feeAmountLD; string description; }\",\n \"struct OFTReceipt { uint256 amountSentLD; uint256 amountReceivedLD; }\",\n \"struct MessagingReceipt { bytes32 guid; uint64 nonce; MessagingFee fee; }\",\n \"function quoteSend(SendParam s, bool payInLzToken) view returns (MessagingFee)\",\n \"function quoteOFT(SendParam s) view returns (OFTLimit, OFTFeeDetail[], OFTReceipt)\",\n \"function send(SendParam s, MessagingFee fee, address refundAddress) payable returns (MessagingReceipt, OFTReceipt)\",\n \"function token() view returns (address)\",\n \"function approvalRequired() view returns (bool)\",\n \"function peers(uint32 eid) view returns (bytes32)\",\n]);\nconst ENDPOINT_ABI = parseAbi([\n \"struct Origin { uint32 srcEid; bytes32 sender; uint64 nonce; }\",\n \"function lzReceive(Origin origin, address receiver, bytes32 guid, bytes message, bytes extraData) payable\",\n]);\n\nconst EVM_PLACEHOLDER = \"0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045\";\nconst DEFAULT_QUOTE_TTL_MS = 60_000;\nconst RPC_TIMEOUT_MS = 12_000;\nconst SCAN_TIMEOUT_MS = 12_000;\n/** A direct `send` used ~330k gas on Arbitrum and on the Ethereum adapter (2026-10-20 receipts). */\nconst GAS_SEND = \"450000\";\n/**\n * The LayerZero fee is quoted at quote time but paid at send time, and it moves\n * with source and destination gas (live: +1.7 % within a minute on Ethereum).\n * The sealed `msg.value` carries this headroom; EndpointV2 charges the current\n * fee and refunds the surplus to `refundAddress` (the trader) in the same\n * transaction, so the headroom costs nothing — it only avoids a re-quote.\n */\nconst FEE_HEADROOM_BPS = 2_500n;\n/** `lzReceive` retry of a stored payload: a mint plus the endpoint bookkeeping. */\nconst GAS_CLAIM = \"300000\";\nconst ZERO_B32 = `0x${\"00\".repeat(32)}` as Hex;\n\nexport interface Usdt0ProviderConfig {\n enabled?: boolean;\n /**\n * JSON-RPC URL(s) per CAIP-2 chain. REQUIRED for every chain the provider\n * should quote from: the fee and the received amount come from the OFT\n * itself. The destination RPC is optional (used for the stored-payload retry).\n */\n rpcUrls?: Readonly<Record<string, string | readonly string[]>>;\n /** LayerZero Scan base (default https://scan.layerzero-api.com). */\n scanUrl?: string;\n /** Local lifetime of a quote (default 60 s; the sealed fee is re-checked at preflight). */\n quoteTtlMs?: number;\n /** Injectable for tests (also used by the RPC transport). */\n fetchImpl?: typeof fetch;\n}\n\ninterface ScanMessage {\n pathway?: {srcEid?: number; dstEid?: number; sender?: {address?: string}; receiver?: {address?: string}; nonce?: number};\n source?: {status?: string; tx?: {txHash?: string; payload?: string; options?: {lzReceive?: {gas?: string; value?: string}}}};\n destination?: {status?: string; tx?: {txHash?: string}};\n guid?: string;\n status?: {name?: string; message?: string};\n}\n\nconst same = (a: string | undefined | null, b: string) => !!a && a.toLowerCase() === b.toLowerCase();\nconst isHexData = (v: unknown): v is Hex => typeof v === \"string\" && /^0x(?:[0-9a-fA-F]{2})*$/.test(v);\n\n/** Does the catalog symbol on `chain` name this deployment's token? (USDT on Ethereum/Polygon, USDT0 elsewhere.) */\nfunction tokenMatches(chain: Usdt0Chain, symbolOrAddress: string): boolean {\n if (symbolOrAddress.startsWith(\"0x\")) return same(symbolOrAddress, chain.token);\n if (!USDT0_SYMBOLS.includes(symbolOrAddress.toUpperCase().replace(\"USD₮\", \"USDT\"))) return false;\n const known = ccAsset(chain.caip2, symbolOrAddress);\n // A symbol the catalog binds to another contract (OP's legacy bridged USDT) is not the OFT token.\n return !known || same(known.contract ?? \"\", chain.token);\n}\n\n/**\n * A refusal / preflight error that may reach a client: an RPC transport failure\n * becomes a fixed reason (viem's HTTP / timeout errors carry `URL: …`, and a keyed\n * endpoint's key sits in that path — scan 2026-10-23 F8); anything else loses its URLs.\n */\nfunction rpcSafeReason(err: unknown, chainName: string): string {\n const e = err as {name?: string; shortMessage?: string; message?: string} | undefined;\n const text = `${e?.shortMessage ?? \"\"}\\n${e?.message ?? String(err)}`;\n if (/HttpRequestError|TimeoutError|RpcRequestError|WebSocketRequestError/.test(String(e?.name)) || /\\bURL: |HTTP request failed|request timed out|took too long to respond/i.test(text)) {\n return `usdt0: RPC for ${chainName} unavailable — try again`;\n }\n return redactUrls(err instanceof Error ? err.message : String(err));\n}\n\nexport function usdt0Provider(config: Usdt0ProviderConfig = {}): CrossChainProvider {\n config = Object.freeze({...config});\n const scan = (config.scanUrl ?? LZ_SCAN_API).replace(/\\/+$/, \"\");\n if (!/^https?:\\/\\//.test(scan)) throw new Error(\"usdt0: scanUrl must use http or https\");\n const quoteTtlMs = config.quoteTtlMs ?? DEFAULT_QUOTE_TTL_MS;\n if (!Number.isInteger(quoteTtlMs) || quoteTtlMs <= 0 || quoteTtlMs > 300_000) throw new Error(\"usdt0: quoteTtlMs must be an integer between 1 and 300000\");\n const rpcUrls = Object.freeze({...(config.rpcUrls ?? {})});\n const doFetch: typeof fetch = (input, init) => (config.fetchImpl ?? fetch)(input, init);\n\n const client = (caip2: string) => {\n const raw = rpcUrls[caip2];\n const urls = typeof raw === \"string\" ? [raw] : [...(raw ?? [])];\n if (urls.length === 0) return null;\n const opts = {timeout: RPC_TIMEOUT_MS, ...(config.fetchImpl ? {fetchFn: config.fetchImpl} : {})} as never;\n return createPublicClient({transport: urls.length === 1 ? http(urls[0], opts) : fallback(urls.map((u) => http(u, opts)))});\n };\n\n /** Once per chain: the OFT really is the OFT of the listed token with the listed approval mode. */\n const verified = new Map<string, Promise<void>>();\n function verifyChain(chain: Usdt0Chain): Promise<void> {\n let p = verified.get(chain.caip2);\n if (!p) {\n p = (async () => {\n const c = client(chain.caip2);\n if (!c) throw new Error(`usdt0: no RPC for ${chain.caip2}`);\n const [token, approval] = await Promise.all([\n c.readContract({address: getAddress(chain.oft), abi: OFT_ABI, functionName: \"token\"}),\n c.readContract({address: getAddress(chain.oft), abi: OFT_ABI, functionName: \"approvalRequired\"}),\n ]);\n if (!same(token, chain.token)) throw new Error(`usdt0: OFT ${chain.oft} on ${chain.name} reports token ${token}, expected ${chain.token}`);\n if (approval !== chain.adapter) throw new Error(`usdt0: OFT ${chain.oft} on ${chain.name} reports approvalRequired=${String(approval)}, expected ${String(chain.adapter)}`);\n })();\n p.catch(() => verified.delete(chain.caip2));\n verified.set(chain.caip2, p);\n }\n return p;\n }\n\n /** Once per pair: the source OFT's peer for the destination eid is the destination OFT. */\n const peers = new Map<string, Promise<void>>();\n function verifyPeer(src: Usdt0Chain, dst: Usdt0Chain): Promise<void> {\n const key = `${src.eid}>${dst.eid}`;\n let p = peers.get(key);\n if (!p) {\n p = (async () => {\n const c = client(src.caip2);\n if (!c) throw new Error(`usdt0: no RPC for ${src.caip2}`);\n const peer = await c.readContract({address: getAddress(src.oft), abi: OFT_ABI, functionName: \"peers\", args: [dst.eid]});\n if (!same(peer, pad(getAddress(dst.oft), {size: 32}))) throw new Error(`usdt0: ${src.name} OFT has no peer for ${dst.name} (eid ${dst.eid}) — route not wired`);\n })();\n p.catch(() => peers.delete(key));\n peers.set(key, p);\n }\n return p;\n }\n\n function parseIntent(intentId: string): {src: Usdt0Chain; dst: Usdt0Chain} | null {\n const [tag, s, d] = intentId.split(\":\");\n if (tag !== \"usdt0\") return null;\n const src = USDT0_BY_EID[Number(s)];\n const dst = USDT0_BY_EID[Number(d)];\n return src && dst && src !== dst ? {src, dst} : null;\n }\n\n const sendParam = (dstEid: number, recipient: string, amountLD: bigint, minAmountLD: bigint) => ({\n dstEid, to: pad(getAddress(recipient), {size: 32}), amountLD, minAmountLD, extraOptions: \"0x\" as Hex, composeMsg: \"0x\" as Hex, oftCmd: \"0x\" as Hex,\n });\n\n /** The LayerZero message of a source transaction on this route, or null while Scan has not indexed it. */\n async function scanMessage(src: Usdt0Chain, dst: Usdt0Chain, sourceTxHash: string): Promise<ScanMessage | null | \"foreign\"> {\n const res = await doFetch(`${scan}/v1/messages/tx/${encodeURIComponent(sourceTxHash)}`, {headers: {accept: \"application/json\"}, signal: timeoutSignal(SCAN_TIMEOUT_MS)});\n if (res.status === 404) return null;\n if (!res.ok) throw new Error(`usdt0: LayerZero Scan → ${res.status}`);\n const body = (await res.json()) as {data?: ScanMessage[]};\n const list = Array.isArray(body?.data) ? body.data : [];\n if (list.length === 0) return null;\n const m = list.find((x) => x.pathway?.srcEid === src.eid && x.pathway?.dstEid === dst.eid && same(x.pathway?.sender?.address, src.oft));\n return m ?? \"foreign\";\n }\n\n return {\n name: \"usdt0\",\n describeActivity: describeUsdt0Activity,\n enabled: () => config.enabled ?? true,\n supportsChain: (chain: string) => usdt0Cfg.supportsChain(chain) && client(chain) !== null,\n supportsChainPair: (from: string, to: string) => usdt0Cfg.supports(from, to) && client(from) !== null,\n supportsRoute(from: Asset, to: Asset): boolean {\n const src = USDT0_CHAINS[from.chain];\n const dst = USDT0_CHAINS[to.chain];\n if (!src || !dst || src === dst || client(from.chain) === null) return false;\n return tokenMatches(src, from.token) && tokenMatches(dst, to.token);\n },\n\n async getQuote(params: QuoteParams, signal?: AbortSignal): Promise<Quote | null> {\n const refuse = (reason: string) => { params.onRefusal?.(reason); return null; };\n if (params.flex) return refuse(\"the amount is sealed into the calldata (no flexible deposits)\");\n const src = USDT0_CHAINS[params.sourceChain];\n const dst = USDT0_CHAINS[params.destChain];\n if (!src || !dst) return refuse(\"USDT0 is not deployed on this chain\");\n if (src === dst) return refuse(\"same-chain transfers are not a bridge\");\n if (!tokenMatches(src, params.sourceToken)) return refuse(`source token ${params.sourceToken} is not USDT0 (${src.token}) on ${src.name}`);\n if (!tokenMatches(dst, params.destToken)) return refuse(`destination token ${params.destToken} is not USDT0 (${dst.token}) on ${dst.name}`);\n if (!/^\\d+$/.test(params.amountIn)) return refuse(\"amount must be a base-unit integer\");\n const amount = BigInt(params.amountIn);\n if (amount <= 0n) return refuse(\"amount must be positive\");\n // The placeholder prices a dry quote; a live one without addresses would send there (round 3, H8).\n const dry = params.dry !== false;\n const recipient = params.destAddress || (dry ? EVM_PLACEHOLDER : \"\");\n if (!recipient) return refuse(\"a live quote needs a recipient\");\n if (!isAddress(recipient)) return refuse(\"destination must be an EVM address\");\n const refund = params.refundAddress || (dry ? EVM_PLACEHOLDER : \"\");\n if (!refund) return refuse(\"a live quote needs a refund address\");\n if (!isAddress(refund)) return refuse(\"refund address must be an EVM address\");\n const c = client(src.caip2);\n if (!c) return refuse(`no RPC configured for ${src.caip2}`);\n\n try {\n await Promise.all([verifyChain(src), verifyPeer(src, dst)]);\n const probe = sendParam(dst.eid, recipient, amount, 0n);\n const [limit, feeDetails, receipt] = await c.readContract({address: getAddress(src.oft), abi: OFT_ABI, functionName: \"quoteOFT\", args: [probe]});\n if (amount < limit.minAmountLD) return refuse(`amount ${amount} is below the OFT minimum ${limit.minAmountLD}`);\n if (amount > limit.maxAmountLD) return refuse(`amount ${amount} exceeds the OFT maximum ${limit.maxAmountLD}`);\n const received = receipt.amountReceivedLD;\n if (received <= 0n) return refuse(\"amount is below the OFT dust threshold — nothing would arrive\");\n if (received > amount) return refuse(\"OFT reports more received than sent — refusing\");\n if (params.minAmountOut !== undefined && received < BigInt(params.minAmountOut)) return refuse(`received ${received} is below the caller's floor ${params.minAmountOut}`);\n const sp = sendParam(dst.eid, recipient, amount, received);\n const fee = await c.readContract({address: getAddress(src.oft), abi: OFT_ABI, functionName: \"quoteSend\", args: [sp, false]});\n if (fee.lzTokenFee !== 0n) return refuse(\"OFT asks for a fee in LZ token — unsupported\");\n // Sealed with headroom: OAppSender requires msg.value == MessagingFee.nativeFee, the\n // endpoint refunds whatever the current fee does not use to `refund`.\n const nativeFee = fee.nativeFee + (fee.nativeFee * FEE_HEADROOM_BPS) / 10_000n;\n const data = encodeFunctionData({abi: OFT_ABI, functionName: \"send\", args: [sp, {nativeFee, lzTokenFee: 0n}, getAddress(refund)]});\n const protocolFees = feeDetails\n .filter((f) => f.feeAmountLD > 0n)\n .map((f) => ({type: \"protocol\" as const, amount: f.feeAmountLD.toString(), token: src.token, included: true, description: f.description || \"OFT fee\"}));\n const feeUsd = protocolFees.reduce((a, f) => a + Number(f.amount) / 1e6, 0);\n // Ethereum sources wait for 60 confirmations before the DVNs attest (~15 min live); L2 sources land in a few minutes.\n const eta = src.chainId === 1 ? 1000 : 240;\n return {\n provider: \"usdt0\",\n intentId: `usdt0:${src.eid}:${dst.eid}`,\n depositAddress: \"\",\n depositMemo: null,\n txRequest: {\n to: src.oft,\n data,\n value: nativeFee.toString(),\n chainId: src.chainId,\n gasLimit: GAS_SEND,\n ...(src.adapter ? {approvalAddress: src.oft} : {}),\n ...(nativeFee > 0n ? {nativeFee: nativeFee.toString()} : {}),\n },\n sourceAmount: amount.toString(),\n destAmount: received.toString(),\n minDestAmount: received.toString(),\n feeUsd,\n fees: protocolFees,\n etaSeconds: eta,\n reliability: 0.98,\n validUntilMs: Date.now() + quoteTtlMs,\n providerData: {\n srcEid: String(src.eid), dstEid: String(dst.eid), oft: src.oft, token: src.token, recipient: getAddress(recipient), refundAddress: getAddress(refund),\n amountLD: amount.toString(), minAmountLD: received.toString(), nativeFee: nativeFee.toString(),\n },\n };\n } catch (err) {\n return refuse(rpcSafeReason(err, src.name));\n }\n },\n\n async buildDeposit(quote: Quote): Promise<UnsignedTx> {\n const tx = quote.txRequest;\n const parsed = parseIntent(quote.intentId);\n if (!tx || !parsed) throw new Error(\"swap2: USDT0 quote has no transaction request\");\n return {\n chain: parsed.src.caip2,\n to: tx.to ?? \"\",\n value: tx.value ?? \"0\",\n ...(tx.data ? {data: tx.data} : {}),\n ...(tx.chainId !== undefined ? {chainId: tx.chainId} : {}),\n ...(tx.gasLimit ? {gasLimit: tx.gasLimit} : {}),\n ...(tx.approvalAddress ? {approvalAddress: tx.approvalAddress} : {}),\n };\n },\n\n /**\n * Right before signing: the target is the source OFT, the peer is still the\n * destination OFT, and the CURRENT LayerZero fee still fits the sealed\n * `msg.value` (quote + headroom) — the endpoint reverts a send that\n * underpays, so a fee past the headroom means re-quote rather than a\n * wasted broadcast.\n */\n async preflightDeposit(quote: Quote, tx: UnsignedTx): Promise<void> {\n const parsed = parseIntent(quote.intentId);\n if (!parsed) throw new Error(\"usdt0: malformed intent id\");\n const {src, dst} = parsed;\n if (!same(tx.to, src.oft)) throw new Error(`usdt0: deposit target ${tx.to} is not the ${src.name} OFT`);\n const pd = quote.providerData ?? {};\n if (!/^\\d+$/.test(pd.amountLD ?? \"\") || !/^\\d+$/.test(pd.minAmountLD ?? \"\") || !/^\\d+$/.test(pd.nativeFee ?? \"\") || !isAddress(pd.recipient ?? \"\")) {\n throw new Error(\"usdt0: quote carries no sealed send parameters\");\n }\n const c = client(src.caip2);\n if (!c) throw new Error(`usdt0: no RPC for ${src.caip2}`);\n const sp = sendParam(dst.eid, pd.recipient!, BigInt(pd.amountLD!), BigInt(pd.minAmountLD!));\n let fee: {nativeFee: bigint};\n try {\n await Promise.all([verifyChain(src), verifyPeer(src, dst)]);\n fee = await c.readContract({address: getAddress(src.oft), abi: OFT_ABI, functionName: \"quoteSend\", args: [sp, false]});\n } catch (err) {\n throw new Error(rpcSafeReason(err, src.name));\n }\n const sealed = BigInt(pd.nativeFee!);\n if (fee.nativeFee > sealed) throw new Error(`usdt0: LayerZero fee rose to ${fee.nativeFee} above the sealed ${sealed} (quote + ${FEE_HEADROOM_BPS / 100n} % headroom) — re-quote`);\n if (BigInt(tx.value) !== sealed) throw new Error(`usdt0: transaction value ${tx.value} is not the quoted fee ${sealed}`);\n },\n\n async trackIntent(ref: IntentRef): Promise<IntentStatus> {\n const parsed = parseIntent(ref.intentId);\n if (!parsed) return {state: \"failed\"};\n const {src, dst} = parsed;\n if (!ref.sourceTxHash) return {state: \"pending\"};\n try {\n const m = await scanMessage(src, dst, ref.sourceTxHash);\n if (m === null) return {state: \"pending\", depositReceived: false};\n if (m === \"foreign\") return {state: \"failed\"}; // the hash carries a LayerZero message, but not ours\n const name = (m.status?.name ?? \"\").toUpperCase();\n const destHash = m.destination?.tx?.txHash;\n if (name === \"DELIVERED\") return {state: \"completed\", depositReceived: true, ...(destHash ? {destTxHash: destHash} : ref.destTxHash ? {destTxHash: ref.destTxHash} : {})};\n if (name === \"PAYLOAD_STORED\") return {state: \"action-required\", depositReceived: true, claim: {chain: dst.caip2, ready: true}};\n if ([\"FAILED\", \"APPLICATION_BURNED\", \"APPLICATION_SKIPPED\", \"UNRESOLVABLE_COMMAND\", \"MALFORMED_COMMAND\"].includes(name)) return {state: \"failed\", depositReceived: true};\n // INFLIGHT, CONFIRMING, BLOCKED (an earlier nonce on the pathway is stuck — LayerZero clears it), or anything new.\n return {state: \"pending\", depositReceived: true};\n } catch {\n return {state: \"pending\"};\n }\n },\n\n /**\n * A delivery that reverted on the destination (PAYLOAD_STORED — out of\n * executor gas, paused token) is retried by anyone through the endpoint:\n * `lzReceive(origin, receiver, guid, message, extraData)` with the exact\n * packet LayerZero Scan recorded. Null while nothing is stored.\n */\n async buildClaim(ref: IntentRef): Promise<UnsignedTx | null> {\n const parsed = parseIntent(ref.intentId);\n if (!parsed || !ref.sourceTxHash) return null;\n const {src, dst} = parsed;\n const m = await scanMessage(src, dst, ref.sourceTxHash);\n if (!m || m === \"foreign\" || (m.status?.name ?? \"\").toUpperCase() !== \"PAYLOAD_STORED\") return null;\n const nonce = m.pathway?.nonce;\n const guid = m.guid;\n const message = m.source?.tx?.payload;\n if (!Number.isInteger(nonce) || !isHexData(guid) || guid.length !== 66 || !isHexData(message) || message.length <= 2) {\n throw new Error(\"usdt0: LayerZero Scan has no complete packet for the stored payload\");\n }\n if (!same(m.pathway?.receiver?.address, dst.oft)) throw new Error(\"usdt0: stored payload is addressed to another receiver\");\n const valueRaw = m.source?.tx?.options?.lzReceive?.value ?? \"0\";\n const value = /^\\d+$/.test(valueRaw) ? valueRaw : \"0\";\n return {\n chain: dst.caip2,\n to: dst.endpoint,\n value,\n data: encodeFunctionData({\n abi: ENDPOINT_ABI,\n functionName: \"lzReceive\",\n args: [{srcEid: src.eid, sender: pad(getAddress(src.oft), {size: 32}), nonce: BigInt(nonce as number)}, getAddress(dst.oft), guid, message, \"0x\"],\n }),\n chainId: dst.chainId,\n gasLimit: GAS_CLAIM,\n };\n },\n };\n}\n\n/** Exported for tests and diagnostics: the LayerZero Scan status → swap2 state mapping. */\nexport const USDT0_STATUS_MAP: Readonly<Record<string, IntentState>> = Object.freeze({\n INFLIGHT: \"pending\", CONFIRMING: \"pending\", BLOCKED: \"pending\",\n DELIVERED: \"completed\", PAYLOAD_STORED: \"action-required\",\n FAILED: \"failed\", APPLICATION_BURNED: \"failed\", APPLICATION_SKIPPED: \"failed\", UNRESOLVABLE_COMMAND: \"failed\", MALFORMED_COMMAND: \"failed\",\n});\n\nexport {ZERO_B32 as USDT0_ZERO_PEER};\n","/**\n * Activity recognition for USDT0 on every chain in `config.ts`:\n * - `send(...)` on the chain's OFT is our source leg (\"Bridged USDT0\", or\n * \"Bridged USDT\" on Ethereum where the adapter locks plain USDT);\n * - the inbound leg is the executor's delivery — the user signs nothing, so\n * it is recognized by its effect: the chain's USDT0 minted to the owner\n * (from the zero address), or USDT released by the Ethereum adapter to the\n * owner, inside a transaction that did NOT call the token itself (a plain\n * transfer is not a bridge);\n * - `lzReceive` on the LayerZero endpoint is the owner's own retry of a\n * stored payload (`claimSwap2`).\n */\nimport type {ActivityItem, ChainTx, DescribeActivityContext} from \"@anywalletkit/core\";\nimport {calledContract, chainLabel, describeSwapLike, matchesCall} from \"@anywalletkit/protocol-swap2-core/activity\";\nimport {decodeFunctionData, parseAbi, type Hex} from \"viem\";\nimport {USDT0_BY_EID, USDT0_CHAINS, type Usdt0Chain} from \"./config.js\";\n\nconst SEND_ABI = parseAbi([\n \"struct SendParam { uint32 dstEid; bytes32 to; uint256 amountLD; uint256 minAmountLD; bytes extraOptions; bytes composeMsg; bytes oftCmd; }\",\n \"struct MessagingFee { uint256 nativeFee; uint256 lzTokenFee; }\",\n \"function send(SendParam sp, MessagingFee fee, address refundAddress)\",\n]);\n\nexport const USDT0_MODULE = \"@anywalletkit/protocol-swap2-usdt0\";\n\n/** send((uint32,bytes32,uint256,uint256,bytes,bytes,bytes),(uint256,uint256),address) — IOFT */\nexport const USDT0_SEND = \"0xc7c7f5b3\";\n/** lzReceive((uint32,bytes32,uint64),address,bytes32,bytes,bytes) — EndpointV2 */\nexport const LZ_RECEIVE = \"0x0c0c389e\";\n\nconst ZERO = \"0x0000000000000000000000000000000000000000\";\n\n/** The symbol the catalog uses on each deployment: USDT where the OFT wraps Tether's USDT, USDT0 elsewhere. */\nfunction symbolFor(chain: Usdt0Chain): string {\n return chain.adapter || [42161, 10, 137].includes(chain.chainId) ? \"USDT\" : \"USDT0\";\n}\n\n/** `send(SendParam, …)` → the destination deployment (dstEid is the first word of the tuple), null when the calldata is absent or foreign. */\nfunction sendDestination(tx: ChainTx): Usdt0Chain | null {\n const data = tx.call?.data;\n if (!data || data.length < 10 + 64 * 2) return null;\n try {\n const [sp] = decodeFunctionData({abi: SEND_ABI, data: data as Hex}).args as unknown as [{dstEid: number}];\n return USDT0_BY_EID[sp.dstEid] ?? null;\n } catch {\n return null;\n }\n}\nconst lc = (a: string) => a.toLowerCase();\n\nexport function describeUsdt0Activity(tx: ChainTx, ctx: DescribeActivityContext): ActivityItem | null {\n const chain = USDT0_CHAINS[tx.chain];\n if (!chain) return null;\n const subtitle = `USDT0 · ${chainLabel(tx.chain)}`;\n if (matchesCall(tx, [chain.oft], [USDT0_SEND])) {\n // The native value is the LayerZero messaging fee (plus the headroom the\n // endpoint refunds), not an asset the owner swapped away: it rides in `fee`\n // next to the gas, and the title names both ends when the calldata says\n // where the tokens go.\n const dst = sendDestination(tx);\n const item = describeSwapLike(tx, ctx, {protocol: USDT0_MODULE, subtitle, kind: \"bridge\", outVerb: \"Bridged\"});\n if (!item) return null;\n const native = item.assetsOut.filter((a) => a.token === null).reduce((sum, a) => sum + a.amount, 0n);\n item.assetsOut = item.assetsOut.filter((a) => a.token !== null);\n if (native > 0n) item.fee = (item.fee ?? 0n) + native;\n const srcSym = item.assetsOut[0]?.symbol ?? symbolFor(chain);\n if (dst) {\n item.title = `Bridged ${srcSym} → ${symbolFor(dst)}`;\n item.subtitle = `USDT0 · ${chainLabel(tx.chain)} → ${dst.name}`;\n } else item.title = `Bridged ${srcSym}`;\n return item;\n }\n if (matchesCall(tx, [chain.endpoint], [LZ_RECEIVE])) {\n return describeSwapLike(tx, ctx, {protocol: USDT0_MODULE, subtitle, kind: \"bridge\", inSuffix: \"via LayerZero\"});\n }\n // Delivery by the LayerZero executor: the token moves out of nowhere (mint)\n // or out of the adapter into the owner, and the call target is not the token.\n const called = calledContract(tx);\n if (called && called === lc(chain.token)) return null;\n const own = new Set([...ctx.own].map(lc));\n const origin = chain.adapter ? lc(chain.oft) : ZERO;\n const delivered = tx.transfers.some((t) => t.token !== null && lc(t.token) === lc(chain.token) && lc(t.from) === origin && own.has(lc(t.to)));\n if (!delivered || own.has(lc(tx.from))) return null;\n return describeSwapLike(tx, ctx, {protocol: USDT0_MODULE, subtitle, kind: \"bridge\", inSuffix: \"via LayerZero\", counterparty: chain.oft});\n}\n","// USDT0 — Tether's LayerZero OFT for USDT. Source: docs.usdt0.to\n// (technical-documentation/deployments, read 2026-10-20) — every row below was\n// then re-read on-chain over public RPCs the same day: the OFT's `token()` is\n// the listed token, `endpoint()` is the listed endpoint (and reports the\n// listed eid), `approvalRequired()` is true only for the Ethereum adapter,\n// `sharedDecimals()` = 6 everywhere, and `peers(eid)` are wired between the\n// chains. `oftVersion()` = (0x02e49c2c, 1) on all of them.\n//\n// Only chains the SDK ships (swap2-assets / wallet-evm) are listed. USDT0 is\n// also deployed on Conflux eSpace (1030, eid 30212), Flare (14, 30295),\n// Hedera (295, 30316), Mantle (5000, 30181), Morph (2818, 30322), Rootstock\n// (30, 30333), Stable (988, 30396), Tempo (4217, 30410), plus HyperCore, IOTA\n// and Stellar (non-EVM) — not wallet chains here, so not routable here.\nimport {evmRef, isEvm} from \"@anywalletkit/protocol-swap2-core/util\";\n\nexport interface Usdt0Chain {\n caip2: string;\n chainId: number;\n /** LayerZero V2 endpoint id. */\n eid: number;\n name: string;\n /** The ERC-20 the user holds: USDT on Ethereum, USDT0 elsewhere (6 decimals everywhere). */\n token: string;\n /**\n * The OFT contract `quoteSend` / `send` are called on. On Ethereum it is the\n * OFT *adapter* that locks USDT (`approvalRequired()` = true, approve the\n * token to it); elsewhere it is the OUpgradeable OFT that burns the caller's\n * USDT0 through the token's mint/burn role — no approval.\n */\n oft: string;\n /** LayerZero V2 EndpointV2 on that chain (`lzReceive` retries of a stored payload go here). */\n endpoint: string;\n /** True on Ethereum: the OFT is a lockbox adapter in front of plain USDT. */\n adapter: boolean;\n}\n\nconst LZ_ENDPOINT_A = \"0x1a44076050125825900e736c501f859c50fE728c\";\nconst LZ_ENDPOINT_B = \"0x6F475642a6e85809B1c36Fa62763669b1b48DD5B\";\n\nconst c = (chainId: number, eid: number, name: string, token: string, oft: string, endpoint: string, adapter = false): Usdt0Chain => ({\n caip2: `eip155:${chainId}`, chainId, eid, name, token, oft, endpoint, adapter,\n});\n\n/** CAIP-2 → USDT0 deployment. */\nexport const USDT0_CHAINS: Readonly<Record<string, Usdt0Chain>> = Object.freeze(Object.fromEntries([\n c(1, 30101, \"Ethereum\", \"0xdAC17F958D2ee523a2206206994597C13D831ec7\", \"0x6C96dE32CEa08842dcc4058c14d3aaAD7Fa41dee\", LZ_ENDPOINT_A, true),\n c(42161, 30110, \"Arbitrum\", \"0xFd086bC7CD5C481DCC9C85ebE478A1C0b69FCbb9\", \"0x14E4A1B13bf7F943c8ff7C51fb60FA964A298D92\", LZ_ENDPOINT_A),\n c(10, 30111, \"OP Mainnet\", \"0x01bFF41798a0BcF287b996046Ca68b395DbC1071\", \"0xF03b4d9AC1D5d1E7c4cEf54C2A313b9fe051A0aD\", LZ_ENDPOINT_A),\n c(137, 30109, \"Polygon PoS\", \"0xc2132D05D31c914a87C6611C10748AEb04B58e8F\", \"0x6BA10300f0DC58B7a1e4c0e41f5daBb7D7829e13\", LZ_ENDPOINT_A),\n c(999, 30367, \"HyperEVM\", \"0xB8CE59FC3717ada4C02eaDF9682A9e934F625ebb\", \"0x904861a24F30EC96ea7CFC3bE9EA4B476d237e98\", \"0x3A73033C0b1407574C76BdBAc67f126f6b4a9AA9\"),\n c(57073, 30339, \"Ink\", \"0x0200C29006150606B650577BBE7B6248F58470c1\", \"0x1cB6De532588fCA4a21B7209DE7C456AF8434A65\", \"0xca29f3A6f966Cb2fc0dE625F8f325c0C46dbE958\"),\n c(80094, 30362, \"Berachain\", \"0x779Ded0c9e1022225f8E0630b35a9b54bE713736\", \"0x3Dc96399109df5ceb2C226664A086140bD0379cB\", LZ_ENDPOINT_B),\n c(130, 30320, \"Unichain\", \"0x9151434b16b9763660705744891fA906F660EcC5\", \"0xc07bE8994D035631c36fb4a89C918CeFB2f03EC3\", LZ_ENDPOINT_B),\n c(1329, 30280, \"Sei\", \"0x9151434b16b9763660705744891fA906F660EcC5\", \"0x56Fe74A2e3b484b921c447357203431a3485CC60\", LZ_ENDPOINT_A),\n c(9745, 30383, \"Plasma\", \"0xB8CE59FC3717ada4C02eaDF9682A9e934F625ebb\", \"0x02ca37966753bDdDf11216B73B16C1dE756A7CF9\", LZ_ENDPOINT_B),\n c(143, 30390, \"Monad\", \"0xe7cd86e13AC4309349F30B3435a9d337750fC82D\", \"0x9151434b16b9763660705744891fA906F660EcC5\", LZ_ENDPOINT_B),\n c(4326, 30398, \"MegaETH\", \"0xB8CE59FC3717ada4C02eaDF9682A9e934F625ebb\", \"0x9151434b16b9763660705744891fA906F660EcC5\", LZ_ENDPOINT_B),\n c(196, 30274, \"X Layer\", \"0x779Ded0c9e1022225f8E0630b35a9b54bE713736\", \"0x94bcCa6BdfD6a61817aB0E960BfedE4984505554\", LZ_ENDPOINT_A),\n // 2026-10-20 (evm-chains-6 batch): docs.usdt0.to deployments, re-read on-chain (token(), approvalRequired() = false,\n // sharedDecimals() = 6, endpoint(), peers(30110) = the Arbitrum OFT).\n c(5000, 30181, \"Mantle\", \"0x779Ded0c9e1022225f8E0630b35a9b54bE713736\", \"0xcb768e263FB1C62214E7cab4AA8d036D76dc59CC\", LZ_ENDPOINT_A),\n c(2818, 30322, \"Morph\", \"0xe7cd86e13AC4309349F30B3435a9d337750fC82D\", \"0xcb768e263FB1C62214E7cab4AA8d036D76dc59CC\", LZ_ENDPOINT_B),\n c(14, 30295, \"Flare\", \"0xe7cd86e13AC4309349F30B3435a9d337750fC82D\", \"0x567287d2A9829215a37e3B88843d32f9221E7588\", LZ_ENDPOINT_A),\n].map((x) => [x.caip2, x])));\n\n/** LayerZero eid → deployment. */\nexport const USDT0_BY_EID: Readonly<Record<number, Usdt0Chain>> = Object.freeze(\n Object.fromEntries(Object.values(USDT0_CHAINS).map((x) => [x.eid, x])),\n);\n\n/** LayerZero Scan — message status by source transaction hash. */\nexport const LZ_SCAN_API = \"https://scan.layerzero-api.com\";\n\n/** Token symbols the catalog uses for the same asset across chains. */\nexport const USDT0_SYMBOLS: readonly string[] = Object.freeze([\"USDT0\", \"USDT\", \"USD₮0\", \"USD₮\"]);\n\nexport const usdt0 = {\n supportsChain(chain: string): boolean {\n return isEvm(chain) && !!USDT0_CHAINS[`eip155:${evmRef(chain)}`];\n },\n supports(from: string, to: string): boolean {\n return from !== to && this.supportsChain(from) && this.supportsChain(to);\n },\n};\n"],"mappings":"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","names":["import_viem","import_util","c"]}
1
+ {"version":3,"sources":["../src/provider.ts","../src/activity.ts","../src/config.ts"],"sourcesContent":["import {createPublicClient, encodeFunctionData, fallback, getAddress, http, isAddress, pad, parseAbi, type Hex} from \"viem\";\nimport {describeUsdt0Activity} from \"./activity.js\";\nimport {ccAsset} from \"@anywalletkit/swap2-assets\";\nimport {redactUrls, timeoutSignal} from \"@anywalletkit/protocol-swap2-core/util\";\nimport type {Asset, CrossChainProvider, IntentRef, IntentState, IntentStatus, Quote, QuoteParams, UnsignedTx} from \"@anywalletkit/protocol-swap2-core/types\";\nimport {LZ_SCAN_API, USDT0_BY_EID, USDT0_CHAINS, USDT0_SYMBOLS, usdt0 as usdt0Cfg, type Usdt0Chain} from \"./config.js\";\n\n/**\n * USDT0 — Tether's USDT as a LayerZero OFT. ONE source transaction:\n * `send(SendParam, MessagingFee, refund)` on the chain's OFT with the\n * LayerZero messaging fee as `msg.value`; LayerZero's DVNs verify and the\n * executor delivers on the destination (mint of USDT0, or unlock of USDT out\n * of the Ethereum adapter). No second user transaction in the normal case.\n *\n * - Quote = two `eth_call`s on the source OFT: `quoteOFT` for the limits,\n * protocol fees and the amount that really arrives after dust removal\n * (shared decimals = 6, so none today), then `quoteSend` for the native\n * fee with `minAmountLD` pinned to that received amount — the contract\n * reverts rather than deliver less. Both are sealed into the quote.\n * - `enforcedOptions` on every deployment already carry the executor gas\n * (type-3 options, lzReceive gas 80 000, read on-chain 2026-10-20), so\n * `extraOptions` stays empty; LayerZero Scan confirms deliveries ran on it.\n * - Ethereum locks USDT in an adapter (`approvalRequired()` = true →\n * `approvalAddress`); every other chain's OFT burns the caller's USDT0\n * itself (`approvalRequired()` = false → no approval at all).\n * - Every address in `config.ts` is re-read on-chain before the first quote\n * on a chain (`token()`, `approvalRequired()`) and per pair (`peers(dstEid)`\n * must be the destination OFT) — a mismatch refuses the route.\n * - Status: LayerZero Scan by source hash. DELIVERED carries the destination\n * hash; PAYLOAD_STORED (delivery reverted on the destination, funds safe)\n * becomes \"action-required\" with a `buildClaim` that retries\n * `EndpointV2.lzReceive` — anyone may call it, so the user can.\n */\n\nconst OFT_ABI = parseAbi([\n \"struct SendParam { uint32 dstEid; bytes32 to; uint256 amountLD; uint256 minAmountLD; bytes extraOptions; bytes composeMsg; bytes oftCmd; }\",\n \"struct MessagingFee { uint256 nativeFee; uint256 lzTokenFee; }\",\n \"struct OFTLimit { uint256 minAmountLD; uint256 maxAmountLD; }\",\n \"struct OFTFeeDetail { int256 feeAmountLD; string description; }\",\n \"struct OFTReceipt { uint256 amountSentLD; uint256 amountReceivedLD; }\",\n \"struct MessagingReceipt { bytes32 guid; uint64 nonce; MessagingFee fee; }\",\n \"function quoteSend(SendParam s, bool payInLzToken) view returns (MessagingFee)\",\n \"function quoteOFT(SendParam s) view returns (OFTLimit, OFTFeeDetail[], OFTReceipt)\",\n \"function send(SendParam s, MessagingFee fee, address refundAddress) payable returns (MessagingReceipt, OFTReceipt)\",\n \"function token() view returns (address)\",\n \"function approvalRequired() view returns (bool)\",\n \"function peers(uint32 eid) view returns (bytes32)\",\n]);\nconst ENDPOINT_ABI = parseAbi([\n \"struct Origin { uint32 srcEid; bytes32 sender; uint64 nonce; }\",\n \"function lzReceive(Origin origin, address receiver, bytes32 guid, bytes message, bytes extraData) payable\",\n]);\n\nconst EVM_PLACEHOLDER = \"0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045\";\nconst DEFAULT_QUOTE_TTL_MS = 60_000;\nconst RPC_TIMEOUT_MS = 12_000;\nconst SCAN_TIMEOUT_MS = 12_000;\n/** A direct `send` used ~330k gas on Arbitrum and on the Ethereum adapter (2026-10-20 receipts). */\nconst GAS_SEND = \"450000\";\n/**\n * The LayerZero fee is quoted at quote time but paid at send time, and it moves\n * with source and destination gas (live: +1.7 % within a minute on Ethereum).\n * The sealed `msg.value` carries this headroom; EndpointV2 charges the current\n * fee and refunds the surplus to `refundAddress` (the trader) in the same\n * transaction, so the headroom costs nothing — it only avoids a re-quote.\n */\nconst FEE_HEADROOM_BPS = 2_500n;\n/** `lzReceive` retry of a stored payload: a mint plus the endpoint bookkeeping. */\nconst GAS_CLAIM = \"300000\";\nconst ZERO_B32 = `0x${\"00\".repeat(32)}` as Hex;\n\nexport interface Usdt0ProviderConfig {\n enabled?: boolean;\n /**\n * JSON-RPC URL(s) per CAIP-2 chain. REQUIRED for every chain the provider\n * should quote from: the fee and the received amount come from the OFT\n * itself. The destination RPC is optional (used for the stored-payload retry).\n */\n rpcUrls?: Readonly<Record<string, string | readonly string[]>>;\n /** LayerZero Scan base (default https://scan.layerzero-api.com). */\n scanUrl?: string;\n /** Local lifetime of a quote (default 60 s; the sealed fee is re-checked at preflight). */\n quoteTtlMs?: number;\n /** Injectable for tests (also used by the RPC transport). */\n fetchImpl?: typeof fetch;\n}\n\ninterface ScanMessage {\n pathway?: {srcEid?: number; dstEid?: number; sender?: {address?: string}; receiver?: {address?: string}; nonce?: number};\n source?: {status?: string; tx?: {txHash?: string; payload?: string; options?: {lzReceive?: {gas?: string; value?: string}}}};\n destination?: {status?: string; tx?: {txHash?: string}};\n guid?: string;\n status?: {name?: string; message?: string};\n}\n\nconst same = (a: string | undefined | null, b: string) => !!a && a.toLowerCase() === b.toLowerCase();\nconst isHexData = (v: unknown): v is Hex => typeof v === \"string\" && /^0x(?:[0-9a-fA-F]{2})*$/.test(v);\n\n/** Does the catalog symbol on `chain` name this deployment's token? (USDT on Ethereum/Polygon, USDT0 elsewhere.) */\nfunction tokenMatches(chain: Usdt0Chain, symbolOrAddress: string): boolean {\n if (symbolOrAddress.startsWith(\"0x\")) return same(symbolOrAddress, chain.token);\n if (!USDT0_SYMBOLS.includes(symbolOrAddress.toUpperCase().replace(\"USD₮\", \"USDT\"))) return false;\n const known = ccAsset(chain.caip2, symbolOrAddress);\n // A symbol the catalog binds to another contract (OP's legacy bridged USDT) is not the OFT token.\n return !known || same(known.contract ?? \"\", chain.token);\n}\n\n/**\n * A refusal / preflight error that may reach a client: an RPC transport failure\n * becomes a fixed reason (viem's HTTP / timeout errors carry `URL: …`, and a keyed\n * endpoint's key sits in that path — scan 2026-10-23 F8); anything else loses its URLs.\n */\nfunction rpcSafeReason(err: unknown, chainName: string): string {\n const e = err as {name?: string; shortMessage?: string; message?: string} | undefined;\n const text = `${e?.shortMessage ?? \"\"}\\n${e?.message ?? String(err)}`;\n if (/HttpRequestError|TimeoutError|RpcRequestError|WebSocketRequestError/.test(String(e?.name)) || /\\bURL: |HTTP request failed|request timed out|took too long to respond/i.test(text)) {\n return `usdt0: RPC for ${chainName} unavailable — try again`;\n }\n return redactUrls(err instanceof Error ? err.message : String(err));\n}\n\nexport function usdt0Provider(config: Usdt0ProviderConfig = {}): CrossChainProvider {\n config = Object.freeze({...config});\n const scan = (config.scanUrl ?? LZ_SCAN_API).replace(/\\/+$/, \"\");\n if (!/^https?:\\/\\//.test(scan)) throw new Error(\"usdt0: scanUrl must use http or https\");\n const quoteTtlMs = config.quoteTtlMs ?? DEFAULT_QUOTE_TTL_MS;\n if (!Number.isInteger(quoteTtlMs) || quoteTtlMs <= 0 || quoteTtlMs > 300_000) throw new Error(\"usdt0: quoteTtlMs must be an integer between 1 and 300000\");\n const rpcUrls = Object.freeze({...(config.rpcUrls ?? {})});\n const doFetch: typeof fetch = (input, init) => (config.fetchImpl ?? fetch)(input, init);\n\n const client = (caip2: string) => {\n const raw = rpcUrls[caip2];\n const urls = typeof raw === \"string\" ? [raw] : [...(raw ?? [])];\n if (urls.length === 0) return null;\n const opts = {timeout: RPC_TIMEOUT_MS, ...(config.fetchImpl ? {fetchFn: config.fetchImpl} : {})} as never;\n return createPublicClient({transport: urls.length === 1 ? http(urls[0], opts) : fallback(urls.map((u) => http(u, opts))), ccipRead: false});\n };\n\n /** Once per chain: the OFT really is the OFT of the listed token with the listed approval mode. */\n const verified = new Map<string, Promise<void>>();\n function verifyChain(chain: Usdt0Chain): Promise<void> {\n let p = verified.get(chain.caip2);\n if (!p) {\n p = (async () => {\n const c = client(chain.caip2);\n if (!c) throw new Error(`usdt0: no RPC for ${chain.caip2}`);\n const [token, approval] = await Promise.all([\n c.readContract({address: getAddress(chain.oft), abi: OFT_ABI, functionName: \"token\"}),\n c.readContract({address: getAddress(chain.oft), abi: OFT_ABI, functionName: \"approvalRequired\"}),\n ]);\n if (!same(token, chain.token)) throw new Error(`usdt0: OFT ${chain.oft} on ${chain.name} reports token ${token}, expected ${chain.token}`);\n if (approval !== chain.adapter) throw new Error(`usdt0: OFT ${chain.oft} on ${chain.name} reports approvalRequired=${String(approval)}, expected ${String(chain.adapter)}`);\n })();\n p.catch(() => verified.delete(chain.caip2));\n verified.set(chain.caip2, p);\n }\n return p;\n }\n\n /** Once per pair: the source OFT's peer for the destination eid is the destination OFT. */\n const peers = new Map<string, Promise<void>>();\n function verifyPeer(src: Usdt0Chain, dst: Usdt0Chain): Promise<void> {\n const key = `${src.eid}>${dst.eid}`;\n let p = peers.get(key);\n if (!p) {\n p = (async () => {\n const c = client(src.caip2);\n if (!c) throw new Error(`usdt0: no RPC for ${src.caip2}`);\n const peer = await c.readContract({address: getAddress(src.oft), abi: OFT_ABI, functionName: \"peers\", args: [dst.eid]});\n if (!same(peer, pad(getAddress(dst.oft), {size: 32}))) throw new Error(`usdt0: ${src.name} OFT has no peer for ${dst.name} (eid ${dst.eid}) — route not wired`);\n })();\n p.catch(() => peers.delete(key));\n peers.set(key, p);\n }\n return p;\n }\n\n function parseIntent(intentId: string): {src: Usdt0Chain; dst: Usdt0Chain} | null {\n const [tag, s, d] = intentId.split(\":\");\n if (tag !== \"usdt0\") return null;\n const src = USDT0_BY_EID[Number(s)];\n const dst = USDT0_BY_EID[Number(d)];\n return src && dst && src !== dst ? {src, dst} : null;\n }\n\n const sendParam = (dstEid: number, recipient: string, amountLD: bigint, minAmountLD: bigint) => ({\n dstEid, to: pad(getAddress(recipient), {size: 32}), amountLD, minAmountLD, extraOptions: \"0x\" as Hex, composeMsg: \"0x\" as Hex, oftCmd: \"0x\" as Hex,\n });\n\n /** The LayerZero message of a source transaction on this route, or null while Scan has not indexed it. */\n async function scanMessage(src: Usdt0Chain, dst: Usdt0Chain, sourceTxHash: string): Promise<ScanMessage | null | \"foreign\"> {\n const res = await doFetch(`${scan}/v1/messages/tx/${encodeURIComponent(sourceTxHash)}`, {headers: {accept: \"application/json\"}, signal: timeoutSignal(SCAN_TIMEOUT_MS)});\n if (res.status === 404) return null;\n if (!res.ok) throw new Error(`usdt0: LayerZero Scan → ${res.status}`);\n const body = (await res.json()) as {data?: ScanMessage[]};\n const list = Array.isArray(body?.data) ? body.data : [];\n if (list.length === 0) return null;\n const m = list.find((x) => x.pathway?.srcEid === src.eid && x.pathway?.dstEid === dst.eid && same(x.pathway?.sender?.address, src.oft));\n return m ?? \"foreign\";\n }\n\n return {\n name: \"usdt0\",\n describeActivity: describeUsdt0Activity,\n enabled: () => config.enabled ?? true,\n supportsChain: (chain: string) => usdt0Cfg.supportsChain(chain) && client(chain) !== null,\n supportsChainPair: (from: string, to: string) => usdt0Cfg.supports(from, to) && client(from) !== null,\n supportsRoute(from: Asset, to: Asset): boolean {\n const src = USDT0_CHAINS[from.chain];\n const dst = USDT0_CHAINS[to.chain];\n if (!src || !dst || src === dst || client(from.chain) === null) return false;\n return tokenMatches(src, from.token) && tokenMatches(dst, to.token);\n },\n\n async getQuote(params: QuoteParams, signal?: AbortSignal): Promise<Quote | null> {\n const refuse = (reason: string) => { params.onRefusal?.(reason); return null; };\n if (params.flex) return refuse(\"the amount is sealed into the calldata (no flexible deposits)\");\n const src = USDT0_CHAINS[params.sourceChain];\n const dst = USDT0_CHAINS[params.destChain];\n if (!src || !dst) return refuse(\"USDT0 is not deployed on this chain\");\n if (src === dst) return refuse(\"same-chain transfers are not a bridge\");\n if (!tokenMatches(src, params.sourceToken)) return refuse(`source token ${params.sourceToken} is not USDT0 (${src.token}) on ${src.name}`);\n if (!tokenMatches(dst, params.destToken)) return refuse(`destination token ${params.destToken} is not USDT0 (${dst.token}) on ${dst.name}`);\n if (!/^\\d+$/.test(params.amountIn)) return refuse(\"amount must be a base-unit integer\");\n const amount = BigInt(params.amountIn);\n if (amount <= 0n) return refuse(\"amount must be positive\");\n // The placeholder prices a dry quote; a live one without addresses would send there (round 3, H8).\n const dry = params.dry !== false;\n const recipient = params.destAddress || (dry ? EVM_PLACEHOLDER : \"\");\n if (!recipient) return refuse(\"a live quote needs a recipient\");\n if (!isAddress(recipient)) return refuse(\"destination must be an EVM address\");\n const refund = params.refundAddress || (dry ? EVM_PLACEHOLDER : \"\");\n if (!refund) return refuse(\"a live quote needs a refund address\");\n if (!isAddress(refund)) return refuse(\"refund address must be an EVM address\");\n const c = client(src.caip2);\n if (!c) return refuse(`no RPC configured for ${src.caip2}`);\n\n try {\n await Promise.all([verifyChain(src), verifyPeer(src, dst)]);\n const probe = sendParam(dst.eid, recipient, amount, 0n);\n const [limit, feeDetails, receipt] = await c.readContract({address: getAddress(src.oft), abi: OFT_ABI, functionName: \"quoteOFT\", args: [probe]});\n if (amount < limit.minAmountLD) return refuse(`amount ${amount} is below the OFT minimum ${limit.minAmountLD}`);\n if (amount > limit.maxAmountLD) return refuse(`amount ${amount} exceeds the OFT maximum ${limit.maxAmountLD}`);\n const received = receipt.amountReceivedLD;\n if (received <= 0n) return refuse(\"amount is below the OFT dust threshold — nothing would arrive\");\n if (received > amount) return refuse(\"OFT reports more received than sent — refusing\");\n if (params.minAmountOut !== undefined && received < BigInt(params.minAmountOut)) return refuse(`received ${received} is below the caller's floor ${params.minAmountOut}`);\n const sp = sendParam(dst.eid, recipient, amount, received);\n const fee = await c.readContract({address: getAddress(src.oft), abi: OFT_ABI, functionName: \"quoteSend\", args: [sp, false]});\n if (fee.lzTokenFee !== 0n) return refuse(\"OFT asks for a fee in LZ token — unsupported\");\n // Sealed with headroom: OAppSender requires msg.value == MessagingFee.nativeFee, the\n // endpoint refunds whatever the current fee does not use to `refund`.\n const nativeFee = fee.nativeFee + (fee.nativeFee * FEE_HEADROOM_BPS) / 10_000n;\n const data = encodeFunctionData({abi: OFT_ABI, functionName: \"send\", args: [sp, {nativeFee, lzTokenFee: 0n}, getAddress(refund)]});\n const protocolFees = feeDetails\n .filter((f) => f.feeAmountLD > 0n)\n .map((f) => ({type: \"protocol\" as const, amount: f.feeAmountLD.toString(), token: src.token, included: true, description: f.description || \"OFT fee\"}));\n const feeUsd = protocolFees.reduce((a, f) => a + Number(f.amount) / 1e6, 0);\n // Ethereum sources wait for 60 confirmations before the DVNs attest (~15 min live); L2 sources land in a few minutes.\n const eta = src.chainId === 1 ? 1000 : 240;\n return {\n provider: \"usdt0\",\n intentId: `usdt0:${src.eid}:${dst.eid}`,\n depositAddress: \"\",\n depositMemo: null,\n txRequest: {\n to: src.oft,\n data,\n value: nativeFee.toString(),\n chainId: src.chainId,\n gasLimit: GAS_SEND,\n ...(src.adapter ? {approvalAddress: src.oft} : {}),\n ...(nativeFee > 0n ? {nativeFee: nativeFee.toString()} : {}),\n },\n sourceAmount: amount.toString(),\n destAmount: received.toString(),\n minDestAmount: received.toString(),\n feeUsd,\n fees: protocolFees,\n etaSeconds: eta,\n reliability: 0.98,\n validUntilMs: Date.now() + quoteTtlMs,\n providerData: {\n srcEid: String(src.eid), dstEid: String(dst.eid), oft: src.oft, token: src.token, recipient: getAddress(recipient), refundAddress: getAddress(refund),\n amountLD: amount.toString(), minAmountLD: received.toString(), nativeFee: nativeFee.toString(),\n },\n };\n } catch (err) {\n return refuse(rpcSafeReason(err, src.name));\n }\n },\n\n async buildDeposit(quote: Quote): Promise<UnsignedTx> {\n const tx = quote.txRequest;\n const parsed = parseIntent(quote.intentId);\n if (!tx || !parsed) throw new Error(\"swap2: USDT0 quote has no transaction request\");\n return {\n chain: parsed.src.caip2,\n to: tx.to ?? \"\",\n value: tx.value ?? \"0\",\n ...(tx.data ? {data: tx.data} : {}),\n ...(tx.chainId !== undefined ? {chainId: tx.chainId} : {}),\n ...(tx.gasLimit ? {gasLimit: tx.gasLimit} : {}),\n ...(tx.approvalAddress ? {approvalAddress: tx.approvalAddress} : {}),\n };\n },\n\n /**\n * Right before signing: the target is the source OFT, the peer is still the\n * destination OFT, and the CURRENT LayerZero fee still fits the sealed\n * `msg.value` (quote + headroom) — the endpoint reverts a send that\n * underpays, so a fee past the headroom means re-quote rather than a\n * wasted broadcast.\n */\n async preflightDeposit(quote: Quote, tx: UnsignedTx): Promise<void> {\n const parsed = parseIntent(quote.intentId);\n if (!parsed) throw new Error(\"usdt0: malformed intent id\");\n const {src, dst} = parsed;\n if (!same(tx.to, src.oft)) throw new Error(`usdt0: deposit target ${tx.to} is not the ${src.name} OFT`);\n const pd = quote.providerData ?? {};\n if (!/^\\d+$/.test(pd.amountLD ?? \"\") || !/^\\d+$/.test(pd.minAmountLD ?? \"\") || !/^\\d+$/.test(pd.nativeFee ?? \"\") || !isAddress(pd.recipient ?? \"\")) {\n throw new Error(\"usdt0: quote carries no sealed send parameters\");\n }\n const c = client(src.caip2);\n if (!c) throw new Error(`usdt0: no RPC for ${src.caip2}`);\n const sp = sendParam(dst.eid, pd.recipient!, BigInt(pd.amountLD!), BigInt(pd.minAmountLD!));\n let fee: {nativeFee: bigint};\n try {\n await Promise.all([verifyChain(src), verifyPeer(src, dst)]);\n fee = await c.readContract({address: getAddress(src.oft), abi: OFT_ABI, functionName: \"quoteSend\", args: [sp, false]});\n } catch (err) {\n throw new Error(rpcSafeReason(err, src.name));\n }\n const sealed = BigInt(pd.nativeFee!);\n if (fee.nativeFee > sealed) throw new Error(`usdt0: LayerZero fee rose to ${fee.nativeFee} above the sealed ${sealed} (quote + ${FEE_HEADROOM_BPS / 100n} % headroom) — re-quote`);\n if (BigInt(tx.value) !== sealed) throw new Error(`usdt0: transaction value ${tx.value} is not the quoted fee ${sealed}`);\n },\n\n async trackIntent(ref: IntentRef): Promise<IntentStatus> {\n const parsed = parseIntent(ref.intentId);\n if (!parsed) return {state: \"failed\"};\n const {src, dst} = parsed;\n if (!ref.sourceTxHash) return {state: \"pending\"};\n try {\n const m = await scanMessage(src, dst, ref.sourceTxHash);\n if (m === null) return {state: \"pending\", depositReceived: false};\n if (m === \"foreign\") return {state: \"failed\"}; // the hash carries a LayerZero message, but not ours\n const name = (m.status?.name ?? \"\").toUpperCase();\n const destHash = m.destination?.tx?.txHash;\n if (name === \"DELIVERED\") return {state: \"completed\", depositReceived: true, ...(destHash ? {destTxHash: destHash} : ref.destTxHash ? {destTxHash: ref.destTxHash} : {})};\n if (name === \"PAYLOAD_STORED\") return {state: \"action-required\", depositReceived: true, claim: {chain: dst.caip2, ready: true}};\n if ([\"FAILED\", \"APPLICATION_BURNED\", \"APPLICATION_SKIPPED\", \"UNRESOLVABLE_COMMAND\", \"MALFORMED_COMMAND\"].includes(name)) return {state: \"failed\", depositReceived: true};\n // INFLIGHT, CONFIRMING, BLOCKED (an earlier nonce on the pathway is stuck — LayerZero clears it), or anything new.\n return {state: \"pending\", depositReceived: true};\n } catch {\n return {state: \"pending\"};\n }\n },\n\n /**\n * A delivery that reverted on the destination (PAYLOAD_STORED — out of\n * executor gas, paused token) is retried by anyone through the endpoint:\n * `lzReceive(origin, receiver, guid, message, extraData)` with the exact\n * packet LayerZero Scan recorded. Null while nothing is stored.\n */\n async buildClaim(ref: IntentRef): Promise<UnsignedTx | null> {\n const parsed = parseIntent(ref.intentId);\n if (!parsed || !ref.sourceTxHash) return null;\n const {src, dst} = parsed;\n const m = await scanMessage(src, dst, ref.sourceTxHash);\n if (!m || m === \"foreign\" || (m.status?.name ?? \"\").toUpperCase() !== \"PAYLOAD_STORED\") return null;\n const nonce = m.pathway?.nonce;\n const guid = m.guid;\n const message = m.source?.tx?.payload;\n if (!Number.isInteger(nonce) || !isHexData(guid) || guid.length !== 66 || !isHexData(message) || message.length <= 2) {\n throw new Error(\"usdt0: LayerZero Scan has no complete packet for the stored payload\");\n }\n if (!same(m.pathway?.receiver?.address, dst.oft)) throw new Error(\"usdt0: stored payload is addressed to another receiver\");\n const valueRaw = m.source?.tx?.options?.lzReceive?.value ?? \"0\";\n const value = /^\\d+$/.test(valueRaw) ? valueRaw : \"0\";\n return {\n chain: dst.caip2,\n to: dst.endpoint,\n value,\n data: encodeFunctionData({\n abi: ENDPOINT_ABI,\n functionName: \"lzReceive\",\n args: [{srcEid: src.eid, sender: pad(getAddress(src.oft), {size: 32}), nonce: BigInt(nonce as number)}, getAddress(dst.oft), guid, message, \"0x\"],\n }),\n chainId: dst.chainId,\n gasLimit: GAS_CLAIM,\n };\n },\n };\n}\n\n/** Exported for tests and diagnostics: the LayerZero Scan status → swap2 state mapping. */\nexport const USDT0_STATUS_MAP: Readonly<Record<string, IntentState>> = Object.freeze({\n INFLIGHT: \"pending\", CONFIRMING: \"pending\", BLOCKED: \"pending\",\n DELIVERED: \"completed\", PAYLOAD_STORED: \"action-required\",\n FAILED: \"failed\", APPLICATION_BURNED: \"failed\", APPLICATION_SKIPPED: \"failed\", UNRESOLVABLE_COMMAND: \"failed\", MALFORMED_COMMAND: \"failed\",\n});\n\nexport {ZERO_B32 as USDT0_ZERO_PEER};\n","/**\n * Activity recognition for USDT0 on every chain in `config.ts`:\n * - `send(...)` on the chain's OFT is our source leg (\"Bridged USDT0\", or\n * \"Bridged USDT\" on Ethereum where the adapter locks plain USDT);\n * - the inbound leg is the executor's delivery — the user signs nothing, so\n * it is recognized by its effect: the chain's USDT0 minted to the owner\n * (from the zero address), or USDT released by the Ethereum adapter to the\n * owner, inside a transaction that did NOT call the token itself (a plain\n * transfer is not a bridge);\n * - `lzReceive` on the LayerZero endpoint is the owner's own retry of a\n * stored payload (`claimSwap2`).\n */\nimport type {ActivityItem, ChainTx, DescribeActivityContext} from \"@anywalletkit/core\";\nimport {calledContract, chainLabel, describeSwapLike, matchesCall} from \"@anywalletkit/protocol-swap2-core/activity\";\nimport {decodeFunctionData, parseAbi, type Hex} from \"viem\";\nimport {USDT0_BY_EID, USDT0_CHAINS, type Usdt0Chain} from \"./config.js\";\n\nconst SEND_ABI = parseAbi([\n \"struct SendParam { uint32 dstEid; bytes32 to; uint256 amountLD; uint256 minAmountLD; bytes extraOptions; bytes composeMsg; bytes oftCmd; }\",\n \"struct MessagingFee { uint256 nativeFee; uint256 lzTokenFee; }\",\n \"function send(SendParam sp, MessagingFee fee, address refundAddress)\",\n]);\n\nexport const USDT0_MODULE = \"@anywalletkit/protocol-swap2-usdt0\";\n\n/** send((uint32,bytes32,uint256,uint256,bytes,bytes,bytes),(uint256,uint256),address) — IOFT */\nexport const USDT0_SEND = \"0xc7c7f5b3\";\n/** lzReceive((uint32,bytes32,uint64),address,bytes32,bytes,bytes) — EndpointV2 */\nexport const LZ_RECEIVE = \"0x0c0c389e\";\n\nconst ZERO = \"0x0000000000000000000000000000000000000000\";\n\n/** The symbol the catalog uses on each deployment: USDT where the OFT wraps Tether's USDT, USDT0 elsewhere. */\nfunction symbolFor(chain: Usdt0Chain): string {\n return chain.adapter || [42161, 10, 137].includes(chain.chainId) ? \"USDT\" : \"USDT0\";\n}\n\n/** `send(SendParam, …)` → the destination deployment (dstEid is the first word of the tuple), null when the calldata is absent or foreign. */\nfunction sendDestination(tx: ChainTx): Usdt0Chain | null {\n const data = tx.call?.data;\n if (!data || data.length < 10 + 64 * 2) return null;\n try {\n const [sp] = decodeFunctionData({abi: SEND_ABI, data: data as Hex}).args as unknown as [{dstEid: number}];\n return USDT0_BY_EID[sp.dstEid] ?? null;\n } catch {\n return null;\n }\n}\nconst lc = (a: string) => a.toLowerCase();\n\nexport function describeUsdt0Activity(tx: ChainTx, ctx: DescribeActivityContext): ActivityItem | null {\n const chain = USDT0_CHAINS[tx.chain];\n if (!chain) return null;\n const subtitle = `USDT0 · ${chainLabel(tx.chain)}`;\n if (matchesCall(tx, [chain.oft], [USDT0_SEND])) {\n // The native value is the LayerZero messaging fee (plus the headroom the\n // endpoint refunds), not an asset the owner swapped away: it rides in `fee`\n // next to the gas, and the title names both ends when the calldata says\n // where the tokens go.\n const dst = sendDestination(tx);\n const item = describeSwapLike(tx, ctx, {protocol: USDT0_MODULE, subtitle, kind: \"bridge\", outVerb: \"Bridged\"});\n if (!item) return null;\n const native = item.assetsOut.filter((a) => a.token === null).reduce((sum, a) => sum + a.amount, 0n);\n item.assetsOut = item.assetsOut.filter((a) => a.token !== null);\n if (native > 0n) item.fee = (item.fee ?? 0n) + native;\n const srcSym = item.assetsOut[0]?.symbol ?? symbolFor(chain);\n if (dst) {\n item.title = `Bridged ${srcSym} → ${symbolFor(dst)}`;\n item.subtitle = `USDT0 · ${chainLabel(tx.chain)} → ${dst.name}`;\n } else item.title = `Bridged ${srcSym}`;\n return item;\n }\n if (matchesCall(tx, [chain.endpoint], [LZ_RECEIVE])) {\n return describeSwapLike(tx, ctx, {protocol: USDT0_MODULE, subtitle, kind: \"bridge\", inSuffix: \"via LayerZero\"});\n }\n // Delivery by the LayerZero executor: the token moves out of nowhere (mint)\n // or out of the adapter into the owner, and the call target is not the token.\n const called = calledContract(tx);\n if (called && called === lc(chain.token)) return null;\n const own = new Set([...ctx.own].map(lc));\n const origin = chain.adapter ? lc(chain.oft) : ZERO;\n const delivered = tx.transfers.some((t) => t.token !== null && lc(t.token) === lc(chain.token) && lc(t.from) === origin && own.has(lc(t.to)));\n if (!delivered || own.has(lc(tx.from))) return null;\n return describeSwapLike(tx, ctx, {protocol: USDT0_MODULE, subtitle, kind: \"bridge\", inSuffix: \"via LayerZero\", counterparty: chain.oft});\n}\n","// USDT0 — Tether's LayerZero OFT for USDT. Source: docs.usdt0.to\n// (technical-documentation/deployments, read 2026-10-20) — every row below was\n// then re-read on-chain over public RPCs the same day: the OFT's `token()` is\n// the listed token, `endpoint()` is the listed endpoint (and reports the\n// listed eid), `approvalRequired()` is true only for the Ethereum adapter,\n// `sharedDecimals()` = 6 everywhere, and `peers(eid)` are wired between the\n// chains. `oftVersion()` = (0x02e49c2c, 1) on all of them.\n//\n// Only chains the SDK ships (swap2-assets / wallet-evm) are listed. USDT0 is\n// also deployed on Conflux eSpace (1030, eid 30212), Flare (14, 30295),\n// Hedera (295, 30316), Mantle (5000, 30181), Morph (2818, 30322), Rootstock\n// (30, 30333), Stable (988, 30396), Tempo (4217, 30410), plus HyperCore, IOTA\n// and Stellar (non-EVM) — not wallet chains here, so not routable here.\nimport type {RemotePins} from \"@anywalletkit/protocol-swap2-core/types\";\nimport {evmRef, isEvm} from \"@anywalletkit/protocol-swap2-core/util\";\n\nexport interface Usdt0Chain {\n caip2: string;\n chainId: number;\n /** LayerZero V2 endpoint id. */\n eid: number;\n name: string;\n /** The ERC-20 the user holds: USDT on Ethereum, USDT0 elsewhere (6 decimals everywhere). */\n token: string;\n /**\n * The OFT contract `quoteSend` / `send` are called on. On Ethereum it is the\n * OFT *adapter* that locks USDT (`approvalRequired()` = true, approve the\n * token to it); elsewhere it is the OUpgradeable OFT that burns the caller's\n * USDT0 through the token's mint/burn role — no approval.\n */\n oft: string;\n /** LayerZero V2 EndpointV2 on that chain (`lzReceive` retries of a stored payload go here). */\n endpoint: string;\n /** True on Ethereum: the OFT is a lockbox adapter in front of plain USDT. */\n adapter: boolean;\n}\n\nconst LZ_ENDPOINT_A = \"0x1a44076050125825900e736c501f859c50fE728c\";\nconst LZ_ENDPOINT_B = \"0x6F475642a6e85809B1c36Fa62763669b1b48DD5B\";\n\nconst c = (chainId: number, eid: number, name: string, token: string, oft: string, endpoint: string, adapter = false): Usdt0Chain => ({\n caip2: `eip155:${chainId}`, chainId, eid, name, token, oft, endpoint, adapter,\n});\n\n/** CAIP-2 → USDT0 deployment. */\nexport const USDT0_CHAINS: Readonly<Record<string, Usdt0Chain>> = Object.freeze(Object.fromEntries([\n c(1, 30101, \"Ethereum\", \"0xdAC17F958D2ee523a2206206994597C13D831ec7\", \"0x6C96dE32CEa08842dcc4058c14d3aaAD7Fa41dee\", LZ_ENDPOINT_A, true),\n c(42161, 30110, \"Arbitrum\", \"0xFd086bC7CD5C481DCC9C85ebE478A1C0b69FCbb9\", \"0x14E4A1B13bf7F943c8ff7C51fb60FA964A298D92\", LZ_ENDPOINT_A),\n c(10, 30111, \"OP Mainnet\", \"0x01bFF41798a0BcF287b996046Ca68b395DbC1071\", \"0xF03b4d9AC1D5d1E7c4cEf54C2A313b9fe051A0aD\", LZ_ENDPOINT_A),\n c(137, 30109, \"Polygon PoS\", \"0xc2132D05D31c914a87C6611C10748AEb04B58e8F\", \"0x6BA10300f0DC58B7a1e4c0e41f5daBb7D7829e13\", LZ_ENDPOINT_A),\n c(999, 30367, \"HyperEVM\", \"0xB8CE59FC3717ada4C02eaDF9682A9e934F625ebb\", \"0x904861a24F30EC96ea7CFC3bE9EA4B476d237e98\", \"0x3A73033C0b1407574C76BdBAc67f126f6b4a9AA9\"),\n c(57073, 30339, \"Ink\", \"0x0200C29006150606B650577BBE7B6248F58470c1\", \"0x1cB6De532588fCA4a21B7209DE7C456AF8434A65\", \"0xca29f3A6f966Cb2fc0dE625F8f325c0C46dbE958\"),\n c(80094, 30362, \"Berachain\", \"0x779Ded0c9e1022225f8E0630b35a9b54bE713736\", \"0x3Dc96399109df5ceb2C226664A086140bD0379cB\", LZ_ENDPOINT_B),\n c(130, 30320, \"Unichain\", \"0x9151434b16b9763660705744891fA906F660EcC5\", \"0xc07bE8994D035631c36fb4a89C918CeFB2f03EC3\", LZ_ENDPOINT_B),\n c(1329, 30280, \"Sei\", \"0x9151434b16b9763660705744891fA906F660EcC5\", \"0x56Fe74A2e3b484b921c447357203431a3485CC60\", LZ_ENDPOINT_A),\n c(9745, 30383, \"Plasma\", \"0xB8CE59FC3717ada4C02eaDF9682A9e934F625ebb\", \"0x02ca37966753bDdDf11216B73B16C1dE756A7CF9\", LZ_ENDPOINT_B),\n c(143, 30390, \"Monad\", \"0xe7cd86e13AC4309349F30B3435a9d337750fC82D\", \"0x9151434b16b9763660705744891fA906F660EcC5\", LZ_ENDPOINT_B),\n c(4326, 30398, \"MegaETH\", \"0xB8CE59FC3717ada4C02eaDF9682A9e934F625ebb\", \"0x9151434b16b9763660705744891fA906F660EcC5\", LZ_ENDPOINT_B),\n c(196, 30274, \"X Layer\", \"0x779Ded0c9e1022225f8E0630b35a9b54bE713736\", \"0x94bcCa6BdfD6a61817aB0E960BfedE4984505554\", LZ_ENDPOINT_A),\n // 2026-10-20 (evm-chains-6 batch): docs.usdt0.to deployments, re-read on-chain (token(), approvalRequired() = false,\n // sharedDecimals() = 6, endpoint(), peers(30110) = the Arbitrum OFT).\n c(5000, 30181, \"Mantle\", \"0x779Ded0c9e1022225f8E0630b35a9b54bE713736\", \"0xcb768e263FB1C62214E7cab4AA8d036D76dc59CC\", LZ_ENDPOINT_A),\n c(2818, 30322, \"Morph\", \"0xe7cd86e13AC4309349F30B3435a9d337750fC82D\", \"0xcb768e263FB1C62214E7cab4AA8d036D76dc59CC\", LZ_ENDPOINT_B),\n c(14, 30295, \"Flare\", \"0xe7cd86e13AC4309349F30B3435a9d337750fC82D\", \"0x567287d2A9829215a37e3B88843d32f9221E7588\", LZ_ENDPOINT_A),\n].map((x) => [x.caip2, x])));\n\n/** LayerZero eid → deployment. */\nexport const USDT0_BY_EID: Readonly<Record<number, Usdt0Chain>> = Object.freeze(\n Object.fromEntries(Object.values(USDT0_CHAINS).map((x) => [x.eid, x])),\n);\n\n/** LayerZero Scan — message status by source transaction hash. */\nexport const LZ_SCAN_API = \"https://scan.layerzero-api.com\";\n\n/** Token symbols the catalog uses for the same asset across chains. */\nexport const USDT0_SYMBOLS: readonly string[] = Object.freeze([\"USDT0\", \"USDT\", \"USD₮0\", \"USD₮\"]);\n\nexport const usdt0 = {\n supportsChain(chain: string): boolean {\n return isEvm(chain) && !!USDT0_CHAINS[`eip155:${evmRef(chain)}`];\n },\n supports(from: string, to: string): boolean {\n return from !== to && this.supportsChain(from) && this.supportsChain(to);\n },\n};\n\n/**\n * The USDT0 OFT a send calls on a chain, and the adapter it approves where one locks USDT (Ethereum) —\n * the app's pins for `remoteProvider({name: \"usdt0\", baseUrl, ...usdt0Pins})` (scan 2026-10-27 modules, F8/F16).\n */\nexport const usdt0Pins: RemotePins = Object.freeze({\n callTargets: (chain: string): readonly string[] => { const c = usdt0ChainFor(chain); return c ? [c.oft] : []; },\n spenders: (chain: string): readonly string[] => { const c = usdt0ChainFor(chain); return c?.adapter ? [c.oft] : []; },\n});\nfunction usdt0ChainFor(chain: string): Usdt0Chain | undefined {\n return Object.prototype.hasOwnProperty.call(USDT0_CHAINS, chain) ? USDT0_CHAINS[chain] : undefined;\n}\n"],"mappings":"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","names":["import_viem","c","import_util","c"]}
package/dist/provider.js CHANGED
@@ -2,9 +2,9 @@ import {
2
2
  USDT0_STATUS_MAP,
3
3
  ZERO_B32,
4
4
  usdt0Provider
5
- } from "./chunk-AOWDDZ4B.js";
6
- import "./chunk-SFWB4C4U.js";
7
- import "./chunk-AGN4M7OO.js";
5
+ } from "./chunk-COIPAOOA.js";
6
+ import "./chunk-DGMQ563D.js";
7
+ import "./chunk-7YL2Y3QA.js";
8
8
  export {
9
9
  USDT0_STATUS_MAP,
10
10
  ZERO_B32 as USDT0_ZERO_PEER,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@anywalletkit/protocol-swap2-usdt0",
3
- "version": "0.1.8",
3
+ "version": "0.2.1",
4
4
  "description": "USDT0 (Tether's LayerZero OFT for USDT) for the swap2 engine: USDT / USDT0 between 16 EVM chains in one source transaction — quoteOFT + quoteSend on the OFT itself, send with the LayerZero fee as msg.value, status from LayerZero Scan, lzReceive retry of a stored payload as the claim. Bound to the deployments docs.usdt0.to lists, re-verified on-chain.",
5
5
  "license": "Apache-2.0",
6
6
  "homepage": "https://docs.anywallet.tech",
@@ -56,17 +56,17 @@
56
56
  "dependencies": {
57
57
  "viem": "^2.57.2",
58
58
  "@anywalletkit/swap2-assets": "0.2.2",
59
- "@anywalletkit/protocol-swap2-core": "0.6.1"
59
+ "@anywalletkit/protocol-swap2-core": "0.8.0"
60
60
  },
61
61
  "peerDependencies": {
62
- "@anywalletkit/core": "0.6.1"
62
+ "@anywalletkit/core": "0.7.0"
63
63
  },
64
64
  "devDependencies": {
65
65
  "@types/node": "^22",
66
66
  "vitest": "^5.0.3",
67
- "@anywalletkit/protocol-swap2-router": "0.2.8",
68
- "@anywalletkit/core": "0.6.1",
69
- "@anywalletkit/conformance": "0.4.4"
67
+ "@anywalletkit/core": "0.7.0",
68
+ "@anywalletkit/protocol-swap2-router": "0.4.0",
69
+ "@anywalletkit/conformance": "0.4.6"
70
70
  },
71
71
  "keywords": [
72
72
  "swap2",