@layerzerolabs/tron-utilities 2.2.5 → 2.3.1

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,32 @@
1
1
  # @layerzerolabs/tron-utilities
2
2
 
3
+ ## 2.3.1
4
+
5
+ ### Patch Changes
6
+
7
+ - c467a80: update RUST_TOOL version and catch errors when checking if chain is ready
8
+ - Updated dependencies [c467a80]
9
+ - @layerzerolabs/lz-utilities@2.3.1
10
+
11
+ ## 2.3.0
12
+
13
+ ### Minor Changes
14
+
15
+ - 211e282: add solana to belowzero & build solana snapshot image
16
+
17
+ ### Patch Changes
18
+
19
+ - Updated dependencies [211e282]
20
+ - @layerzerolabs/lz-utilities@2.3.0
21
+
22
+ ## 2.2.6
23
+
24
+ ### Patch Changes
25
+
26
+ - 8ecd2dc: endpoints
27
+ - Updated dependencies [8ecd2dc]
28
+ - @layerzerolabs/lz-utilities@2.2.6
29
+
3
30
  ## 2.2.5
4
31
 
5
32
  ### Patch Changes
package/dist/index.cjs CHANGED
@@ -28,6 +28,10 @@ var Time = {
28
28
  };
29
29
 
30
30
  // src/tron.ts
31
+ var TronTransactionType = /* @__PURE__ */ ((TronTransactionType2) => {
32
+ TronTransactionType2["TRIGGER_SMART_CONTRACT"] = "TriggerSmartContract";
33
+ return TronTransactionType2;
34
+ })(TronTransactionType || {});
31
35
  var logger = lzUtilities.getLogger();
32
36
  function createTronWeb(signer) {
33
37
  if (!(signer instanceof TronWeb__default.default)) {
@@ -43,7 +47,7 @@ function createTronWeb(signer) {
43
47
  return signer;
44
48
  }
45
49
  async function tronBoxDeploy(workspace, network, tags, executor) {
46
- if (!executor)
50
+ if (executor === void 0)
47
51
  executor = lzUtilities.getProjectPackageManager(workspace);
48
52
  for (const tag of tags) {
49
53
  const cmd = `${executor} pnpify tronbox migrate --network ${network} --f ${tag} --to ${tag}`;
@@ -69,13 +73,11 @@ async function signAndSendTronTransaction(txn, signer, permissionId) {
69
73
  }
70
74
  async function sendTronTransaction(singedTxn, client) {
71
75
  const broadcastResponse = await client.trx.sendRawTransaction(singedTxn);
72
- if (broadcastResponse.code) {
76
+ if (broadcastResponse.code !== void 0) {
73
77
  const err = {
74
78
  error: broadcastResponse.code,
75
- message: broadcastResponse.code
79
+ message: TronWeb__default.default.toUtf8(broadcastResponse.message ?? "")
76
80
  };
77
- if (broadcastResponse.message)
78
- err.message = client.toUtf8(broadcastResponse.message);
79
81
  throw new Error(JSON.stringify(err, null, 2));
80
82
  }
81
83
  return {
@@ -88,6 +90,9 @@ async function sendTronTransaction(singedTxn, client) {
88
90
  }
89
91
  async function signTronTx(txn, _signer, permissionId) {
90
92
  const signer = createTronWeb(_signer);
93
+ if (typeof signer.defaultAddress.hex !== "string") {
94
+ throw new Error(`signer.defaultAddress.hex is not a valid hex string`);
95
+ }
91
96
  const partialTxn = {
92
97
  visible: false,
93
98
  txID: "",
@@ -116,7 +121,7 @@ async function signTronTx(txn, _signer, permissionId) {
116
121
  value: txn.value
117
122
  });
118
123
  const signedTransaction = await signer.trx.sign(fullTxn);
119
- if (!signedTransaction.signature) {
124
+ if (signedTransaction.signature === void 0) {
120
125
  throw new Error("Invalid private key provided");
121
126
  }
122
127
  return signedTransaction;
@@ -124,9 +129,12 @@ async function signTronTx(txn, _signer, permissionId) {
124
129
  var gasPriceCache = { time: 0, value: "" };
125
130
  var energyFactorsCache = /* @__PURE__ */ new Map();
126
131
  async function fullFillTxn(signer, txn, overrides = {}) {
132
+ const apiKey = signer.fullNode.headers["TRON-PRO-API-KEY"];
127
133
  const etherProvider = new ethers.ethers.providers.StaticJsonRpcProvider({
128
134
  url: `${signer.fullNode.host}/jsonrpc`,
129
- headers: { "TRON-PRO-API-KEY": signer.fullNode.headers["TRON-PRO-API-KEY"] }
135
+ headers: {
136
+ ...apiKey !== void 0 ? { "TRON-PRO-API-KEY": apiKey } : {}
137
+ }
130
138
  });
131
139
  async function getGasPrice() {
132
140
  const { time, value } = gasPriceCache;
@@ -152,15 +160,20 @@ async function fullFillTxn(signer, txn, overrides = {}) {
152
160
  if (cached && cached.time > Time.NOW - 10 * Time.MINUTE)
153
161
  return cached.value;
154
162
  const MAX_ENERGY_FACTOR = 1.2;
155
- const res = await signer.fullNode.request("wallet/getcontractinfo", { value: addr, visible: false }, "post");
156
- const energy_factor = res?.contract_state?.energy_factor ?? MAX_ENERGY_FACTOR;
163
+ const response = await signer.fullNode.request(
164
+ "wallet/getcontractinfo",
165
+ { value: addr, visible: false },
166
+ "post"
167
+ );
168
+ const contractInfo = response;
169
+ const energy_factor = contractInfo.contract_state.energy_factor ?? MAX_ENERGY_FACTOR;
157
170
  energyFactorsCache.set(addr, { time: Time.NOW, value: energy_factor });
158
171
  return energy_factor;
159
172
  }
160
173
  async function getFeeLimit(raw, overrides2 = {}) {
161
174
  const MAX_FEE_LIMIT = 15e9;
162
175
  const energy_factor = overrides2.energyFactor ?? await getEnergyFactor(raw);
163
- const gasLimit = overrides2?.gasLimit ?? await getGasLimit(raw);
176
+ const gasLimit = overrides2.gasLimit ?? await getGasLimit(raw);
164
177
  const energyPrice = overrides2.gasPrice ?? Number(await getGasPrice());
165
178
  const factor = 1 + energy_factor;
166
179
  const feeLimit = gasLimit * factor * energyPrice;
@@ -171,7 +184,7 @@ async function fullFillTxn(signer, txn, overrides = {}) {
171
184
  const ref_block_bytes = metadata.block_header.raw_data.number.toString(16).slice(-4).padStart(4, "0");
172
185
  const ref_block_hash = metadata.blockID.slice(16, 32);
173
186
  const expiration = metadata.block_header.raw_data.timestamp + 60 * 1e3;
174
- const timestamp = metadata.block_header.raw_data.timestamp;
187
+ const { timestamp } = metadata.block_header.raw_data;
175
188
  const tx = {
176
189
  ...txn,
177
190
  raw_data: {
@@ -200,49 +213,40 @@ async function fullFillTxn(signer, txn, overrides = {}) {
200
213
  return tx;
201
214
  }
202
215
  async function checkResult(tronWeb, txId) {
203
- let output = {};
204
216
  const startTime = Date.now();
205
217
  const waitTimeout = 1e3 * 60 * 5;
206
- while (!Object.keys(output).length) {
207
- output = await tronWeb.trx.getTransactionInfo(txId);
208
- if (!Object.keys(output).length) {
218
+ const wait = async function(txId2) {
219
+ let tries = 0;
220
+ while (tries++ < 20) {
221
+ const output2 = await tronWeb.trx.getTransactionInfo(txId2);
222
+ if (Object.keys(output2).length > 0) {
223
+ return output2;
224
+ }
209
225
  if (Date.now() - startTime > waitTimeout) {
210
226
  throw new Error("Timeout waiting for transaction to be processed");
211
227
  }
212
228
  await lzUtilities.sleep(1200);
213
229
  }
214
- }
230
+ throw new Error(`Failed to get transactionInfo for txId: ${txId2}`);
231
+ };
232
+ const output = await wait(txId);
215
233
  if (process.env.CI === "true") {
216
234
  console.trace("checkResult txId", txId);
217
235
  console.log("checkResult output", Object.keys(output), output);
218
236
  }
219
- if (output.result && output.result === "FAILED") {
220
- throw new Error(tronWeb.toUtf8(output.resMessage));
237
+ if (output.result !== void 0 && output.result === "FAILED") {
238
+ throw new Error(TronWeb__default.default.toUtf8(output.resMessage ?? ""));
221
239
  }
222
240
  if (!Object.prototype.hasOwnProperty.call(output, "contractResult")) {
223
241
  throw new Error("Failed to execute: " + JSON.stringify(output, null, 2));
224
242
  }
225
- if (output.log) {
226
- output.logs = output.log;
227
- for (const log of output.logs) {
228
- log.topics = log.topics.map((t) => {
229
- if (t.startsWith("0x"))
230
- return t;
231
- return "0x" + t;
232
- });
233
- if (log.data)
234
- log.data = log.data.startsWith("0x") ? log.data : "0x" + log.data;
235
- }
236
- }
237
243
  return output;
238
244
  }
239
245
 
240
- // src/tron-types.ts
241
- var TronTransactionType = /* @__PURE__ */ ((TronTransactionType2) => {
242
- TronTransactionType2["TRIGGER_SMART_CONTRACT"] = "TriggerSmartContract";
243
- return TronTransactionType2;
244
- })(TronTransactionType || {});
245
-
246
+ Object.defineProperty(exports, "TronWeb", {
247
+ enumerable: true,
248
+ get: function () { return TronWeb__default.default; }
249
+ });
246
250
  exports.TronTransactionType = TronTransactionType;
247
251
  exports.checkResult = checkResult;
248
252
  exports.createTronWeb = createTronWeb;
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/tron.ts","../src/time.ts","../src/tron-types.ts"],"names":["overrides","TronTransactionType"],"mappings":"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","sourcesContent":["import { ethers } from 'ethers'\n// @ts-ignore\nimport TronWeb from 'tronweb'\n\nimport { CmdExecutor, getLogger, getProjectPackageManager, sleep } from '@layerzerolabs/lz-utilities'\n\nimport { Time } from './time'\n\nimport {\n PartialTronTransaction,\n SignedTronTransaction,\n TransactionOverrides,\n TronBlockData,\n TronTransaction,\n TronTransactionType,\n} from './index'\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 client = new TronWeb({\n fullHost: typeof signer.rpcSetting === 'string' ? signer.rpcSetting : signer.rpcSetting.url,\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 tronBoxDeploy(\n workspace: string,\n network: string,\n tags: string[],\n executor?: 'yarn' | 'npm' | 'pnpm'\n): Promise<void> {\n // const tagsStr = tags.join(',')\n if (!executor) executor = getProjectPackageManager(workspace)\n // get the package manager from the workspace\n\n for (const tag of tags) {\n const cmd = `${executor} pnpify tronbox migrate --network ${network} --f ${tag} --to ${tag}`\n // NODE: promisify exec may not work here when invoked from testify\n try {\n const cmdExecutor = new CmdExecutor()\n await cmdExecutor.executeCmd(\n cmd,\n [],\n { shell: true, cwd: workspace, env: process.env },\n true,\n undefined,\n logger\n )\n } catch (e) {\n console.log(e)\n }\n }\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: any; wait: () => Promise<any> }> {\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: any; wait: () => Promise<any> }> {\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) {\n const err = {\n error: broadcastResponse.code,\n message: broadcastResponse.code,\n }\n if (broadcastResponse.message) err.message = client.toUtf8(broadcastResponse.message)\n throw new Error(JSON.stringify(err, null, 2))\n }\n\n return {\n txId: singedTxn.txID,\n result: broadcastResponse,\n wait: async (): Promise<any> => {\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 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) {\n throw new Error('Invalid private key provided')\n }\n\n return signedTransaction\n}\n\nlet gasPriceCache: { time: number; value: string } = { time: 0, value: '' }\nconst energyFactorsCache: Map<string, { time: number; value: number }> = new Map()\n\nexport async function fullFillTxn(\n signer: TronWeb,\n txn: PartialTronTransaction,\n overrides: TransactionOverrides = {}\n): Promise<TronTransaction> {\n const etherProvider = new ethers.providers.StaticJsonRpcProvider({\n url: `${signer.fullNode.host}/jsonrpc`,\n headers: { 'TRON-PRO-API-KEY': signer.fullNode.headers['TRON-PRO-API-KEY'] },\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 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 const res = await signer.fullNode.request('wallet/getcontractinfo', { value: addr, visible: false }, 'post')\n const energy_factor = res?.contract_state?.energy_factor ?? MAX_ENERGY_FACTOR\n energyFactorsCache.set(addr, { time: Time.NOW, value: energy_factor })\n return energy_factor\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.timestamp\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<any> {\n let output: any = {}\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 while (!Object.keys(output).length) {\n output = await tronWeb.trx.getTransactionInfo(txId)\n if (!Object.keys(output).length) {\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 }\n if (process.env.CI === 'true') {\n console.trace('checkResult txId', txId)\n console.log('checkResult output', Object.keys(output), output)\n }\n\n if (output.result && 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 // tron provider align the ethers provider result\n if (output.log) {\n output.logs = output.log\n for (const log of output.logs) {\n log.topics = log.topics.map((t: string) => {\n if (t.startsWith('0x')) return t\n return '0x' + t\n })\n if (log.data) log.data = log.data.startsWith('0x') ? log.data : '0x' + log.data\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 enum TronTransactionType {\n TRIGGER_SMART_CONTRACT = 'TriggerSmartContract',\n}\n\nexport type TransactionOverrides = { gasLimit?: number; gasPrice?: number; energyFactor?: number; value?: number }\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"]}
1
+ {"version":3,"sources":["../src/tron.ts","../src/time.ts"],"names":["TronTransactionType","overrides","txId","output"],"mappings":"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","sourcesContent":["import { ethers } from 'ethers'\nimport TronWeb from 'tronweb'\n\nimport { CmdExecutor, getLogger, getProjectPackageManager, sleep } from '@layerzerolabs/lz-utilities'\n\nimport { Time } from './time'\n\nimport type {\n BlockTransaction,\n ChainParameter,\n ContractExecutionParams,\n ContractInfo,\n Transaction,\n TransactionInfo,\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 client = new TronWeb({\n fullHost: typeof signer.rpcSetting === 'string' ? signer.rpcSetting : signer.rpcSetting.url,\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 tronBoxDeploy(\n workspace: string,\n network: string,\n tags: string[],\n executor?: 'yarn' | 'npm' | 'pnpm'\n): Promise<void> {\n // const tagsStr = tags.join(',')\n if (executor === undefined) executor = getProjectPackageManager(workspace)\n // get the package manager from the workspace\n\n for (const tag of tags) {\n const cmd = `${executor} pnpify tronbox migrate --network ${network} --f ${tag} --to ${tag}`\n // NODE: promisify exec may not work here when invoked from testify\n try {\n const cmdExecutor = new CmdExecutor()\n await cmdExecutor.executeCmd(\n cmd,\n [],\n { shell: true, cwd: workspace, env: process.env },\n true,\n undefined,\n logger\n )\n } catch (e) {\n console.log(e)\n }\n }\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: any; wait: () => Promise<any> }> {\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: any; 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: `${signer.fullNode.host}/jsonrpc`,\n headers: {\n ...(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 (process.env.CI === 'true') {\n console.trace('checkResult txId', txId)\n console.log('checkResult output', Object.keys(output), output)\n }\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"]}
package/dist/index.d.mts CHANGED
@@ -1,49 +1,15 @@
1
- import TronWeb from 'tronweb';
2
-
3
- type ProviderSetting = {
4
- url: string;
5
- apiKey?: string;
6
- } | string;
7
- declare function createTronWeb(signer: {
8
- rpcSetting: ProviderSetting;
9
- privateKey: string;
10
- } | TronWeb): TronWeb;
11
- declare function tronBoxDeploy(workspace: string, network: string, tags: string[], executor?: 'yarn' | 'npm' | 'pnpm'): Promise<void>;
12
- declare function signAndSendTronTransaction(txn: {
13
- data: string;
14
- to: string;
15
- } & TransactionOverrides, signer: {
16
- rpcSetting: ProviderSetting;
17
- privateKey: string;
18
- } | TronWeb, permissionId?: number): Promise<{
19
- txId: string;
20
- result: any;
21
- wait: () => Promise<any>;
22
- }>;
23
- declare function sendTronTransaction(singedTxn: SignedTronTransaction, client: TronWeb): Promise<{
24
- txId: string;
25
- result: any;
26
- wait: () => Promise<any>;
27
- }>;
28
- declare function signTronTx(txn: {
29
- data: string;
30
- to: string;
31
- } & TransactionOverrides, _signer: {
32
- rpcSetting: ProviderSetting;
33
- privateKey: string;
34
- } | TronWeb, permissionId?: number): Promise<SignedTronTransaction>;
35
- declare function fullFillTxn(signer: TronWeb, txn: PartialTronTransaction, overrides?: TransactionOverrides): Promise<TronTransaction>;
36
- declare function checkResult(tronWeb: TronWeb, txId: string): Promise<any>;
1
+ import TronWeb, { TransactionInfo } from 'tronweb';
2
+ export { BlockTransaction, ChainParameter, ContractExecutionParams, Transaction, default as TronWeb } from 'tronweb';
37
3
 
38
4
  declare enum TronTransactionType {
39
5
  TRIGGER_SMART_CONTRACT = "TriggerSmartContract"
40
6
  }
41
- type TransactionOverrides = {
7
+ interface TransactionOverrides {
42
8
  gasLimit?: number;
43
9
  gasPrice?: number;
44
10
  energyFactor?: number;
45
11
  value?: number;
46
- };
12
+ }
47
13
  interface PartialTronTransaction {
48
14
  visible: boolean;
49
15
  txID: string;
@@ -101,5 +67,49 @@ interface TronBlockData {
101
67
  blockID: string;
102
68
  block_header: TronBlockHeader;
103
69
  }
70
+ interface TronWebError1 {
71
+ code: string;
72
+ message: string;
73
+ txid: string;
74
+ }
75
+ interface TronWebError2 {
76
+ Error: string;
77
+ }
78
+ type TronWebErrorResponse = TronWebError1 | TronWebError2;
79
+
80
+ type ProviderSetting = {
81
+ url: string;
82
+ apiKey?: string;
83
+ } | string;
84
+ declare function createTronWeb(signer: {
85
+ rpcSetting: ProviderSetting;
86
+ privateKey: string;
87
+ } | TronWeb): TronWeb;
88
+ declare function tronBoxDeploy(workspace: string, network: string, tags: string[], executor?: 'yarn' | 'npm' | 'pnpm'): Promise<void>;
89
+ declare function signAndSendTronTransaction(txn: {
90
+ data: string;
91
+ to: string;
92
+ } & TransactionOverrides, signer: {
93
+ rpcSetting: ProviderSetting;
94
+ privateKey: string;
95
+ } | TronWeb, permissionId?: number): Promise<{
96
+ txId: string;
97
+ result: any;
98
+ wait: () => Promise<any>;
99
+ }>;
100
+ declare function sendTronTransaction(singedTxn: SignedTronTransaction, client: TronWeb): Promise<{
101
+ txId: string;
102
+ result: any;
103
+ wait: () => Promise<TransactionInfo>;
104
+ }>;
105
+ declare function signTronTx(txn: {
106
+ data: string;
107
+ to: string;
108
+ } & TransactionOverrides, _signer: {
109
+ rpcSetting: ProviderSetting;
110
+ privateKey: string;
111
+ } | TronWeb, permissionId?: number): Promise<SignedTronTransaction>;
112
+ declare function fullFillTxn(signer: TronWeb, txn: PartialTronTransaction, overrides?: TransactionOverrides): Promise<TronTransaction>;
113
+ declare function checkResult(tronWeb: TronWeb, txId: string): Promise<TransactionInfo>;
104
114
 
105
- export { type PartialTronTransaction, type ProviderSetting, type SignedTronTransaction, type TransactionOverrides, type TronBlockData, type TronTransaction, TronTransactionType, checkResult, createTronWeb, fullFillTxn, sendTronTransaction, signAndSendTronTransaction, signTronTx, tronBoxDeploy };
115
+ export { type PartialTronTransaction, type ProviderSetting, type SignedTronTransaction, type TransactionOverrides, type TronBlockData, type TronTransaction, TronTransactionType, type TronWebError1, type TronWebError2, type TronWebErrorResponse, checkResult, createTronWeb, fullFillTxn, sendTronTransaction, signAndSendTronTransaction, signTronTx, tronBoxDeploy };
package/dist/index.d.ts CHANGED
@@ -1,49 +1,15 @@
1
- import TronWeb from 'tronweb';
2
-
3
- type ProviderSetting = {
4
- url: string;
5
- apiKey?: string;
6
- } | string;
7
- declare function createTronWeb(signer: {
8
- rpcSetting: ProviderSetting;
9
- privateKey: string;
10
- } | TronWeb): TronWeb;
11
- declare function tronBoxDeploy(workspace: string, network: string, tags: string[], executor?: 'yarn' | 'npm' | 'pnpm'): Promise<void>;
12
- declare function signAndSendTronTransaction(txn: {
13
- data: string;
14
- to: string;
15
- } & TransactionOverrides, signer: {
16
- rpcSetting: ProviderSetting;
17
- privateKey: string;
18
- } | TronWeb, permissionId?: number): Promise<{
19
- txId: string;
20
- result: any;
21
- wait: () => Promise<any>;
22
- }>;
23
- declare function sendTronTransaction(singedTxn: SignedTronTransaction, client: TronWeb): Promise<{
24
- txId: string;
25
- result: any;
26
- wait: () => Promise<any>;
27
- }>;
28
- declare function signTronTx(txn: {
29
- data: string;
30
- to: string;
31
- } & TransactionOverrides, _signer: {
32
- rpcSetting: ProviderSetting;
33
- privateKey: string;
34
- } | TronWeb, permissionId?: number): Promise<SignedTronTransaction>;
35
- declare function fullFillTxn(signer: TronWeb, txn: PartialTronTransaction, overrides?: TransactionOverrides): Promise<TronTransaction>;
36
- declare function checkResult(tronWeb: TronWeb, txId: string): Promise<any>;
1
+ import TronWeb, { TransactionInfo } from 'tronweb';
2
+ export { BlockTransaction, ChainParameter, ContractExecutionParams, Transaction, default as TronWeb } from 'tronweb';
37
3
 
38
4
  declare enum TronTransactionType {
39
5
  TRIGGER_SMART_CONTRACT = "TriggerSmartContract"
40
6
  }
41
- type TransactionOverrides = {
7
+ interface TransactionOverrides {
42
8
  gasLimit?: number;
43
9
  gasPrice?: number;
44
10
  energyFactor?: number;
45
11
  value?: number;
46
- };
12
+ }
47
13
  interface PartialTronTransaction {
48
14
  visible: boolean;
49
15
  txID: string;
@@ -101,5 +67,49 @@ interface TronBlockData {
101
67
  blockID: string;
102
68
  block_header: TronBlockHeader;
103
69
  }
70
+ interface TronWebError1 {
71
+ code: string;
72
+ message: string;
73
+ txid: string;
74
+ }
75
+ interface TronWebError2 {
76
+ Error: string;
77
+ }
78
+ type TronWebErrorResponse = TronWebError1 | TronWebError2;
79
+
80
+ type ProviderSetting = {
81
+ url: string;
82
+ apiKey?: string;
83
+ } | string;
84
+ declare function createTronWeb(signer: {
85
+ rpcSetting: ProviderSetting;
86
+ privateKey: string;
87
+ } | TronWeb): TronWeb;
88
+ declare function tronBoxDeploy(workspace: string, network: string, tags: string[], executor?: 'yarn' | 'npm' | 'pnpm'): Promise<void>;
89
+ declare function signAndSendTronTransaction(txn: {
90
+ data: string;
91
+ to: string;
92
+ } & TransactionOverrides, signer: {
93
+ rpcSetting: ProviderSetting;
94
+ privateKey: string;
95
+ } | TronWeb, permissionId?: number): Promise<{
96
+ txId: string;
97
+ result: any;
98
+ wait: () => Promise<any>;
99
+ }>;
100
+ declare function sendTronTransaction(singedTxn: SignedTronTransaction, client: TronWeb): Promise<{
101
+ txId: string;
102
+ result: any;
103
+ wait: () => Promise<TransactionInfo>;
104
+ }>;
105
+ declare function signTronTx(txn: {
106
+ data: string;
107
+ to: string;
108
+ } & TransactionOverrides, _signer: {
109
+ rpcSetting: ProviderSetting;
110
+ privateKey: string;
111
+ } | TronWeb, permissionId?: number): Promise<SignedTronTransaction>;
112
+ declare function fullFillTxn(signer: TronWeb, txn: PartialTronTransaction, overrides?: TransactionOverrides): Promise<TronTransaction>;
113
+ declare function checkResult(tronWeb: TronWeb, txId: string): Promise<TransactionInfo>;
104
114
 
105
- export { type PartialTronTransaction, type ProviderSetting, type SignedTronTransaction, type TransactionOverrides, type TronBlockData, type TronTransaction, TronTransactionType, checkResult, createTronWeb, fullFillTxn, sendTronTransaction, signAndSendTronTransaction, signTronTx, tronBoxDeploy };
115
+ export { type PartialTronTransaction, type ProviderSetting, type SignedTronTransaction, type TransactionOverrides, type TronBlockData, type TronTransaction, TronTransactionType, type TronWebError1, type TronWebError2, type TronWebErrorResponse, checkResult, createTronWeb, fullFillTxn, sendTronTransaction, signAndSendTronTransaction, signTronTx, tronBoxDeploy };
package/dist/index.mjs CHANGED
@@ -1,5 +1,6 @@
1
1
  import { ethers } from 'ethers';
2
2
  import TronWeb from 'tronweb';
3
+ export { default as TronWeb } from 'tronweb';
3
4
  import { getLogger, getProjectPackageManager, CmdExecutor, sleep } from '@layerzerolabs/lz-utilities';
4
5
 
5
6
  // src/tron.ts
@@ -22,6 +23,10 @@ var Time = {
22
23
  };
23
24
 
24
25
  // src/tron.ts
26
+ var TronTransactionType = /* @__PURE__ */ ((TronTransactionType2) => {
27
+ TronTransactionType2["TRIGGER_SMART_CONTRACT"] = "TriggerSmartContract";
28
+ return TronTransactionType2;
29
+ })(TronTransactionType || {});
25
30
  var logger = getLogger();
26
31
  function createTronWeb(signer) {
27
32
  if (!(signer instanceof TronWeb)) {
@@ -37,7 +42,7 @@ function createTronWeb(signer) {
37
42
  return signer;
38
43
  }
39
44
  async function tronBoxDeploy(workspace, network, tags, executor) {
40
- if (!executor)
45
+ if (executor === void 0)
41
46
  executor = getProjectPackageManager(workspace);
42
47
  for (const tag of tags) {
43
48
  const cmd = `${executor} pnpify tronbox migrate --network ${network} --f ${tag} --to ${tag}`;
@@ -63,13 +68,11 @@ async function signAndSendTronTransaction(txn, signer, permissionId) {
63
68
  }
64
69
  async function sendTronTransaction(singedTxn, client) {
65
70
  const broadcastResponse = await client.trx.sendRawTransaction(singedTxn);
66
- if (broadcastResponse.code) {
71
+ if (broadcastResponse.code !== void 0) {
67
72
  const err = {
68
73
  error: broadcastResponse.code,
69
- message: broadcastResponse.code
74
+ message: TronWeb.toUtf8(broadcastResponse.message ?? "")
70
75
  };
71
- if (broadcastResponse.message)
72
- err.message = client.toUtf8(broadcastResponse.message);
73
76
  throw new Error(JSON.stringify(err, null, 2));
74
77
  }
75
78
  return {
@@ -82,6 +85,9 @@ async function sendTronTransaction(singedTxn, client) {
82
85
  }
83
86
  async function signTronTx(txn, _signer, permissionId) {
84
87
  const signer = createTronWeb(_signer);
88
+ if (typeof signer.defaultAddress.hex !== "string") {
89
+ throw new Error(`signer.defaultAddress.hex is not a valid hex string`);
90
+ }
85
91
  const partialTxn = {
86
92
  visible: false,
87
93
  txID: "",
@@ -110,7 +116,7 @@ async function signTronTx(txn, _signer, permissionId) {
110
116
  value: txn.value
111
117
  });
112
118
  const signedTransaction = await signer.trx.sign(fullTxn);
113
- if (!signedTransaction.signature) {
119
+ if (signedTransaction.signature === void 0) {
114
120
  throw new Error("Invalid private key provided");
115
121
  }
116
122
  return signedTransaction;
@@ -118,9 +124,12 @@ async function signTronTx(txn, _signer, permissionId) {
118
124
  var gasPriceCache = { time: 0, value: "" };
119
125
  var energyFactorsCache = /* @__PURE__ */ new Map();
120
126
  async function fullFillTxn(signer, txn, overrides = {}) {
127
+ const apiKey = signer.fullNode.headers["TRON-PRO-API-KEY"];
121
128
  const etherProvider = new ethers.providers.StaticJsonRpcProvider({
122
129
  url: `${signer.fullNode.host}/jsonrpc`,
123
- headers: { "TRON-PRO-API-KEY": signer.fullNode.headers["TRON-PRO-API-KEY"] }
130
+ headers: {
131
+ ...apiKey !== void 0 ? { "TRON-PRO-API-KEY": apiKey } : {}
132
+ }
124
133
  });
125
134
  async function getGasPrice() {
126
135
  const { time, value } = gasPriceCache;
@@ -146,15 +155,20 @@ async function fullFillTxn(signer, txn, overrides = {}) {
146
155
  if (cached && cached.time > Time.NOW - 10 * Time.MINUTE)
147
156
  return cached.value;
148
157
  const MAX_ENERGY_FACTOR = 1.2;
149
- const res = await signer.fullNode.request("wallet/getcontractinfo", { value: addr, visible: false }, "post");
150
- const energy_factor = res?.contract_state?.energy_factor ?? MAX_ENERGY_FACTOR;
158
+ const response = await signer.fullNode.request(
159
+ "wallet/getcontractinfo",
160
+ { value: addr, visible: false },
161
+ "post"
162
+ );
163
+ const contractInfo = response;
164
+ const energy_factor = contractInfo.contract_state.energy_factor ?? MAX_ENERGY_FACTOR;
151
165
  energyFactorsCache.set(addr, { time: Time.NOW, value: energy_factor });
152
166
  return energy_factor;
153
167
  }
154
168
  async function getFeeLimit(raw, overrides2 = {}) {
155
169
  const MAX_FEE_LIMIT = 15e9;
156
170
  const energy_factor = overrides2.energyFactor ?? await getEnergyFactor(raw);
157
- const gasLimit = overrides2?.gasLimit ?? await getGasLimit(raw);
171
+ const gasLimit = overrides2.gasLimit ?? await getGasLimit(raw);
158
172
  const energyPrice = overrides2.gasPrice ?? Number(await getGasPrice());
159
173
  const factor = 1 + energy_factor;
160
174
  const feeLimit = gasLimit * factor * energyPrice;
@@ -165,7 +179,7 @@ async function fullFillTxn(signer, txn, overrides = {}) {
165
179
  const ref_block_bytes = metadata.block_header.raw_data.number.toString(16).slice(-4).padStart(4, "0");
166
180
  const ref_block_hash = metadata.blockID.slice(16, 32);
167
181
  const expiration = metadata.block_header.raw_data.timestamp + 60 * 1e3;
168
- const timestamp = metadata.block_header.raw_data.timestamp;
182
+ const { timestamp } = metadata.block_header.raw_data;
169
183
  const tx = {
170
184
  ...txn,
171
185
  raw_data: {
@@ -194,49 +208,36 @@ async function fullFillTxn(signer, txn, overrides = {}) {
194
208
  return tx;
195
209
  }
196
210
  async function checkResult(tronWeb, txId) {
197
- let output = {};
198
211
  const startTime = Date.now();
199
212
  const waitTimeout = 1e3 * 60 * 5;
200
- while (!Object.keys(output).length) {
201
- output = await tronWeb.trx.getTransactionInfo(txId);
202
- if (!Object.keys(output).length) {
213
+ const wait = async function(txId2) {
214
+ let tries = 0;
215
+ while (tries++ < 20) {
216
+ const output2 = await tronWeb.trx.getTransactionInfo(txId2);
217
+ if (Object.keys(output2).length > 0) {
218
+ return output2;
219
+ }
203
220
  if (Date.now() - startTime > waitTimeout) {
204
221
  throw new Error("Timeout waiting for transaction to be processed");
205
222
  }
206
223
  await sleep(1200);
207
224
  }
208
- }
225
+ throw new Error(`Failed to get transactionInfo for txId: ${txId2}`);
226
+ };
227
+ const output = await wait(txId);
209
228
  if (process.env.CI === "true") {
210
229
  console.trace("checkResult txId", txId);
211
230
  console.log("checkResult output", Object.keys(output), output);
212
231
  }
213
- if (output.result && output.result === "FAILED") {
214
- throw new Error(tronWeb.toUtf8(output.resMessage));
232
+ if (output.result !== void 0 && output.result === "FAILED") {
233
+ throw new Error(TronWeb.toUtf8(output.resMessage ?? ""));
215
234
  }
216
235
  if (!Object.prototype.hasOwnProperty.call(output, "contractResult")) {
217
236
  throw new Error("Failed to execute: " + JSON.stringify(output, null, 2));
218
237
  }
219
- if (output.log) {
220
- output.logs = output.log;
221
- for (const log of output.logs) {
222
- log.topics = log.topics.map((t) => {
223
- if (t.startsWith("0x"))
224
- return t;
225
- return "0x" + t;
226
- });
227
- if (log.data)
228
- log.data = log.data.startsWith("0x") ? log.data : "0x" + log.data;
229
- }
230
- }
231
238
  return output;
232
239
  }
233
240
 
234
- // src/tron-types.ts
235
- var TronTransactionType = /* @__PURE__ */ ((TronTransactionType2) => {
236
- TronTransactionType2["TRIGGER_SMART_CONTRACT"] = "TriggerSmartContract";
237
- return TronTransactionType2;
238
- })(TronTransactionType || {});
239
-
240
241
  export { TronTransactionType, checkResult, createTronWeb, fullFillTxn, sendTronTransaction, signAndSendTronTransaction, signTronTx, tronBoxDeploy };
241
242
  //# sourceMappingURL=out.js.map
242
243
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/tron.ts","../src/time.ts","../src/tron-types.ts"],"names":["overrides","TronTransactionType"],"mappings":"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","sourcesContent":["import { ethers } from 'ethers'\n// @ts-ignore\nimport TronWeb from 'tronweb'\n\nimport { CmdExecutor, getLogger, getProjectPackageManager, sleep } from '@layerzerolabs/lz-utilities'\n\nimport { Time } from './time'\n\nimport {\n PartialTronTransaction,\n SignedTronTransaction,\n TransactionOverrides,\n TronBlockData,\n TronTransaction,\n TronTransactionType,\n} from './index'\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 client = new TronWeb({\n fullHost: typeof signer.rpcSetting === 'string' ? signer.rpcSetting : signer.rpcSetting.url,\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 tronBoxDeploy(\n workspace: string,\n network: string,\n tags: string[],\n executor?: 'yarn' | 'npm' | 'pnpm'\n): Promise<void> {\n // const tagsStr = tags.join(',')\n if (!executor) executor = getProjectPackageManager(workspace)\n // get the package manager from the workspace\n\n for (const tag of tags) {\n const cmd = `${executor} pnpify tronbox migrate --network ${network} --f ${tag} --to ${tag}`\n // NODE: promisify exec may not work here when invoked from testify\n try {\n const cmdExecutor = new CmdExecutor()\n await cmdExecutor.executeCmd(\n cmd,\n [],\n { shell: true, cwd: workspace, env: process.env },\n true,\n undefined,\n logger\n )\n } catch (e) {\n console.log(e)\n }\n }\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: any; wait: () => Promise<any> }> {\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: any; wait: () => Promise<any> }> {\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) {\n const err = {\n error: broadcastResponse.code,\n message: broadcastResponse.code,\n }\n if (broadcastResponse.message) err.message = client.toUtf8(broadcastResponse.message)\n throw new Error(JSON.stringify(err, null, 2))\n }\n\n return {\n txId: singedTxn.txID,\n result: broadcastResponse,\n wait: async (): Promise<any> => {\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 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) {\n throw new Error('Invalid private key provided')\n }\n\n return signedTransaction\n}\n\nlet gasPriceCache: { time: number; value: string } = { time: 0, value: '' }\nconst energyFactorsCache: Map<string, { time: number; value: number }> = new Map()\n\nexport async function fullFillTxn(\n signer: TronWeb,\n txn: PartialTronTransaction,\n overrides: TransactionOverrides = {}\n): Promise<TronTransaction> {\n const etherProvider = new ethers.providers.StaticJsonRpcProvider({\n url: `${signer.fullNode.host}/jsonrpc`,\n headers: { 'TRON-PRO-API-KEY': signer.fullNode.headers['TRON-PRO-API-KEY'] },\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 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 const res = await signer.fullNode.request('wallet/getcontractinfo', { value: addr, visible: false }, 'post')\n const energy_factor = res?.contract_state?.energy_factor ?? MAX_ENERGY_FACTOR\n energyFactorsCache.set(addr, { time: Time.NOW, value: energy_factor })\n return energy_factor\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.timestamp\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<any> {\n let output: any = {}\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 while (!Object.keys(output).length) {\n output = await tronWeb.trx.getTransactionInfo(txId)\n if (!Object.keys(output).length) {\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 }\n if (process.env.CI === 'true') {\n console.trace('checkResult txId', txId)\n console.log('checkResult output', Object.keys(output), output)\n }\n\n if (output.result && 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 // tron provider align the ethers provider result\n if (output.log) {\n output.logs = output.log\n for (const log of output.logs) {\n log.topics = log.topics.map((t: string) => {\n if (t.startsWith('0x')) return t\n return '0x' + t\n })\n if (log.data) log.data = log.data.startsWith('0x') ? log.data : '0x' + log.data\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 enum TronTransactionType {\n TRIGGER_SMART_CONTRACT = 'TriggerSmartContract',\n}\n\nexport type TransactionOverrides = { gasLimit?: number; gasPrice?: number; energyFactor?: number; value?: number }\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"]}
1
+ {"version":3,"sources":["../src/tron.ts","../src/time.ts"],"names":["TronTransactionType","overrides","txId","output"],"mappings":"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","sourcesContent":["import { ethers } from 'ethers'\nimport TronWeb from 'tronweb'\n\nimport { CmdExecutor, getLogger, getProjectPackageManager, sleep } from '@layerzerolabs/lz-utilities'\n\nimport { Time } from './time'\n\nimport type {\n BlockTransaction,\n ChainParameter,\n ContractExecutionParams,\n ContractInfo,\n Transaction,\n TransactionInfo,\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 client = new TronWeb({\n fullHost: typeof signer.rpcSetting === 'string' ? signer.rpcSetting : signer.rpcSetting.url,\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 tronBoxDeploy(\n workspace: string,\n network: string,\n tags: string[],\n executor?: 'yarn' | 'npm' | 'pnpm'\n): Promise<void> {\n // const tagsStr = tags.join(',')\n if (executor === undefined) executor = getProjectPackageManager(workspace)\n // get the package manager from the workspace\n\n for (const tag of tags) {\n const cmd = `${executor} pnpify tronbox migrate --network ${network} --f ${tag} --to ${tag}`\n // NODE: promisify exec may not work here when invoked from testify\n try {\n const cmdExecutor = new CmdExecutor()\n await cmdExecutor.executeCmd(\n cmd,\n [],\n { shell: true, cwd: workspace, env: process.env },\n true,\n undefined,\n logger\n )\n } catch (e) {\n console.log(e)\n }\n }\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: any; wait: () => Promise<any> }> {\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: any; 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: `${signer.fullNode.host}/jsonrpc`,\n headers: {\n ...(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 (process.env.CI === 'true') {\n console.trace('checkResult txId', txId)\n console.log('checkResult output', Object.keys(output), output)\n }\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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@layerzerolabs/tron-utilities",
3
- "version": "2.2.5",
3
+ "version": "2.3.1",
4
4
  "license": "BUSL-1.1",
5
5
  "exports": {
6
6
  "types": "./dist/index.d.ts",
@@ -18,14 +18,15 @@
18
18
  },
19
19
  "dependencies": {
20
20
  "@ethersproject/providers": "^5.7.0",
21
- "@layerzerolabs/lz-utilities": "^2.2.5",
21
+ "@layerzerolabs/lz-utilities": "^2.3.1",
22
22
  "ethers": "^5.7.2",
23
23
  "tronweb": "^5.3.1"
24
24
  },
25
25
  "devDependencies": {
26
- "@daochild/tronweb-typescript": "1.1.1",
27
- "@layerzerolabs/tsup-config-next": "^2.2.5",
28
- "@layerzerolabs/typescript-config-next": "^2.2.5",
26
+ "@layerzerolabs/tronweb-typescript": "^0.0.0",
27
+ "@layerzerolabs/tsup-config-next": "^2.3.1",
28
+ "@layerzerolabs/typescript-config-next": "^2.3.1",
29
+ "@types/tronweb": "npm:@layerzerolabs/tronweb-typescript@workspace:^",
29
30
  "rimraf": "^5.0.5",
30
31
  "tsup": "^8.0.1",
31
32
  "typescript": "~5.2.2"