@t402/aptos 2.3.1 → 2.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/README.md +8 -1
  2. package/dist/{exact-direct → cjs/exact-direct}/client/index.d.ts +2 -2
  3. package/dist/{exact-direct → cjs/exact-direct}/client/index.js +3 -1
  4. package/dist/cjs/exact-direct/client/index.js.map +1 -0
  5. package/dist/{exact-direct → cjs/exact-direct}/facilitator/index.d.ts +1 -1
  6. package/dist/{exact-direct → cjs/exact-direct}/facilitator/index.js +6 -4
  7. package/dist/cjs/exact-direct/facilitator/index.js.map +1 -0
  8. package/dist/{exact-direct → cjs/exact-direct}/server/index.js +5 -3
  9. package/dist/cjs/exact-direct/server/index.js.map +1 -0
  10. package/dist/{index.d.ts → cjs/index.d.ts} +2 -2
  11. package/dist/{index.js → cjs/index.js} +10 -8
  12. package/dist/cjs/index.js.map +1 -0
  13. package/dist/{types-kOweBf4U.d.cts → cjs/types-DYWWDudq.d.ts} +1 -1
  14. package/dist/esm/chunk-GQ5UPNUB.mjs +241 -0
  15. package/dist/esm/chunk-GQ5UPNUB.mjs.map +1 -0
  16. package/dist/{exact-direct/server/index.mjs → esm/chunk-KKEU3XY7.mjs} +15 -64
  17. package/dist/esm/chunk-KKEU3XY7.mjs.map +1 -0
  18. package/dist/{exact-direct/client/index.mjs → esm/chunk-LXW4POB2.mjs} +12 -81
  19. package/dist/esm/chunk-LXW4POB2.mjs.map +1 -0
  20. package/dist/{exact-direct/facilitator/index.mjs → esm/chunk-TOYLVPBQ.mjs} +17 -110
  21. package/dist/esm/chunk-TOYLVPBQ.mjs.map +1 -0
  22. package/dist/{exact-direct/client/index.d.cts → esm/exact-direct/client/index.d.mts} +2 -2
  23. package/dist/esm/exact-direct/client/index.mjs +10 -0
  24. package/dist/esm/exact-direct/client/index.mjs.map +1 -0
  25. package/dist/{exact-direct/facilitator/index.d.cts → esm/exact-direct/facilitator/index.d.mts} +1 -1
  26. package/dist/esm/exact-direct/facilitator/index.mjs +10 -0
  27. package/dist/esm/exact-direct/facilitator/index.mjs.map +1 -0
  28. package/dist/esm/exact-direct/server/index.mjs +10 -0
  29. package/dist/esm/exact-direct/server/index.mjs.map +1 -0
  30. package/dist/{index.d.cts → esm/index.d.mts} +5 -5
  31. package/dist/esm/index.mjs +115 -0
  32. package/dist/esm/index.mjs.map +1 -0
  33. package/dist/{types-kOweBf4U.d.ts → esm/types-DYWWDudq.d.mts} +1 -1
  34. package/package.json +6 -7
  35. package/dist/exact-direct/client/index.js.map +0 -1
  36. package/dist/exact-direct/client/index.mjs.map +0 -1
  37. package/dist/exact-direct/facilitator/index.js.map +0 -1
  38. package/dist/exact-direct/facilitator/index.mjs.map +0 -1
  39. package/dist/exact-direct/server/index.js.map +0 -1
  40. package/dist/exact-direct/server/index.mjs.map +0 -1
  41. package/dist/index.js.map +0 -1
  42. package/dist/index.mjs +0 -687
  43. package/dist/index.mjs.map +0 -1
  44. /package/dist/{exact-direct → cjs/exact-direct}/server/index.d.ts +0 -0
  45. /package/dist/{exact-direct/server/index.d.cts → esm/exact-direct/server/index.d.mts} +0 -0
package/README.md CHANGED
@@ -167,5 +167,12 @@ pnpm lint
167
167
 
168
168
  - `@t402/core` - Core protocol types and client
169
169
  - `@t402/fetch` - HTTP wrapper with automatic payment handling
170
- - `@t402/evm` - EVM chains implementation
170
+ - `@t402/evm` - EVM implementation
171
+ - `@t402/svm` - Solana implementation
172
+ - `@t402/ton` - TON implementation
173
+ - `@t402/tron` - TRON implementation
171
174
  - `@t402/near` - NEAR Protocol implementation
175
+ - `@t402/tezos` - Tezos implementation
176
+ - `@t402/polkadot` - Polkadot Asset Hub implementation
177
+ - `@t402/stacks` - Stacks implementation
178
+ - `@t402/cosmos` - Cosmos (Noble) implementation
@@ -1,6 +1,6 @@
1
1
  import { SchemeNetworkClient, PaymentRequirements, PaymentPayload, Network } from '@t402/core/types';
2
- import { C as ClientAptosSigner } from '../../types-kOweBf4U.js';
3
- import { t402Client, PaymentPolicy } from '@t402/core/client';
2
+ import { C as ClientAptosSigner } from '../../types-DYWWDudq.js';
3
+ import { PaymentPolicy, t402Client } from '@t402/core/client';
4
4
 
5
5
  /**
6
6
  * Aptos Exact-Direct Client Scheme
@@ -3,6 +3,7 @@ var __defProp = Object.defineProperty;
3
3
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
4
  var __getOwnPropNames = Object.getOwnPropertyNames;
5
5
  var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
6
7
  var __export = (target, all) => {
7
8
  for (var name in all)
8
9
  __defProp(target, name, { get: all[name], enumerable: true });
@@ -16,6 +17,7 @@ var __copyProps = (to, from, except, desc) => {
16
17
  return to;
17
18
  };
18
19
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
20
+ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
19
21
 
20
22
  // src/exact-direct/client/index.ts
21
23
  var client_exports = {};
@@ -109,9 +111,9 @@ function parseAssetIdentifier(asset) {
109
111
  var ExactDirectAptosClient = class {
110
112
  constructor(signer, config = {}) {
111
113
  this.signer = signer;
114
+ __publicField(this, "scheme", SCHEME_EXACT_DIRECT);
112
115
  void config;
113
116
  }
114
- scheme = SCHEME_EXACT_DIRECT;
115
117
  /**
116
118
  * Create a payment payload by executing the transfer
117
119
  */
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/exact-direct/client/index.ts","../../../../src/constants.ts","../../../../src/tokens.ts","../../../../src/utils.ts","../../../../src/exact-direct/client/scheme.ts","../../../../src/exact-direct/client/register.ts"],"sourcesContent":["/**\n * Aptos Exact-Direct Client Exports\n */\n\nexport {\n ExactDirectAptosClient,\n type ExactDirectAptosClientConfig,\n} from \"./scheme.js\";\nexport {\n registerExactDirectAptosClient,\n type AptosClientConfig,\n} from \"./register.js\";\n","/**\n * Aptos Network Constants\n */\n\n// CAIP-2 namespace for Aptos\nexport const APTOS_CAIP2_NAMESPACE = \"aptos\";\n\n// Standard Aptos network identifiers (CAIP-2 format)\nexport const APTOS_MAINNET_CAIP2 = \"aptos:1\";\nexport const APTOS_TESTNET_CAIP2 = \"aptos:2\";\nexport const APTOS_DEVNET_CAIP2 = \"aptos:149\";\n\n// All supported Aptos networks\nexport const APTOS_NETWORKS = [\n APTOS_MAINNET_CAIP2,\n APTOS_TESTNET_CAIP2,\n APTOS_DEVNET_CAIP2,\n] as const;\n\nexport type AptosNetwork = (typeof APTOS_NETWORKS)[number];\n\n// Chain IDs\nexport const APTOS_MAINNET_CHAIN_ID = 1;\nexport const APTOS_TESTNET_CHAIN_ID = 2;\nexport const APTOS_DEVNET_CHAIN_ID = 149;\n\n// RPC endpoints\nexport const DEFAULT_MAINNET_RPC = \"https://fullnode.mainnet.aptoslabs.com/v1\";\nexport const DEFAULT_TESTNET_RPC = \"https://fullnode.testnet.aptoslabs.com/v1\";\nexport const DEFAULT_DEVNET_RPC = \"https://fullnode.devnet.aptoslabs.com/v1\";\n\n// Scheme identifier\nexport const SCHEME_EXACT_DIRECT = \"exact-direct\";\n\n// Fungible Asset module addresses\nexport const PRIMARY_FUNGIBLE_STORE_MODULE = \"0x1::primary_fungible_store\";\nexport const FUNGIBLE_ASSET_MODULE = \"0x1::fungible_asset\";\nexport const APTOS_ACCOUNT_MODULE = \"0x1::aptos_account\";\n\n// Transfer function\nexport const FA_TRANSFER_FUNCTION = `${PRIMARY_FUNGIBLE_STORE_MODULE}::transfer`;\n\n// Default gas configuration\nexport const DEFAULT_MAX_GAS_AMOUNT = 100000n;\nexport const DEFAULT_GAS_UNIT_PRICE = 100n;\n\n// Transaction expiration (in seconds)\nexport const DEFAULT_TX_EXPIRATION_SECONDS = 600; // 10 minutes\n","/**\n * Aptos Token Registry\n *\n * Token addresses for supported stablecoins on Aptos networks.\n * All tokens use the Fungible Asset (FA) standard.\n */\n\nimport {\n APTOS_MAINNET_CAIP2,\n APTOS_TESTNET_CAIP2,\n APTOS_DEVNET_CAIP2,\n} from \"./constants.js\";\n\n/**\n * Token configuration for Aptos fungible assets\n */\nexport interface TokenConfig {\n /** Fungible Asset metadata address */\n metadataAddress: string;\n /** Token symbol (e.g., \"USDT\", \"USDC\") */\n symbol: string;\n /** Token name */\n name: string;\n /** Decimal places */\n decimals: number;\n}\n\n/**\n * Token registry mapping network -> tokens\n */\nexport const TOKEN_REGISTRY: Record<string, TokenConfig[]> = {\n [APTOS_MAINNET_CAIP2]: [\n {\n metadataAddress:\n \"0xf73e887a8754f540ee6e1a93bdc6dde2af69fc7ca5de32013e89dd44244473cb\",\n symbol: \"USDT\",\n name: \"Tether USD\",\n decimals: 6,\n },\n {\n metadataAddress:\n \"0xbae207659db88bea0cbead6da0ed00aac12edcdda169e591cd41c94180b46f3b\",\n symbol: \"USDC\",\n name: \"USD Coin\",\n decimals: 6,\n },\n ],\n [APTOS_TESTNET_CAIP2]: [\n {\n // Testnet USDT (may differ from mainnet)\n metadataAddress:\n \"0xf73e887a8754f540ee6e1a93bdc6dde2af69fc7ca5de32013e89dd44244473cb\",\n symbol: \"USDT\",\n name: \"Tether USD\",\n decimals: 6,\n },\n ],\n [APTOS_DEVNET_CAIP2]: [],\n};\n\n/**\n * Get token configuration for a specific network and symbol\n */\nexport function getTokenConfig(\n network: string,\n symbol: string,\n): TokenConfig | undefined {\n const tokens = TOKEN_REGISTRY[network];\n if (!tokens) return undefined;\n return tokens.find(\n (t) => t.symbol.toUpperCase() === symbol.toUpperCase(),\n );\n}\n\n/**\n * Get all supported tokens for a network\n */\nexport function getSupportedTokens(network: string): TokenConfig[] {\n return TOKEN_REGISTRY[network] || [];\n}\n\n/**\n * Check if a token is supported on a network\n */\nexport function isTokenSupported(network: string, symbol: string): boolean {\n return getTokenConfig(network, symbol) !== undefined;\n}\n\n/**\n * Get token by metadata address\n */\nexport function getTokenByAddress(\n network: string,\n metadataAddress: string,\n): TokenConfig | undefined {\n const tokens = TOKEN_REGISTRY[network];\n if (!tokens) return undefined;\n const normalizedAddress = metadataAddress.toLowerCase();\n return tokens.find(\n (t) => t.metadataAddress.toLowerCase() === normalizedAddress,\n );\n}\n\n/**\n * Default token symbol for payments (USDT)\n */\nexport const DEFAULT_TOKEN_SYMBOL = \"USDT\";\n\n/**\n * Get the default token for a network\n */\nexport function getDefaultToken(network: string): TokenConfig | undefined {\n return getTokenConfig(network, DEFAULT_TOKEN_SYMBOL);\n}\n","/**\n * Aptos Utility Functions\n */\n\nimport type { Network } from \"@t402/core/types\";\nimport {\n APTOS_CAIP2_NAMESPACE,\n APTOS_MAINNET_CAIP2,\n APTOS_TESTNET_CAIP2,\n APTOS_DEVNET_CAIP2,\n DEFAULT_MAINNET_RPC,\n DEFAULT_TESTNET_RPC,\n DEFAULT_DEVNET_RPC,\n FA_TRANSFER_FUNCTION,\n} from \"./constants.js\";\nimport type {\n AptosTransactionResult,\n AptosTransactionEvent,\n ParsedFATransfer,\n} from \"./types.js\";\n\n/**\n * Validate Aptos address format\n * Aptos addresses are 64 hex characters (32 bytes) with 0x prefix\n */\nexport function isValidAptosAddress(address: string): boolean {\n if (!address) return false;\n // Must start with 0x\n if (!address.startsWith(\"0x\")) return false;\n // Remove 0x prefix and check hex\n const hex = address.slice(2);\n // Aptos addresses can be 1-64 hex chars (leading zeros may be omitted)\n if (hex.length === 0 || hex.length > 64) return false;\n return /^[0-9a-fA-F]+$/.test(hex);\n}\n\n/**\n * Normalize Aptos address to full 64-character format\n */\nexport function normalizeAptosAddress(address: string): string {\n if (!address.startsWith(\"0x\")) {\n throw new Error(\"Aptos address must start with 0x\");\n }\n const hex = address.slice(2).toLowerCase();\n // Pad to 64 characters\n return \"0x\" + hex.padStart(64, \"0\");\n}\n\n/**\n * Compare two Aptos addresses (case-insensitive, handles short addresses)\n */\nexport function compareAddresses(addr1: string, addr2: string): boolean {\n try {\n return normalizeAptosAddress(addr1) === normalizeAptosAddress(addr2);\n } catch {\n return false;\n }\n}\n\n/**\n * Validate transaction hash format\n */\nexport function isValidTxHash(txHash: string): boolean {\n if (!txHash) return false;\n if (!txHash.startsWith(\"0x\")) return false;\n const hex = txHash.slice(2);\n // Transaction hash is 64 hex characters (32 bytes)\n if (hex.length !== 64) return false;\n return /^[0-9a-fA-F]+$/.test(hex);\n}\n\n/**\n * Get default RPC URL for a network\n */\nexport function getDefaultRpcUrl(network: Network): string {\n switch (network) {\n case APTOS_MAINNET_CAIP2:\n return DEFAULT_MAINNET_RPC;\n case APTOS_TESTNET_CAIP2:\n return DEFAULT_TESTNET_RPC;\n case APTOS_DEVNET_CAIP2:\n return DEFAULT_DEVNET_RPC;\n default:\n throw new Error(`Unknown Aptos network: ${network}`);\n }\n}\n\n/**\n * Check if a network identifier is for Aptos\n */\nexport function isAptosNetwork(network: Network): boolean {\n return network.startsWith(`${APTOS_CAIP2_NAMESPACE}:`);\n}\n\n/**\n * Parse CAIP-19 asset identifier for Aptos\n * Format: aptos:1/fa:0x...\n */\nexport function parseAssetIdentifier(asset: string): {\n network: Network;\n metadataAddress: string;\n} | null {\n const parts = asset.split(\"/\");\n if (parts.length !== 2) return null;\n\n const network = parts[0] as Network;\n if (!isAptosNetwork(network)) return null;\n\n const [assetType, address] = parts[1].split(\":\");\n if (assetType !== \"fa\" || !address) return null;\n\n if (!isValidAptosAddress(address)) return null;\n\n return { network, metadataAddress: address };\n}\n\n/**\n * Create CAIP-19 asset identifier for Aptos FA\n */\nexport function createAssetIdentifier(\n network: Network,\n metadataAddress: string,\n): string {\n return `${network}/fa:${metadataAddress}`;\n}\n\n/**\n * Parse fungible asset transfer from transaction events\n */\nexport function parseFATransferFromEvents(\n events: AptosTransactionEvent[],\n): ParsedFATransfer | null {\n // Look for Withdraw and Deposit events\n const withdrawEvent = events.find(\n (e) =>\n e.type === \"0x1::fungible_asset::Withdraw\" ||\n e.type.includes(\"::fungible_asset::Withdraw\"),\n );\n const depositEvent = events.find(\n (e) =>\n e.type === \"0x1::fungible_asset::Deposit\" ||\n e.type.includes(\"::fungible_asset::Deposit\"),\n );\n\n if (!withdrawEvent || !depositEvent) {\n return null;\n }\n\n // Extract data from events\n const withdrawData = withdrawEvent.data as {\n store?: string;\n amount?: string;\n };\n const depositData = depositEvent.data as {\n store?: string;\n amount?: string;\n };\n\n if (!withdrawData.amount || !depositData.store) {\n return null;\n }\n\n // The from address is the account that owns the withdraw store\n // The to address is the account that owns the deposit store\n // For simplicity, we'll extract from the event guid\n const from = withdrawEvent.guid.accountAddress;\n const to = depositEvent.guid.accountAddress;\n const amount = BigInt(withdrawData.amount);\n\n // Metadata address would need to be extracted from state changes\n // For now, return with empty metadata (to be filled by caller)\n return {\n from,\n to,\n amount,\n metadataAddress: \"\", // Will be filled from transaction details\n };\n}\n\n/**\n * Check if transaction is a FA transfer\n */\nexport function isFATransferTransaction(tx: AptosTransactionResult): boolean {\n if (!tx.payload) return false;\n if (tx.payload.type !== \"entry_function_payload\") return false;\n return (\n tx.payload.function === FA_TRANSFER_FUNCTION ||\n tx.payload.function?.includes(\"primary_fungible_store::transfer\") ||\n false\n );\n}\n\n/**\n * Extract transfer details from transaction\n */\nexport function extractTransferDetails(\n tx: AptosTransactionResult,\n): ParsedFATransfer | null {\n if (!tx.success) return null;\n if (!tx.payload || tx.payload.type !== \"entry_function_payload\") return null;\n\n const args = tx.payload.arguments;\n if (!args || args.length < 3) return null;\n\n // Arguments for primary_fungible_store::transfer:\n // [0] - metadata object address\n // [1] - recipient address\n // [2] - amount\n\n const metadataAddress = args[0] as string;\n const to = args[1] as string;\n const amount = BigInt(args[2] as string);\n\n return {\n from: tx.sender,\n to,\n amount,\n metadataAddress,\n };\n}\n\n/**\n * Format amount with decimals for display\n */\nexport function formatAmount(amount: bigint, decimals: number): string {\n const divisor = BigInt(10 ** decimals);\n const wholePart = amount / divisor;\n const fractionalPart = amount % divisor;\n const paddedFractional = fractionalPart.toString().padStart(decimals, \"0\");\n return `${wholePart}.${paddedFractional}`;\n}\n\n/**\n * Parse amount string to bigint\n */\nexport function parseAmount(amount: string, decimals: number): bigint {\n const [whole, fractional = \"\"] = amount.split(\".\");\n const paddedFractional = fractional.padEnd(decimals, \"0\").slice(0, decimals);\n return BigInt(whole + paddedFractional);\n}\n","/**\n * Aptos Exact-Direct Client Scheme\n *\n * The client executes the FA transfer directly and provides\n * the transaction hash as proof of payment.\n */\n\nimport type {\n SchemeNetworkClient,\n PaymentPayload,\n PaymentRequirements,\n} from \"@t402/core/types\";\nimport { SCHEME_EXACT_DIRECT, APTOS_CAIP2_NAMESPACE } from \"../../constants.js\";\nimport type { ClientAptosSigner, ExactDirectAptosPayload } from \"../../types.js\";\nimport { getTokenConfig } from \"../../tokens.js\";\nimport {\n isValidAptosAddress,\n parseAssetIdentifier,\n compareAddresses,\n} from \"../../utils.js\";\n\n/**\n * Configuration for ExactDirectAptosClient\n */\nexport interface ExactDirectAptosClientConfig {\n /**\n * Whether to verify the transfer was successful before returning\n * @default true\n */\n verifyTransfer?: boolean;\n}\n\n/**\n * Aptos Exact-Direct Client\n *\n * Implements the client-side payment flow where the client:\n * 1. Receives payment requirements\n * 2. Executes the FA transfer transaction\n * 3. Returns transaction hash as proof\n */\nexport class ExactDirectAptosClient implements SchemeNetworkClient {\n readonly scheme = SCHEME_EXACT_DIRECT;\n\n constructor(\n private readonly signer: ClientAptosSigner,\n config: ExactDirectAptosClientConfig = {},\n ) {\n // Config reserved for future use (e.g., verifyTransfer option)\n void config;\n }\n\n /**\n * Create a payment payload by executing the transfer\n */\n async createPaymentPayload(\n t402Version: number,\n paymentRequirements: PaymentRequirements,\n ): Promise<Pick<PaymentPayload, \"t402Version\" | \"payload\">> {\n // Validate requirements\n this.validateRequirements(paymentRequirements);\n\n // Get sender address\n const from = await this.signer.getAddress();\n\n // Parse asset to get metadata address\n const assetInfo = parseAssetIdentifier(paymentRequirements.asset);\n if (!assetInfo) {\n throw new Error(`Invalid asset identifier: ${paymentRequirements.asset}`);\n }\n\n // Get amount\n const amount = BigInt(paymentRequirements.amount);\n\n // Check balance\n const balance = await this.signer.getBalance(assetInfo.metadataAddress);\n if (balance < amount) {\n throw new Error(\n `Insufficient balance: have ${balance}, need ${amount}`,\n );\n }\n\n // Execute transfer\n const txHash = await this.signer.transfer(\n paymentRequirements.payTo,\n assetInfo.metadataAddress,\n amount,\n );\n\n // Create payload\n const payload: ExactDirectAptosPayload = {\n txHash,\n from,\n to: paymentRequirements.payTo,\n amount: paymentRequirements.amount,\n metadataAddress: assetInfo.metadataAddress,\n };\n\n return {\n t402Version,\n payload,\n };\n }\n\n /**\n * Validate payment requirements\n */\n private validateRequirements(requirements: PaymentRequirements): void {\n // Check scheme\n if (requirements.scheme !== SCHEME_EXACT_DIRECT) {\n throw new Error(\n `Invalid scheme: expected ${SCHEME_EXACT_DIRECT}, got ${requirements.scheme}`,\n );\n }\n\n // Check network\n if (!requirements.network.startsWith(`${APTOS_CAIP2_NAMESPACE}:`)) {\n throw new Error(`Invalid network: ${requirements.network}`);\n }\n\n // Check payTo address\n if (!isValidAptosAddress(requirements.payTo)) {\n throw new Error(`Invalid payTo address: ${requirements.payTo}`);\n }\n\n // Check amount\n const amount = BigInt(requirements.amount);\n if (amount <= 0n) {\n throw new Error(`Invalid amount: ${requirements.amount}`);\n }\n\n // Check asset\n const assetInfo = parseAssetIdentifier(requirements.asset);\n if (!assetInfo) {\n throw new Error(`Invalid asset: ${requirements.asset}`);\n }\n\n // Verify token is supported\n const tokenConfig = getTokenConfig(requirements.network, \"USDT\");\n if (tokenConfig && !compareAddresses(tokenConfig.metadataAddress, assetInfo.metadataAddress)) {\n // Allow any valid FA, but log warning for unknown tokens\n console.warn(\n `Using non-standard token: ${assetInfo.metadataAddress}`,\n );\n }\n }\n}\n\nexport default ExactDirectAptosClient;\n","/**\n * Registration function for Aptos Exact-Direct client\n */\n\nimport { t402Client, PaymentPolicy } from \"@t402/core/client\";\nimport type { Network } from \"@t402/core/types\";\nimport type { ClientAptosSigner } from \"../../types.js\";\nimport {\n ExactDirectAptosClient,\n type ExactDirectAptosClientConfig,\n} from \"./scheme.js\";\n\n/**\n * Configuration options for registering Aptos schemes to a t402Client\n */\nexport interface AptosClientConfig {\n /**\n * The Aptos signer for client operations\n */\n signer: ClientAptosSigner;\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 (aptos:*)\n */\n networks?: Network[];\n\n /**\n * Optional scheme configuration\n */\n schemeConfig?: ExactDirectAptosClientConfig;\n}\n\n/**\n * Registers Aptos exact-direct payment schemes to a t402Client instance.\n *\n * @param client - The t402Client instance to register schemes to\n * @param config - Configuration for Aptos client registration\n * @returns The client instance for chaining\n *\n * @example\n * ```typescript\n * import { registerExactDirectAptosClient } from \"@t402/aptos/exact-direct/client\";\n * import { t402Client } from \"@t402/core/client\";\n *\n * const client = new t402Client();\n * registerExactDirectAptosClient(client, {\n * signer: myAptosSigner,\n * networks: [\"aptos:1\"]\n * });\n * ```\n */\nexport function registerExactDirectAptosClient(\n client: t402Client,\n config: AptosClientConfig,\n): t402Client {\n const scheme = new ExactDirectAptosClient(config.signer, config.schemeConfig);\n\n // Register scheme\n if (config.networks && config.networks.length > 0) {\n // Register specific networks\n config.networks.forEach((network) => {\n client.register(network, scheme);\n });\n } else {\n // Register wildcard for all Aptos networks\n client.register(\"aptos:*\", scheme);\n }\n\n // Apply policies if provided\n if (config.policies) {\n config.policies.forEach((policy) => {\n client.registerPolicy(policy);\n });\n }\n\n return client;\n}\n"],"mappings":"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","names":[]}
@@ -1,5 +1,5 @@
1
1
  import { SchemeNetworkFacilitator, Network, PaymentPayload, PaymentRequirements, VerifyResponse, SettleResponse } from '@t402/core/types';
2
- import { F as FacilitatorAptosSigner } from '../../types-kOweBf4U.js';
2
+ import { F as FacilitatorAptosSigner } from '../../types-DYWWDudq.js';
3
3
  import { t402Facilitator } from '@t402/core/facilitator';
4
4
 
5
5
  /**
@@ -3,6 +3,7 @@ var __defProp = Object.defineProperty;
3
3
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
4
  var __getOwnPropNames = Object.getOwnPropertyNames;
5
5
  var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
6
7
  var __export = (target, all) => {
7
8
  for (var name in all)
8
9
  __defProp(target, name, { get: all[name], enumerable: true });
@@ -16,6 +17,7 @@ var __copyProps = (to, from, except, desc) => {
16
17
  return to;
17
18
  };
18
19
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
20
+ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
19
21
 
20
22
  // src/exact-direct/facilitator/index.ts
21
23
  var facilitator_exports = {};
@@ -135,6 +137,10 @@ function getDefaultToken(network) {
135
137
  var ExactDirectAptosFacilitator = class {
136
138
  constructor(signer, config) {
137
139
  this.signer = signer;
140
+ __publicField(this, "scheme", SCHEME_EXACT_DIRECT);
141
+ __publicField(this, "caipFamily", `${APTOS_CAIP2_NAMESPACE}:*`);
142
+ __publicField(this, "config");
143
+ __publicField(this, "usedTxs", /* @__PURE__ */ new Map());
138
144
  this.config = {
139
145
  maxTransactionAge: config?.maxTransactionAge ?? 3600,
140
146
  usedTxCacheDuration: config?.usedTxCacheDuration ?? 24 * 60 * 60 * 1e3
@@ -142,10 +148,6 @@ var ExactDirectAptosFacilitator = class {
142
148
  };
143
149
  this.startCleanupInterval();
144
150
  }
145
- scheme = SCHEME_EXACT_DIRECT;
146
- caipFamily = `${APTOS_CAIP2_NAMESPACE}:*`;
147
- config;
148
- usedTxs = /* @__PURE__ */ new Map();
149
151
  /**
150
152
  * Get extra data for a supported kind
151
153
  */
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/exact-direct/facilitator/index.ts","../../../../src/constants.ts","../../../../src/utils.ts","../../../../src/tokens.ts","../../../../src/exact-direct/facilitator/scheme.ts","../../../../src/exact-direct/facilitator/register.ts"],"sourcesContent":["/**\n * Aptos Exact-Direct Facilitator Exports\n */\n\nexport {\n ExactDirectAptosFacilitator,\n type ExactDirectAptosFacilitatorConfig,\n} from \"./scheme.js\";\nexport {\n registerExactDirectAptosFacilitator,\n type AptosFacilitatorConfig,\n} from \"./register.js\";\n","/**\n * Aptos Network Constants\n */\n\n// CAIP-2 namespace for Aptos\nexport const APTOS_CAIP2_NAMESPACE = \"aptos\";\n\n// Standard Aptos network identifiers (CAIP-2 format)\nexport const APTOS_MAINNET_CAIP2 = \"aptos:1\";\nexport const APTOS_TESTNET_CAIP2 = \"aptos:2\";\nexport const APTOS_DEVNET_CAIP2 = \"aptos:149\";\n\n// All supported Aptos networks\nexport const APTOS_NETWORKS = [\n APTOS_MAINNET_CAIP2,\n APTOS_TESTNET_CAIP2,\n APTOS_DEVNET_CAIP2,\n] as const;\n\nexport type AptosNetwork = (typeof APTOS_NETWORKS)[number];\n\n// Chain IDs\nexport const APTOS_MAINNET_CHAIN_ID = 1;\nexport const APTOS_TESTNET_CHAIN_ID = 2;\nexport const APTOS_DEVNET_CHAIN_ID = 149;\n\n// RPC endpoints\nexport const DEFAULT_MAINNET_RPC = \"https://fullnode.mainnet.aptoslabs.com/v1\";\nexport const DEFAULT_TESTNET_RPC = \"https://fullnode.testnet.aptoslabs.com/v1\";\nexport const DEFAULT_DEVNET_RPC = \"https://fullnode.devnet.aptoslabs.com/v1\";\n\n// Scheme identifier\nexport const SCHEME_EXACT_DIRECT = \"exact-direct\";\n\n// Fungible Asset module addresses\nexport const PRIMARY_FUNGIBLE_STORE_MODULE = \"0x1::primary_fungible_store\";\nexport const FUNGIBLE_ASSET_MODULE = \"0x1::fungible_asset\";\nexport const APTOS_ACCOUNT_MODULE = \"0x1::aptos_account\";\n\n// Transfer function\nexport const FA_TRANSFER_FUNCTION = `${PRIMARY_FUNGIBLE_STORE_MODULE}::transfer`;\n\n// Default gas configuration\nexport const DEFAULT_MAX_GAS_AMOUNT = 100000n;\nexport const DEFAULT_GAS_UNIT_PRICE = 100n;\n\n// Transaction expiration (in seconds)\nexport const DEFAULT_TX_EXPIRATION_SECONDS = 600; // 10 minutes\n","/**\n * Aptos Utility Functions\n */\n\nimport type { Network } from \"@t402/core/types\";\nimport {\n APTOS_CAIP2_NAMESPACE,\n APTOS_MAINNET_CAIP2,\n APTOS_TESTNET_CAIP2,\n APTOS_DEVNET_CAIP2,\n DEFAULT_MAINNET_RPC,\n DEFAULT_TESTNET_RPC,\n DEFAULT_DEVNET_RPC,\n FA_TRANSFER_FUNCTION,\n} from \"./constants.js\";\nimport type {\n AptosTransactionResult,\n AptosTransactionEvent,\n ParsedFATransfer,\n} from \"./types.js\";\n\n/**\n * Validate Aptos address format\n * Aptos addresses are 64 hex characters (32 bytes) with 0x prefix\n */\nexport function isValidAptosAddress(address: string): boolean {\n if (!address) return false;\n // Must start with 0x\n if (!address.startsWith(\"0x\")) return false;\n // Remove 0x prefix and check hex\n const hex = address.slice(2);\n // Aptos addresses can be 1-64 hex chars (leading zeros may be omitted)\n if (hex.length === 0 || hex.length > 64) return false;\n return /^[0-9a-fA-F]+$/.test(hex);\n}\n\n/**\n * Normalize Aptos address to full 64-character format\n */\nexport function normalizeAptosAddress(address: string): string {\n if (!address.startsWith(\"0x\")) {\n throw new Error(\"Aptos address must start with 0x\");\n }\n const hex = address.slice(2).toLowerCase();\n // Pad to 64 characters\n return \"0x\" + hex.padStart(64, \"0\");\n}\n\n/**\n * Compare two Aptos addresses (case-insensitive, handles short addresses)\n */\nexport function compareAddresses(addr1: string, addr2: string): boolean {\n try {\n return normalizeAptosAddress(addr1) === normalizeAptosAddress(addr2);\n } catch {\n return false;\n }\n}\n\n/**\n * Validate transaction hash format\n */\nexport function isValidTxHash(txHash: string): boolean {\n if (!txHash) return false;\n if (!txHash.startsWith(\"0x\")) return false;\n const hex = txHash.slice(2);\n // Transaction hash is 64 hex characters (32 bytes)\n if (hex.length !== 64) return false;\n return /^[0-9a-fA-F]+$/.test(hex);\n}\n\n/**\n * Get default RPC URL for a network\n */\nexport function getDefaultRpcUrl(network: Network): string {\n switch (network) {\n case APTOS_MAINNET_CAIP2:\n return DEFAULT_MAINNET_RPC;\n case APTOS_TESTNET_CAIP2:\n return DEFAULT_TESTNET_RPC;\n case APTOS_DEVNET_CAIP2:\n return DEFAULT_DEVNET_RPC;\n default:\n throw new Error(`Unknown Aptos network: ${network}`);\n }\n}\n\n/**\n * Check if a network identifier is for Aptos\n */\nexport function isAptosNetwork(network: Network): boolean {\n return network.startsWith(`${APTOS_CAIP2_NAMESPACE}:`);\n}\n\n/**\n * Parse CAIP-19 asset identifier for Aptos\n * Format: aptos:1/fa:0x...\n */\nexport function parseAssetIdentifier(asset: string): {\n network: Network;\n metadataAddress: string;\n} | null {\n const parts = asset.split(\"/\");\n if (parts.length !== 2) return null;\n\n const network = parts[0] as Network;\n if (!isAptosNetwork(network)) return null;\n\n const [assetType, address] = parts[1].split(\":\");\n if (assetType !== \"fa\" || !address) return null;\n\n if (!isValidAptosAddress(address)) return null;\n\n return { network, metadataAddress: address };\n}\n\n/**\n * Create CAIP-19 asset identifier for Aptos FA\n */\nexport function createAssetIdentifier(\n network: Network,\n metadataAddress: string,\n): string {\n return `${network}/fa:${metadataAddress}`;\n}\n\n/**\n * Parse fungible asset transfer from transaction events\n */\nexport function parseFATransferFromEvents(\n events: AptosTransactionEvent[],\n): ParsedFATransfer | null {\n // Look for Withdraw and Deposit events\n const withdrawEvent = events.find(\n (e) =>\n e.type === \"0x1::fungible_asset::Withdraw\" ||\n e.type.includes(\"::fungible_asset::Withdraw\"),\n );\n const depositEvent = events.find(\n (e) =>\n e.type === \"0x1::fungible_asset::Deposit\" ||\n e.type.includes(\"::fungible_asset::Deposit\"),\n );\n\n if (!withdrawEvent || !depositEvent) {\n return null;\n }\n\n // Extract data from events\n const withdrawData = withdrawEvent.data as {\n store?: string;\n amount?: string;\n };\n const depositData = depositEvent.data as {\n store?: string;\n amount?: string;\n };\n\n if (!withdrawData.amount || !depositData.store) {\n return null;\n }\n\n // The from address is the account that owns the withdraw store\n // The to address is the account that owns the deposit store\n // For simplicity, we'll extract from the event guid\n const from = withdrawEvent.guid.accountAddress;\n const to = depositEvent.guid.accountAddress;\n const amount = BigInt(withdrawData.amount);\n\n // Metadata address would need to be extracted from state changes\n // For now, return with empty metadata (to be filled by caller)\n return {\n from,\n to,\n amount,\n metadataAddress: \"\", // Will be filled from transaction details\n };\n}\n\n/**\n * Check if transaction is a FA transfer\n */\nexport function isFATransferTransaction(tx: AptosTransactionResult): boolean {\n if (!tx.payload) return false;\n if (tx.payload.type !== \"entry_function_payload\") return false;\n return (\n tx.payload.function === FA_TRANSFER_FUNCTION ||\n tx.payload.function?.includes(\"primary_fungible_store::transfer\") ||\n false\n );\n}\n\n/**\n * Extract transfer details from transaction\n */\nexport function extractTransferDetails(\n tx: AptosTransactionResult,\n): ParsedFATransfer | null {\n if (!tx.success) return null;\n if (!tx.payload || tx.payload.type !== \"entry_function_payload\") return null;\n\n const args = tx.payload.arguments;\n if (!args || args.length < 3) return null;\n\n // Arguments for primary_fungible_store::transfer:\n // [0] - metadata object address\n // [1] - recipient address\n // [2] - amount\n\n const metadataAddress = args[0] as string;\n const to = args[1] as string;\n const amount = BigInt(args[2] as string);\n\n return {\n from: tx.sender,\n to,\n amount,\n metadataAddress,\n };\n}\n\n/**\n * Format amount with decimals for display\n */\nexport function formatAmount(amount: bigint, decimals: number): string {\n const divisor = BigInt(10 ** decimals);\n const wholePart = amount / divisor;\n const fractionalPart = amount % divisor;\n const paddedFractional = fractionalPart.toString().padStart(decimals, \"0\");\n return `${wholePart}.${paddedFractional}`;\n}\n\n/**\n * Parse amount string to bigint\n */\nexport function parseAmount(amount: string, decimals: number): bigint {\n const [whole, fractional = \"\"] = amount.split(\".\");\n const paddedFractional = fractional.padEnd(decimals, \"0\").slice(0, decimals);\n return BigInt(whole + paddedFractional);\n}\n","/**\n * Aptos Token Registry\n *\n * Token addresses for supported stablecoins on Aptos networks.\n * All tokens use the Fungible Asset (FA) standard.\n */\n\nimport {\n APTOS_MAINNET_CAIP2,\n APTOS_TESTNET_CAIP2,\n APTOS_DEVNET_CAIP2,\n} from \"./constants.js\";\n\n/**\n * Token configuration for Aptos fungible assets\n */\nexport interface TokenConfig {\n /** Fungible Asset metadata address */\n metadataAddress: string;\n /** Token symbol (e.g., \"USDT\", \"USDC\") */\n symbol: string;\n /** Token name */\n name: string;\n /** Decimal places */\n decimals: number;\n}\n\n/**\n * Token registry mapping network -> tokens\n */\nexport const TOKEN_REGISTRY: Record<string, TokenConfig[]> = {\n [APTOS_MAINNET_CAIP2]: [\n {\n metadataAddress:\n \"0xf73e887a8754f540ee6e1a93bdc6dde2af69fc7ca5de32013e89dd44244473cb\",\n symbol: \"USDT\",\n name: \"Tether USD\",\n decimals: 6,\n },\n {\n metadataAddress:\n \"0xbae207659db88bea0cbead6da0ed00aac12edcdda169e591cd41c94180b46f3b\",\n symbol: \"USDC\",\n name: \"USD Coin\",\n decimals: 6,\n },\n ],\n [APTOS_TESTNET_CAIP2]: [\n {\n // Testnet USDT (may differ from mainnet)\n metadataAddress:\n \"0xf73e887a8754f540ee6e1a93bdc6dde2af69fc7ca5de32013e89dd44244473cb\",\n symbol: \"USDT\",\n name: \"Tether USD\",\n decimals: 6,\n },\n ],\n [APTOS_DEVNET_CAIP2]: [],\n};\n\n/**\n * Get token configuration for a specific network and symbol\n */\nexport function getTokenConfig(\n network: string,\n symbol: string,\n): TokenConfig | undefined {\n const tokens = TOKEN_REGISTRY[network];\n if (!tokens) return undefined;\n return tokens.find(\n (t) => t.symbol.toUpperCase() === symbol.toUpperCase(),\n );\n}\n\n/**\n * Get all supported tokens for a network\n */\nexport function getSupportedTokens(network: string): TokenConfig[] {\n return TOKEN_REGISTRY[network] || [];\n}\n\n/**\n * Check if a token is supported on a network\n */\nexport function isTokenSupported(network: string, symbol: string): boolean {\n return getTokenConfig(network, symbol) !== undefined;\n}\n\n/**\n * Get token by metadata address\n */\nexport function getTokenByAddress(\n network: string,\n metadataAddress: string,\n): TokenConfig | undefined {\n const tokens = TOKEN_REGISTRY[network];\n if (!tokens) return undefined;\n const normalizedAddress = metadataAddress.toLowerCase();\n return tokens.find(\n (t) => t.metadataAddress.toLowerCase() === normalizedAddress,\n );\n}\n\n/**\n * Default token symbol for payments (USDT)\n */\nexport const DEFAULT_TOKEN_SYMBOL = \"USDT\";\n\n/**\n * Get the default token for a network\n */\nexport function getDefaultToken(network: string): TokenConfig | undefined {\n return getTokenConfig(network, DEFAULT_TOKEN_SYMBOL);\n}\n","/**\n * Aptos Exact-Direct Facilitator Scheme\n *\n * Verifies FA transfer transactions and manages replay protection.\n */\n\nimport type {\n SchemeNetworkFacilitator,\n PaymentPayload,\n PaymentRequirements,\n VerifyResponse,\n SettleResponse,\n Network,\n} from \"@t402/core/types\";\nimport { SCHEME_EXACT_DIRECT, APTOS_CAIP2_NAMESPACE } from \"../../constants.js\";\nimport type {\n FacilitatorAptosSigner,\n ExactDirectAptosPayload,\n} from \"../../types.js\";\nimport {\n isValidTxHash,\n compareAddresses,\n parseAssetIdentifier,\n extractTransferDetails,\n isAptosNetwork,\n} from \"../../utils.js\";\nimport { getDefaultToken } from \"../../tokens.js\";\n\n/**\n * Configuration for ExactDirectAptosFacilitator\n */\nexport interface ExactDirectAptosFacilitatorConfig {\n /**\n * Maximum age of transaction in seconds (default: 3600 = 1 hour)\n */\n maxTransactionAge?: number;\n\n /**\n * Duration to cache used transaction hashes (in milliseconds)\n */\n usedTxCacheDuration?: number;\n}\n\n/**\n * Aptos Exact-Direct Facilitator\n *\n * Implements the facilitator-side verification and settlement.\n * For exact-direct, settlement is a no-op since client already executed.\n */\nexport class ExactDirectAptosFacilitator implements SchemeNetworkFacilitator {\n readonly scheme = SCHEME_EXACT_DIRECT;\n readonly caipFamily = `${APTOS_CAIP2_NAMESPACE}:*`;\n\n private readonly config: Required<ExactDirectAptosFacilitatorConfig>;\n private usedTxs: Map<string, number> = new Map();\n\n constructor(\n private readonly signer: FacilitatorAptosSigner,\n config?: ExactDirectAptosFacilitatorConfig,\n ) {\n this.config = {\n maxTransactionAge: config?.maxTransactionAge ?? 3600,\n usedTxCacheDuration: config?.usedTxCacheDuration ?? 24 * 60 * 60 * 1000, // 24 hours\n };\n\n // Start cleanup interval\n this.startCleanupInterval();\n }\n\n /**\n * Get extra data for a supported kind\n */\n getExtra(network: Network): Record<string, unknown> | undefined {\n const token = getDefaultToken(network);\n if (!token) {\n return undefined;\n }\n return {\n assetSymbol: token.symbol,\n assetDecimals: token.decimals,\n };\n }\n\n /**\n * Get facilitator signer addresses for a network\n */\n getSigners(network: Network): string[] {\n return this.signer.getAddresses(network);\n }\n\n /**\n * Verify a payment payload\n */\n async verify(\n payload: PaymentPayload,\n requirements: PaymentRequirements,\n ): Promise<VerifyResponse> {\n // Validate scheme\n if (payload.accepted.scheme !== SCHEME_EXACT_DIRECT) {\n return {\n isValid: false,\n invalidReason: \"invalid_scheme\",\n };\n }\n\n // Validate network\n if (!isAptosNetwork(payload.accepted.network)) {\n return {\n isValid: false,\n invalidReason: \"invalid_network\",\n };\n }\n\n // Extract Aptos-specific payload\n const aptosPayload = payload.payload as ExactDirectAptosPayload;\n\n // Validate transaction hash format\n if (!isValidTxHash(aptosPayload.txHash)) {\n return {\n isValid: false,\n invalidReason: \"invalid_tx_hash_format\",\n };\n }\n\n // Check for replay attack\n if (this.isTxUsed(aptosPayload.txHash)) {\n return {\n isValid: false,\n invalidReason: \"transaction_already_used\",\n payer: aptosPayload.from,\n };\n }\n\n try {\n // Query transaction\n const tx = await this.signer.queryTransaction(aptosPayload.txHash);\n if (!tx) {\n return {\n isValid: false,\n invalidReason: \"transaction_not_found\",\n payer: aptosPayload.from,\n };\n }\n\n // Verify transaction was successful\n if (!tx.success) {\n return {\n isValid: false,\n invalidReason: `transaction_failed: ${tx.vmStatus}`,\n payer: aptosPayload.from,\n };\n }\n\n // Check transaction age\n if (this.config.maxTransactionAge > 0) {\n const txTimestamp = parseInt(tx.timestamp, 10) / 1000000; // Convert from microseconds\n const now = Date.now() / 1000;\n const age = now - txTimestamp;\n if (age > this.config.maxTransactionAge) {\n return {\n isValid: false,\n invalidReason: `transaction_too_old: ${Math.round(age)} seconds`,\n payer: aptosPayload.from,\n };\n }\n }\n\n // Extract transfer details from transaction\n const transferDetails = extractTransferDetails(tx);\n if (!transferDetails) {\n return {\n isValid: false,\n invalidReason: \"could_not_extract_transfer_details\",\n payer: aptosPayload.from,\n };\n }\n\n // Parse expected asset\n const expectedAsset = parseAssetIdentifier(requirements.asset);\n if (!expectedAsset) {\n return {\n isValid: false,\n invalidReason: `invalid_asset_in_requirements: ${requirements.asset}`,\n payer: aptosPayload.from,\n };\n }\n\n // Verify recipient\n if (!compareAddresses(transferDetails.to, requirements.payTo)) {\n return {\n isValid: false,\n invalidReason: `recipient_mismatch: expected ${requirements.payTo}, got ${transferDetails.to}`,\n payer: aptosPayload.from,\n };\n }\n\n // Verify metadata address (token)\n if (\n !compareAddresses(\n transferDetails.metadataAddress,\n expectedAsset.metadataAddress,\n )\n ) {\n return {\n isValid: false,\n invalidReason: `token_mismatch: expected ${expectedAsset.metadataAddress}, got ${transferDetails.metadataAddress}`,\n payer: aptosPayload.from,\n };\n }\n\n // Verify amount\n const expectedAmount = BigInt(requirements.amount);\n if (transferDetails.amount < expectedAmount) {\n return {\n isValid: false,\n invalidReason: `insufficient_amount: expected ${expectedAmount}, got ${transferDetails.amount}`,\n payer: aptosPayload.from,\n };\n }\n\n // Mark transaction as used\n this.markTxUsed(aptosPayload.txHash);\n\n return {\n isValid: true,\n payer: transferDetails.from,\n };\n } catch (error) {\n return {\n isValid: false,\n invalidReason: `verification_error: ${error instanceof Error ? error.message : String(error)}`,\n payer: aptosPayload.from,\n };\n }\n }\n\n /**\n * Settle a payment (no-op for exact-direct since client already executed)\n */\n async settle(\n payload: PaymentPayload,\n requirements: PaymentRequirements,\n ): Promise<SettleResponse> {\n // Verify first\n const verifyResult = await this.verify(payload, requirements);\n\n if (!verifyResult.isValid) {\n return {\n success: false,\n errorReason: verifyResult.invalidReason || \"verification_failed\",\n payer: verifyResult.payer,\n transaction: \"\",\n network: requirements.network,\n };\n }\n\n const aptosPayload = payload.payload as ExactDirectAptosPayload;\n\n // For exact-direct, settlement is already complete\n return {\n success: true,\n transaction: aptosPayload.txHash,\n network: requirements.network,\n payer: aptosPayload.from,\n };\n }\n\n /**\n * Check if a transaction has been used\n */\n private isTxUsed(txHash: string): boolean {\n return this.usedTxs.has(txHash.toLowerCase());\n }\n\n /**\n * Mark a transaction as used\n */\n private markTxUsed(txHash: string): void {\n this.usedTxs.set(txHash.toLowerCase(), Date.now());\n }\n\n /**\n * Start the cleanup interval for used transactions\n */\n private startCleanupInterval(): void {\n setInterval(\n () => {\n const cutoff = Date.now() - this.config.usedTxCacheDuration;\n for (const [txHash, usedAt] of this.usedTxs.entries()) {\n if (usedAt < cutoff) {\n this.usedTxs.delete(txHash);\n }\n }\n },\n 60 * 60 * 1000,\n ); // Cleanup every hour\n }\n}\n\nexport default ExactDirectAptosFacilitator;\n","/**\n * Registration function for Aptos Exact-Direct facilitator\n */\n\nimport { t402Facilitator } from \"@t402/core/facilitator\";\nimport type { Network } from \"@t402/core/types\";\nimport type { FacilitatorAptosSigner } from \"../../types.js\";\nimport {\n ExactDirectAptosFacilitator,\n type ExactDirectAptosFacilitatorConfig,\n} from \"./scheme.js\";\n\n/**\n * Configuration options for registering Aptos schemes to a t402Facilitator\n */\nexport interface AptosFacilitatorConfig {\n /**\n * The Aptos signer for facilitator operations (verify and settle)\n */\n signer: FacilitatorAptosSigner;\n\n /**\n * Optional specific networks to register\n * If not provided, registers wildcard support (aptos:*)\n */\n networks?: Network[];\n\n /**\n * Optional scheme configuration\n */\n schemeConfig?: ExactDirectAptosFacilitatorConfig;\n}\n\n/**\n * Registers Aptos exact-direct payment schemes to a t402Facilitator instance.\n *\n * @param facilitator - The t402Facilitator instance to register schemes to\n * @param config - Configuration for Aptos facilitator registration\n * @returns The facilitator instance for chaining\n *\n * @example\n * ```typescript\n * import { registerExactDirectAptosFacilitator } from \"@t402/aptos/exact-direct/facilitator\";\n * import { t402Facilitator } from \"@t402/core/facilitator\";\n *\n * const facilitator = new t402Facilitator();\n * registerExactDirectAptosFacilitator(facilitator, {\n * signer: myAptosSigner,\n * networks: [\"aptos:1\"]\n * });\n * ```\n */\nexport function registerExactDirectAptosFacilitator(\n facilitator: t402Facilitator,\n config: AptosFacilitatorConfig,\n): t402Facilitator {\n const scheme = new ExactDirectAptosFacilitator(\n config.signer,\n config.schemeConfig,\n );\n\n // Register scheme\n if (config.networks && config.networks.length > 0) {\n // Register specific networks\n config.networks.forEach((network) => {\n facilitator.register(network, scheme);\n });\n } else {\n // Register wildcard for all Aptos networks\n facilitator.register(\"aptos:*\", scheme);\n }\n\n return facilitator;\n}\n"],"mappings":"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","names":[]}
@@ -3,6 +3,7 @@ var __defProp = Object.defineProperty;
3
3
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
4
  var __getOwnPropNames = Object.getOwnPropertyNames;
5
5
  var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
6
7
  var __export = (target, all) => {
7
8
  for (var name in all)
8
9
  __defProp(target, name, { get: all[name], enumerable: true });
@@ -16,6 +17,7 @@ var __copyProps = (to, from, except, desc) => {
16
17
  return to;
17
18
  };
18
19
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
20
+ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
19
21
 
20
22
  // src/exact-direct/server/index.ts
21
23
  var server_exports = {};
@@ -88,10 +90,10 @@ function parseAmount(amount, decimals) {
88
90
 
89
91
  // src/exact-direct/server/scheme.ts
90
92
  var ExactDirectAptosServer = class {
91
- scheme = SCHEME_EXACT_DIRECT;
92
- moneyParsers = [];
93
- config;
94
93
  constructor(config = {}) {
94
+ __publicField(this, "scheme", SCHEME_EXACT_DIRECT);
95
+ __publicField(this, "moneyParsers", []);
96
+ __publicField(this, "config");
95
97
  this.config = config;
96
98
  }
97
99
  /**
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/exact-direct/server/index.ts","../../../../src/constants.ts","../../../../src/tokens.ts","../../../../src/utils.ts","../../../../src/exact-direct/server/scheme.ts","../../../../src/exact-direct/server/register.ts"],"sourcesContent":["/**\n * Aptos Exact-Direct Server Exports\n */\n\nexport {\n ExactDirectAptosServer,\n type ExactDirectAptosServerConfig,\n} from \"./scheme.js\";\nexport {\n registerExactDirectAptosServer,\n type AptosServerConfig,\n} from \"./register.js\";\n","/**\n * Aptos Network Constants\n */\n\n// CAIP-2 namespace for Aptos\nexport const APTOS_CAIP2_NAMESPACE = \"aptos\";\n\n// Standard Aptos network identifiers (CAIP-2 format)\nexport const APTOS_MAINNET_CAIP2 = \"aptos:1\";\nexport const APTOS_TESTNET_CAIP2 = \"aptos:2\";\nexport const APTOS_DEVNET_CAIP2 = \"aptos:149\";\n\n// All supported Aptos networks\nexport const APTOS_NETWORKS = [\n APTOS_MAINNET_CAIP2,\n APTOS_TESTNET_CAIP2,\n APTOS_DEVNET_CAIP2,\n] as const;\n\nexport type AptosNetwork = (typeof APTOS_NETWORKS)[number];\n\n// Chain IDs\nexport const APTOS_MAINNET_CHAIN_ID = 1;\nexport const APTOS_TESTNET_CHAIN_ID = 2;\nexport const APTOS_DEVNET_CHAIN_ID = 149;\n\n// RPC endpoints\nexport const DEFAULT_MAINNET_RPC = \"https://fullnode.mainnet.aptoslabs.com/v1\";\nexport const DEFAULT_TESTNET_RPC = \"https://fullnode.testnet.aptoslabs.com/v1\";\nexport const DEFAULT_DEVNET_RPC = \"https://fullnode.devnet.aptoslabs.com/v1\";\n\n// Scheme identifier\nexport const SCHEME_EXACT_DIRECT = \"exact-direct\";\n\n// Fungible Asset module addresses\nexport const PRIMARY_FUNGIBLE_STORE_MODULE = \"0x1::primary_fungible_store\";\nexport const FUNGIBLE_ASSET_MODULE = \"0x1::fungible_asset\";\nexport const APTOS_ACCOUNT_MODULE = \"0x1::aptos_account\";\n\n// Transfer function\nexport const FA_TRANSFER_FUNCTION = `${PRIMARY_FUNGIBLE_STORE_MODULE}::transfer`;\n\n// Default gas configuration\nexport const DEFAULT_MAX_GAS_AMOUNT = 100000n;\nexport const DEFAULT_GAS_UNIT_PRICE = 100n;\n\n// Transaction expiration (in seconds)\nexport const DEFAULT_TX_EXPIRATION_SECONDS = 600; // 10 minutes\n","/**\n * Aptos Token Registry\n *\n * Token addresses for supported stablecoins on Aptos networks.\n * All tokens use the Fungible Asset (FA) standard.\n */\n\nimport {\n APTOS_MAINNET_CAIP2,\n APTOS_TESTNET_CAIP2,\n APTOS_DEVNET_CAIP2,\n} from \"./constants.js\";\n\n/**\n * Token configuration for Aptos fungible assets\n */\nexport interface TokenConfig {\n /** Fungible Asset metadata address */\n metadataAddress: string;\n /** Token symbol (e.g., \"USDT\", \"USDC\") */\n symbol: string;\n /** Token name */\n name: string;\n /** Decimal places */\n decimals: number;\n}\n\n/**\n * Token registry mapping network -> tokens\n */\nexport const TOKEN_REGISTRY: Record<string, TokenConfig[]> = {\n [APTOS_MAINNET_CAIP2]: [\n {\n metadataAddress:\n \"0xf73e887a8754f540ee6e1a93bdc6dde2af69fc7ca5de32013e89dd44244473cb\",\n symbol: \"USDT\",\n name: \"Tether USD\",\n decimals: 6,\n },\n {\n metadataAddress:\n \"0xbae207659db88bea0cbead6da0ed00aac12edcdda169e591cd41c94180b46f3b\",\n symbol: \"USDC\",\n name: \"USD Coin\",\n decimals: 6,\n },\n ],\n [APTOS_TESTNET_CAIP2]: [\n {\n // Testnet USDT (may differ from mainnet)\n metadataAddress:\n \"0xf73e887a8754f540ee6e1a93bdc6dde2af69fc7ca5de32013e89dd44244473cb\",\n symbol: \"USDT\",\n name: \"Tether USD\",\n decimals: 6,\n },\n ],\n [APTOS_DEVNET_CAIP2]: [],\n};\n\n/**\n * Get token configuration for a specific network and symbol\n */\nexport function getTokenConfig(\n network: string,\n symbol: string,\n): TokenConfig | undefined {\n const tokens = TOKEN_REGISTRY[network];\n if (!tokens) return undefined;\n return tokens.find(\n (t) => t.symbol.toUpperCase() === symbol.toUpperCase(),\n );\n}\n\n/**\n * Get all supported tokens for a network\n */\nexport function getSupportedTokens(network: string): TokenConfig[] {\n return TOKEN_REGISTRY[network] || [];\n}\n\n/**\n * Check if a token is supported on a network\n */\nexport function isTokenSupported(network: string, symbol: string): boolean {\n return getTokenConfig(network, symbol) !== undefined;\n}\n\n/**\n * Get token by metadata address\n */\nexport function getTokenByAddress(\n network: string,\n metadataAddress: string,\n): TokenConfig | undefined {\n const tokens = TOKEN_REGISTRY[network];\n if (!tokens) return undefined;\n const normalizedAddress = metadataAddress.toLowerCase();\n return tokens.find(\n (t) => t.metadataAddress.toLowerCase() === normalizedAddress,\n );\n}\n\n/**\n * Default token symbol for payments (USDT)\n */\nexport const DEFAULT_TOKEN_SYMBOL = \"USDT\";\n\n/**\n * Get the default token for a network\n */\nexport function getDefaultToken(network: string): TokenConfig | undefined {\n return getTokenConfig(network, DEFAULT_TOKEN_SYMBOL);\n}\n","/**\n * Aptos Utility Functions\n */\n\nimport type { Network } from \"@t402/core/types\";\nimport {\n APTOS_CAIP2_NAMESPACE,\n APTOS_MAINNET_CAIP2,\n APTOS_TESTNET_CAIP2,\n APTOS_DEVNET_CAIP2,\n DEFAULT_MAINNET_RPC,\n DEFAULT_TESTNET_RPC,\n DEFAULT_DEVNET_RPC,\n FA_TRANSFER_FUNCTION,\n} from \"./constants.js\";\nimport type {\n AptosTransactionResult,\n AptosTransactionEvent,\n ParsedFATransfer,\n} from \"./types.js\";\n\n/**\n * Validate Aptos address format\n * Aptos addresses are 64 hex characters (32 bytes) with 0x prefix\n */\nexport function isValidAptosAddress(address: string): boolean {\n if (!address) return false;\n // Must start with 0x\n if (!address.startsWith(\"0x\")) return false;\n // Remove 0x prefix and check hex\n const hex = address.slice(2);\n // Aptos addresses can be 1-64 hex chars (leading zeros may be omitted)\n if (hex.length === 0 || hex.length > 64) return false;\n return /^[0-9a-fA-F]+$/.test(hex);\n}\n\n/**\n * Normalize Aptos address to full 64-character format\n */\nexport function normalizeAptosAddress(address: string): string {\n if (!address.startsWith(\"0x\")) {\n throw new Error(\"Aptos address must start with 0x\");\n }\n const hex = address.slice(2).toLowerCase();\n // Pad to 64 characters\n return \"0x\" + hex.padStart(64, \"0\");\n}\n\n/**\n * Compare two Aptos addresses (case-insensitive, handles short addresses)\n */\nexport function compareAddresses(addr1: string, addr2: string): boolean {\n try {\n return normalizeAptosAddress(addr1) === normalizeAptosAddress(addr2);\n } catch {\n return false;\n }\n}\n\n/**\n * Validate transaction hash format\n */\nexport function isValidTxHash(txHash: string): boolean {\n if (!txHash) return false;\n if (!txHash.startsWith(\"0x\")) return false;\n const hex = txHash.slice(2);\n // Transaction hash is 64 hex characters (32 bytes)\n if (hex.length !== 64) return false;\n return /^[0-9a-fA-F]+$/.test(hex);\n}\n\n/**\n * Get default RPC URL for a network\n */\nexport function getDefaultRpcUrl(network: Network): string {\n switch (network) {\n case APTOS_MAINNET_CAIP2:\n return DEFAULT_MAINNET_RPC;\n case APTOS_TESTNET_CAIP2:\n return DEFAULT_TESTNET_RPC;\n case APTOS_DEVNET_CAIP2:\n return DEFAULT_DEVNET_RPC;\n default:\n throw new Error(`Unknown Aptos network: ${network}`);\n }\n}\n\n/**\n * Check if a network identifier is for Aptos\n */\nexport function isAptosNetwork(network: Network): boolean {\n return network.startsWith(`${APTOS_CAIP2_NAMESPACE}:`);\n}\n\n/**\n * Parse CAIP-19 asset identifier for Aptos\n * Format: aptos:1/fa:0x...\n */\nexport function parseAssetIdentifier(asset: string): {\n network: Network;\n metadataAddress: string;\n} | null {\n const parts = asset.split(\"/\");\n if (parts.length !== 2) return null;\n\n const network = parts[0] as Network;\n if (!isAptosNetwork(network)) return null;\n\n const [assetType, address] = parts[1].split(\":\");\n if (assetType !== \"fa\" || !address) return null;\n\n if (!isValidAptosAddress(address)) return null;\n\n return { network, metadataAddress: address };\n}\n\n/**\n * Create CAIP-19 asset identifier for Aptos FA\n */\nexport function createAssetIdentifier(\n network: Network,\n metadataAddress: string,\n): string {\n return `${network}/fa:${metadataAddress}`;\n}\n\n/**\n * Parse fungible asset transfer from transaction events\n */\nexport function parseFATransferFromEvents(\n events: AptosTransactionEvent[],\n): ParsedFATransfer | null {\n // Look for Withdraw and Deposit events\n const withdrawEvent = events.find(\n (e) =>\n e.type === \"0x1::fungible_asset::Withdraw\" ||\n e.type.includes(\"::fungible_asset::Withdraw\"),\n );\n const depositEvent = events.find(\n (e) =>\n e.type === \"0x1::fungible_asset::Deposit\" ||\n e.type.includes(\"::fungible_asset::Deposit\"),\n );\n\n if (!withdrawEvent || !depositEvent) {\n return null;\n }\n\n // Extract data from events\n const withdrawData = withdrawEvent.data as {\n store?: string;\n amount?: string;\n };\n const depositData = depositEvent.data as {\n store?: string;\n amount?: string;\n };\n\n if (!withdrawData.amount || !depositData.store) {\n return null;\n }\n\n // The from address is the account that owns the withdraw store\n // The to address is the account that owns the deposit store\n // For simplicity, we'll extract from the event guid\n const from = withdrawEvent.guid.accountAddress;\n const to = depositEvent.guid.accountAddress;\n const amount = BigInt(withdrawData.amount);\n\n // Metadata address would need to be extracted from state changes\n // For now, return with empty metadata (to be filled by caller)\n return {\n from,\n to,\n amount,\n metadataAddress: \"\", // Will be filled from transaction details\n };\n}\n\n/**\n * Check if transaction is a FA transfer\n */\nexport function isFATransferTransaction(tx: AptosTransactionResult): boolean {\n if (!tx.payload) return false;\n if (tx.payload.type !== \"entry_function_payload\") return false;\n return (\n tx.payload.function === FA_TRANSFER_FUNCTION ||\n tx.payload.function?.includes(\"primary_fungible_store::transfer\") ||\n false\n );\n}\n\n/**\n * Extract transfer details from transaction\n */\nexport function extractTransferDetails(\n tx: AptosTransactionResult,\n): ParsedFATransfer | null {\n if (!tx.success) return null;\n if (!tx.payload || tx.payload.type !== \"entry_function_payload\") return null;\n\n const args = tx.payload.arguments;\n if (!args || args.length < 3) return null;\n\n // Arguments for primary_fungible_store::transfer:\n // [0] - metadata object address\n // [1] - recipient address\n // [2] - amount\n\n const metadataAddress = args[0] as string;\n const to = args[1] as string;\n const amount = BigInt(args[2] as string);\n\n return {\n from: tx.sender,\n to,\n amount,\n metadataAddress,\n };\n}\n\n/**\n * Format amount with decimals for display\n */\nexport function formatAmount(amount: bigint, decimals: number): string {\n const divisor = BigInt(10 ** decimals);\n const wholePart = amount / divisor;\n const fractionalPart = amount % divisor;\n const paddedFractional = fractionalPart.toString().padStart(decimals, \"0\");\n return `${wholePart}.${paddedFractional}`;\n}\n\n/**\n * Parse amount string to bigint\n */\nexport function parseAmount(amount: string, decimals: number): bigint {\n const [whole, fractional = \"\"] = amount.split(\".\");\n const paddedFractional = fractional.padEnd(decimals, \"0\").slice(0, decimals);\n return BigInt(whole + paddedFractional);\n}\n","/**\n * Aptos Exact-Direct Server Scheme\n *\n * Handles price parsing and payment requirement enhancement for\n * Aptos FA payments using the exact-direct scheme.\n */\n\nimport type {\n SchemeNetworkServer,\n PaymentRequirements,\n Price,\n AssetAmount,\n Network,\n MoneyParser,\n} from \"@t402/core/types\";\nimport { SCHEME_EXACT_DIRECT } from \"../../constants.js\";\nimport { getTokenConfig, getDefaultToken, TOKEN_REGISTRY } from \"../../tokens.js\";\nimport {\n isAptosNetwork,\n createAssetIdentifier,\n parseAmount,\n} from \"../../utils.js\";\n\n/**\n * Configuration for ExactDirectAptosServer\n */\nexport interface ExactDirectAptosServerConfig {\n /** Preferred token symbol (e.g., \"USDT\"). Defaults to network's default token. */\n preferredToken?: string;\n}\n\n/**\n * Aptos Exact-Direct Server\n *\n * Implements the server-side price parsing and payment requirements enhancement.\n */\nexport class ExactDirectAptosServer implements SchemeNetworkServer {\n readonly scheme = SCHEME_EXACT_DIRECT;\n private moneyParsers: MoneyParser[] = [];\n private config: ExactDirectAptosServerConfig;\n\n constructor(config: ExactDirectAptosServerConfig = {}) {\n this.config = config;\n }\n\n /**\n * Register a custom money parser in the parser chain.\n */\n registerMoneyParser(parser: MoneyParser): ExactDirectAptosServer {\n this.moneyParsers.push(parser);\n return this;\n }\n\n /**\n * Parse price into Aptos-specific amount\n */\n async parsePrice(price: Price, network: Network): Promise<AssetAmount> {\n // Validate network\n if (!isAptosNetwork(network)) {\n throw new Error(`Invalid Aptos network: ${network}`);\n }\n\n // If already an AssetAmount, return it directly\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 // Parse Money to decimal number\n const amount = this.parseMoneyToDecimal(price);\n\n // Try each custom money parser in order\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 // All custom parsers returned null, use default conversion\n return this.defaultMoneyConversion(amount, network);\n }\n\n /**\n * Enhance payment requirements with Aptos-specific details\n */\n async enhancePaymentRequirements(\n paymentRequirements: PaymentRequirements,\n supportedKind: {\n t402Version: number;\n scheme: string;\n network: Network;\n extra?: Record<string, unknown>;\n },\n facilitatorExtensions: string[],\n ): Promise<PaymentRequirements> {\n // Mark unused parameters\n void facilitatorExtensions;\n\n // Start with existing extra fields\n const extra = { ...paymentRequirements.extra };\n\n // Add any facilitator-provided extra fields\n if (supportedKind.extra?.assetSymbol) {\n extra.assetSymbol = supportedKind.extra.assetSymbol;\n }\n if (supportedKind.extra?.assetDecimals) {\n extra.assetDecimals = supportedKind.extra.assetDecimals;\n }\n\n return {\n ...paymentRequirements,\n extra,\n };\n }\n\n /**\n * Parse Money (string | number) to a decimal number.\n */\n private parseMoneyToDecimal(money: string | number): number {\n if (typeof money === \"number\") {\n return money;\n }\n\n // Remove $ sign and whitespace, then parse\n const cleanMoney = money.replace(/^\\$/, \"\").trim();\n const amount = parseFloat(cleanMoney);\n\n if (isNaN(amount)) {\n throw new Error(`Invalid money format: ${money}`);\n }\n\n return amount;\n }\n\n /**\n * Default money conversion implementation.\n */\n private defaultMoneyConversion(amount: number, network: Network): AssetAmount {\n const token = this.getDefaultAsset(network);\n\n // Convert decimal amount to token amount\n const tokenAmount = parseAmount(amount.toString(), token.decimals);\n\n return {\n amount: tokenAmount.toString(),\n asset: createAssetIdentifier(network, token.metadataAddress),\n extra: {\n symbol: token.symbol,\n name: token.name,\n decimals: token.decimals,\n },\n };\n }\n\n /**\n * Get the default asset info for a network.\n */\n private getDefaultAsset(\n network: Network,\n ): { metadataAddress: string; symbol: string; name: string; decimals: number } {\n // If a preferred token is configured, try to use it\n if (this.config.preferredToken) {\n const preferred = getTokenConfig(network, this.config.preferredToken);\n if (preferred) return preferred;\n }\n\n // Use the network's default token\n const defaultToken = getDefaultToken(network);\n if (defaultToken) return defaultToken;\n\n throw new Error(`No tokens configured for network ${network}`);\n }\n\n /**\n * Get all supported networks\n */\n static getSupportedNetworks(): string[] {\n return Object.keys(TOKEN_REGISTRY);\n }\n\n /**\n * Check if a network is supported\n */\n static isNetworkSupported(network: string): boolean {\n return network in TOKEN_REGISTRY;\n }\n}\n\nexport default ExactDirectAptosServer;\n","/**\n * Registration function for Aptos Exact-Direct server\n */\n\nimport { t402ResourceServer } from \"@t402/core/server\";\nimport type { Network } from \"@t402/core/types\";\nimport {\n ExactDirectAptosServer,\n type ExactDirectAptosServerConfig,\n} from \"./scheme.js\";\n\n/**\n * Configuration options for registering Aptos schemes to a t402ResourceServer\n */\nexport interface AptosServerConfig {\n /**\n * Optional specific networks to register\n * If not provided, registers wildcard support (aptos:*)\n */\n networks?: Network[];\n\n /**\n * Optional scheme configuration\n */\n schemeConfig?: ExactDirectAptosServerConfig;\n}\n\n/**\n * Registers Aptos exact-direct payment schemes to a t402ResourceServer instance.\n *\n * @param server - The t402ResourceServer instance to register schemes to\n * @param config - Configuration for Aptos server registration\n * @returns The server instance for chaining\n *\n * @example\n * ```typescript\n * import { registerExactDirectAptosServer } from \"@t402/aptos/exact-direct/server\";\n * import { t402ResourceServer } from \"@t402/core/server\";\n *\n * const server = new t402ResourceServer();\n * registerExactDirectAptosServer(server, {\n * networks: [\"aptos:1\"],\n * schemeConfig: { preferredToken: \"USDT\" }\n * });\n * ```\n */\nexport function registerExactDirectAptosServer(\n server: t402ResourceServer,\n config: AptosServerConfig = {},\n): t402ResourceServer {\n const scheme = new ExactDirectAptosServer(config.schemeConfig);\n\n // Register scheme\n if (config.networks && config.networks.length > 0) {\n // Register specific networks\n config.networks.forEach((network) => {\n server.register(network, scheme);\n });\n } else {\n // Register wildcard for all Aptos networks\n server.register(\"aptos:*\", scheme);\n }\n\n return server;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACKO,IAAM,wBAAwB;AAG9B,IAAM,sBAAsB;AAC5B,IAAM,sBAAsB;AAC5B,IAAM,qBAAqB;AAsB3B,IAAM,sBAAsB;AAG5B,IAAM,gCAAgC;AAKtC,IAAM,uBAAuB,GAAG,6BAA6B;;;ACV7D,IAAM,iBAAgD;AAAA,EAC3D,CAAC,mBAAmB,GAAG;AAAA,IACrB;AAAA,MACE,iBACE;AAAA,MACF,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,UAAU;AAAA,IACZ;AAAA,IACA;AAAA,MACE,iBACE;AAAA,MACF,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,UAAU;AAAA,IACZ;AAAA,EACF;AAAA,EACA,CAAC,mBAAmB,GAAG;AAAA,IACrB;AAAA;AAAA,MAEE,iBACE;AAAA,MACF,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,UAAU;AAAA,IACZ;AAAA,EACF;AAAA,EACA,CAAC,kBAAkB,GAAG,CAAC;AACzB;AAKO,SAAS,eACd,SACA,QACyB;AACzB,QAAM,SAAS,eAAe,OAAO;AACrC,MAAI,CAAC,OAAQ,QAAO;AACpB,SAAO,OAAO;AAAA,IACZ,CAAC,MAAM,EAAE,OAAO,YAAY,MAAM,OAAO,YAAY;AAAA,EACvD;AACF;AAkCO,IAAM,uBAAuB;AAK7B,SAAS,gBAAgB,SAA0C;AACxE,SAAO,eAAe,SAAS,oBAAoB;AACrD;;;ACvBO,SAAS,eAAe,SAA2B;AACxD,SAAO,QAAQ,WAAW,GAAG,qBAAqB,GAAG;AACvD;AA2BO,SAAS,sBACd,SACA,iBACQ;AACR,SAAO,GAAG,OAAO,OAAO,eAAe;AACzC;AA+GO,SAAS,YAAY,QAAgB,UAA0B;AACpE,QAAM,CAAC,OAAO,aAAa,EAAE,IAAI,OAAO,MAAM,GAAG;AACjD,QAAM,mBAAmB,WAAW,OAAO,UAAU,GAAG,EAAE,MAAM,GAAG,QAAQ;AAC3E,SAAO,OAAO,QAAQ,gBAAgB;AACxC;;;AC3MO,IAAM,yBAAN,MAA4D;AAAA,EAKjE,YAAY,SAAuC,CAAC,GAAG;AAJvD,wBAAS,UAAS;AAClB,wBAAQ,gBAA8B,CAAC;AACvC,wBAAQ;AAGN,SAAK,SAAS;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,oBAAoB,QAA6C;AAC/D,SAAK,aAAa,KAAK,MAAM;AAC7B,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAW,OAAc,SAAwC;AAErE,QAAI,CAAC,eAAe,OAAO,GAAG;AAC5B,YAAM,IAAI,MAAM,0BAA0B,OAAO,EAAE;AAAA,IACrD;AAGA,QAAI,OAAO,UAAU,YAAY,UAAU,QAAQ,YAAY,OAAO;AACpE,UAAI,CAAC,MAAM,OAAO;AAChB,cAAM,IAAI,MAAM,8DAA8D,OAAO,EAAE;AAAA,MACzF;AACA,aAAO;AAAA,QACL,QAAQ,MAAM;AAAA,QACd,OAAO,MAAM;AAAA,QACb,OAAO,MAAM,SAAS,CAAC;AAAA,MACzB;AAAA,IACF;AAGA,UAAM,SAAS,KAAK,oBAAoB,KAAK;AAG7C,eAAW,UAAU,KAAK,cAAc;AACtC,YAAM,SAAS,MAAM,OAAO,QAAQ,OAAO;AAC3C,UAAI,WAAW,MAAM;AACnB,eAAO;AAAA,MACT;AAAA,IACF;AAGA,WAAO,KAAK,uBAAuB,QAAQ,OAAO;AAAA,EACpD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,2BACJ,qBACA,eAMA,uBAC8B;AAE9B,SAAK;AAGL,UAAM,QAAQ,EAAE,GAAG,oBAAoB,MAAM;AAG7C,QAAI,cAAc,OAAO,aAAa;AACpC,YAAM,cAAc,cAAc,MAAM;AAAA,IAC1C;AACA,QAAI,cAAc,OAAO,eAAe;AACtC,YAAM,gBAAgB,cAAc,MAAM;AAAA,IAC5C;AAEA,WAAO;AAAA,MACL,GAAG;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,oBAAoB,OAAgC;AAC1D,QAAI,OAAO,UAAU,UAAU;AAC7B,aAAO;AAAA,IACT;AAGA,UAAM,aAAa,MAAM,QAAQ,OAAO,EAAE,EAAE,KAAK;AACjD,UAAM,SAAS,WAAW,UAAU;AAEpC,QAAI,MAAM,MAAM,GAAG;AACjB,YAAM,IAAI,MAAM,yBAAyB,KAAK,EAAE;AAAA,IAClD;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,uBAAuB,QAAgB,SAA+B;AAC5E,UAAM,QAAQ,KAAK,gBAAgB,OAAO;AAG1C,UAAM,cAAc,YAAY,OAAO,SAAS,GAAG,MAAM,QAAQ;AAEjE,WAAO;AAAA,MACL,QAAQ,YAAY,SAAS;AAAA,MAC7B,OAAO,sBAAsB,SAAS,MAAM,eAAe;AAAA,MAC3D,OAAO;AAAA,QACL,QAAQ,MAAM;AAAA,QACd,MAAM,MAAM;AAAA,QACZ,UAAU,MAAM;AAAA,MAClB;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,gBACN,SAC6E;AAE7E,QAAI,KAAK,OAAO,gBAAgB;AAC9B,YAAM,YAAY,eAAe,SAAS,KAAK,OAAO,cAAc;AACpE,UAAI,UAAW,QAAO;AAAA,IACxB;AAGA,UAAM,eAAe,gBAAgB,OAAO;AAC5C,QAAI,aAAc,QAAO;AAEzB,UAAM,IAAI,MAAM,oCAAoC,OAAO,EAAE;AAAA,EAC/D;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,uBAAiC;AACtC,WAAO,OAAO,KAAK,cAAc;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,mBAAmB,SAA0B;AAClD,WAAO,WAAW;AAAA,EACpB;AACF;;;ACnJO,SAAS,+BACd,QACA,SAA4B,CAAC,GACT;AACpB,QAAM,SAAS,IAAI,uBAAuB,OAAO,YAAY;AAG7D,MAAI,OAAO,YAAY,OAAO,SAAS,SAAS,GAAG;AAEjD,WAAO,SAAS,QAAQ,CAAC,YAAY;AACnC,aAAO,SAAS,SAAS,MAAM;AAAA,IACjC,CAAC;AAAA,EACH,OAAO;AAEL,WAAO,SAAS,WAAW,MAAM;AAAA,EACnC;AAEA,SAAO;AACT;","names":[]}
@@ -1,5 +1,5 @@
1
- import { A as AptosTransactionEvent, P as ParsedFATransfer, a as AptosTransactionResult } from './types-kOweBf4U.js';
2
- export { c as AptosStateChange, b as AptosTransactionPayload, C as ClientAptosSigner, E as ExactDirectAptosPayload, F as FacilitatorAptosSigner, e as extractChainId } from './types-kOweBf4U.js';
1
+ import { A as AptosTransactionResult, P as ParsedFATransfer, a as AptosTransactionEvent } from './types-DYWWDudq.js';
2
+ export { b as AptosStateChange, c as AptosTransactionPayload, C as ClientAptosSigner, E as ExactDirectAptosPayload, F as FacilitatorAptosSigner, e as extractChainId } from './types-DYWWDudq.js';
3
3
  import { Network } from '@t402/core/types';
4
4
  export { AptosClientConfig, ExactDirectAptosClient, ExactDirectAptosClientConfig, registerExactDirectAptosClient } from './exact-direct/client/index.js';
5
5
  export { AptosServerConfig, ExactDirectAptosServer, ExactDirectAptosServerConfig, registerExactDirectAptosServer } from './exact-direct/server/index.js';
@@ -3,6 +3,7 @@ var __defProp = Object.defineProperty;
3
3
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
4
  var __getOwnPropNames = Object.getOwnPropertyNames;
5
5
  var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
6
7
  var __export = (target, all) => {
7
8
  for (var name in all)
8
9
  __defProp(target, name, { get: all[name], enumerable: true });
@@ -16,6 +17,7 @@ var __copyProps = (to, from, except, desc) => {
16
17
  return to;
17
18
  };
18
19
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
20
+ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
19
21
 
20
22
  // src/index.ts
21
23
  var src_exports = {};
@@ -280,9 +282,9 @@ function parseAmount(amount, decimals) {
280
282
  var ExactDirectAptosClient = class {
281
283
  constructor(signer, config = {}) {
282
284
  this.signer = signer;
285
+ __publicField(this, "scheme", SCHEME_EXACT_DIRECT);
283
286
  void config;
284
287
  }
285
- scheme = SCHEME_EXACT_DIRECT;
286
288
  /**
287
289
  * Create a payment payload by executing the transfer
288
290
  */
@@ -369,10 +371,10 @@ function registerExactDirectAptosClient(client, config) {
369
371
 
370
372
  // src/exact-direct/server/scheme.ts
371
373
  var ExactDirectAptosServer = class {
372
- scheme = SCHEME_EXACT_DIRECT;
373
- moneyParsers = [];
374
- config;
375
374
  constructor(config = {}) {
375
+ __publicField(this, "scheme", SCHEME_EXACT_DIRECT);
376
+ __publicField(this, "moneyParsers", []);
377
+ __publicField(this, "config");
376
378
  this.config = config;
377
379
  }
378
380
  /**
@@ -498,6 +500,10 @@ function registerExactDirectAptosServer(server, config = {}) {
498
500
  var ExactDirectAptosFacilitator = class {
499
501
  constructor(signer, config) {
500
502
  this.signer = signer;
503
+ __publicField(this, "scheme", SCHEME_EXACT_DIRECT);
504
+ __publicField(this, "caipFamily", `${APTOS_CAIP2_NAMESPACE}:*`);
505
+ __publicField(this, "config");
506
+ __publicField(this, "usedTxs", /* @__PURE__ */ new Map());
501
507
  this.config = {
502
508
  maxTransactionAge: config?.maxTransactionAge ?? 3600,
503
509
  usedTxCacheDuration: config?.usedTxCacheDuration ?? 24 * 60 * 60 * 1e3
@@ -505,10 +511,6 @@ var ExactDirectAptosFacilitator = class {
505
511
  };
506
512
  this.startCleanupInterval();
507
513
  }
508
- scheme = SCHEME_EXACT_DIRECT;
509
- caipFamily = `${APTOS_CAIP2_NAMESPACE}:*`;
510
- config;
511
- usedTxs = /* @__PURE__ */ new Map();
512
514
  /**
513
515
  * Get extra data for a supported kind
514
516
  */
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/index.ts","../../src/constants.ts","../../src/types.ts","../../src/tokens.ts","../../src/utils.ts","../../src/exact-direct/client/scheme.ts","../../src/exact-direct/client/register.ts","../../src/exact-direct/server/scheme.ts","../../src/exact-direct/server/register.ts","../../src/exact-direct/facilitator/scheme.ts","../../src/exact-direct/facilitator/register.ts"],"sourcesContent":["/**\n * @t402/aptos - Aptos (Move) mechanism for T402 payment protocol\n *\n * This package provides support for Aptos blockchain payments using\n * the Fungible Asset (FA) standard.\n *\n * @example\n * ```typescript\n * // Client usage\n * import { registerExactDirectAptosClient } from \"@t402/aptos/exact-direct/client\";\n * import { t402Client } from \"@t402/core/client\";\n *\n * const client = new t402Client();\n * registerExactDirectAptosClient(client, {\n * signer: myAptosSigner,\n * networks: \"aptos:1\"\n * });\n *\n * // Server usage\n * import { registerExactDirectAptosServer } from \"@t402/aptos/exact-direct/server\";\n * import { t402ResourceServer } from \"@t402/core/server\";\n *\n * const server = new t402ResourceServer();\n * registerExactDirectAptosServer(server, {\n * networks: \"aptos:1\",\n * schemeConfig: { defaultPayTo: \"0x...\" }\n * });\n *\n * // Facilitator usage\n * import { registerExactDirectAptosFacilitator } from \"@t402/aptos/exact-direct/facilitator\";\n * import { t402Facilitator } from \"@t402/core/facilitator\";\n *\n * const facilitator = new t402Facilitator();\n * registerExactDirectAptosFacilitator(facilitator, {\n * signer: myAptosSigner,\n * networks: \"aptos:1\"\n * });\n * ```\n *\n * @packageDocumentation\n */\n\n// Constants\nexport * from \"./constants.js\";\n\n// Types\nexport * from \"./types.js\";\n\n// Token registry\nexport * from \"./tokens.js\";\n\n// Utility functions\nexport * from \"./utils.js\";\n\n// Re-export scheme modules for convenience\nexport * from \"./exact-direct/client/index.js\";\nexport * from \"./exact-direct/server/index.js\";\nexport * from \"./exact-direct/facilitator/index.js\";\n","/**\n * Aptos Network Constants\n */\n\n// CAIP-2 namespace for Aptos\nexport const APTOS_CAIP2_NAMESPACE = \"aptos\";\n\n// Standard Aptos network identifiers (CAIP-2 format)\nexport const APTOS_MAINNET_CAIP2 = \"aptos:1\";\nexport const APTOS_TESTNET_CAIP2 = \"aptos:2\";\nexport const APTOS_DEVNET_CAIP2 = \"aptos:149\";\n\n// All supported Aptos networks\nexport const APTOS_NETWORKS = [\n APTOS_MAINNET_CAIP2,\n APTOS_TESTNET_CAIP2,\n APTOS_DEVNET_CAIP2,\n] as const;\n\nexport type AptosNetwork = (typeof APTOS_NETWORKS)[number];\n\n// Chain IDs\nexport const APTOS_MAINNET_CHAIN_ID = 1;\nexport const APTOS_TESTNET_CHAIN_ID = 2;\nexport const APTOS_DEVNET_CHAIN_ID = 149;\n\n// RPC endpoints\nexport const DEFAULT_MAINNET_RPC = \"https://fullnode.mainnet.aptoslabs.com/v1\";\nexport const DEFAULT_TESTNET_RPC = \"https://fullnode.testnet.aptoslabs.com/v1\";\nexport const DEFAULT_DEVNET_RPC = \"https://fullnode.devnet.aptoslabs.com/v1\";\n\n// Scheme identifier\nexport const SCHEME_EXACT_DIRECT = \"exact-direct\";\n\n// Fungible Asset module addresses\nexport const PRIMARY_FUNGIBLE_STORE_MODULE = \"0x1::primary_fungible_store\";\nexport const FUNGIBLE_ASSET_MODULE = \"0x1::fungible_asset\";\nexport const APTOS_ACCOUNT_MODULE = \"0x1::aptos_account\";\n\n// Transfer function\nexport const FA_TRANSFER_FUNCTION = `${PRIMARY_FUNGIBLE_STORE_MODULE}::transfer`;\n\n// Default gas configuration\nexport const DEFAULT_MAX_GAS_AMOUNT = 100000n;\nexport const DEFAULT_GAS_UNIT_PRICE = 100n;\n\n// Transaction expiration (in seconds)\nexport const DEFAULT_TX_EXPIRATION_SECONDS = 600; // 10 minutes\n","/**\n * Aptos Types for T402 Payment Protocol\n */\n\nimport type { Network } from \"@t402/core/types\";\n\n/**\n * Exact-direct payment payload for Aptos\n * Client executes the transfer and provides transaction hash as proof\n */\nexport type ExactDirectAptosPayload = {\n /** Transaction hash (hex string with 0x prefix) */\n txHash: string;\n /** Sender's Aptos address */\n from: string;\n /** Recipient's Aptos address */\n to: string;\n /** Amount transferred (in smallest unit) */\n amount: string;\n /** Fungible Asset metadata address */\n metadataAddress: string;\n /** Transaction version (for verification) */\n version?: string;\n};\n\n/**\n * Aptos signer interface for client operations\n */\nexport interface ClientAptosSigner {\n /**\n * Get the signer's Aptos address\n */\n getAddress(): Promise<string>;\n\n /**\n * Sign and submit a fungible asset transfer transaction\n * @param to Recipient address\n * @param metadataAddress FA metadata address\n * @param amount Amount to transfer\n * @returns Transaction hash\n */\n transfer(\n to: string,\n metadataAddress: string,\n amount: bigint,\n ): Promise<string>;\n\n /**\n * Get token balance for an address\n * @param metadataAddress FA metadata address\n * @returns Balance in smallest unit\n */\n getBalance(metadataAddress: string): Promise<bigint>;\n}\n\n/**\n * Aptos signer interface for facilitator operations\n */\nexport interface FacilitatorAptosSigner {\n /**\n * Get facilitator addresses for a network\n * @param network CAIP-2 network identifier\n */\n getAddresses(network: Network): string[];\n\n /**\n * Query transaction by hash\n * @param txHash Transaction hash\n * @returns Transaction details or null if not found\n */\n queryTransaction(txHash: string): Promise<AptosTransactionResult | null>;\n\n /**\n * Get token balance for an address\n * @param address Account address\n * @param metadataAddress FA metadata address\n * @returns Balance in smallest unit\n */\n getBalance(address: string, metadataAddress: string): Promise<bigint>;\n}\n\n/**\n * Aptos transaction result from RPC\n */\nexport interface AptosTransactionResult {\n /** Transaction hash */\n hash: string;\n /** Transaction version */\n version: string;\n /** Whether the transaction was successful */\n success: boolean;\n /** VM status */\n vmStatus: string;\n /** Sender address */\n sender: string;\n /** Sequence number */\n sequenceNumber: string;\n /** Gas used */\n gasUsed: string;\n /** Timestamp (microseconds) */\n timestamp: string;\n /** Transaction payload */\n payload?: AptosTransactionPayload;\n /** Events emitted by the transaction */\n events?: AptosTransactionEvent[];\n /** State changes */\n changes?: AptosStateChange[];\n}\n\n/**\n * Aptos transaction payload\n */\nexport interface AptosTransactionPayload {\n type: string;\n function?: string;\n typeArguments?: string[];\n arguments?: unknown[];\n}\n\n/**\n * Aptos transaction event\n */\nexport interface AptosTransactionEvent {\n guid: {\n creationNumber: string;\n accountAddress: string;\n };\n sequenceNumber: string;\n type: string;\n data: Record<string, unknown>;\n}\n\n/**\n * Aptos state change\n */\nexport interface AptosStateChange {\n type: string;\n address: string;\n stateKeyHash: string;\n data?: {\n type: string;\n data: Record<string, unknown>;\n };\n}\n\n/**\n * Parsed fungible asset transfer from events\n */\nexport interface ParsedFATransfer {\n /** Sender address */\n from: string;\n /** Recipient address */\n to: string;\n /** Amount transferred */\n amount: bigint;\n /** FA metadata address */\n metadataAddress: string;\n}\n\n/**\n * Extract Aptos chain ID from CAIP-2 network identifier\n */\nexport function extractChainId(network: Network): number {\n const parts = network.split(\":\");\n if (parts.length !== 2 || parts[0] !== \"aptos\") {\n throw new Error(`Invalid Aptos network identifier: ${network}`);\n }\n const chainId = parseInt(parts[1], 10);\n if (isNaN(chainId)) {\n throw new Error(`Invalid chain ID in network identifier: ${network}`);\n }\n return chainId;\n}\n\n","/**\n * Aptos Token Registry\n *\n * Token addresses for supported stablecoins on Aptos networks.\n * All tokens use the Fungible Asset (FA) standard.\n */\n\nimport {\n APTOS_MAINNET_CAIP2,\n APTOS_TESTNET_CAIP2,\n APTOS_DEVNET_CAIP2,\n} from \"./constants.js\";\n\n/**\n * Token configuration for Aptos fungible assets\n */\nexport interface TokenConfig {\n /** Fungible Asset metadata address */\n metadataAddress: string;\n /** Token symbol (e.g., \"USDT\", \"USDC\") */\n symbol: string;\n /** Token name */\n name: string;\n /** Decimal places */\n decimals: number;\n}\n\n/**\n * Token registry mapping network -> tokens\n */\nexport const TOKEN_REGISTRY: Record<string, TokenConfig[]> = {\n [APTOS_MAINNET_CAIP2]: [\n {\n metadataAddress:\n \"0xf73e887a8754f540ee6e1a93bdc6dde2af69fc7ca5de32013e89dd44244473cb\",\n symbol: \"USDT\",\n name: \"Tether USD\",\n decimals: 6,\n },\n {\n metadataAddress:\n \"0xbae207659db88bea0cbead6da0ed00aac12edcdda169e591cd41c94180b46f3b\",\n symbol: \"USDC\",\n name: \"USD Coin\",\n decimals: 6,\n },\n ],\n [APTOS_TESTNET_CAIP2]: [\n {\n // Testnet USDT (may differ from mainnet)\n metadataAddress:\n \"0xf73e887a8754f540ee6e1a93bdc6dde2af69fc7ca5de32013e89dd44244473cb\",\n symbol: \"USDT\",\n name: \"Tether USD\",\n decimals: 6,\n },\n ],\n [APTOS_DEVNET_CAIP2]: [],\n};\n\n/**\n * Get token configuration for a specific network and symbol\n */\nexport function getTokenConfig(\n network: string,\n symbol: string,\n): TokenConfig | undefined {\n const tokens = TOKEN_REGISTRY[network];\n if (!tokens) return undefined;\n return tokens.find(\n (t) => t.symbol.toUpperCase() === symbol.toUpperCase(),\n );\n}\n\n/**\n * Get all supported tokens for a network\n */\nexport function getSupportedTokens(network: string): TokenConfig[] {\n return TOKEN_REGISTRY[network] || [];\n}\n\n/**\n * Check if a token is supported on a network\n */\nexport function isTokenSupported(network: string, symbol: string): boolean {\n return getTokenConfig(network, symbol) !== undefined;\n}\n\n/**\n * Get token by metadata address\n */\nexport function getTokenByAddress(\n network: string,\n metadataAddress: string,\n): TokenConfig | undefined {\n const tokens = TOKEN_REGISTRY[network];\n if (!tokens) return undefined;\n const normalizedAddress = metadataAddress.toLowerCase();\n return tokens.find(\n (t) => t.metadataAddress.toLowerCase() === normalizedAddress,\n );\n}\n\n/**\n * Default token symbol for payments (USDT)\n */\nexport const DEFAULT_TOKEN_SYMBOL = \"USDT\";\n\n/**\n * Get the default token for a network\n */\nexport function getDefaultToken(network: string): TokenConfig | undefined {\n return getTokenConfig(network, DEFAULT_TOKEN_SYMBOL);\n}\n","/**\n * Aptos Utility Functions\n */\n\nimport type { Network } from \"@t402/core/types\";\nimport {\n APTOS_CAIP2_NAMESPACE,\n APTOS_MAINNET_CAIP2,\n APTOS_TESTNET_CAIP2,\n APTOS_DEVNET_CAIP2,\n DEFAULT_MAINNET_RPC,\n DEFAULT_TESTNET_RPC,\n DEFAULT_DEVNET_RPC,\n FA_TRANSFER_FUNCTION,\n} from \"./constants.js\";\nimport type {\n AptosTransactionResult,\n AptosTransactionEvent,\n ParsedFATransfer,\n} from \"./types.js\";\n\n/**\n * Validate Aptos address format\n * Aptos addresses are 64 hex characters (32 bytes) with 0x prefix\n */\nexport function isValidAptosAddress(address: string): boolean {\n if (!address) return false;\n // Must start with 0x\n if (!address.startsWith(\"0x\")) return false;\n // Remove 0x prefix and check hex\n const hex = address.slice(2);\n // Aptos addresses can be 1-64 hex chars (leading zeros may be omitted)\n if (hex.length === 0 || hex.length > 64) return false;\n return /^[0-9a-fA-F]+$/.test(hex);\n}\n\n/**\n * Normalize Aptos address to full 64-character format\n */\nexport function normalizeAptosAddress(address: string): string {\n if (!address.startsWith(\"0x\")) {\n throw new Error(\"Aptos address must start with 0x\");\n }\n const hex = address.slice(2).toLowerCase();\n // Pad to 64 characters\n return \"0x\" + hex.padStart(64, \"0\");\n}\n\n/**\n * Compare two Aptos addresses (case-insensitive, handles short addresses)\n */\nexport function compareAddresses(addr1: string, addr2: string): boolean {\n try {\n return normalizeAptosAddress(addr1) === normalizeAptosAddress(addr2);\n } catch {\n return false;\n }\n}\n\n/**\n * Validate transaction hash format\n */\nexport function isValidTxHash(txHash: string): boolean {\n if (!txHash) return false;\n if (!txHash.startsWith(\"0x\")) return false;\n const hex = txHash.slice(2);\n // Transaction hash is 64 hex characters (32 bytes)\n if (hex.length !== 64) return false;\n return /^[0-9a-fA-F]+$/.test(hex);\n}\n\n/**\n * Get default RPC URL for a network\n */\nexport function getDefaultRpcUrl(network: Network): string {\n switch (network) {\n case APTOS_MAINNET_CAIP2:\n return DEFAULT_MAINNET_RPC;\n case APTOS_TESTNET_CAIP2:\n return DEFAULT_TESTNET_RPC;\n case APTOS_DEVNET_CAIP2:\n return DEFAULT_DEVNET_RPC;\n default:\n throw new Error(`Unknown Aptos network: ${network}`);\n }\n}\n\n/**\n * Check if a network identifier is for Aptos\n */\nexport function isAptosNetwork(network: Network): boolean {\n return network.startsWith(`${APTOS_CAIP2_NAMESPACE}:`);\n}\n\n/**\n * Parse CAIP-19 asset identifier for Aptos\n * Format: aptos:1/fa:0x...\n */\nexport function parseAssetIdentifier(asset: string): {\n network: Network;\n metadataAddress: string;\n} | null {\n const parts = asset.split(\"/\");\n if (parts.length !== 2) return null;\n\n const network = parts[0] as Network;\n if (!isAptosNetwork(network)) return null;\n\n const [assetType, address] = parts[1].split(\":\");\n if (assetType !== \"fa\" || !address) return null;\n\n if (!isValidAptosAddress(address)) return null;\n\n return { network, metadataAddress: address };\n}\n\n/**\n * Create CAIP-19 asset identifier for Aptos FA\n */\nexport function createAssetIdentifier(\n network: Network,\n metadataAddress: string,\n): string {\n return `${network}/fa:${metadataAddress}`;\n}\n\n/**\n * Parse fungible asset transfer from transaction events\n */\nexport function parseFATransferFromEvents(\n events: AptosTransactionEvent[],\n): ParsedFATransfer | null {\n // Look for Withdraw and Deposit events\n const withdrawEvent = events.find(\n (e) =>\n e.type === \"0x1::fungible_asset::Withdraw\" ||\n e.type.includes(\"::fungible_asset::Withdraw\"),\n );\n const depositEvent = events.find(\n (e) =>\n e.type === \"0x1::fungible_asset::Deposit\" ||\n e.type.includes(\"::fungible_asset::Deposit\"),\n );\n\n if (!withdrawEvent || !depositEvent) {\n return null;\n }\n\n // Extract data from events\n const withdrawData = withdrawEvent.data as {\n store?: string;\n amount?: string;\n };\n const depositData = depositEvent.data as {\n store?: string;\n amount?: string;\n };\n\n if (!withdrawData.amount || !depositData.store) {\n return null;\n }\n\n // The from address is the account that owns the withdraw store\n // The to address is the account that owns the deposit store\n // For simplicity, we'll extract from the event guid\n const from = withdrawEvent.guid.accountAddress;\n const to = depositEvent.guid.accountAddress;\n const amount = BigInt(withdrawData.amount);\n\n // Metadata address would need to be extracted from state changes\n // For now, return with empty metadata (to be filled by caller)\n return {\n from,\n to,\n amount,\n metadataAddress: \"\", // Will be filled from transaction details\n };\n}\n\n/**\n * Check if transaction is a FA transfer\n */\nexport function isFATransferTransaction(tx: AptosTransactionResult): boolean {\n if (!tx.payload) return false;\n if (tx.payload.type !== \"entry_function_payload\") return false;\n return (\n tx.payload.function === FA_TRANSFER_FUNCTION ||\n tx.payload.function?.includes(\"primary_fungible_store::transfer\") ||\n false\n );\n}\n\n/**\n * Extract transfer details from transaction\n */\nexport function extractTransferDetails(\n tx: AptosTransactionResult,\n): ParsedFATransfer | null {\n if (!tx.success) return null;\n if (!tx.payload || tx.payload.type !== \"entry_function_payload\") return null;\n\n const args = tx.payload.arguments;\n if (!args || args.length < 3) return null;\n\n // Arguments for primary_fungible_store::transfer:\n // [0] - metadata object address\n // [1] - recipient address\n // [2] - amount\n\n const metadataAddress = args[0] as string;\n const to = args[1] as string;\n const amount = BigInt(args[2] as string);\n\n return {\n from: tx.sender,\n to,\n amount,\n metadataAddress,\n };\n}\n\n/**\n * Format amount with decimals for display\n */\nexport function formatAmount(amount: bigint, decimals: number): string {\n const divisor = BigInt(10 ** decimals);\n const wholePart = amount / divisor;\n const fractionalPart = amount % divisor;\n const paddedFractional = fractionalPart.toString().padStart(decimals, \"0\");\n return `${wholePart}.${paddedFractional}`;\n}\n\n/**\n * Parse amount string to bigint\n */\nexport function parseAmount(amount: string, decimals: number): bigint {\n const [whole, fractional = \"\"] = amount.split(\".\");\n const paddedFractional = fractional.padEnd(decimals, \"0\").slice(0, decimals);\n return BigInt(whole + paddedFractional);\n}\n","/**\n * Aptos Exact-Direct Client Scheme\n *\n * The client executes the FA transfer directly and provides\n * the transaction hash as proof of payment.\n */\n\nimport type {\n SchemeNetworkClient,\n PaymentPayload,\n PaymentRequirements,\n} from \"@t402/core/types\";\nimport { SCHEME_EXACT_DIRECT, APTOS_CAIP2_NAMESPACE } from \"../../constants.js\";\nimport type { ClientAptosSigner, ExactDirectAptosPayload } from \"../../types.js\";\nimport { getTokenConfig } from \"../../tokens.js\";\nimport {\n isValidAptosAddress,\n parseAssetIdentifier,\n compareAddresses,\n} from \"../../utils.js\";\n\n/**\n * Configuration for ExactDirectAptosClient\n */\nexport interface ExactDirectAptosClientConfig {\n /**\n * Whether to verify the transfer was successful before returning\n * @default true\n */\n verifyTransfer?: boolean;\n}\n\n/**\n * Aptos Exact-Direct Client\n *\n * Implements the client-side payment flow where the client:\n * 1. Receives payment requirements\n * 2. Executes the FA transfer transaction\n * 3. Returns transaction hash as proof\n */\nexport class ExactDirectAptosClient implements SchemeNetworkClient {\n readonly scheme = SCHEME_EXACT_DIRECT;\n\n constructor(\n private readonly signer: ClientAptosSigner,\n config: ExactDirectAptosClientConfig = {},\n ) {\n // Config reserved for future use (e.g., verifyTransfer option)\n void config;\n }\n\n /**\n * Create a payment payload by executing the transfer\n */\n async createPaymentPayload(\n t402Version: number,\n paymentRequirements: PaymentRequirements,\n ): Promise<Pick<PaymentPayload, \"t402Version\" | \"payload\">> {\n // Validate requirements\n this.validateRequirements(paymentRequirements);\n\n // Get sender address\n const from = await this.signer.getAddress();\n\n // Parse asset to get metadata address\n const assetInfo = parseAssetIdentifier(paymentRequirements.asset);\n if (!assetInfo) {\n throw new Error(`Invalid asset identifier: ${paymentRequirements.asset}`);\n }\n\n // Get amount\n const amount = BigInt(paymentRequirements.amount);\n\n // Check balance\n const balance = await this.signer.getBalance(assetInfo.metadataAddress);\n if (balance < amount) {\n throw new Error(\n `Insufficient balance: have ${balance}, need ${amount}`,\n );\n }\n\n // Execute transfer\n const txHash = await this.signer.transfer(\n paymentRequirements.payTo,\n assetInfo.metadataAddress,\n amount,\n );\n\n // Create payload\n const payload: ExactDirectAptosPayload = {\n txHash,\n from,\n to: paymentRequirements.payTo,\n amount: paymentRequirements.amount,\n metadataAddress: assetInfo.metadataAddress,\n };\n\n return {\n t402Version,\n payload,\n };\n }\n\n /**\n * Validate payment requirements\n */\n private validateRequirements(requirements: PaymentRequirements): void {\n // Check scheme\n if (requirements.scheme !== SCHEME_EXACT_DIRECT) {\n throw new Error(\n `Invalid scheme: expected ${SCHEME_EXACT_DIRECT}, got ${requirements.scheme}`,\n );\n }\n\n // Check network\n if (!requirements.network.startsWith(`${APTOS_CAIP2_NAMESPACE}:`)) {\n throw new Error(`Invalid network: ${requirements.network}`);\n }\n\n // Check payTo address\n if (!isValidAptosAddress(requirements.payTo)) {\n throw new Error(`Invalid payTo address: ${requirements.payTo}`);\n }\n\n // Check amount\n const amount = BigInt(requirements.amount);\n if (amount <= 0n) {\n throw new Error(`Invalid amount: ${requirements.amount}`);\n }\n\n // Check asset\n const assetInfo = parseAssetIdentifier(requirements.asset);\n if (!assetInfo) {\n throw new Error(`Invalid asset: ${requirements.asset}`);\n }\n\n // Verify token is supported\n const tokenConfig = getTokenConfig(requirements.network, \"USDT\");\n if (tokenConfig && !compareAddresses(tokenConfig.metadataAddress, assetInfo.metadataAddress)) {\n // Allow any valid FA, but log warning for unknown tokens\n console.warn(\n `Using non-standard token: ${assetInfo.metadataAddress}`,\n );\n }\n }\n}\n\nexport default ExactDirectAptosClient;\n","/**\n * Registration function for Aptos Exact-Direct client\n */\n\nimport { t402Client, PaymentPolicy } from \"@t402/core/client\";\nimport type { Network } from \"@t402/core/types\";\nimport type { ClientAptosSigner } from \"../../types.js\";\nimport {\n ExactDirectAptosClient,\n type ExactDirectAptosClientConfig,\n} from \"./scheme.js\";\n\n/**\n * Configuration options for registering Aptos schemes to a t402Client\n */\nexport interface AptosClientConfig {\n /**\n * The Aptos signer for client operations\n */\n signer: ClientAptosSigner;\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 (aptos:*)\n */\n networks?: Network[];\n\n /**\n * Optional scheme configuration\n */\n schemeConfig?: ExactDirectAptosClientConfig;\n}\n\n/**\n * Registers Aptos exact-direct payment schemes to a t402Client instance.\n *\n * @param client - The t402Client instance to register schemes to\n * @param config - Configuration for Aptos client registration\n * @returns The client instance for chaining\n *\n * @example\n * ```typescript\n * import { registerExactDirectAptosClient } from \"@t402/aptos/exact-direct/client\";\n * import { t402Client } from \"@t402/core/client\";\n *\n * const client = new t402Client();\n * registerExactDirectAptosClient(client, {\n * signer: myAptosSigner,\n * networks: [\"aptos:1\"]\n * });\n * ```\n */\nexport function registerExactDirectAptosClient(\n client: t402Client,\n config: AptosClientConfig,\n): t402Client {\n const scheme = new ExactDirectAptosClient(config.signer, config.schemeConfig);\n\n // Register scheme\n if (config.networks && config.networks.length > 0) {\n // Register specific networks\n config.networks.forEach((network) => {\n client.register(network, scheme);\n });\n } else {\n // Register wildcard for all Aptos networks\n client.register(\"aptos:*\", scheme);\n }\n\n // Apply policies if provided\n if (config.policies) {\n config.policies.forEach((policy) => {\n client.registerPolicy(policy);\n });\n }\n\n return client;\n}\n","/**\n * Aptos Exact-Direct Server Scheme\n *\n * Handles price parsing and payment requirement enhancement for\n * Aptos FA payments using the exact-direct scheme.\n */\n\nimport type {\n SchemeNetworkServer,\n PaymentRequirements,\n Price,\n AssetAmount,\n Network,\n MoneyParser,\n} from \"@t402/core/types\";\nimport { SCHEME_EXACT_DIRECT } from \"../../constants.js\";\nimport { getTokenConfig, getDefaultToken, TOKEN_REGISTRY } from \"../../tokens.js\";\nimport {\n isAptosNetwork,\n createAssetIdentifier,\n parseAmount,\n} from \"../../utils.js\";\n\n/**\n * Configuration for ExactDirectAptosServer\n */\nexport interface ExactDirectAptosServerConfig {\n /** Preferred token symbol (e.g., \"USDT\"). Defaults to network's default token. */\n preferredToken?: string;\n}\n\n/**\n * Aptos Exact-Direct Server\n *\n * Implements the server-side price parsing and payment requirements enhancement.\n */\nexport class ExactDirectAptosServer implements SchemeNetworkServer {\n readonly scheme = SCHEME_EXACT_DIRECT;\n private moneyParsers: MoneyParser[] = [];\n private config: ExactDirectAptosServerConfig;\n\n constructor(config: ExactDirectAptosServerConfig = {}) {\n this.config = config;\n }\n\n /**\n * Register a custom money parser in the parser chain.\n */\n registerMoneyParser(parser: MoneyParser): ExactDirectAptosServer {\n this.moneyParsers.push(parser);\n return this;\n }\n\n /**\n * Parse price into Aptos-specific amount\n */\n async parsePrice(price: Price, network: Network): Promise<AssetAmount> {\n // Validate network\n if (!isAptosNetwork(network)) {\n throw new Error(`Invalid Aptos network: ${network}`);\n }\n\n // If already an AssetAmount, return it directly\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 // Parse Money to decimal number\n const amount = this.parseMoneyToDecimal(price);\n\n // Try each custom money parser in order\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 // All custom parsers returned null, use default conversion\n return this.defaultMoneyConversion(amount, network);\n }\n\n /**\n * Enhance payment requirements with Aptos-specific details\n */\n async enhancePaymentRequirements(\n paymentRequirements: PaymentRequirements,\n supportedKind: {\n t402Version: number;\n scheme: string;\n network: Network;\n extra?: Record<string, unknown>;\n },\n facilitatorExtensions: string[],\n ): Promise<PaymentRequirements> {\n // Mark unused parameters\n void facilitatorExtensions;\n\n // Start with existing extra fields\n const extra = { ...paymentRequirements.extra };\n\n // Add any facilitator-provided extra fields\n if (supportedKind.extra?.assetSymbol) {\n extra.assetSymbol = supportedKind.extra.assetSymbol;\n }\n if (supportedKind.extra?.assetDecimals) {\n extra.assetDecimals = supportedKind.extra.assetDecimals;\n }\n\n return {\n ...paymentRequirements,\n extra,\n };\n }\n\n /**\n * Parse Money (string | number) to a decimal number.\n */\n private parseMoneyToDecimal(money: string | number): number {\n if (typeof money === \"number\") {\n return money;\n }\n\n // Remove $ sign and whitespace, then parse\n const cleanMoney = money.replace(/^\\$/, \"\").trim();\n const amount = parseFloat(cleanMoney);\n\n if (isNaN(amount)) {\n throw new Error(`Invalid money format: ${money}`);\n }\n\n return amount;\n }\n\n /**\n * Default money conversion implementation.\n */\n private defaultMoneyConversion(amount: number, network: Network): AssetAmount {\n const token = this.getDefaultAsset(network);\n\n // Convert decimal amount to token amount\n const tokenAmount = parseAmount(amount.toString(), token.decimals);\n\n return {\n amount: tokenAmount.toString(),\n asset: createAssetIdentifier(network, token.metadataAddress),\n extra: {\n symbol: token.symbol,\n name: token.name,\n decimals: token.decimals,\n },\n };\n }\n\n /**\n * Get the default asset info for a network.\n */\n private getDefaultAsset(\n network: Network,\n ): { metadataAddress: string; symbol: string; name: string; decimals: number } {\n // If a preferred token is configured, try to use it\n if (this.config.preferredToken) {\n const preferred = getTokenConfig(network, this.config.preferredToken);\n if (preferred) return preferred;\n }\n\n // Use the network's default token\n const defaultToken = getDefaultToken(network);\n if (defaultToken) return defaultToken;\n\n throw new Error(`No tokens configured for network ${network}`);\n }\n\n /**\n * Get all supported networks\n */\n static getSupportedNetworks(): string[] {\n return Object.keys(TOKEN_REGISTRY);\n }\n\n /**\n * Check if a network is supported\n */\n static isNetworkSupported(network: string): boolean {\n return network in TOKEN_REGISTRY;\n }\n}\n\nexport default ExactDirectAptosServer;\n","/**\n * Registration function for Aptos Exact-Direct server\n */\n\nimport { t402ResourceServer } from \"@t402/core/server\";\nimport type { Network } from \"@t402/core/types\";\nimport {\n ExactDirectAptosServer,\n type ExactDirectAptosServerConfig,\n} from \"./scheme.js\";\n\n/**\n * Configuration options for registering Aptos schemes to a t402ResourceServer\n */\nexport interface AptosServerConfig {\n /**\n * Optional specific networks to register\n * If not provided, registers wildcard support (aptos:*)\n */\n networks?: Network[];\n\n /**\n * Optional scheme configuration\n */\n schemeConfig?: ExactDirectAptosServerConfig;\n}\n\n/**\n * Registers Aptos exact-direct payment schemes to a t402ResourceServer instance.\n *\n * @param server - The t402ResourceServer instance to register schemes to\n * @param config - Configuration for Aptos server registration\n * @returns The server instance for chaining\n *\n * @example\n * ```typescript\n * import { registerExactDirectAptosServer } from \"@t402/aptos/exact-direct/server\";\n * import { t402ResourceServer } from \"@t402/core/server\";\n *\n * const server = new t402ResourceServer();\n * registerExactDirectAptosServer(server, {\n * networks: [\"aptos:1\"],\n * schemeConfig: { preferredToken: \"USDT\" }\n * });\n * ```\n */\nexport function registerExactDirectAptosServer(\n server: t402ResourceServer,\n config: AptosServerConfig = {},\n): t402ResourceServer {\n const scheme = new ExactDirectAptosServer(config.schemeConfig);\n\n // Register scheme\n if (config.networks && config.networks.length > 0) {\n // Register specific networks\n config.networks.forEach((network) => {\n server.register(network, scheme);\n });\n } else {\n // Register wildcard for all Aptos networks\n server.register(\"aptos:*\", scheme);\n }\n\n return server;\n}\n","/**\n * Aptos Exact-Direct Facilitator Scheme\n *\n * Verifies FA transfer transactions and manages replay protection.\n */\n\nimport type {\n SchemeNetworkFacilitator,\n PaymentPayload,\n PaymentRequirements,\n VerifyResponse,\n SettleResponse,\n Network,\n} from \"@t402/core/types\";\nimport { SCHEME_EXACT_DIRECT, APTOS_CAIP2_NAMESPACE } from \"../../constants.js\";\nimport type {\n FacilitatorAptosSigner,\n ExactDirectAptosPayload,\n} from \"../../types.js\";\nimport {\n isValidTxHash,\n compareAddresses,\n parseAssetIdentifier,\n extractTransferDetails,\n isAptosNetwork,\n} from \"../../utils.js\";\nimport { getDefaultToken } from \"../../tokens.js\";\n\n/**\n * Configuration for ExactDirectAptosFacilitator\n */\nexport interface ExactDirectAptosFacilitatorConfig {\n /**\n * Maximum age of transaction in seconds (default: 3600 = 1 hour)\n */\n maxTransactionAge?: number;\n\n /**\n * Duration to cache used transaction hashes (in milliseconds)\n */\n usedTxCacheDuration?: number;\n}\n\n/**\n * Aptos Exact-Direct Facilitator\n *\n * Implements the facilitator-side verification and settlement.\n * For exact-direct, settlement is a no-op since client already executed.\n */\nexport class ExactDirectAptosFacilitator implements SchemeNetworkFacilitator {\n readonly scheme = SCHEME_EXACT_DIRECT;\n readonly caipFamily = `${APTOS_CAIP2_NAMESPACE}:*`;\n\n private readonly config: Required<ExactDirectAptosFacilitatorConfig>;\n private usedTxs: Map<string, number> = new Map();\n\n constructor(\n private readonly signer: FacilitatorAptosSigner,\n config?: ExactDirectAptosFacilitatorConfig,\n ) {\n this.config = {\n maxTransactionAge: config?.maxTransactionAge ?? 3600,\n usedTxCacheDuration: config?.usedTxCacheDuration ?? 24 * 60 * 60 * 1000, // 24 hours\n };\n\n // Start cleanup interval\n this.startCleanupInterval();\n }\n\n /**\n * Get extra data for a supported kind\n */\n getExtra(network: Network): Record<string, unknown> | undefined {\n const token = getDefaultToken(network);\n if (!token) {\n return undefined;\n }\n return {\n assetSymbol: token.symbol,\n assetDecimals: token.decimals,\n };\n }\n\n /**\n * Get facilitator signer addresses for a network\n */\n getSigners(network: Network): string[] {\n return this.signer.getAddresses(network);\n }\n\n /**\n * Verify a payment payload\n */\n async verify(\n payload: PaymentPayload,\n requirements: PaymentRequirements,\n ): Promise<VerifyResponse> {\n // Validate scheme\n if (payload.accepted.scheme !== SCHEME_EXACT_DIRECT) {\n return {\n isValid: false,\n invalidReason: \"invalid_scheme\",\n };\n }\n\n // Validate network\n if (!isAptosNetwork(payload.accepted.network)) {\n return {\n isValid: false,\n invalidReason: \"invalid_network\",\n };\n }\n\n // Extract Aptos-specific payload\n const aptosPayload = payload.payload as ExactDirectAptosPayload;\n\n // Validate transaction hash format\n if (!isValidTxHash(aptosPayload.txHash)) {\n return {\n isValid: false,\n invalidReason: \"invalid_tx_hash_format\",\n };\n }\n\n // Check for replay attack\n if (this.isTxUsed(aptosPayload.txHash)) {\n return {\n isValid: false,\n invalidReason: \"transaction_already_used\",\n payer: aptosPayload.from,\n };\n }\n\n try {\n // Query transaction\n const tx = await this.signer.queryTransaction(aptosPayload.txHash);\n if (!tx) {\n return {\n isValid: false,\n invalidReason: \"transaction_not_found\",\n payer: aptosPayload.from,\n };\n }\n\n // Verify transaction was successful\n if (!tx.success) {\n return {\n isValid: false,\n invalidReason: `transaction_failed: ${tx.vmStatus}`,\n payer: aptosPayload.from,\n };\n }\n\n // Check transaction age\n if (this.config.maxTransactionAge > 0) {\n const txTimestamp = parseInt(tx.timestamp, 10) / 1000000; // Convert from microseconds\n const now = Date.now() / 1000;\n const age = now - txTimestamp;\n if (age > this.config.maxTransactionAge) {\n return {\n isValid: false,\n invalidReason: `transaction_too_old: ${Math.round(age)} seconds`,\n payer: aptosPayload.from,\n };\n }\n }\n\n // Extract transfer details from transaction\n const transferDetails = extractTransferDetails(tx);\n if (!transferDetails) {\n return {\n isValid: false,\n invalidReason: \"could_not_extract_transfer_details\",\n payer: aptosPayload.from,\n };\n }\n\n // Parse expected asset\n const expectedAsset = parseAssetIdentifier(requirements.asset);\n if (!expectedAsset) {\n return {\n isValid: false,\n invalidReason: `invalid_asset_in_requirements: ${requirements.asset}`,\n payer: aptosPayload.from,\n };\n }\n\n // Verify recipient\n if (!compareAddresses(transferDetails.to, requirements.payTo)) {\n return {\n isValid: false,\n invalidReason: `recipient_mismatch: expected ${requirements.payTo}, got ${transferDetails.to}`,\n payer: aptosPayload.from,\n };\n }\n\n // Verify metadata address (token)\n if (\n !compareAddresses(\n transferDetails.metadataAddress,\n expectedAsset.metadataAddress,\n )\n ) {\n return {\n isValid: false,\n invalidReason: `token_mismatch: expected ${expectedAsset.metadataAddress}, got ${transferDetails.metadataAddress}`,\n payer: aptosPayload.from,\n };\n }\n\n // Verify amount\n const expectedAmount = BigInt(requirements.amount);\n if (transferDetails.amount < expectedAmount) {\n return {\n isValid: false,\n invalidReason: `insufficient_amount: expected ${expectedAmount}, got ${transferDetails.amount}`,\n payer: aptosPayload.from,\n };\n }\n\n // Mark transaction as used\n this.markTxUsed(aptosPayload.txHash);\n\n return {\n isValid: true,\n payer: transferDetails.from,\n };\n } catch (error) {\n return {\n isValid: false,\n invalidReason: `verification_error: ${error instanceof Error ? error.message : String(error)}`,\n payer: aptosPayload.from,\n };\n }\n }\n\n /**\n * Settle a payment (no-op for exact-direct since client already executed)\n */\n async settle(\n payload: PaymentPayload,\n requirements: PaymentRequirements,\n ): Promise<SettleResponse> {\n // Verify first\n const verifyResult = await this.verify(payload, requirements);\n\n if (!verifyResult.isValid) {\n return {\n success: false,\n errorReason: verifyResult.invalidReason || \"verification_failed\",\n payer: verifyResult.payer,\n transaction: \"\",\n network: requirements.network,\n };\n }\n\n const aptosPayload = payload.payload as ExactDirectAptosPayload;\n\n // For exact-direct, settlement is already complete\n return {\n success: true,\n transaction: aptosPayload.txHash,\n network: requirements.network,\n payer: aptosPayload.from,\n };\n }\n\n /**\n * Check if a transaction has been used\n */\n private isTxUsed(txHash: string): boolean {\n return this.usedTxs.has(txHash.toLowerCase());\n }\n\n /**\n * Mark a transaction as used\n */\n private markTxUsed(txHash: string): void {\n this.usedTxs.set(txHash.toLowerCase(), Date.now());\n }\n\n /**\n * Start the cleanup interval for used transactions\n */\n private startCleanupInterval(): void {\n setInterval(\n () => {\n const cutoff = Date.now() - this.config.usedTxCacheDuration;\n for (const [txHash, usedAt] of this.usedTxs.entries()) {\n if (usedAt < cutoff) {\n this.usedTxs.delete(txHash);\n }\n }\n },\n 60 * 60 * 1000,\n ); // Cleanup every hour\n }\n}\n\nexport default ExactDirectAptosFacilitator;\n","/**\n * Registration function for Aptos Exact-Direct facilitator\n */\n\nimport { t402Facilitator } from \"@t402/core/facilitator\";\nimport type { Network } from \"@t402/core/types\";\nimport type { FacilitatorAptosSigner } from \"../../types.js\";\nimport {\n ExactDirectAptosFacilitator,\n type ExactDirectAptosFacilitatorConfig,\n} from \"./scheme.js\";\n\n/**\n * Configuration options for registering Aptos schemes to a t402Facilitator\n */\nexport interface AptosFacilitatorConfig {\n /**\n * The Aptos signer for facilitator operations (verify and settle)\n */\n signer: FacilitatorAptosSigner;\n\n /**\n * Optional specific networks to register\n * If not provided, registers wildcard support (aptos:*)\n */\n networks?: Network[];\n\n /**\n * Optional scheme configuration\n */\n schemeConfig?: ExactDirectAptosFacilitatorConfig;\n}\n\n/**\n * Registers Aptos exact-direct payment schemes to a t402Facilitator instance.\n *\n * @param facilitator - The t402Facilitator instance to register schemes to\n * @param config - Configuration for Aptos facilitator registration\n * @returns The facilitator instance for chaining\n *\n * @example\n * ```typescript\n * import { registerExactDirectAptosFacilitator } from \"@t402/aptos/exact-direct/facilitator\";\n * import { t402Facilitator } from \"@t402/core/facilitator\";\n *\n * const facilitator = new t402Facilitator();\n * registerExactDirectAptosFacilitator(facilitator, {\n * signer: myAptosSigner,\n * networks: [\"aptos:1\"]\n * });\n * ```\n */\nexport function registerExactDirectAptosFacilitator(\n facilitator: t402Facilitator,\n config: AptosFacilitatorConfig,\n): t402Facilitator {\n const scheme = new ExactDirectAptosFacilitator(\n config.signer,\n config.schemeConfig,\n );\n\n // Register scheme\n if (config.networks && config.networks.length > 0) {\n // Register specific networks\n config.networks.forEach((network) => {\n facilitator.register(network, scheme);\n });\n } else {\n // Register wildcard for all Aptos networks\n facilitator.register(\"aptos:*\", scheme);\n }\n\n return facilitator;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACKO,IAAM,wBAAwB;AAG9B,IAAM,sBAAsB;AAC5B,IAAM,sBAAsB;AAC5B,IAAM,qBAAqB;AAG3B,IAAM,iBAAiB;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AACF;AAKO,IAAM,yBAAyB;AAC/B,IAAM,yBAAyB;AAC/B,IAAM,wBAAwB;AAG9B,IAAM,sBAAsB;AAC5B,IAAM,sBAAsB;AAC5B,IAAM,qBAAqB;AAG3B,IAAM,sBAAsB;AAG5B,IAAM,gCAAgC;AACtC,IAAM,wBAAwB;AAC9B,IAAM,uBAAuB;AAG7B,IAAM,uBAAuB,GAAG,6BAA6B;AAG7D,IAAM,yBAAyB;AAC/B,IAAM,yBAAyB;AAG/B,IAAM,gCAAgC;;;ACmHtC,SAAS,eAAe,SAA0B;AACvD,QAAM,QAAQ,QAAQ,MAAM,GAAG;AAC/B,MAAI,MAAM,WAAW,KAAK,MAAM,CAAC,MAAM,SAAS;AAC9C,UAAM,IAAI,MAAM,qCAAqC,OAAO,EAAE;AAAA,EAChE;AACA,QAAM,UAAU,SAAS,MAAM,CAAC,GAAG,EAAE;AACrC,MAAI,MAAM,OAAO,GAAG;AAClB,UAAM,IAAI,MAAM,2CAA2C,OAAO,EAAE;AAAA,EACtE;AACA,SAAO;AACT;;;AC9IO,IAAM,iBAAgD;AAAA,EAC3D,CAAC,mBAAmB,GAAG;AAAA,IACrB;AAAA,MACE,iBACE;AAAA,MACF,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,UAAU;AAAA,IACZ;AAAA,IACA;AAAA,MACE,iBACE;AAAA,MACF,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,UAAU;AAAA,IACZ;AAAA,EACF;AAAA,EACA,CAAC,mBAAmB,GAAG;AAAA,IACrB;AAAA;AAAA,MAEE,iBACE;AAAA,MACF,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,UAAU;AAAA,IACZ;AAAA,EACF;AAAA,EACA,CAAC,kBAAkB,GAAG,CAAC;AACzB;AAKO,SAAS,eACd,SACA,QACyB;AACzB,QAAM,SAAS,eAAe,OAAO;AACrC,MAAI,CAAC,OAAQ,QAAO;AACpB,SAAO,OAAO;AAAA,IACZ,CAAC,MAAM,EAAE,OAAO,YAAY,MAAM,OAAO,YAAY;AAAA,EACvD;AACF;AAKO,SAAS,mBAAmB,SAAgC;AACjE,SAAO,eAAe,OAAO,KAAK,CAAC;AACrC;AAKO,SAAS,iBAAiB,SAAiB,QAAyB;AACzE,SAAO,eAAe,SAAS,MAAM,MAAM;AAC7C;AAKO,SAAS,kBACd,SACA,iBACyB;AACzB,QAAM,SAAS,eAAe,OAAO;AACrC,MAAI,CAAC,OAAQ,QAAO;AACpB,QAAM,oBAAoB,gBAAgB,YAAY;AACtD,SAAO,OAAO;AAAA,IACZ,CAAC,MAAM,EAAE,gBAAgB,YAAY,MAAM;AAAA,EAC7C;AACF;AAKO,IAAM,uBAAuB;AAK7B,SAAS,gBAAgB,SAA0C;AACxE,SAAO,eAAe,SAAS,oBAAoB;AACrD;;;ACxFO,SAAS,oBAAoB,SAA0B;AAC5D,MAAI,CAAC,QAAS,QAAO;AAErB,MAAI,CAAC,QAAQ,WAAW,IAAI,EAAG,QAAO;AAEtC,QAAM,MAAM,QAAQ,MAAM,CAAC;AAE3B,MAAI,IAAI,WAAW,KAAK,IAAI,SAAS,GAAI,QAAO;AAChD,SAAO,iBAAiB,KAAK,GAAG;AAClC;AAKO,SAAS,sBAAsB,SAAyB;AAC7D,MAAI,CAAC,QAAQ,WAAW,IAAI,GAAG;AAC7B,UAAM,IAAI,MAAM,kCAAkC;AAAA,EACpD;AACA,QAAM,MAAM,QAAQ,MAAM,CAAC,EAAE,YAAY;AAEzC,SAAO,OAAO,IAAI,SAAS,IAAI,GAAG;AACpC;AAKO,SAAS,iBAAiB,OAAe,OAAwB;AACtE,MAAI;AACF,WAAO,sBAAsB,KAAK,MAAM,sBAAsB,KAAK;AAAA,EACrE,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAKO,SAAS,cAAc,QAAyB;AACrD,MAAI,CAAC,OAAQ,QAAO;AACpB,MAAI,CAAC,OAAO,WAAW,IAAI,EAAG,QAAO;AACrC,QAAM,MAAM,OAAO,MAAM,CAAC;AAE1B,MAAI,IAAI,WAAW,GAAI,QAAO;AAC9B,SAAO,iBAAiB,KAAK,GAAG;AAClC;AAKO,SAAS,iBAAiB,SAA0B;AACzD,UAAQ,SAAS;AAAA,IACf,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,YAAM,IAAI,MAAM,0BAA0B,OAAO,EAAE;AAAA,EACvD;AACF;AAKO,SAAS,eAAe,SAA2B;AACxD,SAAO,QAAQ,WAAW,GAAG,qBAAqB,GAAG;AACvD;AAMO,SAAS,qBAAqB,OAG5B;AACP,QAAM,QAAQ,MAAM,MAAM,GAAG;AAC7B,MAAI,MAAM,WAAW,EAAG,QAAO;AAE/B,QAAM,UAAU,MAAM,CAAC;AACvB,MAAI,CAAC,eAAe,OAAO,EAAG,QAAO;AAErC,QAAM,CAAC,WAAW,OAAO,IAAI,MAAM,CAAC,EAAE,MAAM,GAAG;AAC/C,MAAI,cAAc,QAAQ,CAAC,QAAS,QAAO;AAE3C,MAAI,CAAC,oBAAoB,OAAO,EAAG,QAAO;AAE1C,SAAO,EAAE,SAAS,iBAAiB,QAAQ;AAC7C;AAKO,SAAS,sBACd,SACA,iBACQ;AACR,SAAO,GAAG,OAAO,OAAO,eAAe;AACzC;AAKO,SAAS,0BACd,QACyB;AAEzB,QAAM,gBAAgB,OAAO;AAAA,IAC3B,CAAC,MACC,EAAE,SAAS,mCACX,EAAE,KAAK,SAAS,4BAA4B;AAAA,EAChD;AACA,QAAM,eAAe,OAAO;AAAA,IAC1B,CAAC,MACC,EAAE,SAAS,kCACX,EAAE,KAAK,SAAS,2BAA2B;AAAA,EAC/C;AAEA,MAAI,CAAC,iBAAiB,CAAC,cAAc;AACnC,WAAO;AAAA,EACT;AAGA,QAAM,eAAe,cAAc;AAInC,QAAM,cAAc,aAAa;AAKjC,MAAI,CAAC,aAAa,UAAU,CAAC,YAAY,OAAO;AAC9C,WAAO;AAAA,EACT;AAKA,QAAM,OAAO,cAAc,KAAK;AAChC,QAAM,KAAK,aAAa,KAAK;AAC7B,QAAM,SAAS,OAAO,aAAa,MAAM;AAIzC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,iBAAiB;AAAA;AAAA,EACnB;AACF;AAKO,SAAS,wBAAwB,IAAqC;AAC3E,MAAI,CAAC,GAAG,QAAS,QAAO;AACxB,MAAI,GAAG,QAAQ,SAAS,yBAA0B,QAAO;AACzD,SACE,GAAG,QAAQ,aAAa,wBACxB,GAAG,QAAQ,UAAU,SAAS,kCAAkC,KAChE;AAEJ;AAKO,SAAS,uBACd,IACyB;AACzB,MAAI,CAAC,GAAG,QAAS,QAAO;AACxB,MAAI,CAAC,GAAG,WAAW,GAAG,QAAQ,SAAS,yBAA0B,QAAO;AAExE,QAAM,OAAO,GAAG,QAAQ;AACxB,MAAI,CAAC,QAAQ,KAAK,SAAS,EAAG,QAAO;AAOrC,QAAM,kBAAkB,KAAK,CAAC;AAC9B,QAAM,KAAK,KAAK,CAAC;AACjB,QAAM,SAAS,OAAO,KAAK,CAAC,CAAW;AAEvC,SAAO;AAAA,IACL,MAAM,GAAG;AAAA,IACT;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAKO,SAAS,aAAa,QAAgB,UAA0B;AACrE,QAAM,UAAU,OAAO,MAAM,QAAQ;AACrC,QAAM,YAAY,SAAS;AAC3B,QAAM,iBAAiB,SAAS;AAChC,QAAM,mBAAmB,eAAe,SAAS,EAAE,SAAS,UAAU,GAAG;AACzE,SAAO,GAAG,SAAS,IAAI,gBAAgB;AACzC;AAKO,SAAS,YAAY,QAAgB,UAA0B;AACpE,QAAM,CAAC,OAAO,aAAa,EAAE,IAAI,OAAO,MAAM,GAAG;AACjD,QAAM,mBAAmB,WAAW,OAAO,UAAU,GAAG,EAAE,MAAM,GAAG,QAAQ;AAC3E,SAAO,OAAO,QAAQ,gBAAgB;AACxC;;;ACvMO,IAAM,yBAAN,MAA4D;AAAA,EAGjE,YACmB,QACjB,SAAuC,CAAC,GACxC;AAFiB;AAHnB,wBAAS,UAAS;AAOhB,SAAK;AAAA,EACP;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,qBACJ,aACA,qBAC0D;AAE1D,SAAK,qBAAqB,mBAAmB;AAG7C,UAAM,OAAO,MAAM,KAAK,OAAO,WAAW;AAG1C,UAAM,YAAY,qBAAqB,oBAAoB,KAAK;AAChE,QAAI,CAAC,WAAW;AACd,YAAM,IAAI,MAAM,6BAA6B,oBAAoB,KAAK,EAAE;AAAA,IAC1E;AAGA,UAAM,SAAS,OAAO,oBAAoB,MAAM;AAGhD,UAAM,UAAU,MAAM,KAAK,OAAO,WAAW,UAAU,eAAe;AACtE,QAAI,UAAU,QAAQ;AACpB,YAAM,IAAI;AAAA,QACR,8BAA8B,OAAO,UAAU,MAAM;AAAA,MACvD;AAAA,IACF;AAGA,UAAM,SAAS,MAAM,KAAK,OAAO;AAAA,MAC/B,oBAAoB;AAAA,MACpB,UAAU;AAAA,MACV;AAAA,IACF;AAGA,UAAM,UAAmC;AAAA,MACvC;AAAA,MACA;AAAA,MACA,IAAI,oBAAoB;AAAA,MACxB,QAAQ,oBAAoB;AAAA,MAC5B,iBAAiB,UAAU;AAAA,IAC7B;AAEA,WAAO;AAAA,MACL;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,qBAAqB,cAAyC;AAEpE,QAAI,aAAa,WAAW,qBAAqB;AAC/C,YAAM,IAAI;AAAA,QACR,4BAA4B,mBAAmB,SAAS,aAAa,MAAM;AAAA,MAC7E;AAAA,IACF;AAGA,QAAI,CAAC,aAAa,QAAQ,WAAW,GAAG,qBAAqB,GAAG,GAAG;AACjE,YAAM,IAAI,MAAM,oBAAoB,aAAa,OAAO,EAAE;AAAA,IAC5D;AAGA,QAAI,CAAC,oBAAoB,aAAa,KAAK,GAAG;AAC5C,YAAM,IAAI,MAAM,0BAA0B,aAAa,KAAK,EAAE;AAAA,IAChE;AAGA,UAAM,SAAS,OAAO,aAAa,MAAM;AACzC,QAAI,UAAU,IAAI;AAChB,YAAM,IAAI,MAAM,mBAAmB,aAAa,MAAM,EAAE;AAAA,IAC1D;AAGA,UAAM,YAAY,qBAAqB,aAAa,KAAK;AACzD,QAAI,CAAC,WAAW;AACd,YAAM,IAAI,MAAM,kBAAkB,aAAa,KAAK,EAAE;AAAA,IACxD;AAGA,UAAM,cAAc,eAAe,aAAa,SAAS,MAAM;AAC/D,QAAI,eAAe,CAAC,iBAAiB,YAAY,iBAAiB,UAAU,eAAe,GAAG;AAE5F,cAAQ;AAAA,QACN,6BAA6B,UAAU,eAAe;AAAA,MACxD;AAAA,IACF;AAAA,EACF;AACF;;;ACxFO,SAAS,+BACd,QACA,QACY;AACZ,QAAM,SAAS,IAAI,uBAAuB,OAAO,QAAQ,OAAO,YAAY;AAG5E,MAAI,OAAO,YAAY,OAAO,SAAS,SAAS,GAAG;AAEjD,WAAO,SAAS,QAAQ,CAAC,YAAY;AACnC,aAAO,SAAS,SAAS,MAAM;AAAA,IACjC,CAAC;AAAA,EACH,OAAO;AAEL,WAAO,SAAS,WAAW,MAAM;AAAA,EACnC;AAGA,MAAI,OAAO,UAAU;AACnB,WAAO,SAAS,QAAQ,CAAC,WAAW;AAClC,aAAO,eAAe,MAAM;AAAA,IAC9B,CAAC;AAAA,EACH;AAEA,SAAO;AACT;;;AC9CO,IAAM,yBAAN,MAA4D;AAAA,EAKjE,YAAY,SAAuC,CAAC,GAAG;AAJvD,wBAAS,UAAS;AAClB,wBAAQ,gBAA8B,CAAC;AACvC,wBAAQ;AAGN,SAAK,SAAS;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,oBAAoB,QAA6C;AAC/D,SAAK,aAAa,KAAK,MAAM;AAC7B,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAW,OAAc,SAAwC;AAErE,QAAI,CAAC,eAAe,OAAO,GAAG;AAC5B,YAAM,IAAI,MAAM,0BAA0B,OAAO,EAAE;AAAA,IACrD;AAGA,QAAI,OAAO,UAAU,YAAY,UAAU,QAAQ,YAAY,OAAO;AACpE,UAAI,CAAC,MAAM,OAAO;AAChB,cAAM,IAAI,MAAM,8DAA8D,OAAO,EAAE;AAAA,MACzF;AACA,aAAO;AAAA,QACL,QAAQ,MAAM;AAAA,QACd,OAAO,MAAM;AAAA,QACb,OAAO,MAAM,SAAS,CAAC;AAAA,MACzB;AAAA,IACF;AAGA,UAAM,SAAS,KAAK,oBAAoB,KAAK;AAG7C,eAAW,UAAU,KAAK,cAAc;AACtC,YAAM,SAAS,MAAM,OAAO,QAAQ,OAAO;AAC3C,UAAI,WAAW,MAAM;AACnB,eAAO;AAAA,MACT;AAAA,IACF;AAGA,WAAO,KAAK,uBAAuB,QAAQ,OAAO;AAAA,EACpD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,2BACJ,qBACA,eAMA,uBAC8B;AAE9B,SAAK;AAGL,UAAM,QAAQ,EAAE,GAAG,oBAAoB,MAAM;AAG7C,QAAI,cAAc,OAAO,aAAa;AACpC,YAAM,cAAc,cAAc,MAAM;AAAA,IAC1C;AACA,QAAI,cAAc,OAAO,eAAe;AACtC,YAAM,gBAAgB,cAAc,MAAM;AAAA,IAC5C;AAEA,WAAO;AAAA,MACL,GAAG;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,oBAAoB,OAAgC;AAC1D,QAAI,OAAO,UAAU,UAAU;AAC7B,aAAO;AAAA,IACT;AAGA,UAAM,aAAa,MAAM,QAAQ,OAAO,EAAE,EAAE,KAAK;AACjD,UAAM,SAAS,WAAW,UAAU;AAEpC,QAAI,MAAM,MAAM,GAAG;AACjB,YAAM,IAAI,MAAM,yBAAyB,KAAK,EAAE;AAAA,IAClD;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,uBAAuB,QAAgB,SAA+B;AAC5E,UAAM,QAAQ,KAAK,gBAAgB,OAAO;AAG1C,UAAM,cAAc,YAAY,OAAO,SAAS,GAAG,MAAM,QAAQ;AAEjE,WAAO;AAAA,MACL,QAAQ,YAAY,SAAS;AAAA,MAC7B,OAAO,sBAAsB,SAAS,MAAM,eAAe;AAAA,MAC3D,OAAO;AAAA,QACL,QAAQ,MAAM;AAAA,QACd,MAAM,MAAM;AAAA,QACZ,UAAU,MAAM;AAAA,MAClB;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,gBACN,SAC6E;AAE7E,QAAI,KAAK,OAAO,gBAAgB;AAC9B,YAAM,YAAY,eAAe,SAAS,KAAK,OAAO,cAAc;AACpE,UAAI,UAAW,QAAO;AAAA,IACxB;AAGA,UAAM,eAAe,gBAAgB,OAAO;AAC5C,QAAI,aAAc,QAAO;AAEzB,UAAM,IAAI,MAAM,oCAAoC,OAAO,EAAE;AAAA,EAC/D;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,uBAAiC;AACtC,WAAO,OAAO,KAAK,cAAc;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,mBAAmB,SAA0B;AAClD,WAAO,WAAW;AAAA,EACpB;AACF;;;ACnJO,SAAS,+BACd,QACA,SAA4B,CAAC,GACT;AACpB,QAAM,SAAS,IAAI,uBAAuB,OAAO,YAAY;AAG7D,MAAI,OAAO,YAAY,OAAO,SAAS,SAAS,GAAG;AAEjD,WAAO,SAAS,QAAQ,CAAC,YAAY;AACnC,aAAO,SAAS,SAAS,MAAM;AAAA,IACjC,CAAC;AAAA,EACH,OAAO;AAEL,WAAO,SAAS,WAAW,MAAM;AAAA,EACnC;AAEA,SAAO;AACT;;;ACfO,IAAM,8BAAN,MAAsE;AAAA,EAO3E,YACmB,QACjB,QACA;AAFiB;AAPnB,wBAAS,UAAS;AAClB,wBAAS,cAAa,GAAG,qBAAqB;AAE9C,wBAAiB;AACjB,wBAAQ,WAA+B,oBAAI,IAAI;AAM7C,SAAK,SAAS;AAAA,MACZ,mBAAmB,QAAQ,qBAAqB;AAAA,MAChD,qBAAqB,QAAQ,uBAAuB,KAAK,KAAK,KAAK;AAAA;AAAA,IACrE;AAGA,SAAK,qBAAqB;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA,EAKA,SAAS,SAAuD;AAC9D,UAAM,QAAQ,gBAAgB,OAAO;AACrC,QAAI,CAAC,OAAO;AACV,aAAO;AAAA,IACT;AACA,WAAO;AAAA,MACL,aAAa,MAAM;AAAA,MACnB,eAAe,MAAM;AAAA,IACvB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,SAA4B;AACrC,WAAO,KAAK,OAAO,aAAa,OAAO;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OACJ,SACA,cACyB;AAEzB,QAAI,QAAQ,SAAS,WAAW,qBAAqB;AACnD,aAAO;AAAA,QACL,SAAS;AAAA,QACT,eAAe;AAAA,MACjB;AAAA,IACF;AAGA,QAAI,CAAC,eAAe,QAAQ,SAAS,OAAO,GAAG;AAC7C,aAAO;AAAA,QACL,SAAS;AAAA,QACT,eAAe;AAAA,MACjB;AAAA,IACF;AAGA,UAAM,eAAe,QAAQ;AAG7B,QAAI,CAAC,cAAc,aAAa,MAAM,GAAG;AACvC,aAAO;AAAA,QACL,SAAS;AAAA,QACT,eAAe;AAAA,MACjB;AAAA,IACF;AAGA,QAAI,KAAK,SAAS,aAAa,MAAM,GAAG;AACtC,aAAO;AAAA,QACL,SAAS;AAAA,QACT,eAAe;AAAA,QACf,OAAO,aAAa;AAAA,MACtB;AAAA,IACF;AAEA,QAAI;AAEF,YAAM,KAAK,MAAM,KAAK,OAAO,iBAAiB,aAAa,MAAM;AACjE,UAAI,CAAC,IAAI;AACP,eAAO;AAAA,UACL,SAAS;AAAA,UACT,eAAe;AAAA,UACf,OAAO,aAAa;AAAA,QACtB;AAAA,MACF;AAGA,UAAI,CAAC,GAAG,SAAS;AACf,eAAO;AAAA,UACL,SAAS;AAAA,UACT,eAAe,uBAAuB,GAAG,QAAQ;AAAA,UACjD,OAAO,aAAa;AAAA,QACtB;AAAA,MACF;AAGA,UAAI,KAAK,OAAO,oBAAoB,GAAG;AACrC,cAAM,cAAc,SAAS,GAAG,WAAW,EAAE,IAAI;AACjD,cAAM,MAAM,KAAK,IAAI,IAAI;AACzB,cAAM,MAAM,MAAM;AAClB,YAAI,MAAM,KAAK,OAAO,mBAAmB;AACvC,iBAAO;AAAA,YACL,SAAS;AAAA,YACT,eAAe,wBAAwB,KAAK,MAAM,GAAG,CAAC;AAAA,YACtD,OAAO,aAAa;AAAA,UACtB;AAAA,QACF;AAAA,MACF;AAGA,YAAM,kBAAkB,uBAAuB,EAAE;AACjD,UAAI,CAAC,iBAAiB;AACpB,eAAO;AAAA,UACL,SAAS;AAAA,UACT,eAAe;AAAA,UACf,OAAO,aAAa;AAAA,QACtB;AAAA,MACF;AAGA,YAAM,gBAAgB,qBAAqB,aAAa,KAAK;AAC7D,UAAI,CAAC,eAAe;AAClB,eAAO;AAAA,UACL,SAAS;AAAA,UACT,eAAe,kCAAkC,aAAa,KAAK;AAAA,UACnE,OAAO,aAAa;AAAA,QACtB;AAAA,MACF;AAGA,UAAI,CAAC,iBAAiB,gBAAgB,IAAI,aAAa,KAAK,GAAG;AAC7D,eAAO;AAAA,UACL,SAAS;AAAA,UACT,eAAe,gCAAgC,aAAa,KAAK,SAAS,gBAAgB,EAAE;AAAA,UAC5F,OAAO,aAAa;AAAA,QACtB;AAAA,MACF;AAGA,UACE,CAAC;AAAA,QACC,gBAAgB;AAAA,QAChB,cAAc;AAAA,MAChB,GACA;AACA,eAAO;AAAA,UACL,SAAS;AAAA,UACT,eAAe,4BAA4B,cAAc,eAAe,SAAS,gBAAgB,eAAe;AAAA,UAChH,OAAO,aAAa;AAAA,QACtB;AAAA,MACF;AAGA,YAAM,iBAAiB,OAAO,aAAa,MAAM;AACjD,UAAI,gBAAgB,SAAS,gBAAgB;AAC3C,eAAO;AAAA,UACL,SAAS;AAAA,UACT,eAAe,iCAAiC,cAAc,SAAS,gBAAgB,MAAM;AAAA,UAC7F,OAAO,aAAa;AAAA,QACtB;AAAA,MACF;AAGA,WAAK,WAAW,aAAa,MAAM;AAEnC,aAAO;AAAA,QACL,SAAS;AAAA,QACT,OAAO,gBAAgB;AAAA,MACzB;AAAA,IACF,SAAS,OAAO;AACd,aAAO;AAAA,QACL,SAAS;AAAA,QACT,eAAe,uBAAuB,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,QAC5F,OAAO,aAAa;AAAA,MACtB;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OACJ,SACA,cACyB;AAEzB,UAAM,eAAe,MAAM,KAAK,OAAO,SAAS,YAAY;AAE5D,QAAI,CAAC,aAAa,SAAS;AACzB,aAAO;AAAA,QACL,SAAS;AAAA,QACT,aAAa,aAAa,iBAAiB;AAAA,QAC3C,OAAO,aAAa;AAAA,QACpB,aAAa;AAAA,QACb,SAAS,aAAa;AAAA,MACxB;AAAA,IACF;AAEA,UAAM,eAAe,QAAQ;AAG7B,WAAO;AAAA,MACL,SAAS;AAAA,MACT,aAAa,aAAa;AAAA,MAC1B,SAAS,aAAa;AAAA,MACtB,OAAO,aAAa;AAAA,IACtB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,SAAS,QAAyB;AACxC,WAAO,KAAK,QAAQ,IAAI,OAAO,YAAY,CAAC;AAAA,EAC9C;AAAA;AAAA;AAAA;AAAA,EAKQ,WAAW,QAAsB;AACvC,SAAK,QAAQ,IAAI,OAAO,YAAY,GAAG,KAAK,IAAI,CAAC;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA,EAKQ,uBAA6B;AACnC;AAAA,MACE,MAAM;AACJ,cAAM,SAAS,KAAK,IAAI,IAAI,KAAK,OAAO;AACxC,mBAAW,CAAC,QAAQ,MAAM,KAAK,KAAK,QAAQ,QAAQ,GAAG;AACrD,cAAI,SAAS,QAAQ;AACnB,iBAAK,QAAQ,OAAO,MAAM;AAAA,UAC5B;AAAA,QACF;AAAA,MACF;AAAA,MACA,KAAK,KAAK;AAAA,IACZ;AAAA,EACF;AACF;;;ACrPO,SAAS,oCACd,aACA,QACiB;AACjB,QAAM,SAAS,IAAI;AAAA,IACjB,OAAO;AAAA,IACP,OAAO;AAAA,EACT;AAGA,MAAI,OAAO,YAAY,OAAO,SAAS,SAAS,GAAG;AAEjD,WAAO,SAAS,QAAQ,CAAC,YAAY;AACnC,kBAAY,SAAS,SAAS,MAAM;AAAA,IACtC,CAAC;AAAA,EACH,OAAO;AAEL,gBAAY,SAAS,WAAW,MAAM;AAAA,EACxC;AAEA,SAAO;AACT;","names":[]}
@@ -146,4 +146,4 @@ interface ParsedFATransfer {
146
146
  */
147
147
  declare function extractChainId(network: Network): number;
148
148
 
149
- export { type AptosTransactionEvent as A, type ClientAptosSigner as C, type ExactDirectAptosPayload as E, type FacilitatorAptosSigner as F, type ParsedFATransfer as P, type AptosTransactionResult as a, type AptosTransactionPayload as b, type AptosStateChange as c, extractChainId as e };
149
+ export { type AptosTransactionResult as A, type ClientAptosSigner as C, type ExactDirectAptosPayload as E, type FacilitatorAptosSigner as F, type ParsedFATransfer as P, type AptosTransactionEvent as a, type AptosStateChange as b, type AptosTransactionPayload as c, extractChainId as e };