@t402/aptos 2.3.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 (42) hide show
  1. package/README.md +171 -0
  2. package/dist/exact-direct/client/index.d.cts +91 -0
  3. package/dist/exact-direct/client/index.d.ts +91 -0
  4. package/dist/exact-direct/client/index.js +203 -0
  5. package/dist/exact-direct/client/index.js.map +1 -0
  6. package/dist/exact-direct/client/index.mjs +175 -0
  7. package/dist/exact-direct/client/index.mjs.map +1 -0
  8. package/dist/exact-direct/facilitator/index.d.cts +110 -0
  9. package/dist/exact-direct/facilitator/index.d.ts +110 -0
  10. package/dist/exact-direct/facilitator/index.js +352 -0
  11. package/dist/exact-direct/facilitator/index.js.map +1 -0
  12. package/dist/exact-direct/facilitator/index.mjs +324 -0
  13. package/dist/exact-direct/facilitator/index.mjs.map +1 -0
  14. package/dist/exact-direct/server/index.d.cts +106 -0
  15. package/dist/exact-direct/server/index.d.ts +106 -0
  16. package/dist/exact-direct/server/index.js +220 -0
  17. package/dist/exact-direct/server/index.js.map +1 -0
  18. package/dist/exact-direct/server/index.mjs +192 -0
  19. package/dist/exact-direct/server/index.mjs.map +1 -0
  20. package/dist/index.d.cts +145 -0
  21. package/dist/index.d.ts +145 -0
  22. package/dist/index.js +759 -0
  23. package/dist/index.js.map +1 -0
  24. package/dist/index.mjs +687 -0
  25. package/dist/index.mjs.map +1 -0
  26. package/dist/types-kOweBf4U.d.cts +149 -0
  27. package/dist/types-kOweBf4U.d.ts +149 -0
  28. package/package.json +100 -0
  29. package/src/constants.ts +48 -0
  30. package/src/exact-direct/client/index.ts +12 -0
  31. package/src/exact-direct/client/register.ts +83 -0
  32. package/src/exact-direct/client/scheme.ts +148 -0
  33. package/src/exact-direct/facilitator/index.ts +12 -0
  34. package/src/exact-direct/facilitator/register.ts +74 -0
  35. package/src/exact-direct/facilitator/scheme.ts +300 -0
  36. package/src/exact-direct/server/index.ts +12 -0
  37. package/src/exact-direct/server/register.ts +65 -0
  38. package/src/exact-direct/server/scheme.ts +196 -0
  39. package/src/index.ts +58 -0
  40. package/src/tokens.ts +114 -0
  41. package/src/types.ts +174 -0
  42. package/src/utils.ts +240 -0
@@ -0,0 +1,220 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/exact-direct/server/index.ts
21
+ var server_exports = {};
22
+ __export(server_exports, {
23
+ ExactDirectAptosServer: () => ExactDirectAptosServer,
24
+ registerExactDirectAptosServer: () => registerExactDirectAptosServer
25
+ });
26
+ module.exports = __toCommonJS(server_exports);
27
+
28
+ // src/constants.ts
29
+ var APTOS_CAIP2_NAMESPACE = "aptos";
30
+ var APTOS_MAINNET_CAIP2 = "aptos:1";
31
+ var APTOS_TESTNET_CAIP2 = "aptos:2";
32
+ var APTOS_DEVNET_CAIP2 = "aptos:149";
33
+ var SCHEME_EXACT_DIRECT = "exact-direct";
34
+ var PRIMARY_FUNGIBLE_STORE_MODULE = "0x1::primary_fungible_store";
35
+ var FA_TRANSFER_FUNCTION = `${PRIMARY_FUNGIBLE_STORE_MODULE}::transfer`;
36
+
37
+ // src/tokens.ts
38
+ var TOKEN_REGISTRY = {
39
+ [APTOS_MAINNET_CAIP2]: [
40
+ {
41
+ metadataAddress: "0xf73e887a8754f540ee6e1a93bdc6dde2af69fc7ca5de32013e89dd44244473cb",
42
+ symbol: "USDT",
43
+ name: "Tether USD",
44
+ decimals: 6
45
+ },
46
+ {
47
+ metadataAddress: "0xbae207659db88bea0cbead6da0ed00aac12edcdda169e591cd41c94180b46f3b",
48
+ symbol: "USDC",
49
+ name: "USD Coin",
50
+ decimals: 6
51
+ }
52
+ ],
53
+ [APTOS_TESTNET_CAIP2]: [
54
+ {
55
+ // Testnet USDT (may differ from mainnet)
56
+ metadataAddress: "0xf73e887a8754f540ee6e1a93bdc6dde2af69fc7ca5de32013e89dd44244473cb",
57
+ symbol: "USDT",
58
+ name: "Tether USD",
59
+ decimals: 6
60
+ }
61
+ ],
62
+ [APTOS_DEVNET_CAIP2]: []
63
+ };
64
+ function getTokenConfig(network, symbol) {
65
+ const tokens = TOKEN_REGISTRY[network];
66
+ if (!tokens) return void 0;
67
+ return tokens.find(
68
+ (t) => t.symbol.toUpperCase() === symbol.toUpperCase()
69
+ );
70
+ }
71
+ var DEFAULT_TOKEN_SYMBOL = "USDT";
72
+ function getDefaultToken(network) {
73
+ return getTokenConfig(network, DEFAULT_TOKEN_SYMBOL);
74
+ }
75
+
76
+ // src/utils.ts
77
+ function isAptosNetwork(network) {
78
+ return network.startsWith(`${APTOS_CAIP2_NAMESPACE}:`);
79
+ }
80
+ function createAssetIdentifier(network, metadataAddress) {
81
+ return `${network}/fa:${metadataAddress}`;
82
+ }
83
+ function parseAmount(amount, decimals) {
84
+ const [whole, fractional = ""] = amount.split(".");
85
+ const paddedFractional = fractional.padEnd(decimals, "0").slice(0, decimals);
86
+ return BigInt(whole + paddedFractional);
87
+ }
88
+
89
+ // src/exact-direct/server/scheme.ts
90
+ var ExactDirectAptosServer = class {
91
+ scheme = SCHEME_EXACT_DIRECT;
92
+ moneyParsers = [];
93
+ config;
94
+ constructor(config = {}) {
95
+ this.config = config;
96
+ }
97
+ /**
98
+ * Register a custom money parser in the parser chain.
99
+ */
100
+ registerMoneyParser(parser) {
101
+ this.moneyParsers.push(parser);
102
+ return this;
103
+ }
104
+ /**
105
+ * Parse price into Aptos-specific amount
106
+ */
107
+ async parsePrice(price, network) {
108
+ if (!isAptosNetwork(network)) {
109
+ throw new Error(`Invalid Aptos network: ${network}`);
110
+ }
111
+ if (typeof price === "object" && price !== null && "amount" in price) {
112
+ if (!price.asset) {
113
+ throw new Error(`Asset address must be specified for AssetAmount on network ${network}`);
114
+ }
115
+ return {
116
+ amount: price.amount,
117
+ asset: price.asset,
118
+ extra: price.extra || {}
119
+ };
120
+ }
121
+ const amount = this.parseMoneyToDecimal(price);
122
+ for (const parser of this.moneyParsers) {
123
+ const result = await parser(amount, network);
124
+ if (result !== null) {
125
+ return result;
126
+ }
127
+ }
128
+ return this.defaultMoneyConversion(amount, network);
129
+ }
130
+ /**
131
+ * Enhance payment requirements with Aptos-specific details
132
+ */
133
+ async enhancePaymentRequirements(paymentRequirements, supportedKind, facilitatorExtensions) {
134
+ void facilitatorExtensions;
135
+ const extra = { ...paymentRequirements.extra };
136
+ if (supportedKind.extra?.assetSymbol) {
137
+ extra.assetSymbol = supportedKind.extra.assetSymbol;
138
+ }
139
+ if (supportedKind.extra?.assetDecimals) {
140
+ extra.assetDecimals = supportedKind.extra.assetDecimals;
141
+ }
142
+ return {
143
+ ...paymentRequirements,
144
+ extra
145
+ };
146
+ }
147
+ /**
148
+ * Parse Money (string | number) to a decimal number.
149
+ */
150
+ parseMoneyToDecimal(money) {
151
+ if (typeof money === "number") {
152
+ return money;
153
+ }
154
+ const cleanMoney = money.replace(/^\$/, "").trim();
155
+ const amount = parseFloat(cleanMoney);
156
+ if (isNaN(amount)) {
157
+ throw new Error(`Invalid money format: ${money}`);
158
+ }
159
+ return amount;
160
+ }
161
+ /**
162
+ * Default money conversion implementation.
163
+ */
164
+ defaultMoneyConversion(amount, network) {
165
+ const token = this.getDefaultAsset(network);
166
+ const tokenAmount = parseAmount(amount.toString(), token.decimals);
167
+ return {
168
+ amount: tokenAmount.toString(),
169
+ asset: createAssetIdentifier(network, token.metadataAddress),
170
+ extra: {
171
+ symbol: token.symbol,
172
+ name: token.name,
173
+ decimals: token.decimals
174
+ }
175
+ };
176
+ }
177
+ /**
178
+ * Get the default asset info for a network.
179
+ */
180
+ getDefaultAsset(network) {
181
+ if (this.config.preferredToken) {
182
+ const preferred = getTokenConfig(network, this.config.preferredToken);
183
+ if (preferred) return preferred;
184
+ }
185
+ const defaultToken = getDefaultToken(network);
186
+ if (defaultToken) return defaultToken;
187
+ throw new Error(`No tokens configured for network ${network}`);
188
+ }
189
+ /**
190
+ * Get all supported networks
191
+ */
192
+ static getSupportedNetworks() {
193
+ return Object.keys(TOKEN_REGISTRY);
194
+ }
195
+ /**
196
+ * Check if a network is supported
197
+ */
198
+ static isNetworkSupported(network) {
199
+ return network in TOKEN_REGISTRY;
200
+ }
201
+ };
202
+
203
+ // src/exact-direct/server/register.ts
204
+ function registerExactDirectAptosServer(server, config = {}) {
205
+ const scheme = new ExactDirectAptosServer(config.schemeConfig);
206
+ if (config.networks && config.networks.length > 0) {
207
+ config.networks.forEach((network) => {
208
+ server.register(network, scheme);
209
+ });
210
+ } else {
211
+ server.register("aptos:*", scheme);
212
+ }
213
+ return server;
214
+ }
215
+ // Annotate the CommonJS export names for ESM import in node:
216
+ 0 && (module.exports = {
217
+ ExactDirectAptosServer,
218
+ registerExactDirectAptosServer
219
+ });
220
+ //# sourceMappingURL=index.js.map
@@ -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":"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","names":[]}
@@ -0,0 +1,192 @@
1
+ // src/constants.ts
2
+ var APTOS_CAIP2_NAMESPACE = "aptos";
3
+ var APTOS_MAINNET_CAIP2 = "aptos:1";
4
+ var APTOS_TESTNET_CAIP2 = "aptos:2";
5
+ var APTOS_DEVNET_CAIP2 = "aptos:149";
6
+ var SCHEME_EXACT_DIRECT = "exact-direct";
7
+ var PRIMARY_FUNGIBLE_STORE_MODULE = "0x1::primary_fungible_store";
8
+ var FA_TRANSFER_FUNCTION = `${PRIMARY_FUNGIBLE_STORE_MODULE}::transfer`;
9
+
10
+ // src/tokens.ts
11
+ var TOKEN_REGISTRY = {
12
+ [APTOS_MAINNET_CAIP2]: [
13
+ {
14
+ metadataAddress: "0xf73e887a8754f540ee6e1a93bdc6dde2af69fc7ca5de32013e89dd44244473cb",
15
+ symbol: "USDT",
16
+ name: "Tether USD",
17
+ decimals: 6
18
+ },
19
+ {
20
+ metadataAddress: "0xbae207659db88bea0cbead6da0ed00aac12edcdda169e591cd41c94180b46f3b",
21
+ symbol: "USDC",
22
+ name: "USD Coin",
23
+ decimals: 6
24
+ }
25
+ ],
26
+ [APTOS_TESTNET_CAIP2]: [
27
+ {
28
+ // Testnet USDT (may differ from mainnet)
29
+ metadataAddress: "0xf73e887a8754f540ee6e1a93bdc6dde2af69fc7ca5de32013e89dd44244473cb",
30
+ symbol: "USDT",
31
+ name: "Tether USD",
32
+ decimals: 6
33
+ }
34
+ ],
35
+ [APTOS_DEVNET_CAIP2]: []
36
+ };
37
+ function getTokenConfig(network, symbol) {
38
+ const tokens = TOKEN_REGISTRY[network];
39
+ if (!tokens) return void 0;
40
+ return tokens.find(
41
+ (t) => t.symbol.toUpperCase() === symbol.toUpperCase()
42
+ );
43
+ }
44
+ var DEFAULT_TOKEN_SYMBOL = "USDT";
45
+ function getDefaultToken(network) {
46
+ return getTokenConfig(network, DEFAULT_TOKEN_SYMBOL);
47
+ }
48
+
49
+ // src/utils.ts
50
+ function isAptosNetwork(network) {
51
+ return network.startsWith(`${APTOS_CAIP2_NAMESPACE}:`);
52
+ }
53
+ function createAssetIdentifier(network, metadataAddress) {
54
+ return `${network}/fa:${metadataAddress}`;
55
+ }
56
+ function parseAmount(amount, decimals) {
57
+ const [whole, fractional = ""] = amount.split(".");
58
+ const paddedFractional = fractional.padEnd(decimals, "0").slice(0, decimals);
59
+ return BigInt(whole + paddedFractional);
60
+ }
61
+
62
+ // src/exact-direct/server/scheme.ts
63
+ var ExactDirectAptosServer = class {
64
+ scheme = SCHEME_EXACT_DIRECT;
65
+ moneyParsers = [];
66
+ config;
67
+ constructor(config = {}) {
68
+ this.config = config;
69
+ }
70
+ /**
71
+ * Register a custom money parser in the parser chain.
72
+ */
73
+ registerMoneyParser(parser) {
74
+ this.moneyParsers.push(parser);
75
+ return this;
76
+ }
77
+ /**
78
+ * Parse price into Aptos-specific amount
79
+ */
80
+ async parsePrice(price, network) {
81
+ if (!isAptosNetwork(network)) {
82
+ throw new Error(`Invalid Aptos network: ${network}`);
83
+ }
84
+ if (typeof price === "object" && price !== null && "amount" in price) {
85
+ if (!price.asset) {
86
+ throw new Error(`Asset address must be specified for AssetAmount on network ${network}`);
87
+ }
88
+ return {
89
+ amount: price.amount,
90
+ asset: price.asset,
91
+ extra: price.extra || {}
92
+ };
93
+ }
94
+ const amount = this.parseMoneyToDecimal(price);
95
+ for (const parser of this.moneyParsers) {
96
+ const result = await parser(amount, network);
97
+ if (result !== null) {
98
+ return result;
99
+ }
100
+ }
101
+ return this.defaultMoneyConversion(amount, network);
102
+ }
103
+ /**
104
+ * Enhance payment requirements with Aptos-specific details
105
+ */
106
+ async enhancePaymentRequirements(paymentRequirements, supportedKind, facilitatorExtensions) {
107
+ void facilitatorExtensions;
108
+ const extra = { ...paymentRequirements.extra };
109
+ if (supportedKind.extra?.assetSymbol) {
110
+ extra.assetSymbol = supportedKind.extra.assetSymbol;
111
+ }
112
+ if (supportedKind.extra?.assetDecimals) {
113
+ extra.assetDecimals = supportedKind.extra.assetDecimals;
114
+ }
115
+ return {
116
+ ...paymentRequirements,
117
+ extra
118
+ };
119
+ }
120
+ /**
121
+ * Parse Money (string | number) to a decimal number.
122
+ */
123
+ parseMoneyToDecimal(money) {
124
+ if (typeof money === "number") {
125
+ return money;
126
+ }
127
+ const cleanMoney = money.replace(/^\$/, "").trim();
128
+ const amount = parseFloat(cleanMoney);
129
+ if (isNaN(amount)) {
130
+ throw new Error(`Invalid money format: ${money}`);
131
+ }
132
+ return amount;
133
+ }
134
+ /**
135
+ * Default money conversion implementation.
136
+ */
137
+ defaultMoneyConversion(amount, network) {
138
+ const token = this.getDefaultAsset(network);
139
+ const tokenAmount = parseAmount(amount.toString(), token.decimals);
140
+ return {
141
+ amount: tokenAmount.toString(),
142
+ asset: createAssetIdentifier(network, token.metadataAddress),
143
+ extra: {
144
+ symbol: token.symbol,
145
+ name: token.name,
146
+ decimals: token.decimals
147
+ }
148
+ };
149
+ }
150
+ /**
151
+ * Get the default asset info for a network.
152
+ */
153
+ getDefaultAsset(network) {
154
+ if (this.config.preferredToken) {
155
+ const preferred = getTokenConfig(network, this.config.preferredToken);
156
+ if (preferred) return preferred;
157
+ }
158
+ const defaultToken = getDefaultToken(network);
159
+ if (defaultToken) return defaultToken;
160
+ throw new Error(`No tokens configured for network ${network}`);
161
+ }
162
+ /**
163
+ * Get all supported networks
164
+ */
165
+ static getSupportedNetworks() {
166
+ return Object.keys(TOKEN_REGISTRY);
167
+ }
168
+ /**
169
+ * Check if a network is supported
170
+ */
171
+ static isNetworkSupported(network) {
172
+ return network in TOKEN_REGISTRY;
173
+ }
174
+ };
175
+
176
+ // src/exact-direct/server/register.ts
177
+ function registerExactDirectAptosServer(server, config = {}) {
178
+ const scheme = new ExactDirectAptosServer(config.schemeConfig);
179
+ if (config.networks && config.networks.length > 0) {
180
+ config.networks.forEach((network) => {
181
+ server.register(network, scheme);
182
+ });
183
+ } else {
184
+ server.register("aptos:*", scheme);
185
+ }
186
+ return server;
187
+ }
188
+ export {
189
+ ExactDirectAptosServer,
190
+ registerExactDirectAptosServer
191
+ };
192
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/constants.ts","../../../src/tokens.ts","../../../src/utils.ts","../../../src/exact-direct/server/scheme.ts","../../../src/exact-direct/server/register.ts"],"sourcesContent":["/**\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":"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","names":[]}
@@ -0,0 +1,145 @@
1
+ import { A as AptosTransactionEvent, P as ParsedFATransfer, a as AptosTransactionResult } from './types-kOweBf4U.cjs';
2
+ export { c as AptosStateChange, b as AptosTransactionPayload, C as ClientAptosSigner, E as ExactDirectAptosPayload, F as FacilitatorAptosSigner, e as extractChainId } from './types-kOweBf4U.cjs';
3
+ import { Network } from '@t402/core/types';
4
+ export { AptosClientConfig, ExactDirectAptosClient, ExactDirectAptosClientConfig, registerExactDirectAptosClient } from './exact-direct/client/index.cjs';
5
+ export { AptosServerConfig, ExactDirectAptosServer, ExactDirectAptosServerConfig, registerExactDirectAptosServer } from './exact-direct/server/index.cjs';
6
+ export { AptosFacilitatorConfig, ExactDirectAptosFacilitator, ExactDirectAptosFacilitatorConfig, registerExactDirectAptosFacilitator } from './exact-direct/facilitator/index.cjs';
7
+ import '@t402/core/client';
8
+ import '@t402/core/server';
9
+ import '@t402/core/facilitator';
10
+
11
+ /**
12
+ * Aptos Network Constants
13
+ */
14
+ declare const APTOS_CAIP2_NAMESPACE = "aptos";
15
+ declare const APTOS_MAINNET_CAIP2 = "aptos:1";
16
+ declare const APTOS_TESTNET_CAIP2 = "aptos:2";
17
+ declare const APTOS_DEVNET_CAIP2 = "aptos:149";
18
+ declare const APTOS_NETWORKS: readonly ["aptos:1", "aptos:2", "aptos:149"];
19
+ type AptosNetwork = (typeof APTOS_NETWORKS)[number];
20
+ declare const APTOS_MAINNET_CHAIN_ID = 1;
21
+ declare const APTOS_TESTNET_CHAIN_ID = 2;
22
+ declare const APTOS_DEVNET_CHAIN_ID = 149;
23
+ declare const DEFAULT_MAINNET_RPC = "https://fullnode.mainnet.aptoslabs.com/v1";
24
+ declare const DEFAULT_TESTNET_RPC = "https://fullnode.testnet.aptoslabs.com/v1";
25
+ declare const DEFAULT_DEVNET_RPC = "https://fullnode.devnet.aptoslabs.com/v1";
26
+ declare const SCHEME_EXACT_DIRECT = "exact-direct";
27
+ declare const PRIMARY_FUNGIBLE_STORE_MODULE = "0x1::primary_fungible_store";
28
+ declare const FUNGIBLE_ASSET_MODULE = "0x1::fungible_asset";
29
+ declare const APTOS_ACCOUNT_MODULE = "0x1::aptos_account";
30
+ declare const FA_TRANSFER_FUNCTION = "0x1::primary_fungible_store::transfer";
31
+ declare const DEFAULT_MAX_GAS_AMOUNT = 100000n;
32
+ declare const DEFAULT_GAS_UNIT_PRICE = 100n;
33
+ declare const DEFAULT_TX_EXPIRATION_SECONDS = 600;
34
+
35
+ /**
36
+ * Aptos Token Registry
37
+ *
38
+ * Token addresses for supported stablecoins on Aptos networks.
39
+ * All tokens use the Fungible Asset (FA) standard.
40
+ */
41
+ /**
42
+ * Token configuration for Aptos fungible assets
43
+ */
44
+ interface TokenConfig {
45
+ /** Fungible Asset metadata address */
46
+ metadataAddress: string;
47
+ /** Token symbol (e.g., "USDT", "USDC") */
48
+ symbol: string;
49
+ /** Token name */
50
+ name: string;
51
+ /** Decimal places */
52
+ decimals: number;
53
+ }
54
+ /**
55
+ * Token registry mapping network -> tokens
56
+ */
57
+ declare const TOKEN_REGISTRY: Record<string, TokenConfig[]>;
58
+ /**
59
+ * Get token configuration for a specific network and symbol
60
+ */
61
+ declare function getTokenConfig(network: string, symbol: string): TokenConfig | undefined;
62
+ /**
63
+ * Get all supported tokens for a network
64
+ */
65
+ declare function getSupportedTokens(network: string): TokenConfig[];
66
+ /**
67
+ * Check if a token is supported on a network
68
+ */
69
+ declare function isTokenSupported(network: string, symbol: string): boolean;
70
+ /**
71
+ * Get token by metadata address
72
+ */
73
+ declare function getTokenByAddress(network: string, metadataAddress: string): TokenConfig | undefined;
74
+ /**
75
+ * Default token symbol for payments (USDT)
76
+ */
77
+ declare const DEFAULT_TOKEN_SYMBOL = "USDT";
78
+ /**
79
+ * Get the default token for a network
80
+ */
81
+ declare function getDefaultToken(network: string): TokenConfig | undefined;
82
+
83
+ /**
84
+ * Aptos Utility Functions
85
+ */
86
+
87
+ /**
88
+ * Validate Aptos address format
89
+ * Aptos addresses are 64 hex characters (32 bytes) with 0x prefix
90
+ */
91
+ declare function isValidAptosAddress(address: string): boolean;
92
+ /**
93
+ * Normalize Aptos address to full 64-character format
94
+ */
95
+ declare function normalizeAptosAddress(address: string): string;
96
+ /**
97
+ * Compare two Aptos addresses (case-insensitive, handles short addresses)
98
+ */
99
+ declare function compareAddresses(addr1: string, addr2: string): boolean;
100
+ /**
101
+ * Validate transaction hash format
102
+ */
103
+ declare function isValidTxHash(txHash: string): boolean;
104
+ /**
105
+ * Get default RPC URL for a network
106
+ */
107
+ declare function getDefaultRpcUrl(network: Network): string;
108
+ /**
109
+ * Check if a network identifier is for Aptos
110
+ */
111
+ declare function isAptosNetwork(network: Network): boolean;
112
+ /**
113
+ * Parse CAIP-19 asset identifier for Aptos
114
+ * Format: aptos:1/fa:0x...
115
+ */
116
+ declare function parseAssetIdentifier(asset: string): {
117
+ network: Network;
118
+ metadataAddress: string;
119
+ } | null;
120
+ /**
121
+ * Create CAIP-19 asset identifier for Aptos FA
122
+ */
123
+ declare function createAssetIdentifier(network: Network, metadataAddress: string): string;
124
+ /**
125
+ * Parse fungible asset transfer from transaction events
126
+ */
127
+ declare function parseFATransferFromEvents(events: AptosTransactionEvent[]): ParsedFATransfer | null;
128
+ /**
129
+ * Check if transaction is a FA transfer
130
+ */
131
+ declare function isFATransferTransaction(tx: AptosTransactionResult): boolean;
132
+ /**
133
+ * Extract transfer details from transaction
134
+ */
135
+ declare function extractTransferDetails(tx: AptosTransactionResult): ParsedFATransfer | null;
136
+ /**
137
+ * Format amount with decimals for display
138
+ */
139
+ declare function formatAmount(amount: bigint, decimals: number): string;
140
+ /**
141
+ * Parse amount string to bigint
142
+ */
143
+ declare function parseAmount(amount: string, decimals: number): bigint;
144
+
145
+ export { APTOS_ACCOUNT_MODULE, APTOS_CAIP2_NAMESPACE, APTOS_DEVNET_CAIP2, APTOS_DEVNET_CHAIN_ID, APTOS_MAINNET_CAIP2, APTOS_MAINNET_CHAIN_ID, APTOS_NETWORKS, APTOS_TESTNET_CAIP2, APTOS_TESTNET_CHAIN_ID, type AptosNetwork, AptosTransactionEvent, AptosTransactionResult, DEFAULT_DEVNET_RPC, DEFAULT_GAS_UNIT_PRICE, DEFAULT_MAINNET_RPC, DEFAULT_MAX_GAS_AMOUNT, DEFAULT_TESTNET_RPC, DEFAULT_TOKEN_SYMBOL, DEFAULT_TX_EXPIRATION_SECONDS, FA_TRANSFER_FUNCTION, FUNGIBLE_ASSET_MODULE, PRIMARY_FUNGIBLE_STORE_MODULE, ParsedFATransfer, SCHEME_EXACT_DIRECT, TOKEN_REGISTRY, type TokenConfig, compareAddresses, createAssetIdentifier, extractTransferDetails, formatAmount, getDefaultRpcUrl, getDefaultToken, getSupportedTokens, getTokenByAddress, getTokenConfig, isAptosNetwork, isFATransferTransaction, isTokenSupported, isValidAptosAddress, isValidTxHash, normalizeAptosAddress, parseAmount, parseAssetIdentifier, parseFATransferFromEvents };