@t402/tron 1.0.0 → 2.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cjs/index.js CHANGED
@@ -3,9 +3,7 @@ var __defProp = Object.defineProperty;
3
3
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
4
  var __getOwnPropNames = Object.getOwnPropertyNames;
5
5
  var __hasOwnProp = Object.prototype.hasOwnProperty;
6
- var __esm = (fn, res) => function __init() {
7
- return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
8
- };
6
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
9
7
  var __export = (target, all) => {
10
8
  for (var name in all)
11
9
  __defProp(target, name, { get: all[name], enumerable: true });
@@ -19,142 +17,7 @@ var __copyProps = (to, from, except, desc) => {
19
17
  return to;
20
18
  };
21
19
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
22
-
23
- // src/constants.ts
24
- var TRON_MAINNET_CAIP2, TRON_NILE_CAIP2, TRON_SHASTA_CAIP2, TRON_NETWORKS, TRON_MAINNET_ENDPOINT, TRON_NILE_ENDPOINT, TRON_SHASTA_ENDPOINT, NETWORK_ENDPOINTS, TRC20_TRANSFER_SELECTOR, TRC20_APPROVE_SELECTOR, TRC20_BALANCE_OF_SELECTOR, DEFAULT_FEE_LIMIT, MIN_FEE_LIMIT, MAX_FEE_LIMIT, SUN_PER_TRX, SCHEME_EXACT, DEFAULT_VALIDITY_DURATION, MIN_VALIDITY_BUFFER, TRON_ADDRESS_PREFIX, TRON_ADDRESS_LENGTH, TRON_ADDRESS_HEX_PREFIX, USDT_ADDRESSES, DEFAULT_USDT_DECIMALS, DEFAULT_TRX_DECIMALS;
25
- var init_constants = __esm({
26
- "src/constants.ts"() {
27
- "use strict";
28
- TRON_MAINNET_CAIP2 = "tron:mainnet";
29
- TRON_NILE_CAIP2 = "tron:nile";
30
- TRON_SHASTA_CAIP2 = "tron:shasta";
31
- TRON_NETWORKS = [TRON_MAINNET_CAIP2, TRON_NILE_CAIP2, TRON_SHASTA_CAIP2];
32
- TRON_MAINNET_ENDPOINT = "https://api.trongrid.io";
33
- TRON_NILE_ENDPOINT = "https://api.nileex.io";
34
- TRON_SHASTA_ENDPOINT = "https://api.shasta.trongrid.io";
35
- NETWORK_ENDPOINTS = {
36
- [TRON_MAINNET_CAIP2]: TRON_MAINNET_ENDPOINT,
37
- [TRON_NILE_CAIP2]: TRON_NILE_ENDPOINT,
38
- [TRON_SHASTA_CAIP2]: TRON_SHASTA_ENDPOINT
39
- };
40
- TRC20_TRANSFER_SELECTOR = "a9059cbb";
41
- TRC20_APPROVE_SELECTOR = "095ea7b3";
42
- TRC20_BALANCE_OF_SELECTOR = "70a08231";
43
- DEFAULT_FEE_LIMIT = 1e8;
44
- MIN_FEE_LIMIT = 1e7;
45
- MAX_FEE_LIMIT = 1e9;
46
- SUN_PER_TRX = 1e6;
47
- SCHEME_EXACT = "exact";
48
- DEFAULT_VALIDITY_DURATION = 3600;
49
- MIN_VALIDITY_BUFFER = 30;
50
- TRON_ADDRESS_PREFIX = "T";
51
- TRON_ADDRESS_LENGTH = 34;
52
- TRON_ADDRESS_HEX_PREFIX = 65;
53
- USDT_ADDRESSES = {
54
- [TRON_MAINNET_CAIP2]: "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t",
55
- [TRON_NILE_CAIP2]: "TXYZopYRdj2D9XRtbG411XZZ3kM5VkAeBf",
56
- [TRON_SHASTA_CAIP2]: "TG3XXyExBkPp9nzdajDZsozEu4BkaSJozs"
57
- };
58
- DEFAULT_USDT_DECIMALS = 6;
59
- DEFAULT_TRX_DECIMALS = 6;
60
- }
61
- });
62
-
63
- // src/tokens.ts
64
- var tokens_exports = {};
65
- __export(tokens_exports, {
66
- TRC20_REGISTRY: () => TRC20_REGISTRY,
67
- getDefaultToken: () => getDefaultToken,
68
- getNetworkTokens: () => getNetworkTokens,
69
- getNetworksForToken: () => getNetworksForToken,
70
- getSupportedNetworks: () => getSupportedNetworks,
71
- getTRC20Config: () => getTRC20Config,
72
- getTokenByAddress: () => getTokenByAddress,
73
- getUsdtNetworks: () => getUsdtNetworks,
74
- isNetworkSupported: () => isNetworkSupported
75
- });
76
- function getTRC20Config(network, symbol) {
77
- const registry = TRC20_REGISTRY[network];
78
- if (!registry) return void 0;
79
- return registry.tokens[symbol];
80
- }
81
- function getNetworkTokens(network) {
82
- const registry = TRC20_REGISTRY[network];
83
- if (!registry) return [];
84
- return Object.values(registry.tokens);
85
- }
86
- function getDefaultToken(network) {
87
- const registry = TRC20_REGISTRY[network];
88
- return registry?.defaultToken;
89
- }
90
- function getTokenByAddress(network, contractAddress) {
91
- const registry = TRC20_REGISTRY[network];
92
- if (!registry) return void 0;
93
- const upperAddress = contractAddress.toUpperCase();
94
- return Object.values(registry.tokens).find(
95
- (token) => token.contractAddress.toUpperCase() === upperAddress
96
- );
97
- }
98
- function getNetworksForToken(symbol) {
99
- return Object.entries(TRC20_REGISTRY).filter(([_, registry]) => symbol in registry.tokens).map(([network]) => network);
100
- }
101
- function getUsdtNetworks() {
102
- return getNetworksForToken("USDT");
103
- }
104
- function isNetworkSupported(network) {
105
- return network in TRC20_REGISTRY;
106
- }
107
- function getSupportedNetworks() {
108
- return Object.keys(TRC20_REGISTRY);
109
- }
110
- var USDT_MAINNET, USDT_NILE, USDT_SHASTA, TRC20_REGISTRY;
111
- var init_tokens = __esm({
112
- "src/tokens.ts"() {
113
- "use strict";
114
- init_constants();
115
- USDT_MAINNET = {
116
- contractAddress: USDT_ADDRESSES[TRON_MAINNET_CAIP2],
117
- symbol: "USDT",
118
- name: "Tether USD",
119
- decimals: DEFAULT_USDT_DECIMALS
120
- };
121
- USDT_NILE = {
122
- contractAddress: USDT_ADDRESSES[TRON_NILE_CAIP2],
123
- symbol: "USDT",
124
- name: "Tether USD",
125
- decimals: DEFAULT_USDT_DECIMALS
126
- };
127
- USDT_SHASTA = {
128
- contractAddress: USDT_ADDRESSES[TRON_SHASTA_CAIP2],
129
- symbol: "USDT",
130
- name: "Tether USD",
131
- decimals: DEFAULT_USDT_DECIMALS
132
- };
133
- TRC20_REGISTRY = {
134
- [TRON_MAINNET_CAIP2]: {
135
- network: TRON_MAINNET_CAIP2,
136
- defaultToken: USDT_MAINNET,
137
- tokens: {
138
- USDT: USDT_MAINNET
139
- }
140
- },
141
- [TRON_NILE_CAIP2]: {
142
- network: TRON_NILE_CAIP2,
143
- defaultToken: USDT_NILE,
144
- tokens: {
145
- USDT: USDT_NILE
146
- }
147
- },
148
- [TRON_SHASTA_CAIP2]: {
149
- network: TRON_SHASTA_CAIP2,
150
- defaultToken: USDT_SHASTA,
151
- tokens: {
152
- USDT: USDT_SHASTA
153
- }
154
- }
155
- };
156
- }
157
- });
20
+ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
158
21
 
159
22
  // src/index.ts
160
23
  var src_exports = {};
@@ -209,11 +72,119 @@ __export(src_exports, {
209
72
  validateTronAddress: () => validateTronAddress
210
73
  });
211
74
  module.exports = __toCommonJS(src_exports);
212
- init_constants();
213
- init_tokens();
75
+
76
+ // src/constants.ts
77
+ var TRON_MAINNET_CAIP2 = "tron:mainnet";
78
+ var TRON_NILE_CAIP2 = "tron:nile";
79
+ var TRON_SHASTA_CAIP2 = "tron:shasta";
80
+ var TRON_NETWORKS = [TRON_MAINNET_CAIP2, TRON_NILE_CAIP2, TRON_SHASTA_CAIP2];
81
+ var TRON_MAINNET_ENDPOINT = "https://api.trongrid.io";
82
+ var TRON_NILE_ENDPOINT = "https://api.nileex.io";
83
+ var TRON_SHASTA_ENDPOINT = "https://api.shasta.trongrid.io";
84
+ var NETWORK_ENDPOINTS = {
85
+ [TRON_MAINNET_CAIP2]: TRON_MAINNET_ENDPOINT,
86
+ [TRON_NILE_CAIP2]: TRON_NILE_ENDPOINT,
87
+ [TRON_SHASTA_CAIP2]: TRON_SHASTA_ENDPOINT
88
+ };
89
+ var TRC20_TRANSFER_SELECTOR = "a9059cbb";
90
+ var TRC20_APPROVE_SELECTOR = "095ea7b3";
91
+ var TRC20_BALANCE_OF_SELECTOR = "70a08231";
92
+ var DEFAULT_FEE_LIMIT = 1e8;
93
+ var MIN_FEE_LIMIT = 1e7;
94
+ var MAX_FEE_LIMIT = 1e9;
95
+ var SUN_PER_TRX = 1e6;
96
+ var SCHEME_EXACT = "exact";
97
+ var DEFAULT_VALIDITY_DURATION = 3600;
98
+ var MIN_VALIDITY_BUFFER = 30;
99
+ var TRON_ADDRESS_PREFIX = "T";
100
+ var TRON_ADDRESS_LENGTH = 34;
101
+ var TRON_ADDRESS_HEX_PREFIX = 65;
102
+ var USDT_ADDRESSES = {
103
+ [TRON_MAINNET_CAIP2]: "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t",
104
+ [TRON_NILE_CAIP2]: "TXYZopYRdj2D9XRtbG411XZZ3kM5VkAeBf",
105
+ [TRON_SHASTA_CAIP2]: "TG3XXyExBkPp9nzdajDZsozEu4BkaSJozs"
106
+ };
107
+ var DEFAULT_USDT_DECIMALS = 6;
108
+ var DEFAULT_TRX_DECIMALS = 6;
109
+
110
+ // src/tokens.ts
111
+ var USDT_MAINNET = {
112
+ contractAddress: USDT_ADDRESSES[TRON_MAINNET_CAIP2],
113
+ symbol: "USDT",
114
+ name: "Tether USD",
115
+ decimals: DEFAULT_USDT_DECIMALS
116
+ };
117
+ var USDT_NILE = {
118
+ contractAddress: USDT_ADDRESSES[TRON_NILE_CAIP2],
119
+ symbol: "USDT",
120
+ name: "Tether USD",
121
+ decimals: DEFAULT_USDT_DECIMALS
122
+ };
123
+ var USDT_SHASTA = {
124
+ contractAddress: USDT_ADDRESSES[TRON_SHASTA_CAIP2],
125
+ symbol: "USDT",
126
+ name: "Tether USD",
127
+ decimals: DEFAULT_USDT_DECIMALS
128
+ };
129
+ var TRC20_REGISTRY = {
130
+ [TRON_MAINNET_CAIP2]: {
131
+ network: TRON_MAINNET_CAIP2,
132
+ defaultToken: USDT_MAINNET,
133
+ tokens: {
134
+ USDT: USDT_MAINNET
135
+ }
136
+ },
137
+ [TRON_NILE_CAIP2]: {
138
+ network: TRON_NILE_CAIP2,
139
+ defaultToken: USDT_NILE,
140
+ tokens: {
141
+ USDT: USDT_NILE
142
+ }
143
+ },
144
+ [TRON_SHASTA_CAIP2]: {
145
+ network: TRON_SHASTA_CAIP2,
146
+ defaultToken: USDT_SHASTA,
147
+ tokens: {
148
+ USDT: USDT_SHASTA
149
+ }
150
+ }
151
+ };
152
+ function getTRC20Config(network, symbol) {
153
+ const registry = TRC20_REGISTRY[network];
154
+ if (!registry) return void 0;
155
+ return registry.tokens[symbol];
156
+ }
157
+ function getNetworkTokens(network) {
158
+ const registry = TRC20_REGISTRY[network];
159
+ if (!registry) return [];
160
+ return Object.values(registry.tokens);
161
+ }
162
+ function getDefaultToken(network) {
163
+ const registry = TRC20_REGISTRY[network];
164
+ return registry?.defaultToken;
165
+ }
166
+ function getTokenByAddress(network, contractAddress) {
167
+ const registry = TRC20_REGISTRY[network];
168
+ if (!registry) return void 0;
169
+ const upperAddress = contractAddress.toUpperCase();
170
+ return Object.values(registry.tokens).find(
171
+ (token) => token.contractAddress.toUpperCase() === upperAddress
172
+ );
173
+ }
174
+ function getNetworksForToken(symbol) {
175
+ return Object.entries(TRC20_REGISTRY).filter(([_, registry]) => symbol in registry.tokens).map(([network]) => network);
176
+ }
177
+ function getUsdtNetworks() {
178
+ return getNetworksForToken("USDT");
179
+ }
180
+ function isNetworkSupported(network) {
181
+ return network in TRC20_REGISTRY;
182
+ }
183
+ function getSupportedNetworks() {
184
+ return Object.keys(TRC20_REGISTRY);
185
+ }
214
186
 
215
187
  // src/utils.ts
216
- init_constants();
217
188
  function normalizeNetwork(network) {
218
189
  if (TRON_NETWORKS.includes(network)) {
219
190
  return network;
@@ -288,7 +259,9 @@ function convertFromSmallestUnits(smallestUnits, decimals = DEFAULT_USDT_DECIMAL
288
259
  const padded = smallestUnits.padStart(decimals + 1, "0");
289
260
  const wholePart = padded.slice(0, -decimals) || "0";
290
261
  const fractionalPart = padded.slice(-decimals);
291
- const trimmedFractional = fractionalPart.replace(/0+$/, "");
262
+ let end = fractionalPart.length;
263
+ while (end > 0 && fractionalPart[end - 1] === "0") end--;
264
+ const trimmedFractional = fractionalPart.slice(0, end);
292
265
  if (trimmedFractional) {
293
266
  return `${wholePart}.${trimmedFractional}`;
294
267
  }
@@ -314,10 +287,11 @@ function estimateTransactionFee(isActivated = true) {
314
287
  }
315
288
 
316
289
  // src/exact/client/scheme.ts
317
- init_constants();
318
290
  var ExactTronScheme = class {
319
291
  constructor(signer, config) {
320
- this.scheme = SCHEME_EXACT;
292
+ __publicField(this, "scheme", SCHEME_EXACT);
293
+ __publicField(this, "signer");
294
+ __publicField(this, "config");
321
295
  this.signer = signer;
322
296
  this.config = config ?? {};
323
297
  }
@@ -399,13 +373,12 @@ function registerExactTronScheme(client, config) {
399
373
  }
400
374
 
401
375
  // src/exact/server/scheme.ts
402
- init_constants();
403
- init_tokens();
404
376
  var ExactTronScheme2 = class {
405
377
  constructor(config) {
406
- this.scheme = SCHEME_EXACT;
407
- this.moneyParsers = [];
408
- this.config = config ?? {};
378
+ __publicField(this, "scheme", SCHEME_EXACT);
379
+ __publicField(this, "_config");
380
+ __publicField(this, "moneyParsers", []);
381
+ this._config = config ?? {};
409
382
  }
410
383
  /**
411
384
  * Register a custom money parser
@@ -463,7 +436,7 @@ var ExactTronScheme2 = class {
463
436
  async enhancePaymentRequirements(requirements, supportedKind, extensionKeys) {
464
437
  void extensionKeys;
465
438
  const network = normalizeNetwork(String(requirements.network));
466
- let tokenConfig = requirements.asset ? getTRC20Config(network, requirements.asset) || this.getTokenByAddress(network, requirements.asset) : getDefaultToken(network);
439
+ let tokenConfig = requirements.asset ? getTRC20Config(network, requirements.asset) || getTokenByAddress(network, requirements.asset) : getDefaultToken(network);
467
440
  if (!tokenConfig) {
468
441
  tokenConfig = getDefaultToken(network);
469
442
  }
@@ -507,10 +480,14 @@ var ExactTronScheme2 = class {
507
480
  throw new Error(`Invalid price type: ${typeof price}`);
508
481
  }
509
482
  /**
510
- * Default money to asset conversion (USDT)
483
+ * Default money to asset conversion
484
+ * Uses preferredToken from config if set, otherwise falls back to network default
511
485
  */
512
486
  defaultMoneyConversion(decimalAmount, network) {
513
- const tokenConfig = getDefaultToken(network);
487
+ let tokenConfig = this._config.preferredToken ? getTRC20Config(network, this._config.preferredToken) : void 0;
488
+ if (!tokenConfig) {
489
+ tokenConfig = getDefaultToken(network);
490
+ }
514
491
  if (!tokenConfig) {
515
492
  throw new Error(`No default token for network: ${network}`);
516
493
  }
@@ -535,13 +512,6 @@ var ExactTronScheme2 = class {
535
512
  }
536
513
  return tokenConfig.contractAddress;
537
514
  }
538
- /**
539
- * Get token config by contract address
540
- */
541
- getTokenByAddress(network, address) {
542
- const { getTokenByAddress: getTokenByAddress2 } = (init_tokens(), __toCommonJS(tokens_exports));
543
- return getTokenByAddress2(network, address);
544
- }
545
515
  };
546
516
 
547
517
  // src/exact/server/register.ts
@@ -558,11 +528,12 @@ function registerExactTronScheme2(server, config = {}) {
558
528
  }
559
529
 
560
530
  // src/exact/facilitator/scheme.ts
561
- init_constants();
562
531
  var ExactTronScheme3 = class {
563
532
  constructor(signer, config) {
564
- this.scheme = SCHEME_EXACT;
565
- this.caipFamily = "tron:*";
533
+ __publicField(this, "scheme", SCHEME_EXACT);
534
+ __publicField(this, "caipFamily", "tron:*");
535
+ __publicField(this, "signer");
536
+ __publicField(this, "config");
566
537
  this.signer = signer;
567
538
  this.config = config ?? {};
568
539
  }
@@ -605,6 +576,13 @@ var ExactTronScheme3 = class {
605
576
  */
606
577
  async verify(payload, requirements) {
607
578
  const tronPayload = payload.payload;
579
+ if (!tronPayload?.authorization?.from || !tronPayload?.signedTransaction) {
580
+ return {
581
+ isValid: false,
582
+ invalidReason: "invalid_payload_structure",
583
+ payer: ""
584
+ };
585
+ }
608
586
  const authorization = tronPayload.authorization;
609
587
  if (payload.accepted.scheme !== SCHEME_EXACT || requirements.scheme !== SCHEME_EXACT) {
610
588
  return {
@@ -631,13 +609,6 @@ var ExactTronScheme3 = class {
631
609
  payer: authorization.from
632
610
  };
633
611
  }
634
- if (!tronPayload || !tronPayload.signedTransaction || !authorization) {
635
- return {
636
- isValid: false,
637
- invalidReason: "invalid_payload_structure",
638
- payer: authorization?.from || ""
639
- };
640
- }
641
612
  if (!validateTronAddress(authorization.from)) {
642
613
  return {
643
614
  isValid: false,
@@ -747,6 +718,15 @@ var ExactTronScheme3 = class {
747
718
  */
748
719
  async settle(payload, requirements) {
749
720
  const tronPayload = payload.payload;
721
+ if (!tronPayload?.authorization?.from || !tronPayload?.signedTransaction) {
722
+ return {
723
+ success: false,
724
+ network: payload.accepted.network,
725
+ transaction: "",
726
+ errorReason: "invalid_payload_structure",
727
+ payer: ""
728
+ };
729
+ }
750
730
  const verifyResult = await this.verify(payload, requirements);
751
731
  if (!verifyResult.isValid) {
752
732
  return {
@@ -759,10 +739,7 @@ var ExactTronScheme3 = class {
759
739
  }
760
740
  try {
761
741
  const network = normalizeNetwork(String(payload.accepted.network));
762
- const txId = await this.signer.broadcastTransaction(
763
- tronPayload.signedTransaction,
764
- network
765
- );
742
+ const txId = await this.signer.broadcastTransaction(tronPayload.signedTransaction, network);
766
743
  const confirmation = await this.signer.waitForTransaction({
767
744
  txId,
768
745
  network,