@t402/evm 2.6.1 → 2.7.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.
Files changed (37) hide show
  1. package/dist/cjs/constants-05D7IZJA.d.ts +136 -0
  2. package/dist/cjs/permit2/index.d.ts +1 -137
  3. package/dist/cjs/permit2-proxy/client/index.d.ts +83 -0
  4. package/dist/cjs/permit2-proxy/client/index.js +182 -0
  5. package/dist/cjs/permit2-proxy/client/index.js.map +1 -0
  6. package/dist/cjs/permit2-proxy/facilitator/index.d.ts +93 -0
  7. package/dist/cjs/permit2-proxy/facilitator/index.js +368 -0
  8. package/dist/cjs/permit2-proxy/facilitator/index.js.map +1 -0
  9. package/dist/cjs/permit2-proxy/index.d.ts +344 -0
  10. package/dist/cjs/permit2-proxy/index.js +1274 -0
  11. package/dist/cjs/permit2-proxy/index.js.map +1 -0
  12. package/dist/cjs/permit2-proxy/server/index.d.ts +130 -0
  13. package/dist/cjs/permit2-proxy/server/index.js +695 -0
  14. package/dist/cjs/permit2-proxy/server/index.js.map +1 -0
  15. package/dist/esm/chunk-A2U6NWHQ.mjs +199 -0
  16. package/dist/esm/chunk-A2U6NWHQ.mjs.map +1 -0
  17. package/dist/esm/chunk-HUUYTNV2.mjs +138 -0
  18. package/dist/esm/chunk-HUUYTNV2.mjs.map +1 -0
  19. package/dist/esm/chunk-THXENBBU.mjs +251 -0
  20. package/dist/esm/chunk-THXENBBU.mjs.map +1 -0
  21. package/dist/esm/chunk-UK2POASM.mjs +204 -0
  22. package/dist/esm/chunk-UK2POASM.mjs.map +1 -0
  23. package/dist/esm/constants-05D7IZJA.d.mts +136 -0
  24. package/dist/esm/permit2/index.d.mts +1 -137
  25. package/dist/esm/permit2-proxy/client/index.d.mts +83 -0
  26. package/dist/esm/permit2-proxy/client/index.mjs +12 -0
  27. package/dist/esm/permit2-proxy/client/index.mjs.map +1 -0
  28. package/dist/esm/permit2-proxy/facilitator/index.d.mts +93 -0
  29. package/dist/esm/permit2-proxy/facilitator/index.mjs +12 -0
  30. package/dist/esm/permit2-proxy/facilitator/index.mjs.map +1 -0
  31. package/dist/esm/permit2-proxy/index.d.mts +344 -0
  32. package/dist/esm/permit2-proxy/index.mjs +45 -0
  33. package/dist/esm/permit2-proxy/index.mjs.map +1 -0
  34. package/dist/esm/permit2-proxy/server/index.d.mts +130 -0
  35. package/dist/esm/permit2-proxy/server/index.mjs +13 -0
  36. package/dist/esm/permit2-proxy/server/index.mjs.map +1 -0
  37. package/package.json +43 -3
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/permit2-proxy/index.ts","../../../src/permit2-proxy/client/scheme.ts","../../../src/permit2/constants.ts","../../../src/permit2-proxy/constants.ts","../../../src/permit2-proxy/client/register.ts","../../../src/tokens.ts","../../../src/permit2-proxy/server/scheme.ts","../../../src/permit2-proxy/server/register.ts","../../../src/permit2-proxy/facilitator/scheme.ts","../../../src/permit2-proxy/facilitator/register.ts"],"sourcesContent":["// Client\nexport { Permit2ProxyEvmScheme as Permit2ProxyEvmClientScheme } from \"./client/scheme\";\nexport { registerPermit2ProxyEvmScheme as registerPermit2ProxyEvmClientScheme } from \"./client/register\";\nexport type { Permit2ProxyEvmClientConfig } from \"./client/register\";\n\n// Server\nexport { Permit2ProxyEvmScheme as Permit2ProxyEvmServerScheme } from \"./server/scheme\";\nexport type { Permit2ProxyEvmSchemeConfig as Permit2ProxyEvmServerSchemeConfig } from \"./server/scheme\";\nexport { registerPermit2ProxyEvmScheme as registerPermit2ProxyEvmServerScheme } from \"./server/register\";\nexport type { Permit2ProxyEvmResourceServerConfig } from \"./server/register\";\n\n// Facilitator\nexport { Permit2ProxyEvmScheme as Permit2ProxyEvmFacilitatorScheme } from \"./facilitator/scheme\";\nexport type { Permit2ProxyEvmSchemeConfig as Permit2ProxyEvmFacilitatorSchemeConfig } from \"./facilitator/scheme\";\nexport { registerPermit2ProxyEvmScheme as registerPermit2ProxyEvmFacilitatorScheme } from \"./facilitator/register\";\nexport type { Permit2ProxyEvmFacilitatorConfig } from \"./facilitator/register\";\n\n// Types\nexport type { Permit2ProxyPayloadV2, T402Witness, PermitTransferFrom, TokenPermissions } from \"./types\";\n\n// Constants\nexport {\n PERMIT2_ADDRESS,\n SCHEME_PERMIT2_PROXY,\n T402_EXACT_PERMIT2_PROXY,\n T402_UPTO_PERMIT2_PROXY,\n WITNESS_TYPEHASH,\n WITNESS_TYPE_STRING,\n permit2WitnessTypes,\n permit2ProxyExactABI,\n permit2ProxyUptoABI,\n} from \"./constants\";\n","import { PaymentPayload, PaymentRequirements, SchemeNetworkClient } from \"@t402/core/types\";\nimport { getAddress } from \"viem\";\nimport { ClientEvmSigner } from \"../../signer\";\nimport { Permit2ProxyPayloadV2, T402Witness } from \"../types\";\nimport { PERMIT2_ADDRESS, SCHEME_PERMIT2_PROXY, permit2WitnessTypes } from \"../constants\";\n\n/**\n * EVM client implementation for the Permit2 Proxy payment scheme.\n *\n * Uses Uniswap Permit2 PermitWitnessTransferFrom with a Witness struct\n * that binds the payment to a specific facilitator and destination.\n */\nexport class Permit2ProxyEvmScheme implements SchemeNetworkClient {\n readonly scheme = SCHEME_PERMIT2_PROXY;\n\n /**\n * Creates a new Permit2ProxyEvmScheme instance.\n *\n * @param signer - The EVM signer for client operations\n */\n constructor(private readonly signer: ClientEvmSigner) {}\n\n /**\n * Creates a payment payload for the Permit2 Proxy scheme.\n *\n * @param t402Version - The t402 protocol version\n * @param paymentRequirements - The payment requirements\n * @returns Promise resolving to a payment payload\n */\n async createPaymentPayload(\n t402Version: number,\n paymentRequirements: PaymentRequirements,\n ): Promise<Pick<PaymentPayload, \"t402Version\" | \"payload\">> {\n const now = Math.floor(Date.now() / 1000);\n const deadline = now + paymentRequirements.maxTimeoutSeconds;\n\n // Use a random nonce (Permit2 nonces are bitmap-based, not sequential)\n const nonce = BigInt(\n \"0x\" +\n Array.from(globalThis.crypto.getRandomValues(new Uint8Array(32)))\n .map(b => b.toString(16).padStart(2, \"0\"))\n .join(\"\"),\n ).toString();\n\n // Get proxy address from requirements extra (set by server's enhancePaymentRequirements)\n const proxyAddress = (paymentRequirements.extra?.exactProxyAddress ||\n paymentRequirements.extra?.uptoProxyAddress) as `0x${string}` | undefined;\n\n if (!proxyAddress) {\n throw new Error(\n \"Missing proxy address in payment requirements extra (exactProxyAddress or uptoProxyAddress)\",\n );\n }\n\n // Get facilitator address from requirements extra\n const facilitatorAddress = paymentRequirements.extra?.facilitator as\n | `0x${string}`\n | undefined;\n\n if (!facilitatorAddress) {\n throw new Error(\"Missing facilitator address in payment requirements extra\");\n }\n\n const permit = {\n permitted: {\n token: getAddress(paymentRequirements.asset) as `0x${string}`,\n amount: paymentRequirements.amount,\n },\n nonce,\n deadline: deadline.toString(),\n };\n\n // Build witness: binds the payment to a destination, facilitator, and time constraint\n const witness: T402Witness = {\n to: getAddress(paymentRequirements.payTo) as `0x${string}`,\n facilitator: getAddress(facilitatorAddress) as `0x${string}`,\n validAfter: \"0\", // Immediate validity\n };\n\n // Sign the PermitWitnessTransferFrom with Witness\n const signature = await this.signPermit2Witness(\n permit,\n witness,\n proxyAddress,\n paymentRequirements,\n );\n\n const payload: Permit2ProxyPayloadV2 = {\n permit,\n witness,\n signature,\n owner: this.signer.address,\n };\n\n return {\n t402Version,\n payload,\n };\n }\n\n /**\n * Sign the Permit2 PermitWitnessTransferFrom using EIP-712.\n *\n * @param permit - The permit transfer data\n * @param witness - The witness data\n * @param spender - The proxy contract address (spender in Permit2)\n * @param requirements - The payment requirements\n * @returns Signed typed data hex string\n */\n private async signPermit2Witness(\n permit: Permit2ProxyPayloadV2[\"permit\"],\n witness: T402Witness,\n spender: `0x${string}`,\n requirements: PaymentRequirements,\n ): Promise<`0x${string}`> {\n const chainId = parseInt(requirements.network.split(\":\")[1]);\n\n const domain = {\n name: \"Permit2\",\n chainId,\n verifyingContract: PERMIT2_ADDRESS,\n };\n\n const message = {\n permitted: {\n token: permit.permitted.token,\n amount: BigInt(permit.permitted.amount),\n },\n spender: getAddress(spender),\n nonce: BigInt(permit.nonce),\n deadline: BigInt(permit.deadline),\n witness: {\n to: witness.to,\n facilitator: witness.facilitator,\n validAfter: BigInt(witness.validAfter),\n },\n };\n\n return await this.signer.signTypedData({\n domain,\n types: permit2WitnessTypes,\n primaryType: \"PermitWitnessTransferFrom\",\n message,\n });\n }\n}\n","/**\n * Permit2 Constants\n *\n * Uniswap Permit2 contract addresses, type hashes, and ABI fragments.\n */\n\n/** Canonical Permit2 contract address (same on all EVM chains) */\nexport const PERMIT2_ADDRESS = \"0x000000000022D473030F116dDEE9F6B43aC78BA3\" as const;\n\n/** EIP-712 type definitions for Permit2 SignatureTransfer */\nexport const permit2Types = {\n PermitTransferFrom: [\n { name: \"permitted\", type: \"TokenPermissions\" },\n { name: \"spender\", type: \"address\" },\n { name: \"nonce\", type: \"uint256\" },\n { name: \"deadline\", type: \"uint256\" },\n ],\n TokenPermissions: [\n { name: \"token\", type: \"address\" },\n { name: \"amount\", type: \"uint256\" },\n ],\n} as const;\n\n/** Permit2 ABI for permitTransferFrom */\nexport const permit2ABI = [\n {\n inputs: [\n {\n components: [\n {\n components: [\n { name: \"token\", type: \"address\" },\n { name: \"amount\", type: \"uint256\" },\n ],\n name: \"permitted\",\n type: \"tuple\",\n },\n { name: \"nonce\", type: \"uint256\" },\n { name: \"deadline\", type: \"uint256\" },\n ],\n name: \"permit\",\n type: \"tuple\",\n },\n {\n components: [\n { name: \"to\", type: \"address\" },\n { name: \"requestedAmount\", type: \"uint256\" },\n ],\n name: \"transferDetails\",\n type: \"tuple\",\n },\n { name: \"owner\", type: \"address\" },\n { name: \"signature\", type: \"bytes\" },\n ],\n name: \"permitTransferFrom\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [{ name: \"account\", type: \"address\" }],\n name: \"balanceOf\",\n outputs: [{ name: \"\", type: \"uint256\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n] as const;\n\n/** ERC20 balanceOf ABI for balance checks */\nexport const erc20BalanceABI = [\n {\n inputs: [{ name: \"account\", type: \"address\" }],\n name: \"balanceOf\",\n outputs: [{ name: \"\", type: \"uint256\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n] as const;\n","/**\n * Permit2 Proxy Constants\n *\n * Contract addresses, EIP-712 type definitions, and ABI fragments\n * for T402 Permit2 proxy contracts with witness-based settlement.\n */\n\n// Re-export shared Permit2 constants\nexport { PERMIT2_ADDRESS, erc20BalanceABI } from \"../permit2/constants\";\n\n/** Scheme identifier for Permit2 proxy */\nexport const SCHEME_PERMIT2_PROXY = \"permit2-proxy\" as const;\n\n/** T402 Exact Permit2 Proxy contract address (TBD - not yet deployed) */\nexport const T402_EXACT_PERMIT2_PROXY =\n \"0x0000000000000000000000000000000000000000\" as `0x${string}`;\n\n/** T402 Upto Permit2 Proxy contract address (TBD - not yet deployed) */\nexport const T402_UPTO_PERMIT2_PROXY =\n \"0x0000000000000000000000000000000000000000\" as `0x${string}`;\n\n/**\n * EIP-712 typehash for the Witness struct.\n * Must match WITNESS_TYPEHASH in T402BasePermit2Proxy.sol:\n * keccak256(\"Witness(address to,address facilitator,uint256 validAfter)\")\n */\nexport const WITNESS_TYPEHASH =\n \"0x5e3bbbe812684a9a24e1e1b7fe7c5b763bfb791ee8423aed3b4e1a5a9e25c255\" as const;\n\n/**\n * Witness type string for Permit2's permitWitnessTransferFrom.\n * Format: \"Witness witness)TokenPermissions(...)Witness(...)\" -- types listed alphabetically.\n * Must match WITNESS_TYPE_STRING in T402BasePermit2Proxy.sol.\n */\nexport const WITNESS_TYPE_STRING =\n \"Witness witness)TokenPermissions(address token,uint256 amount)Witness(address to,address facilitator,uint256 validAfter)\" as const;\n\n/**\n * EIP-712 type definitions for PermitWitnessTransferFrom with Witness.\n * Used by clients when signing the permit with witness data.\n */\nexport const permit2WitnessTypes = {\n PermitWitnessTransferFrom: [\n { name: \"permitted\", type: \"TokenPermissions\" },\n { name: \"spender\", type: \"address\" },\n { name: \"nonce\", type: \"uint256\" },\n { name: \"deadline\", type: \"uint256\" },\n { name: \"witness\", type: \"Witness\" },\n ],\n TokenPermissions: [\n { name: \"token\", type: \"address\" },\n { name: \"amount\", type: \"uint256\" },\n ],\n Witness: [\n { name: \"to\", type: \"address\" },\n { name: \"facilitator\", type: \"address\" },\n { name: \"validAfter\", type: \"uint256\" },\n ],\n} as const;\n\n/**\n * ABI for T402ExactPermit2Proxy contract.\n * Includes settle() and settleWithPermit() functions.\n */\nexport const permit2ProxyExactABI = [\n {\n inputs: [\n {\n components: [\n {\n components: [\n { name: \"token\", type: \"address\" },\n { name: \"amount\", type: \"uint256\" },\n ],\n name: \"permitted\",\n type: \"tuple\",\n },\n { name: \"nonce\", type: \"uint256\" },\n { name: \"deadline\", type: \"uint256\" },\n ],\n name: \"permit\",\n type: \"tuple\",\n },\n { name: \"owner\", type: \"address\" },\n {\n components: [\n { name: \"to\", type: \"address\" },\n { name: \"facilitator\", type: \"address\" },\n { name: \"validAfter\", type: \"uint256\" },\n ],\n name: \"witness\",\n type: \"tuple\",\n },\n { name: \"signature\", type: \"bytes\" },\n ],\n name: \"settle\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n components: [\n { name: \"value\", type: \"uint256\" },\n { name: \"deadline\", type: \"uint256\" },\n { name: \"v\", type: \"uint8\" },\n { name: \"r\", type: \"bytes32\" },\n { name: \"s\", type: \"bytes32\" },\n ],\n name: \"permit2612\",\n type: \"tuple\",\n },\n {\n components: [\n {\n components: [\n { name: \"token\", type: \"address\" },\n { name: \"amount\", type: \"uint256\" },\n ],\n name: \"permitted\",\n type: \"tuple\",\n },\n { name: \"nonce\", type: \"uint256\" },\n { name: \"deadline\", type: \"uint256\" },\n ],\n name: \"permit\",\n type: \"tuple\",\n },\n { name: \"owner\", type: \"address\" },\n {\n components: [\n { name: \"to\", type: \"address\" },\n { name: \"facilitator\", type: \"address\" },\n { name: \"validAfter\", type: \"uint256\" },\n ],\n name: \"witness\",\n type: \"tuple\",\n },\n { name: \"signature\", type: \"bytes\" },\n ],\n name: \"settleWithPermit\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n] as const;\n\n/**\n * ABI for T402UptoPermit2Proxy contract.\n * Includes settle() and settleWithPermit() functions.\n */\nexport const permit2ProxyUptoABI = [\n {\n inputs: [\n {\n components: [\n {\n components: [\n { name: \"token\", type: \"address\" },\n { name: \"amount\", type: \"uint256\" },\n ],\n name: \"permitted\",\n type: \"tuple\",\n },\n { name: \"nonce\", type: \"uint256\" },\n { name: \"deadline\", type: \"uint256\" },\n ],\n name: \"permit\",\n type: \"tuple\",\n },\n { name: \"amount\", type: \"uint256\" },\n { name: \"owner\", type: \"address\" },\n {\n components: [\n { name: \"to\", type: \"address\" },\n { name: \"facilitator\", type: \"address\" },\n { name: \"validAfter\", type: \"uint256\" },\n ],\n name: \"witness\",\n type: \"tuple\",\n },\n { name: \"signature\", type: \"bytes\" },\n ],\n name: \"settle\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n inputs: [\n {\n components: [\n { name: \"value\", type: \"uint256\" },\n { name: \"deadline\", type: \"uint256\" },\n { name: \"v\", type: \"uint8\" },\n { name: \"r\", type: \"bytes32\" },\n { name: \"s\", type: \"bytes32\" },\n ],\n name: \"permit2612\",\n type: \"tuple\",\n },\n {\n components: [\n {\n components: [\n { name: \"token\", type: \"address\" },\n { name: \"amount\", type: \"uint256\" },\n ],\n name: \"permitted\",\n type: \"tuple\",\n },\n { name: \"nonce\", type: \"uint256\" },\n { name: \"deadline\", type: \"uint256\" },\n ],\n name: \"permit\",\n type: \"tuple\",\n },\n { name: \"amount\", type: \"uint256\" },\n { name: \"owner\", type: \"address\" },\n {\n components: [\n { name: \"to\", type: \"address\" },\n { name: \"facilitator\", type: \"address\" },\n { name: \"validAfter\", type: \"uint256\" },\n ],\n name: \"witness\",\n type: \"tuple\",\n },\n { name: \"signature\", type: \"bytes\" },\n ],\n name: \"settleWithPermit\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n] as const;\n","import { t402Client, SelectPaymentRequirements, PaymentPolicy } from \"@t402/core/client\";\nimport { Network } from \"@t402/core/types\";\nimport { ClientEvmSigner } from \"../../signer\";\nimport { Permit2ProxyEvmScheme } from \"./scheme\";\n\n/**\n * Configuration options for registering Permit2 Proxy EVM schemes to an t402Client\n */\nexport interface Permit2ProxyEvmClientConfig {\n /**\n * The EVM signer to use for creating payment payloads\n */\n signer: ClientEvmSigner;\n\n /**\n * Optional payment requirements selector function\n * If not provided, uses the default selector (first available option)\n */\n paymentRequirementsSelector?: SelectPaymentRequirements;\n\n /**\n * Optional policies to apply to the client\n */\n policies?: PaymentPolicy[];\n\n /**\n * Optional specific networks to register\n * If not provided, registers wildcard support (eip155:*)\n */\n networks?: Network[];\n}\n\n/**\n * Registers Permit2 Proxy EVM payment schemes to an t402Client instance.\n *\n * @param client - The t402Client instance to register schemes to\n * @param config - Configuration for Permit2 Proxy EVM client registration\n * @returns The client instance for chaining\n *\n * @example\n * ```typescript\n * import { registerPermit2ProxyEvmScheme } from \"@t402/evm/permit2-proxy/client\";\n * import { t402Client } from \"@t402/core/client\";\n * import { privateKeyToAccount } from \"viem/accounts\";\n *\n * const account = privateKeyToAccount(\"0x...\");\n * const client = new t402Client();\n * registerPermit2ProxyEvmScheme(client, { signer: account });\n * ```\n */\nexport function registerPermit2ProxyEvmScheme(\n client: t402Client,\n config: Permit2ProxyEvmClientConfig,\n): t402Client {\n if (config.networks && config.networks.length > 0) {\n config.networks.forEach(network => {\n client.register(network, new Permit2ProxyEvmScheme(config.signer));\n });\n } else {\n client.register(\"eip155:*\", new Permit2ProxyEvmScheme(config.signer));\n }\n\n if (config.policies) {\n config.policies.forEach(policy => {\n client.registerPolicy(policy);\n });\n }\n\n return client;\n}\n","/**\n * Token configuration for T402 EVM payments\n *\n * This module provides comprehensive token definitions including:\n * - USDT0 (Tether's new omnichain token with EIP-3009 support)\n * - USDC (USD Coin with EIP-3009 support)\n * - Legacy tokens configuration\n */\n\nimport type { Address } from \"viem\";\n\n/**\n * Token type classification for payment scheme selection\n */\nexport type TokenType = \"eip3009\" | \"legacy\";\n\n/**\n * Token configuration with EIP-712 domain parameters\n */\nexport interface TokenConfig {\n /** Token contract address */\n address: Address;\n /** Token symbol (e.g., \"USDT0\", \"USDC\") */\n symbol: string;\n /** EIP-712 domain name for signing */\n name: string;\n /** EIP-712 domain version for signing */\n version: string;\n /** Number of decimal places */\n decimals: number;\n /** Token type for scheme selection */\n tokenType: TokenType;\n /** Payment priority (lower = higher priority) */\n priority: number;\n}\n\n/**\n * Network token registry mapping network -> symbol -> config\n */\nexport type NetworkTokenRegistry = Record<string, Record<string, TokenConfig>>;\n\n/**\n * USDT0 Contract Addresses by Network\n * Source: https://docs.tether.io/usdt0/integration-guide/deployed-contracts\n *\n * USDT0 is Tether's new omnichain token using LayerZero OFT standard.\n * Key features:\n * - Supports EIP-3009 transferWithAuthorization (gasless transfers)\n * - Supports EIP-2612 permit\n * - Native cross-chain via LayerZero\n */\nexport const USDT0_ADDRESSES: Record<string, Address> = {\n // === Existing Networks ===\n // Ethereum Mainnet - OFT Adapter (bridge endpoint)\n \"eip155:1\": \"0x6C96dE32CEa08842dcc4058c14d3aaAD7Fa41dee\",\n // Arbitrum One - Native USDT0\n \"eip155:42161\": \"0xFd086bC7CD5C481DCC9C85ebE478A1C0b69FCbb9\",\n // Ink Mainnet\n \"eip155:57073\": \"0x0200C29006150606B650577BBE7B6248F58470c1\",\n // Berachain Mainnet\n \"eip155:80094\": \"0x779Ded0c9e1022225f8E0630b35a9b54bE713736\",\n // Unichain Mainnet (updated address)\n \"eip155:130\": \"0x9151434b16b9763660705744891fA906F660EcC5\",\n\n // === Phase 1: High Priority Networks ===\n // Polygon PoS\n \"eip155:137\": \"0xc2132D05D31c914a87C6611C10748AEb04B58e8F\",\n // Mantle\n \"eip155:5000\": \"0x779Ded0c9e1022225f8E0630b35a9b54bE713736\",\n // Optimism\n \"eip155:10\": \"0x01bFF41798a0BcF287b996046Ca68b395DbC1071\",\n // Plasma\n \"eip155:9745\": \"0xB8CE59FC3717ada4C02eaDF9682A9e934F625ebb\",\n // Sei\n \"eip155:1329\": \"0x9151434b16b9763660705744891fA906F660EcC5\",\n // Conflux eSpace\n \"eip155:1030\": \"0xaf37E8B6C9ED7f6318979f56Fc287d76c30847ff\",\n // Monad\n \"eip155:143\": \"0xe7cd86e13AC4309349F30B3435a9d337750fC82D\",\n\n // === Phase 2: Medium Priority Networks ===\n // Rootstock (Bitcoin sidechain)\n \"eip155:30\": \"0x779dED0C9e1022225F8e0630b35A9B54Be713736\",\n // XLayer (OKX L2)\n \"eip155:196\": \"0x779Ded0c9e1022225f8E0630b35a9b54bE713736\",\n // Flare\n \"eip155:14\": \"0xe7cd86e13AC4309349F30B3435a9d337750fC82D\",\n // Corn\n \"eip155:21000000\": \"0xB8CE59FC3717ada4C02eaDF9682A9e934F625ebb\",\n // HyperEVM\n \"eip155:999\": \"0xB8CE59FC3717ada4C02eaDF9682A9e934F625ebb\",\n // MegaETH\n \"eip155:4326\": \"0xb8ce59fc3717ada4c02eadf9682a9e934f625ebb\",\n // Stable\n \"eip155:988\": \"0x779Ded0c9e1022225f8E0630b35a9b54bE713736\",\n};\n\n/**\n * USDC Contract Addresses by Network\n * Native USDC with EIP-3009 support\n */\nexport const USDC_ADDRESSES: Record<string, Address> = {\n // Ethereum Mainnet\n \"eip155:1\": \"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48\",\n // Base Mainnet\n \"eip155:8453\": \"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913\",\n // Base Sepolia (testnet)\n \"eip155:84532\": \"0x036CbD53842c5426634e7929541eC2318f3dCF7e\",\n // Sepolia (testnet)\n \"eip155:11155111\": \"0x1c7D4B196Cb0C7B01d743Fbc6116a902379C7238\",\n // Arbitrum One\n \"eip155:42161\": \"0xaf88d065e77c8cC2239327C5EDb3A432268e5831\",\n // Polygon Mainnet\n \"eip155:137\": \"0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359\",\n};\n\n/**\n * USAT (Tether America USD) Addresses\n * Tether's federally-regulated US stablecoin.\n * - Supports EIP-2612 permit (can use `upto` scheme)\n * - Does NOT support EIP-3009 (must use `exact-legacy` scheme)\n */\nexport const USAT_ADDRESSES: Record<string, Address> = {\n // Ethereum Mainnet\n \"eip155:1\": \"0x07041776f5007aca2a54844f50503a18a72a8b68\",\n};\n\n/**\n * Traditional USDT Addresses (Legacy - no EIP-3009 support)\n * These require the approve + transferFrom pattern\n */\nexport const USDT_LEGACY_ADDRESSES: Record<string, Address> = {\n // Ethereum Mainnet\n \"eip155:1\": \"0xdAC17F958D2ee523a2206206994597C13D831ec7\",\n // Polygon Mainnet (native USDT, not USDT0)\n \"eip155:137\": \"0xc2132D05D31c914a87C6611C10748AEb04B58e8F\",\n // BNB Chain (BSC) - BEP-20 USDT\n \"eip155:56\": \"0x55d398326f99059fF775485246999027B3197955\",\n // Avalanche C-Chain\n \"eip155:43114\": \"0x9702230A8Ea53601f5cD2dc00fDBc13d4dF4A8c7\",\n // Fantom\n \"eip155:250\": \"0x049d68029688eabf473097a2fc38ef61633a3c7a\",\n // Celo\n \"eip155:42220\": \"0x48065fbBE25f71C9282ddf5e1cD6D6A887483D5e\",\n // Kaia (formerly Klaytn)\n \"eip155:8217\": \"0xcee8faf64bb97a73bb51e115aa89c17ffa8dd167\",\n};\n\n/**\n * Complete token registry with all supported tokens per network\n */\nexport const TOKEN_REGISTRY: NetworkTokenRegistry = {\n // Ethereum Mainnet\n \"eip155:1\": {\n USDT0: {\n address: USDT0_ADDRESSES[\"eip155:1\"],\n symbol: \"USDT0\",\n name: \"TetherToken\",\n version: \"1\",\n decimals: 6,\n tokenType: \"eip3009\",\n priority: 1,\n },\n USDC: {\n address: USDC_ADDRESSES[\"eip155:1\"],\n symbol: \"USDC\",\n name: \"USD Coin\",\n version: \"2\",\n decimals: 6,\n tokenType: \"eip3009\",\n priority: 2,\n },\n USAT: {\n address: USAT_ADDRESSES[\"eip155:1\"],\n symbol: \"USAT\",\n name: \"Tether America USD\",\n version: \"1\",\n decimals: 6,\n tokenType: \"legacy\",\n priority: 3,\n },\n USDT: {\n address: USDT_LEGACY_ADDRESSES[\"eip155:1\"],\n symbol: \"USDT\",\n name: \"TetherUSD\",\n version: \"1\",\n decimals: 6,\n tokenType: \"legacy\",\n priority: 10, // Lower priority due to legacy flow\n },\n },\n\n // Arbitrum One\n \"eip155:42161\": {\n USDT0: {\n address: USDT0_ADDRESSES[\"eip155:42161\"],\n symbol: \"USDT0\",\n name: \"TetherToken\",\n version: \"1\",\n decimals: 6,\n tokenType: \"eip3009\",\n priority: 1,\n },\n USDC: {\n address: USDC_ADDRESSES[\"eip155:42161\"],\n symbol: \"USDC\",\n name: \"USD Coin\",\n version: \"2\",\n decimals: 6,\n tokenType: \"eip3009\",\n priority: 2,\n },\n },\n\n // Ink Mainnet\n \"eip155:57073\": {\n USDT0: {\n address: USDT0_ADDRESSES[\"eip155:57073\"],\n symbol: \"USDT0\",\n name: \"TetherToken\",\n version: \"1\",\n decimals: 6,\n tokenType: \"eip3009\",\n priority: 1,\n },\n },\n\n // Berachain Mainnet\n \"eip155:80094\": {\n USDT0: {\n address: USDT0_ADDRESSES[\"eip155:80094\"],\n symbol: \"USDT0\",\n name: \"TetherToken\",\n version: \"1\",\n decimals: 6,\n tokenType: \"eip3009\",\n priority: 1,\n },\n },\n\n // Unichain Mainnet\n \"eip155:130\": {\n USDT0: {\n address: USDT0_ADDRESSES[\"eip155:130\"],\n symbol: \"USDT0\",\n name: \"TetherToken\",\n version: \"1\",\n decimals: 6,\n tokenType: \"eip3009\",\n priority: 1,\n },\n },\n\n // Base Mainnet\n \"eip155:8453\": {\n USDC: {\n address: USDC_ADDRESSES[\"eip155:8453\"],\n symbol: \"USDC\",\n name: \"USD Coin\",\n version: \"2\",\n decimals: 6,\n tokenType: \"eip3009\",\n priority: 2,\n },\n },\n\n // Base Sepolia (testnet)\n \"eip155:84532\": {\n USDC: {\n address: USDC_ADDRESSES[\"eip155:84532\"],\n symbol: \"USDC\",\n name: \"USDC\",\n version: \"2\",\n decimals: 6,\n tokenType: \"eip3009\",\n priority: 2,\n },\n },\n\n // Sepolia (testnet)\n \"eip155:11155111\": {\n USDC: {\n address: USDC_ADDRESSES[\"eip155:11155111\"],\n symbol: \"USDC\",\n name: \"USDC\",\n version: \"2\",\n decimals: 6,\n tokenType: \"eip3009\",\n priority: 2,\n },\n },\n\n // Polygon Mainnet\n \"eip155:137\": {\n USDT0: {\n address: USDT0_ADDRESSES[\"eip155:137\"],\n symbol: \"USDT0\",\n name: \"TetherToken\",\n version: \"1\",\n decimals: 6,\n tokenType: \"eip3009\",\n priority: 1,\n },\n USDC: {\n address: USDC_ADDRESSES[\"eip155:137\"],\n symbol: \"USDC\",\n name: \"USD Coin\",\n version: \"2\",\n decimals: 6,\n tokenType: \"eip3009\",\n priority: 2,\n },\n USDT: {\n address: USDT_LEGACY_ADDRESSES[\"eip155:137\"],\n symbol: \"USDT\",\n name: \"TetherUSD\",\n version: \"1\",\n decimals: 6,\n tokenType: \"legacy\",\n priority: 10,\n },\n },\n\n // === Phase 1: High Priority USDT0 Networks ===\n\n // Optimism Mainnet\n \"eip155:10\": {\n USDT0: {\n address: USDT0_ADDRESSES[\"eip155:10\"],\n symbol: \"USDT0\",\n name: \"TetherToken\",\n version: \"1\",\n decimals: 6,\n tokenType: \"eip3009\",\n priority: 1,\n },\n },\n\n // Mantle Mainnet\n \"eip155:5000\": {\n USDT0: {\n address: USDT0_ADDRESSES[\"eip155:5000\"],\n symbol: \"USDT0\",\n name: \"TetherToken\",\n version: \"1\",\n decimals: 6,\n tokenType: \"eip3009\",\n priority: 1,\n },\n },\n\n // Plasma Mainnet\n \"eip155:9745\": {\n USDT0: {\n address: USDT0_ADDRESSES[\"eip155:9745\"],\n symbol: \"USDT0\",\n name: \"TetherToken\",\n version: \"1\",\n decimals: 6,\n tokenType: \"eip3009\",\n priority: 1,\n },\n },\n\n // Sei Mainnet\n \"eip155:1329\": {\n USDT0: {\n address: USDT0_ADDRESSES[\"eip155:1329\"],\n symbol: \"USDT0\",\n name: \"TetherToken\",\n version: \"1\",\n decimals: 6,\n tokenType: \"eip3009\",\n priority: 1,\n },\n },\n\n // Conflux eSpace Mainnet\n \"eip155:1030\": {\n USDT0: {\n address: USDT0_ADDRESSES[\"eip155:1030\"],\n symbol: \"USDT0\",\n name: \"TetherToken\",\n version: \"1\",\n decimals: 6,\n tokenType: \"eip3009\",\n priority: 1,\n },\n },\n\n // Monad Mainnet\n \"eip155:143\": {\n USDT0: {\n address: USDT0_ADDRESSES[\"eip155:143\"],\n symbol: \"USDT0\",\n name: \"TetherToken\",\n version: \"1\",\n decimals: 6,\n tokenType: \"eip3009\",\n priority: 1,\n },\n },\n\n // === Phase 2: Medium Priority USDT0 Networks ===\n\n // Flare Mainnet\n \"eip155:14\": {\n USDT0: {\n address: USDT0_ADDRESSES[\"eip155:14\"],\n symbol: \"USDT0\",\n name: \"TetherToken\",\n version: \"1\",\n decimals: 6,\n tokenType: \"eip3009\",\n priority: 1,\n },\n },\n\n // Rootstock Mainnet (Bitcoin sidechain)\n \"eip155:30\": {\n USDT0: {\n address: USDT0_ADDRESSES[\"eip155:30\"],\n symbol: \"USDT0\",\n name: \"TetherToken\",\n version: \"1\",\n decimals: 6,\n tokenType: \"eip3009\",\n priority: 1,\n },\n },\n\n // XLayer Mainnet (OKX L2)\n \"eip155:196\": {\n USDT0: {\n address: USDT0_ADDRESSES[\"eip155:196\"],\n symbol: \"USDT0\",\n name: \"TetherToken\",\n version: \"1\",\n decimals: 6,\n tokenType: \"eip3009\",\n priority: 1,\n },\n },\n\n // Stable Mainnet\n \"eip155:988\": {\n USDT0: {\n address: USDT0_ADDRESSES[\"eip155:988\"],\n symbol: \"USDT0\",\n name: \"TetherToken\",\n version: \"1\",\n decimals: 6,\n tokenType: \"eip3009\",\n priority: 1,\n },\n },\n\n // HyperEVM Mainnet\n \"eip155:999\": {\n USDT0: {\n address: USDT0_ADDRESSES[\"eip155:999\"],\n symbol: \"USDT0\",\n name: \"TetherToken\",\n version: \"1\",\n decimals: 6,\n tokenType: \"eip3009\",\n priority: 1,\n },\n },\n\n // MegaETH Mainnet\n \"eip155:4326\": {\n USDT0: {\n address: USDT0_ADDRESSES[\"eip155:4326\"],\n symbol: \"USDT0\",\n name: \"TetherToken\",\n version: \"1\",\n decimals: 6,\n tokenType: \"eip3009\",\n priority: 1,\n },\n },\n\n // Corn Mainnet\n \"eip155:21000000\": {\n USDT0: {\n address: USDT0_ADDRESSES[\"eip155:21000000\"],\n symbol: \"USDT0\",\n name: \"TetherToken\",\n version: \"1\",\n decimals: 6,\n tokenType: \"eip3009\",\n priority: 1,\n },\n },\n\n // === Legacy USDT Networks (no EIP-3009 support) ===\n\n // BNB Chain (BSC) - BEP-20 USDT\n \"eip155:56\": {\n USDT: {\n address: USDT_LEGACY_ADDRESSES[\"eip155:56\"],\n symbol: \"USDT\",\n name: \"Tether USD\",\n version: \"1\",\n decimals: 18, // BSC USDT uses 18 decimals\n tokenType: \"legacy\",\n priority: 10,\n },\n },\n\n // Avalanche C-Chain\n \"eip155:43114\": {\n USDT: {\n address: USDT_LEGACY_ADDRESSES[\"eip155:43114\"],\n symbol: \"USDT\",\n name: \"TetherToken\",\n version: \"1\",\n decimals: 6,\n tokenType: \"legacy\",\n priority: 10,\n },\n },\n\n // Fantom\n \"eip155:250\": {\n USDT: {\n address: USDT_LEGACY_ADDRESSES[\"eip155:250\"],\n symbol: \"USDT\",\n name: \"Frapped USDT\",\n version: \"1\",\n decimals: 6,\n tokenType: \"legacy\",\n priority: 10,\n },\n },\n\n // Celo\n \"eip155:42220\": {\n USDT: {\n address: USDT_LEGACY_ADDRESSES[\"eip155:42220\"],\n symbol: \"USDT\",\n name: \"Tether USD\",\n version: \"1\",\n decimals: 18,\n tokenType: \"legacy\",\n priority: 10,\n },\n },\n\n // Kaia (formerly Klaytn)\n \"eip155:8217\": {\n USDT: {\n address: USDT_LEGACY_ADDRESSES[\"eip155:8217\"],\n symbol: \"USDT\",\n name: \"Tether USD\",\n version: \"1\",\n decimals: 6,\n tokenType: \"legacy\",\n priority: 10,\n },\n },\n};\n\n/**\n * Token priority for payment method selection\n * Lower number = higher priority\n */\nexport const TOKEN_PRIORITY: Record<string, number> = {\n USDT0: 1, // Highest priority - gasless, cross-chain\n USDC: 2, // Second - wide support, EIP-3009\n USAT: 3, // Third - US-regulated, EIP-2612 permit\n USDT: 10, // Lower - requires approval transaction\n DAI: 5, // Medium - good support\n};\n\n/**\n * Get token configuration for a specific token on a network\n *\n * @param network - The network identifier in CAIP-2 format\n * @param symbol - The token symbol (e.g., \"USDT0\", \"USDC\")\n * @returns The token configuration if found, undefined otherwise\n */\nexport function getTokenConfig(network: string, symbol: string): TokenConfig | undefined {\n return TOKEN_REGISTRY[network]?.[symbol.toUpperCase()];\n}\n\n/**\n * Get all tokens available on a network\n *\n * @param network - The network identifier in CAIP-2 format\n * @returns Array of token configurations sorted by priority\n */\nexport function getNetworkTokens(network: string): TokenConfig[] {\n const tokens = TOKEN_REGISTRY[network];\n if (!tokens) return [];\n return Object.values(tokens).sort((a, b) => a.priority - b.priority);\n}\n\n/**\n * Get the default/preferred token for a network\n * Prefers USDT0 > USDC > others based on priority\n *\n * @param network - The network identifier in CAIP-2 format\n * @returns The highest priority token configuration, or undefined if none found\n */\nexport function getDefaultToken(network: string): TokenConfig | undefined {\n const tokens = getNetworkTokens(network);\n return tokens[0]; // Already sorted by priority\n}\n\n/**\n * Get token by contract address on a network\n *\n * @param network - The network identifier in CAIP-2 format\n * @param address - The token contract address\n * @returns The token configuration if found, undefined otherwise\n */\nexport function getTokenByAddress(network: string, address: Address): TokenConfig | undefined {\n const tokens = TOKEN_REGISTRY[network];\n if (!tokens) return undefined;\n\n const lowerAddress = address.toLowerCase();\n return Object.values(tokens).find(t => t.address.toLowerCase() === lowerAddress);\n}\n\n/**\n * Check if a token supports EIP-3009 (gasless transfers)\n *\n * @param network - The network identifier in CAIP-2 format\n * @param symbol - The token symbol to check\n * @returns True if the token supports EIP-3009 gasless transfers\n */\nexport function supportsEIP3009(network: string, symbol: string): boolean {\n const config = getTokenConfig(network, symbol);\n return config?.tokenType === \"eip3009\";\n}\n\n/**\n * Get all networks that support a specific token\n *\n * @param symbol - The token symbol to search for\n * @returns Array of network identifiers that support the token\n */\nexport function getNetworksForToken(symbol: string): string[] {\n const networks: string[] = [];\n for (const [network, tokens] of Object.entries(TOKEN_REGISTRY)) {\n if (tokens[symbol.toUpperCase()]) {\n networks.push(network);\n }\n }\n return networks;\n}\n\n/**\n * Get USDT0 networks (primary T402 token)\n *\n * @returns Array of network identifiers that support USDT0\n */\nexport function getUsdt0Networks(): string[] {\n return getNetworksForToken(\"USDT0\");\n}\n\n/**\n * EIP-712 domain configuration for a token\n *\n * @param network - The network identifier in CAIP-2 format\n * @param tokenAddress - The token contract address\n * @param chainId - The numeric chain ID\n * @returns The EIP-712 domain configuration, or undefined if token not found\n */\nexport function getEIP712Domain(\n network: string,\n tokenAddress: Address,\n chainId: number,\n): { name: string; version: string; chainId: number; verifyingContract: Address } | undefined {\n const token = getTokenByAddress(network, tokenAddress);\n if (!token) return undefined;\n\n return {\n name: token.name,\n version: token.version,\n chainId,\n verifyingContract: token.address,\n };\n}\n","import {\n AssetAmount,\n Network,\n PaymentRequirements,\n Price,\n SchemeNetworkServer,\n MoneyParser,\n} from \"@t402/core/types\";\nimport { getDefaultToken, getTokenConfig, TokenConfig, TOKEN_REGISTRY } from \"../../tokens.js\";\nimport {\n PERMIT2_ADDRESS,\n SCHEME_PERMIT2_PROXY,\n T402_EXACT_PERMIT2_PROXY,\n T402_UPTO_PERMIT2_PROXY,\n} from \"../constants\";\n\n/**\n * Configuration options for Permit2ProxyEvmScheme server\n */\nexport interface Permit2ProxyEvmSchemeConfig {\n /** Preferred token symbol (e.g., \"USDT0\", \"USDC\"). Defaults to network's highest priority token. */\n preferredToken?: string;\n /** Override exact proxy contract address */\n exactProxyAddress?: `0x${string}`;\n /** Override upto proxy contract address */\n uptoProxyAddress?: `0x${string}`;\n}\n\n/**\n * EVM server implementation for the Permit2 Proxy payment scheme.\n * Supports USDT0, USDC, and other ERC20 tokens via T402 Permit2 proxy contracts.\n */\nexport class Permit2ProxyEvmScheme implements SchemeNetworkServer {\n readonly scheme = SCHEME_PERMIT2_PROXY;\n private moneyParsers: MoneyParser[] = [];\n private config: Permit2ProxyEvmSchemeConfig;\n\n /**\n * Creates a new Permit2ProxyEvmScheme server instance.\n *\n * @param config - Server configuration options\n */\n constructor(config: Permit2ProxyEvmSchemeConfig = {}) {\n this.config = config;\n }\n\n /**\n * Get the list of supported EVM networks.\n *\n * @returns Array of supported network identifiers\n */\n static getSupportedNetworks(): string[] {\n return Object.keys(TOKEN_REGISTRY);\n }\n\n /**\n * Check if a network is supported.\n *\n * @param network - Network identifier to check\n * @returns Whether the network is supported\n */\n static isNetworkSupported(network: string): boolean {\n return network in TOKEN_REGISTRY;\n }\n\n /**\n * Register a custom money parser for price conversion.\n *\n * @param parser - The money parser to register\n * @returns This instance for chaining\n */\n registerMoneyParser(parser: MoneyParser): Permit2ProxyEvmScheme {\n this.moneyParsers.push(parser);\n return this;\n }\n\n /**\n * Parse a price into an AssetAmount for the given network.\n *\n * @param price - The price to parse\n * @param network - The target network\n * @returns The parsed asset amount\n */\n async parsePrice(price: Price, network: Network): Promise<AssetAmount> {\n if (typeof price === \"object\" && price !== null && \"amount\" in price) {\n if (!price.asset) {\n throw new Error(`Asset address must be specified for AssetAmount on network ${network}`);\n }\n return {\n amount: price.amount,\n asset: price.asset,\n extra: price.extra || {},\n };\n }\n\n const amount = this.parseMoneyToDecimal(price);\n\n for (const parser of this.moneyParsers) {\n const result = await parser(amount, network);\n if (result !== null) {\n return result;\n }\n }\n\n return this.defaultMoneyConversion(amount, network);\n }\n\n /**\n * Enhance payment requirements with Permit2 Proxy-specific data.\n *\n * @param paymentRequirements - The base payment requirements\n * @param supportedKind - The supported kind metadata\n * @param supportedKind.t402Version - Protocol version\n * @param supportedKind.scheme - Payment scheme\n * @param supportedKind.network - Target network\n * @param supportedKind.extra - Extra metadata\n * @param extensionKeys - Active extension keys\n * @returns Enhanced payment requirements\n */\n enhancePaymentRequirements(\n paymentRequirements: PaymentRequirements,\n supportedKind: {\n t402Version: number;\n scheme: string;\n network: Network;\n extra?: Record<string, unknown>;\n },\n extensionKeys: string[],\n ): Promise<PaymentRequirements> {\n void extensionKeys;\n\n // Add proxy addresses and permit2Address to extra for clients\n if (!paymentRequirements.extra) {\n paymentRequirements.extra = {};\n }\n paymentRequirements.extra.permit2Address = PERMIT2_ADDRESS;\n paymentRequirements.extra.exactProxyAddress =\n this.config.exactProxyAddress || T402_EXACT_PERMIT2_PROXY;\n paymentRequirements.extra.uptoProxyAddress =\n this.config.uptoProxyAddress || T402_UPTO_PERMIT2_PROXY;\n\n // Pass through facilitator address from supported kind extra\n if (supportedKind.extra?.facilitator) {\n paymentRequirements.extra.facilitator = supportedKind.extra.facilitator;\n }\n\n return Promise.resolve(paymentRequirements);\n }\n\n /**\n * Parse a money value into a decimal number.\n *\n * @param money - The money value to parse\n * @returns The decimal amount\n */\n private parseMoneyToDecimal(money: string | number): number {\n if (typeof money === \"number\") {\n if (!Number.isFinite(money)) {\n throw new Error(`Invalid money value: ${money} (must be a finite number)`);\n }\n return money;\n }\n\n const cleanMoney = money.replace(/^\\$/, \"\").trim();\n const amount = parseFloat(cleanMoney);\n\n if (!Number.isFinite(amount)) {\n throw new Error(`Invalid money format: ${money}`);\n }\n\n return amount;\n }\n\n /**\n * Convert a decimal amount to a token amount using default network token.\n *\n * @param amount - The decimal amount\n * @param network - The target network\n * @returns The asset amount with token details\n */\n private defaultMoneyConversion(amount: number, network: Network): AssetAmount {\n const token = this.getDefaultAsset(network);\n\n const tokenAmount = this.convertToTokenAmount(amount.toString(), token.decimals);\n\n return {\n amount: tokenAmount,\n asset: token.address,\n extra: {\n symbol: token.symbol,\n permit2Address: PERMIT2_ADDRESS,\n },\n };\n }\n\n /**\n * Convert a decimal amount string to token smallest units.\n *\n * @param decimalAmount - The decimal amount as a string\n * @param decimals - The token's decimal places\n * @returns The amount in smallest units\n */\n private convertToTokenAmount(decimalAmount: string, decimals: number): string {\n if (!/^-?\\d+(\\.\\d+)?$/.test(decimalAmount)) {\n throw new Error(`Invalid amount format: ${decimalAmount}`);\n }\n\n const [wholePart, fracPart = \"\"] = decimalAmount.split(\".\");\n const paddedFrac = fracPart.padEnd(decimals, \"0\").slice(0, decimals);\n const combined = wholePart + paddedFrac;\n const result = combined.replace(/^0+/, \"\") || \"0\";\n\n return result;\n }\n\n /**\n * Get the default token asset for a network.\n *\n * @param network - The target network\n * @returns The token configuration\n */\n private getDefaultAsset(network: Network): TokenConfig {\n if (this.config.preferredToken) {\n const preferred = getTokenConfig(network, this.config.preferredToken);\n if (preferred) return preferred;\n }\n\n const defaultToken = getDefaultToken(network);\n if (defaultToken) return defaultToken;\n\n throw new Error(`No tokens configured for network ${network}`);\n }\n}\n","import { t402ResourceServer } from \"@t402/core/server\";\nimport { Network } from \"@t402/core/types\";\nimport { Permit2ProxyEvmScheme, Permit2ProxyEvmSchemeConfig } from \"./scheme\";\n\n/**\n * Configuration options for registering Permit2 Proxy schemes to an t402ResourceServer\n */\nexport interface Permit2ProxyEvmResourceServerConfig {\n /**\n * Optional specific networks to register\n * If not provided, registers wildcard support (eip155:*)\n */\n networks?: Network[];\n\n /**\n * Optional scheme configuration\n */\n schemeConfig?: Permit2ProxyEvmSchemeConfig;\n}\n\n/**\n * Registers Permit2 Proxy EVM payment schemes to an t402ResourceServer instance.\n *\n * @param server - The t402ResourceServer instance to register schemes to\n * @param config - Configuration for Permit2 Proxy resource server registration\n * @returns The server instance for chaining\n */\nexport function registerPermit2ProxyEvmScheme(\n server: t402ResourceServer,\n config: Permit2ProxyEvmResourceServerConfig = {},\n): t402ResourceServer {\n if (config.networks && config.networks.length > 0) {\n config.networks.forEach(network => {\n server.register(network, new Permit2ProxyEvmScheme(config.schemeConfig));\n });\n } else {\n server.register(\"eip155:*\", new Permit2ProxyEvmScheme(config.schemeConfig));\n }\n\n return server;\n}\n","import {\n PaymentPayload,\n PaymentRequirements,\n SchemeNetworkFacilitator,\n SettleResponse,\n VerifyResponse,\n} from \"@t402/core/types\";\nimport { getAddress } from \"viem\";\nimport { FacilitatorEvmSigner } from \"../../signer\";\nimport { Permit2ProxyPayloadV2 } from \"../types\";\nimport {\n PERMIT2_ADDRESS,\n SCHEME_PERMIT2_PROXY,\n T402_EXACT_PERMIT2_PROXY,\n T402_UPTO_PERMIT2_PROXY,\n erc20BalanceABI,\n permit2ProxyExactABI,\n} from \"../constants\";\n\n/**\n * Configuration for Permit2 Proxy EVM facilitator\n */\nexport interface Permit2ProxyEvmSchemeConfig {\n /** Override exact proxy contract address */\n exactProxyAddress?: `0x${string}`;\n /** Override upto proxy contract address */\n uptoProxyAddress?: `0x${string}`;\n [key: string]: unknown;\n}\n\n/**\n * EVM facilitator implementation for the Permit2 Proxy payment scheme.\n *\n * Verifies Permit2 witness-based signatures and settles payments by calling\n * settle() on the T402 proxy contracts.\n */\nexport class Permit2ProxyEvmScheme implements SchemeNetworkFacilitator {\n readonly scheme = SCHEME_PERMIT2_PROXY;\n readonly caipFamily = \"eip155:*\";\n private exactProxyAddress: `0x${string}`;\n private uptoProxyAddress: `0x${string}`;\n\n /**\n * Creates a new Permit2 Proxy facilitator instance.\n *\n * @param signer - The facilitator EVM signer\n * @param config - Optional configuration\n */\n constructor(\n private readonly signer: FacilitatorEvmSigner,\n config: Permit2ProxyEvmSchemeConfig = {},\n ) {\n this.exactProxyAddress = config.exactProxyAddress || T402_EXACT_PERMIT2_PROXY;\n this.uptoProxyAddress = config.uptoProxyAddress || T402_UPTO_PERMIT2_PROXY;\n }\n\n /**\n * Get mechanism-specific extra data for supported kinds.\n *\n * @param _ - The network identifier\n * @returns Extra data including proxy contract addresses\n */\n getExtra(_: string): Record<string, unknown> | undefined {\n return {\n permit2Address: PERMIT2_ADDRESS,\n exactProxyAddress: this.exactProxyAddress,\n uptoProxyAddress: this.uptoProxyAddress,\n };\n }\n\n /**\n * Get signer addresses for this facilitator.\n *\n * @param _ - The network identifier\n * @returns Array of signer addresses\n */\n getSigners(_: string): string[] {\n return [...this.signer.getAddresses()];\n }\n\n /**\n * Verify a Permit2 Proxy payment payload.\n *\n * @param payload - The payment payload to verify\n * @param requirements - The payment requirements\n * @returns Verification result\n */\n async verify(\n payload: PaymentPayload,\n requirements: PaymentRequirements,\n ): Promise<VerifyResponse> {\n const proxyPayload = payload.payload as Permit2ProxyPayloadV2 | undefined;\n\n // Validate payload structure\n if (\n !proxyPayload?.permit?.permitted?.token ||\n !proxyPayload?.owner ||\n !proxyPayload?.witness\n ) {\n return {\n isValid: false,\n invalidReason: \"invalid_payload_structure\",\n payer: undefined,\n };\n }\n\n // Verify scheme matches\n if (\n payload.accepted.scheme !== SCHEME_PERMIT2_PROXY ||\n requirements.scheme !== SCHEME_PERMIT2_PROXY\n ) {\n return {\n isValid: false,\n invalidReason: \"unsupported_scheme\",\n payer: proxyPayload.owner,\n };\n }\n\n // Verify network matches\n if (payload.accepted.network !== requirements.network) {\n return {\n isValid: false,\n invalidReason: \"network_mismatch\",\n payer: proxyPayload.owner,\n };\n }\n\n // Verify token matches\n if (getAddress(proxyPayload.permit.permitted.token) !== getAddress(requirements.asset)) {\n return {\n isValid: false,\n invalidReason: \"token_mismatch\",\n payer: proxyPayload.owner,\n };\n }\n\n // Verify witness.to matches payTo\n if (getAddress(proxyPayload.witness.to) !== getAddress(requirements.payTo)) {\n return {\n isValid: false,\n invalidReason: \"recipient_mismatch\",\n payer: proxyPayload.owner,\n };\n }\n\n // Verify witness.facilitator is one of our signer addresses\n const signerAddresses = this.signer.getAddresses().map(a => getAddress(a));\n if (!signerAddresses.includes(getAddress(proxyPayload.witness.facilitator))) {\n return {\n isValid: false,\n invalidReason: \"facilitator_mismatch\",\n payer: proxyPayload.owner,\n };\n }\n\n // Verify deadline is in the future\n const now = Math.floor(Date.now() / 1000);\n if (BigInt(proxyPayload.permit.deadline) < BigInt(now + 6)) {\n return {\n isValid: false,\n invalidReason: \"permit_expired\",\n payer: proxyPayload.owner,\n };\n }\n\n // Verify validAfter is not in the future\n if (BigInt(proxyPayload.witness.validAfter) > BigInt(now)) {\n return {\n isValid: false,\n invalidReason: \"payment_too_early\",\n payer: proxyPayload.owner,\n };\n }\n\n // Verify amount is sufficient\n if (BigInt(proxyPayload.permit.permitted.amount) < BigInt(requirements.amount)) {\n return {\n isValid: false,\n invalidReason: \"insufficient_permitted_amount\",\n payer: proxyPayload.owner,\n };\n }\n\n // Check balance\n try {\n const balance = (await this.signer.readContract({\n address: getAddress(requirements.asset),\n abi: erc20BalanceABI,\n functionName: \"balanceOf\",\n args: [getAddress(proxyPayload.owner)],\n })) as bigint;\n\n if (BigInt(balance) < BigInt(requirements.amount)) {\n return {\n isValid: false,\n invalidReason: \"insufficient_funds\",\n payer: proxyPayload.owner,\n };\n }\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n return {\n isValid: false,\n invalidReason: `balance_check_failed: ${errorMessage}`,\n payer: proxyPayload.owner,\n };\n }\n\n return {\n isValid: true,\n invalidReason: undefined,\n payer: proxyPayload.owner,\n };\n }\n\n /**\n * Settle a Permit2 Proxy payment by calling settle() on the proxy contract.\n *\n * @param payload - The payment payload\n * @param requirements - The payment requirements\n * @returns Settlement result\n */\n async settle(\n payload: PaymentPayload,\n requirements: PaymentRequirements,\n ): Promise<SettleResponse> {\n const proxyPayload = payload.payload as Permit2ProxyPayloadV2 | undefined;\n\n if (\n !proxyPayload?.permit?.permitted?.token ||\n !proxyPayload?.owner ||\n !proxyPayload?.witness\n ) {\n return {\n success: false,\n network: payload.accepted.network,\n transaction: \"\",\n errorReason: \"invalid_payload_structure\",\n payer: undefined,\n };\n }\n\n // Re-verify before settling\n const valid = await this.verify(payload, requirements);\n if (!valid.isValid) {\n return {\n success: false,\n network: payload.accepted.network,\n transaction: \"\",\n errorReason: valid.invalidReason ?? \"invalid_scheme\",\n payer: proxyPayload.owner,\n };\n }\n\n try {\n // Call settle on the exact proxy contract\n const proxyAddress =\n (requirements.extra?.exactProxyAddress as `0x${string}`) || this.exactProxyAddress;\n\n const tx = await this.signer.writeContract({\n address: proxyAddress,\n abi: permit2ProxyExactABI,\n functionName: \"settle\",\n args: [\n {\n permitted: {\n token: getAddress(proxyPayload.permit.permitted.token),\n amount: BigInt(proxyPayload.permit.permitted.amount),\n },\n nonce: BigInt(proxyPayload.permit.nonce),\n deadline: BigInt(proxyPayload.permit.deadline),\n },\n getAddress(proxyPayload.owner),\n {\n to: getAddress(proxyPayload.witness.to),\n facilitator: getAddress(proxyPayload.witness.facilitator),\n validAfter: BigInt(proxyPayload.witness.validAfter),\n },\n proxyPayload.signature,\n ],\n });\n\n // Wait for transaction confirmation\n const receipt = await this.signer.waitForTransactionReceipt({ hash: tx });\n\n if (receipt.status !== \"success\") {\n return {\n success: false,\n errorReason: \"invalid_transaction_state\",\n transaction: tx,\n network: payload.accepted.network,\n payer: proxyPayload.owner,\n };\n }\n\n return {\n success: true,\n transaction: tx,\n network: payload.accepted.network,\n payer: proxyPayload.owner,\n };\n } catch (error) {\n console.error(\"Failed to settle Permit2 Proxy transaction:\", error);\n return {\n success: false,\n errorReason: \"transaction_failed\",\n transaction: \"\",\n network: payload.accepted.network,\n payer: proxyPayload.owner,\n };\n }\n }\n}\n","import { t402Facilitator } from \"@t402/core/facilitator\";\nimport { Network } from \"@t402/core/types\";\nimport { FacilitatorEvmSigner } from \"../../signer\";\nimport { Permit2ProxyEvmScheme, Permit2ProxyEvmSchemeConfig } from \"./scheme\";\n\n/**\n * Configuration options for registering Permit2 Proxy schemes to an t402Facilitator\n */\nexport interface Permit2ProxyEvmFacilitatorConfig {\n /**\n * The EVM signer for facilitator operations (verify and settle)\n */\n signer: FacilitatorEvmSigner;\n\n /**\n * Networks to register (single network or array of networks)\n * Examples: \"eip155:84532\", [\"eip155:84532\", \"eip155:1\"]\n */\n networks: Network | Network[];\n\n /**\n * Optional scheme configuration (proxy contract addresses, etc.)\n */\n schemeConfig?: Permit2ProxyEvmSchemeConfig;\n}\n\n/**\n * Registers Permit2 Proxy EVM payment schemes to an t402Facilitator instance.\n *\n * @param facilitator - The t402Facilitator instance to register schemes to\n * @param config - Configuration for Permit2 Proxy EVM facilitator registration\n * @returns The facilitator instance for chaining\n */\nexport function registerPermit2ProxyEvmScheme(\n facilitator: t402Facilitator,\n config: Permit2ProxyEvmFacilitatorConfig,\n): t402Facilitator {\n facilitator.register(\n config.networks,\n new Permit2ProxyEvmScheme(config.signer, config.schemeConfig),\n );\n\n return facilitator;\n}\n"],"mappings":"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","names":["Permit2ProxyEvmScheme","registerPermit2ProxyEvmScheme","Permit2ProxyEvmScheme","registerPermit2ProxyEvmScheme","Permit2ProxyEvmScheme","import_viem","Permit2ProxyEvmScheme","registerPermit2ProxyEvmScheme","Permit2ProxyEvmScheme"]}
@@ -0,0 +1,130 @@
1
+ import { SchemeNetworkServer, MoneyParser, Price, Network, AssetAmount, PaymentRequirements } from '@t402/core/types';
2
+ import { t402ResourceServer } from '@t402/core/server';
3
+
4
+ /**
5
+ * Configuration options for Permit2ProxyEvmScheme server
6
+ */
7
+ interface Permit2ProxyEvmSchemeConfig {
8
+ /** Preferred token symbol (e.g., "USDT0", "USDC"). Defaults to network's highest priority token. */
9
+ preferredToken?: string;
10
+ /** Override exact proxy contract address */
11
+ exactProxyAddress?: `0x${string}`;
12
+ /** Override upto proxy contract address */
13
+ uptoProxyAddress?: `0x${string}`;
14
+ }
15
+ /**
16
+ * EVM server implementation for the Permit2 Proxy payment scheme.
17
+ * Supports USDT0, USDC, and other ERC20 tokens via T402 Permit2 proxy contracts.
18
+ */
19
+ declare class Permit2ProxyEvmScheme implements SchemeNetworkServer {
20
+ readonly scheme: "permit2-proxy";
21
+ private moneyParsers;
22
+ private config;
23
+ /**
24
+ * Creates a new Permit2ProxyEvmScheme server instance.
25
+ *
26
+ * @param config - Server configuration options
27
+ */
28
+ constructor(config?: Permit2ProxyEvmSchemeConfig);
29
+ /**
30
+ * Get the list of supported EVM networks.
31
+ *
32
+ * @returns Array of supported network identifiers
33
+ */
34
+ static getSupportedNetworks(): string[];
35
+ /**
36
+ * Check if a network is supported.
37
+ *
38
+ * @param network - Network identifier to check
39
+ * @returns Whether the network is supported
40
+ */
41
+ static isNetworkSupported(network: string): boolean;
42
+ /**
43
+ * Register a custom money parser for price conversion.
44
+ *
45
+ * @param parser - The money parser to register
46
+ * @returns This instance for chaining
47
+ */
48
+ registerMoneyParser(parser: MoneyParser): Permit2ProxyEvmScheme;
49
+ /**
50
+ * Parse a price into an AssetAmount for the given network.
51
+ *
52
+ * @param price - The price to parse
53
+ * @param network - The target network
54
+ * @returns The parsed asset amount
55
+ */
56
+ parsePrice(price: Price, network: Network): Promise<AssetAmount>;
57
+ /**
58
+ * Enhance payment requirements with Permit2 Proxy-specific data.
59
+ *
60
+ * @param paymentRequirements - The base payment requirements
61
+ * @param supportedKind - The supported kind metadata
62
+ * @param supportedKind.t402Version - Protocol version
63
+ * @param supportedKind.scheme - Payment scheme
64
+ * @param supportedKind.network - Target network
65
+ * @param supportedKind.extra - Extra metadata
66
+ * @param extensionKeys - Active extension keys
67
+ * @returns Enhanced payment requirements
68
+ */
69
+ enhancePaymentRequirements(paymentRequirements: PaymentRequirements, supportedKind: {
70
+ t402Version: number;
71
+ scheme: string;
72
+ network: Network;
73
+ extra?: Record<string, unknown>;
74
+ }, extensionKeys: string[]): Promise<PaymentRequirements>;
75
+ /**
76
+ * Parse a money value into a decimal number.
77
+ *
78
+ * @param money - The money value to parse
79
+ * @returns The decimal amount
80
+ */
81
+ private parseMoneyToDecimal;
82
+ /**
83
+ * Convert a decimal amount to a token amount using default network token.
84
+ *
85
+ * @param amount - The decimal amount
86
+ * @param network - The target network
87
+ * @returns The asset amount with token details
88
+ */
89
+ private defaultMoneyConversion;
90
+ /**
91
+ * Convert a decimal amount string to token smallest units.
92
+ *
93
+ * @param decimalAmount - The decimal amount as a string
94
+ * @param decimals - The token's decimal places
95
+ * @returns The amount in smallest units
96
+ */
97
+ private convertToTokenAmount;
98
+ /**
99
+ * Get the default token asset for a network.
100
+ *
101
+ * @param network - The target network
102
+ * @returns The token configuration
103
+ */
104
+ private getDefaultAsset;
105
+ }
106
+
107
+ /**
108
+ * Configuration options for registering Permit2 Proxy schemes to an t402ResourceServer
109
+ */
110
+ interface Permit2ProxyEvmResourceServerConfig {
111
+ /**
112
+ * Optional specific networks to register
113
+ * If not provided, registers wildcard support (eip155:*)
114
+ */
115
+ networks?: Network[];
116
+ /**
117
+ * Optional scheme configuration
118
+ */
119
+ schemeConfig?: Permit2ProxyEvmSchemeConfig;
120
+ }
121
+ /**
122
+ * Registers Permit2 Proxy EVM payment schemes to an t402ResourceServer instance.
123
+ *
124
+ * @param server - The t402ResourceServer instance to register schemes to
125
+ * @param config - Configuration for Permit2 Proxy resource server registration
126
+ * @returns The server instance for chaining
127
+ */
128
+ declare function registerPermit2ProxyEvmScheme(server: t402ResourceServer, config?: Permit2ProxyEvmResourceServerConfig): t402ResourceServer;
129
+
130
+ export { type Permit2ProxyEvmResourceServerConfig, Permit2ProxyEvmScheme, type Permit2ProxyEvmSchemeConfig, registerPermit2ProxyEvmScheme };