@t402/tron 2.3.1 → 2.5.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 (41) hide show
  1. package/README.md +39 -30
  2. package/dist/cjs/exact/client/index.d.ts +2 -2
  3. package/dist/cjs/exact/client/index.js +1 -0
  4. package/dist/cjs/exact/client/index.js.map +1 -1
  5. package/dist/cjs/exact/facilitator/index.d.ts +1 -1
  6. package/dist/cjs/exact/facilitator/index.js +1 -0
  7. package/dist/cjs/exact/facilitator/index.js.map +1 -1
  8. package/dist/cjs/exact/server/index.js +1 -0
  9. package/dist/cjs/exact/server/index.js.map +1 -1
  10. package/dist/cjs/index.d.ts +4 -2
  11. package/dist/cjs/index.js +63 -1
  12. package/dist/cjs/index.js.map +1 -1
  13. package/dist/cjs/{signer-BB-HLs-P.d.ts → signer-iuJaSShT.d.ts} +1 -1
  14. package/dist/cjs/upto/index.d.ts +82 -0
  15. package/dist/cjs/upto/index.js +89 -0
  16. package/dist/cjs/upto/index.js.map +1 -0
  17. package/dist/esm/{chunk-5QY7AVRU.mjs → chunk-64IMOFLN.mjs} +5 -3
  18. package/dist/esm/{chunk-5QY7AVRU.mjs.map → chunk-64IMOFLN.mjs.map} +1 -1
  19. package/dist/esm/{chunk-NP4MIP3N.mjs → chunk-C6ANAART.mjs} +5 -3
  20. package/dist/esm/{chunk-NP4MIP3N.mjs.map → chunk-C6ANAART.mjs.map} +1 -1
  21. package/dist/esm/{chunk-5HUXHQSQ.mjs → chunk-COESQEG6.mjs} +5 -3
  22. package/dist/esm/{chunk-5HUXHQSQ.mjs.map → chunk-COESQEG6.mjs.map} +1 -1
  23. package/dist/esm/{chunk-MTL3FNSQ.mjs → chunk-JZLCALMX.mjs} +3 -7
  24. package/dist/esm/chunk-JZLCALMX.mjs.map +1 -0
  25. package/dist/esm/chunk-NSSMTXJJ.mjs +8 -0
  26. package/dist/esm/chunk-NSSMTXJJ.mjs.map +1 -0
  27. package/dist/esm/chunk-YHPIW52A.mjs +62 -0
  28. package/dist/esm/chunk-YHPIW52A.mjs.map +1 -0
  29. package/dist/esm/exact/client/index.d.mts +2 -2
  30. package/dist/esm/exact/client/index.mjs +3 -2
  31. package/dist/esm/exact/facilitator/index.d.mts +1 -1
  32. package/dist/esm/exact/facilitator/index.mjs +3 -2
  33. package/dist/esm/exact/server/index.mjs +3 -2
  34. package/dist/esm/index.d.mts +4 -2
  35. package/dist/esm/index.mjs +11 -4
  36. package/dist/esm/{signer-BB-HLs-P.d.mts → signer-iuJaSShT.d.mts} +1 -1
  37. package/dist/esm/upto/index.d.mts +82 -0
  38. package/dist/esm/upto/index.mjs +10 -0
  39. package/dist/esm/upto/index.mjs.map +1 -0
  40. package/package.json +22 -12
  41. package/dist/esm/chunk-MTL3FNSQ.mjs.map +0 -1
@@ -1,10 +1,12 @@
1
1
  import {
2
2
  DEFAULT_FEE_LIMIT,
3
3
  SCHEME_EXACT,
4
- __publicField,
5
4
  normalizeNetwork,
6
5
  validateTronAddress
7
- } from "./chunk-MTL3FNSQ.mjs";
6
+ } from "./chunk-JZLCALMX.mjs";
7
+ import {
8
+ __publicField
9
+ } from "./chunk-NSSMTXJJ.mjs";
8
10
 
9
11
  // src/exact/client/scheme.ts
10
12
  var ExactTronScheme = class {
@@ -96,4 +98,4 @@ export {
96
98
  ExactTronScheme,
97
99
  registerExactTronScheme
98
100
  };
99
- //# sourceMappingURL=chunk-5QY7AVRU.mjs.map
101
+ //# sourceMappingURL=chunk-64IMOFLN.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/exact/client/scheme.ts","../../src/exact/client/register.ts"],"sourcesContent":["/**\n * TRON Exact Payment Scheme - Client Implementation\n *\n * Creates payment payloads for TRC20 token transfers.\n */\n\nimport type { PaymentPayload, PaymentRequirements, SchemeNetworkClient } from '@t402/core/types'\nimport type { ClientTronSigner } from '../../signer.js'\nimport type { ExactTronPayload, TronAuthorization } from '../../types.js'\nimport { SCHEME_EXACT, DEFAULT_FEE_LIMIT } from '../../constants.js'\nimport { normalizeNetwork, validateTronAddress } from '../../utils.js'\n\n/**\n * Configuration for ExactTronScheme\n */\nexport type ExactTronSchemeConfig = {\n /** Fee limit for transactions in SUN (default: 100 TRX) */\n feeLimit?: number\n}\n\n/**\n * Client-side implementation of the TRON exact payment scheme\n *\n * This scheme creates pre-signed TRC20 transfer transactions\n * that can be verified and broadcast by the facilitator.\n */\nexport class ExactTronScheme implements SchemeNetworkClient {\n readonly scheme = SCHEME_EXACT\n private readonly signer: ClientTronSigner\n private readonly config: ExactTronSchemeConfig\n\n constructor(signer: ClientTronSigner, config?: ExactTronSchemeConfig) {\n this.signer = signer\n this.config = config ?? {}\n }\n\n /**\n * Creates a payment payload for a TRC20 transfer\n *\n * @param t402Version - Protocol version (must be 2)\n * @param requirements - Payment requirements from server\n * @returns Payment payload with signed transaction\n */\n async createPaymentPayload(\n t402Version: number,\n requirements: PaymentRequirements,\n ): Promise<Pick<PaymentPayload, 't402Version' | 'payload'>> {\n // Normalize and validate network\n const network = normalizeNetwork(String(requirements.network))\n\n // Validate required fields\n if (!requirements.asset) {\n throw new Error('Asset (TRC20 contract address) is required')\n }\n if (!requirements.payTo) {\n throw new Error('PayTo address is required')\n }\n if (!requirements.amount) {\n throw new Error('Amount is required')\n }\n\n // Validate addresses\n if (!validateTronAddress(requirements.asset)) {\n throw new Error(`Invalid TRC20 contract address: ${requirements.asset}`)\n }\n if (!validateTronAddress(requirements.payTo)) {\n throw new Error(`Invalid payTo address: ${requirements.payTo}`)\n }\n if (!validateTronAddress(this.signer.address)) {\n throw new Error(`Invalid signer address: ${this.signer.address}`)\n }\n\n // Get block info for transaction\n const blockInfo = await this.signer.getBlockInfo()\n\n // Calculate expiration\n const expiration = blockInfo.expiration\n\n // Get fee limit\n const feeLimit = this.config.feeLimit ?? DEFAULT_FEE_LIMIT\n\n // Sign the transaction\n const signedTransaction = await this.signer.signTransaction({\n contractAddress: requirements.asset,\n to: requirements.payTo,\n amount: requirements.amount,\n feeLimit,\n expiration,\n })\n\n // Build authorization metadata\n const authorization: TronAuthorization = {\n from: this.signer.address,\n to: requirements.payTo,\n contractAddress: requirements.asset,\n amount: requirements.amount,\n expiration,\n refBlockBytes: blockInfo.refBlockBytes,\n refBlockHash: blockInfo.refBlockHash,\n timestamp: Date.now(),\n }\n\n // Create the payload\n const payload: ExactTronPayload = {\n signedTransaction,\n authorization,\n }\n\n // Mark network as used\n void network\n\n return {\n t402Version,\n payload,\n }\n }\n}\n","/**\n * TRON Client Scheme Registration\n *\n * Helper function to register TRON exact scheme with a t402 client.\n */\n\nimport { t402Client, PaymentPolicy } from '@t402/core/client'\nimport { Network } from '@t402/core/types'\nimport { ClientTronSigner } from '../../signer.js'\nimport { ExactTronScheme, ExactTronSchemeConfig } from './scheme.js'\n\n/**\n * Configuration options for registering TRON schemes to a t402Client\n */\nexport interface TronClientConfig {\n /**\n * The TRON signer to use for creating payment payloads\n */\n signer: ClientTronSigner\n\n /**\n * Optional policies to apply to the client\n */\n policies?: PaymentPolicy[]\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 (fee limits, etc.)\n */\n schemeConfig?: ExactTronSchemeConfig\n}\n\n/**\n * Registers TRON exact payment schemes to a t402Client instance.\n *\n * This function registers:\n * - V2: tron:* wildcard scheme with ExactTronScheme (or specific networks if provided)\n *\n * @param client - The t402Client instance to register schemes to\n * @param config - Configuration for TRON client registration\n * @returns The client instance for chaining\n *\n * @example\n * ```typescript\n * import { registerExactTronScheme } from \"@t402/tron/exact/client\";\n * import { t402Client } from \"@t402/core/client\";\n *\n * const client = new t402Client();\n * registerExactTronScheme(client, {\n * signer: tronSigner,\n * });\n * ```\n */\nexport function registerExactTronScheme(client: t402Client, config: TronClientConfig): t402Client {\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 client.register(network, scheme)\n })\n } else {\n // Register wildcard for all TRON networks\n client.register('tron:*', scheme)\n }\n\n // Apply policies if provided\n if (config.policies) {\n config.policies.forEach((policy) => {\n client.registerPolicy(policy)\n })\n }\n\n return client\n}\n"],"mappings":";;;;;;;;;AA0BO,IAAM,kBAAN,MAAqD;AAAA,EAK1D,YAAY,QAA0B,QAAgC;AAJtE,wBAAS,UAAS;AAClB,wBAAiB;AACjB,wBAAiB;AAGf,SAAK,SAAS;AACd,SAAK,SAAS,UAAU,CAAC;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,qBACJ,aACA,cAC0D;AAE1D,UAAM,UAAU,iBAAiB,OAAO,aAAa,OAAO,CAAC;AAG7D,QAAI,CAAC,aAAa,OAAO;AACvB,YAAM,IAAI,MAAM,4CAA4C;AAAA,IAC9D;AACA,QAAI,CAAC,aAAa,OAAO;AACvB,YAAM,IAAI,MAAM,2BAA2B;AAAA,IAC7C;AACA,QAAI,CAAC,aAAa,QAAQ;AACxB,YAAM,IAAI,MAAM,oBAAoB;AAAA,IACtC;AAGA,QAAI,CAAC,oBAAoB,aAAa,KAAK,GAAG;AAC5C,YAAM,IAAI,MAAM,mCAAmC,aAAa,KAAK,EAAE;AAAA,IACzE;AACA,QAAI,CAAC,oBAAoB,aAAa,KAAK,GAAG;AAC5C,YAAM,IAAI,MAAM,0BAA0B,aAAa,KAAK,EAAE;AAAA,IAChE;AACA,QAAI,CAAC,oBAAoB,KAAK,OAAO,OAAO,GAAG;AAC7C,YAAM,IAAI,MAAM,2BAA2B,KAAK,OAAO,OAAO,EAAE;AAAA,IAClE;AAGA,UAAM,YAAY,MAAM,KAAK,OAAO,aAAa;AAGjD,UAAM,aAAa,UAAU;AAG7B,UAAM,WAAW,KAAK,OAAO,YAAY;AAGzC,UAAM,oBAAoB,MAAM,KAAK,OAAO,gBAAgB;AAAA,MAC1D,iBAAiB,aAAa;AAAA,MAC9B,IAAI,aAAa;AAAA,MACjB,QAAQ,aAAa;AAAA,MACrB;AAAA,MACA;AAAA,IACF,CAAC;AAGD,UAAM,gBAAmC;AAAA,MACvC,MAAM,KAAK,OAAO;AAAA,MAClB,IAAI,aAAa;AAAA,MACjB,iBAAiB,aAAa;AAAA,MAC9B,QAAQ,aAAa;AAAA,MACrB;AAAA,MACA,eAAe,UAAU;AAAA,MACzB,cAAc,UAAU;AAAA,MACxB,WAAW,KAAK,IAAI;AAAA,IACtB;AAGA,UAAM,UAA4B;AAAA,MAChC;AAAA,MACA;AAAA,IACF;AAGA,SAAK;AAEL,WAAO;AAAA,MACL;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;;;AC1DO,SAAS,wBAAwB,QAAoB,QAAsC;AAChG,QAAM,SAAS,IAAI,gBAAgB,OAAO,QAAQ,OAAO,YAAY;AAGrE,MAAI,OAAO,YAAY,OAAO,SAAS,SAAS,GAAG;AAEjD,WAAO,SAAS,QAAQ,CAAC,YAAY;AACnC,aAAO,SAAS,SAAS,MAAM;AAAA,IACjC,CAAC;AAAA,EACH,OAAO;AAEL,WAAO,SAAS,UAAU,MAAM;AAAA,EAClC;AAGA,MAAI,OAAO,UAAU;AACnB,WAAO,SAAS,QAAQ,CAAC,WAAW;AAClC,aAAO,eAAe,MAAM;AAAA,IAC9B,CAAC;AAAA,EACH;AAEA,SAAO;AACT;","names":[]}
1
+ {"version":3,"sources":["../../src/exact/client/scheme.ts","../../src/exact/client/register.ts"],"sourcesContent":["/**\n * TRON Exact Payment Scheme - Client Implementation\n *\n * Creates payment payloads for TRC20 token transfers.\n */\n\nimport type { PaymentPayload, PaymentRequirements, SchemeNetworkClient } from '@t402/core/types'\nimport type { ClientTronSigner } from '../../signer.js'\nimport type { ExactTronPayload, TronAuthorization } from '../../types.js'\nimport { SCHEME_EXACT, DEFAULT_FEE_LIMIT } from '../../constants.js'\nimport { normalizeNetwork, validateTronAddress } from '../../utils.js'\n\n/**\n * Configuration for ExactTronScheme\n */\nexport type ExactTronSchemeConfig = {\n /** Fee limit for transactions in SUN (default: 100 TRX) */\n feeLimit?: number\n}\n\n/**\n * Client-side implementation of the TRON exact payment scheme\n *\n * This scheme creates pre-signed TRC20 transfer transactions\n * that can be verified and broadcast by the facilitator.\n */\nexport class ExactTronScheme implements SchemeNetworkClient {\n readonly scheme = SCHEME_EXACT\n private readonly signer: ClientTronSigner\n private readonly config: ExactTronSchemeConfig\n\n constructor(signer: ClientTronSigner, config?: ExactTronSchemeConfig) {\n this.signer = signer\n this.config = config ?? {}\n }\n\n /**\n * Creates a payment payload for a TRC20 transfer\n *\n * @param t402Version - Protocol version (must be 2)\n * @param requirements - Payment requirements from server\n * @returns Payment payload with signed transaction\n */\n async createPaymentPayload(\n t402Version: number,\n requirements: PaymentRequirements,\n ): Promise<Pick<PaymentPayload, 't402Version' | 'payload'>> {\n // Normalize and validate network\n const network = normalizeNetwork(String(requirements.network))\n\n // Validate required fields\n if (!requirements.asset) {\n throw new Error('Asset (TRC20 contract address) is required')\n }\n if (!requirements.payTo) {\n throw new Error('PayTo address is required')\n }\n if (!requirements.amount) {\n throw new Error('Amount is required')\n }\n\n // Validate addresses\n if (!validateTronAddress(requirements.asset)) {\n throw new Error(`Invalid TRC20 contract address: ${requirements.asset}`)\n }\n if (!validateTronAddress(requirements.payTo)) {\n throw new Error(`Invalid payTo address: ${requirements.payTo}`)\n }\n if (!validateTronAddress(this.signer.address)) {\n throw new Error(`Invalid signer address: ${this.signer.address}`)\n }\n\n // Get block info for transaction\n const blockInfo = await this.signer.getBlockInfo()\n\n // Calculate expiration\n const expiration = blockInfo.expiration\n\n // Get fee limit\n const feeLimit = this.config.feeLimit ?? DEFAULT_FEE_LIMIT\n\n // Sign the transaction\n const signedTransaction = await this.signer.signTransaction({\n contractAddress: requirements.asset,\n to: requirements.payTo,\n amount: requirements.amount,\n feeLimit,\n expiration,\n })\n\n // Build authorization metadata\n const authorization: TronAuthorization = {\n from: this.signer.address,\n to: requirements.payTo,\n contractAddress: requirements.asset,\n amount: requirements.amount,\n expiration,\n refBlockBytes: blockInfo.refBlockBytes,\n refBlockHash: blockInfo.refBlockHash,\n timestamp: Date.now(),\n }\n\n // Create the payload\n const payload: ExactTronPayload = {\n signedTransaction,\n authorization,\n }\n\n // Mark network as used\n void network\n\n return {\n t402Version,\n payload,\n }\n }\n}\n","/**\n * TRON Client Scheme Registration\n *\n * Helper function to register TRON exact scheme with a t402 client.\n */\n\nimport { t402Client, PaymentPolicy } from '@t402/core/client'\nimport { Network } from '@t402/core/types'\nimport { ClientTronSigner } from '../../signer.js'\nimport { ExactTronScheme, ExactTronSchemeConfig } from './scheme.js'\n\n/**\n * Configuration options for registering TRON schemes to a t402Client\n */\nexport interface TronClientConfig {\n /**\n * The TRON signer to use for creating payment payloads\n */\n signer: ClientTronSigner\n\n /**\n * Optional policies to apply to the client\n */\n policies?: PaymentPolicy[]\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 (fee limits, etc.)\n */\n schemeConfig?: ExactTronSchemeConfig\n}\n\n/**\n * Registers TRON exact payment schemes to a t402Client instance.\n *\n * This function registers:\n * - V2: tron:* wildcard scheme with ExactTronScheme (or specific networks if provided)\n *\n * @param client - The t402Client instance to register schemes to\n * @param config - Configuration for TRON client registration\n * @returns The client instance for chaining\n *\n * @example\n * ```typescript\n * import { registerExactTronScheme } from \"@t402/tron/exact/client\";\n * import { t402Client } from \"@t402/core/client\";\n *\n * const client = new t402Client();\n * registerExactTronScheme(client, {\n * signer: tronSigner,\n * });\n * ```\n */\nexport function registerExactTronScheme(client: t402Client, config: TronClientConfig): t402Client {\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 client.register(network, scheme)\n })\n } else {\n // Register wildcard for all TRON networks\n client.register('tron:*', scheme)\n }\n\n // Apply policies if provided\n if (config.policies) {\n config.policies.forEach((policy) => {\n client.registerPolicy(policy)\n })\n }\n\n return client\n}\n"],"mappings":";;;;;;;;;;;AA0BO,IAAM,kBAAN,MAAqD;AAAA,EAK1D,YAAY,QAA0B,QAAgC;AAJtE,wBAAS,UAAS;AAClB,wBAAiB;AACjB,wBAAiB;AAGf,SAAK,SAAS;AACd,SAAK,SAAS,UAAU,CAAC;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,qBACJ,aACA,cAC0D;AAE1D,UAAM,UAAU,iBAAiB,OAAO,aAAa,OAAO,CAAC;AAG7D,QAAI,CAAC,aAAa,OAAO;AACvB,YAAM,IAAI,MAAM,4CAA4C;AAAA,IAC9D;AACA,QAAI,CAAC,aAAa,OAAO;AACvB,YAAM,IAAI,MAAM,2BAA2B;AAAA,IAC7C;AACA,QAAI,CAAC,aAAa,QAAQ;AACxB,YAAM,IAAI,MAAM,oBAAoB;AAAA,IACtC;AAGA,QAAI,CAAC,oBAAoB,aAAa,KAAK,GAAG;AAC5C,YAAM,IAAI,MAAM,mCAAmC,aAAa,KAAK,EAAE;AAAA,IACzE;AACA,QAAI,CAAC,oBAAoB,aAAa,KAAK,GAAG;AAC5C,YAAM,IAAI,MAAM,0BAA0B,aAAa,KAAK,EAAE;AAAA,IAChE;AACA,QAAI,CAAC,oBAAoB,KAAK,OAAO,OAAO,GAAG;AAC7C,YAAM,IAAI,MAAM,2BAA2B,KAAK,OAAO,OAAO,EAAE;AAAA,IAClE;AAGA,UAAM,YAAY,MAAM,KAAK,OAAO,aAAa;AAGjD,UAAM,aAAa,UAAU;AAG7B,UAAM,WAAW,KAAK,OAAO,YAAY;AAGzC,UAAM,oBAAoB,MAAM,KAAK,OAAO,gBAAgB;AAAA,MAC1D,iBAAiB,aAAa;AAAA,MAC9B,IAAI,aAAa;AAAA,MACjB,QAAQ,aAAa;AAAA,MACrB;AAAA,MACA;AAAA,IACF,CAAC;AAGD,UAAM,gBAAmC;AAAA,MACvC,MAAM,KAAK,OAAO;AAAA,MAClB,IAAI,aAAa;AAAA,MACjB,iBAAiB,aAAa;AAAA,MAC9B,QAAQ,aAAa;AAAA,MACrB;AAAA,MACA,eAAe,UAAU;AAAA,MACzB,cAAc,UAAU;AAAA,MACxB,WAAW,KAAK,IAAI;AAAA,IACtB;AAGA,UAAM,UAA4B;AAAA,MAChC;AAAA,MACA;AAAA,IACF;AAGA,SAAK;AAEL,WAAO;AAAA,MACL;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;;;AC1DO,SAAS,wBAAwB,QAAoB,QAAsC;AAChG,QAAM,SAAS,IAAI,gBAAgB,OAAO,QAAQ,OAAO,YAAY;AAGrE,MAAI,OAAO,YAAY,OAAO,SAAS,SAAS,GAAG;AAEjD,WAAO,SAAS,QAAQ,CAAC,YAAY;AACnC,aAAO,SAAS,SAAS,MAAM;AAAA,IACjC,CAAC;AAAA,EACH,OAAO;AAEL,WAAO,SAAS,UAAU,MAAM;AAAA,EAClC;AAGA,MAAI,OAAO,UAAU;AACnB,WAAO,SAAS,QAAQ,CAAC,WAAW;AAClC,aAAO,eAAe,MAAM;AAAA,IAC9B,CAAC;AAAA,EACH;AAEA,SAAO;AACT;","names":[]}
@@ -1,11 +1,13 @@
1
1
  import {
2
2
  MIN_VALIDITY_BUFFER,
3
3
  SCHEME_EXACT,
4
- __publicField,
5
4
  addressesEqual,
6
5
  normalizeNetwork,
7
6
  validateTronAddress
8
- } from "./chunk-MTL3FNSQ.mjs";
7
+ } from "./chunk-JZLCALMX.mjs";
8
+ import {
9
+ __publicField
10
+ } from "./chunk-NSSMTXJJ.mjs";
9
11
 
10
12
  // src/exact/facilitator/scheme.ts
11
13
  var ExactTronScheme = class {
@@ -271,4 +273,4 @@ export {
271
273
  ExactTronScheme,
272
274
  registerExactTronScheme
273
275
  };
274
- //# sourceMappingURL=chunk-NP4MIP3N.mjs.map
276
+ //# sourceMappingURL=chunk-C6ANAART.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/exact/facilitator/scheme.ts","../../src/exact/facilitator/register.ts"],"sourcesContent":["/**\n * TRON Exact Payment Scheme - Facilitator Implementation\n *\n * Verifies and settles TRC20 token transfer payments.\n */\n\nimport type {\n PaymentPayload,\n PaymentRequirements,\n SchemeNetworkFacilitator,\n SettleResponse,\n VerifyResponse,\n} from '@t402/core/types'\nimport type { FacilitatorTronSigner } from '../../signer.js'\nimport type { ExactTronPayload } from '../../types.js'\nimport { SCHEME_EXACT, MIN_VALIDITY_BUFFER } from '../../constants.js'\nimport { normalizeNetwork, validateTronAddress, addressesEqual } from '../../utils.js'\n\n/**\n * Configuration for ExactTronScheme (facilitator)\n */\nexport type ExactTronSchemeConfig = {\n /** Whether this facilitator can sponsor gas */\n canSponsorGas?: boolean\n}\n\n/**\n * Facilitator-side implementation of the TRON exact payment scheme\n *\n * This scheme verifies and settles pre-signed TRC20 transfer transactions.\n */\nexport class ExactTronScheme implements SchemeNetworkFacilitator {\n readonly scheme = SCHEME_EXACT\n readonly caipFamily = 'tron:*'\n private readonly signer: FacilitatorTronSigner\n private readonly config: ExactTronSchemeConfig\n\n constructor(signer: FacilitatorTronSigner, config?: ExactTronSchemeConfig) {\n this.signer = signer\n this.config = config ?? {}\n }\n\n /**\n * Get extra data to include in payment requirements\n */\n getExtra(network: string): Record<string, unknown> | undefined {\n void network\n\n if (this.config.canSponsorGas) {\n const addresses = this.signer.getAddresses()\n if (addresses.length > 0) {\n return {\n gasSponsor: addresses[0],\n }\n }\n }\n\n return undefined\n }\n\n /**\n * Get facilitator addresses that can receive payments\n */\n getSigners(network: string): string[] {\n void network\n return [...this.signer.getAddresses()]\n }\n\n /**\n * Verify a payment payload\n *\n * Performs comprehensive validation:\n * 1. Scheme matching\n * 2. Network matching\n * 3. Payload structure validation\n * 4. Transaction signature verification\n * 5. Authorization expiry check\n * 6. Balance verification\n * 7. Amount sufficiency\n * 8. Recipient matching\n * 9. Contract address matching\n * 10. Account activation check\n */\n async verify(\n payload: PaymentPayload,\n requirements: PaymentRequirements,\n ): Promise<VerifyResponse> {\n const tronPayload = payload.payload as ExactTronPayload | undefined\n\n // Step 1: Validate payload structure (must be first to avoid undefined access)\n if (!tronPayload?.authorization?.from || !tronPayload?.signedTransaction) {\n return {\n isValid: false,\n invalidReason: 'invalid_payload_structure',\n payer: '',\n }\n }\n\n const authorization = tronPayload.authorization\n\n // Step 2: Validate scheme\n if (payload.accepted.scheme !== SCHEME_EXACT || requirements.scheme !== SCHEME_EXACT) {\n return {\n isValid: false,\n invalidReason: 'unsupported_scheme',\n payer: authorization.from,\n }\n }\n\n // Step 3: Validate network\n let payloadNetwork: string\n try {\n payloadNetwork = normalizeNetwork(String(payload.accepted.network))\n const requirementsNetwork = normalizeNetwork(String(requirements.network))\n\n if (payloadNetwork !== requirementsNetwork) {\n return {\n isValid: false,\n invalidReason: 'network_mismatch',\n payer: authorization.from,\n }\n }\n } catch {\n return {\n isValid: false,\n invalidReason: 'invalid_network',\n payer: authorization.from,\n }\n }\n\n // Step 4: Validate addresses\n if (!validateTronAddress(authorization.from)) {\n return {\n isValid: false,\n invalidReason: 'invalid_sender_address',\n payer: authorization.from,\n }\n }\n if (!validateTronAddress(authorization.to)) {\n return {\n isValid: false,\n invalidReason: 'invalid_recipient_address',\n payer: authorization.from,\n }\n }\n if (!validateTronAddress(authorization.contractAddress)) {\n return {\n isValid: false,\n invalidReason: 'invalid_contract_address',\n payer: authorization.from,\n }\n }\n\n // Step 5: Verify transaction signature\n const verifyResult = await this.signer.verifyTransaction({\n signedTransaction: tronPayload.signedTransaction,\n expectedFrom: authorization.from,\n expectedTransfer: {\n to: authorization.to,\n contractAddress: authorization.contractAddress,\n amount: authorization.amount,\n },\n network: payloadNetwork,\n })\n\n if (!verifyResult.valid) {\n return {\n isValid: false,\n invalidReason: verifyResult.reason || 'transaction_verification_failed',\n payer: authorization.from,\n }\n }\n\n // Step 6: Check expiration (with buffer)\n const now = Date.now()\n const expirationWithBuffer = authorization.expiration - MIN_VALIDITY_BUFFER * 1000\n\n if (now >= expirationWithBuffer) {\n return {\n isValid: false,\n invalidReason: 'authorization_expired',\n payer: authorization.from,\n }\n }\n\n // Step 7: Verify balance\n try {\n const balance = await this.signer.getBalance({\n ownerAddress: authorization.from,\n contractAddress: authorization.contractAddress,\n network: payloadNetwork,\n })\n\n if (BigInt(balance) < BigInt(requirements.amount)) {\n return {\n isValid: false,\n invalidReason: 'insufficient_balance',\n payer: authorization.from,\n }\n }\n } catch (error) {\n console.warn('Could not verify balance:', error)\n }\n\n // Step 8: Verify amount sufficiency\n if (BigInt(authorization.amount) < BigInt(requirements.amount)) {\n return {\n isValid: false,\n invalidReason: 'insufficient_amount',\n payer: authorization.from,\n }\n }\n\n // Step 9: Verify recipient\n if (!addressesEqual(authorization.to, requirements.payTo)) {\n return {\n isValid: false,\n invalidReason: 'recipient_mismatch',\n payer: authorization.from,\n }\n }\n\n // Step 10: Verify contract address\n if (!addressesEqual(authorization.contractAddress, requirements.asset)) {\n return {\n isValid: false,\n invalidReason: 'asset_mismatch',\n payer: authorization.from,\n }\n }\n\n // Step 11: Verify sender account is activated\n try {\n const isActivated = await this.signer.isActivated(authorization.from, payloadNetwork)\n if (!isActivated) {\n return {\n isValid: false,\n invalidReason: 'account_not_activated',\n payer: authorization.from,\n }\n }\n } catch (error) {\n console.warn('Could not verify account activation:', error)\n }\n\n // All checks passed\n return {\n isValid: true,\n invalidReason: undefined,\n payer: authorization.from,\n }\n }\n\n /**\n * Settle a verified payment\n *\n * Broadcasts the transaction and waits for confirmation.\n */\n async settle(\n payload: PaymentPayload,\n requirements: PaymentRequirements,\n ): Promise<SettleResponse> {\n const tronPayload = payload.payload as ExactTronPayload | undefined\n\n // Validate payload structure\n if (!tronPayload?.authorization?.from || !tronPayload?.signedTransaction) {\n return {\n success: false,\n network: payload.accepted.network,\n transaction: '',\n errorReason: 'invalid_payload_structure',\n payer: '',\n }\n }\n\n // Re-verify before settling\n const verifyResult = await this.verify(payload, requirements)\n if (!verifyResult.isValid) {\n return {\n success: false,\n network: payload.accepted.network,\n transaction: '',\n errorReason: verifyResult.invalidReason ?? 'verification_failed',\n payer: tronPayload.authorization.from,\n }\n }\n\n try {\n const network = normalizeNetwork(String(payload.accepted.network))\n\n // Broadcast the transaction\n const txId = await this.signer.broadcastTransaction(tronPayload.signedTransaction, network)\n\n // Wait for confirmation\n const confirmation = await this.signer.waitForTransaction({\n txId,\n network,\n timeout: 60000, // 60 seconds\n })\n\n if (!confirmation.success) {\n return {\n success: false,\n network: payload.accepted.network,\n transaction: txId,\n errorReason: confirmation.error || 'transaction_not_confirmed',\n payer: tronPayload.authorization.from,\n }\n }\n\n return {\n success: true,\n transaction: confirmation.txId || txId,\n network: payload.accepted.network,\n payer: tronPayload.authorization.from,\n }\n } catch (error) {\n console.error('Failed to settle TRON transaction:', error)\n return {\n success: false,\n network: payload.accepted.network,\n transaction: '',\n errorReason: 'transaction_failed',\n payer: tronPayload.authorization.from,\n }\n }\n }\n}\n","/**\n * TRON Facilitator Scheme Registration\n *\n * Helper function to register TRON exact scheme with a t402 facilitator.\n */\n\nimport { t402Facilitator } from '@t402/core/facilitator'\nimport { Network } from '@t402/core/types'\nimport { ExactTronScheme, ExactTronSchemeConfig } from './scheme.js'\nimport { FacilitatorTronSigner } from '../../signer.js'\n\n/**\n * Configuration options for registering TRON schemes to a t402Facilitator\n */\nexport interface TronFacilitatorConfig {\n /**\n * The signer to use for verification and settlement\n */\n signer: FacilitatorTronSigner\n\n /**\n * Optional specific networks to register\n * If not provided, registers wildcard support (tron:*)\n */\n networks?: Network[]\n\n /**\n * Optional scheme configuration\n */\n schemeConfig?: ExactTronSchemeConfig\n}\n\n/**\n * Registers TRON exact payment schemes to a t402Facilitator instance.\n *\n * This function registers:\n * - V2: tron:* wildcard scheme with ExactTronScheme (or specific networks if provided)\n *\n * @param facilitator - The t402Facilitator instance to register schemes to\n * @param config - Configuration for TRON facilitator registration\n * @returns The facilitator instance for chaining\n *\n * @example\n * ```typescript\n * import { registerExactTronScheme } from \"@t402/tron/exact/facilitator\";\n * import { t402Facilitator } from \"@t402/core/facilitator\";\n *\n * const signer = new MyTronSigner(privateKey);\n * const facilitator = new t402Facilitator();\n * registerExactTronScheme(facilitator, { signer });\n *\n * // Or with specific networks\n * registerExactTronScheme(facilitator, {\n * signer,\n * networks: [\"tron:mainnet\"],\n * schemeConfig: { canSponsorGas: true }\n * });\n * ```\n */\nexport function registerExactTronScheme(\n facilitator: t402Facilitator,\n config: TronFacilitatorConfig,\n): t402Facilitator {\n const scheme = new ExactTronScheme(config.signer, config.schemeConfig)\n\n // Register V2 scheme\n if (config.networks && config.networks.length > 0) {\n // Register specific networks\n config.networks.forEach((network) => {\n facilitator.register(network, scheme)\n })\n } else {\n // Register wildcard for all TRON networks\n facilitator.register('tron:*', scheme)\n }\n\n return facilitator\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/exact/facilitator/scheme.ts","../../src/exact/facilitator/register.ts"],"sourcesContent":["/**\n * TRON Exact Payment Scheme - Facilitator Implementation\n *\n * Verifies and settles TRC20 token transfer payments.\n */\n\nimport type {\n PaymentPayload,\n PaymentRequirements,\n SchemeNetworkFacilitator,\n SettleResponse,\n VerifyResponse,\n} from '@t402/core/types'\nimport type { FacilitatorTronSigner } from '../../signer.js'\nimport type { ExactTronPayload } from '../../types.js'\nimport { SCHEME_EXACT, MIN_VALIDITY_BUFFER } from '../../constants.js'\nimport { normalizeNetwork, validateTronAddress, addressesEqual } from '../../utils.js'\n\n/**\n * Configuration for ExactTronScheme (facilitator)\n */\nexport type ExactTronSchemeConfig = {\n /** Whether this facilitator can sponsor gas */\n canSponsorGas?: boolean\n}\n\n/**\n * Facilitator-side implementation of the TRON exact payment scheme\n *\n * This scheme verifies and settles pre-signed TRC20 transfer transactions.\n */\nexport class ExactTronScheme implements SchemeNetworkFacilitator {\n readonly scheme = SCHEME_EXACT\n readonly caipFamily = 'tron:*'\n private readonly signer: FacilitatorTronSigner\n private readonly config: ExactTronSchemeConfig\n\n constructor(signer: FacilitatorTronSigner, config?: ExactTronSchemeConfig) {\n this.signer = signer\n this.config = config ?? {}\n }\n\n /**\n * Get extra data to include in payment requirements\n */\n getExtra(network: string): Record<string, unknown> | undefined {\n void network\n\n if (this.config.canSponsorGas) {\n const addresses = this.signer.getAddresses()\n if (addresses.length > 0) {\n return {\n gasSponsor: addresses[0],\n }\n }\n }\n\n return undefined\n }\n\n /**\n * Get facilitator addresses that can receive payments\n */\n getSigners(network: string): string[] {\n void network\n return [...this.signer.getAddresses()]\n }\n\n /**\n * Verify a payment payload\n *\n * Performs comprehensive validation:\n * 1. Scheme matching\n * 2. Network matching\n * 3. Payload structure validation\n * 4. Transaction signature verification\n * 5. Authorization expiry check\n * 6. Balance verification\n * 7. Amount sufficiency\n * 8. Recipient matching\n * 9. Contract address matching\n * 10. Account activation check\n */\n async verify(\n payload: PaymentPayload,\n requirements: PaymentRequirements,\n ): Promise<VerifyResponse> {\n const tronPayload = payload.payload as ExactTronPayload | undefined\n\n // Step 1: Validate payload structure (must be first to avoid undefined access)\n if (!tronPayload?.authorization?.from || !tronPayload?.signedTransaction) {\n return {\n isValid: false,\n invalidReason: 'invalid_payload_structure',\n payer: '',\n }\n }\n\n const authorization = tronPayload.authorization\n\n // Step 2: Validate scheme\n if (payload.accepted.scheme !== SCHEME_EXACT || requirements.scheme !== SCHEME_EXACT) {\n return {\n isValid: false,\n invalidReason: 'unsupported_scheme',\n payer: authorization.from,\n }\n }\n\n // Step 3: Validate network\n let payloadNetwork: string\n try {\n payloadNetwork = normalizeNetwork(String(payload.accepted.network))\n const requirementsNetwork = normalizeNetwork(String(requirements.network))\n\n if (payloadNetwork !== requirementsNetwork) {\n return {\n isValid: false,\n invalidReason: 'network_mismatch',\n payer: authorization.from,\n }\n }\n } catch {\n return {\n isValid: false,\n invalidReason: 'invalid_network',\n payer: authorization.from,\n }\n }\n\n // Step 4: Validate addresses\n if (!validateTronAddress(authorization.from)) {\n return {\n isValid: false,\n invalidReason: 'invalid_sender_address',\n payer: authorization.from,\n }\n }\n if (!validateTronAddress(authorization.to)) {\n return {\n isValid: false,\n invalidReason: 'invalid_recipient_address',\n payer: authorization.from,\n }\n }\n if (!validateTronAddress(authorization.contractAddress)) {\n return {\n isValid: false,\n invalidReason: 'invalid_contract_address',\n payer: authorization.from,\n }\n }\n\n // Step 5: Verify transaction signature\n const verifyResult = await this.signer.verifyTransaction({\n signedTransaction: tronPayload.signedTransaction,\n expectedFrom: authorization.from,\n expectedTransfer: {\n to: authorization.to,\n contractAddress: authorization.contractAddress,\n amount: authorization.amount,\n },\n network: payloadNetwork,\n })\n\n if (!verifyResult.valid) {\n return {\n isValid: false,\n invalidReason: verifyResult.reason || 'transaction_verification_failed',\n payer: authorization.from,\n }\n }\n\n // Step 6: Check expiration (with buffer)\n const now = Date.now()\n const expirationWithBuffer = authorization.expiration - MIN_VALIDITY_BUFFER * 1000\n\n if (now >= expirationWithBuffer) {\n return {\n isValid: false,\n invalidReason: 'authorization_expired',\n payer: authorization.from,\n }\n }\n\n // Step 7: Verify balance\n try {\n const balance = await this.signer.getBalance({\n ownerAddress: authorization.from,\n contractAddress: authorization.contractAddress,\n network: payloadNetwork,\n })\n\n if (BigInt(balance) < BigInt(requirements.amount)) {\n return {\n isValid: false,\n invalidReason: 'insufficient_balance',\n payer: authorization.from,\n }\n }\n } catch (error) {\n console.warn('Could not verify balance:', error)\n }\n\n // Step 8: Verify amount sufficiency\n if (BigInt(authorization.amount) < BigInt(requirements.amount)) {\n return {\n isValid: false,\n invalidReason: 'insufficient_amount',\n payer: authorization.from,\n }\n }\n\n // Step 9: Verify recipient\n if (!addressesEqual(authorization.to, requirements.payTo)) {\n return {\n isValid: false,\n invalidReason: 'recipient_mismatch',\n payer: authorization.from,\n }\n }\n\n // Step 10: Verify contract address\n if (!addressesEqual(authorization.contractAddress, requirements.asset)) {\n return {\n isValid: false,\n invalidReason: 'asset_mismatch',\n payer: authorization.from,\n }\n }\n\n // Step 11: Verify sender account is activated\n try {\n const isActivated = await this.signer.isActivated(authorization.from, payloadNetwork)\n if (!isActivated) {\n return {\n isValid: false,\n invalidReason: 'account_not_activated',\n payer: authorization.from,\n }\n }\n } catch (error) {\n console.warn('Could not verify account activation:', error)\n }\n\n // All checks passed\n return {\n isValid: true,\n invalidReason: undefined,\n payer: authorization.from,\n }\n }\n\n /**\n * Settle a verified payment\n *\n * Broadcasts the transaction and waits for confirmation.\n */\n async settle(\n payload: PaymentPayload,\n requirements: PaymentRequirements,\n ): Promise<SettleResponse> {\n const tronPayload = payload.payload as ExactTronPayload | undefined\n\n // Validate payload structure\n if (!tronPayload?.authorization?.from || !tronPayload?.signedTransaction) {\n return {\n success: false,\n network: payload.accepted.network,\n transaction: '',\n errorReason: 'invalid_payload_structure',\n payer: '',\n }\n }\n\n // Re-verify before settling\n const verifyResult = await this.verify(payload, requirements)\n if (!verifyResult.isValid) {\n return {\n success: false,\n network: payload.accepted.network,\n transaction: '',\n errorReason: verifyResult.invalidReason ?? 'verification_failed',\n payer: tronPayload.authorization.from,\n }\n }\n\n try {\n const network = normalizeNetwork(String(payload.accepted.network))\n\n // Broadcast the transaction\n const txId = await this.signer.broadcastTransaction(tronPayload.signedTransaction, network)\n\n // Wait for confirmation\n const confirmation = await this.signer.waitForTransaction({\n txId,\n network,\n timeout: 60000, // 60 seconds\n })\n\n if (!confirmation.success) {\n return {\n success: false,\n network: payload.accepted.network,\n transaction: txId,\n errorReason: confirmation.error || 'transaction_not_confirmed',\n payer: tronPayload.authorization.from,\n }\n }\n\n return {\n success: true,\n transaction: confirmation.txId || txId,\n network: payload.accepted.network,\n payer: tronPayload.authorization.from,\n }\n } catch (error) {\n console.error('Failed to settle TRON transaction:', error)\n return {\n success: false,\n network: payload.accepted.network,\n transaction: '',\n errorReason: 'transaction_failed',\n payer: tronPayload.authorization.from,\n }\n }\n }\n}\n","/**\n * TRON Facilitator Scheme Registration\n *\n * Helper function to register TRON exact scheme with a t402 facilitator.\n */\n\nimport { t402Facilitator } from '@t402/core/facilitator'\nimport { Network } from '@t402/core/types'\nimport { ExactTronScheme, ExactTronSchemeConfig } from './scheme.js'\nimport { FacilitatorTronSigner } from '../../signer.js'\n\n/**\n * Configuration options for registering TRON schemes to a t402Facilitator\n */\nexport interface TronFacilitatorConfig {\n /**\n * The signer to use for verification and settlement\n */\n signer: FacilitatorTronSigner\n\n /**\n * Optional specific networks to register\n * If not provided, registers wildcard support (tron:*)\n */\n networks?: Network[]\n\n /**\n * Optional scheme configuration\n */\n schemeConfig?: ExactTronSchemeConfig\n}\n\n/**\n * Registers TRON exact payment schemes to a t402Facilitator instance.\n *\n * This function registers:\n * - V2: tron:* wildcard scheme with ExactTronScheme (or specific networks if provided)\n *\n * @param facilitator - The t402Facilitator instance to register schemes to\n * @param config - Configuration for TRON facilitator registration\n * @returns The facilitator instance for chaining\n *\n * @example\n * ```typescript\n * import { registerExactTronScheme } from \"@t402/tron/exact/facilitator\";\n * import { t402Facilitator } from \"@t402/core/facilitator\";\n *\n * const signer = new MyTronSigner(privateKey);\n * const facilitator = new t402Facilitator();\n * registerExactTronScheme(facilitator, { signer });\n *\n * // Or with specific networks\n * registerExactTronScheme(facilitator, {\n * signer,\n * networks: [\"tron:mainnet\"],\n * schemeConfig: { canSponsorGas: true }\n * });\n * ```\n */\nexport function registerExactTronScheme(\n facilitator: t402Facilitator,\n config: TronFacilitatorConfig,\n): t402Facilitator {\n const scheme = new ExactTronScheme(config.signer, config.schemeConfig)\n\n // Register V2 scheme\n if (config.networks && config.networks.length > 0) {\n // Register specific networks\n config.networks.forEach((network) => {\n facilitator.register(network, scheme)\n })\n } else {\n // Register wildcard for all TRON networks\n facilitator.register('tron:*', scheme)\n }\n\n return facilitator\n}\n"],"mappings":"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","names":[]}
@@ -5,10 +5,12 @@ import {
5
5
  TRON_NILE_CAIP2,
6
6
  TRON_SHASTA_CAIP2,
7
7
  USDT_ADDRESSES,
8
- __publicField,
9
8
  convertToSmallestUnits,
10
9
  normalizeNetwork
11
- } from "./chunk-MTL3FNSQ.mjs";
10
+ } from "./chunk-JZLCALMX.mjs";
11
+ import {
12
+ __publicField
13
+ } from "./chunk-NSSMTXJJ.mjs";
12
14
 
13
15
  // src/tokens.ts
14
16
  var USDT_MAINNET = {
@@ -255,4 +257,4 @@ export {
255
257
  ExactTronScheme,
256
258
  registerExactTronScheme
257
259
  };
258
- //# sourceMappingURL=chunk-5HUXHQSQ.mjs.map
260
+ //# sourceMappingURL=chunk-COESQEG6.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/tokens.ts","../../src/exact/server/scheme.ts","../../src/exact/server/register.ts"],"sourcesContent":["/**\n * TRC20 Token Configuration\n *\n * Registry of supported TRC20 tokens for each TRON network.\n */\n\nimport type { TRC20Config, NetworkTRC20Registry } from './types.js'\nimport {\n TRON_MAINNET_CAIP2,\n TRON_NILE_CAIP2,\n TRON_SHASTA_CAIP2,\n USDT_ADDRESSES,\n DEFAULT_USDT_DECIMALS,\n} from './constants.js'\n\n// =============================================================================\n// USDT Token Configurations\n// =============================================================================\n\n/** USDT on TRON Mainnet */\nconst USDT_MAINNET: TRC20Config = {\n contractAddress: USDT_ADDRESSES[TRON_MAINNET_CAIP2],\n symbol: 'USDT',\n name: 'Tether USD',\n decimals: DEFAULT_USDT_DECIMALS,\n}\n\n/** USDT on TRON Nile Testnet */\nconst USDT_NILE: TRC20Config = {\n contractAddress: USDT_ADDRESSES[TRON_NILE_CAIP2],\n symbol: 'USDT',\n name: 'Tether USD',\n decimals: DEFAULT_USDT_DECIMALS,\n}\n\n/** USDT on TRON Shasta Testnet */\nconst USDT_SHASTA: TRC20Config = {\n contractAddress: USDT_ADDRESSES[TRON_SHASTA_CAIP2],\n symbol: 'USDT',\n name: 'Tether USD',\n decimals: DEFAULT_USDT_DECIMALS,\n}\n\n// =============================================================================\n// Token Registry\n// =============================================================================\n\n/**\n * Registry of TRC20 tokens by network\n */\nexport const TRC20_REGISTRY: Record<string, NetworkTRC20Registry> = {\n [TRON_MAINNET_CAIP2]: {\n network: TRON_MAINNET_CAIP2,\n defaultToken: USDT_MAINNET,\n tokens: {\n USDT: USDT_MAINNET,\n },\n },\n [TRON_NILE_CAIP2]: {\n network: TRON_NILE_CAIP2,\n defaultToken: USDT_NILE,\n tokens: {\n USDT: USDT_NILE,\n },\n },\n [TRON_SHASTA_CAIP2]: {\n network: TRON_SHASTA_CAIP2,\n defaultToken: USDT_SHASTA,\n tokens: {\n USDT: USDT_SHASTA,\n },\n },\n}\n\n// =============================================================================\n// Utility Functions\n// =============================================================================\n\n/**\n * Get TRC20 configuration for a specific token on a network\n *\n * @param network - CAIP-2 network identifier\n * @param symbol - Token symbol (e.g., \"USDT\")\n * @returns Token configuration or undefined if not found\n */\nexport function getTRC20Config(network: string, symbol: string): TRC20Config | undefined {\n const registry = TRC20_REGISTRY[network]\n if (!registry) return undefined\n return registry.tokens[symbol]\n}\n\n/**\n * Get all TRC20 tokens for a network\n *\n * @param network - CAIP-2 network identifier\n * @returns Array of token configurations\n */\nexport function getNetworkTokens(network: string): TRC20Config[] {\n const registry = TRC20_REGISTRY[network]\n if (!registry) return []\n return Object.values(registry.tokens)\n}\n\n/**\n * Get the default TRC20 token for a network\n *\n * @param network - CAIP-2 network identifier\n * @returns Default token configuration or undefined\n */\nexport function getDefaultToken(network: string): TRC20Config | undefined {\n const registry = TRC20_REGISTRY[network]\n return registry?.defaultToken\n}\n\n/**\n * Get token by contract address\n *\n * @param network - CAIP-2 network identifier\n * @param contractAddress - TRC20 contract address\n * @returns Token configuration or undefined\n */\nexport function getTokenByAddress(\n network: string,\n contractAddress: string,\n): TRC20Config | undefined {\n const registry = TRC20_REGISTRY[network]\n if (!registry) return undefined\n\n const upperAddress = contractAddress.toUpperCase()\n return Object.values(registry.tokens).find(\n (token) => token.contractAddress.toUpperCase() === upperAddress,\n )\n}\n\n/**\n * Get all networks that support a specific token\n *\n * @param symbol - Token symbol (e.g., \"USDT\")\n * @returns Array of network identifiers\n */\nexport function getNetworksForToken(symbol: string): string[] {\n return Object.entries(TRC20_REGISTRY)\n .filter(([_, registry]) => symbol in registry.tokens)\n .map(([network]) => network)\n}\n\n/**\n * Get all networks that support USDT\n *\n * @returns Array of network identifiers\n */\nexport function getUsdtNetworks(): string[] {\n return getNetworksForToken('USDT')\n}\n\n/**\n * Check if a network is supported\n *\n * @param network - CAIP-2 network identifier\n * @returns true if network is supported\n */\nexport function isNetworkSupported(network: string): boolean {\n return network in TRC20_REGISTRY\n}\n\n/**\n * Get all supported networks\n *\n * @returns Array of network identifiers\n */\nexport function getSupportedNetworks(): string[] {\n return Object.keys(TRC20_REGISTRY)\n}\n","/**\n * TRON Exact Payment Scheme - Server Implementation\n *\n * Parses prices and enhances payment requirements for TRC20 payments.\n */\n\nimport type {\n AssetAmount,\n Network,\n PaymentRequirements,\n Price,\n SchemeNetworkServer,\n MoneyParser,\n} from '@t402/core/types'\nimport { SCHEME_EXACT } from '../../constants.js'\nimport { normalizeNetwork, convertToSmallestUnits } from '../../utils.js'\nimport {\n getDefaultToken,\n getTRC20Config,\n getTokenByAddress,\n isNetworkSupported,\n} 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) ||\n getTokenByAddress(network, requirements.asset)\n : getDefaultToken(network)\n\n if (!tokenConfig) {\n tokenConfig = getDefaultToken(network)\n }\n\n // Initialize extra if needed\n const extra: Record<string, unknown> = { ...requirements.extra }\n\n // Add token metadata\n if (tokenConfig) {\n extra.symbol = tokenConfig.symbol\n extra.name = tokenConfig.name\n extra.decimals = tokenConfig.decimals\n }\n\n // Copy extension data\n if (supportedKind.extra) {\n for (const key of extensionKeys) {\n if (key in supportedKind.extra) {\n extra[key] = supportedKind.extra[key]\n }\n }\n }\n\n return {\n ...requirements,\n asset: tokenConfig?.contractAddress || requirements.asset,\n extra,\n }\n }\n\n /**\n * Parse money (string/number) to decimal number\n */\n private parseMoneyToDecimal(price: Price): number {\n if (typeof price === 'number') {\n return price\n }\n\n if (typeof price === 'string') {\n // Remove currency symbols and whitespace\n let cleanPrice = price.trim()\n cleanPrice = cleanPrice.replace(/^\\$/, '').trim()\n\n // Parse the numeric part\n const parts = cleanPrice.split(/\\s+/)\n const numericPart = parts[0]\n const parsed = parseFloat(numericPart)\n\n if (isNaN(parsed)) {\n throw new Error(`Failed to parse price: ${price}`)\n }\n\n return parsed\n }\n\n throw new Error(`Invalid price type: ${typeof price}`)\n }\n\n /**\n * Default money to asset conversion\n * Uses preferredToken from config if set, otherwise falls back to network default\n */\n private defaultMoneyConversion(decimalAmount: number, network: string): AssetAmount {\n // Try preferred token first if configured\n let tokenConfig = this._config.preferredToken\n ? getTRC20Config(network, this._config.preferredToken)\n : undefined\n\n // Fall back to network default\n if (!tokenConfig) {\n tokenConfig = getDefaultToken(network)\n }\n\n if (!tokenConfig) {\n throw new Error(`No default token for network: ${network}`)\n }\n\n const amount = convertToSmallestUnits(decimalAmount.toFixed(6), tokenConfig.decimals)\n\n return {\n amount,\n asset: tokenConfig.contractAddress,\n extra: {\n symbol: tokenConfig.symbol,\n name: tokenConfig.name,\n decimals: tokenConfig.decimals,\n },\n }\n }\n\n /**\n * Get default asset address for network\n */\n private getDefaultAsset(network: string): string {\n const tokenConfig = getDefaultToken(network)\n if (!tokenConfig) {\n throw new Error(`No default token for network: ${network}`)\n }\n return tokenConfig.contractAddress\n }\n}\n","/**\n * 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":[]}
1
+ {"version":3,"sources":["../../src/tokens.ts","../../src/exact/server/scheme.ts","../../src/exact/server/register.ts"],"sourcesContent":["/**\n * TRC20 Token Configuration\n *\n * Registry of supported TRC20 tokens for each TRON network.\n */\n\nimport type { TRC20Config, NetworkTRC20Registry } from './types.js'\nimport {\n TRON_MAINNET_CAIP2,\n TRON_NILE_CAIP2,\n TRON_SHASTA_CAIP2,\n USDT_ADDRESSES,\n DEFAULT_USDT_DECIMALS,\n} from './constants.js'\n\n// =============================================================================\n// USDT Token Configurations\n// =============================================================================\n\n/** USDT on TRON Mainnet */\nconst USDT_MAINNET: TRC20Config = {\n contractAddress: USDT_ADDRESSES[TRON_MAINNET_CAIP2],\n symbol: 'USDT',\n name: 'Tether USD',\n decimals: DEFAULT_USDT_DECIMALS,\n}\n\n/** USDT on TRON Nile Testnet */\nconst USDT_NILE: TRC20Config = {\n contractAddress: USDT_ADDRESSES[TRON_NILE_CAIP2],\n symbol: 'USDT',\n name: 'Tether USD',\n decimals: DEFAULT_USDT_DECIMALS,\n}\n\n/** USDT on TRON Shasta Testnet */\nconst USDT_SHASTA: TRC20Config = {\n contractAddress: USDT_ADDRESSES[TRON_SHASTA_CAIP2],\n symbol: 'USDT',\n name: 'Tether USD',\n decimals: DEFAULT_USDT_DECIMALS,\n}\n\n// =============================================================================\n// Token Registry\n// =============================================================================\n\n/**\n * Registry of TRC20 tokens by network\n */\nexport const TRC20_REGISTRY: Record<string, NetworkTRC20Registry> = {\n [TRON_MAINNET_CAIP2]: {\n network: TRON_MAINNET_CAIP2,\n defaultToken: USDT_MAINNET,\n tokens: {\n USDT: USDT_MAINNET,\n },\n },\n [TRON_NILE_CAIP2]: {\n network: TRON_NILE_CAIP2,\n defaultToken: USDT_NILE,\n tokens: {\n USDT: USDT_NILE,\n },\n },\n [TRON_SHASTA_CAIP2]: {\n network: TRON_SHASTA_CAIP2,\n defaultToken: USDT_SHASTA,\n tokens: {\n USDT: USDT_SHASTA,\n },\n },\n}\n\n// =============================================================================\n// Utility Functions\n// =============================================================================\n\n/**\n * Get TRC20 configuration for a specific token on a network\n *\n * @param network - CAIP-2 network identifier\n * @param symbol - Token symbol (e.g., \"USDT\")\n * @returns Token configuration or undefined if not found\n */\nexport function getTRC20Config(network: string, symbol: string): TRC20Config | undefined {\n const registry = TRC20_REGISTRY[network]\n if (!registry) return undefined\n return registry.tokens[symbol]\n}\n\n/**\n * Get all TRC20 tokens for a network\n *\n * @param network - CAIP-2 network identifier\n * @returns Array of token configurations\n */\nexport function getNetworkTokens(network: string): TRC20Config[] {\n const registry = TRC20_REGISTRY[network]\n if (!registry) return []\n return Object.values(registry.tokens)\n}\n\n/**\n * Get the default TRC20 token for a network\n *\n * @param network - CAIP-2 network identifier\n * @returns Default token configuration or undefined\n */\nexport function getDefaultToken(network: string): TRC20Config | undefined {\n const registry = TRC20_REGISTRY[network]\n return registry?.defaultToken\n}\n\n/**\n * Get token by contract address\n *\n * @param network - CAIP-2 network identifier\n * @param contractAddress - TRC20 contract address\n * @returns Token configuration or undefined\n */\nexport function getTokenByAddress(\n network: string,\n contractAddress: string,\n): TRC20Config | undefined {\n const registry = TRC20_REGISTRY[network]\n if (!registry) return undefined\n\n const upperAddress = contractAddress.toUpperCase()\n return Object.values(registry.tokens).find(\n (token) => token.contractAddress.toUpperCase() === upperAddress,\n )\n}\n\n/**\n * Get all networks that support a specific token\n *\n * @param symbol - Token symbol (e.g., \"USDT\")\n * @returns Array of network identifiers\n */\nexport function getNetworksForToken(symbol: string): string[] {\n return Object.entries(TRC20_REGISTRY)\n .filter(([_, registry]) => symbol in registry.tokens)\n .map(([network]) => network)\n}\n\n/**\n * Get all networks that support USDT\n *\n * @returns Array of network identifiers\n */\nexport function getUsdtNetworks(): string[] {\n return getNetworksForToken('USDT')\n}\n\n/**\n * Check if a network is supported\n *\n * @param network - CAIP-2 network identifier\n * @returns true if network is supported\n */\nexport function isNetworkSupported(network: string): boolean {\n return network in TRC20_REGISTRY\n}\n\n/**\n * Get all supported networks\n *\n * @returns Array of network identifiers\n */\nexport function getSupportedNetworks(): string[] {\n return Object.keys(TRC20_REGISTRY)\n}\n","/**\n * TRON Exact Payment Scheme - Server Implementation\n *\n * Parses prices and enhances payment requirements for TRC20 payments.\n */\n\nimport type {\n AssetAmount,\n Network,\n PaymentRequirements,\n Price,\n SchemeNetworkServer,\n MoneyParser,\n} from '@t402/core/types'\nimport { SCHEME_EXACT } from '../../constants.js'\nimport { normalizeNetwork, convertToSmallestUnits } from '../../utils.js'\nimport {\n getDefaultToken,\n getTRC20Config,\n getTokenByAddress,\n isNetworkSupported,\n} 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) ||\n getTokenByAddress(network, requirements.asset)\n : getDefaultToken(network)\n\n if (!tokenConfig) {\n tokenConfig = getDefaultToken(network)\n }\n\n // Initialize extra if needed\n const extra: Record<string, unknown> = { ...requirements.extra }\n\n // Add token metadata\n if (tokenConfig) {\n extra.symbol = tokenConfig.symbol\n extra.name = tokenConfig.name\n extra.decimals = tokenConfig.decimals\n }\n\n // Copy extension data\n if (supportedKind.extra) {\n for (const key of extensionKeys) {\n if (key in supportedKind.extra) {\n extra[key] = supportedKind.extra[key]\n }\n }\n }\n\n return {\n ...requirements,\n asset: tokenConfig?.contractAddress || requirements.asset,\n extra,\n }\n }\n\n /**\n * Parse money (string/number) to decimal number\n */\n private parseMoneyToDecimal(price: Price): number {\n if (typeof price === 'number') {\n return price\n }\n\n if (typeof price === 'string') {\n // Remove currency symbols and whitespace\n let cleanPrice = price.trim()\n cleanPrice = cleanPrice.replace(/^\\$/, '').trim()\n\n // Parse the numeric part\n const parts = cleanPrice.split(/\\s+/)\n const numericPart = parts[0]\n const parsed = parseFloat(numericPart)\n\n if (isNaN(parsed)) {\n throw new Error(`Failed to parse price: ${price}`)\n }\n\n return parsed\n }\n\n throw new Error(`Invalid price type: ${typeof price}`)\n }\n\n /**\n * Default money to asset conversion\n * Uses preferredToken from config if set, otherwise falls back to network default\n */\n private defaultMoneyConversion(decimalAmount: number, network: string): AssetAmount {\n // Try preferred token first if configured\n let tokenConfig = this._config.preferredToken\n ? getTRC20Config(network, this._config.preferredToken)\n : undefined\n\n // Fall back to network default\n if (!tokenConfig) {\n tokenConfig = getDefaultToken(network)\n }\n\n if (!tokenConfig) {\n throw new Error(`No default token for network: ${network}`)\n }\n\n const amount = convertToSmallestUnits(decimalAmount.toFixed(6), tokenConfig.decimals)\n\n return {\n amount,\n asset: tokenConfig.contractAddress,\n extra: {\n symbol: tokenConfig.symbol,\n name: tokenConfig.name,\n decimals: tokenConfig.decimals,\n },\n }\n }\n\n /**\n * Get default asset address for network\n */\n private getDefaultAsset(network: string): string {\n const tokenConfig = getDefaultToken(network)\n if (!tokenConfig) {\n throw new Error(`No default token for network: ${network}`)\n }\n return tokenConfig.contractAddress\n }\n}\n","/**\n * 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":[]}
@@ -1,7 +1,3 @@
1
- var __defProp = Object.defineProperty;
2
- var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
3
- var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
4
-
5
1
  // src/constants.ts
6
2
  var TRON_MAINNET_CAIP2 = "tron:mainnet";
7
3
  var TRON_NILE_CAIP2 = "tron:nile";
@@ -37,6 +33,7 @@ var DEFAULT_USDT_DECIMALS = 6;
37
33
  var DEFAULT_TRX_DECIMALS = 6;
38
34
 
39
35
  // src/utils.ts
36
+ import { cryptoRandomHex } from "@t402/core/utils";
40
37
  function normalizeNetwork(network) {
41
38
  if (TRON_NETWORKS.includes(network)) {
42
39
  return network;
@@ -121,7 +118,7 @@ function convertFromSmallestUnits(smallestUnits, decimals = DEFAULT_USDT_DECIMAL
121
118
  }
122
119
  function generatePaymentReference() {
123
120
  const timestamp = Date.now();
124
- const random = Math.floor(Math.random() * 1e6);
121
+ const random = cryptoRandomHex(8);
125
122
  return `t402_${timestamp}_${random}`;
126
123
  }
127
124
  function calculateExpiration(validitySeconds) {
@@ -139,7 +136,6 @@ function estimateTransactionFee(isActivated = true) {
139
136
  }
140
137
 
141
138
  export {
142
- __publicField,
143
139
  TRON_MAINNET_CAIP2,
144
140
  TRON_NILE_CAIP2,
145
141
  TRON_SHASTA_CAIP2,
@@ -174,4 +170,4 @@ export {
174
170
  isValidHex,
175
171
  estimateTransactionFee
176
172
  };
177
- //# sourceMappingURL=chunk-MTL3FNSQ.mjs.map
173
+ //# sourceMappingURL=chunk-JZLCALMX.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/constants.ts","../../src/utils.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 * TRON Utility Functions\n *\n * Address validation, amount conversion, and network utilities.\n */\n\nimport { cryptoRandomHex } from '@t402/core/utils'\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(\n decimalAmount: string,\n decimals: number = DEFAULT_USDT_DECIMALS,\n): 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(\n smallestUnits: string,\n decimals: number = DEFAULT_USDT_DECIMALS,\n): 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 let end = fractionalPart.length\n while (end > 0 && fractionalPart[end - 1] === '0') end--\n const trimmedFractional = fractionalPart.slice(0, end)\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 * Uses cryptographically secure random bytes for uniqueness\n *\n * @returns Unique reference string\n */\nexport function generatePaymentReference(): string {\n const timestamp = Date.now()\n // Use 8 bytes (64 bits) of cryptographic randomness\n const random = cryptoRandomHex(8)\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"],"mappings":"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","names":[]}
@@ -0,0 +1,8 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
3
+ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
4
+
5
+ export {
6
+ __publicField
7
+ };
8
+ //# sourceMappingURL=chunk-NSSMTXJJ.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,62 @@
1
+ // src/upto/types.ts
2
+ function isUptoTronPayload(data) {
3
+ if (!data || typeof data !== "object") {
4
+ return false;
5
+ }
6
+ const obj = data;
7
+ if (typeof obj.signedTransaction !== "string" || !obj.signedTransaction) {
8
+ return false;
9
+ }
10
+ if (typeof obj.paymentNonce !== "string" || !obj.paymentNonce) {
11
+ return false;
12
+ }
13
+ const auth = obj.authorization;
14
+ if (!auth || typeof auth !== "object") {
15
+ return false;
16
+ }
17
+ const authObj = auth;
18
+ if (typeof authObj.owner !== "string" || !authObj.owner) {
19
+ return false;
20
+ }
21
+ if (typeof authObj.spender !== "string" || !authObj.spender) {
22
+ return false;
23
+ }
24
+ if (typeof authObj.contractAddress !== "string" || !authObj.contractAddress) {
25
+ return false;
26
+ }
27
+ if (typeof authObj.maxAmount !== "string" || !authObj.maxAmount) {
28
+ return false;
29
+ }
30
+ if (typeof authObj.expiration !== "number") {
31
+ return false;
32
+ }
33
+ if (typeof authObj.refBlockBytes !== "string") {
34
+ return false;
35
+ }
36
+ if (typeof authObj.refBlockHash !== "string") {
37
+ return false;
38
+ }
39
+ if (typeof authObj.timestamp !== "number") {
40
+ return false;
41
+ }
42
+ return true;
43
+ }
44
+ function isUptoTronExtra(data) {
45
+ if (!data || typeof data !== "object") {
46
+ return false;
47
+ }
48
+ const obj = data;
49
+ const stringFields = ["maxAmount", "minAmount", "unit", "unitPrice", "spenderAddress"];
50
+ for (const field of stringFields) {
51
+ if (field in obj && typeof obj[field] !== "string") {
52
+ return false;
53
+ }
54
+ }
55
+ return true;
56
+ }
57
+
58
+ export {
59
+ isUptoTronPayload,
60
+ isUptoTronExtra
61
+ };
62
+ //# sourceMappingURL=chunk-YHPIW52A.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/upto/types.ts"],"sourcesContent":["/**\n * TRON Up-To Payment Types\n *\n * Type definitions for TRON TRC-20 upto (approve + transferFrom) payment payloads.\n * The upto scheme allows clients to authorize payments up to a maximum amount,\n * with the actual settlement amount determined at settlement time.\n */\n\n/**\n * Authorization metadata for a TRON TRC-20 approve transaction.\n *\n * Contains all information needed to verify the approval without\n * parsing the signed transaction.\n */\nexport type UptoTronAuthorization = {\n /** Token owner address (T-prefix base58check) */\n owner: string\n\n /** Approved spender address - facilitator (T-prefix base58check) */\n spender: string\n\n /** TRC-20 contract address (T-prefix base58check) */\n contractAddress: string\n\n /** Maximum approved amount in smallest units (as string for large numbers) */\n maxAmount: string\n\n /** Transaction expiration timestamp (milliseconds since epoch) */\n expiration: number\n\n /** Reference block bytes (hex string) */\n refBlockBytes: string\n\n /** Reference block hash (hex string) */\n refBlockHash: string\n\n /** Transaction timestamp (milliseconds since epoch) */\n timestamp: number\n}\n\n/**\n * TRON upto payment payload.\n *\n * Contains the signed approve transaction ready for broadcast\n * along with authorization metadata for verification.\n */\nexport type UptoTronPayload = {\n /** Hex-encoded signed approve transaction */\n signedTransaction: string\n\n /** Approve transaction authorization metadata */\n authorization: UptoTronAuthorization\n\n /** Unique nonce for replay protection (hex string) */\n paymentNonce: string\n}\n\n/**\n * Extra fields for TRON upto payment requirements.\n *\n * Included in the PaymentRequirements.extra field to communicate\n * upto-specific parameters to the client.\n */\nexport type UptoTronExtra = {\n /** Maximum payment amount authorized */\n maxAmount?: string\n\n /** Minimum acceptable settlement amount */\n minAmount?: string\n\n /** Billing unit (e.g., \"token\", \"request\", \"second\") */\n unit?: string\n\n /** Price per unit in smallest denomination */\n unitPrice?: string\n\n /** Facilitator address that will be approved as spender */\n spenderAddress?: string\n}\n\n/**\n * Type guard to check if unknown data is an UptoTronPayload.\n *\n * Validates the presence and types of all required fields including\n * nested authorization fields.\n *\n * @param data - Unknown data to check\n * @returns True if data matches the UptoTronPayload structure\n */\nexport function isUptoTronPayload(data: unknown): data is UptoTronPayload {\n if (!data || typeof data !== 'object') {\n return false\n }\n\n const obj = data as Record<string, unknown>\n\n // Check top-level fields\n if (typeof obj.signedTransaction !== 'string' || !obj.signedTransaction) {\n return false\n }\n\n if (typeof obj.paymentNonce !== 'string' || !obj.paymentNonce) {\n return false\n }\n\n // Check authorization structure\n const auth = obj.authorization\n if (!auth || typeof auth !== 'object') {\n return false\n }\n\n const authObj = auth as Record<string, unknown>\n\n if (typeof authObj.owner !== 'string' || !authObj.owner) {\n return false\n }\n\n if (typeof authObj.spender !== 'string' || !authObj.spender) {\n return false\n }\n\n if (typeof authObj.contractAddress !== 'string' || !authObj.contractAddress) {\n return false\n }\n\n if (typeof authObj.maxAmount !== 'string' || !authObj.maxAmount) {\n return false\n }\n\n if (typeof authObj.expiration !== 'number') {\n return false\n }\n\n if (typeof authObj.refBlockBytes !== 'string') {\n return false\n }\n\n if (typeof authObj.refBlockHash !== 'string') {\n return false\n }\n\n if (typeof authObj.timestamp !== 'number') {\n return false\n }\n\n return true\n}\n\n/**\n * Type guard to check if unknown data is an UptoTronExtra.\n *\n * @param data - Unknown data to check\n * @returns True if data matches the UptoTronExtra structure\n */\nexport function isUptoTronExtra(data: unknown): data is UptoTronExtra {\n if (!data || typeof data !== 'object') {\n return false\n }\n\n const obj = data as Record<string, unknown>\n\n // All fields are optional, but if present they must be strings\n const stringFields = ['maxAmount', 'minAmount', 'unit', 'unitPrice', 'spenderAddress'] as const\n for (const field of stringFields) {\n if (field in obj && typeof obj[field] !== 'string') {\n return false\n }\n }\n\n return true\n}\n"],"mappings":";AAyFO,SAAS,kBAAkB,MAAwC;AACxE,MAAI,CAAC,QAAQ,OAAO,SAAS,UAAU;AACrC,WAAO;AAAA,EACT;AAEA,QAAM,MAAM;AAGZ,MAAI,OAAO,IAAI,sBAAsB,YAAY,CAAC,IAAI,mBAAmB;AACvE,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,IAAI,iBAAiB,YAAY,CAAC,IAAI,cAAc;AAC7D,WAAO;AAAA,EACT;AAGA,QAAM,OAAO,IAAI;AACjB,MAAI,CAAC,QAAQ,OAAO,SAAS,UAAU;AACrC,WAAO;AAAA,EACT;AAEA,QAAM,UAAU;AAEhB,MAAI,OAAO,QAAQ,UAAU,YAAY,CAAC,QAAQ,OAAO;AACvD,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,QAAQ,YAAY,YAAY,CAAC,QAAQ,SAAS;AAC3D,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,QAAQ,oBAAoB,YAAY,CAAC,QAAQ,iBAAiB;AAC3E,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,QAAQ,cAAc,YAAY,CAAC,QAAQ,WAAW;AAC/D,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,QAAQ,eAAe,UAAU;AAC1C,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,QAAQ,kBAAkB,UAAU;AAC7C,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,QAAQ,iBAAiB,UAAU;AAC5C,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,QAAQ,cAAc,UAAU;AACzC,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAQO,SAAS,gBAAgB,MAAsC;AACpE,MAAI,CAAC,QAAQ,OAAO,SAAS,UAAU;AACrC,WAAO;AAAA,EACT;AAEA,QAAM,MAAM;AAGZ,QAAM,eAAe,CAAC,aAAa,aAAa,QAAQ,aAAa,gBAAgB;AACrF,aAAW,SAAS,cAAc;AAChC,QAAI,SAAS,OAAO,OAAO,IAAI,KAAK,MAAM,UAAU;AAClD,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;","names":[]}
@@ -1,6 +1,6 @@
1
1
  import { SchemeNetworkClient, PaymentRequirements, PaymentPayload, Network } from '@t402/core/types';
2
- import { C as ClientTronSigner } from '../../signer-BB-HLs-P.mjs';
3
- import { t402Client, PaymentPolicy } from '@t402/core/client';
2
+ import { C as ClientTronSigner } from '../../signer-iuJaSShT.mjs';
3
+ import { PaymentPolicy, t402Client } from '@t402/core/client';
4
4
 
5
5
  /**
6
6
  * TRON Exact Payment Scheme - Client Implementation
@@ -1,8 +1,9 @@
1
1
  import {
2
2
  ExactTronScheme,
3
3
  registerExactTronScheme
4
- } from "../../chunk-5QY7AVRU.mjs";
5
- import "../../chunk-MTL3FNSQ.mjs";
4
+ } from "../../chunk-64IMOFLN.mjs";
5
+ import "../../chunk-JZLCALMX.mjs";
6
+ import "../../chunk-NSSMTXJJ.mjs";
6
7
  export {
7
8
  ExactTronScheme,
8
9
  registerExactTronScheme
@@ -1,5 +1,5 @@
1
1
  import { SchemeNetworkFacilitator, PaymentPayload, PaymentRequirements, VerifyResponse, SettleResponse, Network } from '@t402/core/types';
2
- import { F as FacilitatorTronSigner } from '../../signer-BB-HLs-P.mjs';
2
+ import { F as FacilitatorTronSigner } from '../../signer-iuJaSShT.mjs';
3
3
  import { t402Facilitator } from '@t402/core/facilitator';
4
4
 
5
5
  /**
@@ -1,8 +1,9 @@
1
1
  import {
2
2
  ExactTronScheme,
3
3
  registerExactTronScheme
4
- } from "../../chunk-NP4MIP3N.mjs";
5
- import "../../chunk-MTL3FNSQ.mjs";
4
+ } from "../../chunk-C6ANAART.mjs";
5
+ import "../../chunk-JZLCALMX.mjs";
6
+ import "../../chunk-NSSMTXJJ.mjs";
6
7
  export {
7
8
  ExactTronScheme,
8
9
  registerExactTronScheme
@@ -1,8 +1,9 @@
1
1
  import {
2
2
  ExactTronScheme,
3
3
  registerExactTronScheme
4
- } from "../../chunk-5HUXHQSQ.mjs";
5
- import "../../chunk-MTL3FNSQ.mjs";
4
+ } from "../../chunk-COESQEG6.mjs";
5
+ import "../../chunk-JZLCALMX.mjs";
6
+ import "../../chunk-NSSMTXJJ.mjs";
6
7
  export {
7
8
  ExactTronScheme,
8
9
  registerExactTronScheme
@@ -1,8 +1,9 @@
1
- import { N as NetworkTRC20Registry, T as TRC20Config } from './signer-BB-HLs-P.mjs';
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.mjs';
1
+ import { N as NetworkTRC20Registry, T as TRC20Config } from './signer-iuJaSShT.mjs';
2
+ export { C as ClientTronSigner, E as ExactTronPayload, a as ExactTronPayloadV2, F as FacilitatorTronSigner, b as TransactionConfirmation, c as TronAuthorization, V as VerifyMessageResult } from './signer-iuJaSShT.mjs';
3
3
  export { ExactTronScheme as ExactTronClientScheme, ExactTronSchemeConfig as ExactTronClientSchemeConfig, TronClientConfig, registerExactTronScheme as registerExactTronClientScheme } from './exact/client/index.mjs';
4
4
  export { ExactTronScheme as ExactTronServerScheme, ExactTronSchemeConfig as ExactTronServerSchemeConfig, TronResourceServerConfig, registerExactTronScheme as registerExactTronServerScheme } from './exact/server/index.mjs';
5
5
  export { ExactTronScheme as ExactTronFacilitatorScheme, ExactTronSchemeConfig as ExactTronFacilitatorSchemeConfig, TronFacilitatorConfig, registerExactTronScheme as registerExactTronFacilitatorScheme } from './exact/facilitator/index.mjs';
6
+ export { UptoTronAuthorization, UptoTronExtra, UptoTronPayload, isUptoTronExtra, isUptoTronPayload } from './upto/index.mjs';
6
7
  import '@t402/core/types';
7
8
  import '@t402/core/client';
8
9
  import '@t402/core/server';
@@ -205,6 +206,7 @@ declare function convertToSmallestUnits(decimalAmount: string, decimals?: number
205
206
  declare function convertFromSmallestUnits(smallestUnits: string, decimals?: number): string;
206
207
  /**
207
208
  * Generate a unique memo/reference for payment tracking
209
+ * Uses cryptographically secure random bytes for uniqueness
208
210
  *
209
211
  * @returns Unique reference string
210
212
  */
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  ExactTronScheme,
3
3
  registerExactTronScheme
4
- } from "./chunk-5QY7AVRU.mjs";
4
+ } from "./chunk-64IMOFLN.mjs";
5
5
  import {
6
6
  ExactTronScheme as ExactTronScheme2,
7
7
  TRC20_REGISTRY,
@@ -14,11 +14,11 @@ import {
14
14
  getUsdtNetworks,
15
15
  isNetworkSupported,
16
16
  registerExactTronScheme as registerExactTronScheme2
17
- } from "./chunk-5HUXHQSQ.mjs";
17
+ } from "./chunk-COESQEG6.mjs";
18
18
  import {
19
19
  ExactTronScheme as ExactTronScheme3,
20
20
  registerExactTronScheme as registerExactTronScheme3
21
- } from "./chunk-NP4MIP3N.mjs";
21
+ } from "./chunk-C6ANAART.mjs";
22
22
  import {
23
23
  DEFAULT_FEE_LIMIT,
24
24
  DEFAULT_TRX_DECIMALS,
@@ -53,7 +53,12 @@ import {
53
53
  isValidHex,
54
54
  normalizeNetwork,
55
55
  validateTronAddress
56
- } from "./chunk-MTL3FNSQ.mjs";
56
+ } from "./chunk-JZLCALMX.mjs";
57
+ import {
58
+ isUptoTronExtra,
59
+ isUptoTronPayload
60
+ } from "./chunk-YHPIW52A.mjs";
61
+ import "./chunk-NSSMTXJJ.mjs";
57
62
  export {
58
63
  DEFAULT_FEE_LIMIT,
59
64
  DEFAULT_TRX_DECIMALS,
@@ -97,6 +102,8 @@ export {
97
102
  getUsdtNetworks,
98
103
  isNetworkSupported,
99
104
  isTronNetwork,
105
+ isUptoTronExtra,
106
+ isUptoTronPayload,
100
107
  isValidHex,
101
108
  normalizeNetwork,
102
109
  registerExactTronScheme as registerExactTronClientScheme,
@@ -258,4 +258,4 @@ type FacilitatorTronSigner = {
258
258
  isActivated(address: string, network: string): Promise<boolean>;
259
259
  };
260
260
 
261
- export type { ClientTronSigner as C, ExactTronPayload as E, FacilitatorTronSigner as F, NetworkTRC20Registry as N, TRC20Config as T, VerifyMessageResult as V, TronAuthorization as a, ExactTronPayloadV2 as b, TransactionConfirmation as c };
261
+ export type { ClientTronSigner as C, ExactTronPayload as E, FacilitatorTronSigner as F, NetworkTRC20Registry as N, TRC20Config as T, VerifyMessageResult as V, ExactTronPayloadV2 as a, TransactionConfirmation as b, TronAuthorization as c };