@t402/ton 2.0.0 → 2.1.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 (33) hide show
  1. package/dist/cjs/exact/client/index.d.ts +61 -2
  2. package/dist/cjs/exact/client/index.js +26 -2
  3. package/dist/cjs/exact/client/index.js.map +1 -1
  4. package/dist/cjs/exact/facilitator/index.d.ts +62 -2
  5. package/dist/cjs/exact/facilitator/index.js +10 -2
  6. package/dist/cjs/exact/facilitator/index.js.map +1 -1
  7. package/dist/cjs/exact/server/index.d.ts +42 -1
  8. package/dist/cjs/exact/server/index.js +17 -2
  9. package/dist/cjs/exact/server/index.js.map +1 -1
  10. package/dist/cjs/index.d.ts +6 -1
  11. package/dist/cjs/index.js +503 -9
  12. package/dist/cjs/index.js.map +1 -1
  13. package/dist/esm/chunk-P6JLVB4E.mjs +300 -0
  14. package/dist/esm/chunk-P6JLVB4E.mjs.map +1 -0
  15. package/dist/esm/chunk-UB4QVIUC.mjs +266 -0
  16. package/dist/esm/chunk-UB4QVIUC.mjs.map +1 -0
  17. package/dist/esm/{chunk-ZCMWKFVA.mjs → chunk-XNO6XEWS.mjs} +25 -2
  18. package/dist/esm/chunk-XNO6XEWS.mjs.map +1 -0
  19. package/dist/esm/exact/client/index.d.mts +61 -2
  20. package/dist/esm/exact/client/index.mjs +5 -3
  21. package/dist/esm/exact/facilitator/index.d.mts +62 -2
  22. package/dist/esm/exact/facilitator/index.mjs +6 -254
  23. package/dist/esm/exact/facilitator/index.mjs.map +1 -1
  24. package/dist/esm/exact/server/index.d.mts +42 -1
  25. package/dist/esm/exact/server/index.mjs +6 -208
  26. package/dist/esm/exact/server/index.mjs.map +1 -1
  27. package/dist/esm/index.d.mts +6 -1
  28. package/dist/esm/index.mjs +12 -4
  29. package/dist/esm/index.mjs.map +1 -1
  30. package/package.json +1 -1
  31. package/dist/esm/chunk-RST5PY7E.mjs +0 -85
  32. package/dist/esm/chunk-RST5PY7E.mjs.map +0 -1
  33. package/dist/esm/chunk-ZCMWKFVA.mjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/signer.ts"],"sourcesContent":["/**\n * TON Signer Interfaces\n *\n * Defines the signer interfaces for t402 client and facilitator operations.\n * These interfaces abstract away the specific wallet implementation,\n * allowing integration with various TON wallets and signing mechanisms.\n */\n\nimport type { Address, Cell, SendMode } from \"@ton/core\";\nimport type { VerifyMessageResult, TransactionConfirmation } from \"./types.js\";\n\n/**\n * Parameters for signing a TON internal message\n */\nexport type SignMessageParams = {\n /** Destination address (typically Jetton wallet contract) */\n to: Address;\n /** Amount of TON to attach (for gas) in nanoTON */\n value: bigint;\n /** Message body (Jetton transfer cell) */\n body: Cell;\n /** Send mode flags (optional, defaults to PAY_GAS_SEPARATELY) */\n sendMode?: SendMode;\n /** Bounce flag (optional, defaults to true) */\n bounce?: boolean;\n /** Message validity timeout in seconds (optional) */\n timeout?: number;\n};\n\n/**\n * ClientTonSigner - Used by t402 clients to sign Jetton transfer messages\n *\n * This interface represents a TON wallet that can:\n * - Sign internal messages for Jetton transfers\n * - Query its own seqno (sequence number)\n *\n * Implementations may include:\n * - WalletContractV4 with private key\n * - TonConnect wallet adapter\n * - Hardware wallet integration\n */\nexport type ClientTonSigner = {\n /** The wallet address */\n readonly address: Address;\n\n /**\n * Sign an internal message for Jetton transfer\n * Returns the complete signed external message ready for broadcast\n *\n * @param params - Message parameters\n * @returns Signed external message as Cell (BOC)\n */\n signMessage(params: SignMessageParams): Promise<Cell>;\n\n /**\n * Get current seqno for the wallet\n * Used for replay protection\n *\n * @returns Current sequence number\n */\n getSeqno(): Promise<number>;\n};\n\n/**\n * Parameters for verifying a signed message\n */\nexport type VerifyMessageParams = {\n /** The signed BOC from client (base64) */\n signedBoc: string;\n /** Expected sender address */\n expectedFrom: string;\n /** Expected Jetton transfer details */\n expectedTransfer: {\n /** Expected Jetton amount */\n jettonAmount: bigint;\n /** Expected destination address */\n destination: string;\n /** Jetton master address */\n jettonMaster: string;\n };\n};\n\n/**\n * Parameters for waiting on transaction confirmation\n */\nexport type WaitForTransactionParams = {\n /** Address to monitor */\n address: string;\n /** Expected seqno after transaction */\n seqno: number;\n /** Timeout in milliseconds (optional) */\n timeout?: number;\n};\n\n/**\n * FacilitatorTonSigner - Used by t402 facilitators to verify and settle payments\n *\n * This interface combines RPC capabilities with signing abilities:\n * - Query Jetton balances and wallet addresses\n * - Verify signed messages\n * - Broadcast transactions\n * - Wait for confirmations\n */\nexport type FacilitatorTonSigner = {\n /**\n * Get all addresses this facilitator can use for signing\n * Enables dynamic address selection for load balancing\n */\n getAddresses(): readonly string[];\n\n /**\n * Query Jetton balance for an owner\n *\n * @param params - Owner and Jetton master addresses\n * @returns Balance in smallest units\n */\n getJettonBalance(params: { ownerAddress: string; jettonMasterAddress: string }): Promise<bigint>;\n\n /**\n * Get Jetton wallet address for an owner\n * Derives the associated Jetton wallet contract address\n *\n * @param params - Owner and Jetton master addresses\n * @returns Jetton wallet address\n */\n getJettonWalletAddress(params: {\n ownerAddress: string;\n jettonMasterAddress: string;\n }): Promise<string>;\n\n /**\n * Verify a signed message matches expected parameters\n * Validates the BOC structure and transfer details\n *\n * @param params - Verification parameters\n * @returns Verification result\n */\n verifyMessage(params: VerifyMessageParams): Promise<VerifyMessageResult>;\n\n /**\n * Send a pre-signed external message to the network\n *\n * @param signedBoc - Base64 encoded signed BOC\n * @returns Transaction hash or identifier\n */\n sendExternalMessage(signedBoc: string): Promise<string>;\n\n /**\n * Wait for transaction confirmation\n *\n * @param params - Transaction monitoring parameters\n * @returns Confirmation result\n */\n waitForTransaction(params: WaitForTransactionParams): Promise<TransactionConfirmation>;\n\n /**\n * Get current seqno for an address\n *\n * @param address - Wallet address to query\n * @returns Current seqno\n */\n getSeqno(address: string): Promise<number>;\n\n /**\n * Check if a wallet is deployed (active)\n *\n * @param address - Address to check\n * @returns true if deployed\n */\n isDeployed(address: string): Promise<boolean>;\n};\n\n/**\n * Converts a TON wallet to a ClientTonSigner\n * Identity function for type compatibility\n *\n * @param signer - The signer to convert\n * @returns The same signer with ClientTonSigner type\n */\nexport function toClientTonSigner(signer: ClientTonSigner): ClientTonSigner {\n return signer;\n}\n\n/**\n * Creates a FacilitatorTonSigner from a single-address facilitator\n * Wraps the single address in a getAddresses() function for compatibility\n *\n * @param client - Facilitator client with single address\n * @returns FacilitatorTonSigner with getAddresses() support\n */\nexport function toFacilitatorTonSigner(\n client: Omit<FacilitatorTonSigner, \"getAddresses\"> & { address: string },\n): FacilitatorTonSigner {\n return {\n ...client,\n getAddresses: () => [client.address],\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmLO,SAAS,kBAAkB,QAA0C;AAC1E,SAAO;AACT;AASO,SAAS,uBACd,QACsB;AACtB,SAAO;AAAA,IACL,GAAG;AAAA,IACH,cAAc,MAAM,CAAC,OAAO,OAAO;AAAA,EACrC;AACF;","names":[]}
1
+ {"version":3,"sources":["../../src/signer.ts"],"sourcesContent":["/**\n * TON Signer Interfaces\n *\n * Defines the signer interfaces for t402 client and facilitator operations.\n * These interfaces abstract away the specific wallet implementation,\n * allowing integration with various TON wallets and signing mechanisms.\n */\n\nimport type { Address, Cell, SendMode } from \"@ton/core\";\nimport type { VerifyMessageResult, TransactionConfirmation } from \"./types.js\";\n\n/**\n * Parameters for signing a TON internal message\n */\nexport type SignMessageParams = {\n /** Destination address (typically Jetton wallet contract) */\n to: Address;\n /** Amount of TON to attach (for gas) in nanoTON */\n value: bigint;\n /** Message body (Jetton transfer cell) */\n body: Cell;\n /** Send mode flags (optional, defaults to PAY_GAS_SEPARATELY) */\n sendMode?: SendMode;\n /** Bounce flag (optional, defaults to true) */\n bounce?: boolean;\n /** Message validity timeout in seconds (optional) */\n timeout?: number;\n};\n\n/**\n * ClientTonSigner - Used by t402 clients to sign Jetton transfer messages\n *\n * This interface represents a TON wallet that can:\n * - Sign internal messages for Jetton transfers\n * - Query its own seqno (sequence number)\n *\n * Implementations may include:\n * - WalletContractV4 with private key\n * - TonConnect wallet adapter\n * - Hardware wallet integration\n */\nexport type ClientTonSigner = {\n /** The wallet address */\n readonly address: Address;\n\n /**\n * Sign an internal message for Jetton transfer\n * Returns the complete signed external message ready for broadcast\n *\n * @param params - Message parameters\n * @returns Signed external message as Cell (BOC)\n */\n signMessage(params: SignMessageParams): Promise<Cell>;\n\n /**\n * Get current seqno for the wallet\n * Used for replay protection\n *\n * @returns Current sequence number\n */\n getSeqno(): Promise<number>;\n};\n\n/**\n * Parameters for verifying a signed message\n */\nexport type VerifyMessageParams = {\n /** The signed BOC from client (base64) */\n signedBoc: string;\n /** Expected sender address */\n expectedFrom: string;\n /** Expected Jetton transfer details */\n expectedTransfer: {\n /** Expected Jetton amount */\n jettonAmount: bigint;\n /** Expected destination address */\n destination: string;\n /** Jetton master address */\n jettonMaster: string;\n };\n};\n\n/**\n * Parameters for waiting on transaction confirmation\n */\nexport type WaitForTransactionParams = {\n /** Address to monitor */\n address: string;\n /** Expected seqno after transaction */\n seqno: number;\n /** Timeout in milliseconds (optional) */\n timeout?: number;\n};\n\n/**\n * FacilitatorTonSigner - Used by t402 facilitators to verify and settle payments\n *\n * This interface combines RPC capabilities with signing abilities:\n * - Query Jetton balances and wallet addresses\n * - Verify signed messages\n * - Broadcast transactions\n * - Wait for confirmations\n */\nexport type FacilitatorTonSigner = {\n /**\n * Get all addresses this facilitator can use for signing\n * Enables dynamic address selection for load balancing\n */\n getAddresses(): readonly string[];\n\n /**\n * Query Jetton balance for an owner\n *\n * @param params - Owner and Jetton master addresses\n * @returns Balance in smallest units\n */\n getJettonBalance(params: { ownerAddress: string; jettonMasterAddress: string }): Promise<bigint>;\n\n /**\n * Get Jetton wallet address for an owner\n * Derives the associated Jetton wallet contract address\n *\n * @param params - Owner and Jetton master addresses\n * @returns Jetton wallet address\n */\n getJettonWalletAddress(params: {\n ownerAddress: string;\n jettonMasterAddress: string;\n }): Promise<string>;\n\n /**\n * Verify a signed message matches expected parameters\n * Validates the BOC structure and transfer details\n *\n * @param params - Verification parameters\n * @returns Verification result\n */\n verifyMessage(params: VerifyMessageParams): Promise<VerifyMessageResult>;\n\n /**\n * Send a pre-signed external message to the network\n *\n * @param signedBoc - Base64 encoded signed BOC\n * @returns Transaction hash or identifier\n */\n sendExternalMessage(signedBoc: string): Promise<string>;\n\n /**\n * Wait for transaction confirmation\n *\n * @param params - Transaction monitoring parameters\n * @returns Confirmation result\n */\n waitForTransaction(params: WaitForTransactionParams): Promise<TransactionConfirmation>;\n\n /**\n * Get current seqno for an address\n *\n * @param address - Wallet address to query\n * @returns Current seqno\n */\n getSeqno(address: string): Promise<number>;\n\n /**\n * Check if a wallet is deployed (active)\n *\n * @param address - Address to check\n * @returns true if deployed\n */\n isDeployed(address: string): Promise<boolean>;\n};\n\n/**\n * Converts a TON wallet to a ClientTonSigner\n * Identity function for type compatibility\n *\n * @param signer - The signer to convert\n * @returns The same signer with ClientTonSigner type\n */\nexport function toClientTonSigner(signer: ClientTonSigner): ClientTonSigner {\n return signer;\n}\n\n/**\n * Creates a FacilitatorTonSigner from a single-address facilitator\n * Wraps the single address in a getAddresses() function for compatibility\n *\n * @param client - Facilitator client with single address\n * @returns FacilitatorTonSigner with getAddresses() support\n */\nexport function toFacilitatorTonSigner(\n client: Omit<FacilitatorTonSigner, \"getAddresses\"> & { address: string },\n): FacilitatorTonSigner {\n return {\n ...client,\n getAddresses: () => [client.address],\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmLO,SAAS,kBAAkB,QAA0C;AAC1E,SAAO;AACT;AASO,SAAS,uBACd,QACsB;AACtB,SAAO;AAAA,IACL,GAAG;AAAA,IACH,cAAc,MAAM,CAAC,OAAO,OAAO;AAAA,EACrC;AACF;","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@t402/ton",
3
- "version": "2.0.0",
3
+ "version": "2.1.0",
4
4
  "main": "./dist/cjs/index.js",
5
5
  "module": "./dist/esm/index.js",
6
6
  "types": "./dist/cjs/index.d.ts",
@@ -1,85 +0,0 @@
1
- import {
2
- TON_MAINNET_CAIP2,
3
- TON_TESTNET_CAIP2
4
- } from "./chunk-6LOUEHJT.mjs";
5
-
6
- // src/tokens.ts
7
- var USDT_ADDRESSES = {
8
- // TON Mainnet - Official Tether USDT
9
- [TON_MAINNET_CAIP2]: "EQCxE6mUtQJKFnGfaROTKOt1lZbDiiX1kCixRv7Nw2Id_sDs",
10
- // TON Testnet - Test USDT (may vary)
11
- [TON_TESTNET_CAIP2]: "kQBqSpvo4S87mX9tTc4FX3Sfqf4uSp3Tx-Fz4RBUfTRWBx"
12
- };
13
- var JETTON_REGISTRY = {
14
- // TON Mainnet
15
- [TON_MAINNET_CAIP2]: {
16
- USDT: {
17
- masterAddress: USDT_ADDRESSES[TON_MAINNET_CAIP2],
18
- symbol: "USDT",
19
- name: "Tether USD",
20
- decimals: 6,
21
- priority: 1
22
- }
23
- },
24
- // TON Testnet
25
- [TON_TESTNET_CAIP2]: {
26
- USDT: {
27
- masterAddress: USDT_ADDRESSES[TON_TESTNET_CAIP2],
28
- symbol: "USDT",
29
- name: "Tether USD (Testnet)",
30
- decimals: 6,
31
- priority: 1
32
- }
33
- }
34
- };
35
- function getJettonConfig(network, symbol) {
36
- return JETTON_REGISTRY[network]?.[symbol.toUpperCase()];
37
- }
38
- function getNetworkJettons(network) {
39
- const jettons = JETTON_REGISTRY[network];
40
- if (!jettons) return [];
41
- return Object.values(jettons).sort((a, b) => a.priority - b.priority);
42
- }
43
- function getDefaultJetton(network) {
44
- const jettons = getNetworkJettons(network);
45
- return jettons[0];
46
- }
47
- function getJettonByAddress(network, address) {
48
- const jettons = JETTON_REGISTRY[network];
49
- if (!jettons) return void 0;
50
- return Object.values(jettons).find(
51
- (j) => j.masterAddress.toLowerCase() === address.toLowerCase()
52
- );
53
- }
54
- function getNetworksForJetton(symbol) {
55
- const networks = [];
56
- for (const [network, jettons] of Object.entries(JETTON_REGISTRY)) {
57
- if (jettons[symbol.toUpperCase()]) {
58
- networks.push(network);
59
- }
60
- }
61
- return networks;
62
- }
63
- function getUsdtNetworks() {
64
- return getNetworksForJetton("USDT");
65
- }
66
- function isNetworkSupported(network) {
67
- return network in JETTON_REGISTRY;
68
- }
69
- function getSupportedNetworks() {
70
- return Object.keys(JETTON_REGISTRY);
71
- }
72
-
73
- export {
74
- USDT_ADDRESSES,
75
- JETTON_REGISTRY,
76
- getJettonConfig,
77
- getNetworkJettons,
78
- getDefaultJetton,
79
- getJettonByAddress,
80
- getNetworksForJetton,
81
- getUsdtNetworks,
82
- isNetworkSupported,
83
- getSupportedNetworks
84
- };
85
- //# sourceMappingURL=chunk-RST5PY7E.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/tokens.ts"],"sourcesContent":["/**\n * TON Jetton Token Configuration\n *\n * This module provides comprehensive Jetton token definitions including:\n * - USDT (Tether USD on TON)\n * - Network-specific configurations\n * - Helper functions for token lookups\n */\n\nimport { TON_MAINNET_CAIP2, TON_TESTNET_CAIP2 } from \"./constants.js\";\n\n/**\n * Jetton token configuration\n */\nexport interface JettonConfig {\n /** Jetton master contract address (friendly format) */\n masterAddress: string;\n /** Token symbol */\n symbol: string;\n /** Token name */\n name: string;\n /** Number of decimal places */\n decimals: number;\n /** Payment priority (lower = higher priority) */\n priority: number;\n}\n\n/**\n * Network token registry mapping network -> symbol -> config\n */\nexport type NetworkJettonRegistry = Record<string, Record<string, JettonConfig>>;\n\n/**\n * USDT Jetton Master Contract Addresses by Network\n *\n * USDT on TON follows the TEP-74 Jetton standard.\n * @see https://docs.tether.to/tether-on-ton\n */\nexport const USDT_ADDRESSES: Record<string, string> = {\n // TON Mainnet - Official Tether USDT\n [TON_MAINNET_CAIP2]: \"EQCxE6mUtQJKFnGfaROTKOt1lZbDiiX1kCixRv7Nw2Id_sDs\",\n // TON Testnet - Test USDT (may vary)\n [TON_TESTNET_CAIP2]: \"kQBqSpvo4S87mX9tTc4FX3Sfqf4uSp3Tx-Fz4RBUfTRWBx\",\n};\n\n/**\n * Complete Jetton registry with all supported tokens per network\n */\nexport const JETTON_REGISTRY: NetworkJettonRegistry = {\n // TON Mainnet\n [TON_MAINNET_CAIP2]: {\n USDT: {\n masterAddress: USDT_ADDRESSES[TON_MAINNET_CAIP2],\n symbol: \"USDT\",\n name: \"Tether USD\",\n decimals: 6,\n priority: 1,\n },\n },\n\n // TON Testnet\n [TON_TESTNET_CAIP2]: {\n USDT: {\n masterAddress: USDT_ADDRESSES[TON_TESTNET_CAIP2],\n symbol: \"USDT\",\n name: \"Tether USD (Testnet)\",\n decimals: 6,\n priority: 1,\n },\n },\n};\n\n/**\n * Get Jetton configuration for a specific token on a network\n *\n * @param network - Network identifier (CAIP-2 format)\n * @param symbol - Token symbol (e.g., \"USDT\")\n * @returns Jetton configuration or undefined\n */\nexport function getJettonConfig(network: string, symbol: string): JettonConfig | undefined {\n return JETTON_REGISTRY[network]?.[symbol.toUpperCase()];\n}\n\n/**\n * Get all Jettons available on a network\n *\n * @param network - Network identifier\n * @returns Array of Jetton configurations sorted by priority\n */\nexport function getNetworkJettons(network: string): JettonConfig[] {\n const jettons = JETTON_REGISTRY[network];\n if (!jettons) return [];\n return Object.values(jettons).sort((a, b) => a.priority - b.priority);\n}\n\n/**\n * Get the default/preferred Jetton for a network\n * Prefers USDT based on priority\n *\n * @param network - Network identifier\n * @returns Default Jetton configuration or undefined\n */\nexport function getDefaultJetton(network: string): JettonConfig | undefined {\n const jettons = getNetworkJettons(network);\n return jettons[0]; // Already sorted by priority\n}\n\n/**\n * Get Jetton by master contract address on a network\n *\n * @param network - Network identifier\n * @param address - Jetton master contract address\n * @returns Jetton configuration or undefined\n */\nexport function getJettonByAddress(network: string, address: string): JettonConfig | undefined {\n const jettons = JETTON_REGISTRY[network];\n if (!jettons) return undefined;\n\n // Normalize address comparison (case-insensitive for base64)\n return Object.values(jettons).find(\n (j) => j.masterAddress.toLowerCase() === address.toLowerCase(),\n );\n}\n\n/**\n * Get all networks that support a specific Jetton\n *\n * @param symbol - Token symbol\n * @returns Array of network identifiers\n */\nexport function getNetworksForJetton(symbol: string): string[] {\n const networks: string[] = [];\n for (const [network, jettons] of Object.entries(JETTON_REGISTRY)) {\n if (jettons[symbol.toUpperCase()]) {\n networks.push(network);\n }\n }\n return networks;\n}\n\n/**\n * Get USDT networks on TON\n *\n * @returns Array of networks supporting USDT\n */\nexport function getUsdtNetworks(): string[] {\n return getNetworksForJetton(\"USDT\");\n}\n\n/**\n * Check if a network is supported\n *\n * @param network - Network identifier to check\n * @returns true if network has configured Jettons\n */\nexport function isNetworkSupported(network: string): boolean {\n return network in JETTON_REGISTRY;\n}\n\n/**\n * Get all supported networks\n *\n * @returns Array of all supported network identifiers\n */\nexport function getSupportedNetworks(): string[] {\n return Object.keys(JETTON_REGISTRY);\n}\n"],"mappings":";;;;;;AAsCO,IAAM,iBAAyC;AAAA;AAAA,EAEpD,CAAC,iBAAiB,GAAG;AAAA;AAAA,EAErB,CAAC,iBAAiB,GAAG;AACvB;AAKO,IAAM,kBAAyC;AAAA;AAAA,EAEpD,CAAC,iBAAiB,GAAG;AAAA,IACnB,MAAM;AAAA,MACJ,eAAe,eAAe,iBAAiB;AAAA,MAC/C,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,UAAU;AAAA,MACV,UAAU;AAAA,IACZ;AAAA,EACF;AAAA;AAAA,EAGA,CAAC,iBAAiB,GAAG;AAAA,IACnB,MAAM;AAAA,MACJ,eAAe,eAAe,iBAAiB;AAAA,MAC/C,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,UAAU;AAAA,MACV,UAAU;AAAA,IACZ;AAAA,EACF;AACF;AASO,SAAS,gBAAgB,SAAiB,QAA0C;AACzF,SAAO,gBAAgB,OAAO,IAAI,OAAO,YAAY,CAAC;AACxD;AAQO,SAAS,kBAAkB,SAAiC;AACjE,QAAM,UAAU,gBAAgB,OAAO;AACvC,MAAI,CAAC,QAAS,QAAO,CAAC;AACtB,SAAO,OAAO,OAAO,OAAO,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,WAAW,EAAE,QAAQ;AACtE;AASO,SAAS,iBAAiB,SAA2C;AAC1E,QAAM,UAAU,kBAAkB,OAAO;AACzC,SAAO,QAAQ,CAAC;AAClB;AASO,SAAS,mBAAmB,SAAiB,SAA2C;AAC7F,QAAM,UAAU,gBAAgB,OAAO;AACvC,MAAI,CAAC,QAAS,QAAO;AAGrB,SAAO,OAAO,OAAO,OAAO,EAAE;AAAA,IAC5B,CAAC,MAAM,EAAE,cAAc,YAAY,MAAM,QAAQ,YAAY;AAAA,EAC/D;AACF;AAQO,SAAS,qBAAqB,QAA0B;AAC7D,QAAM,WAAqB,CAAC;AAC5B,aAAW,CAAC,SAAS,OAAO,KAAK,OAAO,QAAQ,eAAe,GAAG;AAChE,QAAI,QAAQ,OAAO,YAAY,CAAC,GAAG;AACjC,eAAS,KAAK,OAAO;AAAA,IACvB;AAAA,EACF;AACA,SAAO;AACT;AAOO,SAAS,kBAA4B;AAC1C,SAAO,qBAAqB,MAAM;AACpC;AAQO,SAAS,mBAAmB,SAA0B;AAC3D,SAAO,WAAW;AACpB;AAOO,SAAS,uBAAiC;AAC/C,SAAO,OAAO,KAAK,eAAe;AACpC;","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/exact/client/scheme.ts"],"sourcesContent":["/**\n * TON Client Scheme Implementation\n *\n * Creates payment payloads for TON Jetton transfers using the exact scheme.\n * Builds and signs external messages for Jetton wallet interactions.\n */\n\nimport { Address, SendMode } from \"@ton/core\";\nimport type { PaymentPayload, PaymentRequirements, SchemeNetworkClient } from \"@t402/core/types\";\nimport type { ClientTonSigner } from \"../../signer.js\";\nimport type { ExactTonPayloadV2 } from \"../../types.js\";\nimport { SCHEME_EXACT, DEFAULT_JETTON_TRANSFER_TON, DEFAULT_FORWARD_TON } from \"../../constants.js\";\nimport {\n generateQueryId,\n buildJettonTransferBody,\n normalizeNetwork,\n parseTonAddress,\n} from \"../../utils.js\";\n\n/**\n * Configuration for ExactTonScheme client\n */\nexport interface ExactTonSchemeConfig {\n /** Override the TON amount attached for gas (in nanoTON) */\n gasAmount?: bigint;\n /** Override the forward TON amount (in nanoTON) */\n forwardAmount?: bigint;\n}\n\n/**\n * TON client implementation for the Exact payment scheme.\n *\n * Creates signed Jetton transfer messages that can be broadcast\n * by a facilitator to complete the payment.\n */\nexport class ExactTonScheme implements SchemeNetworkClient {\n readonly scheme = SCHEME_EXACT;\n\n /**\n * Creates a new ExactTonScheme instance.\n *\n * @param signer - The TON signer for client operations\n * @param getJettonWalletAddress - Function to derive Jetton wallet address\n * @param config - Optional configuration overrides\n */\n constructor(\n private readonly signer: ClientTonSigner,\n private readonly getJettonWalletAddress: (\n ownerAddress: string,\n jettonMasterAddress: string,\n ) => Promise<string>,\n private readonly config: ExactTonSchemeConfig = {},\n ) {}\n\n /**\n * Creates a payment payload for the Exact scheme.\n *\n * The payload contains a pre-signed external message that performs\n * a Jetton transfer from the client to the recipient.\n *\n * @param t402Version - The t402 protocol version\n * @param paymentRequirements - The payment requirements\n * @returns Promise resolving to a payment payload\n */\n async createPaymentPayload(\n t402Version: number,\n paymentRequirements: PaymentRequirements,\n ): Promise<Pick<PaymentPayload, \"t402Version\" | \"payload\">> {\n // Normalize and validate network\n const network = normalizeNetwork(paymentRequirements.network);\n\n // Validate required fields\n if (!paymentRequirements.asset) {\n throw new Error(\"Asset (Jetton master address) is required\");\n }\n if (!paymentRequirements.payTo) {\n throw new Error(\"PayTo address is required\");\n }\n if (!paymentRequirements.amount) {\n throw new Error(\"Amount is required\");\n }\n\n // Parse addresses\n const jettonMasterAddress = paymentRequirements.asset;\n const destinationAddress = parseTonAddress(paymentRequirements.payTo);\n\n // Get client's Jetton wallet address\n const senderJettonWalletAddress = await this.getJettonWalletAddress(\n this.signer.address.toString(),\n jettonMasterAddress,\n );\n const senderJettonWallet = Address.parse(senderJettonWalletAddress);\n\n // Get current seqno for replay protection\n const seqno = await this.signer.getSeqno();\n\n // Calculate validity period\n const now = Math.floor(Date.now() / 1000);\n const validUntil = now + paymentRequirements.maxTimeoutSeconds;\n\n // Generate unique query ID\n const queryId = generateQueryId();\n\n // Parse amount\n const jettonAmount = BigInt(paymentRequirements.amount);\n\n // Build Jetton transfer body\n const jettonTransferBody = buildJettonTransferBody({\n queryId,\n amount: jettonAmount,\n destination: destinationAddress,\n responseDestination: this.signer.address,\n forwardAmount: this.config.forwardAmount ?? DEFAULT_FORWARD_TON,\n });\n\n // Gas amount for the transfer\n const tonAmount = this.config.gasAmount ?? DEFAULT_JETTON_TRANSFER_TON;\n\n // Sign the message\n const signedMessage = await this.signer.signMessage({\n to: senderJettonWallet,\n value: tonAmount,\n body: jettonTransferBody,\n sendMode: SendMode.PAY_GAS_SEPARATELY,\n timeout: paymentRequirements.maxTimeoutSeconds,\n });\n\n // Encode to base64\n const signedBoc = signedMessage.toBoc().toString(\"base64\");\n\n // Build authorization metadata\n const authorization: ExactTonPayloadV2[\"authorization\"] = {\n from: this.signer.address.toString({ bounceable: true }),\n to: paymentRequirements.payTo,\n jettonMaster: jettonMasterAddress,\n jettonAmount: jettonAmount.toString(),\n tonAmount: tonAmount.toString(),\n validUntil,\n seqno,\n queryId: queryId.toString(),\n };\n\n // Create payload\n const payload: ExactTonPayloadV2 = {\n signedBoc,\n authorization,\n };\n\n // Mark network as used\n void network;\n\n return {\n t402Version,\n payload,\n };\n }\n}\n"],"mappings":";;;;;;;;;;;AAOA,SAAS,SAAS,gBAAgB;AA4B3B,IAAM,iBAAN,MAAoD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUzD,YACmB,QACA,wBAIA,SAA+B,CAAC,GACjD;AANiB;AACA;AAIA;AAfnB,SAAS,SAAS;AAAA,EAgBf;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYH,MAAM,qBACJ,aACA,qBAC0D;AAE1D,UAAM,UAAU,iBAAiB,oBAAoB,OAAO;AAG5D,QAAI,CAAC,oBAAoB,OAAO;AAC9B,YAAM,IAAI,MAAM,2CAA2C;AAAA,IAC7D;AACA,QAAI,CAAC,oBAAoB,OAAO;AAC9B,YAAM,IAAI,MAAM,2BAA2B;AAAA,IAC7C;AACA,QAAI,CAAC,oBAAoB,QAAQ;AAC/B,YAAM,IAAI,MAAM,oBAAoB;AAAA,IACtC;AAGA,UAAM,sBAAsB,oBAAoB;AAChD,UAAM,qBAAqB,gBAAgB,oBAAoB,KAAK;AAGpE,UAAM,4BAA4B,MAAM,KAAK;AAAA,MAC3C,KAAK,OAAO,QAAQ,SAAS;AAAA,MAC7B;AAAA,IACF;AACA,UAAM,qBAAqB,QAAQ,MAAM,yBAAyB;AAGlE,UAAM,QAAQ,MAAM,KAAK,OAAO,SAAS;AAGzC,UAAM,MAAM,KAAK,MAAM,KAAK,IAAI,IAAI,GAAI;AACxC,UAAM,aAAa,MAAM,oBAAoB;AAG7C,UAAM,UAAU,gBAAgB;AAGhC,UAAM,eAAe,OAAO,oBAAoB,MAAM;AAGtD,UAAM,qBAAqB,wBAAwB;AAAA,MACjD;AAAA,MACA,QAAQ;AAAA,MACR,aAAa;AAAA,MACb,qBAAqB,KAAK,OAAO;AAAA,MACjC,eAAe,KAAK,OAAO,iBAAiB;AAAA,IAC9C,CAAC;AAGD,UAAM,YAAY,KAAK,OAAO,aAAa;AAG3C,UAAM,gBAAgB,MAAM,KAAK,OAAO,YAAY;AAAA,MAClD,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,MAAM;AAAA,MACN,UAAU,SAAS;AAAA,MACnB,SAAS,oBAAoB;AAAA,IAC/B,CAAC;AAGD,UAAM,YAAY,cAAc,MAAM,EAAE,SAAS,QAAQ;AAGzD,UAAM,gBAAoD;AAAA,MACxD,MAAM,KAAK,OAAO,QAAQ,SAAS,EAAE,YAAY,KAAK,CAAC;AAAA,MACvD,IAAI,oBAAoB;AAAA,MACxB,cAAc;AAAA,MACd,cAAc,aAAa,SAAS;AAAA,MACpC,WAAW,UAAU,SAAS;AAAA,MAC9B;AAAA,MACA;AAAA,MACA,SAAS,QAAQ,SAAS;AAAA,IAC5B;AAGA,UAAM,UAA6B;AAAA,MACjC;AAAA,MACA;AAAA,IACF;AAGA,SAAK;AAEL,WAAO;AAAA,MACL;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;","names":[]}