@layerzerolabs/tron-utilities 2.2.6 → 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 +19 -0
- package/dist/index.cjs +40 -36
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.mts +49 -39
- package/dist/index.d.ts +49 -39
- package/dist/index.mjs +37 -36
- package/dist/index.mjs.map +1 -1
- package/package.json +6 -5
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,24 @@
|
|
|
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
|
+
|
|
3
22
|
## 2.2.6
|
|
4
23
|
|
|
5
24
|
### 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 (
|
|
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.
|
|
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 (
|
|
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: {
|
|
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
|
|
156
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
207
|
-
|
|
208
|
-
|
|
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(
|
|
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
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
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;
|
package/dist/index.cjs.map
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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 (
|
|
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.
|
|
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 (
|
|
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: {
|
|
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
|
|
150
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
201
|
-
|
|
202
|
-
|
|
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(
|
|
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
|
package/dist/index.mjs.map
CHANGED
|
@@ -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.
|
|
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.
|
|
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
|
-
"@
|
|
27
|
-
"@layerzerolabs/tsup-config-next": "^2.
|
|
28
|
-
"@layerzerolabs/typescript-config-next": "^2.
|
|
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"
|