@layerzerolabs/tron-utilities 2.0.12-tron-rc.3 → 2.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -229,7 +229,8 @@ async function checkResult(tronWeb, txId) {
229
229
  return t;
230
230
  return "0x" + t;
231
231
  });
232
- log.data = log.data.startsWith("0x") ? log.data : "0x" + log.data;
232
+ if (log.data)
233
+ log.data = log.data.startsWith("0x") ? log.data : "0x" + log.data;
233
234
  }
234
235
  }
235
236
  return output;
@@ -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 } 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\nfunction toTronWeb(signer: { rpcSetting: ProviderSetting; privateKey: string } | TronWeb): TronWeb {\n if (!(signer instanceof TronWeb)) {\n signer = 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 signer\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) {\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) {\n const signedTxn = await signTronTx(txn, signer, permissionId)\n return sendTronTransaction(signedTxn, signer)\n}\n\nexport async function sendTronTransaction(\n singedTxn: SignedTronTransaction,\n signer: { rpcSetting: ProviderSetting; privateKey: string } | TronWeb\n) {\n signer = toTronWeb(signer)\n\n // broadcast signedTransaction\n const broadcastResponse = await signer.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 = signer.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 () => {\n return checkResult(signer as TronWeb, 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 = toTronWeb(_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) {\n let output: any = {}\n const startTime = Date.now()\n const waitTimeout = 1000 * 60 * 5 // 5 minutes\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 2 seconds for next check\n await new Promise((resolve) => setTimeout(resolve, 2000))\n }\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 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 sleep(ms: number): Promise<void> {\n return new Promise<void>((res) => setTimeout(res, ms))\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","../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 } 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\nfunction toTronWeb(signer: { rpcSetting: ProviderSetting; privateKey: string } | TronWeb): TronWeb {\n if (!(signer instanceof TronWeb)) {\n signer = 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 signer\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) {\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) {\n const signedTxn = await signTronTx(txn, signer, permissionId)\n return sendTronTransaction(signedTxn, signer)\n}\n\nexport async function sendTronTransaction(\n singedTxn: SignedTronTransaction,\n signer: { rpcSetting: ProviderSetting; privateKey: string } | TronWeb\n) {\n signer = toTronWeb(signer)\n\n // broadcast signedTransaction\n const broadcastResponse = await signer.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 = signer.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 () => {\n return checkResult(signer as TronWeb, 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 = toTronWeb(_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) {\n let output: any = {}\n const startTime = Date.now()\n const waitTimeout = 1000 * 60 * 5 // 5 minutes\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 2 seconds for next check\n await new Promise((resolve) => setTimeout(resolve, 2000))\n }\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 sleep(ms: number): Promise<void> {\n return new Promise<void>((res) => setTimeout(res, ms))\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"]}
package/dist/index.mjs CHANGED
@@ -223,7 +223,8 @@ async function checkResult(tronWeb, txId) {
223
223
  return t;
224
224
  return "0x" + t;
225
225
  });
226
- log.data = log.data.startsWith("0x") ? log.data : "0x" + log.data;
226
+ if (log.data)
227
+ log.data = log.data.startsWith("0x") ? log.data : "0x" + log.data;
227
228
  }
228
229
  }
229
230
  return output;
@@ -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 } 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\nfunction toTronWeb(signer: { rpcSetting: ProviderSetting; privateKey: string } | TronWeb): TronWeb {\n if (!(signer instanceof TronWeb)) {\n signer = 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 signer\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) {\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) {\n const signedTxn = await signTronTx(txn, signer, permissionId)\n return sendTronTransaction(signedTxn, signer)\n}\n\nexport async function sendTronTransaction(\n singedTxn: SignedTronTransaction,\n signer: { rpcSetting: ProviderSetting; privateKey: string } | TronWeb\n) {\n signer = toTronWeb(signer)\n\n // broadcast signedTransaction\n const broadcastResponse = await signer.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 = signer.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 () => {\n return checkResult(signer as TronWeb, 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 = toTronWeb(_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) {\n let output: any = {}\n const startTime = Date.now()\n const waitTimeout = 1000 * 60 * 5 // 5 minutes\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 2 seconds for next check\n await new Promise((resolve) => setTimeout(resolve, 2000))\n }\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 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 sleep(ms: number): Promise<void> {\n return new Promise<void>((res) => setTimeout(res, ms))\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","../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 } 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\nfunction toTronWeb(signer: { rpcSetting: ProviderSetting; privateKey: string } | TronWeb): TronWeb {\n if (!(signer instanceof TronWeb)) {\n signer = 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 signer\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) {\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) {\n const signedTxn = await signTronTx(txn, signer, permissionId)\n return sendTronTransaction(signedTxn, signer)\n}\n\nexport async function sendTronTransaction(\n singedTxn: SignedTronTransaction,\n signer: { rpcSetting: ProviderSetting; privateKey: string } | TronWeb\n) {\n signer = toTronWeb(signer)\n\n // broadcast signedTransaction\n const broadcastResponse = await signer.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 = signer.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 () => {\n return checkResult(signer as TronWeb, 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 = toTronWeb(_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) {\n let output: any = {}\n const startTime = Date.now()\n const waitTimeout = 1000 * 60 * 5 // 5 minutes\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 2 seconds for next check\n await new Promise((resolve) => setTimeout(resolve, 2000))\n }\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 sleep(ms: number): Promise<void> {\n return new Promise<void>((res) => setTimeout(res, ms))\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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@layerzerolabs/tron-utilities",
3
- "version": "2.0.12-tron-rc.3",
3
+ "version": "2.1.2",
4
4
  "license": "BUSL-1.1",
5
5
  "exports": {
6
6
  "types": "./dist/index.d.ts",
@@ -18,20 +18,19 @@
18
18
  },
19
19
  "dependencies": {
20
20
  "@ethersproject/providers": "^5.7.0",
21
- "@layerzerolabs/lz-utilities": "^2.0.12-tron-rc.3",
21
+ "@layerzerolabs/lz-utilities": "^2.1.2",
22
22
  "ethers": "^5.7.2",
23
23
  "tronweb": "^5.3.1"
24
24
  },
25
25
  "devDependencies": {
26
26
  "@daochild/tronweb-typescript": "1.1.1",
27
- "@layerzerolabs/tsup-config-next": "^2.0.12-tron-rc.3",
28
- "@layerzerolabs/typescript-config-next": "^2.0.12-tron-rc.3",
27
+ "@layerzerolabs/tsup-config-next": "^2.1.2",
28
+ "@layerzerolabs/typescript-config-next": "^2.1.2",
29
29
  "rimraf": "^5.0.5",
30
30
  "tsup": "^8.0.1",
31
31
  "typescript": "~5.2.2"
32
32
  },
33
33
  "publishConfig": {
34
34
  "access": "public"
35
- },
36
- "stableVersion": "2.0.10"
35
+ }
37
36
  }