@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,350 @@
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 __esm = (fn, res) => function __init() {
7
+ return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
8
+ };
9
+ var __export = (target, all) => {
10
+ for (var name in all)
11
+ __defProp(target, name, { get: all[name], enumerable: true });
12
+ };
13
+ var __copyProps = (to, from, except, desc) => {
14
+ if (from && typeof from === "object" || typeof from === "function") {
15
+ for (let key of __getOwnPropNames(from))
16
+ if (!__hasOwnProp.call(to, key) && key !== except)
17
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
18
+ }
19
+ return to;
20
+ };
21
+ 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, SCHEME_EXACT, USDT_ADDRESSES, DEFAULT_USDT_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
+ SCHEME_EXACT = "exact";
41
+ USDT_ADDRESSES = {
42
+ [TRON_MAINNET_CAIP2]: "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t",
43
+ [TRON_NILE_CAIP2]: "TXYZopYRdj2D9XRtbG411XZZ3kM5VkAeBf",
44
+ [TRON_SHASTA_CAIP2]: "TG3XXyExBkPp9nzdajDZsozEu4BkaSJozs"
45
+ };
46
+ DEFAULT_USDT_DECIMALS = 6;
47
+ }
48
+ });
49
+
50
+ // src/tokens.ts
51
+ var tokens_exports = {};
52
+ __export(tokens_exports, {
53
+ TRC20_REGISTRY: () => TRC20_REGISTRY,
54
+ getDefaultToken: () => getDefaultToken,
55
+ getNetworkTokens: () => getNetworkTokens,
56
+ getNetworksForToken: () => getNetworksForToken,
57
+ getSupportedNetworks: () => getSupportedNetworks,
58
+ getTRC20Config: () => getTRC20Config,
59
+ getTokenByAddress: () => getTokenByAddress,
60
+ getUsdtNetworks: () => getUsdtNetworks,
61
+ isNetworkSupported: () => isNetworkSupported
62
+ });
63
+ function getTRC20Config(network, symbol) {
64
+ const registry = TRC20_REGISTRY[network];
65
+ if (!registry) return void 0;
66
+ return registry.tokens[symbol];
67
+ }
68
+ function getNetworkTokens(network) {
69
+ const registry = TRC20_REGISTRY[network];
70
+ if (!registry) return [];
71
+ return Object.values(registry.tokens);
72
+ }
73
+ function getDefaultToken(network) {
74
+ const registry = TRC20_REGISTRY[network];
75
+ return registry?.defaultToken;
76
+ }
77
+ function getTokenByAddress(network, contractAddress) {
78
+ const registry = TRC20_REGISTRY[network];
79
+ if (!registry) return void 0;
80
+ const upperAddress = contractAddress.toUpperCase();
81
+ return Object.values(registry.tokens).find(
82
+ (token) => token.contractAddress.toUpperCase() === upperAddress
83
+ );
84
+ }
85
+ function getNetworksForToken(symbol) {
86
+ return Object.entries(TRC20_REGISTRY).filter(([_, registry]) => symbol in registry.tokens).map(([network]) => network);
87
+ }
88
+ function getUsdtNetworks() {
89
+ return getNetworksForToken("USDT");
90
+ }
91
+ function isNetworkSupported(network) {
92
+ return network in TRC20_REGISTRY;
93
+ }
94
+ function getSupportedNetworks() {
95
+ return Object.keys(TRC20_REGISTRY);
96
+ }
97
+ var USDT_MAINNET, USDT_NILE, USDT_SHASTA, TRC20_REGISTRY;
98
+ var init_tokens = __esm({
99
+ "src/tokens.ts"() {
100
+ "use strict";
101
+ init_constants();
102
+ USDT_MAINNET = {
103
+ contractAddress: USDT_ADDRESSES[TRON_MAINNET_CAIP2],
104
+ symbol: "USDT",
105
+ name: "Tether USD",
106
+ decimals: DEFAULT_USDT_DECIMALS
107
+ };
108
+ USDT_NILE = {
109
+ contractAddress: USDT_ADDRESSES[TRON_NILE_CAIP2],
110
+ symbol: "USDT",
111
+ name: "Tether USD",
112
+ decimals: DEFAULT_USDT_DECIMALS
113
+ };
114
+ USDT_SHASTA = {
115
+ contractAddress: USDT_ADDRESSES[TRON_SHASTA_CAIP2],
116
+ symbol: "USDT",
117
+ name: "Tether USD",
118
+ decimals: DEFAULT_USDT_DECIMALS
119
+ };
120
+ TRC20_REGISTRY = {
121
+ [TRON_MAINNET_CAIP2]: {
122
+ network: TRON_MAINNET_CAIP2,
123
+ defaultToken: USDT_MAINNET,
124
+ tokens: {
125
+ USDT: USDT_MAINNET
126
+ }
127
+ },
128
+ [TRON_NILE_CAIP2]: {
129
+ network: TRON_NILE_CAIP2,
130
+ defaultToken: USDT_NILE,
131
+ tokens: {
132
+ USDT: USDT_NILE
133
+ }
134
+ },
135
+ [TRON_SHASTA_CAIP2]: {
136
+ network: TRON_SHASTA_CAIP2,
137
+ defaultToken: USDT_SHASTA,
138
+ tokens: {
139
+ USDT: USDT_SHASTA
140
+ }
141
+ }
142
+ };
143
+ }
144
+ });
145
+
146
+ // src/exact/server/index.ts
147
+ var server_exports = {};
148
+ __export(server_exports, {
149
+ ExactTronScheme: () => ExactTronScheme,
150
+ registerExactTronScheme: () => registerExactTronScheme
151
+ });
152
+ module.exports = __toCommonJS(server_exports);
153
+
154
+ // src/exact/server/scheme.ts
155
+ init_constants();
156
+
157
+ // src/utils.ts
158
+ init_constants();
159
+ function normalizeNetwork(network) {
160
+ if (TRON_NETWORKS.includes(network)) {
161
+ return network;
162
+ }
163
+ const lower = network.toLowerCase();
164
+ if (lower === "mainnet" || lower === "tron") {
165
+ return "tron:mainnet";
166
+ }
167
+ if (lower === "nile" || lower === "tron-nile") {
168
+ return "tron:nile";
169
+ }
170
+ if (lower === "shasta" || lower === "tron-shasta") {
171
+ return "tron:shasta";
172
+ }
173
+ throw new Error(`Unsupported TRON network: ${network}`);
174
+ }
175
+ function convertToSmallestUnits(decimalAmount, decimals = DEFAULT_USDT_DECIMALS) {
176
+ const parts = decimalAmount.split(".");
177
+ const wholePart = parts[0] || "0";
178
+ let fractionalPart = parts[1] || "";
179
+ if (fractionalPart.length > decimals) {
180
+ fractionalPart = fractionalPart.slice(0, decimals);
181
+ } else {
182
+ fractionalPart = fractionalPart.padEnd(decimals, "0");
183
+ }
184
+ const result = (wholePart + fractionalPart).replace(/^0+/, "") || "0";
185
+ return result;
186
+ }
187
+
188
+ // src/exact/server/scheme.ts
189
+ init_tokens();
190
+ var ExactTronScheme = class {
191
+ constructor(config) {
192
+ this.scheme = SCHEME_EXACT;
193
+ this.moneyParsers = [];
194
+ this.config = config ?? {};
195
+ }
196
+ /**
197
+ * Register a custom money parser
198
+ *
199
+ * Parsers are tried in registration order. Return null to pass to next parser.
200
+ *
201
+ * @param parser - Money parser function
202
+ * @returns This scheme for chaining
203
+ */
204
+ registerMoneyParser(parser) {
205
+ this.moneyParsers.push(parser);
206
+ return this;
207
+ }
208
+ /**
209
+ * Parse a price into an asset amount
210
+ *
211
+ * @param price - Price to parse (string, number, or AssetAmount)
212
+ * @param network - Target network
213
+ * @returns Parsed asset amount
214
+ */
215
+ async parsePrice(price, network) {
216
+ const normalizedNetwork = normalizeNetwork(String(network));
217
+ if (!isNetworkSupported(normalizedNetwork)) {
218
+ throw new Error(`Unsupported network: ${network}`);
219
+ }
220
+ if (typeof price === "object" && price !== null && "amount" in price) {
221
+ const assetAmount = price;
222
+ return {
223
+ amount: assetAmount.amount,
224
+ asset: assetAmount.asset || this.getDefaultAsset(normalizedNetwork),
225
+ extra: assetAmount.extra
226
+ };
227
+ }
228
+ const decimalAmount = this.parseMoneyToDecimal(price);
229
+ for (const parser of this.moneyParsers) {
230
+ try {
231
+ const result = await parser(decimalAmount, network);
232
+ if (result !== null) {
233
+ return result;
234
+ }
235
+ } catch {
236
+ continue;
237
+ }
238
+ }
239
+ return this.defaultMoneyConversion(decimalAmount, normalizedNetwork);
240
+ }
241
+ /**
242
+ * Enhance payment requirements with scheme-specific data
243
+ *
244
+ * @param requirements - Base payment requirements
245
+ * @param supportedKind - Supported payment kind
246
+ * @param extensionKeys - Extension keys to include
247
+ * @returns Enhanced payment requirements
248
+ */
249
+ async enhancePaymentRequirements(requirements, supportedKind, extensionKeys) {
250
+ void extensionKeys;
251
+ const network = normalizeNetwork(String(requirements.network));
252
+ let tokenConfig = requirements.asset ? getTRC20Config(network, requirements.asset) || this.getTokenByAddress(network, requirements.asset) : getDefaultToken(network);
253
+ if (!tokenConfig) {
254
+ tokenConfig = getDefaultToken(network);
255
+ }
256
+ const extra = { ...requirements.extra };
257
+ if (tokenConfig) {
258
+ extra.symbol = tokenConfig.symbol;
259
+ extra.name = tokenConfig.name;
260
+ extra.decimals = tokenConfig.decimals;
261
+ }
262
+ if (supportedKind.extra) {
263
+ for (const key of extensionKeys) {
264
+ if (key in supportedKind.extra) {
265
+ extra[key] = supportedKind.extra[key];
266
+ }
267
+ }
268
+ }
269
+ return {
270
+ ...requirements,
271
+ asset: tokenConfig?.contractAddress || requirements.asset,
272
+ extra
273
+ };
274
+ }
275
+ /**
276
+ * Parse money (string/number) to decimal number
277
+ */
278
+ parseMoneyToDecimal(price) {
279
+ if (typeof price === "number") {
280
+ return price;
281
+ }
282
+ if (typeof price === "string") {
283
+ let cleanPrice = price.trim();
284
+ cleanPrice = cleanPrice.replace(/^\$/, "").trim();
285
+ const parts = cleanPrice.split(/\s+/);
286
+ const numericPart = parts[0];
287
+ const parsed = parseFloat(numericPart);
288
+ if (isNaN(parsed)) {
289
+ throw new Error(`Failed to parse price: ${price}`);
290
+ }
291
+ return parsed;
292
+ }
293
+ throw new Error(`Invalid price type: ${typeof price}`);
294
+ }
295
+ /**
296
+ * Default money to asset conversion (USDT)
297
+ */
298
+ defaultMoneyConversion(decimalAmount, network) {
299
+ const tokenConfig = getDefaultToken(network);
300
+ if (!tokenConfig) {
301
+ throw new Error(`No default token for network: ${network}`);
302
+ }
303
+ const amount = convertToSmallestUnits(decimalAmount.toFixed(6), tokenConfig.decimals);
304
+ return {
305
+ amount,
306
+ asset: tokenConfig.contractAddress,
307
+ extra: {
308
+ symbol: tokenConfig.symbol,
309
+ name: tokenConfig.name,
310
+ decimals: tokenConfig.decimals
311
+ }
312
+ };
313
+ }
314
+ /**
315
+ * Get default asset address for network
316
+ */
317
+ getDefaultAsset(network) {
318
+ const tokenConfig = getDefaultToken(network);
319
+ if (!tokenConfig) {
320
+ throw new Error(`No default token for network: ${network}`);
321
+ }
322
+ return tokenConfig.contractAddress;
323
+ }
324
+ /**
325
+ * Get token config by contract address
326
+ */
327
+ getTokenByAddress(network, address) {
328
+ const { getTokenByAddress: getTokenByAddress2 } = (init_tokens(), __toCommonJS(tokens_exports));
329
+ return getTokenByAddress2(network, address);
330
+ }
331
+ };
332
+
333
+ // src/exact/server/register.ts
334
+ function registerExactTronScheme(server, config = {}) {
335
+ const scheme = new ExactTronScheme(config.schemeConfig);
336
+ if (config.networks && config.networks.length > 0) {
337
+ config.networks.forEach((network) => {
338
+ server.register(network, scheme);
339
+ });
340
+ } else {
341
+ server.register("tron:*", scheme);
342
+ }
343
+ return server;
344
+ }
345
+ // Annotate the CommonJS export names for ESM import in node:
346
+ 0 && (module.exports = {
347
+ ExactTronScheme,
348
+ registerExactTronScheme
349
+ });
350
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/constants.ts","../../../../src/tokens.ts","../../../../src/exact/server/index.ts","../../../../src/exact/server/scheme.ts","../../../../src/utils.ts","../../../../src/exact/server/register.ts"],"sourcesContent":["/**\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 * 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","export { ExactTronScheme } from \"./scheme.js\";\nexport type { ExactTronSchemeConfig } from \"./scheme.js\";\nexport { registerExactTronScheme } from \"./register.js\";\nexport type { TronResourceServerConfig } from \"./register.js\";\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 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 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"]}
@@ -0,0 +1,237 @@
1
+ import { N as NetworkTRC20Registry, T as TRC20Config } from './signer-BB-HLs-P.js';
2
+ export { C as ClientTronSigner, E as ExactTronPayload, b as ExactTronPayloadV2, F as FacilitatorTronSigner, c as TransactionConfirmation, a as TronAuthorization, V as VerifyMessageResult } from './signer-BB-HLs-P.js';
3
+ export { ExactTronScheme as ExactTronClientScheme, ExactTronSchemeConfig as ExactTronClientSchemeConfig, TronClientConfig, registerExactTronScheme as registerExactTronClientScheme } from './exact/client/index.js';
4
+ export { ExactTronScheme as ExactTronServerScheme, ExactTronSchemeConfig as ExactTronServerSchemeConfig, TronResourceServerConfig, registerExactTronScheme as registerExactTronServerScheme } from './exact/server/index.js';
5
+ export { ExactTronScheme as ExactTronFacilitatorScheme, ExactTronSchemeConfig as ExactTronFacilitatorSchemeConfig, TronFacilitatorConfig, registerExactTronScheme as registerExactTronFacilitatorScheme } from './exact/facilitator/index.js';
6
+ import '@t402/core/types';
7
+ import '@t402/core/client';
8
+ import '@t402/core/server';
9
+ import '@t402/core/facilitator';
10
+
11
+ /**
12
+ * TRON Network Constants
13
+ *
14
+ * Network identifiers, endpoints, and configuration for TRON blockchain.
15
+ */
16
+ /** TRON Mainnet CAIP-2 identifier */
17
+ declare const TRON_MAINNET_CAIP2 = "tron:mainnet";
18
+ /** TRON Nile Testnet CAIP-2 identifier */
19
+ declare const TRON_NILE_CAIP2 = "tron:nile";
20
+ /** TRON Shasta Testnet CAIP-2 identifier */
21
+ declare const TRON_SHASTA_CAIP2 = "tron:shasta";
22
+ /** All supported TRON networks */
23
+ declare const TRON_NETWORKS: readonly ["tron:mainnet", "tron:nile", "tron:shasta"];
24
+ /** TRON network type */
25
+ type TronNetwork = (typeof TRON_NETWORKS)[number];
26
+ /** Network to endpoint mapping */
27
+ declare const NETWORK_ENDPOINTS: Record<string, string>;
28
+ /** TRC20 transfer function selector (transfer(address,uint256)) */
29
+ declare const TRC20_TRANSFER_SELECTOR = "a9059cbb";
30
+ /** TRC20 approve function selector (approve(address,uint256)) */
31
+ declare const TRC20_APPROVE_SELECTOR = "095ea7b3";
32
+ /** TRC20 balanceOf function selector (balanceOf(address)) */
33
+ declare const TRC20_BALANCE_OF_SELECTOR = "70a08231";
34
+ /** Default fee limit for TRC20 transfers (in SUN, 1 TRX = 1,000,000 SUN) */
35
+ declare const DEFAULT_FEE_LIMIT = 100000000;
36
+ /** Minimum fee limit for TRC20 transfers */
37
+ declare const MIN_FEE_LIMIT = 10000000;
38
+ /** Maximum fee limit for TRC20 transfers */
39
+ declare const MAX_FEE_LIMIT = 1000000000;
40
+ /** SUN per TRX (1 TRX = 1,000,000 SUN) */
41
+ declare const SUN_PER_TRX = 1000000;
42
+ /** Payment scheme identifier */
43
+ declare const SCHEME_EXACT = "exact";
44
+ /** Default transaction validity duration in seconds (1 hour) */
45
+ declare const DEFAULT_VALIDITY_DURATION = 3600;
46
+ /** Minimum validity buffer for verification (30 seconds) */
47
+ declare const MIN_VALIDITY_BUFFER = 30;
48
+ /** TRON address prefix (base58check) */
49
+ declare const TRON_ADDRESS_PREFIX = "T";
50
+ /** TRON address length (base58check format) */
51
+ declare const TRON_ADDRESS_LENGTH = 34;
52
+ /** TRON address hex prefix (0x41 in decimal = 65) */
53
+ declare const TRON_ADDRESS_HEX_PREFIX = 65;
54
+ /** USDT TRC20 contract addresses by network */
55
+ declare const USDT_ADDRESSES: Record<string, string>;
56
+ /** Default decimals for USDT */
57
+ declare const DEFAULT_USDT_DECIMALS = 6;
58
+ /** Default decimals for TRX */
59
+ declare const DEFAULT_TRX_DECIMALS = 6;
60
+
61
+ /**
62
+ * TRC20 Token Configuration
63
+ *
64
+ * Registry of supported TRC20 tokens for each TRON network.
65
+ */
66
+
67
+ /**
68
+ * Registry of TRC20 tokens by network
69
+ */
70
+ declare const TRC20_REGISTRY: Record<string, NetworkTRC20Registry>;
71
+ /**
72
+ * Get TRC20 configuration for a specific token on a network
73
+ *
74
+ * @param network - CAIP-2 network identifier
75
+ * @param symbol - Token symbol (e.g., "USDT")
76
+ * @returns Token configuration or undefined if not found
77
+ */
78
+ declare function getTRC20Config(network: string, symbol: string): TRC20Config | undefined;
79
+ /**
80
+ * Get all TRC20 tokens for a network
81
+ *
82
+ * @param network - CAIP-2 network identifier
83
+ * @returns Array of token configurations
84
+ */
85
+ declare function getNetworkTokens(network: string): TRC20Config[];
86
+ /**
87
+ * Get the default TRC20 token for a network
88
+ *
89
+ * @param network - CAIP-2 network identifier
90
+ * @returns Default token configuration or undefined
91
+ */
92
+ declare function getDefaultToken(network: string): TRC20Config | undefined;
93
+ /**
94
+ * Get token by contract address
95
+ *
96
+ * @param network - CAIP-2 network identifier
97
+ * @param contractAddress - TRC20 contract address
98
+ * @returns Token configuration or undefined
99
+ */
100
+ declare function getTokenByAddress(network: string, contractAddress: string): TRC20Config | undefined;
101
+ /**
102
+ * Get all networks that support a specific token
103
+ *
104
+ * @param symbol - Token symbol (e.g., "USDT")
105
+ * @returns Array of network identifiers
106
+ */
107
+ declare function getNetworksForToken(symbol: string): string[];
108
+ /**
109
+ * Get all networks that support USDT
110
+ *
111
+ * @returns Array of network identifiers
112
+ */
113
+ declare function getUsdtNetworks(): string[];
114
+ /**
115
+ * Check if a network is supported
116
+ *
117
+ * @param network - CAIP-2 network identifier
118
+ * @returns true if network is supported
119
+ */
120
+ declare function isNetworkSupported(network: string): boolean;
121
+ /**
122
+ * Get all supported networks
123
+ *
124
+ * @returns Array of network identifiers
125
+ */
126
+ declare function getSupportedNetworks(): string[];
127
+
128
+ /**
129
+ * TRON Utility Functions
130
+ *
131
+ * Address validation, amount conversion, and network utilities.
132
+ */
133
+
134
+ /**
135
+ * Normalize network identifier to CAIP-2 format
136
+ *
137
+ * @param network - Network identifier (e.g., "tron:mainnet", "mainnet")
138
+ * @returns Normalized CAIP-2 identifier
139
+ * @throws Error if network is not supported
140
+ */
141
+ declare function normalizeNetwork(network: string): TronNetwork;
142
+ /**
143
+ * Get RPC endpoint for a network
144
+ *
145
+ * @param network - CAIP-2 network identifier
146
+ * @returns RPC endpoint URL
147
+ * @throws Error if network is not supported
148
+ */
149
+ declare function getEndpoint(network: string): string;
150
+ /**
151
+ * Check if a network identifier is a TRON network
152
+ *
153
+ * @param network - Network identifier
154
+ * @returns true if TRON network
155
+ */
156
+ declare function isTronNetwork(network: string): boolean;
157
+ /**
158
+ * Validate a TRON address
159
+ *
160
+ * TRON addresses are:
161
+ * - Base58check encoded
162
+ * - 34 characters long
163
+ * - Start with 'T' (mainnet) or 'A'/'4' (testnet - rare)
164
+ *
165
+ * @param address - Address to validate
166
+ * @returns true if valid TRON address
167
+ */
168
+ declare function validateTronAddress(address: string): boolean;
169
+ /**
170
+ * Compare two TRON addresses for equality
171
+ *
172
+ * Handles case-insensitivity and different formats.
173
+ *
174
+ * @param addr1 - First address
175
+ * @param addr2 - Second address
176
+ * @returns true if addresses are equal
177
+ */
178
+ declare function addressesEqual(addr1: string, addr2: string): boolean;
179
+ /**
180
+ * Format a TRON address for display
181
+ *
182
+ * @param address - Address to format
183
+ * @param options - Formatting options
184
+ * @returns Formatted address
185
+ */
186
+ declare function formatAddress(address: string, options?: {
187
+ /** Truncate to first/last N characters */
188
+ truncate?: number;
189
+ }): string;
190
+ /**
191
+ * Convert decimal amount to smallest units
192
+ *
193
+ * @param decimalAmount - Amount as decimal string (e.g., "1.50")
194
+ * @param decimals - Token decimals (default: 6 for USDT)
195
+ * @returns Amount in smallest units as string
196
+ */
197
+ declare function convertToSmallestUnits(decimalAmount: string, decimals?: number): string;
198
+ /**
199
+ * Convert smallest units to decimal amount
200
+ *
201
+ * @param smallestUnits - Amount in smallest units as string
202
+ * @param decimals - Token decimals (default: 6 for USDT)
203
+ * @returns Amount as decimal string
204
+ */
205
+ declare function convertFromSmallestUnits(smallestUnits: string, decimals?: number): string;
206
+ /**
207
+ * Generate a unique memo/reference for payment tracking
208
+ *
209
+ * @returns Unique reference string
210
+ */
211
+ declare function generatePaymentReference(): string;
212
+ /**
213
+ * Calculate transaction expiration time
214
+ *
215
+ * @param validitySeconds - Validity duration in seconds
216
+ * @returns Expiration timestamp in milliseconds
217
+ */
218
+ declare function calculateExpiration(validitySeconds: number): number;
219
+ /**
220
+ * Validate a hex string
221
+ *
222
+ * @param hex - String to validate
223
+ * @returns true if valid hex string
224
+ */
225
+ declare function isValidHex(hex: string): boolean;
226
+ /**
227
+ * Estimate transaction fee
228
+ *
229
+ * Note: Actual fees depend on energy/bandwidth consumption.
230
+ * This provides a conservative estimate.
231
+ *
232
+ * @param isActivated - Whether recipient account is activated
233
+ * @returns Estimated fee in SUN
234
+ */
235
+ declare function estimateTransactionFee(isActivated?: boolean): number;
236
+
237
+ export { DEFAULT_FEE_LIMIT, DEFAULT_TRX_DECIMALS, DEFAULT_USDT_DECIMALS, DEFAULT_VALIDITY_DURATION, MAX_FEE_LIMIT, MIN_FEE_LIMIT, MIN_VALIDITY_BUFFER, NETWORK_ENDPOINTS, NetworkTRC20Registry, SCHEME_EXACT, SUN_PER_TRX, TRC20Config, TRC20_APPROVE_SELECTOR, TRC20_BALANCE_OF_SELECTOR, TRC20_REGISTRY, TRC20_TRANSFER_SELECTOR, TRON_ADDRESS_HEX_PREFIX, TRON_ADDRESS_LENGTH, TRON_ADDRESS_PREFIX, TRON_MAINNET_CAIP2, TRON_NETWORKS, TRON_NILE_CAIP2, TRON_SHASTA_CAIP2, type TronNetwork, USDT_ADDRESSES, addressesEqual, calculateExpiration, convertFromSmallestUnits, convertToSmallestUnits, estimateTransactionFee, formatAddress, generatePaymentReference, getDefaultToken, getEndpoint, getNetworkTokens, getNetworksForToken, getSupportedNetworks, getTRC20Config, getTokenByAddress, getUsdtNetworks, isNetworkSupported, isTronNetwork, isValidHex, normalizeNetwork, validateTronAddress };