@across-protocol/sdk 4.4.17 → 4.4.18
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/cjs/src/arch/evm/BlockUtils.js +11 -6
- package/dist/cjs/src/arch/evm/BlockUtils.js.map +1 -1
- package/dist/cjs/src/arch/tvm/TransactionUtils.js +15 -2
- package/dist/cjs/src/arch/tvm/TransactionUtils.js.map +1 -1
- package/dist/esm/src/arch/evm/BlockUtils.js +18 -6
- package/dist/esm/src/arch/evm/BlockUtils.js.map +1 -1
- package/dist/esm/src/arch/tvm/TransactionUtils.d.ts +7 -1
- package/dist/esm/src/arch/tvm/TransactionUtils.js +40 -4
- package/dist/esm/src/arch/tvm/TransactionUtils.js.map +1 -1
- package/dist/types/src/arch/evm/BlockUtils.d.ts.map +1 -1
- package/dist/types/src/arch/tvm/TransactionUtils.d.ts +7 -1
- package/dist/types/src/arch/tvm/TransactionUtils.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/arch/evm/BlockUtils.ts +20 -6
- package/src/arch/tvm/TransactionUtils.ts +44 -4
|
@@ -31,11 +31,14 @@ async function averageBlockTime(provider, { highBlock, highBlockOffset, blockRan
|
|
|
31
31
|
return { average: cache.average, blockRange: cache.blockRange };
|
|
32
32
|
}
|
|
33
33
|
if (!(0, TypeGuards_1.isDefined)(highBlock)) {
|
|
34
|
-
|
|
35
|
-
highBlock
|
|
34
|
+
const latestBlock = await provider.getBlockNumber();
|
|
35
|
+
highBlock = latestBlock - (highBlockOffset ?? defaultHighBlockOffset);
|
|
36
|
+
if (highBlock <= 0) {
|
|
37
|
+
highBlock = latestBlock;
|
|
38
|
+
}
|
|
36
39
|
}
|
|
37
40
|
blockRange ??= defaultBlockRange;
|
|
38
|
-
const earliestBlockNumber = highBlock - blockRange;
|
|
41
|
+
const earliestBlockNumber = Math.max(highBlock - blockRange, 0);
|
|
39
42
|
const [firstBlock, lastBlock] = await Promise.all([
|
|
40
43
|
provider.getBlock(earliestBlockNumber),
|
|
41
44
|
provider.getBlock(highBlock),
|
|
@@ -47,9 +50,11 @@ async function averageBlockTime(provider, { highBlock, highBlockOffset, blockRan
|
|
|
47
50
|
throw new Error(`BlockFinder: Failed to fetch block ${blockNumber} on ${network}`);
|
|
48
51
|
}
|
|
49
52
|
});
|
|
50
|
-
const
|
|
51
|
-
|
|
52
|
-
|
|
53
|
+
const sampledRange = lastBlock.number - firstBlock.number;
|
|
54
|
+
(0, assert_1.default)(sampledRange > 0, `averageBlockTime: no block range to sample on ${(0, NetworkUtils_1.getNetworkName)(chainId)}`);
|
|
55
|
+
const average = (lastBlock.timestamp - firstBlock.timestamp) / sampledRange;
|
|
56
|
+
blockTimes[chainId] = { timestamp: now, average, blockRange: sampledRange };
|
|
57
|
+
return { average, blockRange: sampledRange };
|
|
53
58
|
}
|
|
54
59
|
async function estimateBlocksElapsed(seconds, cushionPercentage = 0.0, provider) {
|
|
55
60
|
const cushionMultiplier = cushionPercentage + 1.0;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BlockUtils.js","sourceRoot":"","sources":["../../../../../src/arch/evm/BlockUtils.ts"],"names":[],"mappings":";;;AA6CA,
|
|
1
|
+
{"version":3,"file":"BlockUtils.js","sourceRoot":"","sources":["../../../../../src/arch/evm/BlockUtils.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,14 +5,17 @@ exports.simulateTransaction = simulateTransaction;
|
|
|
5
5
|
const utils_1 = require("../../utils");
|
|
6
6
|
async function submitTransaction(tronWeb, populatedTx, feeLimit, callValue = 0) {
|
|
7
7
|
const { to, data } = populatedTx;
|
|
8
|
-
if (!to
|
|
9
|
-
throw new Error("submitTransaction: populatedTx must have
|
|
8
|
+
if (!to) {
|
|
9
|
+
throw new Error("submitTransaction: populatedTx must have a 'to' field");
|
|
10
10
|
}
|
|
11
11
|
const tronAddress = utils_1.TvmAddress.from(to).toNative();
|
|
12
12
|
const ownerAddress = tronWeb.defaultAddress?.base58;
|
|
13
13
|
if (!ownerAddress) {
|
|
14
14
|
throw new Error("submitTransaction: TronWeb instance must have a default address configured");
|
|
15
15
|
}
|
|
16
|
+
if (!(0, utils_1.isDefined)(data)) {
|
|
17
|
+
return transferNative(tronWeb, tronAddress, callValue);
|
|
18
|
+
}
|
|
16
19
|
const input = data.startsWith("0x") ? data.slice(2) : data;
|
|
17
20
|
const txWrapper = await tronWeb.transactionBuilder.triggerSmartContract(tronAddress, "", { feeLimit, input, callValue }, [], ownerAddress);
|
|
18
21
|
if (!txWrapper?.result?.result) {
|
|
@@ -26,6 +29,16 @@ async function submitTransaction(tronWeb, populatedTx, feeLimit, callValue = 0)
|
|
|
26
29
|
result: broadcast.result ?? false,
|
|
27
30
|
};
|
|
28
31
|
}
|
|
32
|
+
async function transferNative(tronWeb, recipient, amount) {
|
|
33
|
+
if (amount <= 0) {
|
|
34
|
+
throw new Error("submitTransaction: a transaction with no calldata must transfer a non-zero value");
|
|
35
|
+
}
|
|
36
|
+
const broadcast = await tronWeb.trx.sendTransaction(recipient, amount);
|
|
37
|
+
return {
|
|
38
|
+
txid: broadcast.txid ?? broadcast.transaction.txID,
|
|
39
|
+
result: broadcast.result ?? false,
|
|
40
|
+
};
|
|
41
|
+
}
|
|
29
42
|
async function simulateTransaction(tronWeb, populatedTx, feeLimit, callValue = 0) {
|
|
30
43
|
const { to, data } = populatedTx;
|
|
31
44
|
if (!to || !data) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TransactionUtils.js","sourceRoot":"","sources":["../../../../../src/arch/tvm/TransactionUtils.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"TransactionUtils.js","sourceRoot":"","sources":["../../../../../src/arch/tvm/TransactionUtils.ts"],"names":[],"mappings":"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"}
|
|
@@ -41,11 +41,18 @@ export async function averageBlockTime(provider, { highBlock, highBlockOffset, b
|
|
|
41
41
|
// If the caller was not specific about highBlock, resolve it via the RPC provider. Subtract an offset
|
|
42
42
|
// to account for various RPC provider sync issues that might occur when querting the latest block.
|
|
43
43
|
if (!isDefined(highBlock)) {
|
|
44
|
-
|
|
45
|
-
highBlock
|
|
44
|
+
const latestBlock = await provider.getBlockNumber();
|
|
45
|
+
highBlock = latestBlock - (highBlockOffset ?? defaultHighBlockOffset);
|
|
46
|
+
// The offset presumes a chain with more blocks than the offset itself. Below that it puts the entire
|
|
47
|
+
// sample window at or before genesis, leaving nothing to measure, so fall back to the head.
|
|
48
|
+
if (highBlock <= 0) {
|
|
49
|
+
highBlock = latestBlock;
|
|
50
|
+
}
|
|
46
51
|
}
|
|
47
52
|
blockRange ??= defaultBlockRange;
|
|
48
|
-
|
|
53
|
+
// Clamp the window to blocks that exist. A negative block number is not an error to ethers: it resolves
|
|
54
|
+
// relative to the head, which slides the window instead of starting it at genesis.
|
|
55
|
+
const earliestBlockNumber = Math.max(highBlock - blockRange, 0);
|
|
49
56
|
const [firstBlock, lastBlock] = await Promise.all([
|
|
50
57
|
provider.getBlock(earliestBlockNumber),
|
|
51
58
|
provider.getBlock(highBlock),
|
|
@@ -57,9 +64,14 @@ export async function averageBlockTime(provider, { highBlock, highBlockOffset, b
|
|
|
57
64
|
throw new Error(`BlockFinder: Failed to fetch block ${blockNumber} on ${network}`);
|
|
58
65
|
}
|
|
59
66
|
});
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
67
|
+
// Divide by the range actually sampled, which is narrower than blockRange on a chain holding less
|
|
68
|
+
// history than that. Dividing by the requested range instead under-reports the block time in proportion
|
|
69
|
+
// to how much of the window does not exist, and reports 0 when none of it does.
|
|
70
|
+
const sampledRange = lastBlock.number - firstBlock.number;
|
|
71
|
+
assert(sampledRange > 0, `averageBlockTime: no block range to sample on ${getNetworkName(chainId)}`);
|
|
72
|
+
const average = (lastBlock.timestamp - firstBlock.timestamp) / sampledRange;
|
|
73
|
+
blockTimes[chainId] = { timestamp: now, average, blockRange: sampledRange };
|
|
74
|
+
return { average, blockRange: sampledRange };
|
|
63
75
|
}
|
|
64
76
|
async function estimateBlocksElapsed(seconds, cushionPercentage = 0.0, provider) {
|
|
65
77
|
const cushionMultiplier = cushionPercentage + 1.0;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BlockUtils.js","sourceRoot":"","sources":["../../../../../src/arch/evm/BlockUtils.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAE5B,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1E,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EACL,WAAW,GAKZ,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAK5C,gFAAgF;AAChF,qEAAqE;AACrE,MAAM,iBAAiB,GAAG,GAAG,CAAC;AAE9B,sGAAsG;AACtG,uGAAuG;AACvG,uGAAuG;AACvG,2FAA2F;AAC3F,MAAM,sBAAsB,GAAG,EAAE,CAAC;AAElC,sCAAsC;AACtC,MAAM,QAAQ,GAAG,EAAE,GAAG,EAAE,CAAC;AACzB,MAAM,GAAG,GAAG,cAAc,EAAE,CAAC,CAAC,sCAAsC;AACpE,MAAM,UAAU,GAA4C;IAC1D,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,UAAU,EAAE,CAAC,EAAE;IAC9D,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,UAAU,EAAE,CAAC,EAAE;IAChE,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,UAAU,EAAE,CAAC,EAAE;IACrE,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,UAAU,EAAE,CAAC,EAAE;IAClE,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,UAAU,EAAE,CAAC,EAAE;IACnE,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,UAAU,EAAE,CAAC,EAAE;IAC/D,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,UAAU,EAAE,CAAC,EAAE;CACpE,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,QAAkB,EAClB,EAAE,SAAS,EAAE,eAAe,EAAE,UAAU,KAAW,EAAE;IAErD,4CAA4C;IAC5C,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,QAAQ,CAAC,UAAU,EAAE,CAAC;IAEhD,uEAAuE;IACvE,MAAM,KAAK,GAAG,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IAE5G,MAAM,GAAG,GAAG,cAAc,EAAE,CAAC;IAC7B,IAAI,SAAS,CAAC,KAAK,CAAC,IAAI,GAAG,GAAG,KAAK,CAAC,SAAS,GAAG,QAAQ,EAAE,CAAC;QACzD,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,CAAC;IAClE,CAAC;IAED,sGAAsG;IACtG,mGAAmG;IACnG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,CAAC;QAC1B,
|
|
1
|
+
{"version":3,"file":"BlockUtils.js","sourceRoot":"","sources":["../../../../../src/arch/evm/BlockUtils.ts"],"names":[],"mappings":"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"}
|
|
@@ -21,8 +21,14 @@ export interface TronSimulationResult {
|
|
|
21
21
|
* converts the target address to TRON Base58 format, and uses TronWeb's
|
|
22
22
|
* `triggerSmartContract` → `sign` → `sendRawTransaction` pipeline.
|
|
23
23
|
*
|
|
24
|
+
* TRON models a native TRX transfer as its own transaction type (`TransferContract`), distinct from
|
|
25
|
+
* the `TriggerSmartContract` used for calls. A populated transaction with no `data` field is
|
|
26
|
+
* therefore dispatched to TronWeb's `sendTransaction` instead; see {@link transferNative}. Note that
|
|
27
|
+
* this turns on `data` being absent, not empty: an explicit `"0x"` remains a contract call, since
|
|
28
|
+
* that is how TronWeb encodes a `receive`/`fallback` invocation.
|
|
29
|
+
*
|
|
24
30
|
* @param tronWeb An authenticated TronWeb instance (with private key set).
|
|
25
|
-
* @param populatedTx The populated transaction containing `to
|
|
31
|
+
* @param populatedTx The populated transaction containing `to`, and `data` for a contract call.
|
|
26
32
|
* @param feeLimit The maximum TRX to burn for energy consumption, in SUN (1 TRX = 1,000,000 SUN).
|
|
27
33
|
* @returns The transaction ID and result status.
|
|
28
34
|
*/
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { TvmAddress } from "../../utils";
|
|
1
|
+
import { isDefined, TvmAddress } from "../../utils";
|
|
2
2
|
/**
|
|
3
3
|
* Submit a populated EVM transaction to TRON via TronWeb.
|
|
4
4
|
*
|
|
@@ -7,21 +7,36 @@ import { TvmAddress } from "../../utils";
|
|
|
7
7
|
* converts the target address to TRON Base58 format, and uses TronWeb's
|
|
8
8
|
* `triggerSmartContract` → `sign` → `sendRawTransaction` pipeline.
|
|
9
9
|
*
|
|
10
|
+
* TRON models a native TRX transfer as its own transaction type (`TransferContract`), distinct from
|
|
11
|
+
* the `TriggerSmartContract` used for calls. A populated transaction with no `data` field is
|
|
12
|
+
* therefore dispatched to TronWeb's `sendTransaction` instead; see {@link transferNative}. Note that
|
|
13
|
+
* this turns on `data` being absent, not empty: an explicit `"0x"` remains a contract call, since
|
|
14
|
+
* that is how TronWeb encodes a `receive`/`fallback` invocation.
|
|
15
|
+
*
|
|
10
16
|
* @param tronWeb An authenticated TronWeb instance (with private key set).
|
|
11
|
-
* @param populatedTx The populated transaction containing `to
|
|
17
|
+
* @param populatedTx The populated transaction containing `to`, and `data` for a contract call.
|
|
12
18
|
* @param feeLimit The maximum TRX to burn for energy consumption, in SUN (1 TRX = 1,000,000 SUN).
|
|
13
19
|
* @returns The transaction ID and result status.
|
|
14
20
|
*/
|
|
15
21
|
export async function submitTransaction(tronWeb, populatedTx, feeLimit, callValue = 0) {
|
|
16
22
|
const { to, data } = populatedTx;
|
|
17
|
-
if (!to
|
|
18
|
-
throw new Error("submitTransaction: populatedTx must have
|
|
23
|
+
if (!to) {
|
|
24
|
+
throw new Error("submitTransaction: populatedTx must have a 'to' field");
|
|
19
25
|
}
|
|
20
26
|
const tronAddress = TvmAddress.from(to).toNative();
|
|
21
27
|
const ownerAddress = tronWeb.defaultAddress?.base58;
|
|
22
28
|
if (!ownerAddress) {
|
|
23
29
|
throw new Error("submitTransaction: TronWeb instance must have a default address configured");
|
|
24
30
|
}
|
|
31
|
+
// No calldata at all means this is a value transfer, which triggerSmartContract cannot express: it
|
|
32
|
+
// requires a deployed contract at the target address, so it can never fund an EOA.
|
|
33
|
+
//
|
|
34
|
+
// Empty-but-present calldata ("0x") is deliberately *not* treated as a transfer. That is TronWeb's
|
|
35
|
+
// own encoding for a `receive`/`fallback` selector, which it submits as a TriggerSmartContract; a
|
|
36
|
+
// TransferContract would move the TRX without running the recipient's code.
|
|
37
|
+
if (!isDefined(data)) {
|
|
38
|
+
return transferNative(tronWeb, tronAddress, callValue);
|
|
39
|
+
}
|
|
25
40
|
// Use triggerSmartContract with the `input` option to pass pre-encoded calldata.
|
|
26
41
|
// The function selector is empty — the full calldata (selector + params) is in `input`.
|
|
27
42
|
const input = data.startsWith("0x") ? data.slice(2) : data;
|
|
@@ -39,6 +54,27 @@ export async function submitTransaction(tronWeb, populatedTx, feeLimit, callValu
|
|
|
39
54
|
result: broadcast.result ?? false,
|
|
40
55
|
};
|
|
41
56
|
}
|
|
57
|
+
/**
|
|
58
|
+
* Transfer native TRX to an account via a `TransferContract` transaction.
|
|
59
|
+
*
|
|
60
|
+
* TronWeb's `sendTransaction` builds, signs and broadcasts in one call, using the instance's default
|
|
61
|
+
* private key. No fee limit applies, since transfers consume bandwidth rather than energy.
|
|
62
|
+
*
|
|
63
|
+
* @param tronWeb An authenticated TronWeb instance (with private key set).
|
|
64
|
+
* @param recipient Base58 recipient address.
|
|
65
|
+
* @param amount Transfer amount in SUN (1 TRX = 1,000,000 SUN).
|
|
66
|
+
* @returns The transaction ID and result status.
|
|
67
|
+
*/
|
|
68
|
+
async function transferNative(tronWeb, recipient, amount) {
|
|
69
|
+
if (amount <= 0) {
|
|
70
|
+
throw new Error("submitTransaction: a transaction with no calldata must transfer a non-zero value");
|
|
71
|
+
}
|
|
72
|
+
const broadcast = await tronWeb.trx.sendTransaction(recipient, amount);
|
|
73
|
+
return {
|
|
74
|
+
txid: broadcast.txid ?? broadcast.transaction.txID,
|
|
75
|
+
result: broadcast.result ?? false,
|
|
76
|
+
};
|
|
77
|
+
}
|
|
42
78
|
/**
|
|
43
79
|
* Simulate a populated EVM transaction against TRON via TronWeb (constant call / `eth_call`-style).
|
|
44
80
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TransactionUtils.js","sourceRoot":"","sources":["../../../../../src/arch/tvm/TransactionUtils.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"TransactionUtils.js","sourceRoot":"","sources":["../../../../../src/arch/tvm/TransactionUtils.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BlockUtils.d.ts","sourceRoot":"","sources":["../../../../../src/arch/evm/BlockUtils.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,KAAK,IAAI,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAIlF,OAAO,EACL,WAAW,EACX,KAAK,KAAK,EACV,KAAK,eAAe,IAAI,IAAI,EAC5B,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,EACtB,MAAM,yBAAyB,CAAC;AAKjC,UAAU,QAAS,SAAQ,KAAK,EAAE,WAAW;CAAG;AAyBhD;;;GAGG;AACH,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,QAAQ,EAClB,EAAE,SAAS,EAAE,eAAe,EAAE,UAAU,EAAE,GAAE,IAAS,GACpD,OAAO,CAAC,IAAI,CAAC,gBAAgB,EAAE,SAAS,GAAG,YAAY,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"BlockUtils.d.ts","sourceRoot":"","sources":["../../../../../src/arch/evm/BlockUtils.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,KAAK,IAAI,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAIlF,OAAO,EACL,WAAW,EACX,KAAK,KAAK,EACV,KAAK,eAAe,IAAI,IAAI,EAC5B,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,EACtB,MAAM,yBAAyB,CAAC;AAKjC,UAAU,QAAS,SAAQ,KAAK,EAAE,WAAW;CAAG;AAyBhD;;;GAGG;AACH,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,QAAQ,EAClB,EAAE,SAAS,EAAE,eAAe,EAAE,UAAU,EAAE,GAAE,IAAS,GACpD,OAAO,CAAC,IAAI,CAAC,gBAAgB,EAAE,SAAS,GAAG,YAAY,CAAC,CAAC,CAmD3D;AAQD,qBAAa,cAAe,SAAQ,WAAW,CAAC,QAAQ,CAAC;IAErD,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,MAAM;gBADN,QAAQ,EAAE,QAAQ,EAClB,MAAM,GAAE,QAAQ,EAAO;IAK1C;;;;OAIG;IACU,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE,KAAK,GAAE,gBAAqB,GAAG,OAAO,CAAC,QAAQ,CAAC;YA+ChG,cAAc;YAQd,QAAQ;YAiBR,SAAS;CAgCxB"}
|
|
@@ -21,8 +21,14 @@ export interface TronSimulationResult {
|
|
|
21
21
|
* converts the target address to TRON Base58 format, and uses TronWeb's
|
|
22
22
|
* `triggerSmartContract` → `sign` → `sendRawTransaction` pipeline.
|
|
23
23
|
*
|
|
24
|
+
* TRON models a native TRX transfer as its own transaction type (`TransferContract`), distinct from
|
|
25
|
+
* the `TriggerSmartContract` used for calls. A populated transaction with no `data` field is
|
|
26
|
+
* therefore dispatched to TronWeb's `sendTransaction` instead; see {@link transferNative}. Note that
|
|
27
|
+
* this turns on `data` being absent, not empty: an explicit `"0x"` remains a contract call, since
|
|
28
|
+
* that is how TronWeb encodes a `receive`/`fallback` invocation.
|
|
29
|
+
*
|
|
24
30
|
* @param tronWeb An authenticated TronWeb instance (with private key set).
|
|
25
|
-
* @param populatedTx The populated transaction containing `to
|
|
31
|
+
* @param populatedTx The populated transaction containing `to`, and `data` for a contract call.
|
|
26
32
|
* @param feeLimit The maximum TRX to burn for energy consumption, in SUN (1 TRX = 1,000,000 SUN).
|
|
27
33
|
* @returns The transaction ID and result status.
|
|
28
34
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TransactionUtils.d.ts","sourceRoot":"","sources":["../../../../../src/arch/tvm/TransactionUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,oBAAoB,EAAE,MAAM,QAAQ,CAAC;AAG9C,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,yFAAyF;AACzF,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED
|
|
1
|
+
{"version":3,"file":"TransactionUtils.d.ts","sourceRoot":"","sources":["../../../../../src/arch/tvm/TransactionUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,oBAAoB,EAAE,MAAM,QAAQ,CAAC;AAG9C,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,yFAAyF;AACzF,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,OAAO,EAChB,WAAW,EAAE,oBAAoB,EACjC,QAAQ,EAAE,MAAM,EAChB,SAAS,GAAE,MAAU,GACpB,OAAO,CAAC,qBAAqB,CAAC,CA8ChC;AA0BD;;;;;;;;;;GAUG;AACH,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,OAAO,EAChB,WAAW,EAAE,oBAAoB,EACjC,QAAQ,EAAE,MAAM,EAChB,SAAS,GAAE,MAAU,GACpB,OAAO,CAAC,oBAAoB,CAAC,CAkC/B"}
|
package/package.json
CHANGED
|
@@ -61,12 +61,20 @@ export async function averageBlockTime(
|
|
|
61
61
|
// If the caller was not specific about highBlock, resolve it via the RPC provider. Subtract an offset
|
|
62
62
|
// to account for various RPC provider sync issues that might occur when querting the latest block.
|
|
63
63
|
if (!isDefined(highBlock)) {
|
|
64
|
-
|
|
65
|
-
highBlock
|
|
64
|
+
const latestBlock = await provider.getBlockNumber();
|
|
65
|
+
highBlock = latestBlock - (highBlockOffset ?? defaultHighBlockOffset);
|
|
66
|
+
|
|
67
|
+
// The offset presumes a chain with more blocks than the offset itself. Below that it puts the entire
|
|
68
|
+
// sample window at or before genesis, leaving nothing to measure, so fall back to the head.
|
|
69
|
+
if (highBlock <= 0) {
|
|
70
|
+
highBlock = latestBlock;
|
|
71
|
+
}
|
|
66
72
|
}
|
|
67
73
|
blockRange ??= defaultBlockRange;
|
|
68
74
|
|
|
69
|
-
|
|
75
|
+
// Clamp the window to blocks that exist. A negative block number is not an error to ethers: it resolves
|
|
76
|
+
// relative to the head, which slides the window instead of starting it at genesis.
|
|
77
|
+
const earliestBlockNumber = Math.max(highBlock - blockRange, 0);
|
|
70
78
|
const [firstBlock, lastBlock] = await Promise.all([
|
|
71
79
|
provider.getBlock(earliestBlockNumber),
|
|
72
80
|
provider.getBlock(highBlock),
|
|
@@ -79,10 +87,16 @@ export async function averageBlockTime(
|
|
|
79
87
|
}
|
|
80
88
|
});
|
|
81
89
|
|
|
82
|
-
|
|
83
|
-
|
|
90
|
+
// Divide by the range actually sampled, which is narrower than blockRange on a chain holding less
|
|
91
|
+
// history than that. Dividing by the requested range instead under-reports the block time in proportion
|
|
92
|
+
// to how much of the window does not exist, and reports 0 when none of it does.
|
|
93
|
+
const sampledRange = lastBlock.number - firstBlock.number;
|
|
94
|
+
assert(sampledRange > 0, `averageBlockTime: no block range to sample on ${getNetworkName(chainId)}`);
|
|
95
|
+
|
|
96
|
+
const average = (lastBlock.timestamp - firstBlock.timestamp) / sampledRange;
|
|
97
|
+
blockTimes[chainId] = { timestamp: now, average, blockRange: sampledRange };
|
|
84
98
|
|
|
85
|
-
return { average, blockRange };
|
|
99
|
+
return { average, blockRange: sampledRange };
|
|
86
100
|
}
|
|
87
101
|
|
|
88
102
|
async function estimateBlocksElapsed(seconds: number, cushionPercentage = 0.0, provider: Provider): Promise<number> {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { TronWeb } from "tronweb";
|
|
2
2
|
import { PopulatedTransaction } from "ethers";
|
|
3
|
-
import { TvmAddress } from "../../utils";
|
|
3
|
+
import { isDefined, TvmAddress } from "../../utils";
|
|
4
4
|
|
|
5
5
|
export interface TronTransactionResult {
|
|
6
6
|
txid: string;
|
|
@@ -25,8 +25,14 @@ export interface TronSimulationResult {
|
|
|
25
25
|
* converts the target address to TRON Base58 format, and uses TronWeb's
|
|
26
26
|
* `triggerSmartContract` → `sign` → `sendRawTransaction` pipeline.
|
|
27
27
|
*
|
|
28
|
+
* TRON models a native TRX transfer as its own transaction type (`TransferContract`), distinct from
|
|
29
|
+
* the `TriggerSmartContract` used for calls. A populated transaction with no `data` field is
|
|
30
|
+
* therefore dispatched to TronWeb's `sendTransaction` instead; see {@link transferNative}. Note that
|
|
31
|
+
* this turns on `data` being absent, not empty: an explicit `"0x"` remains a contract call, since
|
|
32
|
+
* that is how TronWeb encodes a `receive`/`fallback` invocation.
|
|
33
|
+
*
|
|
28
34
|
* @param tronWeb An authenticated TronWeb instance (with private key set).
|
|
29
|
-
* @param populatedTx The populated transaction containing `to
|
|
35
|
+
* @param populatedTx The populated transaction containing `to`, and `data` for a contract call.
|
|
30
36
|
* @param feeLimit The maximum TRX to burn for energy consumption, in SUN (1 TRX = 1,000,000 SUN).
|
|
31
37
|
* @returns The transaction ID and result status.
|
|
32
38
|
*/
|
|
@@ -37,8 +43,8 @@ export async function submitTransaction(
|
|
|
37
43
|
callValue: number = 0
|
|
38
44
|
): Promise<TronTransactionResult> {
|
|
39
45
|
const { to, data } = populatedTx;
|
|
40
|
-
if (!to
|
|
41
|
-
throw new Error("submitTransaction: populatedTx must have
|
|
46
|
+
if (!to) {
|
|
47
|
+
throw new Error("submitTransaction: populatedTx must have a 'to' field");
|
|
42
48
|
}
|
|
43
49
|
|
|
44
50
|
const tronAddress = TvmAddress.from(to).toNative();
|
|
@@ -47,6 +53,16 @@ export async function submitTransaction(
|
|
|
47
53
|
throw new Error("submitTransaction: TronWeb instance must have a default address configured");
|
|
48
54
|
}
|
|
49
55
|
|
|
56
|
+
// No calldata at all means this is a value transfer, which triggerSmartContract cannot express: it
|
|
57
|
+
// requires a deployed contract at the target address, so it can never fund an EOA.
|
|
58
|
+
//
|
|
59
|
+
// Empty-but-present calldata ("0x") is deliberately *not* treated as a transfer. That is TronWeb's
|
|
60
|
+
// own encoding for a `receive`/`fallback` selector, which it submits as a TriggerSmartContract; a
|
|
61
|
+
// TransferContract would move the TRX without running the recipient's code.
|
|
62
|
+
if (!isDefined(data)) {
|
|
63
|
+
return transferNative(tronWeb, tronAddress, callValue);
|
|
64
|
+
}
|
|
65
|
+
|
|
50
66
|
// Use triggerSmartContract with the `input` option to pass pre-encoded calldata.
|
|
51
67
|
// The function selector is empty — the full calldata (selector + params) is in `input`.
|
|
52
68
|
const input = data.startsWith("0x") ? data.slice(2) : data;
|
|
@@ -73,6 +89,30 @@ export async function submitTransaction(
|
|
|
73
89
|
};
|
|
74
90
|
}
|
|
75
91
|
|
|
92
|
+
/**
|
|
93
|
+
* Transfer native TRX to an account via a `TransferContract` transaction.
|
|
94
|
+
*
|
|
95
|
+
* TronWeb's `sendTransaction` builds, signs and broadcasts in one call, using the instance's default
|
|
96
|
+
* private key. No fee limit applies, since transfers consume bandwidth rather than energy.
|
|
97
|
+
*
|
|
98
|
+
* @param tronWeb An authenticated TronWeb instance (with private key set).
|
|
99
|
+
* @param recipient Base58 recipient address.
|
|
100
|
+
* @param amount Transfer amount in SUN (1 TRX = 1,000,000 SUN).
|
|
101
|
+
* @returns The transaction ID and result status.
|
|
102
|
+
*/
|
|
103
|
+
async function transferNative(tronWeb: TronWeb, recipient: string, amount: number): Promise<TronTransactionResult> {
|
|
104
|
+
if (amount <= 0) {
|
|
105
|
+
throw new Error("submitTransaction: a transaction with no calldata must transfer a non-zero value");
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
const broadcast = await tronWeb.trx.sendTransaction(recipient, amount);
|
|
109
|
+
|
|
110
|
+
return {
|
|
111
|
+
txid: broadcast.txid ?? broadcast.transaction.txID,
|
|
112
|
+
result: broadcast.result ?? false,
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
|
|
76
116
|
/**
|
|
77
117
|
* Simulate a populated EVM transaction against TRON via TronWeb (constant call / `eth_call`-style).
|
|
78
118
|
*
|