@layerzerolabs/tron-utilities 3.0.15 → 3.0.17

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,23 @@
1
1
  # @layerzerolabs/tron-utilities
2
2
 
3
+ ## 3.0.17
4
+
5
+ ### Patch Changes
6
+
7
+ - 40f2269: islander mainnet
8
+ - 40f2269: testnets
9
+ - Updated dependencies [40f2269]
10
+ - Updated dependencies [40f2269]
11
+ - @layerzerolabs/lz-utilities@3.0.17
12
+
13
+ ## 3.0.16
14
+
15
+ ### Patch Changes
16
+
17
+ - 87a4bc9: islander mainnet
18
+ - Updated dependencies [87a4bc9]
19
+ - @layerzerolabs/lz-utilities@3.0.16
20
+
3
21
  ## 3.0.15
4
22
 
5
23
  ### Patch Changes
package/dist/index.cjs CHANGED
@@ -17,11 +17,30 @@ var MINUTE = 60 * SECOND;
17
17
  var HOUR = 60 * MINUTE;
18
18
  var DAY = 24 * HOUR;
19
19
  var Time = {
20
+ /**
21
+ * Millisecond unit.
22
+ */
20
23
  MILLISECOND,
24
+ /**
25
+ * Second unit.
26
+ */
21
27
  SECOND,
28
+ /**
29
+ * Minute unit.
30
+ */
22
31
  MINUTE,
32
+ /**
33
+ * Hour unit.
34
+ */
23
35
  HOUR,
36
+ /**
37
+ * Day unit.
38
+ */
24
39
  DAY,
40
+ /**
41
+ * Gets the current time in milliseconds since the Unix epoch.
42
+ * @returns {number} The current time in milliseconds.
43
+ */
25
44
  get NOW() {
26
45
  return Date.now();
27
46
  }
@@ -29,33 +48,75 @@ var Time = {
29
48
 
30
49
  // src/url.ts
31
50
  var DefaultProviderConversionStrategy = class {
51
+ /**
52
+ * Converts a URL to its REST endpoint equivalent.
53
+ *
54
+ * @param {string} url - The URL to convert.
55
+ * @returns {string} The converted REST endpoint URL.
56
+ */
32
57
  asREST(url) {
33
58
  return url.replace(/\/jsonrpc$/, "");
34
59
  }
60
+ /**
61
+ * Converts a URL to its JSON-RPC endpoint equivalent.
62
+ *
63
+ * @param {string} url - The URL to convert.
64
+ * @returns {string} The converted JSON-RPC endpoint URL.
65
+ */
35
66
  asJSONRPC(url) {
36
67
  return url.trim().replace(/\/?$/, "/jsonrpc");
37
68
  }
38
69
  };
39
70
  var AnkrProviderConversionStrategy = class {
71
+ /**
72
+ * Converts a URL to its REST endpoint equivalent.
73
+ *
74
+ * @param {string} url - The URL to convert.
75
+ * @returns {string} The converted REST endpoint URL.
76
+ */
40
77
  asREST(url) {
41
78
  if (/tron\/[0-9a-fA-F]{10,}/.test(url)) {
42
79
  return url.replace(/\/tron_jsonrpc$/, "/premium-http/tron");
43
80
  }
44
81
  return url.replace(/\/tron_jsonrpc$/, "/http/tron");
45
82
  }
83
+ /**
84
+ * Converts a URL to its JSON-RPC endpoint equivalent.
85
+ *
86
+ * @param {string} url - The URL to convert.
87
+ * @returns {string} The converted JSON-RPC endpoint URL.
88
+ */
46
89
  asJSONRPC(url) {
47
90
  return url.trim().replace(/\/(premium-http|http)\/tron/, "/tron_jsonrpc");
48
91
  }
49
92
  };
50
93
  var QuiknodeProviderConversionStrategy = class {
94
+ /**
95
+ * Converts a URL to its REST endpoint equivalent.
96
+ *
97
+ * @param {string} url - The URL to convert.
98
+ * @returns {string} The converted REST endpoint URL.
99
+ */
51
100
  asREST(url) {
52
101
  return url.replace(/\/jsonrpc$/, "");
53
102
  }
103
+ /**
104
+ * Converts a URL to its JSON-RPC endpoint equivalent.
105
+ *
106
+ * @param {string} url - The URL to convert.
107
+ * @returns {string} The converted JSON-RPC endpoint URL.
108
+ */
54
109
  asJSONRPC(url) {
55
110
  return url.trim().replace(/\/?$/, "/jsonrpc");
56
111
  }
57
112
  };
58
113
  var _StrategyFactory = class _StrategyFactory {
114
+ /**
115
+ * Gets the appropriate provider conversion strategy for a given URL.
116
+ *
117
+ * @param {string} url - The URL to get the conversion strategy for.
118
+ * @returns {ProviderConversionStrategy} The provider conversion strategy.
119
+ */
59
120
  static get(url) {
60
121
  for (const [pattern, strategy] of this.strategies) {
61
122
  if (pattern.test(url)) {
@@ -65,6 +126,9 @@ var _StrategyFactory = class _StrategyFactory {
65
126
  return new DefaultProviderConversionStrategy();
66
127
  }
67
128
  };
129
+ /**
130
+ * A map of URL patterns to provider conversion strategies.
131
+ */
68
132
  _StrategyFactory.strategies = /* @__PURE__ */ new Map();
69
133
  _StrategyFactory.strategies.set(/api.trongrid.io/, new DefaultProviderConversionStrategy());
70
134
  _StrategyFactory.strategies.set(/ankr.com/, new AnkrProviderConversionStrategy());
@@ -163,8 +227,7 @@ async function fullFillTxn(signer, txn, overrides = {}) {
163
227
  });
164
228
  async function getGasPrice() {
165
229
  const { time, value } = gasPriceCache;
166
- if (time > Time.NOW - 15 * Time.SECOND && value != "")
167
- return value;
230
+ if (time > Time.NOW - 15 * Time.SECOND && value != "") return value;
168
231
  const newGaspPrice = await etherProvider.getGasPrice().then((x) => x.toString());
169
232
  gasPriceCache = { time: Time.NOW, value: newGaspPrice };
170
233
  return newGaspPrice;
@@ -182,8 +245,7 @@ async function fullFillTxn(signer, txn, overrides = {}) {
182
245
  async function getEnergyFactor(raw) {
183
246
  const addr = raw.raw_data.contract[0].parameter.value.contract_address;
184
247
  const cached = energyFactorsCache.get(addr);
185
- if (cached && cached.time > Time.NOW - 10 * Time.MINUTE)
186
- return cached.value;
248
+ if (cached && cached.time > Time.NOW - 10 * Time.MINUTE) return cached.value;
187
249
  const MAX_ENERGY_FACTOR = 1.2;
188
250
  const response = await signer.fullNode.request(
189
251
  "wallet/getcontractinfo",
@@ -276,5 +338,5 @@ exports.fullFillTxn = fullFillTxn;
276
338
  exports.sendTronTransaction = sendTronTransaction;
277
339
  exports.signAndSendTronTransaction = signAndSendTronTransaction;
278
340
  exports.signTronTx = signTronTx;
279
- //# sourceMappingURL=out.js.map
341
+ //# sourceMappingURL=index.cjs.map
280
342
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/tron.ts","../src/time.ts","../src/url.ts"],"names":["TronTransactionType","overrides","txId","output"],"mappings":"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","sourcesContent":["import { ethers } from 'ethers'\nimport TronWeb from 'tronweb'\n\nimport { getLogger, sleep } from '@layerzerolabs/lz-utilities'\n\nimport { Time } from './time'\nimport { StrategyFactory } from './url'\n\nimport type {\n BlockTransaction,\n ChainParameter,\n ContractExecutionParams,\n ContractInfo,\n Transaction,\n TransactionInfo,\n TransactionResult,\n} from 'tronweb'\n\nexport enum TronTransactionType {\n TRIGGER_SMART_CONTRACT = 'TriggerSmartContract',\n}\n\nexport interface TransactionOverrides {\n gasLimit?: number\n gasPrice?: number\n energyFactor?: number\n value?: number\n}\n\nexport interface PartialTronTransaction {\n visible: boolean\n txID: string\n raw_data_hex: string\n raw_data: {\n contract: [PartialTronTransactionContract]\n }\n}\n\nexport interface TronTransaction extends PartialTronTransaction {\n raw_data: {\n contract: [FullTronTransactionContract]\n ref_block_bytes: string\n ref_block_hash: string\n expiration: number\n fee_limit: number\n timestamp: number\n }\n}\n\nexport interface SignedTronTransaction extends TronTransaction {\n signature: string[]\n}\n\ninterface PartialTronTransactionParameterValue {\n data: string\n contract_address: string\n owner_address: string\n}\n\ninterface TronTransactionParameterValue extends PartialTronTransactionParameterValue {\n token_id?: number\n call_token_value?: number\n call_value?: number\n}\n\ninterface TronTransactionParameter<T> {\n value: T\n type_url: `type.googleapis.com/protocol.${TronTransactionType}`\n}\n\ninterface TronTransactionContract<T> {\n parameter: TronTransactionParameter<T>\n type: TronTransactionType\n Permission_id?: number\n}\n\ntype PartialTronTransactionContract = TronTransactionContract<PartialTronTransactionParameterValue>\ntype FullTronTransactionContract = TronTransactionContract<TronTransactionParameterValue>\n\ninterface TronBlockHeaderRawData {\n number: number\n txTrieRoot: string\n witness_address: string\n parentHash: string\n timestamp: number\n}\n\ninterface TronBlockHeader {\n raw_data: TronBlockHeaderRawData\n witness_signature: string\n}\n\nexport interface TronBlockData {\n blockID: string\n block_header: TronBlockHeader\n}\n\ninterface TronWebError1 {\n code: string\n message: string\n txid: string\n}\n\ninterface TronWebError2 {\n Error: string\n}\ntype TronWebErrorResponse = TronWebError1 | TronWebError2\n\nexport {\n TronWeb,\n BlockTransaction,\n ContractExecutionParams,\n ChainParameter,\n Transaction,\n TronWebError1,\n TronWebError2,\n TronWebErrorResponse,\n}\n\nconst logger = getLogger()\n\nexport type ProviderSetting =\n | {\n url: string\n apiKey?: string\n }\n | string\n\nexport function createTronWeb(signer: { rpcSetting: ProviderSetting; privateKey: string } | TronWeb): TronWeb {\n if (!(signer instanceof TronWeb)) {\n const fullHostUrl = typeof signer.rpcSetting === 'string' ? signer.rpcSetting : signer.rpcSetting.url\n const client = new TronWeb({\n fullHost: StrategyFactory.get(fullHostUrl).asREST(fullHostUrl),\n headers: {\n 'TRON-PRO-API-KEY': typeof signer.rpcSetting === 'string' ? '' : signer.rpcSetting.apiKey ?? '',\n },\n privateKey: signer.privateKey.replace(/^0x/, ''),\n })\n return client\n }\n return signer\n}\n\nexport async function signAndSendTronTransaction(\n txn: {\n data: string\n to: string\n } & TransactionOverrides,\n signer: { rpcSetting: ProviderSetting; privateKey: string } | TronWeb,\n permissionId?: number // for multi-sig\n): Promise<{ txId: string; result: TransactionResult; wait: () => Promise<TransactionInfo> }> {\n const signedTxn = await signTronTx(txn, signer, permissionId)\n const client = createTronWeb(signer)\n return sendTronTransaction(signedTxn, client)\n}\n\nexport async function sendTronTransaction(\n singedTxn: SignedTronTransaction,\n client: TronWeb\n): Promise<{ txId: string; result: TransactionResult; wait: () => Promise<TransactionInfo> }> {\n // reference: https://developers.tron.network/reference/json-rpc-api-overview\n // JSON-RPC interface is not fully supported by the TRON network.\n // Furthermore, The JSON-RPC service needs to be enabled and set the port in the node configuration\n // file. If not configured, the service is disable by default.\n // broadcast signedTransaction\n const broadcastResponse = await client.trx.sendRawTransaction(singedTxn)\n if (broadcastResponse.code !== undefined) {\n const err = {\n error: broadcastResponse.code,\n message: TronWeb.toUtf8(broadcastResponse.message ?? ''),\n }\n throw new Error(JSON.stringify(err, null, 2))\n }\n\n return {\n txId: singedTxn.txID,\n result: broadcastResponse,\n wait: async (): Promise<TransactionInfo> => {\n return checkResult(client, singedTxn.txID)\n },\n }\n}\n\nexport async function signTronTx(\n txn: {\n data: string\n to: string\n } & TransactionOverrides,\n _signer: { rpcSetting: ProviderSetting; privateKey: string } | TronWeb,\n permissionId?: number // for multi-sig\n): Promise<SignedTronTransaction> {\n const signer: TronWeb = createTronWeb(_signer)\n\n // privateKey = privateKey.replace(/^0x/, '') // remove the 0x prefix\n // private key to address\n // const from = TronWeb.address.fromPrivateKey(privateKey)\n if (typeof signer.defaultAddress.hex !== 'string') {\n throw new Error(`signer.defaultAddress.hex is not a valid hex string`)\n }\n\n const partialTxn: PartialTronTransaction = {\n visible: false,\n txID: '',\n raw_data_hex: '',\n raw_data: {\n contract: [\n {\n parameter: {\n value: {\n data: txn.data.replace(/^0x/, ''),\n contract_address: TronWeb.address.toHex(txn.to),\n owner_address: signer.defaultAddress.hex,\n },\n type_url: `type.googleapis.com/protocol.${TronTransactionType.TRIGGER_SMART_CONTRACT}`,\n },\n type: TronTransactionType.TRIGGER_SMART_CONTRACT,\n Permission_id: permissionId,\n },\n ],\n },\n }\n\n const fullTxn = await fullFillTxn(signer, partialTxn, {\n gasLimit: txn.gasLimit,\n gasPrice: txn.gasPrice,\n energyFactor: txn.energyFactor,\n value: txn.value,\n })\n\n // sign transaction\n const signedTransaction = await signer.trx.sign(fullTxn)\n if (signedTransaction.signature === undefined) {\n throw new Error('Invalid private key provided')\n }\n return signedTransaction as SignedTronTransaction\n}\n\nlet gasPriceCache: { time: number; value: string } = { time: 0, value: '' }\nconst energyFactorsCache = new Map<string, { time: number; value: number }>()\n\nexport async function fullFillTxn(\n signer: TronWeb,\n txn: PartialTronTransaction,\n overrides: TransactionOverrides = {}\n): Promise<TronTransaction> {\n const apiKey = signer.fullNode.headers['TRON-PRO-API-KEY']\n const etherProvider = new ethers.providers.StaticJsonRpcProvider({\n url: StrategyFactory.get(signer.fullNode.host).asJSONRPC(signer.fullNode.host),\n headers: {\n ...(typeof apiKey !== 'undefined' ? { 'TRON-PRO-API-KEY': apiKey } : {}),\n },\n })\n\n // cache the gasPrice with a 15sec TTL\n async function getGasPrice(): Promise<string> {\n const { time, value } = gasPriceCache\n if (time > Time.NOW - 15 * Time.SECOND && value != '') return value\n const newGaspPrice = await etherProvider.getGasPrice().then((x) => x.toString())\n gasPriceCache = { time: Time.NOW, value: newGaspPrice }\n return newGaspPrice\n }\n\n async function getGasLimit(raw: PartialTronTransaction): Promise<number> {\n const gasLimit = await etherProvider.estimateGas({\n to: raw.raw_data.contract[0].parameter.value.contract_address.replace(/^41/, '0x'), // need to slice off the \"41\" prefix that Tron appends to addresses\n data: '0x' + raw.raw_data.contract[0].parameter.value.data,\n from: raw.raw_data.contract[0].parameter.value.owner_address.replace(/^41/, '0x'),\n value: overrides.value ?? 0,\n })\n return gasLimit.toNumber()\n }\n\n // cache the energy_factor with a 10min TTL, energy factors should be updated by Tron every 6h\n async function getEnergyFactor(raw: PartialTronTransaction): Promise<number> {\n /* eslint-disable @typescript-eslint/no-unsafe-assignment */\n const addr = raw.raw_data.contract[0].parameter.value.contract_address\n const cached = energyFactorsCache.get(addr)\n if (cached && cached.time > Time.NOW - 10 * Time.MINUTE) return cached.value\n const MAX_ENERGY_FACTOR = 1.2\n // refers: https://developers.tron.network/reference/getcontractinfo\n const response = await signer.fullNode.request(\n 'wallet/getcontractinfo',\n { value: addr, visible: false },\n 'post'\n )\n const contractInfo: ContractInfo = response as ContractInfo\n const energy_factor = contractInfo.contract_state.energy_factor ?? MAX_ENERGY_FACTOR\n energyFactorsCache.set(addr, { time: Time.NOW, value: energy_factor })\n return energy_factor\n /* eslint-enable @typescript-eslint/no-unsafe-assignment */\n }\n\n async function getFeeLimit(raw: PartialTronTransaction, overrides: TransactionOverrides = {}): Promise<number> {\n // https://developers.tron.network/docs/set-feelimit#how-to-determine-the-feelimit-parameter\n // https://developers.tron.network/reference/getcontractinfo, get energy_factor\n // https://developers.tron.network/docs/resource-model#dynamic-energy-model, max factor\n // Tight FeeLimit of contract transaction = estimated basic energy consumption * (1 + energy_factor) * EnergyPrice\n // Loose FeeLimit of contract transaction = estimated basic energy consumption * (1 + max_energy_factor) * EnergyPrice\n const MAX_FEE_LIMIT = 15000000000\n const energy_factor = overrides.energyFactor ?? (await getEnergyFactor(raw))\n const gasLimit = overrides.gasLimit ?? (await getGasLimit(raw))\n const energyPrice = overrides.gasPrice ?? Number(await getGasPrice())\n const factor = 1 + energy_factor\n const feeLimit = gasLimit * factor * energyPrice\n const feeLimit_adjusted = Math.ceil(feeLimit) * 1.2 // based on reading other parts of the code, we add a 20% cushion on fee limits\n return Math.floor(Math.min(feeLimit_adjusted, MAX_FEE_LIMIT))\n }\n\n const metadata = (await signer.fullNode.request('wallet/getblock', { detail: false }, 'post')) as TronBlockData\n const ref_block_bytes = metadata.block_header.raw_data.number.toString(16).slice(-4).padStart(4, '0')\n const ref_block_hash = metadata.blockID.slice(16, 32)\n const expiration = metadata.block_header.raw_data.timestamp + 60 * 1000\n const { timestamp } = metadata.block_header.raw_data\n\n const tx: TronTransaction = {\n ...txn,\n raw_data: {\n contract: [\n {\n parameter: {\n value: {\n ...txn.raw_data.contract[0].parameter.value,\n call_value: overrides.value ?? 0,\n },\n type_url: txn.raw_data.contract[0].parameter.type_url,\n },\n type: txn.raw_data.contract[0].type,\n },\n ],\n ref_block_bytes,\n ref_block_hash,\n expiration,\n fee_limit: await getFeeLimit(txn, overrides),\n timestamp,\n },\n }\n const pb = signer.utils.transaction.txJsonToPb(tx)\n tx.txID = signer.utils.transaction.txPbToTxID(pb).replace(/^0x/, '')\n tx.raw_data_hex = signer.utils.transaction.txPbToRawDataHex(pb).toLowerCase()\n\n return tx\n}\n\nexport async function checkResult(tronWeb: TronWeb, txId: string): Promise<TransactionInfo> {\n const startTime = Date.now()\n const waitTimeout = 1000 * 60 * 5 // 5 minutes\n // TODO: get the block producer interval from the chain and sleep for that time\n const wait = async function (txId: string): Promise<TransactionInfo> {\n let tries = 0\n while (tries++ < 20) {\n const output = await tronWeb.trx.getTransactionInfo(txId)\n if (Object.keys(output).length > 0) {\n return output\n }\n\n // check if timeout\n if (Date.now() - startTime > waitTimeout) {\n throw new Error('Timeout waiting for transaction to be processed')\n }\n // wait 1 seconds for next check, mainnet block producer interval is 3 seconds,\n // but we need a small interval for the local network to speed up the test\n await sleep(1200)\n }\n throw new Error(`Failed to get transactionInfo for txId: ${txId}`)\n }\n\n const output = await wait(txId)\n\n if (output.result !== undefined && output.result === 'FAILED') {\n throw new Error(TronWeb.toUtf8(output.resMessage ?? ''))\n }\n\n if (!Object.prototype.hasOwnProperty.call(output, 'contractResult')) {\n throw new Error('Failed to execute: ' + JSON.stringify(output, null, 2))\n }\n\n return output\n}\n","// Base unit in milliseconds\nconst MILLISECOND = 1\nconst SECOND = 1000 * MILLISECOND\nconst MINUTE = 60 * SECOND\nconst HOUR = 60 * MINUTE\nconst DAY = 24 * HOUR\n\nexport const Time = {\n MILLISECOND,\n SECOND,\n MINUTE,\n HOUR,\n DAY,\n get NOW() {\n return Date.now()\n },\n} as const\n","export interface ProviderConversionStrategy {\n asREST(url: string): string\n asJSONRPC(url: string): string\n}\n\nclass DefaultProviderConversionStrategy implements ProviderConversionStrategy {\n asREST(url: string): string {\n return url.replace(/\\/jsonrpc$/, '')\n }\n\n asJSONRPC(url: string): string {\n return url.trim().replace(/\\/?$/, '/jsonrpc')\n }\n}\n\nclass AnkrProviderConversionStrategy implements ProviderConversionStrategy {\n asREST(url: string): string {\n if (/tron\\/[0-9a-fA-F]{10,}/.test(url)) {\n return url.replace(/\\/tron_jsonrpc$/, '/premium-http/tron')\n }\n\n return url.replace(/\\/tron_jsonrpc$/, '/http/tron')\n }\n\n asJSONRPC(url: string): string {\n return url.trim().replace(/\\/(premium-http|http)\\/tron/, '/tron_jsonrpc')\n }\n}\n\nclass QuiknodeProviderConversionStrategy implements ProviderConversionStrategy {\n asREST(url: string): string {\n return url.replace(/\\/jsonrpc$/, '')\n }\n\n asJSONRPC(url: string): string {\n return url.trim().replace(/\\/?$/, '/jsonrpc')\n }\n}\n\nexport class StrategyFactory {\n public static strategies = new Map<RegExp, ProviderConversionStrategy>()\n\n static {\n StrategyFactory.strategies.set(/api.trongrid.io/, new DefaultProviderConversionStrategy())\n StrategyFactory.strategies.set(/ankr.com/, new AnkrProviderConversionStrategy())\n StrategyFactory.strategies.set(/quiknode.pro/, new QuiknodeProviderConversionStrategy())\n }\n\n static get(url: string): ProviderConversionStrategy {\n for (const [pattern, strategy] of this.strategies) {\n if (pattern.test(url)) {\n return strategy\n }\n }\n return new DefaultProviderConversionStrategy()\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/time.ts","../src/url.ts","../src/tron.ts"],"names":["TronTransactionType","getLogger","TronWeb","ethers","overrides","txId","output","sleep"],"mappings":"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","file":"index.cjs","sourcesContent":["// Base unit in milliseconds\nconst MILLISECOND = 1\nconst SECOND = 1000 * MILLISECOND\nconst MINUTE = 60 * SECOND\nconst HOUR = 60 * MINUTE\nconst DAY = 24 * HOUR\n\n/**\n * Object representing various time units and the current time.\n */\nexport const Time = {\n /**\n * Millisecond unit.\n */\n MILLISECOND,\n\n /**\n * Second unit.\n */\n SECOND,\n\n /**\n * Minute unit.\n */\n MINUTE,\n\n /**\n * Hour unit.\n */\n HOUR,\n\n /**\n * Day unit.\n */\n DAY,\n\n /**\n * Gets the current time in milliseconds since the Unix epoch.\n * @returns {number} The current time in milliseconds.\n */\n get NOW() {\n return Date.now()\n },\n} as const\n","/**\n * Interface representing a provider conversion strategy.\n */\nexport interface ProviderConversionStrategy {\n /**\n * Converts a URL to its REST endpoint equivalent.\n *\n * @param {string} url - The URL to convert.\n * @returns {string} The converted REST endpoint URL.\n */\n asREST(url: string): string\n\n /**\n * Converts a URL to its JSON-RPC endpoint equivalent.\n *\n * @param {string} url - The URL to convert.\n * @returns {string} The converted JSON-RPC endpoint URL.\n */\n asJSONRPC(url: string): string\n}\n\n/**\n * Class representing the default provider conversion strategy.\n */\nclass DefaultProviderConversionStrategy implements ProviderConversionStrategy {\n /**\n * Converts a URL to its REST endpoint equivalent.\n *\n * @param {string} url - The URL to convert.\n * @returns {string} The converted REST endpoint URL.\n */\n asREST(url: string): string {\n return url.replace(/\\/jsonrpc$/, '')\n }\n\n /**\n * Converts a URL to its JSON-RPC endpoint equivalent.\n *\n * @param {string} url - The URL to convert.\n * @returns {string} The converted JSON-RPC endpoint URL.\n */\n asJSONRPC(url: string): string {\n return url.trim().replace(/\\/?$/, '/jsonrpc')\n }\n}\n\n/**\n * Class representing the Ankr provider conversion strategy.\n */\nclass AnkrProviderConversionStrategy implements ProviderConversionStrategy {\n /**\n * Converts a URL to its REST endpoint equivalent.\n *\n * @param {string} url - The URL to convert.\n * @returns {string} The converted REST endpoint URL.\n */\n asREST(url: string): string {\n if (/tron\\/[0-9a-fA-F]{10,}/.test(url)) {\n return url.replace(/\\/tron_jsonrpc$/, '/premium-http/tron')\n }\n\n return url.replace(/\\/tron_jsonrpc$/, '/http/tron')\n }\n\n /**\n * Converts a URL to its JSON-RPC endpoint equivalent.\n *\n * @param {string} url - The URL to convert.\n * @returns {string} The converted JSON-RPC endpoint URL.\n */\n asJSONRPC(url: string): string {\n return url.trim().replace(/\\/(premium-http|http)\\/tron/, '/tron_jsonrpc')\n }\n}\n\n/**\n * Class representing the Quiknode provider conversion strategy.\n */\nclass QuiknodeProviderConversionStrategy implements ProviderConversionStrategy {\n /**\n * Converts a URL to its REST endpoint equivalent.\n *\n * @param {string} url - The URL to convert.\n * @returns {string} The converted REST endpoint URL.\n */\n asREST(url: string): string {\n return url.replace(/\\/jsonrpc$/, '')\n }\n\n /**\n * Converts a URL to its JSON-RPC endpoint equivalent.\n *\n * @param {string} url - The URL to convert.\n * @returns {string} The converted JSON-RPC endpoint URL.\n */\n asJSONRPC(url: string): string {\n return url.trim().replace(/\\/?$/, '/jsonrpc')\n }\n}\n\n/**\n * Class representing a factory for creating provider conversion strategies.\n */\nexport class StrategyFactory {\n /**\n * A map of URL patterns to provider conversion strategies.\n */\n public static strategies = new Map<RegExp, ProviderConversionStrategy>()\n\n static {\n StrategyFactory.strategies.set(/api.trongrid.io/, new DefaultProviderConversionStrategy())\n StrategyFactory.strategies.set(/ankr.com/, new AnkrProviderConversionStrategy())\n StrategyFactory.strategies.set(/quiknode.pro/, new QuiknodeProviderConversionStrategy())\n }\n\n /**\n * Gets the appropriate provider conversion strategy for a given URL.\n *\n * @param {string} url - The URL to get the conversion strategy for.\n * @returns {ProviderConversionStrategy} The provider conversion strategy.\n */\n static get(url: string): ProviderConversionStrategy {\n for (const [pattern, strategy] of this.strategies) {\n if (pattern.test(url)) {\n return strategy\n }\n }\n return new DefaultProviderConversionStrategy()\n }\n}\n","import { ethers } from 'ethers'\nimport TronWeb from 'tronweb'\n\nimport { getLogger, sleep } from '@layerzerolabs/lz-utilities'\n\nimport { Time } from './time'\nimport { StrategyFactory } from './url'\n\nimport type {\n BlockTransaction,\n ChainParameter,\n ContractExecutionParams,\n ContractInfo,\n Transaction,\n TransactionInfo,\n TransactionResult,\n} from 'tronweb'\n\n/**\n * Enum representing the types of transactions that can be performed on the Tron network.\n */\nexport enum TronTransactionType {\n TRIGGER_SMART_CONTRACT = 'TriggerSmartContract',\n}\n\n/**\n * Interface representing the overrides for a transaction.\n */\nexport interface TransactionOverrides {\n /**\n * The gas limit for the transaction.\n */\n gasLimit?: number\n\n /**\n * The gas price for the transaction.\n */\n gasPrice?: number\n\n /**\n * The energy factor for the transaction.\n */\n energyFactor?: number\n\n /**\n * The value to be sent with the transaction.\n */\n value?: number\n}\n\n/**\n * Interface representing a partial Tron transaction.\n */\nexport interface PartialTronTransaction {\n /**\n * Indicates whether the transaction is visible.\n */\n visible: boolean\n\n /**\n * The transaction ID.\n */\n txID: string\n\n /**\n * The raw data in hexadecimal format.\n */\n raw_data_hex: string\n\n /**\n * The raw data of the transaction.\n * @see {@link PartialTronTransactionContract}\n */\n raw_data: {\n contract: [PartialTronTransactionContract]\n }\n}\n\n/**\n * Interface representing a full Tron transaction.\n */\nexport interface TronTransaction extends PartialTronTransaction {\n /**\n * The raw data of the transaction.\n */\n raw_data: {\n /**\n * The contract details of the transaction.\n * @see {@link FullTronTransactionContract}\n */\n contract: [FullTronTransactionContract]\n\n /**\n * The reference block bytes.\n */\n ref_block_bytes: string\n\n /**\n * The reference block hash.\n */\n ref_block_hash: string\n\n /**\n * The expiration time of the transaction.\n */\n expiration: number\n\n /**\n * The fee limit for the transaction.\n */\n fee_limit: number\n\n /**\n * The timestamp of the transaction.\n */\n timestamp: number\n }\n}\n\n/**\n * Interface representing a signed Tron transaction.\n */\nexport interface SignedTronTransaction extends TronTransaction {\n /**\n * The signatures of the transaction.\n */\n signature: string[]\n}\n\n/**\n * Interface representing the parameter value of a partial Tron transaction.\n */\ninterface PartialTronTransactionParameterValue {\n /**\n * The data of the transaction.\n */\n data: string\n\n /**\n * The contract address.\n */\n contract_address: string\n\n /**\n * The owner address.\n */\n owner_address: string\n}\n\n/**\n * Interface representing the parameter value of a full Tron transaction.\n */\ninterface TronTransactionParameterValue extends PartialTronTransactionParameterValue {\n /**\n * The token ID.\n */\n token_id?: number\n\n /**\n * The call token value.\n */\n call_token_value?: number\n\n /**\n * The call value.\n */\n call_value?: number\n}\n\n/**\n * Interface representing the parameter of a Tron transaction.\n * @template T - The type of the parameter value.\n */\ninterface TronTransactionParameter<T> {\n /**\n * The value of the parameter.\n */\n value: T\n\n /**\n * The type URL of the parameter.\n */\n type_url: `type.googleapis.com/protocol.${TronTransactionType}`\n}\n\n/**\n * Interface representing a Tron transaction contract.\n * @template T - The type of the parameter value.\n */\ninterface TronTransactionContract<T> {\n /**\n * The parameter of the transaction contract.\n */\n parameter: TronTransactionParameter<T>\n\n /**\n * The type of the transaction contract.\n */\n type: TronTransactionType\n\n /**\n * The permission ID for the transaction contract.\n */\n Permission_id?: number\n}\n\n/**\n * Type representing a partial Tron transaction contract.\n */\ntype PartialTronTransactionContract = TronTransactionContract<PartialTronTransactionParameterValue>\n\n/**\n * Type representing a full Tron transaction contract.\n */\ntype FullTronTransactionContract = TronTransactionContract<TronTransactionParameterValue>\n\n/**\n * Interface representing the raw data of a Tron block header.\n */\ninterface TronBlockHeaderRawData {\n /**\n * The block number.\n */\n number: number\n\n /**\n * The transaction trie root.\n */\n txTrieRoot: string\n\n /**\n * The witness address.\n */\n witness_address: string\n\n /**\n * The parent hash.\n */\n parentHash: string\n\n /**\n * The timestamp of the block.\n */\n timestamp: number\n}\n\n/**\n * Interface representing a Tron block header.\n */\ninterface TronBlockHeader {\n /**\n * The raw data of the block header.\n */\n raw_data: TronBlockHeaderRawData\n\n /**\n * The witness signature.\n */\n witness_signature: string\n}\n\n/**\n * Interface representing Tron block data.\n */\nexport interface TronBlockData {\n /**\n * The block ID.\n */\n blockID: string\n\n /**\n * The block header.\n */\n block_header: TronBlockHeader\n}\n\n/**\n * Interface representing a TronWeb error response (type 1).\n */\ninterface TronWebError1 {\n /**\n * The error code.\n */\n code: string\n\n /**\n * The error message.\n */\n message: string\n\n /**\n * The transaction ID.\n */\n txid: string\n}\n\n/**\n * Interface representing a TronWeb error response (type 2).\n */\ninterface TronWebError2 {\n /**\n * The error message.\n */\n Error: string\n}\n\n/**\n * Type representing a TronWeb error response.\n */\ntype TronWebErrorResponse = TronWebError1 | TronWebError2\n\nexport {\n TronWeb,\n BlockTransaction,\n ContractExecutionParams,\n ChainParameter,\n Transaction,\n TronWebError1,\n TronWebError2,\n TronWebErrorResponse,\n}\n\nconst logger = getLogger()\n\n/**\n * Type representing provider settings.\n * It can be either a string representing the URL or an object containing the URL and an optional API key.\n */\nexport type ProviderSetting =\n | {\n /**\n * The URL of the provider.\n */\n url: string\n\n /**\n * The API key for the provider (optional).\n */\n apiKey?: string\n }\n | string\n\n/**\n * Creates a TronWeb instance.\n *\n * @param {{ rpcSetting: ProviderSetting; privateKey: string } | TronWeb} signer - The signer object containing rpcSetting and privateKey, or an existing TronWeb instance.\n * @returns {TronWeb} The created TronWeb instance.\n */\nexport function createTronWeb(signer: { rpcSetting: ProviderSetting; privateKey: string } | TronWeb): TronWeb {\n if (!(signer instanceof TronWeb)) {\n const fullHostUrl = typeof signer.rpcSetting === 'string' ? signer.rpcSetting : signer.rpcSetting.url\n const client = new TronWeb({\n fullHost: StrategyFactory.get(fullHostUrl).asREST(fullHostUrl),\n headers: {\n 'TRON-PRO-API-KEY': typeof signer.rpcSetting === 'string' ? '' : signer.rpcSetting.apiKey ?? '',\n },\n privateKey: signer.privateKey.replace(/^0x/, ''),\n })\n return client\n }\n return signer\n}\n\n/**\n * Signs and sends a Tron transaction.\n *\n * @param {object} txn - The transaction object containing data, to, and transaction overrides.\n * @param {object} signer - The signer object containing rpcSetting and privateKey, or an existing TronWeb instance.\n * @param {number} [permissionId] - The permission ID for multi-sig.\n * @returns {Promise<object>} A promise that resolves to an object containing txId, result, and wait function.\n */\nexport async function signAndSendTronTransaction(\n txn: {\n data: string\n to: string\n } & TransactionOverrides,\n signer: { rpcSetting: ProviderSetting; privateKey: string } | TronWeb,\n permissionId?: number // for multi-sig\n): Promise<{ txId: string; result: TransactionResult; wait: () => Promise<TransactionInfo> }> {\n const signedTxn = await signTronTx(txn, signer, permissionId)\n const client = createTronWeb(signer)\n return sendTronTransaction(signedTxn, client)\n}\n\n/**\n * Sends a signed Tron transaction.\n *\n * @param {SignedTronTransaction} signedTxn - The signed Tron transaction.\n * @param {TronWeb} client - The TronWeb client.\n * @returns {Promise<object>} A promise that resolves to an object containing txId, result, and wait function.\n * @throws {Error} If the transaction broadcast fails.\n */\nexport async function sendTronTransaction(\n singedTxn: SignedTronTransaction,\n client: TronWeb\n): Promise<{ txId: string; result: TransactionResult; wait: () => Promise<TransactionInfo> }> {\n // reference: https://developers.tron.network/reference/json-rpc-api-overview\n // JSON-RPC interface is not fully supported by the TRON network.\n // Furthermore, The JSON-RPC service needs to be enabled and set the port in the node configuration\n // file. If not configured, the service is disable by default.\n // broadcast signedTransaction\n const broadcastResponse = await client.trx.sendRawTransaction(singedTxn)\n if (broadcastResponse.code !== undefined) {\n const err = {\n error: broadcastResponse.code,\n message: TronWeb.toUtf8(broadcastResponse.message ?? ''),\n }\n throw new Error(JSON.stringify(err, null, 2))\n }\n\n return {\n txId: singedTxn.txID,\n result: broadcastResponse,\n wait: async (): Promise<TransactionInfo> => {\n return checkResult(client, singedTxn.txID)\n },\n }\n}\n\n/**\n * Signs a Tron transaction.\n *\n * @param {object} txn - The transaction object containing data, to, and transaction overrides.\n * @param {object} signer - The signer object containing rpcSetting and privateKey, or an existing TronWeb instance.\n * @param {number} [permissionId] - The permission ID for multi-sig.\n * @returns {Promise<SignedTronTransaction>} A promise that resolves to the signed Tron transaction.\n * @throws {Error} If the private key is invalid.\n */\nexport async function signTronTx(\n txn: {\n data: string\n to: string\n } & TransactionOverrides,\n _signer: { rpcSetting: ProviderSetting; privateKey: string } | TronWeb,\n permissionId?: number // for multi-sig\n): Promise<SignedTronTransaction> {\n const signer: TronWeb = createTronWeb(_signer)\n\n // privateKey = privateKey.replace(/^0x/, '') // remove the 0x prefix\n // private key to address\n // const from = TronWeb.address.fromPrivateKey(privateKey)\n if (typeof signer.defaultAddress.hex !== 'string') {\n throw new Error(`signer.defaultAddress.hex is not a valid hex string`)\n }\n\n const partialTxn: PartialTronTransaction = {\n visible: false,\n txID: '',\n raw_data_hex: '',\n raw_data: {\n contract: [\n {\n parameter: {\n value: {\n data: txn.data.replace(/^0x/, ''),\n contract_address: TronWeb.address.toHex(txn.to),\n owner_address: signer.defaultAddress.hex,\n },\n type_url: `type.googleapis.com/protocol.${TronTransactionType.TRIGGER_SMART_CONTRACT}`,\n },\n type: TronTransactionType.TRIGGER_SMART_CONTRACT,\n Permission_id: permissionId,\n },\n ],\n },\n }\n\n const fullTxn = await fullFillTxn(signer, partialTxn, {\n gasLimit: txn.gasLimit,\n gasPrice: txn.gasPrice,\n energyFactor: txn.energyFactor,\n value: txn.value,\n })\n\n // sign transaction\n const signedTransaction = await signer.trx.sign(fullTxn)\n if (signedTransaction.signature === undefined) {\n throw new Error('Invalid private key provided')\n }\n return signedTransaction as SignedTronTransaction\n}\n\nlet gasPriceCache: { time: number; value: string } = { time: 0, value: '' }\nconst energyFactorsCache = new Map<string, { time: number; value: number }>()\n\n/**\n * Fills in the missing fields of a Tron transaction.\n *\n * @param {TronWeb} signer - The TronWeb client.\n * @param {PartialTronTransaction} txn - The partial Tron transaction.\n * @param {TransactionOverrides} [overrides={}] - The transaction overrides.\n * @returns {Promise<TronTransaction>} A promise that resolves to the full Tron transaction.\n */\nexport async function fullFillTxn(\n signer: TronWeb,\n txn: PartialTronTransaction,\n overrides: TransactionOverrides = {}\n): Promise<TronTransaction> {\n const apiKey = signer.fullNode.headers['TRON-PRO-API-KEY']\n const etherProvider = new ethers.providers.StaticJsonRpcProvider({\n url: StrategyFactory.get(signer.fullNode.host).asJSONRPC(signer.fullNode.host),\n headers: {\n ...(typeof apiKey !== 'undefined' ? { 'TRON-PRO-API-KEY': apiKey } : {}),\n },\n })\n\n /**\n * Gets the current gas price.\n * cache the gasPrice with a 15sec TTL\n *\n * @returns {Promise<string>} A promise that resolves to the current gas price as a string.\n */\n async function getGasPrice(): Promise<string> {\n const { time, value } = gasPriceCache\n if (time > Time.NOW - 15 * Time.SECOND && value != '') return value\n const newGaspPrice = await etherProvider.getGasPrice().then((x) => x.toString())\n gasPriceCache = { time: Time.NOW, value: newGaspPrice }\n return newGaspPrice\n }\n\n /**\n * Estimates the gas limit for a given transaction.\n *\n * @param {PartialTronTransaction} raw - The partial Tron transaction.\n * @returns {Promise<number>} A promise that resolves to the estimated gas limit.\n */\n async function getGasLimit(raw: PartialTronTransaction): Promise<number> {\n const gasLimit = await etherProvider.estimateGas({\n to: raw.raw_data.contract[0].parameter.value.contract_address.replace(/^41/, '0x'), // need to slice off the \"41\" prefix that Tron appends to addresses\n data: '0x' + raw.raw_data.contract[0].parameter.value.data,\n from: raw.raw_data.contract[0].parameter.value.owner_address.replace(/^41/, '0x'),\n value: overrides.value ?? 0,\n })\n return gasLimit.toNumber()\n }\n\n /**\n * Gets the energy factor for a given transaction.\n * Caches the energy factor with a 10-minute TTL. Energy factors should be updated by Tron every 6 hours.\n *\n * @param {PartialTronTransaction} raw - The partial Tron transaction.\n * @returns {Promise<number>} A promise that resolves to the energy factor.\n */\n async function getEnergyFactor(raw: PartialTronTransaction): Promise<number> {\n /* eslint-disable @typescript-eslint/no-unsafe-assignment */\n const addr = raw.raw_data.contract[0].parameter.value.contract_address\n const cached = energyFactorsCache.get(addr)\n if (cached && cached.time > Time.NOW - 10 * Time.MINUTE) return cached.value\n const MAX_ENERGY_FACTOR = 1.2\n // refers: https://developers.tron.network/reference/getcontractinfo\n const response = await signer.fullNode.request(\n 'wallet/getcontractinfo',\n { value: addr, visible: false },\n 'post'\n )\n const contractInfo: ContractInfo = response as ContractInfo\n const energy_factor = contractInfo.contract_state.energy_factor ?? MAX_ENERGY_FACTOR\n energyFactorsCache.set(addr, { time: Time.NOW, value: energy_factor })\n return energy_factor\n /* eslint-enable @typescript-eslint/no-unsafe-assignment */\n }\n\n /**\n * Calculates the fee limit for a given transaction.\n *\n * @param {PartialTronTransaction} raw - The partial Tron transaction.\n * @param {TransactionOverrides} [overrides={}] - The transaction overrides.\n * @returns {Promise<number>} A promise that resolves to the calculated fee limit.\n */\n async function getFeeLimit(raw: PartialTronTransaction, overrides: TransactionOverrides = {}): Promise<number> {\n // https://developers.tron.network/docs/set-feelimit#how-to-determine-the-feelimit-parameter\n // https://developers.tron.network/reference/getcontractinfo, get energy_factor\n // https://developers.tron.network/docs/resource-model#dynamic-energy-model, max factor\n // Tight FeeLimit of contract transaction = estimated basic energy consumption * (1 + energy_factor) * EnergyPrice\n // Loose FeeLimit of contract transaction = estimated basic energy consumption * (1 + max_energy_factor) * EnergyPrice\n const MAX_FEE_LIMIT = 15000000000\n const energy_factor = overrides.energyFactor ?? (await getEnergyFactor(raw))\n const gasLimit = overrides.gasLimit ?? (await getGasLimit(raw))\n const energyPrice = overrides.gasPrice ?? Number(await getGasPrice())\n const factor = 1 + energy_factor\n const feeLimit = gasLimit * factor * energyPrice\n const feeLimit_adjusted = Math.ceil(feeLimit) * 1.2 // based on reading other parts of the code, we add a 20% cushion on fee limits\n return Math.floor(Math.min(feeLimit_adjusted, MAX_FEE_LIMIT))\n }\n\n const metadata = (await signer.fullNode.request('wallet/getblock', { detail: false }, 'post')) as TronBlockData\n const ref_block_bytes = metadata.block_header.raw_data.number.toString(16).slice(-4).padStart(4, '0')\n const ref_block_hash = metadata.blockID.slice(16, 32)\n const expiration = metadata.block_header.raw_data.timestamp + 60 * 1000\n const { timestamp } = metadata.block_header.raw_data\n\n const tx: TronTransaction = {\n ...txn,\n raw_data: {\n contract: [\n {\n parameter: {\n value: {\n ...txn.raw_data.contract[0].parameter.value,\n call_value: overrides.value ?? 0,\n },\n type_url: txn.raw_data.contract[0].parameter.type_url,\n },\n type: txn.raw_data.contract[0].type,\n },\n ],\n ref_block_bytes,\n ref_block_hash,\n expiration,\n fee_limit: await getFeeLimit(txn, overrides),\n timestamp,\n },\n }\n const pb = signer.utils.transaction.txJsonToPb(tx)\n tx.txID = signer.utils.transaction.txPbToTxID(pb).replace(/^0x/, '')\n tx.raw_data_hex = signer.utils.transaction.txPbToRawDataHex(pb).toLowerCase()\n\n return tx\n}\n\n/**\n * Checks the result of a Tron transaction.\n *\n * @param {TronWeb} tronWeb - The TronWeb client.\n * @param {string} txId - The transaction ID.\n * @returns {Promise<TransactionInfo>} A promise that resolves to the transaction info.\n * @throws {Error} If the transaction fails or times out.\n */\nexport async function checkResult(tronWeb: TronWeb, txId: string): Promise<TransactionInfo> {\n const startTime = Date.now()\n const waitTimeout = 1000 * 60 * 5 // 5 minutes\n // TODO: get the block producer interval from the chain and sleep for that time\n const wait = async function (txId: string): Promise<TransactionInfo> {\n let tries = 0\n while (tries++ < 20) {\n const output = await tronWeb.trx.getTransactionInfo(txId)\n if (Object.keys(output).length > 0) {\n return output\n }\n\n // check if timeout\n if (Date.now() - startTime > waitTimeout) {\n throw new Error('Timeout waiting for transaction to be processed')\n }\n // wait 1 seconds for next check, mainnet block producer interval is 3 seconds,\n // but we need a small interval for the local network to speed up the test\n await sleep(1200)\n }\n throw new Error(`Failed to get transactionInfo for txId: ${txId}`)\n }\n\n const output = await wait(txId)\n\n if (output.result !== undefined && output.result === 'FAILED') {\n throw new Error(TronWeb.toUtf8(output.resMessage ?? ''))\n }\n\n if (!Object.prototype.hasOwnProperty.call(output, 'contractResult')) {\n throw new Error('Failed to execute: ' + JSON.stringify(output, null, 2))\n }\n\n return output\n}\n"]}