@t402/tron 1.0.0 → 2.0.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.
- package/dist/cjs/exact/client/index.js +5 -1
- package/dist/cjs/exact/client/index.js.map +1 -1
- package/dist/cjs/exact/facilitator/index.js +22 -9
- package/dist/cjs/exact/facilitator/index.js.map +1 -1
- package/dist/cjs/exact/server/index.d.ts +3 -6
- package/dist/cjs/exact/server/index.js +96 -143
- package/dist/cjs/exact/server/index.js.map +1 -1
- package/dist/cjs/index.js +147 -169
- package/dist/cjs/index.js.map +1 -1
- package/dist/esm/{chunk-A2E6FJU3.mjs → chunk-2JPJ3ITE.mjs} +6 -5
- package/dist/esm/{chunk-A2E6FJU3.mjs.map → chunk-2JPJ3ITE.mjs.map} +1 -1
- package/dist/esm/{chunk-L773HPM3.mjs → chunk-7ON767JA.mjs} +36 -63
- package/dist/esm/{chunk-L773HPM3.mjs.map → chunk-7ON767JA.mjs.map} +1 -1
- package/dist/esm/{chunk-CH6GR2VO.mjs → chunk-FSYJTWWP.mjs} +23 -13
- package/dist/esm/chunk-FSYJTWWP.mjs.map +1 -0
- package/dist/esm/{chunk-RHOZZ6XV.mjs → chunk-S7NVYXWH.mjs} +55 -82
- package/dist/esm/chunk-S7NVYXWH.mjs.map +1 -0
- package/dist/esm/exact/client/index.mjs +2 -2
- package/dist/esm/exact/facilitator/index.mjs +2 -2
- package/dist/esm/exact/server/index.d.mts +3 -6
- package/dist/esm/exact/server/index.mjs +2 -2
- package/dist/esm/index.mjs +4 -10
- package/dist/esm/index.mjs.map +1 -1
- package/package.json +16 -16
- package/dist/esm/chunk-CH6GR2VO.mjs.map +0 -1
- package/dist/esm/chunk-RHOZZ6XV.mjs.map +0 -1
|
@@ -1,18 +1,19 @@
|
|
|
1
1
|
import {
|
|
2
2
|
MIN_VALIDITY_BUFFER,
|
|
3
3
|
SCHEME_EXACT,
|
|
4
|
+
__publicField,
|
|
4
5
|
addressesEqual,
|
|
5
|
-
init_constants,
|
|
6
6
|
normalizeNetwork,
|
|
7
7
|
validateTronAddress
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-7ON767JA.mjs";
|
|
9
9
|
|
|
10
10
|
// src/exact/facilitator/scheme.ts
|
|
11
|
-
init_constants();
|
|
12
11
|
var ExactTronScheme = class {
|
|
13
12
|
constructor(signer, config) {
|
|
14
|
-
this
|
|
15
|
-
this
|
|
13
|
+
__publicField(this, "scheme", SCHEME_EXACT);
|
|
14
|
+
__publicField(this, "caipFamily", "tron:*");
|
|
15
|
+
__publicField(this, "signer");
|
|
16
|
+
__publicField(this, "config");
|
|
16
17
|
this.signer = signer;
|
|
17
18
|
this.config = config ?? {};
|
|
18
19
|
}
|
|
@@ -55,6 +56,13 @@ var ExactTronScheme = class {
|
|
|
55
56
|
*/
|
|
56
57
|
async verify(payload, requirements) {
|
|
57
58
|
const tronPayload = payload.payload;
|
|
59
|
+
if (!tronPayload?.authorization?.from || !tronPayload?.signedTransaction) {
|
|
60
|
+
return {
|
|
61
|
+
isValid: false,
|
|
62
|
+
invalidReason: "invalid_payload_structure",
|
|
63
|
+
payer: ""
|
|
64
|
+
};
|
|
65
|
+
}
|
|
58
66
|
const authorization = tronPayload.authorization;
|
|
59
67
|
if (payload.accepted.scheme !== SCHEME_EXACT || requirements.scheme !== SCHEME_EXACT) {
|
|
60
68
|
return {
|
|
@@ -81,13 +89,6 @@ var ExactTronScheme = class {
|
|
|
81
89
|
payer: authorization.from
|
|
82
90
|
};
|
|
83
91
|
}
|
|
84
|
-
if (!tronPayload || !tronPayload.signedTransaction || !authorization) {
|
|
85
|
-
return {
|
|
86
|
-
isValid: false,
|
|
87
|
-
invalidReason: "invalid_payload_structure",
|
|
88
|
-
payer: authorization?.from || ""
|
|
89
|
-
};
|
|
90
|
-
}
|
|
91
92
|
if (!validateTronAddress(authorization.from)) {
|
|
92
93
|
return {
|
|
93
94
|
isValid: false,
|
|
@@ -197,6 +198,15 @@ var ExactTronScheme = class {
|
|
|
197
198
|
*/
|
|
198
199
|
async settle(payload, requirements) {
|
|
199
200
|
const tronPayload = payload.payload;
|
|
201
|
+
if (!tronPayload?.authorization?.from || !tronPayload?.signedTransaction) {
|
|
202
|
+
return {
|
|
203
|
+
success: false,
|
|
204
|
+
network: payload.accepted.network,
|
|
205
|
+
transaction: "",
|
|
206
|
+
errorReason: "invalid_payload_structure",
|
|
207
|
+
payer: ""
|
|
208
|
+
};
|
|
209
|
+
}
|
|
200
210
|
const verifyResult = await this.verify(payload, requirements);
|
|
201
211
|
if (!verifyResult.isValid) {
|
|
202
212
|
return {
|
|
@@ -264,4 +274,4 @@ export {
|
|
|
264
274
|
ExactTronScheme,
|
|
265
275
|
registerExactTronScheme
|
|
266
276
|
};
|
|
267
|
-
//# sourceMappingURL=chunk-
|
|
277
|
+
//# sourceMappingURL=chunk-FSYJTWWP.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/exact/facilitator/scheme.ts","../../src/exact/facilitator/register.ts"],"sourcesContent":["/**\n * TRON Exact Payment Scheme - Facilitator Implementation\n *\n * Verifies and settles TRC20 token transfer payments.\n */\n\nimport type {\n PaymentPayload,\n PaymentRequirements,\n SchemeNetworkFacilitator,\n SettleResponse,\n VerifyResponse,\n} from \"@t402/core/types\";\nimport type { FacilitatorTronSigner } from \"../../signer.js\";\nimport type { ExactTronPayload } from \"../../types.js\";\nimport { SCHEME_EXACT, MIN_VALIDITY_BUFFER } from \"../../constants.js\";\nimport { normalizeNetwork, validateTronAddress, addressesEqual } from \"../../utils.js\";\n\n/**\n * Configuration for ExactTronScheme (facilitator)\n */\nexport type ExactTronSchemeConfig = {\n /** Whether this facilitator can sponsor gas */\n canSponsorGas?: boolean;\n};\n\n/**\n * Facilitator-side implementation of the TRON exact payment scheme\n *\n * This scheme verifies and settles pre-signed TRC20 transfer transactions.\n */\nexport class ExactTronScheme implements SchemeNetworkFacilitator {\n readonly scheme = SCHEME_EXACT;\n readonly caipFamily = \"tron:*\";\n private readonly signer: FacilitatorTronSigner;\n private readonly config: ExactTronSchemeConfig;\n\n constructor(signer: FacilitatorTronSigner, config?: ExactTronSchemeConfig) {\n this.signer = signer;\n this.config = config ?? {};\n }\n\n /**\n * Get extra data to include in payment requirements\n */\n getExtra(network: string): Record<string, unknown> | undefined {\n void network;\n\n if (this.config.canSponsorGas) {\n const addresses = this.signer.getAddresses();\n if (addresses.length > 0) {\n return {\n gasSponsor: addresses[0],\n };\n }\n }\n\n return undefined;\n }\n\n /**\n * Get facilitator addresses that can receive payments\n */\n getSigners(network: string): string[] {\n void network;\n return [...this.signer.getAddresses()];\n }\n\n /**\n * Verify a payment payload\n *\n * Performs comprehensive validation:\n * 1. Scheme matching\n * 2. Network matching\n * 3. Payload structure validation\n * 4. Transaction signature verification\n * 5. Authorization expiry check\n * 6. Balance verification\n * 7. Amount sufficiency\n * 8. Recipient matching\n * 9. Contract address matching\n * 10. Account activation check\n */\n async verify(\n payload: PaymentPayload,\n requirements: PaymentRequirements,\n ): Promise<VerifyResponse> {\n const tronPayload = payload.payload as ExactTronPayload | undefined;\n\n // Step 1: Validate payload structure (must be first to avoid undefined access)\n if (!tronPayload?.authorization?.from || !tronPayload?.signedTransaction) {\n return {\n isValid: false,\n invalidReason: \"invalid_payload_structure\",\n payer: \"\",\n };\n }\n\n const authorization = tronPayload.authorization;\n\n // Step 2: Validate scheme\n if (payload.accepted.scheme !== SCHEME_EXACT || requirements.scheme !== SCHEME_EXACT) {\n return {\n isValid: false,\n invalidReason: \"unsupported_scheme\",\n payer: authorization.from,\n };\n }\n\n // Step 3: Validate network\n let payloadNetwork: string;\n try {\n payloadNetwork = normalizeNetwork(String(payload.accepted.network));\n const requirementsNetwork = normalizeNetwork(String(requirements.network));\n\n if (payloadNetwork !== requirementsNetwork) {\n return {\n isValid: false,\n invalidReason: \"network_mismatch\",\n payer: authorization.from,\n };\n }\n } catch {\n return {\n isValid: false,\n invalidReason: \"invalid_network\",\n payer: authorization.from,\n };\n }\n\n // Step 4: Validate addresses\n if (!validateTronAddress(authorization.from)) {\n return {\n isValid: false,\n invalidReason: \"invalid_sender_address\",\n payer: authorization.from,\n };\n }\n if (!validateTronAddress(authorization.to)) {\n return {\n isValid: false,\n invalidReason: \"invalid_recipient_address\",\n payer: authorization.from,\n };\n }\n if (!validateTronAddress(authorization.contractAddress)) {\n return {\n isValid: false,\n invalidReason: \"invalid_contract_address\",\n payer: authorization.from,\n };\n }\n\n // Step 5: Verify transaction signature\n const verifyResult = await this.signer.verifyTransaction({\n signedTransaction: tronPayload.signedTransaction,\n expectedFrom: authorization.from,\n expectedTransfer: {\n to: authorization.to,\n contractAddress: authorization.contractAddress,\n amount: authorization.amount,\n },\n network: payloadNetwork,\n });\n\n if (!verifyResult.valid) {\n return {\n isValid: false,\n invalidReason: verifyResult.reason || \"transaction_verification_failed\",\n payer: authorization.from,\n };\n }\n\n // Step 6: Check expiration (with buffer)\n const now = Date.now();\n const expirationWithBuffer = authorization.expiration - MIN_VALIDITY_BUFFER * 1000;\n\n if (now >= expirationWithBuffer) {\n return {\n isValid: false,\n invalidReason: \"authorization_expired\",\n payer: authorization.from,\n };\n }\n\n // Step 7: Verify balance\n try {\n const balance = await this.signer.getBalance({\n ownerAddress: authorization.from,\n contractAddress: authorization.contractAddress,\n network: payloadNetwork,\n });\n\n if (BigInt(balance) < BigInt(requirements.amount)) {\n return {\n isValid: false,\n invalidReason: \"insufficient_balance\",\n payer: authorization.from,\n };\n }\n } catch (error) {\n console.warn(\"Could not verify balance:\", error);\n }\n\n // Step 8: Verify amount sufficiency\n if (BigInt(authorization.amount) < BigInt(requirements.amount)) {\n return {\n isValid: false,\n invalidReason: \"insufficient_amount\",\n payer: authorization.from,\n };\n }\n\n // Step 9: Verify recipient\n if (!addressesEqual(authorization.to, requirements.payTo)) {\n return {\n isValid: false,\n invalidReason: \"recipient_mismatch\",\n payer: authorization.from,\n };\n }\n\n // Step 10: Verify contract address\n if (!addressesEqual(authorization.contractAddress, requirements.asset)) {\n return {\n isValid: false,\n invalidReason: \"asset_mismatch\",\n payer: authorization.from,\n };\n }\n\n // Step 11: Verify sender account is activated\n try {\n const isActivated = await this.signer.isActivated(authorization.from, payloadNetwork);\n if (!isActivated) {\n return {\n isValid: false,\n invalidReason: \"account_not_activated\",\n payer: authorization.from,\n };\n }\n } catch (error) {\n console.warn(\"Could not verify account activation:\", error);\n }\n\n // All checks passed\n return {\n isValid: true,\n invalidReason: undefined,\n payer: authorization.from,\n };\n }\n\n /**\n * Settle a verified payment\n *\n * Broadcasts the transaction and waits for confirmation.\n */\n async settle(\n payload: PaymentPayload,\n requirements: PaymentRequirements,\n ): Promise<SettleResponse> {\n const tronPayload = payload.payload as ExactTronPayload | undefined;\n\n // Validate payload structure\n if (!tronPayload?.authorization?.from || !tronPayload?.signedTransaction) {\n return {\n success: false,\n network: payload.accepted.network,\n transaction: \"\",\n errorReason: \"invalid_payload_structure\",\n payer: \"\",\n };\n }\n\n // Re-verify before settling\n const verifyResult = await this.verify(payload, requirements);\n if (!verifyResult.isValid) {\n return {\n success: false,\n network: payload.accepted.network,\n transaction: \"\",\n errorReason: verifyResult.invalidReason ?? \"verification_failed\",\n payer: tronPayload.authorization.from,\n };\n }\n\n try {\n const network = normalizeNetwork(String(payload.accepted.network));\n\n // Broadcast the transaction\n const txId = await this.signer.broadcastTransaction(\n tronPayload.signedTransaction,\n network,\n );\n\n // Wait for confirmation\n const confirmation = await this.signer.waitForTransaction({\n txId,\n network,\n timeout: 60000, // 60 seconds\n });\n\n if (!confirmation.success) {\n return {\n success: false,\n network: payload.accepted.network,\n transaction: txId,\n errorReason: confirmation.error || \"transaction_not_confirmed\",\n payer: tronPayload.authorization.from,\n };\n }\n\n return {\n success: true,\n transaction: confirmation.txId || txId,\n network: payload.accepted.network,\n payer: tronPayload.authorization.from,\n };\n } catch (error) {\n console.error(\"Failed to settle TRON transaction:\", error);\n return {\n success: false,\n network: payload.accepted.network,\n transaction: \"\",\n errorReason: \"transaction_failed\",\n payer: tronPayload.authorization.from,\n };\n }\n }\n}\n","/**\n * TRON Facilitator Scheme Registration\n *\n * Helper function to register TRON exact scheme with a t402 facilitator.\n */\n\nimport { t402Facilitator } from \"@t402/core/facilitator\";\nimport { Network } from \"@t402/core/types\";\nimport { ExactTronScheme, ExactTronSchemeConfig } from \"./scheme.js\";\nimport { FacilitatorTronSigner } from \"../../signer.js\";\n\n/**\n * Configuration options for registering TRON schemes to a t402Facilitator\n */\nexport interface TronFacilitatorConfig {\n /**\n * The signer to use for verification and settlement\n */\n signer: FacilitatorTronSigner;\n\n /**\n * Optional specific networks to register\n * If not provided, registers wildcard support (tron:*)\n */\n networks?: Network[];\n\n /**\n * Optional scheme configuration\n */\n schemeConfig?: ExactTronSchemeConfig;\n}\n\n/**\n * Registers TRON exact payment schemes to a t402Facilitator instance.\n *\n * This function registers:\n * - V2: tron:* wildcard scheme with ExactTronScheme (or specific networks if provided)\n *\n * @param facilitator - The t402Facilitator instance to register schemes to\n * @param config - Configuration for TRON facilitator registration\n * @returns The facilitator instance for chaining\n *\n * @example\n * ```typescript\n * import { registerExactTronScheme } from \"@t402/tron/exact/facilitator\";\n * import { t402Facilitator } from \"@t402/core/facilitator\";\n *\n * const signer = new MyTronSigner(privateKey);\n * const facilitator = new t402Facilitator();\n * registerExactTronScheme(facilitator, { signer });\n *\n * // Or with specific networks\n * registerExactTronScheme(facilitator, {\n * signer,\n * networks: [\"tron:mainnet\"],\n * schemeConfig: { canSponsorGas: true }\n * });\n * ```\n */\nexport function registerExactTronScheme(\n facilitator: t402Facilitator,\n config: TronFacilitatorConfig,\n): t402Facilitator {\n const scheme = new ExactTronScheme(config.signer, config.schemeConfig);\n\n // Register V2 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 TRON networks\n facilitator.register(\"tron:*\", scheme);\n }\n\n return facilitator;\n}\n"],"mappings":"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","names":[]}
|
|
@@ -5,27 +5,53 @@ import {
|
|
|
5
5
|
TRON_NILE_CAIP2,
|
|
6
6
|
TRON_SHASTA_CAIP2,
|
|
7
7
|
USDT_ADDRESSES,
|
|
8
|
-
|
|
9
|
-
__export,
|
|
10
|
-
__toCommonJS,
|
|
8
|
+
__publicField,
|
|
11
9
|
convertToSmallestUnits,
|
|
12
|
-
init_constants,
|
|
13
10
|
normalizeNetwork
|
|
14
|
-
} from "./chunk-
|
|
11
|
+
} from "./chunk-7ON767JA.mjs";
|
|
15
12
|
|
|
16
13
|
// src/tokens.ts
|
|
17
|
-
var
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
}
|
|
14
|
+
var USDT_MAINNET = {
|
|
15
|
+
contractAddress: USDT_ADDRESSES[TRON_MAINNET_CAIP2],
|
|
16
|
+
symbol: "USDT",
|
|
17
|
+
name: "Tether USD",
|
|
18
|
+
decimals: DEFAULT_USDT_DECIMALS
|
|
19
|
+
};
|
|
20
|
+
var USDT_NILE = {
|
|
21
|
+
contractAddress: USDT_ADDRESSES[TRON_NILE_CAIP2],
|
|
22
|
+
symbol: "USDT",
|
|
23
|
+
name: "Tether USD",
|
|
24
|
+
decimals: DEFAULT_USDT_DECIMALS
|
|
25
|
+
};
|
|
26
|
+
var USDT_SHASTA = {
|
|
27
|
+
contractAddress: USDT_ADDRESSES[TRON_SHASTA_CAIP2],
|
|
28
|
+
symbol: "USDT",
|
|
29
|
+
name: "Tether USD",
|
|
30
|
+
decimals: DEFAULT_USDT_DECIMALS
|
|
31
|
+
};
|
|
32
|
+
var TRC20_REGISTRY = {
|
|
33
|
+
[TRON_MAINNET_CAIP2]: {
|
|
34
|
+
network: TRON_MAINNET_CAIP2,
|
|
35
|
+
defaultToken: USDT_MAINNET,
|
|
36
|
+
tokens: {
|
|
37
|
+
USDT: USDT_MAINNET
|
|
38
|
+
}
|
|
39
|
+
},
|
|
40
|
+
[TRON_NILE_CAIP2]: {
|
|
41
|
+
network: TRON_NILE_CAIP2,
|
|
42
|
+
defaultToken: USDT_NILE,
|
|
43
|
+
tokens: {
|
|
44
|
+
USDT: USDT_NILE
|
|
45
|
+
}
|
|
46
|
+
},
|
|
47
|
+
[TRON_SHASTA_CAIP2]: {
|
|
48
|
+
network: TRON_SHASTA_CAIP2,
|
|
49
|
+
defaultToken: USDT_SHASTA,
|
|
50
|
+
tokens: {
|
|
51
|
+
USDT: USDT_SHASTA
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
};
|
|
29
55
|
function getTRC20Config(network, symbol) {
|
|
30
56
|
const registry = TRC20_REGISTRY[network];
|
|
31
57
|
if (!registry) return void 0;
|
|
@@ -60,63 +86,14 @@ function isNetworkSupported(network) {
|
|
|
60
86
|
function getSupportedNetworks() {
|
|
61
87
|
return Object.keys(TRC20_REGISTRY);
|
|
62
88
|
}
|
|
63
|
-
var USDT_MAINNET, USDT_NILE, USDT_SHASTA, TRC20_REGISTRY;
|
|
64
|
-
var init_tokens = __esm({
|
|
65
|
-
"src/tokens.ts"() {
|
|
66
|
-
"use strict";
|
|
67
|
-
init_constants();
|
|
68
|
-
USDT_MAINNET = {
|
|
69
|
-
contractAddress: USDT_ADDRESSES[TRON_MAINNET_CAIP2],
|
|
70
|
-
symbol: "USDT",
|
|
71
|
-
name: "Tether USD",
|
|
72
|
-
decimals: DEFAULT_USDT_DECIMALS
|
|
73
|
-
};
|
|
74
|
-
USDT_NILE = {
|
|
75
|
-
contractAddress: USDT_ADDRESSES[TRON_NILE_CAIP2],
|
|
76
|
-
symbol: "USDT",
|
|
77
|
-
name: "Tether USD",
|
|
78
|
-
decimals: DEFAULT_USDT_DECIMALS
|
|
79
|
-
};
|
|
80
|
-
USDT_SHASTA = {
|
|
81
|
-
contractAddress: USDT_ADDRESSES[TRON_SHASTA_CAIP2],
|
|
82
|
-
symbol: "USDT",
|
|
83
|
-
name: "Tether USD",
|
|
84
|
-
decimals: DEFAULT_USDT_DECIMALS
|
|
85
|
-
};
|
|
86
|
-
TRC20_REGISTRY = {
|
|
87
|
-
[TRON_MAINNET_CAIP2]: {
|
|
88
|
-
network: TRON_MAINNET_CAIP2,
|
|
89
|
-
defaultToken: USDT_MAINNET,
|
|
90
|
-
tokens: {
|
|
91
|
-
USDT: USDT_MAINNET
|
|
92
|
-
}
|
|
93
|
-
},
|
|
94
|
-
[TRON_NILE_CAIP2]: {
|
|
95
|
-
network: TRON_NILE_CAIP2,
|
|
96
|
-
defaultToken: USDT_NILE,
|
|
97
|
-
tokens: {
|
|
98
|
-
USDT: USDT_NILE
|
|
99
|
-
}
|
|
100
|
-
},
|
|
101
|
-
[TRON_SHASTA_CAIP2]: {
|
|
102
|
-
network: TRON_SHASTA_CAIP2,
|
|
103
|
-
defaultToken: USDT_SHASTA,
|
|
104
|
-
tokens: {
|
|
105
|
-
USDT: USDT_SHASTA
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
};
|
|
109
|
-
}
|
|
110
|
-
});
|
|
111
89
|
|
|
112
90
|
// src/exact/server/scheme.ts
|
|
113
|
-
init_constants();
|
|
114
|
-
init_tokens();
|
|
115
91
|
var ExactTronScheme = class {
|
|
116
92
|
constructor(config) {
|
|
117
|
-
this
|
|
118
|
-
this
|
|
119
|
-
this
|
|
93
|
+
__publicField(this, "scheme", SCHEME_EXACT);
|
|
94
|
+
__publicField(this, "_config");
|
|
95
|
+
__publicField(this, "moneyParsers", []);
|
|
96
|
+
this._config = config ?? {};
|
|
120
97
|
}
|
|
121
98
|
/**
|
|
122
99
|
* Register a custom money parser
|
|
@@ -174,7 +151,7 @@ var ExactTronScheme = class {
|
|
|
174
151
|
async enhancePaymentRequirements(requirements, supportedKind, extensionKeys) {
|
|
175
152
|
void extensionKeys;
|
|
176
153
|
const network = normalizeNetwork(String(requirements.network));
|
|
177
|
-
let tokenConfig = requirements.asset ? getTRC20Config(network, requirements.asset) ||
|
|
154
|
+
let tokenConfig = requirements.asset ? getTRC20Config(network, requirements.asset) || getTokenByAddress(network, requirements.asset) : getDefaultToken(network);
|
|
178
155
|
if (!tokenConfig) {
|
|
179
156
|
tokenConfig = getDefaultToken(network);
|
|
180
157
|
}
|
|
@@ -218,10 +195,14 @@ var ExactTronScheme = class {
|
|
|
218
195
|
throw new Error(`Invalid price type: ${typeof price}`);
|
|
219
196
|
}
|
|
220
197
|
/**
|
|
221
|
-
* Default money to asset conversion
|
|
198
|
+
* Default money to asset conversion
|
|
199
|
+
* Uses preferredToken from config if set, otherwise falls back to network default
|
|
222
200
|
*/
|
|
223
201
|
defaultMoneyConversion(decimalAmount, network) {
|
|
224
|
-
|
|
202
|
+
let tokenConfig = this._config.preferredToken ? getTRC20Config(network, this._config.preferredToken) : void 0;
|
|
203
|
+
if (!tokenConfig) {
|
|
204
|
+
tokenConfig = getDefaultToken(network);
|
|
205
|
+
}
|
|
225
206
|
if (!tokenConfig) {
|
|
226
207
|
throw new Error(`No default token for network: ${network}`);
|
|
227
208
|
}
|
|
@@ -246,13 +227,6 @@ var ExactTronScheme = class {
|
|
|
246
227
|
}
|
|
247
228
|
return tokenConfig.contractAddress;
|
|
248
229
|
}
|
|
249
|
-
/**
|
|
250
|
-
* Get token config by contract address
|
|
251
|
-
*/
|
|
252
|
-
getTokenByAddress(network, address) {
|
|
253
|
-
const { getTokenByAddress: getTokenByAddress2 } = (init_tokens(), __toCommonJS(tokens_exports));
|
|
254
|
-
return getTokenByAddress2(network, address);
|
|
255
|
-
}
|
|
256
230
|
};
|
|
257
231
|
|
|
258
232
|
// src/exact/server/register.ts
|
|
@@ -278,8 +252,7 @@ export {
|
|
|
278
252
|
getUsdtNetworks,
|
|
279
253
|
isNetworkSupported,
|
|
280
254
|
getSupportedNetworks,
|
|
281
|
-
init_tokens,
|
|
282
255
|
ExactTronScheme,
|
|
283
256
|
registerExactTronScheme
|
|
284
257
|
};
|
|
285
|
-
//# sourceMappingURL=chunk-
|
|
258
|
+
//# sourceMappingURL=chunk-S7NVYXWH.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/tokens.ts","../../src/exact/server/scheme.ts","../../src/exact/server/register.ts"],"sourcesContent":["/**\n * TRC20 Token Configuration\n *\n * Registry of supported TRC20 tokens for each TRON network.\n */\n\nimport type { TRC20Config, NetworkTRC20Registry } from \"./types.js\";\nimport {\n TRON_MAINNET_CAIP2,\n TRON_NILE_CAIP2,\n TRON_SHASTA_CAIP2,\n USDT_ADDRESSES,\n DEFAULT_USDT_DECIMALS,\n} from \"./constants.js\";\n\n// =============================================================================\n// USDT Token Configurations\n// =============================================================================\n\n/** USDT on TRON Mainnet */\nconst USDT_MAINNET: TRC20Config = {\n contractAddress: USDT_ADDRESSES[TRON_MAINNET_CAIP2],\n symbol: \"USDT\",\n name: \"Tether USD\",\n decimals: DEFAULT_USDT_DECIMALS,\n};\n\n/** USDT on TRON Nile Testnet */\nconst USDT_NILE: TRC20Config = {\n contractAddress: USDT_ADDRESSES[TRON_NILE_CAIP2],\n symbol: \"USDT\",\n name: \"Tether USD\",\n decimals: DEFAULT_USDT_DECIMALS,\n};\n\n/** USDT on TRON Shasta Testnet */\nconst USDT_SHASTA: TRC20Config = {\n contractAddress: USDT_ADDRESSES[TRON_SHASTA_CAIP2],\n symbol: \"USDT\",\n name: \"Tether USD\",\n decimals: DEFAULT_USDT_DECIMALS,\n};\n\n// =============================================================================\n// Token Registry\n// =============================================================================\n\n/**\n * Registry of TRC20 tokens by network\n */\nexport const TRC20_REGISTRY: Record<string, NetworkTRC20Registry> = {\n [TRON_MAINNET_CAIP2]: {\n network: TRON_MAINNET_CAIP2,\n defaultToken: USDT_MAINNET,\n tokens: {\n USDT: USDT_MAINNET,\n },\n },\n [TRON_NILE_CAIP2]: {\n network: TRON_NILE_CAIP2,\n defaultToken: USDT_NILE,\n tokens: {\n USDT: USDT_NILE,\n },\n },\n [TRON_SHASTA_CAIP2]: {\n network: TRON_SHASTA_CAIP2,\n defaultToken: USDT_SHASTA,\n tokens: {\n USDT: USDT_SHASTA,\n },\n },\n};\n\n// =============================================================================\n// Utility Functions\n// =============================================================================\n\n/**\n * Get TRC20 configuration for a specific token on a network\n *\n * @param network - CAIP-2 network identifier\n * @param symbol - Token symbol (e.g., \"USDT\")\n * @returns Token configuration or undefined if not found\n */\nexport function getTRC20Config(network: string, symbol: string): TRC20Config | undefined {\n const registry = TRC20_REGISTRY[network];\n if (!registry) return undefined;\n return registry.tokens[symbol];\n}\n\n/**\n * Get all TRC20 tokens for a network\n *\n * @param network - CAIP-2 network identifier\n * @returns Array of token configurations\n */\nexport function getNetworkTokens(network: string): TRC20Config[] {\n const registry = TRC20_REGISTRY[network];\n if (!registry) return [];\n return Object.values(registry.tokens);\n}\n\n/**\n * Get the default TRC20 token for a network\n *\n * @param network - CAIP-2 network identifier\n * @returns Default token configuration or undefined\n */\nexport function getDefaultToken(network: string): TRC20Config | undefined {\n const registry = TRC20_REGISTRY[network];\n return registry?.defaultToken;\n}\n\n/**\n * Get token by contract address\n *\n * @param network - CAIP-2 network identifier\n * @param contractAddress - TRC20 contract address\n * @returns Token configuration or undefined\n */\nexport function getTokenByAddress(network: string, contractAddress: string): TRC20Config | undefined {\n const registry = TRC20_REGISTRY[network];\n if (!registry) return undefined;\n\n const upperAddress = contractAddress.toUpperCase();\n return Object.values(registry.tokens).find(\n token => token.contractAddress.toUpperCase() === upperAddress,\n );\n}\n\n/**\n * Get all networks that support a specific token\n *\n * @param symbol - Token symbol (e.g., \"USDT\")\n * @returns Array of network identifiers\n */\nexport function getNetworksForToken(symbol: string): string[] {\n return Object.entries(TRC20_REGISTRY)\n .filter(([_, registry]) => symbol in registry.tokens)\n .map(([network]) => network);\n}\n\n/**\n * Get all networks that support USDT\n *\n * @returns Array of network identifiers\n */\nexport function getUsdtNetworks(): string[] {\n return getNetworksForToken(\"USDT\");\n}\n\n/**\n * Check if a network is supported\n *\n * @param network - CAIP-2 network identifier\n * @returns true if network is supported\n */\nexport function isNetworkSupported(network: string): boolean {\n return network in TRC20_REGISTRY;\n}\n\n/**\n * Get all supported networks\n *\n * @returns Array of network identifiers\n */\nexport function getSupportedNetworks(): string[] {\n return Object.keys(TRC20_REGISTRY);\n}\n","/**\n * TRON Exact Payment Scheme - Server Implementation\n *\n * Parses prices and enhances payment requirements for TRC20 payments.\n */\n\nimport type {\n AssetAmount,\n Network,\n PaymentRequirements,\n Price,\n SchemeNetworkServer,\n MoneyParser,\n} from \"@t402/core/types\";\nimport { SCHEME_EXACT } from \"../../constants.js\";\nimport { normalizeNetwork, convertToSmallestUnits } from \"../../utils.js\";\nimport { getDefaultToken, getTRC20Config, getTokenByAddress, isNetworkSupported } from \"../../tokens.js\";\n\n/**\n * Configuration for ExactTronScheme (server)\n */\nexport type ExactTronSchemeConfig = {\n /** Preferred token symbol (default: highest priority) */\n preferredToken?: string;\n};\n\n/**\n * Server-side implementation of the TRON exact payment scheme\n *\n * This scheme parses prices and prepares payment requirements\n * for TRC20 token transfers.\n */\nexport class ExactTronScheme implements SchemeNetworkServer {\n readonly scheme = SCHEME_EXACT;\n private readonly _config: ExactTronSchemeConfig;\n private readonly moneyParsers: MoneyParser[] = []\n\n constructor(config?: ExactTronSchemeConfig) {\n this._config = config ?? {};\n }\n\n /**\n * Register a custom money parser\n *\n * Parsers are tried in registration order. Return null to pass to next parser.\n *\n * @param parser - Money parser function\n * @returns This scheme for chaining\n */\n registerMoneyParser(parser: MoneyParser): ExactTronScheme {\n this.moneyParsers.push(parser);\n return this;\n }\n\n /**\n * Parse a price into an asset amount\n *\n * @param price - Price to parse (string, number, or AssetAmount)\n * @param network - Target network\n * @returns Parsed asset amount\n */\n async parsePrice(price: Price, network: Network): Promise<AssetAmount> {\n const normalizedNetwork = normalizeNetwork(String(network));\n\n // Validate network support\n if (!isNetworkSupported(normalizedNetwork)) {\n throw new Error(`Unsupported network: ${network}`);\n }\n\n // If already an AssetAmount, return it\n if (typeof price === \"object\" && price !== null && \"amount\" in price) {\n const assetAmount = price as AssetAmount;\n return {\n amount: assetAmount.amount,\n asset: assetAmount.asset || this.getDefaultAsset(normalizedNetwork),\n extra: assetAmount.extra,\n };\n }\n\n // Parse money to decimal\n const decimalAmount = this.parseMoneyToDecimal(price);\n\n // Try custom parsers first\n for (const parser of this.moneyParsers) {\n try {\n const result = await parser(decimalAmount, network);\n if (result !== null) {\n return result;\n }\n } catch {\n // Parser failed, try next one\n continue;\n }\n }\n\n // Use default conversion (USDT with 6 decimals)\n return this.defaultMoneyConversion(decimalAmount, normalizedNetwork);\n }\n\n /**\n * Enhance payment requirements with scheme-specific data\n *\n * @param requirements - Base payment requirements\n * @param supportedKind - Supported payment kind\n * @param extensionKeys - Extension keys to include\n * @returns Enhanced payment requirements\n */\n async enhancePaymentRequirements(\n requirements: PaymentRequirements,\n supportedKind: {\n t402Version: number;\n scheme: string;\n network: Network;\n extra?: Record<string, unknown>;\n },\n extensionKeys: string[],\n ): Promise<PaymentRequirements> {\n void extensionKeys;\n const network = normalizeNetwork(String(requirements.network));\n\n // Get token config\n let tokenConfig = requirements.asset\n ? getTRC20Config(network, requirements.asset) || getTokenByAddress(network, requirements.asset)\n : getDefaultToken(network);\n\n if (!tokenConfig) {\n tokenConfig = getDefaultToken(network);\n }\n\n // Initialize extra if needed\n const extra: Record<string, unknown> = { ...requirements.extra };\n\n // Add token metadata\n if (tokenConfig) {\n extra.symbol = tokenConfig.symbol;\n extra.name = tokenConfig.name;\n extra.decimals = tokenConfig.decimals;\n }\n\n // Copy extension data\n if (supportedKind.extra) {\n for (const key of extensionKeys) {\n if (key in supportedKind.extra) {\n extra[key] = supportedKind.extra[key];\n }\n }\n }\n\n return {\n ...requirements,\n asset: tokenConfig?.contractAddress || requirements.asset,\n extra,\n };\n }\n\n /**\n * Parse money (string/number) to decimal number\n */\n private parseMoneyToDecimal(price: Price): number {\n if (typeof price === \"number\") {\n return price;\n }\n\n if (typeof price === \"string\") {\n // Remove currency symbols and whitespace\n let cleanPrice = price.trim();\n cleanPrice = cleanPrice.replace(/^\\$/, \"\").trim();\n\n // Parse the numeric part\n const parts = cleanPrice.split(/\\s+/);\n const numericPart = parts[0];\n const parsed = parseFloat(numericPart);\n\n if (isNaN(parsed)) {\n throw new Error(`Failed to parse price: ${price}`);\n }\n\n return parsed;\n }\n\n throw new Error(`Invalid price type: ${typeof price}`);\n }\n\n /**\n * Default money to asset conversion\n * Uses preferredToken from config if set, otherwise falls back to network default\n */\n private defaultMoneyConversion(decimalAmount: number, network: string): AssetAmount {\n // Try preferred token first if configured\n let tokenConfig = this._config.preferredToken\n ? getTRC20Config(network, this._config.preferredToken)\n : undefined;\n\n // Fall back to network default\n if (!tokenConfig) {\n tokenConfig = getDefaultToken(network);\n }\n\n if (!tokenConfig) {\n throw new Error(`No default token for network: ${network}`);\n }\n\n const amount = convertToSmallestUnits(decimalAmount.toFixed(6), tokenConfig.decimals);\n\n return {\n amount,\n asset: tokenConfig.contractAddress,\n extra: {\n symbol: tokenConfig.symbol,\n name: tokenConfig.name,\n decimals: tokenConfig.decimals,\n },\n };\n }\n\n /**\n * Get default asset address for network\n */\n private getDefaultAsset(network: string): string {\n const tokenConfig = getDefaultToken(network);\n if (!tokenConfig) {\n throw new Error(`No default token for network: ${network}`);\n }\n return tokenConfig.contractAddress;\n }\n\n}\n","/**\n * TRON Server Scheme Registration\n *\n * Helper function to register TRON exact scheme with a t402 resource server.\n */\n\nimport { t402ResourceServer } from \"@t402/core/server\";\nimport { Network } from \"@t402/core/types\";\nimport { ExactTronScheme, ExactTronSchemeConfig } from \"./scheme.js\";\n\n/**\n * Configuration options for registering TRON schemes to a t402ResourceServer\n */\nexport interface TronResourceServerConfig {\n /**\n * Optional specific networks to register\n * If not provided, registers wildcard support (tron:*)\n */\n networks?: Network[];\n\n /**\n * Optional scheme configuration (preferred token, etc.)\n */\n schemeConfig?: ExactTronSchemeConfig;\n}\n\n/**\n * Registers TRON exact payment schemes to a t402ResourceServer instance.\n *\n * This function registers:\n * - V2: tron:* wildcard scheme with ExactTronScheme (or specific networks if provided)\n *\n * @param server - The t402ResourceServer instance to register schemes to\n * @param config - Configuration for TRON resource server registration\n * @returns The server instance for chaining\n *\n * @example\n * ```typescript\n * import { registerExactTronScheme } from \"@t402/tron/exact/server\";\n * import { t402ResourceServer } from \"@t402/core/server\";\n *\n * const server = new t402ResourceServer(facilitatorClient);\n * registerExactTronScheme(server, {});\n *\n * // Or with specific token preference\n * registerExactTronScheme(server, {\n * schemeConfig: { preferredToken: \"USDT\" }\n * });\n * ```\n */\nexport function registerExactTronScheme(\n server: t402ResourceServer,\n config: TronResourceServerConfig = {},\n): t402ResourceServer {\n const scheme = new ExactTronScheme(config.schemeConfig);\n\n // Register V2 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 TRON networks\n server.register(\"tron:*\", scheme);\n }\n\n return server;\n}\n"],"mappings":"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","names":[]}
|
|
@@ -22,7 +22,7 @@ type ExactTronSchemeConfig = {
|
|
|
22
22
|
*/
|
|
23
23
|
declare class ExactTronScheme implements SchemeNetworkServer {
|
|
24
24
|
readonly scheme = "exact";
|
|
25
|
-
private readonly
|
|
25
|
+
private readonly _config;
|
|
26
26
|
private readonly moneyParsers;
|
|
27
27
|
constructor(config?: ExactTronSchemeConfig);
|
|
28
28
|
/**
|
|
@@ -61,17 +61,14 @@ declare class ExactTronScheme implements SchemeNetworkServer {
|
|
|
61
61
|
*/
|
|
62
62
|
private parseMoneyToDecimal;
|
|
63
63
|
/**
|
|
64
|
-
* Default money to asset conversion
|
|
64
|
+
* Default money to asset conversion
|
|
65
|
+
* Uses preferredToken from config if set, otherwise falls back to network default
|
|
65
66
|
*/
|
|
66
67
|
private defaultMoneyConversion;
|
|
67
68
|
/**
|
|
68
69
|
* Get default asset address for network
|
|
69
70
|
*/
|
|
70
71
|
private getDefaultAsset;
|
|
71
|
-
/**
|
|
72
|
-
* Get token config by contract address
|
|
73
|
-
*/
|
|
74
|
-
private getTokenByAddress;
|
|
75
72
|
}
|
|
76
73
|
|
|
77
74
|
/**
|
package/dist/esm/index.mjs
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
ExactTronScheme,
|
|
3
3
|
registerExactTronScheme
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-2JPJ3ITE.mjs";
|
|
5
5
|
import {
|
|
6
6
|
ExactTronScheme as ExactTronScheme2,
|
|
7
7
|
TRC20_REGISTRY,
|
|
@@ -12,14 +12,13 @@ import {
|
|
|
12
12
|
getTRC20Config,
|
|
13
13
|
getTokenByAddress,
|
|
14
14
|
getUsdtNetworks,
|
|
15
|
-
init_tokens,
|
|
16
15
|
isNetworkSupported,
|
|
17
16
|
registerExactTronScheme as registerExactTronScheme2
|
|
18
|
-
} from "./chunk-
|
|
17
|
+
} from "./chunk-S7NVYXWH.mjs";
|
|
19
18
|
import {
|
|
20
19
|
ExactTronScheme as ExactTronScheme3,
|
|
21
20
|
registerExactTronScheme as registerExactTronScheme3
|
|
22
|
-
} from "./chunk-
|
|
21
|
+
} from "./chunk-FSYJTWWP.mjs";
|
|
23
22
|
import {
|
|
24
23
|
DEFAULT_FEE_LIMIT,
|
|
25
24
|
DEFAULT_TRX_DECIMALS,
|
|
@@ -50,16 +49,11 @@ import {
|
|
|
50
49
|
formatAddress,
|
|
51
50
|
generatePaymentReference,
|
|
52
51
|
getEndpoint,
|
|
53
|
-
init_constants,
|
|
54
52
|
isTronNetwork,
|
|
55
53
|
isValidHex,
|
|
56
54
|
normalizeNetwork,
|
|
57
55
|
validateTronAddress
|
|
58
|
-
} from "./chunk-
|
|
59
|
-
|
|
60
|
-
// src/index.ts
|
|
61
|
-
init_constants();
|
|
62
|
-
init_tokens();
|
|
56
|
+
} from "./chunk-7ON767JA.mjs";
|
|
63
57
|
export {
|
|
64
58
|
DEFAULT_FEE_LIMIT,
|
|
65
59
|
DEFAULT_TRX_DECIMALS,
|
package/dist/esm/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":[
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
package/package.json
CHANGED
|
@@ -1,21 +1,9 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@t402/tron",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "2.0.0",
|
|
4
4
|
"main": "./dist/cjs/index.js",
|
|
5
5
|
"module": "./dist/esm/index.js",
|
|
6
6
|
"types": "./dist/cjs/index.d.ts",
|
|
7
|
-
"scripts": {
|
|
8
|
-
"start": "tsx --env-file=.env index.ts",
|
|
9
|
-
"build": "tsup",
|
|
10
|
-
"test": "vitest run",
|
|
11
|
-
"test:integration": "vitest run --config vitest.integration.config.ts",
|
|
12
|
-
"test:watch": "vitest",
|
|
13
|
-
"watch": "tsc --watch",
|
|
14
|
-
"format": "prettier -c .prettierrc --write \"**/*.{ts,js,cjs,json,md}\"",
|
|
15
|
-
"format:check": "prettier -c .prettierrc --check \"**/*.{ts,js,cjs,json,md}\"",
|
|
16
|
-
"lint": "eslint . --ext .ts --fix",
|
|
17
|
-
"lint:check": "eslint . --ext .ts"
|
|
18
|
-
},
|
|
19
7
|
"keywords": [
|
|
20
8
|
"t402",
|
|
21
9
|
"payment",
|
|
@@ -47,7 +35,7 @@
|
|
|
47
35
|
"vitest": "^3.0.5"
|
|
48
36
|
},
|
|
49
37
|
"dependencies": {
|
|
50
|
-
"@t402/core": "
|
|
38
|
+
"@t402/core": "2.0.0"
|
|
51
39
|
},
|
|
52
40
|
"exports": {
|
|
53
41
|
".": {
|
|
@@ -93,5 +81,17 @@
|
|
|
93
81
|
},
|
|
94
82
|
"files": [
|
|
95
83
|
"dist"
|
|
96
|
-
]
|
|
97
|
-
|
|
84
|
+
],
|
|
85
|
+
"scripts": {
|
|
86
|
+
"start": "tsx --env-file=.env index.ts",
|
|
87
|
+
"build": "tsup",
|
|
88
|
+
"test": "vitest run",
|
|
89
|
+
"test:integration": "vitest run --config vitest.integration.config.ts",
|
|
90
|
+
"test:watch": "vitest",
|
|
91
|
+
"watch": "tsc --watch",
|
|
92
|
+
"format": "prettier -c .prettierrc --write \"**/*.{ts,js,cjs,json,md}\"",
|
|
93
|
+
"format:check": "prettier -c .prettierrc --check \"**/*.{ts,js,cjs,json,md}\"",
|
|
94
|
+
"lint": "eslint . --ext .ts --fix",
|
|
95
|
+
"lint:check": "eslint . --ext .ts"
|
|
96
|
+
}
|
|
97
|
+
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/exact/facilitator/scheme.ts","../../src/exact/facilitator/register.ts"],"sourcesContent":["/**\n * TRON Exact Payment Scheme - Facilitator Implementation\n *\n * Verifies and settles TRC20 token transfer payments.\n */\n\nimport type {\n PaymentPayload,\n PaymentRequirements,\n SchemeNetworkFacilitator,\n SettleResponse,\n VerifyResponse,\n} from \"@t402/core/types\";\nimport type { FacilitatorTronSigner } from \"../../signer.js\";\nimport type { ExactTronPayload } from \"../../types.js\";\nimport { SCHEME_EXACT, MIN_VALIDITY_BUFFER } from \"../../constants.js\";\nimport { normalizeNetwork, validateTronAddress, addressesEqual } from \"../../utils.js\";\n\n/**\n * Configuration for ExactTronScheme (facilitator)\n */\nexport type ExactTronSchemeConfig = {\n /** Whether this facilitator can sponsor gas */\n canSponsorGas?: boolean;\n};\n\n/**\n * Facilitator-side implementation of the TRON exact payment scheme\n *\n * This scheme verifies and settles pre-signed TRC20 transfer transactions.\n */\nexport class ExactTronScheme implements SchemeNetworkFacilitator {\n readonly scheme = SCHEME_EXACT;\n readonly caipFamily = \"tron:*\";\n private readonly signer: FacilitatorTronSigner;\n private readonly config: ExactTronSchemeConfig;\n\n constructor(signer: FacilitatorTronSigner, config?: ExactTronSchemeConfig) {\n this.signer = signer;\n this.config = config ?? {};\n }\n\n /**\n * Get extra data to include in payment requirements\n */\n getExtra(network: string): Record<string, unknown> | undefined {\n void network;\n\n if (this.config.canSponsorGas) {\n const addresses = this.signer.getAddresses();\n if (addresses.length > 0) {\n return {\n gasSponsor: addresses[0],\n };\n }\n }\n\n return undefined;\n }\n\n /**\n * Get facilitator addresses that can receive payments\n */\n getSigners(network: string): string[] {\n void network;\n return [...this.signer.getAddresses()];\n }\n\n /**\n * Verify a payment payload\n *\n * Performs comprehensive validation:\n * 1. Scheme matching\n * 2. Network matching\n * 3. Payload structure validation\n * 4. Transaction signature verification\n * 5. Authorization expiry check\n * 6. Balance verification\n * 7. Amount sufficiency\n * 8. Recipient matching\n * 9. Contract address matching\n * 10. Account activation check\n */\n async verify(\n payload: PaymentPayload,\n requirements: PaymentRequirements,\n ): Promise<VerifyResponse> {\n const tronPayload = payload.payload as ExactTronPayload;\n const authorization = tronPayload.authorization;\n\n // Step 1: Validate scheme\n if (payload.accepted.scheme !== SCHEME_EXACT || requirements.scheme !== SCHEME_EXACT) {\n return {\n isValid: false,\n invalidReason: \"unsupported_scheme\",\n payer: authorization.from,\n };\n }\n\n // Step 2: Validate network\n let payloadNetwork: string;\n try {\n payloadNetwork = normalizeNetwork(String(payload.accepted.network));\n const requirementsNetwork = normalizeNetwork(String(requirements.network));\n\n if (payloadNetwork !== requirementsNetwork) {\n return {\n isValid: false,\n invalidReason: \"network_mismatch\",\n payer: authorization.from,\n };\n }\n } catch {\n return {\n isValid: false,\n invalidReason: \"invalid_network\",\n payer: authorization.from,\n };\n }\n\n // Step 3: Validate payload structure\n if (!tronPayload || !tronPayload.signedTransaction || !authorization) {\n return {\n isValid: false,\n invalidReason: \"invalid_payload_structure\",\n payer: authorization?.from || \"\",\n };\n }\n\n // Step 4: Validate addresses\n if (!validateTronAddress(authorization.from)) {\n return {\n isValid: false,\n invalidReason: \"invalid_sender_address\",\n payer: authorization.from,\n };\n }\n if (!validateTronAddress(authorization.to)) {\n return {\n isValid: false,\n invalidReason: \"invalid_recipient_address\",\n payer: authorization.from,\n };\n }\n if (!validateTronAddress(authorization.contractAddress)) {\n return {\n isValid: false,\n invalidReason: \"invalid_contract_address\",\n payer: authorization.from,\n };\n }\n\n // Step 5: Verify transaction signature\n const verifyResult = await this.signer.verifyTransaction({\n signedTransaction: tronPayload.signedTransaction,\n expectedFrom: authorization.from,\n expectedTransfer: {\n to: authorization.to,\n contractAddress: authorization.contractAddress,\n amount: authorization.amount,\n },\n network: payloadNetwork,\n });\n\n if (!verifyResult.valid) {\n return {\n isValid: false,\n invalidReason: verifyResult.reason || \"transaction_verification_failed\",\n payer: authorization.from,\n };\n }\n\n // Step 6: Check expiration (with buffer)\n const now = Date.now();\n const expirationWithBuffer = authorization.expiration - MIN_VALIDITY_BUFFER * 1000;\n\n if (now >= expirationWithBuffer) {\n return {\n isValid: false,\n invalidReason: \"authorization_expired\",\n payer: authorization.from,\n };\n }\n\n // Step 7: Verify balance\n try {\n const balance = await this.signer.getBalance({\n ownerAddress: authorization.from,\n contractAddress: authorization.contractAddress,\n network: payloadNetwork,\n });\n\n if (BigInt(balance) < BigInt(requirements.amount)) {\n return {\n isValid: false,\n invalidReason: \"insufficient_balance\",\n payer: authorization.from,\n };\n }\n } catch (error) {\n console.warn(\"Could not verify balance:\", error);\n }\n\n // Step 8: Verify amount sufficiency\n if (BigInt(authorization.amount) < BigInt(requirements.amount)) {\n return {\n isValid: false,\n invalidReason: \"insufficient_amount\",\n payer: authorization.from,\n };\n }\n\n // Step 9: Verify recipient\n if (!addressesEqual(authorization.to, requirements.payTo)) {\n return {\n isValid: false,\n invalidReason: \"recipient_mismatch\",\n payer: authorization.from,\n };\n }\n\n // Step 10: Verify contract address\n if (!addressesEqual(authorization.contractAddress, requirements.asset)) {\n return {\n isValid: false,\n invalidReason: \"asset_mismatch\",\n payer: authorization.from,\n };\n }\n\n // Step 11: Verify sender account is activated\n try {\n const isActivated = await this.signer.isActivated(authorization.from, payloadNetwork);\n if (!isActivated) {\n return {\n isValid: false,\n invalidReason: \"account_not_activated\",\n payer: authorization.from,\n };\n }\n } catch (error) {\n console.warn(\"Could not verify account activation:\", error);\n }\n\n // All checks passed\n return {\n isValid: true,\n invalidReason: undefined,\n payer: authorization.from,\n };\n }\n\n /**\n * Settle a verified payment\n *\n * Broadcasts the transaction and waits for confirmation.\n */\n async settle(\n payload: PaymentPayload,\n requirements: PaymentRequirements,\n ): Promise<SettleResponse> {\n const tronPayload = payload.payload as ExactTronPayload;\n\n // Re-verify before settling\n const verifyResult = await this.verify(payload, requirements);\n if (!verifyResult.isValid) {\n return {\n success: false,\n network: payload.accepted.network,\n transaction: \"\",\n errorReason: verifyResult.invalidReason ?? \"verification_failed\",\n payer: tronPayload.authorization.from,\n };\n }\n\n try {\n const network = normalizeNetwork(String(payload.accepted.network));\n\n // Broadcast the transaction\n const txId = await this.signer.broadcastTransaction(\n tronPayload.signedTransaction,\n network,\n );\n\n // Wait for confirmation\n const confirmation = await this.signer.waitForTransaction({\n txId,\n network,\n timeout: 60000, // 60 seconds\n });\n\n if (!confirmation.success) {\n return {\n success: false,\n network: payload.accepted.network,\n transaction: txId,\n errorReason: confirmation.error || \"transaction_not_confirmed\",\n payer: tronPayload.authorization.from,\n };\n }\n\n return {\n success: true,\n transaction: confirmation.txId || txId,\n network: payload.accepted.network,\n payer: tronPayload.authorization.from,\n };\n } catch (error) {\n console.error(\"Failed to settle TRON transaction:\", error);\n return {\n success: false,\n network: payload.accepted.network,\n transaction: \"\",\n errorReason: \"transaction_failed\",\n payer: tronPayload.authorization.from,\n };\n }\n }\n}\n","/**\n * TRON Facilitator Scheme Registration\n *\n * Helper function to register TRON exact scheme with a t402 facilitator.\n */\n\nimport { t402Facilitator } from \"@t402/core/facilitator\";\nimport { Network } from \"@t402/core/types\";\nimport { ExactTronScheme, ExactTronSchemeConfig } from \"./scheme.js\";\nimport { FacilitatorTronSigner } from \"../../signer.js\";\n\n/**\n * Configuration options for registering TRON schemes to a t402Facilitator\n */\nexport interface TronFacilitatorConfig {\n /**\n * The signer to use for verification and settlement\n */\n signer: FacilitatorTronSigner;\n\n /**\n * Optional specific networks to register\n * If not provided, registers wildcard support (tron:*)\n */\n networks?: Network[];\n\n /**\n * Optional scheme configuration\n */\n schemeConfig?: ExactTronSchemeConfig;\n}\n\n/**\n * Registers TRON exact payment schemes to a t402Facilitator instance.\n *\n * This function registers:\n * - V2: tron:* wildcard scheme with ExactTronScheme (or specific networks if provided)\n *\n * @param facilitator - The t402Facilitator instance to register schemes to\n * @param config - Configuration for TRON facilitator registration\n * @returns The facilitator instance for chaining\n *\n * @example\n * ```typescript\n * import { registerExactTronScheme } from \"@t402/tron/exact/facilitator\";\n * import { t402Facilitator } from \"@t402/core/facilitator\";\n *\n * const signer = new MyTronSigner(privateKey);\n * const facilitator = new t402Facilitator();\n * registerExactTronScheme(facilitator, { signer });\n *\n * // Or with specific networks\n * registerExactTronScheme(facilitator, {\n * signer,\n * networks: [\"tron:mainnet\"],\n * schemeConfig: { canSponsorGas: true }\n * });\n * ```\n */\nexport function registerExactTronScheme(\n facilitator: t402Facilitator,\n config: TronFacilitatorConfig,\n): t402Facilitator {\n const scheme = new ExactTronScheme(config.signer, config.schemeConfig);\n\n // Register V2 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 TRON networks\n facilitator.register(\"tron:*\", scheme);\n }\n\n return facilitator;\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/tokens.ts","../../src/exact/server/scheme.ts","../../src/exact/server/register.ts"],"sourcesContent":["/**\n * TRC20 Token Configuration\n *\n * Registry of supported TRC20 tokens for each TRON network.\n */\n\nimport type { TRC20Config, NetworkTRC20Registry } from \"./types.js\";\nimport {\n TRON_MAINNET_CAIP2,\n TRON_NILE_CAIP2,\n TRON_SHASTA_CAIP2,\n USDT_ADDRESSES,\n DEFAULT_USDT_DECIMALS,\n} from \"./constants.js\";\n\n// =============================================================================\n// USDT Token Configurations\n// =============================================================================\n\n/** USDT on TRON Mainnet */\nconst USDT_MAINNET: TRC20Config = {\n contractAddress: USDT_ADDRESSES[TRON_MAINNET_CAIP2],\n symbol: \"USDT\",\n name: \"Tether USD\",\n decimals: DEFAULT_USDT_DECIMALS,\n};\n\n/** USDT on TRON Nile Testnet */\nconst USDT_NILE: TRC20Config = {\n contractAddress: USDT_ADDRESSES[TRON_NILE_CAIP2],\n symbol: \"USDT\",\n name: \"Tether USD\",\n decimals: DEFAULT_USDT_DECIMALS,\n};\n\n/** USDT on TRON Shasta Testnet */\nconst USDT_SHASTA: TRC20Config = {\n contractAddress: USDT_ADDRESSES[TRON_SHASTA_CAIP2],\n symbol: \"USDT\",\n name: \"Tether USD\",\n decimals: DEFAULT_USDT_DECIMALS,\n};\n\n// =============================================================================\n// Token Registry\n// =============================================================================\n\n/**\n * Registry of TRC20 tokens by network\n */\nexport const TRC20_REGISTRY: Record<string, NetworkTRC20Registry> = {\n [TRON_MAINNET_CAIP2]: {\n network: TRON_MAINNET_CAIP2,\n defaultToken: USDT_MAINNET,\n tokens: {\n USDT: USDT_MAINNET,\n },\n },\n [TRON_NILE_CAIP2]: {\n network: TRON_NILE_CAIP2,\n defaultToken: USDT_NILE,\n tokens: {\n USDT: USDT_NILE,\n },\n },\n [TRON_SHASTA_CAIP2]: {\n network: TRON_SHASTA_CAIP2,\n defaultToken: USDT_SHASTA,\n tokens: {\n USDT: USDT_SHASTA,\n },\n },\n};\n\n// =============================================================================\n// Utility Functions\n// =============================================================================\n\n/**\n * Get TRC20 configuration for a specific token on a network\n *\n * @param network - CAIP-2 network identifier\n * @param symbol - Token symbol (e.g., \"USDT\")\n * @returns Token configuration or undefined if not found\n */\nexport function getTRC20Config(network: string, symbol: string): TRC20Config | undefined {\n const registry = TRC20_REGISTRY[network];\n if (!registry) return undefined;\n return registry.tokens[symbol];\n}\n\n/**\n * Get all TRC20 tokens for a network\n *\n * @param network - CAIP-2 network identifier\n * @returns Array of token configurations\n */\nexport function getNetworkTokens(network: string): TRC20Config[] {\n const registry = TRC20_REGISTRY[network];\n if (!registry) return [];\n return Object.values(registry.tokens);\n}\n\n/**\n * Get the default TRC20 token for a network\n *\n * @param network - CAIP-2 network identifier\n * @returns Default token configuration or undefined\n */\nexport function getDefaultToken(network: string): TRC20Config | undefined {\n const registry = TRC20_REGISTRY[network];\n return registry?.defaultToken;\n}\n\n/**\n * Get token by contract address\n *\n * @param network - CAIP-2 network identifier\n * @param contractAddress - TRC20 contract address\n * @returns Token configuration or undefined\n */\nexport function getTokenByAddress(network: string, contractAddress: string): TRC20Config | undefined {\n const registry = TRC20_REGISTRY[network];\n if (!registry) return undefined;\n\n const upperAddress = contractAddress.toUpperCase();\n return Object.values(registry.tokens).find(\n token => token.contractAddress.toUpperCase() === upperAddress,\n );\n}\n\n/**\n * Get all networks that support a specific token\n *\n * @param symbol - Token symbol (e.g., \"USDT\")\n * @returns Array of network identifiers\n */\nexport function getNetworksForToken(symbol: string): string[] {\n return Object.entries(TRC20_REGISTRY)\n .filter(([_, registry]) => symbol in registry.tokens)\n .map(([network]) => network);\n}\n\n/**\n * Get all networks that support USDT\n *\n * @returns Array of network identifiers\n */\nexport function getUsdtNetworks(): string[] {\n return getNetworksForToken(\"USDT\");\n}\n\n/**\n * Check if a network is supported\n *\n * @param network - CAIP-2 network identifier\n * @returns true if network is supported\n */\nexport function isNetworkSupported(network: string): boolean {\n return network in TRC20_REGISTRY;\n}\n\n/**\n * Get all supported networks\n *\n * @returns Array of network identifiers\n */\nexport function getSupportedNetworks(): string[] {\n return Object.keys(TRC20_REGISTRY);\n}\n","/**\n * TRON Exact Payment Scheme - Server Implementation\n *\n * Parses prices and enhances payment requirements for TRC20 payments.\n */\n\nimport type {\n AssetAmount,\n Network,\n PaymentRequirements,\n Price,\n SchemeNetworkServer,\n MoneyParser,\n} from \"@t402/core/types\";\nimport { SCHEME_EXACT, DEFAULT_USDT_DECIMALS } from \"../../constants.js\";\nimport { normalizeNetwork, convertToSmallestUnits } from \"../../utils.js\";\nimport { getDefaultToken, getTRC20Config, isNetworkSupported } from \"../../tokens.js\";\n\n/**\n * Configuration for ExactTronScheme (server)\n */\nexport type ExactTronSchemeConfig = {\n /** Preferred token symbol (default: highest priority) */\n preferredToken?: string;\n};\n\n/**\n * Server-side implementation of the TRON exact payment scheme\n *\n * This scheme parses prices and prepares payment requirements\n * for TRC20 token transfers.\n */\nexport class ExactTronScheme implements SchemeNetworkServer {\n readonly scheme = SCHEME_EXACT;\n private readonly config: ExactTronSchemeConfig;\n private readonly moneyParsers: MoneyParser[] = []\n\n constructor(config?: ExactTronSchemeConfig) {\n this.config = config ?? {};\n }\n\n /**\n * Register a custom money parser\n *\n * Parsers are tried in registration order. Return null to pass to next parser.\n *\n * @param parser - Money parser function\n * @returns This scheme for chaining\n */\n registerMoneyParser(parser: MoneyParser): ExactTronScheme {\n this.moneyParsers.push(parser);\n return this;\n }\n\n /**\n * Parse a price into an asset amount\n *\n * @param price - Price to parse (string, number, or AssetAmount)\n * @param network - Target network\n * @returns Parsed asset amount\n */\n async parsePrice(price: Price, network: Network): Promise<AssetAmount> {\n const normalizedNetwork = normalizeNetwork(String(network));\n\n // Validate network support\n if (!isNetworkSupported(normalizedNetwork)) {\n throw new Error(`Unsupported network: ${network}`);\n }\n\n // If already an AssetAmount, return it\n if (typeof price === \"object\" && price !== null && \"amount\" in price) {\n const assetAmount = price as AssetAmount;\n return {\n amount: assetAmount.amount,\n asset: assetAmount.asset || this.getDefaultAsset(normalizedNetwork),\n extra: assetAmount.extra,\n };\n }\n\n // Parse money to decimal\n const decimalAmount = this.parseMoneyToDecimal(price);\n\n // Try custom parsers first\n for (const parser of this.moneyParsers) {\n try {\n const result = await parser(decimalAmount, network);\n if (result !== null) {\n return result;\n }\n } catch {\n // Parser failed, try next one\n continue;\n }\n }\n\n // Use default conversion (USDT with 6 decimals)\n return this.defaultMoneyConversion(decimalAmount, normalizedNetwork);\n }\n\n /**\n * Enhance payment requirements with scheme-specific data\n *\n * @param requirements - Base payment requirements\n * @param supportedKind - Supported payment kind\n * @param extensionKeys - Extension keys to include\n * @returns Enhanced payment requirements\n */\n async enhancePaymentRequirements(\n requirements: PaymentRequirements,\n supportedKind: {\n t402Version: number;\n scheme: string;\n network: Network;\n extra?: Record<string, unknown>;\n },\n extensionKeys: string[],\n ): Promise<PaymentRequirements> {\n void extensionKeys;\n const network = normalizeNetwork(String(requirements.network));\n\n // Get token config\n let tokenConfig = requirements.asset\n ? getTRC20Config(network, requirements.asset) || this.getTokenByAddress(network, requirements.asset)\n : getDefaultToken(network);\n\n if (!tokenConfig) {\n tokenConfig = getDefaultToken(network);\n }\n\n // Initialize extra if needed\n const extra: Record<string, unknown> = { ...requirements.extra };\n\n // Add token metadata\n if (tokenConfig) {\n extra.symbol = tokenConfig.symbol;\n extra.name = tokenConfig.name;\n extra.decimals = tokenConfig.decimals;\n }\n\n // Copy extension data\n if (supportedKind.extra) {\n for (const key of extensionKeys) {\n if (key in supportedKind.extra) {\n extra[key] = supportedKind.extra[key];\n }\n }\n }\n\n return {\n ...requirements,\n asset: tokenConfig?.contractAddress || requirements.asset,\n extra,\n };\n }\n\n /**\n * Parse money (string/number) to decimal number\n */\n private parseMoneyToDecimal(price: Price): number {\n if (typeof price === \"number\") {\n return price;\n }\n\n if (typeof price === \"string\") {\n // Remove currency symbols and whitespace\n let cleanPrice = price.trim();\n cleanPrice = cleanPrice.replace(/^\\$/, \"\").trim();\n\n // Parse the numeric part\n const parts = cleanPrice.split(/\\s+/);\n const numericPart = parts[0];\n const parsed = parseFloat(numericPart);\n\n if (isNaN(parsed)) {\n throw new Error(`Failed to parse price: ${price}`);\n }\n\n return parsed;\n }\n\n throw new Error(`Invalid price type: ${typeof price}`);\n }\n\n /**\n * Default money to asset conversion (USDT)\n */\n private defaultMoneyConversion(decimalAmount: number, network: string): AssetAmount {\n const tokenConfig = getDefaultToken(network);\n if (!tokenConfig) {\n throw new Error(`No default token for network: ${network}`);\n }\n\n const amount = convertToSmallestUnits(decimalAmount.toFixed(6), tokenConfig.decimals);\n\n return {\n amount,\n asset: tokenConfig.contractAddress,\n extra: {\n symbol: tokenConfig.symbol,\n name: tokenConfig.name,\n decimals: tokenConfig.decimals,\n },\n };\n }\n\n /**\n * Get default asset address for network\n */\n private getDefaultAsset(network: string): string {\n const tokenConfig = getDefaultToken(network);\n if (!tokenConfig) {\n throw new Error(`No default token for network: ${network}`);\n }\n return tokenConfig.contractAddress;\n }\n\n /**\n * Get token config by contract address\n */\n private getTokenByAddress(network: string, address: string): { contractAddress: string; symbol: string; name: string; decimals: number } | undefined {\n // Import dynamically to avoid circular deps\n const { getTokenByAddress } = require(\"../../tokens.js\");\n return getTokenByAddress(network, address);\n }\n}\n","/**\n * TRON Server Scheme Registration\n *\n * Helper function to register TRON exact scheme with a t402 resource server.\n */\n\nimport { t402ResourceServer } from \"@t402/core/server\";\nimport { Network } from \"@t402/core/types\";\nimport { ExactTronScheme, ExactTronSchemeConfig } from \"./scheme.js\";\n\n/**\n * Configuration options for registering TRON schemes to a t402ResourceServer\n */\nexport interface TronResourceServerConfig {\n /**\n * Optional specific networks to register\n * If not provided, registers wildcard support (tron:*)\n */\n networks?: Network[];\n\n /**\n * Optional scheme configuration (preferred token, etc.)\n */\n schemeConfig?: ExactTronSchemeConfig;\n}\n\n/**\n * Registers TRON exact payment schemes to a t402ResourceServer instance.\n *\n * This function registers:\n * - V2: tron:* wildcard scheme with ExactTronScheme (or specific networks if provided)\n *\n * @param server - The t402ResourceServer instance to register schemes to\n * @param config - Configuration for TRON resource server registration\n * @returns The server instance for chaining\n *\n * @example\n * ```typescript\n * import { registerExactTronScheme } from \"@t402/tron/exact/server\";\n * import { t402ResourceServer } from \"@t402/core/server\";\n *\n * const server = new t402ResourceServer(facilitatorClient);\n * registerExactTronScheme(server, {});\n *\n * // Or with specific token preference\n * registerExactTronScheme(server, {\n * schemeConfig: { preferredToken: \"USDT\" }\n * });\n * ```\n */\nexport function registerExactTronScheme(\n server: t402ResourceServer,\n config: TronResourceServerConfig = {},\n): t402ResourceServer {\n const scheme = new ExactTronScheme(config.schemeConfig);\n\n // Register V2 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 TRON networks\n server.register(\"tron:*\", scheme);\n }\n\n return server;\n}\n"],"mappings":"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","names":["getTokenByAddress"]}
|