@t402/tron 1.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.
Files changed (35) hide show
  1. package/dist/cjs/exact/client/index.d.ts +90 -0
  2. package/dist/cjs/exact/client/index.js +172 -0
  3. package/dist/cjs/exact/client/index.js.map +1 -0
  4. package/dist/cjs/exact/facilitator/index.d.ts +114 -0
  5. package/dist/cjs/exact/facilitator/index.js +344 -0
  6. package/dist/cjs/exact/facilitator/index.js.map +1 -0
  7. package/dist/cjs/exact/server/index.d.ts +123 -0
  8. package/dist/cjs/exact/server/index.js +350 -0
  9. package/dist/cjs/exact/server/index.js.map +1 -0
  10. package/dist/cjs/index.d.ts +237 -0
  11. package/dist/cjs/index.js +863 -0
  12. package/dist/cjs/index.js.map +1 -0
  13. package/dist/cjs/signer-BB-HLs-P.d.ts +261 -0
  14. package/dist/esm/chunk-A2E6FJU3.mjs +98 -0
  15. package/dist/esm/chunk-A2E6FJU3.mjs.map +1 -0
  16. package/dist/esm/chunk-CH6GR2VO.mjs +267 -0
  17. package/dist/esm/chunk-CH6GR2VO.mjs.map +1 -0
  18. package/dist/esm/chunk-L773HPM3.mjs +202 -0
  19. package/dist/esm/chunk-L773HPM3.mjs.map +1 -0
  20. package/dist/esm/chunk-RHOZZ6XV.mjs +285 -0
  21. package/dist/esm/chunk-RHOZZ6XV.mjs.map +1 -0
  22. package/dist/esm/exact/client/index.d.mts +90 -0
  23. package/dist/esm/exact/client/index.mjs +10 -0
  24. package/dist/esm/exact/client/index.mjs.map +1 -0
  25. package/dist/esm/exact/facilitator/index.d.mts +114 -0
  26. package/dist/esm/exact/facilitator/index.mjs +10 -0
  27. package/dist/esm/exact/facilitator/index.mjs.map +1 -0
  28. package/dist/esm/exact/server/index.d.mts +123 -0
  29. package/dist/esm/exact/server/index.mjs +10 -0
  30. package/dist/esm/exact/server/index.mjs.map +1 -0
  31. package/dist/esm/index.d.mts +237 -0
  32. package/dist/esm/index.mjs +113 -0
  33. package/dist/esm/index.mjs.map +1 -0
  34. package/dist/esm/signer-BB-HLs-P.d.mts +261 -0
  35. package/package.json +97 -0
@@ -0,0 +1,344 @@
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/facilitator/index.ts
21
+ var facilitator_exports = {};
22
+ __export(facilitator_exports, {
23
+ ExactTronScheme: () => ExactTronScheme,
24
+ registerExactTronScheme: () => registerExactTronScheme
25
+ });
26
+ module.exports = __toCommonJS(facilitator_exports);
27
+
28
+ // src/constants.ts
29
+ var TRON_MAINNET_CAIP2 = "tron:mainnet";
30
+ var TRON_NILE_CAIP2 = "tron:nile";
31
+ var TRON_SHASTA_CAIP2 = "tron:shasta";
32
+ var TRON_NETWORKS = [TRON_MAINNET_CAIP2, TRON_NILE_CAIP2, TRON_SHASTA_CAIP2];
33
+ var TRON_MAINNET_ENDPOINT = "https://api.trongrid.io";
34
+ var TRON_NILE_ENDPOINT = "https://api.nileex.io";
35
+ var TRON_SHASTA_ENDPOINT = "https://api.shasta.trongrid.io";
36
+ var NETWORK_ENDPOINTS = {
37
+ [TRON_MAINNET_CAIP2]: TRON_MAINNET_ENDPOINT,
38
+ [TRON_NILE_CAIP2]: TRON_NILE_ENDPOINT,
39
+ [TRON_SHASTA_CAIP2]: TRON_SHASTA_ENDPOINT
40
+ };
41
+ var SCHEME_EXACT = "exact";
42
+ var MIN_VALIDITY_BUFFER = 30;
43
+ var TRON_ADDRESS_PREFIX = "T";
44
+ var TRON_ADDRESS_LENGTH = 34;
45
+ var USDT_ADDRESSES = {
46
+ [TRON_MAINNET_CAIP2]: "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t",
47
+ [TRON_NILE_CAIP2]: "TXYZopYRdj2D9XRtbG411XZZ3kM5VkAeBf",
48
+ [TRON_SHASTA_CAIP2]: "TG3XXyExBkPp9nzdajDZsozEu4BkaSJozs"
49
+ };
50
+
51
+ // src/utils.ts
52
+ function normalizeNetwork(network) {
53
+ if (TRON_NETWORKS.includes(network)) {
54
+ return network;
55
+ }
56
+ const lower = network.toLowerCase();
57
+ if (lower === "mainnet" || lower === "tron") {
58
+ return "tron:mainnet";
59
+ }
60
+ if (lower === "nile" || lower === "tron-nile") {
61
+ return "tron:nile";
62
+ }
63
+ if (lower === "shasta" || lower === "tron-shasta") {
64
+ return "tron:shasta";
65
+ }
66
+ throw new Error(`Unsupported TRON network: ${network}`);
67
+ }
68
+ var BASE58_ALPHABET = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";
69
+ function validateTronAddress(address) {
70
+ if (!address || address.length !== TRON_ADDRESS_LENGTH) {
71
+ return false;
72
+ }
73
+ if (!address.startsWith(TRON_ADDRESS_PREFIX)) {
74
+ return false;
75
+ }
76
+ for (const char of address) {
77
+ if (!BASE58_ALPHABET.includes(char)) {
78
+ return false;
79
+ }
80
+ }
81
+ return true;
82
+ }
83
+ function addressesEqual(addr1, addr2) {
84
+ if (!addr1 || !addr2) return false;
85
+ return addr1 === addr2;
86
+ }
87
+
88
+ // src/exact/facilitator/scheme.ts
89
+ var ExactTronScheme = class {
90
+ constructor(signer, config) {
91
+ this.scheme = SCHEME_EXACT;
92
+ this.caipFamily = "tron:*";
93
+ this.signer = signer;
94
+ this.config = config ?? {};
95
+ }
96
+ /**
97
+ * Get extra data to include in payment requirements
98
+ */
99
+ getExtra(network) {
100
+ void network;
101
+ if (this.config.canSponsorGas) {
102
+ const addresses = this.signer.getAddresses();
103
+ if (addresses.length > 0) {
104
+ return {
105
+ gasSponsor: addresses[0]
106
+ };
107
+ }
108
+ }
109
+ return void 0;
110
+ }
111
+ /**
112
+ * Get facilitator addresses that can receive payments
113
+ */
114
+ getSigners(network) {
115
+ void network;
116
+ return [...this.signer.getAddresses()];
117
+ }
118
+ /**
119
+ * Verify a payment payload
120
+ *
121
+ * Performs comprehensive validation:
122
+ * 1. Scheme matching
123
+ * 2. Network matching
124
+ * 3. Payload structure validation
125
+ * 4. Transaction signature verification
126
+ * 5. Authorization expiry check
127
+ * 6. Balance verification
128
+ * 7. Amount sufficiency
129
+ * 8. Recipient matching
130
+ * 9. Contract address matching
131
+ * 10. Account activation check
132
+ */
133
+ async verify(payload, requirements) {
134
+ const tronPayload = payload.payload;
135
+ const authorization = tronPayload.authorization;
136
+ if (payload.accepted.scheme !== SCHEME_EXACT || requirements.scheme !== SCHEME_EXACT) {
137
+ return {
138
+ isValid: false,
139
+ invalidReason: "unsupported_scheme",
140
+ payer: authorization.from
141
+ };
142
+ }
143
+ let payloadNetwork;
144
+ try {
145
+ payloadNetwork = normalizeNetwork(String(payload.accepted.network));
146
+ const requirementsNetwork = normalizeNetwork(String(requirements.network));
147
+ if (payloadNetwork !== requirementsNetwork) {
148
+ return {
149
+ isValid: false,
150
+ invalidReason: "network_mismatch",
151
+ payer: authorization.from
152
+ };
153
+ }
154
+ } catch {
155
+ return {
156
+ isValid: false,
157
+ invalidReason: "invalid_network",
158
+ payer: authorization.from
159
+ };
160
+ }
161
+ if (!tronPayload || !tronPayload.signedTransaction || !authorization) {
162
+ return {
163
+ isValid: false,
164
+ invalidReason: "invalid_payload_structure",
165
+ payer: authorization?.from || ""
166
+ };
167
+ }
168
+ if (!validateTronAddress(authorization.from)) {
169
+ return {
170
+ isValid: false,
171
+ invalidReason: "invalid_sender_address",
172
+ payer: authorization.from
173
+ };
174
+ }
175
+ if (!validateTronAddress(authorization.to)) {
176
+ return {
177
+ isValid: false,
178
+ invalidReason: "invalid_recipient_address",
179
+ payer: authorization.from
180
+ };
181
+ }
182
+ if (!validateTronAddress(authorization.contractAddress)) {
183
+ return {
184
+ isValid: false,
185
+ invalidReason: "invalid_contract_address",
186
+ payer: authorization.from
187
+ };
188
+ }
189
+ const verifyResult = await this.signer.verifyTransaction({
190
+ signedTransaction: tronPayload.signedTransaction,
191
+ expectedFrom: authorization.from,
192
+ expectedTransfer: {
193
+ to: authorization.to,
194
+ contractAddress: authorization.contractAddress,
195
+ amount: authorization.amount
196
+ },
197
+ network: payloadNetwork
198
+ });
199
+ if (!verifyResult.valid) {
200
+ return {
201
+ isValid: false,
202
+ invalidReason: verifyResult.reason || "transaction_verification_failed",
203
+ payer: authorization.from
204
+ };
205
+ }
206
+ const now = Date.now();
207
+ const expirationWithBuffer = authorization.expiration - MIN_VALIDITY_BUFFER * 1e3;
208
+ if (now >= expirationWithBuffer) {
209
+ return {
210
+ isValid: false,
211
+ invalidReason: "authorization_expired",
212
+ payer: authorization.from
213
+ };
214
+ }
215
+ try {
216
+ const balance = await this.signer.getBalance({
217
+ ownerAddress: authorization.from,
218
+ contractAddress: authorization.contractAddress,
219
+ network: payloadNetwork
220
+ });
221
+ if (BigInt(balance) < BigInt(requirements.amount)) {
222
+ return {
223
+ isValid: false,
224
+ invalidReason: "insufficient_balance",
225
+ payer: authorization.from
226
+ };
227
+ }
228
+ } catch (error) {
229
+ console.warn("Could not verify balance:", error);
230
+ }
231
+ if (BigInt(authorization.amount) < BigInt(requirements.amount)) {
232
+ return {
233
+ isValid: false,
234
+ invalidReason: "insufficient_amount",
235
+ payer: authorization.from
236
+ };
237
+ }
238
+ if (!addressesEqual(authorization.to, requirements.payTo)) {
239
+ return {
240
+ isValid: false,
241
+ invalidReason: "recipient_mismatch",
242
+ payer: authorization.from
243
+ };
244
+ }
245
+ if (!addressesEqual(authorization.contractAddress, requirements.asset)) {
246
+ return {
247
+ isValid: false,
248
+ invalidReason: "asset_mismatch",
249
+ payer: authorization.from
250
+ };
251
+ }
252
+ try {
253
+ const isActivated = await this.signer.isActivated(authorization.from, payloadNetwork);
254
+ if (!isActivated) {
255
+ return {
256
+ isValid: false,
257
+ invalidReason: "account_not_activated",
258
+ payer: authorization.from
259
+ };
260
+ }
261
+ } catch (error) {
262
+ console.warn("Could not verify account activation:", error);
263
+ }
264
+ return {
265
+ isValid: true,
266
+ invalidReason: void 0,
267
+ payer: authorization.from
268
+ };
269
+ }
270
+ /**
271
+ * Settle a verified payment
272
+ *
273
+ * Broadcasts the transaction and waits for confirmation.
274
+ */
275
+ async settle(payload, requirements) {
276
+ const tronPayload = payload.payload;
277
+ const verifyResult = await this.verify(payload, requirements);
278
+ if (!verifyResult.isValid) {
279
+ return {
280
+ success: false,
281
+ network: payload.accepted.network,
282
+ transaction: "",
283
+ errorReason: verifyResult.invalidReason ?? "verification_failed",
284
+ payer: tronPayload.authorization.from
285
+ };
286
+ }
287
+ try {
288
+ const network = normalizeNetwork(String(payload.accepted.network));
289
+ const txId = await this.signer.broadcastTransaction(
290
+ tronPayload.signedTransaction,
291
+ network
292
+ );
293
+ const confirmation = await this.signer.waitForTransaction({
294
+ txId,
295
+ network,
296
+ timeout: 6e4
297
+ // 60 seconds
298
+ });
299
+ if (!confirmation.success) {
300
+ return {
301
+ success: false,
302
+ network: payload.accepted.network,
303
+ transaction: txId,
304
+ errorReason: confirmation.error || "transaction_not_confirmed",
305
+ payer: tronPayload.authorization.from
306
+ };
307
+ }
308
+ return {
309
+ success: true,
310
+ transaction: confirmation.txId || txId,
311
+ network: payload.accepted.network,
312
+ payer: tronPayload.authorization.from
313
+ };
314
+ } catch (error) {
315
+ console.error("Failed to settle TRON transaction:", error);
316
+ return {
317
+ success: false,
318
+ network: payload.accepted.network,
319
+ transaction: "",
320
+ errorReason: "transaction_failed",
321
+ payer: tronPayload.authorization.from
322
+ };
323
+ }
324
+ }
325
+ };
326
+
327
+ // src/exact/facilitator/register.ts
328
+ function registerExactTronScheme(facilitator, config) {
329
+ const scheme = new ExactTronScheme(config.signer, config.schemeConfig);
330
+ if (config.networks && config.networks.length > 0) {
331
+ config.networks.forEach((network) => {
332
+ facilitator.register(network, scheme);
333
+ });
334
+ } else {
335
+ facilitator.register("tron:*", scheme);
336
+ }
337
+ return facilitator;
338
+ }
339
+ // Annotate the CommonJS export names for ESM import in node:
340
+ 0 && (module.exports = {
341
+ ExactTronScheme,
342
+ registerExactTronScheme
343
+ });
344
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/exact/facilitator/index.ts","../../../../src/constants.ts","../../../../src/utils.ts","../../../../src/exact/facilitator/scheme.ts","../../../../src/exact/facilitator/register.ts"],"sourcesContent":["export { ExactTronScheme } from \"./scheme.js\";\nexport type { ExactTronSchemeConfig } from \"./scheme.js\";\nexport { registerExactTronScheme } from \"./register.js\";\nexport type { TronFacilitatorConfig } from \"./register.js\";\n","/**\n * TRON Network Constants\n *\n * Network identifiers, endpoints, and configuration for TRON blockchain.\n */\n\n// =============================================================================\n// Network Identifiers (CAIP-2 Format)\n// =============================================================================\n\n/** TRON Mainnet CAIP-2 identifier */\nexport const TRON_MAINNET_CAIP2 = \"tron:mainnet\";\n\n/** TRON Nile Testnet CAIP-2 identifier */\nexport const TRON_NILE_CAIP2 = \"tron:nile\";\n\n/** TRON Shasta Testnet CAIP-2 identifier */\nexport const TRON_SHASTA_CAIP2 = \"tron:shasta\";\n\n/** All supported TRON networks */\nexport const TRON_NETWORKS = [TRON_MAINNET_CAIP2, TRON_NILE_CAIP2, TRON_SHASTA_CAIP2] as const;\n\n/** TRON network type */\nexport type TronNetwork = (typeof TRON_NETWORKS)[number];\n\n// =============================================================================\n// RPC Endpoints\n// =============================================================================\n\n/** TRON Mainnet API endpoint (TronGrid) */\nexport const TRON_MAINNET_ENDPOINT = \"https://api.trongrid.io\";\n\n/** TRON Nile Testnet API endpoint */\nexport const TRON_NILE_ENDPOINT = \"https://api.nileex.io\";\n\n/** TRON Shasta Testnet API endpoint */\nexport const TRON_SHASTA_ENDPOINT = \"https://api.shasta.trongrid.io\";\n\n/** Network to endpoint mapping */\nexport const NETWORK_ENDPOINTS: Record<string, string> = {\n [TRON_MAINNET_CAIP2]: TRON_MAINNET_ENDPOINT,\n [TRON_NILE_CAIP2]: TRON_NILE_ENDPOINT,\n [TRON_SHASTA_CAIP2]: TRON_SHASTA_ENDPOINT,\n};\n\n// =============================================================================\n// TRC20 Contract Operations\n// =============================================================================\n\n/** TRC20 transfer function selector (transfer(address,uint256)) */\nexport const TRC20_TRANSFER_SELECTOR = \"a9059cbb\";\n\n/** TRC20 approve function selector (approve(address,uint256)) */\nexport const TRC20_APPROVE_SELECTOR = \"095ea7b3\";\n\n/** TRC20 balanceOf function selector (balanceOf(address)) */\nexport const TRC20_BALANCE_OF_SELECTOR = \"70a08231\";\n\n// =============================================================================\n// Gas and Fee Constants\n// =============================================================================\n\n/** Default fee limit for TRC20 transfers (in SUN, 1 TRX = 1,000,000 SUN) */\nexport const DEFAULT_FEE_LIMIT = 100_000_000; // 100 TRX\n\n/** Minimum fee limit for TRC20 transfers */\nexport const MIN_FEE_LIMIT = 10_000_000; // 10 TRX\n\n/** Maximum fee limit for TRC20 transfers */\nexport const MAX_FEE_LIMIT = 1_000_000_000; // 1000 TRX\n\n/** SUN per TRX (1 TRX = 1,000,000 SUN) */\nexport const SUN_PER_TRX = 1_000_000;\n\n// =============================================================================\n// Scheme Constants\n// =============================================================================\n\n/** Payment scheme identifier */\nexport const SCHEME_EXACT = \"exact\";\n\n/** Default transaction validity duration in seconds (1 hour) */\nexport const DEFAULT_VALIDITY_DURATION = 3600;\n\n/** Minimum validity buffer for verification (30 seconds) */\nexport const MIN_VALIDITY_BUFFER = 30;\n\n// =============================================================================\n// Address Constants\n// =============================================================================\n\n/** TRON address prefix (base58check) */\nexport const TRON_ADDRESS_PREFIX = \"T\";\n\n/** TRON address length (base58check format) */\nexport const TRON_ADDRESS_LENGTH = 34;\n\n/** TRON address hex prefix (0x41 in decimal = 65) */\nexport const TRON_ADDRESS_HEX_PREFIX = 0x41;\n\n// =============================================================================\n// USDT Contract Addresses\n// =============================================================================\n\n/** USDT TRC20 contract addresses by network */\nexport const USDT_ADDRESSES: Record<string, string> = {\n [TRON_MAINNET_CAIP2]: \"TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t\",\n [TRON_NILE_CAIP2]: \"TXYZopYRdj2D9XRtbG411XZZ3kM5VkAeBf\",\n [TRON_SHASTA_CAIP2]: \"TG3XXyExBkPp9nzdajDZsozEu4BkaSJozs\",\n};\n\n// =============================================================================\n// Token Decimals\n// =============================================================================\n\n/** Default decimals for USDT */\nexport const DEFAULT_USDT_DECIMALS = 6;\n\n/** Default decimals for TRX */\nexport const DEFAULT_TRX_DECIMALS = 6;\n","/**\n * TRON Utility Functions\n *\n * Address validation, amount conversion, and network utilities.\n */\n\nimport {\n TRON_NETWORKS,\n TRON_ADDRESS_LENGTH,\n TRON_ADDRESS_PREFIX,\n NETWORK_ENDPOINTS,\n DEFAULT_USDT_DECIMALS,\n} from \"./constants.js\";\nimport type { TronNetwork } from \"./constants.js\";\n\n// =============================================================================\n// Network Utilities\n// =============================================================================\n\n/**\n * Normalize network identifier to CAIP-2 format\n *\n * @param network - Network identifier (e.g., \"tron:mainnet\", \"mainnet\")\n * @returns Normalized CAIP-2 identifier\n * @throws Error if network is not supported\n */\nexport function normalizeNetwork(network: string): TronNetwork {\n // Already in correct format\n if (TRON_NETWORKS.includes(network as TronNetwork)) {\n return network as TronNetwork;\n }\n\n // Handle shorthand formats\n const lower = network.toLowerCase();\n if (lower === \"mainnet\" || lower === \"tron\") {\n return \"tron:mainnet\";\n }\n if (lower === \"nile\" || lower === \"tron-nile\") {\n return \"tron:nile\";\n }\n if (lower === \"shasta\" || lower === \"tron-shasta\") {\n return \"tron:shasta\";\n }\n\n throw new Error(`Unsupported TRON network: ${network}`);\n}\n\n/**\n * Get RPC endpoint for a network\n *\n * @param network - CAIP-2 network identifier\n * @returns RPC endpoint URL\n * @throws Error if network is not supported\n */\nexport function getEndpoint(network: string): string {\n const normalized = normalizeNetwork(network);\n const endpoint = NETWORK_ENDPOINTS[normalized];\n if (!endpoint) {\n throw new Error(`No endpoint configured for network: ${network}`);\n }\n return endpoint;\n}\n\n/**\n * Check if a network identifier is a TRON network\n *\n * @param network - Network identifier\n * @returns true if TRON network\n */\nexport function isTronNetwork(network: string): boolean {\n try {\n normalizeNetwork(network);\n return true;\n } catch {\n return false;\n }\n}\n\n// =============================================================================\n// Address Utilities\n// =============================================================================\n\n/**\n * Base58 alphabet for TRON addresses\n */\nconst BASE58_ALPHABET = \"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz\";\n\n/**\n * Validate a TRON address\n *\n * TRON addresses are:\n * - Base58check encoded\n * - 34 characters long\n * - Start with 'T' (mainnet) or 'A'/'4' (testnet - rare)\n *\n * @param address - Address to validate\n * @returns true if valid TRON address\n */\nexport function validateTronAddress(address: string): boolean {\n // Check length\n if (!address || address.length !== TRON_ADDRESS_LENGTH) {\n return false;\n }\n\n // Check prefix (mainnet addresses start with T)\n if (!address.startsWith(TRON_ADDRESS_PREFIX)) {\n return false;\n }\n\n // Check base58 characters\n for (const char of address) {\n if (!BASE58_ALPHABET.includes(char)) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Compare two TRON addresses for equality\n *\n * Handles case-insensitivity and different formats.\n *\n * @param addr1 - First address\n * @param addr2 - Second address\n * @returns true if addresses are equal\n */\nexport function addressesEqual(addr1: string, addr2: string): boolean {\n if (!addr1 || !addr2) return false;\n\n // TRON addresses are case-sensitive in base58, but we normalize for comparison\n // This handles potential mixed-case issues from different sources\n return addr1 === addr2;\n}\n\n/**\n * Format a TRON address for display\n *\n * @param address - Address to format\n * @param options - Formatting options\n * @returns Formatted address\n */\nexport function formatAddress(\n address: string,\n options?: {\n /** Truncate to first/last N characters */\n truncate?: number;\n },\n): string {\n if (!address) return \"\";\n\n if (options?.truncate && address.length > options.truncate * 2 + 3) {\n return `${address.slice(0, options.truncate)}...${address.slice(-options.truncate)}`;\n }\n\n return address;\n}\n\n// =============================================================================\n// Amount Utilities\n// =============================================================================\n\n/**\n * Convert decimal amount to smallest units\n *\n * @param decimalAmount - Amount as decimal string (e.g., \"1.50\")\n * @param decimals - Token decimals (default: 6 for USDT)\n * @returns Amount in smallest units as string\n */\nexport function convertToSmallestUnits(decimalAmount: string, decimals: number = DEFAULT_USDT_DECIMALS): string {\n const parts = decimalAmount.split(\".\");\n const wholePart = parts[0] || \"0\";\n let fractionalPart = parts[1] || \"\";\n\n // Pad or truncate fractional part to match decimals\n if (fractionalPart.length > decimals) {\n fractionalPart = fractionalPart.slice(0, decimals);\n } else {\n fractionalPart = fractionalPart.padEnd(decimals, \"0\");\n }\n\n // Combine and remove leading zeros\n const result = (wholePart + fractionalPart).replace(/^0+/, \"\") || \"0\";\n return result;\n}\n\n/**\n * Convert smallest units to decimal amount\n *\n * @param smallestUnits - Amount in smallest units as string\n * @param decimals - Token decimals (default: 6 for USDT)\n * @returns Amount as decimal string\n */\nexport function convertFromSmallestUnits(smallestUnits: string, decimals: number = DEFAULT_USDT_DECIMALS): string {\n const padded = smallestUnits.padStart(decimals + 1, \"0\");\n const wholePart = padded.slice(0, -decimals) || \"0\";\n const fractionalPart = padded.slice(-decimals);\n\n // Remove trailing zeros from fractional part\n const trimmedFractional = fractionalPart.replace(/0+$/, \"\");\n\n if (trimmedFractional) {\n return `${wholePart}.${trimmedFractional}`;\n }\n return wholePart;\n}\n\n// =============================================================================\n// Transaction Utilities\n// =============================================================================\n\n/**\n * Generate a unique memo/reference for payment tracking\n *\n * @returns Unique reference string\n */\nexport function generatePaymentReference(): string {\n const timestamp = Date.now();\n const random = Math.floor(Math.random() * 1000000);\n return `t402_${timestamp}_${random}`;\n}\n\n/**\n * Calculate transaction expiration time\n *\n * @param validitySeconds - Validity duration in seconds\n * @returns Expiration timestamp in milliseconds\n */\nexport function calculateExpiration(validitySeconds: number): number {\n return Date.now() + validitySeconds * 1000;\n}\n\n/**\n * Validate a hex string\n *\n * @param hex - String to validate\n * @returns true if valid hex string\n */\nexport function isValidHex(hex: string): boolean {\n if (!hex) return false;\n // Remove 0x prefix if present\n const cleanHex = hex.startsWith(\"0x\") ? hex.slice(2) : hex;\n return /^[0-9a-fA-F]+$/.test(cleanHex);\n}\n\n/**\n * Estimate transaction fee\n *\n * Note: Actual fees depend on energy/bandwidth consumption.\n * This provides a conservative estimate.\n *\n * @param isActivated - Whether recipient account is activated\n * @returns Estimated fee in SUN\n */\nexport function estimateTransactionFee(isActivated: boolean = true): number {\n // TRC20 transfer typically costs ~15-30 TRX in energy\n // New account activation adds ~1 TRX\n const baseFee = 30_000_000; // 30 TRX\n const activationFee = isActivated ? 0 : 1_000_000; // 1 TRX\n return baseFee + activationFee;\n}\n","/**\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":[]}
@@ -0,0 +1,123 @@
1
+ import { SchemeNetworkServer, MoneyParser, Price, Network, AssetAmount, PaymentRequirements } from '@t402/core/types';
2
+ import { t402ResourceServer } from '@t402/core/server';
3
+
4
+ /**
5
+ * TRON Exact Payment Scheme - Server Implementation
6
+ *
7
+ * Parses prices and enhances payment requirements for TRC20 payments.
8
+ */
9
+
10
+ /**
11
+ * Configuration for ExactTronScheme (server)
12
+ */
13
+ type ExactTronSchemeConfig = {
14
+ /** Preferred token symbol (default: highest priority) */
15
+ preferredToken?: string;
16
+ };
17
+ /**
18
+ * Server-side implementation of the TRON exact payment scheme
19
+ *
20
+ * This scheme parses prices and prepares payment requirements
21
+ * for TRC20 token transfers.
22
+ */
23
+ declare class ExactTronScheme implements SchemeNetworkServer {
24
+ readonly scheme = "exact";
25
+ private readonly config;
26
+ private readonly moneyParsers;
27
+ constructor(config?: ExactTronSchemeConfig);
28
+ /**
29
+ * Register a custom money parser
30
+ *
31
+ * Parsers are tried in registration order. Return null to pass to next parser.
32
+ *
33
+ * @param parser - Money parser function
34
+ * @returns This scheme for chaining
35
+ */
36
+ registerMoneyParser(parser: MoneyParser): ExactTronScheme;
37
+ /**
38
+ * Parse a price into an asset amount
39
+ *
40
+ * @param price - Price to parse (string, number, or AssetAmount)
41
+ * @param network - Target network
42
+ * @returns Parsed asset amount
43
+ */
44
+ parsePrice(price: Price, network: Network): Promise<AssetAmount>;
45
+ /**
46
+ * Enhance payment requirements with scheme-specific data
47
+ *
48
+ * @param requirements - Base payment requirements
49
+ * @param supportedKind - Supported payment kind
50
+ * @param extensionKeys - Extension keys to include
51
+ * @returns Enhanced payment requirements
52
+ */
53
+ enhancePaymentRequirements(requirements: PaymentRequirements, supportedKind: {
54
+ t402Version: number;
55
+ scheme: string;
56
+ network: Network;
57
+ extra?: Record<string, unknown>;
58
+ }, extensionKeys: string[]): Promise<PaymentRequirements>;
59
+ /**
60
+ * Parse money (string/number) to decimal number
61
+ */
62
+ private parseMoneyToDecimal;
63
+ /**
64
+ * Default money to asset conversion (USDT)
65
+ */
66
+ private defaultMoneyConversion;
67
+ /**
68
+ * Get default asset address for network
69
+ */
70
+ private getDefaultAsset;
71
+ /**
72
+ * Get token config by contract address
73
+ */
74
+ private getTokenByAddress;
75
+ }
76
+
77
+ /**
78
+ * TRON Server Scheme Registration
79
+ *
80
+ * Helper function to register TRON exact scheme with a t402 resource server.
81
+ */
82
+
83
+ /**
84
+ * Configuration options for registering TRON schemes to a t402ResourceServer
85
+ */
86
+ interface TronResourceServerConfig {
87
+ /**
88
+ * Optional specific networks to register
89
+ * If not provided, registers wildcard support (tron:*)
90
+ */
91
+ networks?: Network[];
92
+ /**
93
+ * Optional scheme configuration (preferred token, etc.)
94
+ */
95
+ schemeConfig?: ExactTronSchemeConfig;
96
+ }
97
+ /**
98
+ * Registers TRON exact payment schemes to a t402ResourceServer instance.
99
+ *
100
+ * This function registers:
101
+ * - V2: tron:* wildcard scheme with ExactTronScheme (or specific networks if provided)
102
+ *
103
+ * @param server - The t402ResourceServer instance to register schemes to
104
+ * @param config - Configuration for TRON resource server registration
105
+ * @returns The server instance for chaining
106
+ *
107
+ * @example
108
+ * ```typescript
109
+ * import { registerExactTronScheme } from "@t402/tron/exact/server";
110
+ * import { t402ResourceServer } from "@t402/core/server";
111
+ *
112
+ * const server = new t402ResourceServer(facilitatorClient);
113
+ * registerExactTronScheme(server, {});
114
+ *
115
+ * // Or with specific token preference
116
+ * registerExactTronScheme(server, {
117
+ * schemeConfig: { preferredToken: "USDT" }
118
+ * });
119
+ * ```
120
+ */
121
+ declare function registerExactTronScheme(server: t402ResourceServer, config?: TronResourceServerConfig): t402ResourceServer;
122
+
123
+ export { ExactTronScheme, type ExactTronSchemeConfig, type TronResourceServerConfig, registerExactTronScheme };