@lifi/sdk-provider-tron 4.0.0-alpha.21 → 4.0.0-alpha.23
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/actions/getMulticallAddress.d.ts +2 -0
- package/dist/cjs/actions/getMulticallAddress.js +10 -0
- package/dist/cjs/actions/getMulticallAddress.js.map +1 -0
- package/dist/cjs/actions/getTronBalance.js +69 -50
- package/dist/cjs/actions/getTronBalance.js.map +1 -1
- package/dist/cjs/actions/resolveTronAddress.d.ts +1 -1
- package/dist/cjs/actions/resolveTronAddress.js +2 -2
- package/dist/cjs/actions/resolveTronAddress.js.map +1 -1
- package/dist/cjs/core/TronStepExecutor.js +20 -3
- package/dist/cjs/core/TronStepExecutor.js.map +1 -1
- package/dist/cjs/core/constants.d.ts +2 -0
- package/dist/cjs/core/constants.js +6 -0
- package/dist/cjs/core/constants.js.map +1 -0
- package/dist/cjs/core/tasks/TronCheckAllowanceTask.d.ts +6 -0
- package/dist/cjs/core/tasks/TronCheckAllowanceTask.js +45 -0
- package/dist/cjs/core/tasks/TronCheckAllowanceTask.js.map +1 -0
- package/dist/cjs/core/tasks/TronSetAllowanceTask.d.ts +6 -0
- package/dist/cjs/core/tasks/TronSetAllowanceTask.js +78 -0
- package/dist/cjs/core/tasks/TronSetAllowanceTask.js.map +1 -0
- package/dist/cjs/core/tasks/TronSignAndExecuteTask.js +22 -4
- package/dist/cjs/core/tasks/TronSignAndExecuteTask.js.map +1 -1
- package/dist/cjs/core/tasks/TronWaitForTransactionTask.js +14 -12
- package/dist/cjs/core/tasks/TronWaitForTransactionTask.js.map +1 -1
- package/dist/cjs/errors/parseTronErrors.js +8 -0
- package/dist/cjs/errors/parseTronErrors.js.map +1 -1
- package/dist/cjs/rpc/callTronRpcsWithRetry.d.ts +3 -0
- package/dist/cjs/rpc/callTronRpcsWithRetry.js +22 -0
- package/dist/cjs/rpc/callTronRpcsWithRetry.js.map +1 -0
- package/dist/cjs/types.d.ts +2 -2
- package/dist/cjs/types.js.map +1 -1
- package/dist/cjs/utils/address.d.ts +2 -0
- package/dist/cjs/utils/address.js +13 -0
- package/dist/cjs/utils/address.js.map +1 -0
- package/dist/cjs/utils/isZeroAddress.d.ts +3 -0
- package/dist/cjs/utils/isZeroAddress.js +8 -0
- package/dist/cjs/utils/isZeroAddress.js.map +1 -0
- package/dist/cjs/utils/multicall3Abi.d.ts +2 -0
- package/dist/cjs/utils/multicall3Abi.js +41 -0
- package/dist/cjs/utils/multicall3Abi.js.map +1 -0
- package/dist/cjs/utils/stripHexPrefix.d.ts +1 -0
- package/dist/cjs/utils/stripHexPrefix.js +6 -0
- package/dist/cjs/utils/stripHexPrefix.js.map +1 -0
- package/dist/cjs/version.d.ts +1 -1
- package/dist/cjs/version.js +1 -1
- package/dist/esm/actions/getMulticallAddress.d.ts +2 -0
- package/dist/esm/actions/getMulticallAddress.js +6 -0
- package/dist/esm/actions/getMulticallAddress.js.map +1 -0
- package/dist/esm/actions/getTronBalance.js +71 -51
- package/dist/esm/actions/getTronBalance.js.map +1 -1
- package/dist/esm/actions/resolveTronAddress.d.ts +1 -1
- package/dist/esm/actions/resolveTronAddress.js +3 -3
- package/dist/esm/actions/resolveTronAddress.js.map +1 -1
- package/dist/esm/core/TronStepExecutor.js +20 -3
- package/dist/esm/core/TronStepExecutor.js.map +1 -1
- package/dist/esm/core/constants.d.ts +2 -0
- package/dist/esm/core/constants.js +3 -0
- package/dist/esm/core/constants.js.map +1 -0
- package/dist/esm/core/tasks/TronCheckAllowanceTask.d.ts +6 -0
- package/dist/esm/core/tasks/TronCheckAllowanceTask.js +41 -0
- package/dist/esm/core/tasks/TronCheckAllowanceTask.js.map +1 -0
- package/dist/esm/core/tasks/TronSetAllowanceTask.d.ts +6 -0
- package/dist/esm/core/tasks/TronSetAllowanceTask.js +75 -0
- package/dist/esm/core/tasks/TronSetAllowanceTask.js.map +1 -0
- package/dist/esm/core/tasks/TronSignAndExecuteTask.js +23 -5
- package/dist/esm/core/tasks/TronSignAndExecuteTask.js.map +1 -1
- package/dist/esm/core/tasks/TronWaitForTransactionTask.js +14 -12
- package/dist/esm/core/tasks/TronWaitForTransactionTask.js.map +1 -1
- package/dist/esm/errors/parseTronErrors.js +9 -0
- package/dist/esm/errors/parseTronErrors.js.map +1 -1
- package/dist/esm/rpc/callTronRpcsWithRetry.d.ts +3 -0
- package/dist/esm/rpc/callTronRpcsWithRetry.js +19 -0
- package/dist/esm/rpc/callTronRpcsWithRetry.js.map +1 -0
- package/dist/esm/types.d.ts +2 -2
- package/dist/esm/types.js.map +1 -1
- package/dist/esm/utils/address.d.ts +2 -0
- package/dist/esm/utils/address.js +10 -0
- package/dist/esm/utils/address.js.map +1 -0
- package/dist/esm/utils/isZeroAddress.d.ts +3 -0
- package/dist/esm/utils/isZeroAddress.js +4 -0
- package/dist/esm/utils/isZeroAddress.js.map +1 -0
- package/dist/esm/utils/multicall3Abi.d.ts +2 -0
- package/dist/esm/utils/multicall3Abi.js +38 -0
- package/dist/esm/utils/multicall3Abi.js.map +1 -0
- package/dist/esm/utils/stripHexPrefix.d.ts +1 -0
- package/dist/esm/utils/stripHexPrefix.js +2 -0
- package/dist/esm/utils/stripHexPrefix.js.map +1 -0
- package/dist/esm/version.d.ts +1 -1
- package/dist/esm/version.js +1 -1
- package/dist/types/actions/getMulticallAddress.d.ts +3 -0
- package/dist/types/actions/getMulticallAddress.d.ts.map +1 -0
- package/dist/types/actions/getTronBalance.d.ts.map +1 -1
- package/dist/types/actions/resolveTronAddress.d.ts +1 -1
- package/dist/types/actions/resolveTronAddress.d.ts.map +1 -1
- package/dist/types/core/TronStepExecutor.d.ts.map +1 -1
- package/dist/types/core/constants.d.ts +3 -0
- package/dist/types/core/constants.d.ts.map +1 -0
- package/dist/types/core/tasks/TronCheckAllowanceTask.d.ts +7 -0
- package/dist/types/core/tasks/TronCheckAllowanceTask.d.ts.map +1 -0
- package/dist/types/core/tasks/TronSetAllowanceTask.d.ts +7 -0
- package/dist/types/core/tasks/TronSetAllowanceTask.d.ts.map +1 -0
- package/dist/types/core/tasks/TronSignAndExecuteTask.d.ts.map +1 -1
- package/dist/types/core/tasks/TronWaitForTransactionTask.d.ts.map +1 -1
- package/dist/types/errors/parseTronErrors.d.ts.map +1 -1
- package/dist/types/rpc/callTronRpcsWithRetry.d.ts +4 -0
- package/dist/types/rpc/callTronRpcsWithRetry.d.ts.map +1 -0
- package/dist/types/types.d.ts +2 -2
- package/dist/types/types.d.ts.map +1 -1
- package/dist/types/utils/address.d.ts +3 -0
- package/dist/types/utils/address.d.ts.map +1 -0
- package/dist/types/utils/isZeroAddress.d.ts +4 -0
- package/dist/types/utils/isZeroAddress.d.ts.map +1 -0
- package/dist/types/utils/multicall3Abi.d.ts +3 -0
- package/dist/types/utils/multicall3Abi.d.ts.map +1 -0
- package/dist/types/utils/stripHexPrefix.d.ts +2 -0
- package/dist/types/utils/stripHexPrefix.d.ts.map +1 -0
- package/dist/types/version.d.ts +1 -1
- package/package.json +2 -2
- package/src/actions/getMulticallAddress.ts +11 -0
- package/src/actions/getTronBalance.ts +100 -62
- package/src/actions/resolveTronAddress.ts +3 -5
- package/src/core/TronStepExecutor.ts +26 -6
- package/src/core/constants.ts +2 -0
- package/src/core/tasks/TronCheckAllowanceTask.ts +61 -0
- package/src/core/tasks/TronSetAllowanceTask.ts +131 -0
- package/src/core/tasks/TronSignAndExecuteTask.ts +35 -15
- package/src/core/tasks/TronWaitForTransactionTask.ts +28 -18
- package/src/errors/parseTronErrors.ts +20 -0
- package/src/rpc/callTronRpcsWithRetry.ts +24 -0
- package/src/types.ts +5 -2
- package/src/utils/address.ts +14 -0
- package/src/utils/isZeroAddress.ts +5 -0
- package/src/utils/multicall3Abi.ts +39 -0
- package/src/utils/stripHexPrefix.ts +2 -0
- package/src/version.ts +1 -1
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.callTronRpcsWithRetry = callTronRpcsWithRetry;
|
|
4
|
+
const sdk_1 = require("@lifi/sdk");
|
|
5
|
+
const tronweb_1 = require("tronweb");
|
|
6
|
+
async function callTronRpcsWithRetry(client, fn) {
|
|
7
|
+
const urls = await client.getRpcUrlsByChainId(sdk_1.ChainId.TRN);
|
|
8
|
+
if (!urls.length) {
|
|
9
|
+
throw new Error('No Tron RPC URLs available');
|
|
10
|
+
}
|
|
11
|
+
const errors = [];
|
|
12
|
+
for (const url of urls) {
|
|
13
|
+
try {
|
|
14
|
+
return await fn(new tronweb_1.TronWeb({ fullHost: url }));
|
|
15
|
+
}
|
|
16
|
+
catch (error) {
|
|
17
|
+
errors.push(error instanceof Error ? error : new Error(String(error)));
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
throw new AggregateError(errors, `All ${urls.length} Tron RPCs failed`);
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=callTronRpcsWithRetry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"callTronRpcsWithRetry.js","sourceRoot":"","sources":["../../../src/rpc/callTronRpcsWithRetry.ts"],"names":[],"mappings":";;AAGA,sDAoBC;AAvBD,mCAAmD;AACnD,qCAAiC;AAE1B,KAAK,UAAU,qBAAqB,CACzC,MAAiB,EACjB,EAAoC;IAEpC,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,aAAO,CAAC,GAAG,CAAC,CAAA;IAE1D,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAA;IAC/C,CAAC;IAED,MAAM,MAAM,GAAY,EAAE,CAAA;IAC1B,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,CAAC;YACH,OAAO,MAAM,EAAE,CAAC,IAAI,iBAAO,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC,CAAA;QACjD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,IAAI,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;QACxE,CAAC;IACH,CAAC;IAED,MAAM,IAAI,cAAc,CAAC,MAAM,EAAE,OAAO,IAAI,CAAC,MAAM,mBAAmB,CAAC,CAAA;AACzE,CAAC"}
|
package/dist/cjs/types.d.ts
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { type LiFiStepExtended, type SDKProvider, type StepExecutorContext, type StepExecutorOptions } from '@lifi/sdk';
|
|
2
|
-
import type { Adapter } from '@tronweb3/tronwallet-abstract-adapter';
|
|
3
|
-
import type { SignedTransaction } from 'tronweb/lib/esm/types/Transaction';
|
|
2
|
+
import type { Adapter, SignedTransaction } from '@tronweb3/tronwallet-abstract-adapter';
|
|
4
3
|
export interface TronProviderOptions {
|
|
5
4
|
getWallet?: () => Promise<Adapter>;
|
|
6
5
|
}
|
|
7
6
|
export interface TronTaskContext {
|
|
8
7
|
signedTransaction?: SignedTransaction;
|
|
8
|
+
hasSufficientAllowance?: boolean;
|
|
9
9
|
}
|
|
10
10
|
export interface TronStepExecutorContext extends StepExecutorContext, TronTaskContext {
|
|
11
11
|
wallet: Adapter;
|
package/dist/cjs/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":";;AAgCA,wCAIC;AApCD,mCAMkB;AA0BlB,SAAgB,cAAc,CAC5B,QAAqB;IAErB,OAAO,QAAQ,CAAC,IAAI,KAAK,eAAS,CAAC,GAAG,CAAA;AACxC,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.toEvmHex = toEvmHex;
|
|
4
|
+
exports.encodeAddressCalldata = encodeAddressCalldata;
|
|
5
|
+
const tronweb_1 = require("tronweb");
|
|
6
|
+
function toEvmHex(tronAddress) {
|
|
7
|
+
return tronweb_1.TronWeb.address.toHex(tronAddress).replace(/^41/, '0x');
|
|
8
|
+
}
|
|
9
|
+
function encodeAddressCalldata(selector, address) {
|
|
10
|
+
const addr = address.replace(/^0x/, '').padStart(64, '0');
|
|
11
|
+
return `0x${selector}${addr}`;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=address.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"address.js","sourceRoot":"","sources":["../../../src/utils/address.ts"],"names":[],"mappings":";;AAEA,4BAEC;AAED,sDAOC;AAbD,qCAAiC;AAEjC,SAAgB,QAAQ,CAAC,WAAmB;IAC1C,OAAO,iBAAO,CAAC,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA;AAChE,CAAC;AAED,SAAgB,qBAAqB,CACnC,QAAgB,EAChB,OAAe;IAGf,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,EAAE,EAAE,GAAG,CAAC,CAAA;IACzD,OAAO,KAAK,QAAQ,GAAG,IAAI,EAAE,CAAA;AAC/B,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.isZeroAddress = exports.TronAddressZero = exports.AddressZero = void 0;
|
|
4
|
+
exports.AddressZero = '0x0000000000000000000000000000000000000000';
|
|
5
|
+
exports.TronAddressZero = 'T9yD14Nj9j7xAB4dbGeiX9h8unkKHxuWwb';
|
|
6
|
+
const isZeroAddress = (address) => address === exports.AddressZero || address === exports.TronAddressZero;
|
|
7
|
+
exports.isZeroAddress = isZeroAddress;
|
|
8
|
+
//# sourceMappingURL=isZeroAddress.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"isZeroAddress.js","sourceRoot":"","sources":["../../../src/utils/isZeroAddress.ts"],"names":[],"mappings":";;;AAAa,QAAA,WAAW,GAAG,4CAA4C,CAAA;AAC1D,QAAA,eAAe,GAAG,oCAAoC,CAAA;AAE5D,MAAM,aAAa,GAAG,CAAC,OAAe,EAAW,EAAE,CACxD,OAAO,KAAK,mBAAW,IAAI,OAAO,KAAK,uBAAe,CAAA;AAD3C,QAAA,aAAa,iBAC8B"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.multicall3Abi = void 0;
|
|
4
|
+
exports.multicall3Abi = [
|
|
5
|
+
{
|
|
6
|
+
inputs: [
|
|
7
|
+
{
|
|
8
|
+
components: [
|
|
9
|
+
{ internalType: 'address', name: 'target', type: 'address' },
|
|
10
|
+
{ internalType: 'bool', name: 'allowFailure', type: 'bool' },
|
|
11
|
+
{ internalType: 'bytes', name: 'callData', type: 'bytes' },
|
|
12
|
+
],
|
|
13
|
+
internalType: 'struct Multicall3.Call3[]',
|
|
14
|
+
name: 'calls',
|
|
15
|
+
type: 'tuple[]',
|
|
16
|
+
},
|
|
17
|
+
],
|
|
18
|
+
name: 'aggregate3',
|
|
19
|
+
outputs: [
|
|
20
|
+
{
|
|
21
|
+
components: [
|
|
22
|
+
{ internalType: 'bool', name: 'success', type: 'bool' },
|
|
23
|
+
{ internalType: 'bytes', name: 'returnData', type: 'bytes' },
|
|
24
|
+
],
|
|
25
|
+
internalType: 'struct Multicall3.Result[]',
|
|
26
|
+
name: 'returnData',
|
|
27
|
+
type: 'tuple[]',
|
|
28
|
+
},
|
|
29
|
+
],
|
|
30
|
+
stateMutability: 'view',
|
|
31
|
+
type: 'function',
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
inputs: [{ internalType: 'address', name: 'addr', type: 'address' }],
|
|
35
|
+
name: 'getEthBalance',
|
|
36
|
+
outputs: [{ internalType: 'uint256', name: 'balance', type: 'uint256' }],
|
|
37
|
+
stateMutability: 'view',
|
|
38
|
+
type: 'function',
|
|
39
|
+
},
|
|
40
|
+
];
|
|
41
|
+
//# sourceMappingURL=multicall3Abi.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"multicall3Abi.js","sourceRoot":"","sources":["../../../src/utils/multicall3Abi.ts"],"names":[],"mappings":";;;AAEa,QAAA,aAAa,GAA+B;IACvD;QACE,MAAM,EAAE;YACN;gBACE,UAAU,EAAE;oBACV,EAAE,YAAY,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE;oBAC5D,EAAE,YAAY,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,EAAE;oBAC5D,EAAE,YAAY,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE;iBAC3D;gBACD,YAAY,EAAE,2BAA2B;gBACzC,IAAI,EAAE,OAAO;gBACb,IAAI,EAAE,SAAS;aAChB;SACF;QACD,IAAI,EAAE,YAAY;QAClB,OAAO,EAAE;YACP;gBACE,UAAU,EAAE;oBACV,EAAE,YAAY,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE;oBACvD,EAAE,YAAY,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,OAAO,EAAE;iBAC7D;gBACD,YAAY,EAAE,4BAA4B;gBAC1C,IAAI,EAAE,YAAY;gBAClB,IAAI,EAAE,SAAS;aAChB;SACF;QACD,eAAe,EAAE,MAAM;QACvB,IAAI,EAAE,UAAU;KACjB;IACD;QACE,MAAM,EAAE,CAAC,EAAE,YAAY,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;QACpE,IAAI,EAAE,eAAe;QACrB,OAAO,EAAE,CAAC,EAAE,YAAY,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;QACxE,eAAe,EAAE,MAAM;QACvB,IAAI,EAAE,UAAU;KACjB;CACF,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const stripHexPrefix: (value: string) => string;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stripHexPrefix.js","sourceRoot":"","sources":["../../../src/utils/stripHexPrefix.ts"],"names":[],"mappings":";;;AAAO,MAAM,cAAc,GAAG,CAAC,KAAa,EAAU,EAAE,CACtD,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;AADb,QAAA,cAAc,kBACD"}
|
package/dist/cjs/version.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
export declare const name = "@lifi/sdk-provider-tron";
|
|
2
|
-
export declare const version = "4.0.0-alpha.
|
|
2
|
+
export declare const version = "4.0.0-alpha.23";
|
package/dist/cjs/version.js
CHANGED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { ChainType } from '@lifi/sdk';
|
|
2
|
+
export const getMulticallAddress = async (client, chainId) => {
|
|
3
|
+
const chains = await client.getChains();
|
|
4
|
+
return chains?.find((chain) => chain.id === chainId && chain.chainType === ChainType.TVM)?.multicallAddress;
|
|
5
|
+
};
|
|
6
|
+
//# sourceMappingURL=getMulticallAddress.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getMulticallAddress.js","sourceRoot":"","sources":["../../../src/actions/getMulticallAddress.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,SAAS,EAAkB,MAAM,WAAW,CAAA;AAEnE,MAAM,CAAC,MAAM,mBAAmB,GAAG,KAAK,EACtC,MAAiB,EACjB,OAAgB,EACa,EAAE;IAC/B,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,SAAS,EAAE,CAAA;IACvC,OAAO,MAAM,EAAE,IAAI,CACjB,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,OAAO,IAAI,KAAK,CAAC,SAAS,KAAK,SAAS,CAAC,GAAG,CACrE,EAAE,gBAAgB,CAAA;AACrB,CAAC,CAAA"}
|
|
@@ -1,5 +1,12 @@
|
|
|
1
1
|
import { withDedupe } from '@lifi/sdk';
|
|
2
2
|
import { TronWeb } from 'tronweb';
|
|
3
|
+
import { callTronRpcsWithRetry } from '../rpc/callTronRpcsWithRetry.js';
|
|
4
|
+
import { encodeAddressCalldata, toEvmHex } from '../utils/address.js';
|
|
5
|
+
import { isZeroAddress } from '../utils/isZeroAddress.js';
|
|
6
|
+
import { multicall3Abi } from '../utils/multicall3Abi.js';
|
|
7
|
+
import { getMulticallAddress } from './getMulticallAddress.js';
|
|
8
|
+
const BALANCE_OF_SELECTOR = TronWeb.sha3('balanceOf(address)').slice(2, 10);
|
|
9
|
+
const GET_ETH_BALANCE_SELECTOR = TronWeb.sha3('getEthBalance(address)').slice(2, 10);
|
|
3
10
|
export const getTronBalance = async (client, walletAddress, tokens) => {
|
|
4
11
|
if (tokens.length === 0) {
|
|
5
12
|
return [];
|
|
@@ -10,62 +17,75 @@ export const getTronBalance = async (client, walletAddress, tokens) => {
|
|
|
10
17
|
console.warn('Requested tokens have to be on the same chain.');
|
|
11
18
|
}
|
|
12
19
|
}
|
|
20
|
+
const multicallAddress = await getMulticallAddress(client, chainId);
|
|
21
|
+
if (multicallAddress && tokens.length > 1) {
|
|
22
|
+
return getTronBalanceMulticall(client, tokens, walletAddress, multicallAddress);
|
|
23
|
+
}
|
|
13
24
|
return getTronBalanceDefault(client, tokens, walletAddress);
|
|
14
25
|
};
|
|
26
|
+
const getTronBalanceMulticall = async (client, tokens, walletAddress, multicallAddress) => {
|
|
27
|
+
const walletHex = toEvmHex(walletAddress);
|
|
28
|
+
const multicallHex = toEvmHex(multicallAddress);
|
|
29
|
+
const [blockNumber, results] = await callTronRpcsWithRetry(client, async (tronWeb) => {
|
|
30
|
+
const contract = tronWeb.contract(multicall3Abi, multicallAddress);
|
|
31
|
+
// TronWeb encodes tuples positionally: [target, allowFailure, callData]
|
|
32
|
+
const calls = tokens.map((token) => {
|
|
33
|
+
const isNative = isZeroAddress(token.address);
|
|
34
|
+
return [
|
|
35
|
+
isNative ? multicallHex : toEvmHex(token.address),
|
|
36
|
+
true,
|
|
37
|
+
encodeAddressCalldata(isNative ? GET_ETH_BALANCE_SELECTOR : BALANCE_OF_SELECTOR, walletHex),
|
|
38
|
+
];
|
|
39
|
+
});
|
|
40
|
+
const [block, aggregateResult] = await Promise.all([
|
|
41
|
+
tronWeb.trx.getCurrentBlock(),
|
|
42
|
+
contract.aggregate3(calls).call({ from: walletAddress }),
|
|
43
|
+
]);
|
|
44
|
+
return [
|
|
45
|
+
BigInt(block.block_header?.raw_data?.number ?? 0),
|
|
46
|
+
// TronWeb wraps the single return value in an extra array
|
|
47
|
+
aggregateResult[0],
|
|
48
|
+
];
|
|
49
|
+
});
|
|
50
|
+
return tokens.map((token, i) => {
|
|
51
|
+
const [success, returnData] = results[i];
|
|
52
|
+
if (!success) {
|
|
53
|
+
return { ...token, blockNumber };
|
|
54
|
+
}
|
|
55
|
+
return { ...token, amount: BigInt(returnData), blockNumber };
|
|
56
|
+
});
|
|
57
|
+
};
|
|
15
58
|
const getTronBalanceDefault = async (client, tokens, walletAddress) => {
|
|
16
|
-
const
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
id: `${getTronBalanceDefault.name}.getBalance`,
|
|
22
|
-
}),
|
|
23
|
-
withDedupe(() => tronWeb.trx.getCurrentBlock(), {
|
|
24
|
-
id: `${getTronBalanceDefault.name}.getCurrentBlock`,
|
|
25
|
-
}),
|
|
26
|
-
]);
|
|
27
|
-
const nativeBalance = trxBalance.status === 'fulfilled' ? BigInt(trxBalance.value) : 0n;
|
|
28
|
-
const blockNumber = currentBlock.status === 'fulfilled'
|
|
29
|
-
? BigInt(currentBlock.value.block_header?.raw_data?.number ?? 0)
|
|
30
|
-
: 0n;
|
|
31
|
-
const walletTokenAmounts = {};
|
|
32
|
-
// Identify native TRX tokens by checking for the zero address pattern
|
|
33
|
-
const nativeTokens = tokens.filter((token) => token.address === 'T9yD14Nj9j7xAB4dbGeiX9h8unkKHxuWwb' ||
|
|
34
|
-
token.address === '0x0000000000000000000000000000000000000000');
|
|
35
|
-
const trc20Tokens = tokens.filter((token) => token.address !== 'T9yD14Nj9j7xAB4dbGeiX9h8unkKHxuWwb' &&
|
|
36
|
-
token.address !== '0x0000000000000000000000000000000000000000');
|
|
37
|
-
for (const token of nativeTokens) {
|
|
38
|
-
walletTokenAmounts[token.address] = nativeBalance;
|
|
39
|
-
}
|
|
40
|
-
if (trc20Tokens.length > 0) {
|
|
41
|
-
const trc20Balances = await Promise.allSettled(trc20Tokens.map((token) => withDedupe(async () => {
|
|
42
|
-
const contract = await tronWeb.contract().at(token.address);
|
|
43
|
-
const balance = await contract.balanceOf(walletAddress).call();
|
|
44
|
-
return {
|
|
45
|
-
address: token.address,
|
|
46
|
-
balance: BigInt(balance.toString()),
|
|
47
|
-
};
|
|
48
|
-
}, {
|
|
49
|
-
id: `${getTronBalanceDefault.name}.balanceOf.${token.address}`,
|
|
50
|
-
})));
|
|
51
|
-
for (const result of trc20Balances) {
|
|
52
|
-
if (result.status === 'fulfilled' && result.value.balance > 0n) {
|
|
53
|
-
walletTokenAmounts[result.value.address] = result.value.balance;
|
|
59
|
+
const [blockNumber, results] = await callTronRpcsWithRetry(client, async (tronWeb) => {
|
|
60
|
+
const host = tronWeb.fullNode.host;
|
|
61
|
+
const queue = tokens.map((token) => {
|
|
62
|
+
if (isZeroAddress(token.address)) {
|
|
63
|
+
return withDedupe(async () => BigInt(await tronWeb.trx.getBalance(walletAddress)), { id: `${getTronBalanceDefault.name}.getBalance.${host}` });
|
|
54
64
|
}
|
|
65
|
+
return withDedupe(async () => {
|
|
66
|
+
const contract = await tronWeb.contract().at(token.address);
|
|
67
|
+
const balance = await contract
|
|
68
|
+
.balanceOf(walletAddress)
|
|
69
|
+
.call({ from: walletAddress });
|
|
70
|
+
return BigInt(balance.toString());
|
|
71
|
+
}, {
|
|
72
|
+
id: `${getTronBalanceDefault.name}.balanceOf.${token.address}.${host}`,
|
|
73
|
+
});
|
|
74
|
+
});
|
|
75
|
+
return Promise.all([
|
|
76
|
+
withDedupe(async () => {
|
|
77
|
+
const block = await tronWeb.trx.getCurrentBlock();
|
|
78
|
+
return BigInt(block.block_header?.raw_data?.number ?? 0);
|
|
79
|
+
}, { id: `${getTronBalanceDefault.name}.getCurrentBlock.${host}` }),
|
|
80
|
+
Promise.allSettled(queue),
|
|
81
|
+
]);
|
|
82
|
+
});
|
|
83
|
+
const tokenAmounts = tokens.map((token, index) => {
|
|
84
|
+
const result = results[index];
|
|
85
|
+
if (result.status === 'rejected') {
|
|
86
|
+
return { ...token, blockNumber };
|
|
55
87
|
}
|
|
56
|
-
|
|
57
|
-
const tokenAmounts = tokens.map((token) => {
|
|
58
|
-
if (walletTokenAmounts[token.address]) {
|
|
59
|
-
return {
|
|
60
|
-
...token,
|
|
61
|
-
amount: walletTokenAmounts[token.address],
|
|
62
|
-
blockNumber,
|
|
63
|
-
};
|
|
64
|
-
}
|
|
65
|
-
return {
|
|
66
|
-
...token,
|
|
67
|
-
blockNumber,
|
|
68
|
-
};
|
|
88
|
+
return { ...token, amount: result.value, blockNumber };
|
|
69
89
|
});
|
|
70
90
|
return tokenAmounts;
|
|
71
91
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getTronBalance.js","sourceRoot":"","sources":["../../../src/actions/getTronBalance.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAA;AACtC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;
|
|
1
|
+
{"version":3,"file":"getTronBalance.js","sourceRoot":"","sources":["../../../src/actions/getTronBalance.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare function resolveTronAddress(
|
|
1
|
+
export declare function resolveTronAddress(name: string): Promise<string>;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
export async function resolveTronAddress(
|
|
2
|
-
// Tron does not have a
|
|
3
|
-
return
|
|
1
|
+
export async function resolveTronAddress(name) {
|
|
2
|
+
// Tron does not have a name service, return the address as-is
|
|
3
|
+
return name;
|
|
4
4
|
}
|
|
5
5
|
//# sourceMappingURL=resolveTronAddress.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolveTronAddress.js","sourceRoot":"","sources":["../../../src/actions/resolveTronAddress.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,KAAK,UAAU,kBAAkB,
|
|
1
|
+
{"version":3,"file":"resolveTronAddress.js","sourceRoot":"","sources":["../../../src/actions/resolveTronAddress.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,IAAY;IACnD,8DAA8D;IAC9D,OAAO,IAAI,CAAA;AACb,CAAC"}
|
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
import { BaseStepExecutor, CheckBalanceTask, LiFiErrorCode, PrepareTransactionTask, TaskPipeline, TransactionError, WaitForTransactionStatusTask, } from '@lifi/sdk';
|
|
2
2
|
import { parseTronErrors } from '../errors/parseTronErrors.js';
|
|
3
|
+
import { isZeroAddress } from '../utils/isZeroAddress.js';
|
|
4
|
+
import { TronCheckAllowanceTask } from './tasks/TronCheckAllowanceTask.js';
|
|
5
|
+
import { TronSetAllowanceTask } from './tasks/TronSetAllowanceTask.js';
|
|
3
6
|
import { TronSignAndExecuteTask } from './tasks/TronSignAndExecuteTask.js';
|
|
4
7
|
import { TronWaitForTransactionTask } from './tasks/TronWaitForTransactionTask.js';
|
|
5
8
|
export class TronStepExecutor extends BaseStepExecutor {
|
|
@@ -24,7 +27,10 @@ export class TronStepExecutor extends BaseStepExecutor {
|
|
|
24
27
|
};
|
|
25
28
|
createPipeline = (context) => {
|
|
26
29
|
const { step, isBridgeExecution } = context;
|
|
30
|
+
const isFromNativeToken = isZeroAddress(step.action.fromToken.address);
|
|
27
31
|
const tasks = [
|
|
32
|
+
new TronCheckAllowanceTask(),
|
|
33
|
+
new TronSetAllowanceTask(),
|
|
28
34
|
new CheckBalanceTask(),
|
|
29
35
|
new PrepareTransactionTask(),
|
|
30
36
|
new TronSignAndExecuteTask(),
|
|
@@ -32,9 +38,20 @@ export class TronStepExecutor extends BaseStepExecutor {
|
|
|
32
38
|
new WaitForTransactionStatusTask(isBridgeExecution ? 'RECEIVING_CHAIN' : 'SWAP'),
|
|
33
39
|
];
|
|
34
40
|
const swapOrBridgeAction = this.statusManager.findAction(step, isBridgeExecution ? 'CROSS_CHAIN' : 'SWAP');
|
|
35
|
-
const
|
|
36
|
-
|
|
37
|
-
|
|
41
|
+
const doCheckAllowance = !swapOrBridgeAction?.txHash &&
|
|
42
|
+
!isFromNativeToken &&
|
|
43
|
+
!!step.estimate.approvalAddress &&
|
|
44
|
+
!step.estimate.skipApproval;
|
|
45
|
+
let taskName;
|
|
46
|
+
if (doCheckAllowance) {
|
|
47
|
+
taskName = TronCheckAllowanceTask.name;
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
taskName =
|
|
51
|
+
swapOrBridgeAction?.txHash && swapOrBridgeAction?.status === 'DONE'
|
|
52
|
+
? WaitForTransactionStatusTask.name
|
|
53
|
+
: CheckBalanceTask.name;
|
|
54
|
+
}
|
|
38
55
|
const firstTaskIndex = tasks.findIndex((task) => task.constructor.name === taskName);
|
|
39
56
|
const tasksToRun = tasks.slice(firstTaskIndex);
|
|
40
57
|
return new TaskPipeline(tasksToRun);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TronStepExecutor.js","sourceRoot":"","sources":["../../../src/core/TronStepExecutor.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAEhB,aAAa,EAEb,sBAAsB,EAGtB,YAAY,EACZ,gBAAgB,EAChB,4BAA4B,GAC7B,MAAM,WAAW,CAAA;AAElB,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAA;AAK9D,OAAO,EAAE,sBAAsB,EAAE,MAAM,mCAAmC,CAAA;AAC1E,OAAO,EAAE,0BAA0B,EAAE,MAAM,uCAAuC,CAAA;AAElF,MAAM,OAAO,gBAAiB,SAAQ,gBAAgB;IAC5C,MAAM,CAAS;IAEvB,YAAY,OAAgC;QAC1C,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAA;IAC9B,CAAC;IAED,WAAW,GAAG,CAAC,IAAsB,
|
|
1
|
+
{"version":3,"file":"TronStepExecutor.js","sourceRoot":"","sources":["../../../src/core/TronStepExecutor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../src/core/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,qBAAqB,GAAG,IAAI,CAAA;AACzC,MAAM,CAAC,MAAM,qBAAqB,GAAG,EAAE,CAAA"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { BaseStepExecutionTask, type TaskResult } from '@lifi/sdk';
|
|
2
|
+
import type { TronStepExecutorContext } from '../../types.js';
|
|
3
|
+
export declare class TronCheckAllowanceTask extends BaseStepExecutionTask {
|
|
4
|
+
shouldRun(context: TronStepExecutorContext): Promise<boolean>;
|
|
5
|
+
run(context: TronStepExecutorContext): Promise<TaskResult>;
|
|
6
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { BaseStepExecutionTask, LiFiErrorCode, TransactionError, } from '@lifi/sdk';
|
|
2
|
+
import { callTronRpcsWithRetry } from '../../rpc/callTronRpcsWithRetry.js';
|
|
3
|
+
export class TronCheckAllowanceTask extends BaseStepExecutionTask {
|
|
4
|
+
async shouldRun(context) {
|
|
5
|
+
return !context.hasSufficientAllowance;
|
|
6
|
+
}
|
|
7
|
+
async run(context) {
|
|
8
|
+
const { step, client, wallet, statusManager } = context;
|
|
9
|
+
const action = statusManager.initializeAction({
|
|
10
|
+
step,
|
|
11
|
+
type: 'CHECK_ALLOWANCE',
|
|
12
|
+
chainId: step.action.fromChainId,
|
|
13
|
+
status: 'STARTED',
|
|
14
|
+
});
|
|
15
|
+
if (!wallet.address) {
|
|
16
|
+
throw new TransactionError(LiFiErrorCode.WalletChangedDuringExecution, 'Wallet address is not available. Wallet may have been disconnected.');
|
|
17
|
+
}
|
|
18
|
+
if (!step.estimate.approvalAddress) {
|
|
19
|
+
throw new TransactionError(LiFiErrorCode.TransactionUnprepared, 'Approval address is not available.');
|
|
20
|
+
}
|
|
21
|
+
const ownerAddress = wallet.address;
|
|
22
|
+
const tokenAddress = step.action.fromToken.address;
|
|
23
|
+
const spenderAddress = step.estimate.approvalAddress;
|
|
24
|
+
const fromAmount = BigInt(step.action.fromAmount);
|
|
25
|
+
const allowance = await callTronRpcsWithRetry(client, async (tronWeb) => {
|
|
26
|
+
const contract = await tronWeb.contract().at(tokenAddress);
|
|
27
|
+
const result = await contract
|
|
28
|
+
.allowance(ownerAddress, spenderAddress)
|
|
29
|
+
.call({ from: ownerAddress });
|
|
30
|
+
return BigInt(result.toString());
|
|
31
|
+
});
|
|
32
|
+
statusManager.updateAction(step, action.type, 'DONE');
|
|
33
|
+
return {
|
|
34
|
+
status: 'COMPLETED',
|
|
35
|
+
context: {
|
|
36
|
+
hasSufficientAllowance: fromAmount <= allowance,
|
|
37
|
+
},
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=TronCheckAllowanceTask.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TronCheckAllowanceTask.js","sourceRoot":"","sources":["../../../../src/core/tasks/TronCheckAllowanceTask.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EACrB,aAAa,EAEb,gBAAgB,GACjB,MAAM,WAAW,CAAA;AAClB,OAAO,EAAE,qBAAqB,EAAE,MAAM,oCAAoC,CAAA;AAG1E,MAAM,OAAO,sBAAuB,SAAQ,qBAAqB;IACtD,KAAK,CAAC,SAAS,CAAC,OAAgC;QACvD,OAAO,CAAC,OAAO,CAAC,sBAAsB,CAAA;IACxC,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,OAAgC;QACxC,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,GAAG,OAAO,CAAA;QAEvD,MAAM,MAAM,GAAG,aAAa,CAAC,gBAAgB,CAAC;YAC5C,IAAI;YACJ,IAAI,EAAE,iBAAiB;YACvB,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW;YAChC,MAAM,EAAE,SAAS;SAClB,CAAC,CAAA;QAEF,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,MAAM,IAAI,gBAAgB,CACxB,aAAa,CAAC,4BAA4B,EAC1C,qEAAqE,CACtE,CAAA;QACH,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,eAAe,EAAE,CAAC;YACnC,MAAM,IAAI,gBAAgB,CACxB,aAAa,CAAC,qBAAqB,EACnC,oCAAoC,CACrC,CAAA;QACH,CAAC;QAED,MAAM,YAAY,GAAG,MAAM,CAAC,OAAO,CAAA;QACnC,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAA;QAClD,MAAM,cAAc,GAAG,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAA;QACpD,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAA;QAEjD,MAAM,SAAS,GAAG,MAAM,qBAAqB,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;YACtE,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC,YAAY,CAAC,CAAA;YAC1D,MAAM,MAAM,GAAG,MAAM,QAAQ;iBAC1B,SAAS,CAAC,YAAY,EAAE,cAAc,CAAC;iBACvC,IAAI,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,CAAA;YAC/B,OAAO,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAA;QAClC,CAAC,CAAC,CAAA;QAEF,aAAa,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;QAErD,OAAO;YACL,MAAM,EAAE,WAAW;YACnB,OAAO,EAAE;gBACP,sBAAsB,EAAE,UAAU,IAAI,SAAS;aAChD;SACF,CAAA;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { BaseStepExecutionTask, type TaskResult } from '@lifi/sdk';
|
|
2
|
+
import type { TronStepExecutorContext } from '../../types.js';
|
|
3
|
+
export declare class TronSetAllowanceTask extends BaseStepExecutionTask {
|
|
4
|
+
shouldRun(context: TronStepExecutorContext): Promise<boolean>;
|
|
5
|
+
run(context: TronStepExecutorContext): Promise<TaskResult>;
|
|
6
|
+
}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { BaseStepExecutionTask, LiFiErrorCode, TransactionError, waitForResult, } from '@lifi/sdk';
|
|
2
|
+
import { callTronRpcsWithRetry } from '../../rpc/callTronRpcsWithRetry.js';
|
|
3
|
+
import { stripHexPrefix } from '../../utils/stripHexPrefix.js';
|
|
4
|
+
import { TRON_POLL_INTERVAL_MS, TRON_POLL_MAX_RETRIES } from '../constants.js';
|
|
5
|
+
const DEFAULT_APPROVE_FEE_LIMIT = 100_000_000;
|
|
6
|
+
export class TronSetAllowanceTask extends BaseStepExecutionTask {
|
|
7
|
+
async shouldRun(context) {
|
|
8
|
+
return !context.hasSufficientAllowance;
|
|
9
|
+
}
|
|
10
|
+
async run(context) {
|
|
11
|
+
const { step, client, wallet, statusManager, fromChain } = context;
|
|
12
|
+
const action = statusManager.initializeAction({
|
|
13
|
+
step,
|
|
14
|
+
type: 'SET_ALLOWANCE',
|
|
15
|
+
chainId: step.action.fromChainId,
|
|
16
|
+
status: 'STARTED',
|
|
17
|
+
});
|
|
18
|
+
statusManager.updateAction(step, action.type, 'ACTION_REQUIRED');
|
|
19
|
+
if (!wallet.address) {
|
|
20
|
+
throw new TransactionError(LiFiErrorCode.WalletChangedDuringExecution, 'Wallet address is not available. Wallet may have been disconnected.');
|
|
21
|
+
}
|
|
22
|
+
if (!step.estimate.approvalAddress) {
|
|
23
|
+
throw new TransactionError(LiFiErrorCode.TransactionUnprepared, 'Approval address is not available.');
|
|
24
|
+
}
|
|
25
|
+
const tokenAddress = step.action.fromToken.address;
|
|
26
|
+
const spenderAddress = step.estimate.approvalAddress;
|
|
27
|
+
const ownerAddress = wallet.address;
|
|
28
|
+
const approveAmount = BigInt(step.action.fromAmount).toString();
|
|
29
|
+
const approveGasCost = step.estimate.gasCosts?.find((gc) => gc.type === 'APPROVE');
|
|
30
|
+
const feeLimit = approveGasCost?.limit
|
|
31
|
+
? parseInt(approveGasCost.limit, 10)
|
|
32
|
+
: DEFAULT_APPROVE_FEE_LIMIT;
|
|
33
|
+
const transaction = await callTronRpcsWithRetry(client, async (tronWeb) => {
|
|
34
|
+
const { transaction } = await tronWeb.transactionBuilder.triggerSmartContract(tokenAddress, 'approve(address,uint256)', { feeLimit }, [
|
|
35
|
+
{ type: 'address', value: spenderAddress },
|
|
36
|
+
{ type: 'uint256', value: approveAmount },
|
|
37
|
+
], ownerAddress);
|
|
38
|
+
return transaction;
|
|
39
|
+
});
|
|
40
|
+
const signedTransaction = await wallet.signTransaction(transaction);
|
|
41
|
+
statusManager.updateAction(step, action.type, 'PENDING');
|
|
42
|
+
const broadcastResult = await callTronRpcsWithRetry(client, async (tronWeb) => {
|
|
43
|
+
const result = await tronWeb.trx.sendRawTransaction(signedTransaction);
|
|
44
|
+
if (!result.result && String(result.code) !== 'DUP_TRANSACTION_ERROR') {
|
|
45
|
+
throw new TransactionError(LiFiErrorCode.TransactionFailed, `Approval broadcast failed: ${result.code || 'Unknown error'}`);
|
|
46
|
+
}
|
|
47
|
+
return result;
|
|
48
|
+
});
|
|
49
|
+
const txHash = stripHexPrefix(broadcastResult.transaction.txID);
|
|
50
|
+
statusManager.updateAction(step, action.type, 'PENDING', {
|
|
51
|
+
txHash,
|
|
52
|
+
txLink: `${fromChain.metamask.blockExplorerUrls[0]}#/transaction/${txHash}`,
|
|
53
|
+
});
|
|
54
|
+
// Wait for confirmation
|
|
55
|
+
await waitForResult(async () => {
|
|
56
|
+
const txInfo = await callTronRpcsWithRetry(client, (tronWeb) => tronWeb.trx.getTransactionInfo(txHash));
|
|
57
|
+
if (txInfo?.id) {
|
|
58
|
+
if (txInfo.receipt?.result === 'FAILED') {
|
|
59
|
+
throw new TransactionError(LiFiErrorCode.TransactionFailed, 'Approval transaction failed on-chain.');
|
|
60
|
+
}
|
|
61
|
+
return txInfo;
|
|
62
|
+
}
|
|
63
|
+
return undefined;
|
|
64
|
+
}, TRON_POLL_INTERVAL_MS, TRON_POLL_MAX_RETRIES);
|
|
65
|
+
statusManager.updateAction(step, action.type, 'DONE', {
|
|
66
|
+
txHash,
|
|
67
|
+
txLink: `${fromChain.metamask.blockExplorerUrls[0]}#/transaction/${txHash}`,
|
|
68
|
+
});
|
|
69
|
+
return {
|
|
70
|
+
status: 'COMPLETED',
|
|
71
|
+
context: { hasSufficientAllowance: true },
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=TronSetAllowanceTask.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TronSetAllowanceTask.js","sourceRoot":"","sources":["../../../../src/core/tasks/TronSetAllowanceTask.ts"],"names":[],"mappings":"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"}
|