@lifi/sdk-provider-tron 4.0.0-beta.7 → 4.0.0-beta.8
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/TronProvider.js.map +1 -1
- package/dist/cjs/actions/getMulticallAddress.js.map +1 -1
- package/dist/cjs/actions/getTronBalance.js.map +1 -1
- package/dist/cjs/core/TronStepExecutor.js.map +1 -1
- package/dist/cjs/core/tasks/TronCheckAllowanceTask.js.map +1 -1
- package/dist/cjs/core/tasks/TronSetAllowanceTask.js.map +1 -1
- package/dist/cjs/core/tasks/TronSignAndExecuteTask.js +11 -11
- package/dist/cjs/core/tasks/TronSignAndExecuteTask.js.map +1 -1
- package/dist/cjs/core/tasks/TronWaitForTransactionTask.js.map +1 -1
- package/dist/cjs/errors/parseTronErrors.js.map +1 -1
- package/dist/cjs/utils/address.js.map +1 -1
- package/dist/cjs/version.d.ts +1 -1
- package/dist/cjs/version.js +1 -1
- package/dist/cjs/version.js.map +1 -1
- package/dist/esm/TronProvider.js.map +1 -1
- package/dist/esm/actions/getMulticallAddress.js.map +1 -1
- package/dist/esm/actions/getTronBalance.js.map +1 -1
- package/dist/esm/core/TronStepExecutor.js.map +1 -1
- package/dist/esm/core/tasks/TronCheckAllowanceTask.js.map +1 -1
- package/dist/esm/core/tasks/TronSetAllowanceTask.js.map +1 -1
- package/dist/esm/core/tasks/TronSignAndExecuteTask.d.ts.map +1 -1
- package/dist/esm/core/tasks/TronSignAndExecuteTask.js +11 -11
- package/dist/esm/core/tasks/TronSignAndExecuteTask.js.map +1 -1
- package/dist/esm/core/tasks/TronWaitForTransactionTask.js.map +1 -1
- package/dist/esm/errors/parseTronErrors.js.map +1 -1
- package/dist/esm/utils/address.js.map +1 -1
- package/dist/esm/version.d.ts +1 -1
- package/dist/esm/version.js +1 -1
- package/dist/esm/version.js.map +1 -1
- package/package.json +4 -4
- package/src/core/tasks/TronSignAndExecuteTask.ts +27 -22
- package/src/version.ts +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TronProvider.js","names":["ChainType","TronWeb","resolveTronAddress","getTronBalance","ProviderError","LiFiErrorCode","TronStepExecutor"],"sources":["../../src/TronProvider.ts"],"sourcesContent":["import {\n ChainType,\n LiFiErrorCode,\n ProviderError,\n type StepExecutorOptions,\n} from '@lifi/sdk'\nimport { TronWeb } from 'tronweb'\nimport { getTronBalance } from './actions/getTronBalance.js'\nimport { resolveTronAddress } from './actions/resolveTronAddress.js'\nimport { TronStepExecutor } from './core/TronStepExecutor.js'\nimport type { TronProviderOptions, TronSDKProvider } from './types.js'\n\nexport function TronProvider(options?: TronProviderOptions): TronSDKProvider {\n const _options: TronProviderOptions = options ?? {}\n return {\n get type() {\n return ChainType.TVM\n },\n isAddress: (address: string) => TronWeb.isAddress(address),\n resolveAddress: resolveTronAddress,\n getBalance: (client, walletAddress, tokens) =>\n getTronBalance(\n client,\n walletAddress,\n tokens,\n _options.multicallBatchSize\n ),\n async getStepExecutor(\n options: StepExecutorOptions\n ): Promise<TronStepExecutor> {\n if (!_options.getWallet) {\n throw new ProviderError(\n LiFiErrorCode.ProviderUnavailable,\n 'TronProvider requires a getWallet function.'\n )\n }\n\n const wallet = await _options.getWallet()\n\n const executor = new TronStepExecutor({\n wallet,\n routeId: options.routeId,\n executionOptions: options.executionOptions,\n })\n\n return executor\n },\n setOptions(options: TronProviderOptions) {\n Object.assign(_options, options)\n },\n }\n}\n"],"mappings":";;;;;;;AAYA,SAAgB,aAAa,SAAgD;CAC3E,MAAM,WAAgC,WAAW,EAAE;AACnD,QAAO;EACL,IAAI,OAAO;AACT,UAAOA,UAAAA,UAAU;;EAEnB,YAAY,YAAoBC,QAAAA,QAAQ,UAAU,QAAQ;EAC1D,gBAAgBC,mCAAAA;EAChB,aAAa,QAAQ,eAAe,WAClCC,+BAAAA,eACE,QACA,eACA,QACA,SAAS,mBACV;EACH,MAAM,gBACJ,SAC2B;AAC3B,OAAI,CAAC,SAAS,UACZ,OAAM,IAAIC,UAAAA,cACRC,UAAAA,cAAc,qBACd,8CACD;AAWH,
|
|
1
|
+
{"version":3,"file":"TronProvider.js","names":["ChainType","TronWeb","resolveTronAddress","getTronBalance","ProviderError","LiFiErrorCode","TronStepExecutor"],"sources":["../../src/TronProvider.ts"],"sourcesContent":["import {\n ChainType,\n LiFiErrorCode,\n ProviderError,\n type StepExecutorOptions,\n} from '@lifi/sdk'\nimport { TronWeb } from 'tronweb'\nimport { getTronBalance } from './actions/getTronBalance.js'\nimport { resolveTronAddress } from './actions/resolveTronAddress.js'\nimport { TronStepExecutor } from './core/TronStepExecutor.js'\nimport type { TronProviderOptions, TronSDKProvider } from './types.js'\n\nexport function TronProvider(options?: TronProviderOptions): TronSDKProvider {\n const _options: TronProviderOptions = options ?? {}\n return {\n get type() {\n return ChainType.TVM\n },\n isAddress: (address: string) => TronWeb.isAddress(address),\n resolveAddress: resolveTronAddress,\n getBalance: (client, walletAddress, tokens) =>\n getTronBalance(\n client,\n walletAddress,\n tokens,\n _options.multicallBatchSize\n ),\n async getStepExecutor(\n options: StepExecutorOptions\n ): Promise<TronStepExecutor> {\n if (!_options.getWallet) {\n throw new ProviderError(\n LiFiErrorCode.ProviderUnavailable,\n 'TronProvider requires a getWallet function.'\n )\n }\n\n const wallet = await _options.getWallet()\n\n const executor = new TronStepExecutor({\n wallet,\n routeId: options.routeId,\n executionOptions: options.executionOptions,\n })\n\n return executor\n },\n setOptions(options: TronProviderOptions) {\n Object.assign(_options, options)\n },\n }\n}\n"],"mappings":";;;;;;;AAYA,SAAgB,aAAa,SAAgD;CAC3E,MAAM,WAAgC,WAAW,EAAE;AACnD,QAAO;EACL,IAAI,OAAO;AACT,UAAOA,UAAAA,UAAU;;EAEnB,YAAY,YAAoBC,QAAAA,QAAQ,UAAU,QAAQ;EAC1D,gBAAgBC,mCAAAA;EAChB,aAAa,QAAQ,eAAe,WAClCC,+BAAAA,eACE,QACA,eACA,QACA,SAAS,mBACV;EACH,MAAM,gBACJ,SAC2B;AAC3B,OAAI,CAAC,SAAS,UACZ,OAAM,IAAIC,UAAAA,cACRC,UAAAA,cAAc,qBACd,8CACD;AAWH,UAAO,IANcC,8BAAAA,iBAAiB;IACpC,QAAA,MAHmB,SAAS,WAAW;IAIvC,SAAS,QAAQ;IACjB,kBAAkB,QAAQ;IAC3B,CAEc;;EAEjB,WAAW,SAA8B;AACvC,UAAO,OAAO,UAAU,QAAQ;;EAEnC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getMulticallAddress.js","names":["ChainType"],"sources":["../../../src/actions/getMulticallAddress.ts"],"sourcesContent":["import { type ChainId, ChainType, type SDKClient } from '@lifi/sdk'\n\nexport const getMulticallAddress = async (\n client: SDKClient,\n chainId: ChainId\n): Promise<string | undefined> => {\n const chains = await client.getChains()\n return chains?.find(\n (chain) => chain.id === chainId && chain.chainType === ChainType.TVM\n )?.multicallAddress\n}\n"],"mappings":";;;AAEA,MAAa,sBAAsB,OACjC,QACA,YACgC;AAEhC,
|
|
1
|
+
{"version":3,"file":"getMulticallAddress.js","names":["ChainType"],"sources":["../../../src/actions/getMulticallAddress.ts"],"sourcesContent":["import { type ChainId, ChainType, type SDKClient } from '@lifi/sdk'\n\nexport const getMulticallAddress = async (\n client: SDKClient,\n chainId: ChainId\n): Promise<string | undefined> => {\n const chains = await client.getChains()\n return chains?.find(\n (chain) => chain.id === chainId && chain.chainType === ChainType.TVM\n )?.multicallAddress\n}\n"],"mappings":";;;AAEA,MAAa,sBAAsB,OACjC,QACA,YACgC;AAEhC,SAAO,MADc,OAAO,WAAW,GACxB,MACZ,UAAU,MAAM,OAAO,WAAW,MAAM,cAAcA,UAAAA,UAAU,IAClE,EAAE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getTronBalance.js","names":["TronWeb","getMulticallAddress","toEvmHex","callTronRpcsWithRetry","multicall3Abi","isZeroAddress","encodeAddressCalldata"],"sources":["../../../src/actions/getTronBalance.ts"],"sourcesContent":["import type { SDKClient, Token, TokenAmount } from '@lifi/sdk'\nimport { withDedupe } from '@lifi/sdk'\nimport { TronWeb } from 'tronweb'\nimport { DEFAULT_MULTICALL_BATCH_SIZE } from '../core/constants.js'\nimport { callTronRpcsWithRetry } from '../rpc/callTronRpcsWithRetry.js'\nimport { encodeAddressCalldata, toEvmHex } from '../utils/address.js'\nimport { isZeroAddress } from '../utils/isZeroAddress.js'\nimport { multicall3Abi } from '../utils/multicall3Abi.js'\nimport { getMulticallAddress } from './getMulticallAddress.js'\n\nconst BALANCE_OF_SELECTOR = TronWeb.sha3('balanceOf(address)').slice(2, 10)\nconst GET_ETH_BALANCE_SELECTOR = TronWeb.sha3('getEthBalance(address)').slice(\n 2,\n 10\n)\n\nexport const getTronBalance = async (\n client: SDKClient,\n walletAddress: string,\n tokens: Token[],\n multicallBatchSize: number = DEFAULT_MULTICALL_BATCH_SIZE\n): Promise<TokenAmount[]> => {\n if (tokens.length === 0) {\n return []\n }\n const { chainId } = tokens[0]\n for (const token of tokens) {\n if (token.chainId !== chainId) {\n console.warn('Requested tokens have to be on the same chain.')\n }\n }\n\n const multicallAddress = await getMulticallAddress(client, chainId)\n\n if (multicallAddress && tokens.length > 1) {\n return getTronBalanceMulticall(\n client,\n tokens,\n walletAddress,\n multicallAddress,\n multicallBatchSize\n )\n }\n\n return getTronBalanceDefault(client, tokens, walletAddress)\n}\n\nconst getTronBalanceMulticall = async (\n client: SDKClient,\n tokens: Token[],\n walletAddress: string,\n multicallAddress: string,\n batchSize: number\n): Promise<TokenAmount[]> => {\n const walletHex = toEvmHex(walletAddress)\n const multicallHex = toEvmHex(multicallAddress)\n\n const [blockNumber, results] = await callTronRpcsWithRetry(\n client,\n async (tronWeb) => {\n const contract = tronWeb.contract(multicall3Abi, multicallAddress)\n\n // TronWeb encodes tuples positionally: [target, allowFailure, callData]\n const allCalls = tokens.map((token) => {\n const isNative = isZeroAddress(token.address)\n return [\n isNative ? multicallHex : toEvmHex(token.address),\n true,\n encodeAddressCalldata(\n isNative ? GET_ETH_BALANCE_SELECTOR : BALANCE_OF_SELECTOR,\n walletHex\n ),\n ]\n })\n\n // Chunk calls to avoid CPU timeout on Tron nodes\n const batches: (typeof allCalls)[] = []\n for (let i = 0; i < allCalls.length; i += batchSize) {\n batches.push(allCalls.slice(i, i + batchSize))\n }\n\n const [block, ...batchResults] = await Promise.all([\n tronWeb.trx.getCurrentBlock(),\n ...batches.map((batch, idx) =>\n contract\n .aggregate3(batch)\n .call({ from: walletAddress })\n // TronWeb wraps the single return value in an extra array\n .then((r: unknown[]) => r[0] as Array<[boolean, string]>)\n .catch((error: Error) => {\n console.warn(\n `[getTronBalance] batch ${idx + 1}/${batches.length} failed:`,\n error.message\n )\n return batch.map(() => [false, '0x'] as [boolean, string])\n })\n ),\n ])\n\n const blockNumber = block.block_header?.raw_data?.number\n return [\n blockNumber !== undefined ? BigInt(blockNumber) : undefined,\n batchResults.flat(),\n ]\n }\n )\n\n return tokens.map((token, i) => {\n // Guard against an unexpected length mismatch between tokens and flattened batch results.\n const entry = results[i] as [boolean, string] | undefined\n if (!entry) {\n return { ...token, blockNumber }\n }\n const [success, returnData] = entry\n if (!success) {\n // RPC failure: amount is omitted (undefined)\n // Consumers must treat a missing amount as \"balance unavailable\", not zero.\n return { ...token, blockNumber }\n }\n return { ...token, amount: BigInt(returnData), blockNumber }\n })\n}\n\nconst getTronBalanceDefault = async (\n client: SDKClient,\n tokens: Token[],\n walletAddress: string\n): Promise<TokenAmount[]> => {\n const [blockNumber, results] = await callTronRpcsWithRetry(\n client,\n async (tronWeb) => {\n const host = tronWeb.fullNode.host\n const queue: Promise<bigint>[] = tokens.map((token) => {\n if (isZeroAddress(token.address)) {\n return withDedupe(\n async () => BigInt(await tronWeb.trx.getBalance(walletAddress)),\n { id: `${getTronBalanceDefault.name}.getBalance.${host}` }\n )\n }\n return withDedupe(\n async () => {\n const contract = await tronWeb.contract().at(token.address)\n const balance = await contract\n .balanceOf(walletAddress)\n .call({ from: walletAddress })\n return BigInt(balance.toString())\n },\n {\n id: `${getTronBalanceDefault.name}.balanceOf.${token.address}.${host}`,\n }\n )\n })\n\n return Promise.all([\n withDedupe(\n async (): Promise<bigint | undefined> => {\n const block = await tronWeb.trx.getCurrentBlock()\n const n = block.block_header?.raw_data?.number\n return n !== undefined ? BigInt(n) : undefined\n },\n { id: `${getTronBalanceDefault.name}.getCurrentBlock.${host}` }\n ),\n Promise.allSettled(queue),\n ])\n }\n )\n\n const tokenAmounts: TokenAmount[] = tokens.map((token, index) => {\n const result = results[index]\n if (result.status === 'rejected') {\n // RPC failure: amount is omitted (undefined), matching getSolanaBalance's contract.\n // Consumers must treat a missing amount as \"balance unavailable\", not zero.\n return { ...token, blockNumber }\n }\n return { ...token, amount: result.value, blockNumber }\n })\n\n return tokenAmounts\n}\n"],"mappings":";;;;;;;;;;AAUA,MAAM,sBAAsBA,QAAAA,QAAQ,KAAK,qBAAqB,CAAC,MAAM,GAAG,GAAG;AAC3E,MAAM,2BAA2BA,QAAAA,QAAQ,KAAK,yBAAyB,CAAC,MACtE,GACA,GACD;AAED,MAAa,iBAAiB,OAC5B,QACA,eACA,QACA,qBAAA,OAC2B;AAC3B,KAAI,OAAO,WAAW,EACpB,QAAO,EAAE;CAEX,MAAM,EAAE,YAAY,OAAO;AAC3B,MAAK,MAAM,SAAS,OAClB,KAAI,MAAM,YAAY,QACpB,SAAQ,KAAK,iDAAiD;CAIlE,MAAM,mBAAmB,MAAMC,oCAAAA,oBAAoB,QAAQ,QAAQ;AAEnE,KAAI,oBAAoB,OAAO,SAAS,EACtC,QAAO,wBACL,QACA,QACA,eACA,kBACA,mBACD;AAGH,QAAO,sBAAsB,QAAQ,QAAQ,cAAc;;AAG7D,MAAM,0BAA0B,OAC9B,QACA,QACA,eACA,kBACA,cAC2B;CAC3B,MAAM,YAAYC,sBAAAA,SAAS,cAAc;CACzC,MAAM,eAAeA,sBAAAA,SAAS,iBAAiB;CAE/C,MAAM,CAAC,aAAa,WAAW,MAAMC,kCAAAA,sBACnC,QACA,OAAO,YAAY;EACjB,MAAM,WAAW,QAAQ,SAASC,4BAAAA,eAAe,iBAAiB;EAGlE,MAAM,WAAW,OAAO,KAAK,UAAU;GACrC,MAAM,WAAWC,4BAAAA,cAAc,MAAM,QAAQ;AAC7C,UAAO;IACL,WAAW,eAAeH,sBAAAA,SAAS,MAAM,QAAQ;IACjD;IACAI,sBAAAA,sBACE,WAAW,2BAA2B,qBACtC,UACD;IACF;IACD;EAGF,MAAM,UAA+B,EAAE;AACvC,OAAK,IAAI,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK,UACxC,SAAQ,KAAK,SAAS,MAAM,GAAG,IAAI,UAAU,CAAC;EAGhD,MAAM,CAAC,OAAO,GAAG,gBAAgB,MAAM,QAAQ,IAAI,CACjD,QAAQ,IAAI,iBAAiB,EAC7B,GAAG,QAAQ,KAAK,OAAO,QACrB,SACG,WAAW,MAAM,CACjB,KAAK,EAAE,MAAM,eAAe,CAAC,CAE7B,MAAM,MAAiB,EAAE,GAA+B,CACxD,OAAO,UAAiB;AACvB,WAAQ,KACN,0BAA0B,MAAM,EAAE,GAAG,QAAQ,OAAO,WACpD,MAAM,QACP;AACD,UAAO,MAAM,UAAU,CAAC,OAAO,KAAK,CAAsB;IAC1D,CACL,CACF,CAAC;EAEF,MAAM,cAAc,MAAM,cAAc,UAAU;AAClD,SAAO,CACL,gBAAgB,KAAA,IAAY,OAAO,YAAY,GAAG,KAAA,GAClD,aAAa,MAAM,CACpB;GAEJ;AAED,QAAO,OAAO,KAAK,OAAO,MAAM;EAE9B,MAAM,QAAQ,QAAQ;AACtB,MAAI,CAAC,MACH,QAAO;GAAE,GAAG;GAAO;GAAa;EAElC,MAAM,CAAC,SAAS,cAAc;AAC9B,MAAI,CAAC,QAGH,QAAO;GAAE,GAAG;GAAO;GAAa;AAElC,SAAO;GAAE,GAAG;GAAO,QAAQ,OAAO,WAAW;GAAE;GAAa;GAC5D;;AAGJ,MAAM,wBAAwB,OAC5B,QACA,QACA,kBAC2B;CAC3B,MAAM,CAAC,aAAa,WAAW,MAAMH,kCAAAA,sBACnC,QACA,OAAO,YAAY;EACjB,MAAM,OAAO,QAAQ,SAAS;EAC9B,MAAM,QAA2B,OAAO,KAAK,UAAU;AACrD,OAAIE,4BAAAA,cAAc,MAAM,QAAQ,CAC9B,SAAA,GAAA,UAAA,YACE,YAAY,OAAO,MAAM,QAAQ,IAAI,WAAW,cAAc,CAAC,EAC/D,EAAE,IAAI,GAAG,sBAAsB,KAAK,cAAc,QAAQ,CAC3D;AAEH,WAAA,GAAA,UAAA,YACE,YAAY;IAEV,MAAM,UAAU,
|
|
1
|
+
{"version":3,"file":"getTronBalance.js","names":["TronWeb","getMulticallAddress","toEvmHex","callTronRpcsWithRetry","multicall3Abi","isZeroAddress","encodeAddressCalldata"],"sources":["../../../src/actions/getTronBalance.ts"],"sourcesContent":["import type { SDKClient, Token, TokenAmount } from '@lifi/sdk'\nimport { withDedupe } from '@lifi/sdk'\nimport { TronWeb } from 'tronweb'\nimport { DEFAULT_MULTICALL_BATCH_SIZE } from '../core/constants.js'\nimport { callTronRpcsWithRetry } from '../rpc/callTronRpcsWithRetry.js'\nimport { encodeAddressCalldata, toEvmHex } from '../utils/address.js'\nimport { isZeroAddress } from '../utils/isZeroAddress.js'\nimport { multicall3Abi } from '../utils/multicall3Abi.js'\nimport { getMulticallAddress } from './getMulticallAddress.js'\n\nconst BALANCE_OF_SELECTOR = TronWeb.sha3('balanceOf(address)').slice(2, 10)\nconst GET_ETH_BALANCE_SELECTOR = TronWeb.sha3('getEthBalance(address)').slice(\n 2,\n 10\n)\n\nexport const getTronBalance = async (\n client: SDKClient,\n walletAddress: string,\n tokens: Token[],\n multicallBatchSize: number = DEFAULT_MULTICALL_BATCH_SIZE\n): Promise<TokenAmount[]> => {\n if (tokens.length === 0) {\n return []\n }\n const { chainId } = tokens[0]\n for (const token of tokens) {\n if (token.chainId !== chainId) {\n console.warn('Requested tokens have to be on the same chain.')\n }\n }\n\n const multicallAddress = await getMulticallAddress(client, chainId)\n\n if (multicallAddress && tokens.length > 1) {\n return getTronBalanceMulticall(\n client,\n tokens,\n walletAddress,\n multicallAddress,\n multicallBatchSize\n )\n }\n\n return getTronBalanceDefault(client, tokens, walletAddress)\n}\n\nconst getTronBalanceMulticall = async (\n client: SDKClient,\n tokens: Token[],\n walletAddress: string,\n multicallAddress: string,\n batchSize: number\n): Promise<TokenAmount[]> => {\n const walletHex = toEvmHex(walletAddress)\n const multicallHex = toEvmHex(multicallAddress)\n\n const [blockNumber, results] = await callTronRpcsWithRetry(\n client,\n async (tronWeb) => {\n const contract = tronWeb.contract(multicall3Abi, multicallAddress)\n\n // TronWeb encodes tuples positionally: [target, allowFailure, callData]\n const allCalls = tokens.map((token) => {\n const isNative = isZeroAddress(token.address)\n return [\n isNative ? multicallHex : toEvmHex(token.address),\n true,\n encodeAddressCalldata(\n isNative ? GET_ETH_BALANCE_SELECTOR : BALANCE_OF_SELECTOR,\n walletHex\n ),\n ]\n })\n\n // Chunk calls to avoid CPU timeout on Tron nodes\n const batches: (typeof allCalls)[] = []\n for (let i = 0; i < allCalls.length; i += batchSize) {\n batches.push(allCalls.slice(i, i + batchSize))\n }\n\n const [block, ...batchResults] = await Promise.all([\n tronWeb.trx.getCurrentBlock(),\n ...batches.map((batch, idx) =>\n contract\n .aggregate3(batch)\n .call({ from: walletAddress })\n // TronWeb wraps the single return value in an extra array\n .then((r: unknown[]) => r[0] as Array<[boolean, string]>)\n .catch((error: Error) => {\n console.warn(\n `[getTronBalance] batch ${idx + 1}/${batches.length} failed:`,\n error.message\n )\n return batch.map(() => [false, '0x'] as [boolean, string])\n })\n ),\n ])\n\n const blockNumber = block.block_header?.raw_data?.number\n return [\n blockNumber !== undefined ? BigInt(blockNumber) : undefined,\n batchResults.flat(),\n ]\n }\n )\n\n return tokens.map((token, i) => {\n // Guard against an unexpected length mismatch between tokens and flattened batch results.\n const entry = results[i] as [boolean, string] | undefined\n if (!entry) {\n return { ...token, blockNumber }\n }\n const [success, returnData] = entry\n if (!success) {\n // RPC failure: amount is omitted (undefined)\n // Consumers must treat a missing amount as \"balance unavailable\", not zero.\n return { ...token, blockNumber }\n }\n return { ...token, amount: BigInt(returnData), blockNumber }\n })\n}\n\nconst getTronBalanceDefault = async (\n client: SDKClient,\n tokens: Token[],\n walletAddress: string\n): Promise<TokenAmount[]> => {\n const [blockNumber, results] = await callTronRpcsWithRetry(\n client,\n async (tronWeb) => {\n const host = tronWeb.fullNode.host\n const queue: Promise<bigint>[] = tokens.map((token) => {\n if (isZeroAddress(token.address)) {\n return withDedupe(\n async () => BigInt(await tronWeb.trx.getBalance(walletAddress)),\n { id: `${getTronBalanceDefault.name}.getBalance.${host}` }\n )\n }\n return withDedupe(\n async () => {\n const contract = await tronWeb.contract().at(token.address)\n const balance = await contract\n .balanceOf(walletAddress)\n .call({ from: walletAddress })\n return BigInt(balance.toString())\n },\n {\n id: `${getTronBalanceDefault.name}.balanceOf.${token.address}.${host}`,\n }\n )\n })\n\n return Promise.all([\n withDedupe(\n async (): Promise<bigint | undefined> => {\n const block = await tronWeb.trx.getCurrentBlock()\n const n = block.block_header?.raw_data?.number\n return n !== undefined ? BigInt(n) : undefined\n },\n { id: `${getTronBalanceDefault.name}.getCurrentBlock.${host}` }\n ),\n Promise.allSettled(queue),\n ])\n }\n )\n\n const tokenAmounts: TokenAmount[] = tokens.map((token, index) => {\n const result = results[index]\n if (result.status === 'rejected') {\n // RPC failure: amount is omitted (undefined), matching getSolanaBalance's contract.\n // Consumers must treat a missing amount as \"balance unavailable\", not zero.\n return { ...token, blockNumber }\n }\n return { ...token, amount: result.value, blockNumber }\n })\n\n return tokenAmounts\n}\n"],"mappings":";;;;;;;;;;AAUA,MAAM,sBAAsBA,QAAAA,QAAQ,KAAK,qBAAqB,CAAC,MAAM,GAAG,GAAG;AAC3E,MAAM,2BAA2BA,QAAAA,QAAQ,KAAK,yBAAyB,CAAC,MACtE,GACA,GACD;AAED,MAAa,iBAAiB,OAC5B,QACA,eACA,QACA,qBAAA,OAC2B;AAC3B,KAAI,OAAO,WAAW,EACpB,QAAO,EAAE;CAEX,MAAM,EAAE,YAAY,OAAO;AAC3B,MAAK,MAAM,SAAS,OAClB,KAAI,MAAM,YAAY,QACpB,SAAQ,KAAK,iDAAiD;CAIlE,MAAM,mBAAmB,MAAMC,oCAAAA,oBAAoB,QAAQ,QAAQ;AAEnE,KAAI,oBAAoB,OAAO,SAAS,EACtC,QAAO,wBACL,QACA,QACA,eACA,kBACA,mBACD;AAGH,QAAO,sBAAsB,QAAQ,QAAQ,cAAc;;AAG7D,MAAM,0BAA0B,OAC9B,QACA,QACA,eACA,kBACA,cAC2B;CAC3B,MAAM,YAAYC,sBAAAA,SAAS,cAAc;CACzC,MAAM,eAAeA,sBAAAA,SAAS,iBAAiB;CAE/C,MAAM,CAAC,aAAa,WAAW,MAAMC,kCAAAA,sBACnC,QACA,OAAO,YAAY;EACjB,MAAM,WAAW,QAAQ,SAASC,4BAAAA,eAAe,iBAAiB;EAGlE,MAAM,WAAW,OAAO,KAAK,UAAU;GACrC,MAAM,WAAWC,4BAAAA,cAAc,MAAM,QAAQ;AAC7C,UAAO;IACL,WAAW,eAAeH,sBAAAA,SAAS,MAAM,QAAQ;IACjD;IACAI,sBAAAA,sBACE,WAAW,2BAA2B,qBACtC,UACD;IACF;IACD;EAGF,MAAM,UAA+B,EAAE;AACvC,OAAK,IAAI,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK,UACxC,SAAQ,KAAK,SAAS,MAAM,GAAG,IAAI,UAAU,CAAC;EAGhD,MAAM,CAAC,OAAO,GAAG,gBAAgB,MAAM,QAAQ,IAAI,CACjD,QAAQ,IAAI,iBAAiB,EAC7B,GAAG,QAAQ,KAAK,OAAO,QACrB,SACG,WAAW,MAAM,CACjB,KAAK,EAAE,MAAM,eAAe,CAAC,CAE7B,MAAM,MAAiB,EAAE,GAA+B,CACxD,OAAO,UAAiB;AACvB,WAAQ,KACN,0BAA0B,MAAM,EAAE,GAAG,QAAQ,OAAO,WACpD,MAAM,QACP;AACD,UAAO,MAAM,UAAU,CAAC,OAAO,KAAK,CAAsB;IAC1D,CACL,CACF,CAAC;EAEF,MAAM,cAAc,MAAM,cAAc,UAAU;AAClD,SAAO,CACL,gBAAgB,KAAA,IAAY,OAAO,YAAY,GAAG,KAAA,GAClD,aAAa,MAAM,CACpB;GAEJ;AAED,QAAO,OAAO,KAAK,OAAO,MAAM;EAE9B,MAAM,QAAQ,QAAQ;AACtB,MAAI,CAAC,MACH,QAAO;GAAE,GAAG;GAAO;GAAa;EAElC,MAAM,CAAC,SAAS,cAAc;AAC9B,MAAI,CAAC,QAGH,QAAO;GAAE,GAAG;GAAO;GAAa;AAElC,SAAO;GAAE,GAAG;GAAO,QAAQ,OAAO,WAAW;GAAE;GAAa;GAC5D;;AAGJ,MAAM,wBAAwB,OAC5B,QACA,QACA,kBAC2B;CAC3B,MAAM,CAAC,aAAa,WAAW,MAAMH,kCAAAA,sBACnC,QACA,OAAO,YAAY;EACjB,MAAM,OAAO,QAAQ,SAAS;EAC9B,MAAM,QAA2B,OAAO,KAAK,UAAU;AACrD,OAAIE,4BAAAA,cAAc,MAAM,QAAQ,CAC9B,SAAA,GAAA,UAAA,YACE,YAAY,OAAO,MAAM,QAAQ,IAAI,WAAW,cAAc,CAAC,EAC/D,EAAE,IAAI,GAAG,sBAAsB,KAAK,cAAc,QAAQ,CAC3D;AAEH,WAAA,GAAA,UAAA,YACE,YAAY;IAEV,MAAM,UAAU,OAAM,MADC,QAAQ,UAAU,CAAC,GAAG,MAAM,QAAQ,EAExD,UAAU,cAAc,CACxB,KAAK,EAAE,MAAM,eAAe,CAAC;AAChC,WAAO,OAAO,QAAQ,UAAU,CAAC;MAEnC,EACE,IAAI,GAAG,sBAAsB,KAAK,aAAa,MAAM,QAAQ,GAAG,QACjE,CACF;IACD;AAEF,SAAO,QAAQ,IAAI,EAAA,GAAA,UAAA,YAEf,YAAyC;GAEvC,MAAM,KAAI,MADU,QAAQ,IAAI,iBAAiB,EACjC,cAAc,UAAU;AACxC,UAAO,MAAM,KAAA,IAAY,OAAO,EAAE,GAAG,KAAA;KAEvC,EAAE,IAAI,GAAG,sBAAsB,KAAK,mBAAmB,QAAQ,CAChE,EACD,QAAQ,WAAW,MAAM,CAC1B,CAAC;GAEL;AAYD,QAVoC,OAAO,KAAK,OAAO,UAAU;EAC/D,MAAM,SAAS,QAAQ;AACvB,MAAI,OAAO,WAAW,WAGpB,QAAO;GAAE,GAAG;GAAO;GAAa;AAElC,SAAO;GAAE,GAAG;GAAO,QAAQ,OAAO;GAAO;GAAa;GAGrC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TronStepExecutor.js","names":["BaseStepExecutor","TransactionError","LiFiErrorCode","parseTronErrors","isZeroAddress","TronCheckAllowanceTask","TronSetAllowanceTask","CheckBalanceTask","PrepareTransactionTask","TronSignAndExecuteTask","TronWaitForTransactionTask","WaitForTransactionStatusTask","TaskPipeline"],"sources":["../../../src/core/TronStepExecutor.ts"],"sourcesContent":["import {\n BaseStepExecutor,\n CheckBalanceTask,\n type ExecutionAction,\n LiFiErrorCode,\n type LiFiStepExtended,\n PrepareTransactionTask,\n type SDKError,\n type StepExecutorBaseContext,\n TaskPipeline,\n TransactionError,\n WaitForTransactionStatusTask,\n} from '@lifi/sdk'\nimport type { Adapter } from '@tronweb3/tronwallet-abstract-adapter'\nimport { parseTronErrors } from '../errors/parseTronErrors.js'\nimport type {\n TronStepExecutorContext,\n TronStepExecutorOptions,\n} from '../types.js'\nimport { isZeroAddress } from '../utils/isZeroAddress.js'\nimport { TronCheckAllowanceTask } from './tasks/TronCheckAllowanceTask.js'\nimport { TronSetAllowanceTask } from './tasks/TronSetAllowanceTask.js'\nimport { TronSignAndExecuteTask } from './tasks/TronSignAndExecuteTask.js'\nimport { TronWaitForTransactionTask } from './tasks/TronWaitForTransactionTask.js'\n\nexport class TronStepExecutor extends BaseStepExecutor {\n private wallet: Adapter\n\n constructor(options: TronStepExecutorOptions) {\n super(options)\n this.wallet = options.wallet\n }\n\n checkWallet = (step: LiFiStepExtended): void => {\n const address = this.wallet.address\n if (address && address !== step.action.fromAddress) {\n throw new TransactionError(\n LiFiErrorCode.WalletChangedDuringExecution,\n 'The wallet address that requested the quote does not match the wallet address attempting to sign the transaction.'\n )\n }\n }\n\n override parseErrors = (\n error: Error,\n step?: LiFiStepExtended,\n action?: ExecutionAction\n ): Promise<SDKError> => parseTronErrors(error, step, action)\n\n override createContext = async (\n baseContext: StepExecutorBaseContext\n ): Promise<TronStepExecutorContext> => {\n return {\n ...baseContext,\n wallet: this.wallet,\n checkWallet: this.checkWallet,\n }\n }\n\n override createPipeline = (\n context: TronStepExecutorContext\n ): TaskPipeline => {\n const { step, isBridgeExecution } = context\n\n const isFromNativeToken = isZeroAddress(step.action.fromToken.address)\n\n const tasks = [\n new TronCheckAllowanceTask(),\n new TronSetAllowanceTask(),\n new CheckBalanceTask(),\n new PrepareTransactionTask(),\n new TronSignAndExecuteTask(),\n new TronWaitForTransactionTask(),\n new WaitForTransactionStatusTask(\n isBridgeExecution ? 'RECEIVING_CHAIN' : 'SWAP'\n ),\n ]\n\n const swapOrBridgeAction = this.statusManager.findAction(\n step,\n isBridgeExecution ? 'CROSS_CHAIN' : 'SWAP'\n )\n\n const doCheckAllowance =\n !swapOrBridgeAction?.txHash &&\n !isFromNativeToken &&\n !!step.estimate.approvalAddress &&\n !step.estimate.skipApproval\n\n let taskName: string\n if (doCheckAllowance) {\n taskName = TronCheckAllowanceTask.name\n } else {\n taskName =\n swapOrBridgeAction?.txHash && swapOrBridgeAction?.status === 'DONE'\n ? WaitForTransactionStatusTask.name\n : CheckBalanceTask.name\n }\n\n const firstTaskIndex = tasks.findIndex(\n (task) => task.constructor.name === taskName\n )\n\n const tasksToRun = tasks.slice(firstTaskIndex)\n\n return new TaskPipeline(tasksToRun)\n }\n}\n"],"mappings":";;;;;;;;;AAyBA,IAAa,mBAAb,cAAsCA,UAAAA,iBAAiB;CACrD;CAEA,YAAY,SAAkC;AAC5C,QAAM,QAAQ;AACd,OAAK,SAAS,QAAQ;;CAGxB,eAAe,SAAiC;EAC9C,MAAM,UAAU,KAAK,OAAO;AAC5B,MAAI,WAAW,YAAY,KAAK,OAAO,YACrC,OAAM,IAAIC,UAAAA,iBACRC,UAAAA,cAAc,8BACd,oHACD;;CAIL,eACE,OACA,MACA,WACsBC,+BAAAA,gBAAgB,OAAO,MAAM,OAAO;CAE5D,gBAAyB,OACvB,gBACqC;AACrC,SAAO;GACL,GAAG;GACH,QAAQ,KAAK;GACb,aAAa,KAAK;GACnB;;CAGH,kBACE,YACiB;EACjB,MAAM,EAAE,MAAM,sBAAsB;EAEpC,MAAM,oBAAoBC,4BAAAA,cAAc,KAAK,OAAO,UAAU,QAAQ;EAEtE,MAAM,QAAQ;GACZ,IAAIC,0CAAAA,wBAAwB;GAC5B,IAAIC,wCAAAA,sBAAsB;GAC1B,IAAIC,UAAAA,kBAAkB;GACtB,IAAIC,UAAAA,wBAAwB;GAC5B,IAAIC,0CAAAA,wBAAwB;GAC5B,IAAIC,8CAAAA,4BAA4B;GAChC,IAAIC,UAAAA,6BACF,oBAAoB,oBAAoB,OACzC;GACF;EAED,MAAM,qBAAqB,KAAK,cAAc,WAC5C,MACA,oBAAoB,gBAAgB,OACrC;EAED,MAAM,mBACJ,CAAC,oBAAoB,UACrB,CAAC,qBACD,CAAC,CAAC,KAAK,SAAS,mBAChB,CAAC,KAAK,SAAS;EAEjB,IAAI;AACJ,MAAI,iBACF,YAAWN,0CAAAA,uBAAuB;MAElC,YACE,oBAAoB,UAAU,oBAAoB,WAAW,SACzDM,UAAAA,6BAA6B,OAC7BJ,UAAAA,iBAAiB;EAGzB,MAAM,iBAAiB,MAAM,WAC1B,SAAS,KAAK,YAAY,SAAS,SACrC;AAID,SAAO,IAAIK,UAAAA,aAFQ,MAAM,MAAM,
|
|
1
|
+
{"version":3,"file":"TronStepExecutor.js","names":["BaseStepExecutor","TransactionError","LiFiErrorCode","parseTronErrors","isZeroAddress","TronCheckAllowanceTask","TronSetAllowanceTask","CheckBalanceTask","PrepareTransactionTask","TronSignAndExecuteTask","TronWaitForTransactionTask","WaitForTransactionStatusTask","TaskPipeline"],"sources":["../../../src/core/TronStepExecutor.ts"],"sourcesContent":["import {\n BaseStepExecutor,\n CheckBalanceTask,\n type ExecutionAction,\n LiFiErrorCode,\n type LiFiStepExtended,\n PrepareTransactionTask,\n type SDKError,\n type StepExecutorBaseContext,\n TaskPipeline,\n TransactionError,\n WaitForTransactionStatusTask,\n} from '@lifi/sdk'\nimport type { Adapter } from '@tronweb3/tronwallet-abstract-adapter'\nimport { parseTronErrors } from '../errors/parseTronErrors.js'\nimport type {\n TronStepExecutorContext,\n TronStepExecutorOptions,\n} from '../types.js'\nimport { isZeroAddress } from '../utils/isZeroAddress.js'\nimport { TronCheckAllowanceTask } from './tasks/TronCheckAllowanceTask.js'\nimport { TronSetAllowanceTask } from './tasks/TronSetAllowanceTask.js'\nimport { TronSignAndExecuteTask } from './tasks/TronSignAndExecuteTask.js'\nimport { TronWaitForTransactionTask } from './tasks/TronWaitForTransactionTask.js'\n\nexport class TronStepExecutor extends BaseStepExecutor {\n private wallet: Adapter\n\n constructor(options: TronStepExecutorOptions) {\n super(options)\n this.wallet = options.wallet\n }\n\n checkWallet = (step: LiFiStepExtended): void => {\n const address = this.wallet.address\n if (address && address !== step.action.fromAddress) {\n throw new TransactionError(\n LiFiErrorCode.WalletChangedDuringExecution,\n 'The wallet address that requested the quote does not match the wallet address attempting to sign the transaction.'\n )\n }\n }\n\n override parseErrors = (\n error: Error,\n step?: LiFiStepExtended,\n action?: ExecutionAction\n ): Promise<SDKError> => parseTronErrors(error, step, action)\n\n override createContext = async (\n baseContext: StepExecutorBaseContext\n ): Promise<TronStepExecutorContext> => {\n return {\n ...baseContext,\n wallet: this.wallet,\n checkWallet: this.checkWallet,\n }\n }\n\n override createPipeline = (\n context: TronStepExecutorContext\n ): TaskPipeline => {\n const { step, isBridgeExecution } = context\n\n const isFromNativeToken = isZeroAddress(step.action.fromToken.address)\n\n const tasks = [\n new TronCheckAllowanceTask(),\n new TronSetAllowanceTask(),\n new CheckBalanceTask(),\n new PrepareTransactionTask(),\n new TronSignAndExecuteTask(),\n new TronWaitForTransactionTask(),\n new WaitForTransactionStatusTask(\n isBridgeExecution ? 'RECEIVING_CHAIN' : 'SWAP'\n ),\n ]\n\n const swapOrBridgeAction = this.statusManager.findAction(\n step,\n isBridgeExecution ? 'CROSS_CHAIN' : 'SWAP'\n )\n\n const doCheckAllowance =\n !swapOrBridgeAction?.txHash &&\n !isFromNativeToken &&\n !!step.estimate.approvalAddress &&\n !step.estimate.skipApproval\n\n let taskName: string\n if (doCheckAllowance) {\n taskName = TronCheckAllowanceTask.name\n } else {\n taskName =\n swapOrBridgeAction?.txHash && swapOrBridgeAction?.status === 'DONE'\n ? WaitForTransactionStatusTask.name\n : CheckBalanceTask.name\n }\n\n const firstTaskIndex = tasks.findIndex(\n (task) => task.constructor.name === taskName\n )\n\n const tasksToRun = tasks.slice(firstTaskIndex)\n\n return new TaskPipeline(tasksToRun)\n }\n}\n"],"mappings":";;;;;;;;;AAyBA,IAAa,mBAAb,cAAsCA,UAAAA,iBAAiB;CACrD;CAEA,YAAY,SAAkC;AAC5C,QAAM,QAAQ;AACd,OAAK,SAAS,QAAQ;;CAGxB,eAAe,SAAiC;EAC9C,MAAM,UAAU,KAAK,OAAO;AAC5B,MAAI,WAAW,YAAY,KAAK,OAAO,YACrC,OAAM,IAAIC,UAAAA,iBACRC,UAAAA,cAAc,8BACd,oHACD;;CAIL,eACE,OACA,MACA,WACsBC,+BAAAA,gBAAgB,OAAO,MAAM,OAAO;CAE5D,gBAAyB,OACvB,gBACqC;AACrC,SAAO;GACL,GAAG;GACH,QAAQ,KAAK;GACb,aAAa,KAAK;GACnB;;CAGH,kBACE,YACiB;EACjB,MAAM,EAAE,MAAM,sBAAsB;EAEpC,MAAM,oBAAoBC,4BAAAA,cAAc,KAAK,OAAO,UAAU,QAAQ;EAEtE,MAAM,QAAQ;GACZ,IAAIC,0CAAAA,wBAAwB;GAC5B,IAAIC,wCAAAA,sBAAsB;GAC1B,IAAIC,UAAAA,kBAAkB;GACtB,IAAIC,UAAAA,wBAAwB;GAC5B,IAAIC,0CAAAA,wBAAwB;GAC5B,IAAIC,8CAAAA,4BAA4B;GAChC,IAAIC,UAAAA,6BACF,oBAAoB,oBAAoB,OACzC;GACF;EAED,MAAM,qBAAqB,KAAK,cAAc,WAC5C,MACA,oBAAoB,gBAAgB,OACrC;EAED,MAAM,mBACJ,CAAC,oBAAoB,UACrB,CAAC,qBACD,CAAC,CAAC,KAAK,SAAS,mBAChB,CAAC,KAAK,SAAS;EAEjB,IAAI;AACJ,MAAI,iBACF,YAAWN,0CAAAA,uBAAuB;MAElC,YACE,oBAAoB,UAAU,oBAAoB,WAAW,SACzDM,UAAAA,6BAA6B,OAC7BJ,UAAAA,iBAAiB;EAGzB,MAAM,iBAAiB,MAAM,WAC1B,SAAS,KAAK,YAAY,SAAS,SACrC;AAID,SAAO,IAAIK,UAAAA,aAFQ,MAAM,MAAM,eAEG,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TronCheckAllowanceTask.js","names":["BaseStepExecutionTask","TransactionError","LiFiErrorCode","callTronRpcsWithRetry"],"sources":["../../../../src/core/tasks/TronCheckAllowanceTask.ts"],"sourcesContent":["import {\n BaseStepExecutionTask,\n LiFiErrorCode,\n type TaskResult,\n TransactionError,\n} from '@lifi/sdk'\nimport { callTronRpcsWithRetry } from '../../rpc/callTronRpcsWithRetry.js'\nimport type { TronStepExecutorContext } from '../../types.js'\n\nexport class TronCheckAllowanceTask extends BaseStepExecutionTask {\n override async shouldRun(context: TronStepExecutorContext): Promise<boolean> {\n return !context.hasSufficientAllowance\n }\n\n async run(context: TronStepExecutorContext): Promise<TaskResult> {\n const { step, client, wallet, statusManager } = context\n\n const action = statusManager.initializeAction({\n step,\n type: 'CHECK_ALLOWANCE',\n chainId: step.action.fromChainId,\n status: 'STARTED',\n })\n\n if (!wallet.address) {\n throw new TransactionError(\n LiFiErrorCode.WalletChangedDuringExecution,\n 'Wallet address is not available. Wallet may have been disconnected.'\n )\n }\n\n if (!step.estimate.approvalAddress) {\n throw new TransactionError(\n LiFiErrorCode.TransactionUnprepared,\n 'Approval address is not available.'\n )\n }\n\n const ownerAddress = wallet.address\n const tokenAddress = step.action.fromToken.address\n const spenderAddress = step.estimate.approvalAddress\n const fromAmount = BigInt(step.action.fromAmount)\n\n const allowance = await callTronRpcsWithRetry(client, async (tronWeb) => {\n const contract = await tronWeb.contract().at(tokenAddress)\n const result = await contract\n .allowance(ownerAddress, spenderAddress)\n .call({ from: ownerAddress })\n return BigInt(result.toString())\n })\n\n statusManager.updateAction(step, action.type, 'DONE')\n\n return {\n status: 'COMPLETED',\n context: {\n hasSufficientAllowance: fromAmount <= allowance,\n },\n }\n }\n}\n"],"mappings":";;;;AASA,IAAa,yBAAb,cAA4CA,UAAAA,sBAAsB;CAChE,MAAe,UAAU,SAAoD;AAC3E,SAAO,CAAC,QAAQ;;CAGlB,MAAM,IAAI,SAAuD;EAC/D,MAAM,EAAE,MAAM,QAAQ,QAAQ,kBAAkB;EAEhD,MAAM,SAAS,cAAc,iBAAiB;GAC5C;GACA,MAAM;GACN,SAAS,KAAK,OAAO;GACrB,QAAQ;GACT,CAAC;AAEF,MAAI,CAAC,OAAO,QACV,OAAM,IAAIC,UAAAA,iBACRC,UAAAA,cAAc,8BACd,sEACD;AAGH,MAAI,CAAC,KAAK,SAAS,gBACjB,OAAM,IAAID,UAAAA,iBACRC,UAAAA,cAAc,uBACd,qCACD;EAGH,MAAM,eAAe,OAAO;EAC5B,MAAM,eAAe,KAAK,OAAO,UAAU;EAC3C,MAAM,iBAAiB,KAAK,SAAS;EACrC,MAAM,aAAa,OAAO,KAAK,OAAO,WAAW;EAEjD,MAAM,YAAY,MAAMC,kCAAAA,sBAAsB,QAAQ,OAAO,YAAY;GAEvE,MAAM,SAAS,
|
|
1
|
+
{"version":3,"file":"TronCheckAllowanceTask.js","names":["BaseStepExecutionTask","TransactionError","LiFiErrorCode","callTronRpcsWithRetry"],"sources":["../../../../src/core/tasks/TronCheckAllowanceTask.ts"],"sourcesContent":["import {\n BaseStepExecutionTask,\n LiFiErrorCode,\n type TaskResult,\n TransactionError,\n} from '@lifi/sdk'\nimport { callTronRpcsWithRetry } from '../../rpc/callTronRpcsWithRetry.js'\nimport type { TronStepExecutorContext } from '../../types.js'\n\nexport class TronCheckAllowanceTask extends BaseStepExecutionTask {\n override async shouldRun(context: TronStepExecutorContext): Promise<boolean> {\n return !context.hasSufficientAllowance\n }\n\n async run(context: TronStepExecutorContext): Promise<TaskResult> {\n const { step, client, wallet, statusManager } = context\n\n const action = statusManager.initializeAction({\n step,\n type: 'CHECK_ALLOWANCE',\n chainId: step.action.fromChainId,\n status: 'STARTED',\n })\n\n if (!wallet.address) {\n throw new TransactionError(\n LiFiErrorCode.WalletChangedDuringExecution,\n 'Wallet address is not available. Wallet may have been disconnected.'\n )\n }\n\n if (!step.estimate.approvalAddress) {\n throw new TransactionError(\n LiFiErrorCode.TransactionUnprepared,\n 'Approval address is not available.'\n )\n }\n\n const ownerAddress = wallet.address\n const tokenAddress = step.action.fromToken.address\n const spenderAddress = step.estimate.approvalAddress\n const fromAmount = BigInt(step.action.fromAmount)\n\n const allowance = await callTronRpcsWithRetry(client, async (tronWeb) => {\n const contract = await tronWeb.contract().at(tokenAddress)\n const result = await contract\n .allowance(ownerAddress, spenderAddress)\n .call({ from: ownerAddress })\n return BigInt(result.toString())\n })\n\n statusManager.updateAction(step, action.type, 'DONE')\n\n return {\n status: 'COMPLETED',\n context: {\n hasSufficientAllowance: fromAmount <= allowance,\n },\n }\n }\n}\n"],"mappings":";;;;AASA,IAAa,yBAAb,cAA4CA,UAAAA,sBAAsB;CAChE,MAAe,UAAU,SAAoD;AAC3E,SAAO,CAAC,QAAQ;;CAGlB,MAAM,IAAI,SAAuD;EAC/D,MAAM,EAAE,MAAM,QAAQ,QAAQ,kBAAkB;EAEhD,MAAM,SAAS,cAAc,iBAAiB;GAC5C;GACA,MAAM;GACN,SAAS,KAAK,OAAO;GACrB,QAAQ;GACT,CAAC;AAEF,MAAI,CAAC,OAAO,QACV,OAAM,IAAIC,UAAAA,iBACRC,UAAAA,cAAc,8BACd,sEACD;AAGH,MAAI,CAAC,KAAK,SAAS,gBACjB,OAAM,IAAID,UAAAA,iBACRC,UAAAA,cAAc,uBACd,qCACD;EAGH,MAAM,eAAe,OAAO;EAC5B,MAAM,eAAe,KAAK,OAAO,UAAU;EAC3C,MAAM,iBAAiB,KAAK,SAAS;EACrC,MAAM,aAAa,OAAO,KAAK,OAAO,WAAW;EAEjD,MAAM,YAAY,MAAMC,kCAAAA,sBAAsB,QAAQ,OAAO,YAAY;GAEvE,MAAM,SAAS,OAAM,MADE,QAAQ,UAAU,CAAC,GAAG,aAAa,EAEvD,UAAU,cAAc,eAAe,CACvC,KAAK,EAAE,MAAM,cAAc,CAAC;AAC/B,UAAO,OAAO,OAAO,UAAU,CAAC;IAChC;AAEF,gBAAc,aAAa,MAAM,OAAO,MAAM,OAAO;AAErD,SAAO;GACL,QAAQ;GACR,SAAS,EACP,wBAAwB,cAAc,WACvC;GACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TronSetAllowanceTask.js","names":["BaseStepExecutionTask","TransactionError","LiFiErrorCode","callTronRpcsWithRetry","stripHexPrefix","getTronTxLink","waitForTronTxConfirmation"],"sources":["../../../../src/core/tasks/TronSetAllowanceTask.ts"],"sourcesContent":["import {\n BaseStepExecutionTask,\n LiFiErrorCode,\n type TaskResult,\n TransactionError,\n} from '@lifi/sdk'\nimport { callTronRpcsWithRetry } from '../../rpc/callTronRpcsWithRetry.js'\nimport { waitForTronTxConfirmation } from '../../rpc/waitForTronTxConfirmation.js'\nimport type { TronStepExecutorContext } from '../../types.js'\nimport { getTronTxLink } from '../../utils/getTronTxLink.js'\nimport { stripHexPrefix } from '../../utils/stripHexPrefix.js'\n\n// 100 TRX in sun (1 TRX = 1_000_000 sun) — generous default for TRC-20 approve calls.\nconst DEFAULT_APPROVE_FEE_LIMIT = 100_000_000\n\nexport class TronSetAllowanceTask extends BaseStepExecutionTask {\n override async shouldRun(context: TronStepExecutorContext): Promise<boolean> {\n return !context.hasSufficientAllowance\n }\n\n async run(context: TronStepExecutorContext): Promise<TaskResult> {\n const { step, client, wallet, statusManager, fromChain } = context\n\n const action = statusManager.initializeAction({\n step,\n type: 'SET_ALLOWANCE',\n chainId: step.action.fromChainId,\n status: 'STARTED',\n })\n\n statusManager.updateAction(step, action.type, 'ACTION_REQUIRED')\n\n if (!wallet.address) {\n throw new TransactionError(\n LiFiErrorCode.WalletChangedDuringExecution,\n 'Wallet address is not available. Wallet may have been disconnected.'\n )\n }\n\n if (!step.estimate.approvalAddress) {\n throw new TransactionError(\n LiFiErrorCode.TransactionUnprepared,\n 'Approval address is not available.'\n )\n }\n\n const tokenAddress = step.action.fromToken.address\n const spenderAddress = step.estimate.approvalAddress\n const ownerAddress = wallet.address\n const approveAmount = BigInt(step.action.fromAmount).toString()\n\n const approveGasCost = step.estimate.gasCosts?.find(\n (gc) => gc.type === 'APPROVE'\n )\n const parsedLimit = approveGasCost?.limit ? Number(approveGasCost.limit) : 0\n if (\n approveGasCost?.limit &&\n (!Number.isFinite(parsedLimit) || parsedLimit <= 0)\n ) {\n console.warn(\n '[TronSetAllowanceTask] Invalid fee limit estimate, using default:',\n approveGasCost.limit\n )\n }\n const feeLimit = parsedLimit > 0 ? parsedLimit : DEFAULT_APPROVE_FEE_LIMIT\n\n const transaction = await callTronRpcsWithRetry(client, async (tronWeb) => {\n const { transaction } =\n await tronWeb.transactionBuilder.triggerSmartContract(\n tokenAddress,\n 'approve(address,uint256)',\n { feeLimit },\n [\n { type: 'address', value: spenderAddress },\n { type: 'uint256', value: approveAmount },\n ],\n ownerAddress\n )\n return transaction\n })\n\n const signedTransaction = await wallet.signTransaction(transaction)\n\n statusManager.updateAction(step, action.type, 'PENDING')\n\n const broadcastResult = await callTronRpcsWithRetry(\n client,\n async (tronWeb) => {\n const result = await tronWeb.trx.sendRawTransaction(signedTransaction)\n\n if (!result.result && String(result.code) !== 'DUP_TRANSACTION_ERROR') {\n throw new TransactionError(\n LiFiErrorCode.TransactionFailed,\n `Approval broadcast failed: ${result.code || 'Unknown error'}`\n )\n }\n\n return result\n }\n )\n\n // DUP_TRANSACTION_ERROR responses omit the `transaction` field — fall back\n // to the txID computed locally from the signed transaction in that case.\n const txHash = stripHexPrefix(\n broadcastResult.transaction?.txID ?? signedTransaction.txID\n )\n\n statusManager.updateAction(step, action.type, 'PENDING', {\n txHash,\n txLink: getTronTxLink(fromChain, txHash),\n })\n\n await waitForTronTxConfirmation(\n client,\n txHash,\n 'Approval transaction failed on-chain.'\n )\n\n statusManager.updateAction(step, action.type, 'DONE', {\n txHash,\n txLink: getTronTxLink(fromChain, txHash),\n })\n\n return {\n status: 'COMPLETED',\n context: { hasSufficientAllowance: true },\n }\n }\n}\n"],"mappings":";;;;;;;AAaA,MAAM,4BAA4B;AAElC,IAAa,uBAAb,cAA0CA,UAAAA,sBAAsB;CAC9D,MAAe,UAAU,SAAoD;AAC3E,SAAO,CAAC,QAAQ;;CAGlB,MAAM,IAAI,SAAuD;EAC/D,MAAM,EAAE,MAAM,QAAQ,QAAQ,eAAe,cAAc;EAE3D,MAAM,SAAS,cAAc,iBAAiB;GAC5C;GACA,MAAM;GACN,SAAS,KAAK,OAAO;GACrB,QAAQ;GACT,CAAC;AAEF,gBAAc,aAAa,MAAM,OAAO,MAAM,kBAAkB;AAEhE,MAAI,CAAC,OAAO,QACV,OAAM,IAAIC,UAAAA,iBACRC,UAAAA,cAAc,8BACd,sEACD;AAGH,MAAI,CAAC,KAAK,SAAS,gBACjB,OAAM,IAAID,UAAAA,iBACRC,UAAAA,cAAc,uBACd,qCACD;EAGH,MAAM,eAAe,KAAK,OAAO,UAAU;EAC3C,MAAM,iBAAiB,KAAK,SAAS;EACrC,MAAM,eAAe,OAAO;EAC5B,MAAM,gBAAgB,OAAO,KAAK,OAAO,WAAW,CAAC,UAAU;EAE/D,MAAM,iBAAiB,KAAK,SAAS,UAAU,MAC5C,OAAO,GAAG,SAAS,UACrB;EACD,MAAM,cAAc,gBAAgB,QAAQ,OAAO,eAAe,MAAM,GAAG;AAC3E,MACE,gBAAgB,UACf,CAAC,OAAO,SAAS,YAAY,IAAI,eAAe,GAEjD,SAAQ,KACN,qEACA,eAAe,MAChB;EAEH,MAAM,WAAW,cAAc,IAAI,cAAc;EAEjD,MAAM,cAAc,MAAMC,kCAAAA,sBAAsB,QAAQ,OAAO,YAAY;GACzE,MAAM,EAAE,gBACN,MAAM,QAAQ,mBAAmB,qBAC/B,cACA,4BACA,EAAE,UAAU,EACZ,CACE;IAAE,MAAM;IAAW,OAAO;IAAgB,EAC1C;IAAE,MAAM;IAAW,OAAO;IAAe,CAC1C,EACD,aACD;AACH,UAAO;IACP;EAEF,MAAM,oBAAoB,MAAM,OAAO,gBAAgB,YAAY;AAEnE,gBAAc,aAAa,MAAM,OAAO,MAAM,UAAU;EAoBxD,MAAM,SAASC,6BAAAA,
|
|
1
|
+
{"version":3,"file":"TronSetAllowanceTask.js","names":["BaseStepExecutionTask","TransactionError","LiFiErrorCode","callTronRpcsWithRetry","stripHexPrefix","getTronTxLink","waitForTronTxConfirmation"],"sources":["../../../../src/core/tasks/TronSetAllowanceTask.ts"],"sourcesContent":["import {\n BaseStepExecutionTask,\n LiFiErrorCode,\n type TaskResult,\n TransactionError,\n} from '@lifi/sdk'\nimport { callTronRpcsWithRetry } from '../../rpc/callTronRpcsWithRetry.js'\nimport { waitForTronTxConfirmation } from '../../rpc/waitForTronTxConfirmation.js'\nimport type { TronStepExecutorContext } from '../../types.js'\nimport { getTronTxLink } from '../../utils/getTronTxLink.js'\nimport { stripHexPrefix } from '../../utils/stripHexPrefix.js'\n\n// 100 TRX in sun (1 TRX = 1_000_000 sun) — generous default for TRC-20 approve calls.\nconst DEFAULT_APPROVE_FEE_LIMIT = 100_000_000\n\nexport class TronSetAllowanceTask extends BaseStepExecutionTask {\n override async shouldRun(context: TronStepExecutorContext): Promise<boolean> {\n return !context.hasSufficientAllowance\n }\n\n async run(context: TronStepExecutorContext): Promise<TaskResult> {\n const { step, client, wallet, statusManager, fromChain } = context\n\n const action = statusManager.initializeAction({\n step,\n type: 'SET_ALLOWANCE',\n chainId: step.action.fromChainId,\n status: 'STARTED',\n })\n\n statusManager.updateAction(step, action.type, 'ACTION_REQUIRED')\n\n if (!wallet.address) {\n throw new TransactionError(\n LiFiErrorCode.WalletChangedDuringExecution,\n 'Wallet address is not available. Wallet may have been disconnected.'\n )\n }\n\n if (!step.estimate.approvalAddress) {\n throw new TransactionError(\n LiFiErrorCode.TransactionUnprepared,\n 'Approval address is not available.'\n )\n }\n\n const tokenAddress = step.action.fromToken.address\n const spenderAddress = step.estimate.approvalAddress\n const ownerAddress = wallet.address\n const approveAmount = BigInt(step.action.fromAmount).toString()\n\n const approveGasCost = step.estimate.gasCosts?.find(\n (gc) => gc.type === 'APPROVE'\n )\n const parsedLimit = approveGasCost?.limit ? Number(approveGasCost.limit) : 0\n if (\n approveGasCost?.limit &&\n (!Number.isFinite(parsedLimit) || parsedLimit <= 0)\n ) {\n console.warn(\n '[TronSetAllowanceTask] Invalid fee limit estimate, using default:',\n approveGasCost.limit\n )\n }\n const feeLimit = parsedLimit > 0 ? parsedLimit : DEFAULT_APPROVE_FEE_LIMIT\n\n const transaction = await callTronRpcsWithRetry(client, async (tronWeb) => {\n const { transaction } =\n await tronWeb.transactionBuilder.triggerSmartContract(\n tokenAddress,\n 'approve(address,uint256)',\n { feeLimit },\n [\n { type: 'address', value: spenderAddress },\n { type: 'uint256', value: approveAmount },\n ],\n ownerAddress\n )\n return transaction\n })\n\n const signedTransaction = await wallet.signTransaction(transaction)\n\n statusManager.updateAction(step, action.type, 'PENDING')\n\n const broadcastResult = await callTronRpcsWithRetry(\n client,\n async (tronWeb) => {\n const result = await tronWeb.trx.sendRawTransaction(signedTransaction)\n\n if (!result.result && String(result.code) !== 'DUP_TRANSACTION_ERROR') {\n throw new TransactionError(\n LiFiErrorCode.TransactionFailed,\n `Approval broadcast failed: ${result.code || 'Unknown error'}`\n )\n }\n\n return result\n }\n )\n\n // DUP_TRANSACTION_ERROR responses omit the `transaction` field — fall back\n // to the txID computed locally from the signed transaction in that case.\n const txHash = stripHexPrefix(\n broadcastResult.transaction?.txID ?? signedTransaction.txID\n )\n\n statusManager.updateAction(step, action.type, 'PENDING', {\n txHash,\n txLink: getTronTxLink(fromChain, txHash),\n })\n\n await waitForTronTxConfirmation(\n client,\n txHash,\n 'Approval transaction failed on-chain.'\n )\n\n statusManager.updateAction(step, action.type, 'DONE', {\n txHash,\n txLink: getTronTxLink(fromChain, txHash),\n })\n\n return {\n status: 'COMPLETED',\n context: { hasSufficientAllowance: true },\n }\n }\n}\n"],"mappings":";;;;;;;AAaA,MAAM,4BAA4B;AAElC,IAAa,uBAAb,cAA0CA,UAAAA,sBAAsB;CAC9D,MAAe,UAAU,SAAoD;AAC3E,SAAO,CAAC,QAAQ;;CAGlB,MAAM,IAAI,SAAuD;EAC/D,MAAM,EAAE,MAAM,QAAQ,QAAQ,eAAe,cAAc;EAE3D,MAAM,SAAS,cAAc,iBAAiB;GAC5C;GACA,MAAM;GACN,SAAS,KAAK,OAAO;GACrB,QAAQ;GACT,CAAC;AAEF,gBAAc,aAAa,MAAM,OAAO,MAAM,kBAAkB;AAEhE,MAAI,CAAC,OAAO,QACV,OAAM,IAAIC,UAAAA,iBACRC,UAAAA,cAAc,8BACd,sEACD;AAGH,MAAI,CAAC,KAAK,SAAS,gBACjB,OAAM,IAAID,UAAAA,iBACRC,UAAAA,cAAc,uBACd,qCACD;EAGH,MAAM,eAAe,KAAK,OAAO,UAAU;EAC3C,MAAM,iBAAiB,KAAK,SAAS;EACrC,MAAM,eAAe,OAAO;EAC5B,MAAM,gBAAgB,OAAO,KAAK,OAAO,WAAW,CAAC,UAAU;EAE/D,MAAM,iBAAiB,KAAK,SAAS,UAAU,MAC5C,OAAO,GAAG,SAAS,UACrB;EACD,MAAM,cAAc,gBAAgB,QAAQ,OAAO,eAAe,MAAM,GAAG;AAC3E,MACE,gBAAgB,UACf,CAAC,OAAO,SAAS,YAAY,IAAI,eAAe,GAEjD,SAAQ,KACN,qEACA,eAAe,MAChB;EAEH,MAAM,WAAW,cAAc,IAAI,cAAc;EAEjD,MAAM,cAAc,MAAMC,kCAAAA,sBAAsB,QAAQ,OAAO,YAAY;GACzE,MAAM,EAAE,gBACN,MAAM,QAAQ,mBAAmB,qBAC/B,cACA,4BACA,EAAE,UAAU,EACZ,CACE;IAAE,MAAM;IAAW,OAAO;IAAgB,EAC1C;IAAE,MAAM;IAAW,OAAO;IAAe,CAC1C,EACD,aACD;AACH,UAAO;IACP;EAEF,MAAM,oBAAoB,MAAM,OAAO,gBAAgB,YAAY;AAEnE,gBAAc,aAAa,MAAM,OAAO,MAAM,UAAU;EAoBxD,MAAM,SAASC,6BAAAA,gBACb,MAnB4BD,kCAAAA,sBAC5B,QACA,OAAO,YAAY;GACjB,MAAM,SAAS,MAAM,QAAQ,IAAI,mBAAmB,kBAAkB;AAEtE,OAAI,CAAC,OAAO,UAAU,OAAO,OAAO,KAAK,KAAK,wBAC5C,OAAM,IAAIF,UAAAA,iBACRC,UAAAA,cAAc,mBACd,8BAA8B,OAAO,QAAQ,kBAC9C;AAGH,UAAO;IAEV,EAKiB,aAAa,QAAQ,kBAAkB,KACxD;AAED,gBAAc,aAAa,MAAM,OAAO,MAAM,WAAW;GACvD;GACA,QAAQG,4BAAAA,cAAc,WAAW,OAAO;GACzC,CAAC;AAEF,QAAMC,sCAAAA,0BACJ,QACA,QACA,wCACD;AAED,gBAAc,aAAa,MAAM,OAAO,MAAM,QAAQ;GACpD;GACA,QAAQD,4BAAAA,cAAc,WAAW,OAAO;GACzC,CAAC;AAEF,SAAO;GACL,QAAQ;GACR,SAAS,EAAE,wBAAwB,MAAM;GAC1C"}
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
+
const require_rpc_callTronRpcsWithRetry = require("../../rpc/callTronRpcsWithRetry.js");
|
|
2
3
|
const require_utils_stripHexPrefix = require("../../utils/stripHexPrefix.js");
|
|
3
4
|
let _lifi_sdk = require("@lifi/sdk");
|
|
4
5
|
let tronweb = require("tronweb");
|
|
5
6
|
//#region src/core/tasks/TronSignAndExecuteTask.ts
|
|
6
7
|
var TronSignAndExecuteTask = class extends _lifi_sdk.BaseStepExecutionTask {
|
|
7
8
|
async run(context) {
|
|
8
|
-
const { step, wallet, statusManager, isBridgeExecution, checkWallet } = context;
|
|
9
|
+
const { step, wallet, statusManager, isBridgeExecution, checkWallet, client } = context;
|
|
9
10
|
const action = statusManager.findAction(step, isBridgeExecution ? "CROSS_CHAIN" : "SWAP");
|
|
10
11
|
if (!action) throw new _lifi_sdk.TransactionError(_lifi_sdk.LiFiErrorCode.TransactionUnprepared, "Unable to prepare transaction. Action not found.");
|
|
11
12
|
if (!step.transactionRequest?.data) throw new _lifi_sdk.TransactionError(_lifi_sdk.LiFiErrorCode.TransactionUnprepared, "Unable to prepare transaction. Transaction request is not found.");
|
|
@@ -14,17 +15,16 @@ var TronSignAndExecuteTask = class extends _lifi_sdk.BaseStepExecutionTask {
|
|
|
14
15
|
if (!context.allowUserInteraction) return { status: "PAUSED" };
|
|
15
16
|
const rawDataHex = require_utils_stripHexPrefix.stripHexPrefix(step.transactionRequest.data);
|
|
16
17
|
const contractType = step.transactionRequest.customData?.contractType ?? "TriggerSmartContract";
|
|
17
|
-
const
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
18
|
+
const transaction = await require_rpc_callTronRpcsWithRetry.callTronRpcsWithRetry(client, async (tronWeb) => {
|
|
19
|
+
const rawData = tronweb.utils.deserializeTx.deserializeTransaction(contractType, rawDataHex);
|
|
20
|
+
Object.assign(rawData, await tronWeb.trx.getCurrentRefBlockParams());
|
|
21
|
+
return tronWeb.transactionBuilder.newTxID({
|
|
22
|
+
visible: false,
|
|
23
|
+
txID: "",
|
|
24
|
+
raw_data: rawData,
|
|
25
|
+
raw_data_hex: ""
|
|
26
|
+
}, { txLocal: true });
|
|
21
27
|
});
|
|
22
|
-
const transaction = {
|
|
23
|
-
visible: false,
|
|
24
|
-
txID: require_utils_stripHexPrefix.stripHexPrefix(tronweb.utils.transaction.txPbToTxID(transactionPb)),
|
|
25
|
-
raw_data,
|
|
26
|
-
raw_data_hex: rawDataHex
|
|
27
|
-
};
|
|
28
28
|
const signedTransaction = await wallet.signTransaction(transaction);
|
|
29
29
|
statusManager.updateAction(step, action.type, "PENDING", { signedAt: Date.now() });
|
|
30
30
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TronSignAndExecuteTask.js","names":["BaseStepExecutionTask","TransactionError","LiFiErrorCode","stripHexPrefix","utils"],"sources":["../../../../src/core/tasks/TronSignAndExecuteTask.ts"],"sourcesContent":["import {\n BaseStepExecutionTask,\n LiFiErrorCode,\n type TaskResult,\n TransactionError,\n} from '@lifi/sdk'\nimport type { Transaction } from '@tronweb3/tronwallet-abstract-adapter'\nimport { utils } from 'tronweb'\nimport type { TronStepExecutorContext } from '../../types.js'\nimport { stripHexPrefix } from '../../utils/stripHexPrefix.js'\n\nexport class TronSignAndExecuteTask extends BaseStepExecutionTask {\n async run(context: TronStepExecutorContext): Promise<TaskResult> {\n const {
|
|
1
|
+
{"version":3,"file":"TronSignAndExecuteTask.js","names":["BaseStepExecutionTask","TransactionError","LiFiErrorCode","stripHexPrefix","callTronRpcsWithRetry","utils"],"sources":["../../../../src/core/tasks/TronSignAndExecuteTask.ts"],"sourcesContent":["import {\n BaseStepExecutionTask,\n LiFiErrorCode,\n type TaskResult,\n TransactionError,\n} from '@lifi/sdk'\nimport type { Transaction } from '@tronweb3/tronwallet-abstract-adapter'\nimport { utils } from 'tronweb'\nimport { callTronRpcsWithRetry } from '../../rpc/callTronRpcsWithRetry.js'\nimport type { TronStepExecutorContext } from '../../types.js'\nimport { stripHexPrefix } from '../../utils/stripHexPrefix.js'\n\nexport class TronSignAndExecuteTask extends BaseStepExecutionTask {\n async run(context: TronStepExecutorContext): Promise<TaskResult> {\n const {\n step,\n wallet,\n statusManager,\n isBridgeExecution,\n checkWallet,\n client,\n } = context\n\n const action = statusManager.findAction(\n step,\n isBridgeExecution ? 'CROSS_CHAIN' : 'SWAP'\n )\n\n if (!action) {\n throw new TransactionError(\n LiFiErrorCode.TransactionUnprepared,\n 'Unable to prepare transaction. Action not found.'\n )\n }\n\n if (!step.transactionRequest?.data) {\n throw new TransactionError(\n LiFiErrorCode.TransactionUnprepared,\n 'Unable to prepare transaction. Transaction request is not found.'\n )\n }\n\n checkWallet(step)\n\n statusManager.updateAction(step, action.type, 'ACTION_REQUIRED')\n\n if (!context.allowUserInteraction) {\n return { status: 'PAUSED' }\n }\n\n const rawDataHex = stripHexPrefix(step.transactionRequest.data as string)\n\n const contractType =\n (step.transactionRequest.customData?.contractType as string) ??\n 'TriggerSmartContract'\n\n // Re-anchor to a fresh block — a stale `ref_block_hash` falls outside TronLink's\n // recent-block window and surfaces as a generic \"Network mismatched\" error. Then\n // `newTxID` re-runs the tx through TronWeb's `createTransaction`, dropping the\n // deserializer's non-protobuf artifacts and producing a consistent `txID` /\n // `raw_data_hex` pair.\n const transaction: Transaction = await callTronRpcsWithRetry(\n client,\n async (tronWeb) => {\n const rawData = utils.deserializeTx.deserializeTransaction(\n contractType,\n rawDataHex\n )\n Object.assign(rawData, await tronWeb.trx.getCurrentRefBlockParams())\n return tronWeb.transactionBuilder.newTxID(\n { visible: false, txID: '', raw_data: rawData, raw_data_hex: '' },\n { txLocal: true }\n )\n }\n )\n\n const signedTransaction = await wallet.signTransaction(transaction)\n\n statusManager.updateAction(step, action.type, 'PENDING', {\n signedAt: Date.now(),\n })\n\n return {\n status: 'COMPLETED',\n context: { signedTransaction },\n }\n }\n}\n"],"mappings":";;;;;;AAYA,IAAa,yBAAb,cAA4CA,UAAAA,sBAAsB;CAChE,MAAM,IAAI,SAAuD;EAC/D,MAAM,EACJ,MACA,QACA,eACA,mBACA,aACA,WACE;EAEJ,MAAM,SAAS,cAAc,WAC3B,MACA,oBAAoB,gBAAgB,OACrC;AAED,MAAI,CAAC,OACH,OAAM,IAAIC,UAAAA,iBACRC,UAAAA,cAAc,uBACd,mDACD;AAGH,MAAI,CAAC,KAAK,oBAAoB,KAC5B,OAAM,IAAID,UAAAA,iBACRC,UAAAA,cAAc,uBACd,mEACD;AAGH,cAAY,KAAK;AAEjB,gBAAc,aAAa,MAAM,OAAO,MAAM,kBAAkB;AAEhE,MAAI,CAAC,QAAQ,qBACX,QAAO,EAAE,QAAQ,UAAU;EAG7B,MAAM,aAAaC,6BAAAA,eAAe,KAAK,mBAAmB,KAAe;EAEzE,MAAM,eACH,KAAK,mBAAmB,YAAY,gBACrC;EAOF,MAAM,cAA2B,MAAMC,kCAAAA,sBACrC,QACA,OAAO,YAAY;GACjB,MAAM,UAAUC,QAAAA,MAAM,cAAc,uBAClC,cACA,WACD;AACD,UAAO,OAAO,SAAS,MAAM,QAAQ,IAAI,0BAA0B,CAAC;AACpE,UAAO,QAAQ,mBAAmB,QAChC;IAAE,SAAS;IAAO,MAAM;IAAI,UAAU;IAAS,cAAc;IAAI,EACjE,EAAE,SAAS,MAAM,CAClB;IAEJ;EAED,MAAM,oBAAoB,MAAM,OAAO,gBAAgB,YAAY;AAEnE,gBAAc,aAAa,MAAM,OAAO,MAAM,WAAW,EACvD,UAAU,KAAK,KAAK,EACrB,CAAC;AAEF,SAAO;GACL,QAAQ;GACR,SAAS,EAAE,mBAAmB;GAC/B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TronWaitForTransactionTask.js","names":["BaseStepExecutionTask","TransactionError","LiFiErrorCode","stripHexPrefix","callTronRpcsWithRetry","getTronTxLink","waitForTronTxConfirmation"],"sources":["../../../../src/core/tasks/TronWaitForTransactionTask.ts"],"sourcesContent":["import {\n BaseStepExecutionTask,\n LiFiErrorCode,\n type TaskResult,\n TransactionError,\n} from '@lifi/sdk'\nimport { callTronRpcsWithRetry } from '../../rpc/callTronRpcsWithRetry.js'\nimport { waitForTronTxConfirmation } from '../../rpc/waitForTronTxConfirmation.js'\nimport type { TronStepExecutorContext } from '../../types.js'\nimport { getTronTxLink } from '../../utils/getTronTxLink.js'\nimport { stripHexPrefix } from '../../utils/stripHexPrefix.js'\n\nexport class TronWaitForTransactionTask extends BaseStepExecutionTask {\n async run(context: TronStepExecutorContext): Promise<TaskResult> {\n const {\n client,\n step,\n statusManager,\n fromChain,\n isBridgeExecution,\n signedTransaction,\n } = context\n\n if (!signedTransaction) {\n throw new TransactionError(\n LiFiErrorCode.TransactionUnprepared,\n 'Unable to prepare transaction. Signed transaction is not found.'\n )\n }\n\n const action = statusManager.findAction(\n step,\n isBridgeExecution ? 'CROSS_CHAIN' : 'SWAP'\n )\n if (!action) {\n throw new TransactionError(\n LiFiErrorCode.TransactionUnprepared,\n 'Unable to prepare transaction. Action not found.'\n )\n }\n\n const broadcastResult = await callTronRpcsWithRetry(\n client,\n async (tronWeb) => {\n const result = await tronWeb.trx.sendRawTransaction(signedTransaction)\n\n if (!result.result && String(result.code) !== 'DUP_TRANSACTION_ERROR') {\n throw new TransactionError(\n LiFiErrorCode.TransactionFailed,\n `Transaction broadcast failed: ${result.code || 'Unknown error'}`\n )\n }\n\n return result\n }\n )\n\n // DUP_TRANSACTION_ERROR responses omit the `transaction` field — fall back\n // to the txID computed locally from the signed transaction in that case.\n const txHash = stripHexPrefix(\n broadcastResult.transaction?.txID ?? signedTransaction.txID\n )\n\n statusManager.updateAction(step, action.type, 'PENDING', {\n txHash,\n txLink: getTronTxLink(fromChain, txHash),\n })\n\n await waitForTronTxConfirmation(client, txHash)\n\n if (isBridgeExecution) {\n statusManager.updateAction(step, action.type, 'DONE')\n }\n\n return { status: 'COMPLETED' }\n }\n}\n"],"mappings":";;;;;;;AAYA,IAAa,6BAAb,cAAgDA,UAAAA,sBAAsB;CACpE,MAAM,IAAI,SAAuD;EAC/D,MAAM,EACJ,QACA,MACA,eACA,WACA,mBACA,sBACE;AAEJ,MAAI,CAAC,kBACH,OAAM,IAAIC,UAAAA,iBACRC,UAAAA,cAAc,uBACd,kEACD;EAGH,MAAM,SAAS,cAAc,WAC3B,MACA,oBAAoB,gBAAgB,OACrC;AACD,MAAI,CAAC,OACH,OAAM,IAAID,UAAAA,iBACRC,UAAAA,cAAc,uBACd,mDACD;EAqBH,MAAM,SAASC,6BAAAA,
|
|
1
|
+
{"version":3,"file":"TronWaitForTransactionTask.js","names":["BaseStepExecutionTask","TransactionError","LiFiErrorCode","stripHexPrefix","callTronRpcsWithRetry","getTronTxLink","waitForTronTxConfirmation"],"sources":["../../../../src/core/tasks/TronWaitForTransactionTask.ts"],"sourcesContent":["import {\n BaseStepExecutionTask,\n LiFiErrorCode,\n type TaskResult,\n TransactionError,\n} from '@lifi/sdk'\nimport { callTronRpcsWithRetry } from '../../rpc/callTronRpcsWithRetry.js'\nimport { waitForTronTxConfirmation } from '../../rpc/waitForTronTxConfirmation.js'\nimport type { TronStepExecutorContext } from '../../types.js'\nimport { getTronTxLink } from '../../utils/getTronTxLink.js'\nimport { stripHexPrefix } from '../../utils/stripHexPrefix.js'\n\nexport class TronWaitForTransactionTask extends BaseStepExecutionTask {\n async run(context: TronStepExecutorContext): Promise<TaskResult> {\n const {\n client,\n step,\n statusManager,\n fromChain,\n isBridgeExecution,\n signedTransaction,\n } = context\n\n if (!signedTransaction) {\n throw new TransactionError(\n LiFiErrorCode.TransactionUnprepared,\n 'Unable to prepare transaction. Signed transaction is not found.'\n )\n }\n\n const action = statusManager.findAction(\n step,\n isBridgeExecution ? 'CROSS_CHAIN' : 'SWAP'\n )\n if (!action) {\n throw new TransactionError(\n LiFiErrorCode.TransactionUnprepared,\n 'Unable to prepare transaction. Action not found.'\n )\n }\n\n const broadcastResult = await callTronRpcsWithRetry(\n client,\n async (tronWeb) => {\n const result = await tronWeb.trx.sendRawTransaction(signedTransaction)\n\n if (!result.result && String(result.code) !== 'DUP_TRANSACTION_ERROR') {\n throw new TransactionError(\n LiFiErrorCode.TransactionFailed,\n `Transaction broadcast failed: ${result.code || 'Unknown error'}`\n )\n }\n\n return result\n }\n )\n\n // DUP_TRANSACTION_ERROR responses omit the `transaction` field — fall back\n // to the txID computed locally from the signed transaction in that case.\n const txHash = stripHexPrefix(\n broadcastResult.transaction?.txID ?? signedTransaction.txID\n )\n\n statusManager.updateAction(step, action.type, 'PENDING', {\n txHash,\n txLink: getTronTxLink(fromChain, txHash),\n })\n\n await waitForTronTxConfirmation(client, txHash)\n\n if (isBridgeExecution) {\n statusManager.updateAction(step, action.type, 'DONE')\n }\n\n return { status: 'COMPLETED' }\n }\n}\n"],"mappings":";;;;;;;AAYA,IAAa,6BAAb,cAAgDA,UAAAA,sBAAsB;CACpE,MAAM,IAAI,SAAuD;EAC/D,MAAM,EACJ,QACA,MACA,eACA,WACA,mBACA,sBACE;AAEJ,MAAI,CAAC,kBACH,OAAM,IAAIC,UAAAA,iBACRC,UAAAA,cAAc,uBACd,kEACD;EAGH,MAAM,SAAS,cAAc,WAC3B,MACA,oBAAoB,gBAAgB,OACrC;AACD,MAAI,CAAC,OACH,OAAM,IAAID,UAAAA,iBACRC,UAAAA,cAAc,uBACd,mDACD;EAqBH,MAAM,SAASC,6BAAAA,gBACb,MAnB4BC,kCAAAA,sBAC5B,QACA,OAAO,YAAY;GACjB,MAAM,SAAS,MAAM,QAAQ,IAAI,mBAAmB,kBAAkB;AAEtE,OAAI,CAAC,OAAO,UAAU,OAAO,OAAO,KAAK,KAAK,wBAC5C,OAAM,IAAIH,UAAAA,iBACRC,UAAAA,cAAc,mBACd,iCAAiC,OAAO,QAAQ,kBACjD;AAGH,UAAO;IAEV,EAKiB,aAAa,QAAQ,kBAAkB,KACxD;AAED,gBAAc,aAAa,MAAM,OAAO,MAAM,WAAW;GACvD;GACA,QAAQG,4BAAAA,cAAc,WAAW,OAAO;GACzC,CAAC;AAEF,QAAMC,sCAAAA,0BAA0B,QAAQ,OAAO;AAE/C,MAAI,kBACF,eAAc,aAAa,MAAM,OAAO,MAAM,OAAO;AAGvD,SAAO,EAAE,QAAQ,aAAa"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parseTronErrors.js","names":["SDKError","TransactionError","LiFiErrorCode","WalletSignTransactionError","WalletWindowClosedError","WalletNotFoundError","WalletNotSelectedError","ProviderError","WalletDisconnectedError","BaseError","UnknownError","ErrorMessage"],"sources":["../../../src/errors/parseTronErrors.ts"],"sourcesContent":["import {\n BaseError,\n ErrorMessage,\n type ExecutionAction,\n LiFiErrorCode,\n type LiFiStep,\n ProviderError,\n SDKError,\n TransactionError,\n UnknownError,\n} from '@lifi/sdk'\nimport {\n WalletDisconnectedError,\n WalletNotFoundError,\n WalletNotSelectedError,\n WalletSignTransactionError,\n WalletWindowClosedError,\n} from '@tronweb3/tronwallet-abstract-adapter'\n\n// \"BANDWITH\" is the Tron protocol's own misspelling. Matched by substring because\n// the error code can appear embedded within a larger error message from TronWeb.\nconst isBandwidthError = (message?: string): boolean =>\n !!message?.includes('BANDWITH_ERROR')\n\nexport const parseTronErrors = async (\n e: Error,\n step?: LiFiStep,\n action?: ExecutionAction\n): Promise<SDKError> => {\n if (e instanceof SDKError) {\n if (isBandwidthError(e.message)) {\n // Preserve the original cause (e.g. the TronWeb error) rather than wrapping\n // the outer SDKError — keeps log/stack traces pointing at the true origin.\n const baseError = new TransactionError(\n LiFiErrorCode.InsufficientFunds,\n 'Insufficient TRX for network bandwidth. The account needs more TRX to cover transaction fees.',\n (e.cause as Error | undefined) ?? e\n )\n return new SDKError(baseError, step ?? e.step, action ?? e.action)\n }\n e.step = e.step ?? step\n e.action = e.action ?? action\n return e\n }\n\n const baseError = handleSpecificErrors(e)\n\n return new SDKError(baseError, step, action)\n}\n\nconst handleSpecificErrors = (e: unknown): BaseError => {\n const message: string =\n typeof e === 'string' ? e : e instanceof Error ? e.message : ''\n const cause: Error | undefined = e instanceof Error ? e : undefined\n\n if (\n e instanceof WalletSignTransactionError ||\n e instanceof WalletWindowClosedError\n ) {\n return new TransactionError(LiFiErrorCode.SignatureRejected, message, e)\n }\n\n if (e instanceof WalletNotFoundError || e instanceof WalletNotSelectedError) {\n return new ProviderError(LiFiErrorCode.ProviderUnavailable, message, e)\n }\n\n if (e instanceof WalletDisconnectedError) {\n return new TransactionError(\n LiFiErrorCode.WalletChangedDuringExecution,\n message,\n e\n )\n }\n\n // TronWeb trx.sign() validation errors — string literals from tronweb@^6 (src/lib/trx.ts).\n // If upgrading tronweb, verify these strings haven't changed.\n if (\n message === 'Invalid transaction provided' ||\n message === 'Invalid transaction' ||\n message === 'Transaction is not signed'\n ) {\n return new TransactionError(\n LiFiErrorCode.TransactionUnprepared,\n message,\n cause\n )\n }\n\n if (message === 'Transaction is already signed') {\n return new TransactionError(LiFiErrorCode.TransactionFailed, message, cause)\n }\n\n if (message === 'Private key does not match address in transaction') {\n return new TransactionError(\n LiFiErrorCode.WalletChangedDuringExecution,\n message,\n cause\n )\n }\n\n if (isBandwidthError(message)) {\n return new TransactionError(\n LiFiErrorCode.InsufficientFunds,\n 'Insufficient TRX for network bandwidth. The account needs more TRX to cover transaction fees.',\n cause\n )\n }\n\n if (e instanceof BaseError) {\n return e\n }\n\n return new UnknownError(message || ErrorMessage.UnknownError, cause)\n}\n"],"mappings":";;;;AAqBA,MAAM,oBAAoB,YACxB,CAAC,CAAC,SAAS,SAAS,iBAAiB;AAEvC,MAAa,kBAAkB,OAC7B,GACA,MACA,WACsB;AACtB,KAAI,aAAaA,UAAAA,UAAU;AACzB,MAAI,iBAAiB,EAAE,QAAQ,CAQ7B,QAAO,IAAIA,UAAAA,
|
|
1
|
+
{"version":3,"file":"parseTronErrors.js","names":["SDKError","TransactionError","LiFiErrorCode","WalletSignTransactionError","WalletWindowClosedError","WalletNotFoundError","WalletNotSelectedError","ProviderError","WalletDisconnectedError","BaseError","UnknownError","ErrorMessage"],"sources":["../../../src/errors/parseTronErrors.ts"],"sourcesContent":["import {\n BaseError,\n ErrorMessage,\n type ExecutionAction,\n LiFiErrorCode,\n type LiFiStep,\n ProviderError,\n SDKError,\n TransactionError,\n UnknownError,\n} from '@lifi/sdk'\nimport {\n WalletDisconnectedError,\n WalletNotFoundError,\n WalletNotSelectedError,\n WalletSignTransactionError,\n WalletWindowClosedError,\n} from '@tronweb3/tronwallet-abstract-adapter'\n\n// \"BANDWITH\" is the Tron protocol's own misspelling. Matched by substring because\n// the error code can appear embedded within a larger error message from TronWeb.\nconst isBandwidthError = (message?: string): boolean =>\n !!message?.includes('BANDWITH_ERROR')\n\nexport const parseTronErrors = async (\n e: Error,\n step?: LiFiStep,\n action?: ExecutionAction\n): Promise<SDKError> => {\n if (e instanceof SDKError) {\n if (isBandwidthError(e.message)) {\n // Preserve the original cause (e.g. the TronWeb error) rather than wrapping\n // the outer SDKError — keeps log/stack traces pointing at the true origin.\n const baseError = new TransactionError(\n LiFiErrorCode.InsufficientFunds,\n 'Insufficient TRX for network bandwidth. The account needs more TRX to cover transaction fees.',\n (e.cause as Error | undefined) ?? e\n )\n return new SDKError(baseError, step ?? e.step, action ?? e.action)\n }\n e.step = e.step ?? step\n e.action = e.action ?? action\n return e\n }\n\n const baseError = handleSpecificErrors(e)\n\n return new SDKError(baseError, step, action)\n}\n\nconst handleSpecificErrors = (e: unknown): BaseError => {\n const message: string =\n typeof e === 'string' ? e : e instanceof Error ? e.message : ''\n const cause: Error | undefined = e instanceof Error ? e : undefined\n\n if (\n e instanceof WalletSignTransactionError ||\n e instanceof WalletWindowClosedError\n ) {\n return new TransactionError(LiFiErrorCode.SignatureRejected, message, e)\n }\n\n if (e instanceof WalletNotFoundError || e instanceof WalletNotSelectedError) {\n return new ProviderError(LiFiErrorCode.ProviderUnavailable, message, e)\n }\n\n if (e instanceof WalletDisconnectedError) {\n return new TransactionError(\n LiFiErrorCode.WalletChangedDuringExecution,\n message,\n e\n )\n }\n\n // TronWeb trx.sign() validation errors — string literals from tronweb@^6 (src/lib/trx.ts).\n // If upgrading tronweb, verify these strings haven't changed.\n if (\n message === 'Invalid transaction provided' ||\n message === 'Invalid transaction' ||\n message === 'Transaction is not signed'\n ) {\n return new TransactionError(\n LiFiErrorCode.TransactionUnprepared,\n message,\n cause\n )\n }\n\n if (message === 'Transaction is already signed') {\n return new TransactionError(LiFiErrorCode.TransactionFailed, message, cause)\n }\n\n if (message === 'Private key does not match address in transaction') {\n return new TransactionError(\n LiFiErrorCode.WalletChangedDuringExecution,\n message,\n cause\n )\n }\n\n if (isBandwidthError(message)) {\n return new TransactionError(\n LiFiErrorCode.InsufficientFunds,\n 'Insufficient TRX for network bandwidth. The account needs more TRX to cover transaction fees.',\n cause\n )\n }\n\n if (e instanceof BaseError) {\n return e\n }\n\n return new UnknownError(message || ErrorMessage.UnknownError, cause)\n}\n"],"mappings":";;;;AAqBA,MAAM,oBAAoB,YACxB,CAAC,CAAC,SAAS,SAAS,iBAAiB;AAEvC,MAAa,kBAAkB,OAC7B,GACA,MACA,WACsB;AACtB,KAAI,aAAaA,UAAAA,UAAU;AACzB,MAAI,iBAAiB,EAAE,QAAQ,CAQ7B,QAAO,IAAIA,UAAAA,SAAS,IALEC,UAAAA,iBACpBC,UAAAA,cAAc,mBACd,iGACC,EAAE,SAA+B,EAEP,EAAE,QAAQ,EAAE,MAAM,UAAU,EAAE,OAAO;AAEpE,IAAE,OAAO,EAAE,QAAQ;AACnB,IAAE,SAAS,EAAE,UAAU;AACvB,SAAO;;AAKT,QAAO,IAAIF,UAAAA,SAFO,qBAAqB,EAEV,EAAE,MAAM,OAAO;;AAG9C,MAAM,wBAAwB,MAA0B;CACtD,MAAM,UACJ,OAAO,MAAM,WAAW,IAAI,aAAa,QAAQ,EAAE,UAAU;CAC/D,MAAM,QAA2B,aAAa,QAAQ,IAAI,KAAA;AAE1D,KACE,aAAaG,sCAAAA,8BACb,aAAaC,sCAAAA,wBAEb,QAAO,IAAIH,UAAAA,iBAAiBC,UAAAA,cAAc,mBAAmB,SAAS,EAAE;AAG1E,KAAI,aAAaG,sCAAAA,uBAAuB,aAAaC,sCAAAA,uBACnD,QAAO,IAAIC,UAAAA,cAAcL,UAAAA,cAAc,qBAAqB,SAAS,EAAE;AAGzE,KAAI,aAAaM,sCAAAA,wBACf,QAAO,IAAIP,UAAAA,iBACTC,UAAAA,cAAc,8BACd,SACA,EACD;AAKH,KACE,YAAY,kCACZ,YAAY,yBACZ,YAAY,4BAEZ,QAAO,IAAID,UAAAA,iBACTC,UAAAA,cAAc,uBACd,SACA,MACD;AAGH,KAAI,YAAY,gCACd,QAAO,IAAID,UAAAA,iBAAiBC,UAAAA,cAAc,mBAAmB,SAAS,MAAM;AAG9E,KAAI,YAAY,oDACd,QAAO,IAAID,UAAAA,iBACTC,UAAAA,cAAc,8BACd,SACA,MACD;AAGH,KAAI,iBAAiB,QAAQ,CAC3B,QAAO,IAAID,UAAAA,iBACTC,UAAAA,cAAc,mBACd,iGACA,MACD;AAGH,KAAI,aAAaO,UAAAA,UACf,QAAO;AAGT,QAAO,IAAIC,UAAAA,aAAa,WAAWC,UAAAA,aAAa,cAAc,MAAM"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"address.js","names":["TronWeb"],"sources":["../../../src/utils/address.ts"],"sourcesContent":["import { TronWeb } from 'tronweb'\n\n// TronWeb.address.toHex returns a 41-prefixed hex string for valid Tron base58 addresses.\n// Replacing the leading '41' with '0x' yields the standard EVM-format hex address.\nexport function toEvmHex(tronAddress: string): string {\n const hex = TronWeb.address.toHex(tronAddress)\n if (!hex.startsWith('41')) {\n throw new Error(`Unexpected Tron address hex prefix: ${hex}`)\n }\n return `0x${hex.slice(2)}`\n}\n\nexport function encodeAddressCalldata(\n selector: string,\n address: string\n): string {\n // Pad 20-byte address to 32 bytes, left-padded with zeros\n const addr = address.replace(/^0x/, '').padStart(64, '0')\n return `0x${selector}${addr}`\n}\n"],"mappings":";;;AAIA,SAAgB,SAAS,aAA6B;CACpD,MAAM,MAAMA,QAAAA,QAAQ,QAAQ,MAAM,YAAY;AAC9C,KAAI,CAAC,IAAI,WAAW,KAAK,CACvB,OAAM,IAAI,MAAM,uCAAuC,MAAM;AAE/D,QAAO,KAAK,IAAI,MAAM,EAAE;;AAG1B,SAAgB,sBACd,UACA,SACQ;AAGR,QAAO,KAAK,WADC,QAAQ,QAAQ,OAAO,GAAG,CAAC,SAAS,IAAI,
|
|
1
|
+
{"version":3,"file":"address.js","names":["TronWeb"],"sources":["../../../src/utils/address.ts"],"sourcesContent":["import { TronWeb } from 'tronweb'\n\n// TronWeb.address.toHex returns a 41-prefixed hex string for valid Tron base58 addresses.\n// Replacing the leading '41' with '0x' yields the standard EVM-format hex address.\nexport function toEvmHex(tronAddress: string): string {\n const hex = TronWeb.address.toHex(tronAddress)\n if (!hex.startsWith('41')) {\n throw new Error(`Unexpected Tron address hex prefix: ${hex}`)\n }\n return `0x${hex.slice(2)}`\n}\n\nexport function encodeAddressCalldata(\n selector: string,\n address: string\n): string {\n // Pad 20-byte address to 32 bytes, left-padded with zeros\n const addr = address.replace(/^0x/, '').padStart(64, '0')\n return `0x${selector}${addr}`\n}\n"],"mappings":";;;AAIA,SAAgB,SAAS,aAA6B;CACpD,MAAM,MAAMA,QAAAA,QAAQ,QAAQ,MAAM,YAAY;AAC9C,KAAI,CAAC,IAAI,WAAW,KAAK,CACvB,OAAM,IAAI,MAAM,uCAAuC,MAAM;AAE/D,QAAO,KAAK,IAAI,MAAM,EAAE;;AAG1B,SAAgB,sBACd,UACA,SACQ;AAGR,QAAO,KAAK,WADC,QAAQ,QAAQ,OAAO,GAAG,CAAC,SAAS,IAAI,IAC1B"}
|
package/dist/cjs/version.d.ts
CHANGED
package/dist/cjs/version.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
2
|
//#region src/version.ts
|
|
3
3
|
const name = "@lifi/sdk-provider-tron";
|
|
4
|
-
const version = "4.0.0-beta.
|
|
4
|
+
const version = "4.0.0-beta.8";
|
|
5
5
|
//#endregion
|
|
6
6
|
exports.name = name;
|
|
7
7
|
exports.version = version;
|
package/dist/cjs/version.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"version.js","names":[],"sources":["../../src/version.ts"],"sourcesContent":["export const name = '@lifi/sdk-provider-tron'\nexport const version = '4.0.0-beta.
|
|
1
|
+
{"version":3,"file":"version.js","names":[],"sources":["../../src/version.ts"],"sourcesContent":["export const name = '@lifi/sdk-provider-tron'\nexport const version = '4.0.0-beta.8'\n"],"mappings":";;AAAA,MAAa,OAAO;AACpB,MAAa,UAAU"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TronProvider.js","names":[],"sources":["../../src/TronProvider.ts"],"sourcesContent":["import {\n ChainType,\n LiFiErrorCode,\n ProviderError,\n type StepExecutorOptions,\n} from '@lifi/sdk'\nimport { TronWeb } from 'tronweb'\nimport { getTronBalance } from './actions/getTronBalance.js'\nimport { resolveTronAddress } from './actions/resolveTronAddress.js'\nimport { TronStepExecutor } from './core/TronStepExecutor.js'\nimport type { TronProviderOptions, TronSDKProvider } from './types.js'\n\nexport function TronProvider(options?: TronProviderOptions): TronSDKProvider {\n const _options: TronProviderOptions = options ?? {}\n return {\n get type() {\n return ChainType.TVM\n },\n isAddress: (address: string) => TronWeb.isAddress(address),\n resolveAddress: resolveTronAddress,\n getBalance: (client, walletAddress, tokens) =>\n getTronBalance(\n client,\n walletAddress,\n tokens,\n _options.multicallBatchSize\n ),\n async getStepExecutor(\n options: StepExecutorOptions\n ): Promise<TronStepExecutor> {\n if (!_options.getWallet) {\n throw new ProviderError(\n LiFiErrorCode.ProviderUnavailable,\n 'TronProvider requires a getWallet function.'\n )\n }\n\n const wallet = await _options.getWallet()\n\n const executor = new TronStepExecutor({\n wallet,\n routeId: options.routeId,\n executionOptions: options.executionOptions,\n })\n\n return executor\n },\n setOptions(options: TronProviderOptions) {\n Object.assign(_options, options)\n },\n }\n}\n"],"mappings":";;;;;;AAYA,SAAgB,aAAa,SAAgD;CAC3E,MAAM,WAAgC,WAAW,EAAE;AACnD,QAAO;EACL,IAAI,OAAO;AACT,UAAO,UAAU;;EAEnB,YAAY,YAAoB,QAAQ,UAAU,QAAQ;EAC1D,gBAAgB;EAChB,aAAa,QAAQ,eAAe,WAClC,eACE,QACA,eACA,QACA,SAAS,mBACV;EACH,MAAM,gBACJ,SAC2B;AAC3B,OAAI,CAAC,SAAS,UACZ,OAAM,IAAI,cACR,cAAc,qBACd,8CACD;AAWH,
|
|
1
|
+
{"version":3,"file":"TronProvider.js","names":[],"sources":["../../src/TronProvider.ts"],"sourcesContent":["import {\n ChainType,\n LiFiErrorCode,\n ProviderError,\n type StepExecutorOptions,\n} from '@lifi/sdk'\nimport { TronWeb } from 'tronweb'\nimport { getTronBalance } from './actions/getTronBalance.js'\nimport { resolveTronAddress } from './actions/resolveTronAddress.js'\nimport { TronStepExecutor } from './core/TronStepExecutor.js'\nimport type { TronProviderOptions, TronSDKProvider } from './types.js'\n\nexport function TronProvider(options?: TronProviderOptions): TronSDKProvider {\n const _options: TronProviderOptions = options ?? {}\n return {\n get type() {\n return ChainType.TVM\n },\n isAddress: (address: string) => TronWeb.isAddress(address),\n resolveAddress: resolveTronAddress,\n getBalance: (client, walletAddress, tokens) =>\n getTronBalance(\n client,\n walletAddress,\n tokens,\n _options.multicallBatchSize\n ),\n async getStepExecutor(\n options: StepExecutorOptions\n ): Promise<TronStepExecutor> {\n if (!_options.getWallet) {\n throw new ProviderError(\n LiFiErrorCode.ProviderUnavailable,\n 'TronProvider requires a getWallet function.'\n )\n }\n\n const wallet = await _options.getWallet()\n\n const executor = new TronStepExecutor({\n wallet,\n routeId: options.routeId,\n executionOptions: options.executionOptions,\n })\n\n return executor\n },\n setOptions(options: TronProviderOptions) {\n Object.assign(_options, options)\n },\n }\n}\n"],"mappings":";;;;;;AAYA,SAAgB,aAAa,SAAgD;CAC3E,MAAM,WAAgC,WAAW,EAAE;AACnD,QAAO;EACL,IAAI,OAAO;AACT,UAAO,UAAU;;EAEnB,YAAY,YAAoB,QAAQ,UAAU,QAAQ;EAC1D,gBAAgB;EAChB,aAAa,QAAQ,eAAe,WAClC,eACE,QACA,eACA,QACA,SAAS,mBACV;EACH,MAAM,gBACJ,SAC2B;AAC3B,OAAI,CAAC,SAAS,UACZ,OAAM,IAAI,cACR,cAAc,qBACd,8CACD;AAWH,UAAO,IANc,iBAAiB;IACpC,QAAA,MAHmB,SAAS,WAAW;IAIvC,SAAS,QAAQ;IACjB,kBAAkB,QAAQ;IAC3B,CAEc;;EAEjB,WAAW,SAA8B;AACvC,UAAO,OAAO,UAAU,QAAQ;;EAEnC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getMulticallAddress.js","names":[],"sources":["../../../src/actions/getMulticallAddress.ts"],"sourcesContent":["import { type ChainId, ChainType, type SDKClient } from '@lifi/sdk'\n\nexport const getMulticallAddress = async (\n client: SDKClient,\n chainId: ChainId\n): Promise<string | undefined> => {\n const chains = await client.getChains()\n return chains?.find(\n (chain) => chain.id === chainId && chain.chainType === ChainType.TVM\n )?.multicallAddress\n}\n"],"mappings":";;AAEA,MAAa,sBAAsB,OACjC,QACA,YACgC;AAEhC,
|
|
1
|
+
{"version":3,"file":"getMulticallAddress.js","names":[],"sources":["../../../src/actions/getMulticallAddress.ts"],"sourcesContent":["import { type ChainId, ChainType, type SDKClient } from '@lifi/sdk'\n\nexport const getMulticallAddress = async (\n client: SDKClient,\n chainId: ChainId\n): Promise<string | undefined> => {\n const chains = await client.getChains()\n return chains?.find(\n (chain) => chain.id === chainId && chain.chainType === ChainType.TVM\n )?.multicallAddress\n}\n"],"mappings":";;AAEA,MAAa,sBAAsB,OACjC,QACA,YACgC;AAEhC,SAAO,MADc,OAAO,WAAW,GACxB,MACZ,UAAU,MAAM,OAAO,WAAW,MAAM,cAAc,UAAU,IAClE,EAAE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getTronBalance.js","names":[],"sources":["../../../src/actions/getTronBalance.ts"],"sourcesContent":["import type { SDKClient, Token, TokenAmount } from '@lifi/sdk'\nimport { withDedupe } from '@lifi/sdk'\nimport { TronWeb } from 'tronweb'\nimport { DEFAULT_MULTICALL_BATCH_SIZE } from '../core/constants.js'\nimport { callTronRpcsWithRetry } from '../rpc/callTronRpcsWithRetry.js'\nimport { encodeAddressCalldata, toEvmHex } from '../utils/address.js'\nimport { isZeroAddress } from '../utils/isZeroAddress.js'\nimport { multicall3Abi } from '../utils/multicall3Abi.js'\nimport { getMulticallAddress } from './getMulticallAddress.js'\n\nconst BALANCE_OF_SELECTOR = TronWeb.sha3('balanceOf(address)').slice(2, 10)\nconst GET_ETH_BALANCE_SELECTOR = TronWeb.sha3('getEthBalance(address)').slice(\n 2,\n 10\n)\n\nexport const getTronBalance = async (\n client: SDKClient,\n walletAddress: string,\n tokens: Token[],\n multicallBatchSize: number = DEFAULT_MULTICALL_BATCH_SIZE\n): Promise<TokenAmount[]> => {\n if (tokens.length === 0) {\n return []\n }\n const { chainId } = tokens[0]\n for (const token of tokens) {\n if (token.chainId !== chainId) {\n console.warn('Requested tokens have to be on the same chain.')\n }\n }\n\n const multicallAddress = await getMulticallAddress(client, chainId)\n\n if (multicallAddress && tokens.length > 1) {\n return getTronBalanceMulticall(\n client,\n tokens,\n walletAddress,\n multicallAddress,\n multicallBatchSize\n )\n }\n\n return getTronBalanceDefault(client, tokens, walletAddress)\n}\n\nconst getTronBalanceMulticall = async (\n client: SDKClient,\n tokens: Token[],\n walletAddress: string,\n multicallAddress: string,\n batchSize: number\n): Promise<TokenAmount[]> => {\n const walletHex = toEvmHex(walletAddress)\n const multicallHex = toEvmHex(multicallAddress)\n\n const [blockNumber, results] = await callTronRpcsWithRetry(\n client,\n async (tronWeb) => {\n const contract = tronWeb.contract(multicall3Abi, multicallAddress)\n\n // TronWeb encodes tuples positionally: [target, allowFailure, callData]\n const allCalls = tokens.map((token) => {\n const isNative = isZeroAddress(token.address)\n return [\n isNative ? multicallHex : toEvmHex(token.address),\n true,\n encodeAddressCalldata(\n isNative ? GET_ETH_BALANCE_SELECTOR : BALANCE_OF_SELECTOR,\n walletHex\n ),\n ]\n })\n\n // Chunk calls to avoid CPU timeout on Tron nodes\n const batches: (typeof allCalls)[] = []\n for (let i = 0; i < allCalls.length; i += batchSize) {\n batches.push(allCalls.slice(i, i + batchSize))\n }\n\n const [block, ...batchResults] = await Promise.all([\n tronWeb.trx.getCurrentBlock(),\n ...batches.map((batch, idx) =>\n contract\n .aggregate3(batch)\n .call({ from: walletAddress })\n // TronWeb wraps the single return value in an extra array\n .then((r: unknown[]) => r[0] as Array<[boolean, string]>)\n .catch((error: Error) => {\n console.warn(\n `[getTronBalance] batch ${idx + 1}/${batches.length} failed:`,\n error.message\n )\n return batch.map(() => [false, '0x'] as [boolean, string])\n })\n ),\n ])\n\n const blockNumber = block.block_header?.raw_data?.number\n return [\n blockNumber !== undefined ? BigInt(blockNumber) : undefined,\n batchResults.flat(),\n ]\n }\n )\n\n return tokens.map((token, i) => {\n // Guard against an unexpected length mismatch between tokens and flattened batch results.\n const entry = results[i] as [boolean, string] | undefined\n if (!entry) {\n return { ...token, blockNumber }\n }\n const [success, returnData] = entry\n if (!success) {\n // RPC failure: amount is omitted (undefined)\n // Consumers must treat a missing amount as \"balance unavailable\", not zero.\n return { ...token, blockNumber }\n }\n return { ...token, amount: BigInt(returnData), blockNumber }\n })\n}\n\nconst getTronBalanceDefault = async (\n client: SDKClient,\n tokens: Token[],\n walletAddress: string\n): Promise<TokenAmount[]> => {\n const [blockNumber, results] = await callTronRpcsWithRetry(\n client,\n async (tronWeb) => {\n const host = tronWeb.fullNode.host\n const queue: Promise<bigint>[] = tokens.map((token) => {\n if (isZeroAddress(token.address)) {\n return withDedupe(\n async () => BigInt(await tronWeb.trx.getBalance(walletAddress)),\n { id: `${getTronBalanceDefault.name}.getBalance.${host}` }\n )\n }\n return withDedupe(\n async () => {\n const contract = await tronWeb.contract().at(token.address)\n const balance = await contract\n .balanceOf(walletAddress)\n .call({ from: walletAddress })\n return BigInt(balance.toString())\n },\n {\n id: `${getTronBalanceDefault.name}.balanceOf.${token.address}.${host}`,\n }\n )\n })\n\n return Promise.all([\n withDedupe(\n async (): Promise<bigint | undefined> => {\n const block = await tronWeb.trx.getCurrentBlock()\n const n = block.block_header?.raw_data?.number\n return n !== undefined ? BigInt(n) : undefined\n },\n { id: `${getTronBalanceDefault.name}.getCurrentBlock.${host}` }\n ),\n Promise.allSettled(queue),\n ])\n }\n )\n\n const tokenAmounts: TokenAmount[] = tokens.map((token, index) => {\n const result = results[index]\n if (result.status === 'rejected') {\n // RPC failure: amount is omitted (undefined), matching getSolanaBalance's contract.\n // Consumers must treat a missing amount as \"balance unavailable\", not zero.\n return { ...token, blockNumber }\n }\n return { ...token, amount: result.value, blockNumber }\n })\n\n return tokenAmounts\n}\n"],"mappings":";;;;;;;;;AAUA,MAAM,sBAAsB,QAAQ,KAAK,qBAAqB,CAAC,MAAM,GAAG,GAAG;AAC3E,MAAM,2BAA2B,QAAQ,KAAK,yBAAyB,CAAC,MACtE,GACA,GACD;AAED,MAAa,iBAAiB,OAC5B,QACA,eACA,QACA,qBAAA,OAC2B;AAC3B,KAAI,OAAO,WAAW,EACpB,QAAO,EAAE;CAEX,MAAM,EAAE,YAAY,OAAO;AAC3B,MAAK,MAAM,SAAS,OAClB,KAAI,MAAM,YAAY,QACpB,SAAQ,KAAK,iDAAiD;CAIlE,MAAM,mBAAmB,MAAM,oBAAoB,QAAQ,QAAQ;AAEnE,KAAI,oBAAoB,OAAO,SAAS,EACtC,QAAO,wBACL,QACA,QACA,eACA,kBACA,mBACD;AAGH,QAAO,sBAAsB,QAAQ,QAAQ,cAAc;;AAG7D,MAAM,0BAA0B,OAC9B,QACA,QACA,eACA,kBACA,cAC2B;CAC3B,MAAM,YAAY,SAAS,cAAc;CACzC,MAAM,eAAe,SAAS,iBAAiB;CAE/C,MAAM,CAAC,aAAa,WAAW,MAAM,sBACnC,QACA,OAAO,YAAY;EACjB,MAAM,WAAW,QAAQ,SAAS,eAAe,iBAAiB;EAGlE,MAAM,WAAW,OAAO,KAAK,UAAU;GACrC,MAAM,WAAW,cAAc,MAAM,QAAQ;AAC7C,UAAO;IACL,WAAW,eAAe,SAAS,MAAM,QAAQ;IACjD;IACA,sBACE,WAAW,2BAA2B,qBACtC,UACD;IACF;IACD;EAGF,MAAM,UAA+B,EAAE;AACvC,OAAK,IAAI,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK,UACxC,SAAQ,KAAK,SAAS,MAAM,GAAG,IAAI,UAAU,CAAC;EAGhD,MAAM,CAAC,OAAO,GAAG,gBAAgB,MAAM,QAAQ,IAAI,CACjD,QAAQ,IAAI,iBAAiB,EAC7B,GAAG,QAAQ,KAAK,OAAO,QACrB,SACG,WAAW,MAAM,CACjB,KAAK,EAAE,MAAM,eAAe,CAAC,CAE7B,MAAM,MAAiB,EAAE,GAA+B,CACxD,OAAO,UAAiB;AACvB,WAAQ,KACN,0BAA0B,MAAM,EAAE,GAAG,QAAQ,OAAO,WACpD,MAAM,QACP;AACD,UAAO,MAAM,UAAU,CAAC,OAAO,KAAK,CAAsB;IAC1D,CACL,CACF,CAAC;EAEF,MAAM,cAAc,MAAM,cAAc,UAAU;AAClD,SAAO,CACL,gBAAgB,KAAA,IAAY,OAAO,YAAY,GAAG,KAAA,GAClD,aAAa,MAAM,CACpB;GAEJ;AAED,QAAO,OAAO,KAAK,OAAO,MAAM;EAE9B,MAAM,QAAQ,QAAQ;AACtB,MAAI,CAAC,MACH,QAAO;GAAE,GAAG;GAAO;GAAa;EAElC,MAAM,CAAC,SAAS,cAAc;AAC9B,MAAI,CAAC,QAGH,QAAO;GAAE,GAAG;GAAO;GAAa;AAElC,SAAO;GAAE,GAAG;GAAO,QAAQ,OAAO,WAAW;GAAE;GAAa;GAC5D;;AAGJ,MAAM,wBAAwB,OAC5B,QACA,QACA,kBAC2B;CAC3B,MAAM,CAAC,aAAa,WAAW,MAAM,sBACnC,QACA,OAAO,YAAY;EACjB,MAAM,OAAO,QAAQ,SAAS;EAC9B,MAAM,QAA2B,OAAO,KAAK,UAAU;AACrD,OAAI,cAAc,MAAM,QAAQ,CAC9B,QAAO,WACL,YAAY,OAAO,MAAM,QAAQ,IAAI,WAAW,cAAc,CAAC,EAC/D,EAAE,IAAI,GAAG,sBAAsB,KAAK,cAAc,QAAQ,CAC3D;AAEH,UAAO,WACL,YAAY;IAEV,MAAM,UAAU,
|
|
1
|
+
{"version":3,"file":"getTronBalance.js","names":[],"sources":["../../../src/actions/getTronBalance.ts"],"sourcesContent":["import type { SDKClient, Token, TokenAmount } from '@lifi/sdk'\nimport { withDedupe } from '@lifi/sdk'\nimport { TronWeb } from 'tronweb'\nimport { DEFAULT_MULTICALL_BATCH_SIZE } from '../core/constants.js'\nimport { callTronRpcsWithRetry } from '../rpc/callTronRpcsWithRetry.js'\nimport { encodeAddressCalldata, toEvmHex } from '../utils/address.js'\nimport { isZeroAddress } from '../utils/isZeroAddress.js'\nimport { multicall3Abi } from '../utils/multicall3Abi.js'\nimport { getMulticallAddress } from './getMulticallAddress.js'\n\nconst BALANCE_OF_SELECTOR = TronWeb.sha3('balanceOf(address)').slice(2, 10)\nconst GET_ETH_BALANCE_SELECTOR = TronWeb.sha3('getEthBalance(address)').slice(\n 2,\n 10\n)\n\nexport const getTronBalance = async (\n client: SDKClient,\n walletAddress: string,\n tokens: Token[],\n multicallBatchSize: number = DEFAULT_MULTICALL_BATCH_SIZE\n): Promise<TokenAmount[]> => {\n if (tokens.length === 0) {\n return []\n }\n const { chainId } = tokens[0]\n for (const token of tokens) {\n if (token.chainId !== chainId) {\n console.warn('Requested tokens have to be on the same chain.')\n }\n }\n\n const multicallAddress = await getMulticallAddress(client, chainId)\n\n if (multicallAddress && tokens.length > 1) {\n return getTronBalanceMulticall(\n client,\n tokens,\n walletAddress,\n multicallAddress,\n multicallBatchSize\n )\n }\n\n return getTronBalanceDefault(client, tokens, walletAddress)\n}\n\nconst getTronBalanceMulticall = async (\n client: SDKClient,\n tokens: Token[],\n walletAddress: string,\n multicallAddress: string,\n batchSize: number\n): Promise<TokenAmount[]> => {\n const walletHex = toEvmHex(walletAddress)\n const multicallHex = toEvmHex(multicallAddress)\n\n const [blockNumber, results] = await callTronRpcsWithRetry(\n client,\n async (tronWeb) => {\n const contract = tronWeb.contract(multicall3Abi, multicallAddress)\n\n // TronWeb encodes tuples positionally: [target, allowFailure, callData]\n const allCalls = tokens.map((token) => {\n const isNative = isZeroAddress(token.address)\n return [\n isNative ? multicallHex : toEvmHex(token.address),\n true,\n encodeAddressCalldata(\n isNative ? GET_ETH_BALANCE_SELECTOR : BALANCE_OF_SELECTOR,\n walletHex\n ),\n ]\n })\n\n // Chunk calls to avoid CPU timeout on Tron nodes\n const batches: (typeof allCalls)[] = []\n for (let i = 0; i < allCalls.length; i += batchSize) {\n batches.push(allCalls.slice(i, i + batchSize))\n }\n\n const [block, ...batchResults] = await Promise.all([\n tronWeb.trx.getCurrentBlock(),\n ...batches.map((batch, idx) =>\n contract\n .aggregate3(batch)\n .call({ from: walletAddress })\n // TronWeb wraps the single return value in an extra array\n .then((r: unknown[]) => r[0] as Array<[boolean, string]>)\n .catch((error: Error) => {\n console.warn(\n `[getTronBalance] batch ${idx + 1}/${batches.length} failed:`,\n error.message\n )\n return batch.map(() => [false, '0x'] as [boolean, string])\n })\n ),\n ])\n\n const blockNumber = block.block_header?.raw_data?.number\n return [\n blockNumber !== undefined ? BigInt(blockNumber) : undefined,\n batchResults.flat(),\n ]\n }\n )\n\n return tokens.map((token, i) => {\n // Guard against an unexpected length mismatch between tokens and flattened batch results.\n const entry = results[i] as [boolean, string] | undefined\n if (!entry) {\n return { ...token, blockNumber }\n }\n const [success, returnData] = entry\n if (!success) {\n // RPC failure: amount is omitted (undefined)\n // Consumers must treat a missing amount as \"balance unavailable\", not zero.\n return { ...token, blockNumber }\n }\n return { ...token, amount: BigInt(returnData), blockNumber }\n })\n}\n\nconst getTronBalanceDefault = async (\n client: SDKClient,\n tokens: Token[],\n walletAddress: string\n): Promise<TokenAmount[]> => {\n const [blockNumber, results] = await callTronRpcsWithRetry(\n client,\n async (tronWeb) => {\n const host = tronWeb.fullNode.host\n const queue: Promise<bigint>[] = tokens.map((token) => {\n if (isZeroAddress(token.address)) {\n return withDedupe(\n async () => BigInt(await tronWeb.trx.getBalance(walletAddress)),\n { id: `${getTronBalanceDefault.name}.getBalance.${host}` }\n )\n }\n return withDedupe(\n async () => {\n const contract = await tronWeb.contract().at(token.address)\n const balance = await contract\n .balanceOf(walletAddress)\n .call({ from: walletAddress })\n return BigInt(balance.toString())\n },\n {\n id: `${getTronBalanceDefault.name}.balanceOf.${token.address}.${host}`,\n }\n )\n })\n\n return Promise.all([\n withDedupe(\n async (): Promise<bigint | undefined> => {\n const block = await tronWeb.trx.getCurrentBlock()\n const n = block.block_header?.raw_data?.number\n return n !== undefined ? BigInt(n) : undefined\n },\n { id: `${getTronBalanceDefault.name}.getCurrentBlock.${host}` }\n ),\n Promise.allSettled(queue),\n ])\n }\n )\n\n const tokenAmounts: TokenAmount[] = tokens.map((token, index) => {\n const result = results[index]\n if (result.status === 'rejected') {\n // RPC failure: amount is omitted (undefined), matching getSolanaBalance's contract.\n // Consumers must treat a missing amount as \"balance unavailable\", not zero.\n return { ...token, blockNumber }\n }\n return { ...token, amount: result.value, blockNumber }\n })\n\n return tokenAmounts\n}\n"],"mappings":";;;;;;;;;AAUA,MAAM,sBAAsB,QAAQ,KAAK,qBAAqB,CAAC,MAAM,GAAG,GAAG;AAC3E,MAAM,2BAA2B,QAAQ,KAAK,yBAAyB,CAAC,MACtE,GACA,GACD;AAED,MAAa,iBAAiB,OAC5B,QACA,eACA,QACA,qBAAA,OAC2B;AAC3B,KAAI,OAAO,WAAW,EACpB,QAAO,EAAE;CAEX,MAAM,EAAE,YAAY,OAAO;AAC3B,MAAK,MAAM,SAAS,OAClB,KAAI,MAAM,YAAY,QACpB,SAAQ,KAAK,iDAAiD;CAIlE,MAAM,mBAAmB,MAAM,oBAAoB,QAAQ,QAAQ;AAEnE,KAAI,oBAAoB,OAAO,SAAS,EACtC,QAAO,wBACL,QACA,QACA,eACA,kBACA,mBACD;AAGH,QAAO,sBAAsB,QAAQ,QAAQ,cAAc;;AAG7D,MAAM,0BAA0B,OAC9B,QACA,QACA,eACA,kBACA,cAC2B;CAC3B,MAAM,YAAY,SAAS,cAAc;CACzC,MAAM,eAAe,SAAS,iBAAiB;CAE/C,MAAM,CAAC,aAAa,WAAW,MAAM,sBACnC,QACA,OAAO,YAAY;EACjB,MAAM,WAAW,QAAQ,SAAS,eAAe,iBAAiB;EAGlE,MAAM,WAAW,OAAO,KAAK,UAAU;GACrC,MAAM,WAAW,cAAc,MAAM,QAAQ;AAC7C,UAAO;IACL,WAAW,eAAe,SAAS,MAAM,QAAQ;IACjD;IACA,sBACE,WAAW,2BAA2B,qBACtC,UACD;IACF;IACD;EAGF,MAAM,UAA+B,EAAE;AACvC,OAAK,IAAI,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK,UACxC,SAAQ,KAAK,SAAS,MAAM,GAAG,IAAI,UAAU,CAAC;EAGhD,MAAM,CAAC,OAAO,GAAG,gBAAgB,MAAM,QAAQ,IAAI,CACjD,QAAQ,IAAI,iBAAiB,EAC7B,GAAG,QAAQ,KAAK,OAAO,QACrB,SACG,WAAW,MAAM,CACjB,KAAK,EAAE,MAAM,eAAe,CAAC,CAE7B,MAAM,MAAiB,EAAE,GAA+B,CACxD,OAAO,UAAiB;AACvB,WAAQ,KACN,0BAA0B,MAAM,EAAE,GAAG,QAAQ,OAAO,WACpD,MAAM,QACP;AACD,UAAO,MAAM,UAAU,CAAC,OAAO,KAAK,CAAsB;IAC1D,CACL,CACF,CAAC;EAEF,MAAM,cAAc,MAAM,cAAc,UAAU;AAClD,SAAO,CACL,gBAAgB,KAAA,IAAY,OAAO,YAAY,GAAG,KAAA,GAClD,aAAa,MAAM,CACpB;GAEJ;AAED,QAAO,OAAO,KAAK,OAAO,MAAM;EAE9B,MAAM,QAAQ,QAAQ;AACtB,MAAI,CAAC,MACH,QAAO;GAAE,GAAG;GAAO;GAAa;EAElC,MAAM,CAAC,SAAS,cAAc;AAC9B,MAAI,CAAC,QAGH,QAAO;GAAE,GAAG;GAAO;GAAa;AAElC,SAAO;GAAE,GAAG;GAAO,QAAQ,OAAO,WAAW;GAAE;GAAa;GAC5D;;AAGJ,MAAM,wBAAwB,OAC5B,QACA,QACA,kBAC2B;CAC3B,MAAM,CAAC,aAAa,WAAW,MAAM,sBACnC,QACA,OAAO,YAAY;EACjB,MAAM,OAAO,QAAQ,SAAS;EAC9B,MAAM,QAA2B,OAAO,KAAK,UAAU;AACrD,OAAI,cAAc,MAAM,QAAQ,CAC9B,QAAO,WACL,YAAY,OAAO,MAAM,QAAQ,IAAI,WAAW,cAAc,CAAC,EAC/D,EAAE,IAAI,GAAG,sBAAsB,KAAK,cAAc,QAAQ,CAC3D;AAEH,UAAO,WACL,YAAY;IAEV,MAAM,UAAU,OAAM,MADC,QAAQ,UAAU,CAAC,GAAG,MAAM,QAAQ,EAExD,UAAU,cAAc,CACxB,KAAK,EAAE,MAAM,eAAe,CAAC;AAChC,WAAO,OAAO,QAAQ,UAAU,CAAC;MAEnC,EACE,IAAI,GAAG,sBAAsB,KAAK,aAAa,MAAM,QAAQ,GAAG,QACjE,CACF;IACD;AAEF,SAAO,QAAQ,IAAI,CACjB,WACE,YAAyC;GAEvC,MAAM,KAAI,MADU,QAAQ,IAAI,iBAAiB,EACjC,cAAc,UAAU;AACxC,UAAO,MAAM,KAAA,IAAY,OAAO,EAAE,GAAG,KAAA;KAEvC,EAAE,IAAI,GAAG,sBAAsB,KAAK,mBAAmB,QAAQ,CAChE,EACD,QAAQ,WAAW,MAAM,CAC1B,CAAC;GAEL;AAYD,QAVoC,OAAO,KAAK,OAAO,UAAU;EAC/D,MAAM,SAAS,QAAQ;AACvB,MAAI,OAAO,WAAW,WAGpB,QAAO;GAAE,GAAG;GAAO;GAAa;AAElC,SAAO;GAAE,GAAG;GAAO,QAAQ,OAAO;GAAO;GAAa;GAGrC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TronStepExecutor.js","names":[],"sources":["../../../src/core/TronStepExecutor.ts"],"sourcesContent":["import {\n BaseStepExecutor,\n CheckBalanceTask,\n type ExecutionAction,\n LiFiErrorCode,\n type LiFiStepExtended,\n PrepareTransactionTask,\n type SDKError,\n type StepExecutorBaseContext,\n TaskPipeline,\n TransactionError,\n WaitForTransactionStatusTask,\n} from '@lifi/sdk'\nimport type { Adapter } from '@tronweb3/tronwallet-abstract-adapter'\nimport { parseTronErrors } from '../errors/parseTronErrors.js'\nimport type {\n TronStepExecutorContext,\n TronStepExecutorOptions,\n} from '../types.js'\nimport { isZeroAddress } from '../utils/isZeroAddress.js'\nimport { TronCheckAllowanceTask } from './tasks/TronCheckAllowanceTask.js'\nimport { TronSetAllowanceTask } from './tasks/TronSetAllowanceTask.js'\nimport { TronSignAndExecuteTask } from './tasks/TronSignAndExecuteTask.js'\nimport { TronWaitForTransactionTask } from './tasks/TronWaitForTransactionTask.js'\n\nexport class TronStepExecutor extends BaseStepExecutor {\n private wallet: Adapter\n\n constructor(options: TronStepExecutorOptions) {\n super(options)\n this.wallet = options.wallet\n }\n\n checkWallet = (step: LiFiStepExtended): void => {\n const address = this.wallet.address\n if (address && address !== step.action.fromAddress) {\n throw new TransactionError(\n LiFiErrorCode.WalletChangedDuringExecution,\n 'The wallet address that requested the quote does not match the wallet address attempting to sign the transaction.'\n )\n }\n }\n\n override parseErrors = (\n error: Error,\n step?: LiFiStepExtended,\n action?: ExecutionAction\n ): Promise<SDKError> => parseTronErrors(error, step, action)\n\n override createContext = async (\n baseContext: StepExecutorBaseContext\n ): Promise<TronStepExecutorContext> => {\n return {\n ...baseContext,\n wallet: this.wallet,\n checkWallet: this.checkWallet,\n }\n }\n\n override createPipeline = (\n context: TronStepExecutorContext\n ): TaskPipeline => {\n const { step, isBridgeExecution } = context\n\n const isFromNativeToken = isZeroAddress(step.action.fromToken.address)\n\n const tasks = [\n new TronCheckAllowanceTask(),\n new TronSetAllowanceTask(),\n new CheckBalanceTask(),\n new PrepareTransactionTask(),\n new TronSignAndExecuteTask(),\n new TronWaitForTransactionTask(),\n new WaitForTransactionStatusTask(\n isBridgeExecution ? 'RECEIVING_CHAIN' : 'SWAP'\n ),\n ]\n\n const swapOrBridgeAction = this.statusManager.findAction(\n step,\n isBridgeExecution ? 'CROSS_CHAIN' : 'SWAP'\n )\n\n const doCheckAllowance =\n !swapOrBridgeAction?.txHash &&\n !isFromNativeToken &&\n !!step.estimate.approvalAddress &&\n !step.estimate.skipApproval\n\n let taskName: string\n if (doCheckAllowance) {\n taskName = TronCheckAllowanceTask.name\n } else {\n taskName =\n swapOrBridgeAction?.txHash && swapOrBridgeAction?.status === 'DONE'\n ? WaitForTransactionStatusTask.name\n : CheckBalanceTask.name\n }\n\n const firstTaskIndex = tasks.findIndex(\n (task) => task.constructor.name === taskName\n )\n\n const tasksToRun = tasks.slice(firstTaskIndex)\n\n return new TaskPipeline(tasksToRun)\n }\n}\n"],"mappings":";;;;;;;;AAyBA,IAAa,mBAAb,cAAsC,iBAAiB;CACrD;CAEA,YAAY,SAAkC;AAC5C,QAAM,QAAQ;AACd,OAAK,SAAS,QAAQ;;CAGxB,eAAe,SAAiC;EAC9C,MAAM,UAAU,KAAK,OAAO;AAC5B,MAAI,WAAW,YAAY,KAAK,OAAO,YACrC,OAAM,IAAI,iBACR,cAAc,8BACd,oHACD;;CAIL,eACE,OACA,MACA,WACsB,gBAAgB,OAAO,MAAM,OAAO;CAE5D,gBAAyB,OACvB,gBACqC;AACrC,SAAO;GACL,GAAG;GACH,QAAQ,KAAK;GACb,aAAa,KAAK;GACnB;;CAGH,kBACE,YACiB;EACjB,MAAM,EAAE,MAAM,sBAAsB;EAEpC,MAAM,oBAAoB,cAAc,KAAK,OAAO,UAAU,QAAQ;EAEtE,MAAM,QAAQ;GACZ,IAAI,wBAAwB;GAC5B,IAAI,sBAAsB;GAC1B,IAAI,kBAAkB;GACtB,IAAI,wBAAwB;GAC5B,IAAI,wBAAwB;GAC5B,IAAI,4BAA4B;GAChC,IAAI,6BACF,oBAAoB,oBAAoB,OACzC;GACF;EAED,MAAM,qBAAqB,KAAK,cAAc,WAC5C,MACA,oBAAoB,gBAAgB,OACrC;EAED,MAAM,mBACJ,CAAC,oBAAoB,UACrB,CAAC,qBACD,CAAC,CAAC,KAAK,SAAS,mBAChB,CAAC,KAAK,SAAS;EAEjB,IAAI;AACJ,MAAI,iBACF,YAAW,uBAAuB;MAElC,YACE,oBAAoB,UAAU,oBAAoB,WAAW,SACzD,6BAA6B,OAC7B,iBAAiB;EAGzB,MAAM,iBAAiB,MAAM,WAC1B,SAAS,KAAK,YAAY,SAAS,SACrC;AAID,SAAO,IAAI,aAFQ,MAAM,MAAM,
|
|
1
|
+
{"version":3,"file":"TronStepExecutor.js","names":[],"sources":["../../../src/core/TronStepExecutor.ts"],"sourcesContent":["import {\n BaseStepExecutor,\n CheckBalanceTask,\n type ExecutionAction,\n LiFiErrorCode,\n type LiFiStepExtended,\n PrepareTransactionTask,\n type SDKError,\n type StepExecutorBaseContext,\n TaskPipeline,\n TransactionError,\n WaitForTransactionStatusTask,\n} from '@lifi/sdk'\nimport type { Adapter } from '@tronweb3/tronwallet-abstract-adapter'\nimport { parseTronErrors } from '../errors/parseTronErrors.js'\nimport type {\n TronStepExecutorContext,\n TronStepExecutorOptions,\n} from '../types.js'\nimport { isZeroAddress } from '../utils/isZeroAddress.js'\nimport { TronCheckAllowanceTask } from './tasks/TronCheckAllowanceTask.js'\nimport { TronSetAllowanceTask } from './tasks/TronSetAllowanceTask.js'\nimport { TronSignAndExecuteTask } from './tasks/TronSignAndExecuteTask.js'\nimport { TronWaitForTransactionTask } from './tasks/TronWaitForTransactionTask.js'\n\nexport class TronStepExecutor extends BaseStepExecutor {\n private wallet: Adapter\n\n constructor(options: TronStepExecutorOptions) {\n super(options)\n this.wallet = options.wallet\n }\n\n checkWallet = (step: LiFiStepExtended): void => {\n const address = this.wallet.address\n if (address && address !== step.action.fromAddress) {\n throw new TransactionError(\n LiFiErrorCode.WalletChangedDuringExecution,\n 'The wallet address that requested the quote does not match the wallet address attempting to sign the transaction.'\n )\n }\n }\n\n override parseErrors = (\n error: Error,\n step?: LiFiStepExtended,\n action?: ExecutionAction\n ): Promise<SDKError> => parseTronErrors(error, step, action)\n\n override createContext = async (\n baseContext: StepExecutorBaseContext\n ): Promise<TronStepExecutorContext> => {\n return {\n ...baseContext,\n wallet: this.wallet,\n checkWallet: this.checkWallet,\n }\n }\n\n override createPipeline = (\n context: TronStepExecutorContext\n ): TaskPipeline => {\n const { step, isBridgeExecution } = context\n\n const isFromNativeToken = isZeroAddress(step.action.fromToken.address)\n\n const tasks = [\n new TronCheckAllowanceTask(),\n new TronSetAllowanceTask(),\n new CheckBalanceTask(),\n new PrepareTransactionTask(),\n new TronSignAndExecuteTask(),\n new TronWaitForTransactionTask(),\n new WaitForTransactionStatusTask(\n isBridgeExecution ? 'RECEIVING_CHAIN' : 'SWAP'\n ),\n ]\n\n const swapOrBridgeAction = this.statusManager.findAction(\n step,\n isBridgeExecution ? 'CROSS_CHAIN' : 'SWAP'\n )\n\n const doCheckAllowance =\n !swapOrBridgeAction?.txHash &&\n !isFromNativeToken &&\n !!step.estimate.approvalAddress &&\n !step.estimate.skipApproval\n\n let taskName: string\n if (doCheckAllowance) {\n taskName = TronCheckAllowanceTask.name\n } else {\n taskName =\n swapOrBridgeAction?.txHash && swapOrBridgeAction?.status === 'DONE'\n ? WaitForTransactionStatusTask.name\n : CheckBalanceTask.name\n }\n\n const firstTaskIndex = tasks.findIndex(\n (task) => task.constructor.name === taskName\n )\n\n const tasksToRun = tasks.slice(firstTaskIndex)\n\n return new TaskPipeline(tasksToRun)\n }\n}\n"],"mappings":";;;;;;;;AAyBA,IAAa,mBAAb,cAAsC,iBAAiB;CACrD;CAEA,YAAY,SAAkC;AAC5C,QAAM,QAAQ;AACd,OAAK,SAAS,QAAQ;;CAGxB,eAAe,SAAiC;EAC9C,MAAM,UAAU,KAAK,OAAO;AAC5B,MAAI,WAAW,YAAY,KAAK,OAAO,YACrC,OAAM,IAAI,iBACR,cAAc,8BACd,oHACD;;CAIL,eACE,OACA,MACA,WACsB,gBAAgB,OAAO,MAAM,OAAO;CAE5D,gBAAyB,OACvB,gBACqC;AACrC,SAAO;GACL,GAAG;GACH,QAAQ,KAAK;GACb,aAAa,KAAK;GACnB;;CAGH,kBACE,YACiB;EACjB,MAAM,EAAE,MAAM,sBAAsB;EAEpC,MAAM,oBAAoB,cAAc,KAAK,OAAO,UAAU,QAAQ;EAEtE,MAAM,QAAQ;GACZ,IAAI,wBAAwB;GAC5B,IAAI,sBAAsB;GAC1B,IAAI,kBAAkB;GACtB,IAAI,wBAAwB;GAC5B,IAAI,wBAAwB;GAC5B,IAAI,4BAA4B;GAChC,IAAI,6BACF,oBAAoB,oBAAoB,OACzC;GACF;EAED,MAAM,qBAAqB,KAAK,cAAc,WAC5C,MACA,oBAAoB,gBAAgB,OACrC;EAED,MAAM,mBACJ,CAAC,oBAAoB,UACrB,CAAC,qBACD,CAAC,CAAC,KAAK,SAAS,mBAChB,CAAC,KAAK,SAAS;EAEjB,IAAI;AACJ,MAAI,iBACF,YAAW,uBAAuB;MAElC,YACE,oBAAoB,UAAU,oBAAoB,WAAW,SACzD,6BAA6B,OAC7B,iBAAiB;EAGzB,MAAM,iBAAiB,MAAM,WAC1B,SAAS,KAAK,YAAY,SAAS,SACrC;AAID,SAAO,IAAI,aAFQ,MAAM,MAAM,eAEG,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TronCheckAllowanceTask.js","names":[],"sources":["../../../../src/core/tasks/TronCheckAllowanceTask.ts"],"sourcesContent":["import {\n BaseStepExecutionTask,\n LiFiErrorCode,\n type TaskResult,\n TransactionError,\n} from '@lifi/sdk'\nimport { callTronRpcsWithRetry } from '../../rpc/callTronRpcsWithRetry.js'\nimport type { TronStepExecutorContext } from '../../types.js'\n\nexport class TronCheckAllowanceTask extends BaseStepExecutionTask {\n override async shouldRun(context: TronStepExecutorContext): Promise<boolean> {\n return !context.hasSufficientAllowance\n }\n\n async run(context: TronStepExecutorContext): Promise<TaskResult> {\n const { step, client, wallet, statusManager } = context\n\n const action = statusManager.initializeAction({\n step,\n type: 'CHECK_ALLOWANCE',\n chainId: step.action.fromChainId,\n status: 'STARTED',\n })\n\n if (!wallet.address) {\n throw new TransactionError(\n LiFiErrorCode.WalletChangedDuringExecution,\n 'Wallet address is not available. Wallet may have been disconnected.'\n )\n }\n\n if (!step.estimate.approvalAddress) {\n throw new TransactionError(\n LiFiErrorCode.TransactionUnprepared,\n 'Approval address is not available.'\n )\n }\n\n const ownerAddress = wallet.address\n const tokenAddress = step.action.fromToken.address\n const spenderAddress = step.estimate.approvalAddress\n const fromAmount = BigInt(step.action.fromAmount)\n\n const allowance = await callTronRpcsWithRetry(client, async (tronWeb) => {\n const contract = await tronWeb.contract().at(tokenAddress)\n const result = await contract\n .allowance(ownerAddress, spenderAddress)\n .call({ from: ownerAddress })\n return BigInt(result.toString())\n })\n\n statusManager.updateAction(step, action.type, 'DONE')\n\n return {\n status: 'COMPLETED',\n context: {\n hasSufficientAllowance: fromAmount <= allowance,\n },\n }\n }\n}\n"],"mappings":";;;AASA,IAAa,yBAAb,cAA4C,sBAAsB;CAChE,MAAe,UAAU,SAAoD;AAC3E,SAAO,CAAC,QAAQ;;CAGlB,MAAM,IAAI,SAAuD;EAC/D,MAAM,EAAE,MAAM,QAAQ,QAAQ,kBAAkB;EAEhD,MAAM,SAAS,cAAc,iBAAiB;GAC5C;GACA,MAAM;GACN,SAAS,KAAK,OAAO;GACrB,QAAQ;GACT,CAAC;AAEF,MAAI,CAAC,OAAO,QACV,OAAM,IAAI,iBACR,cAAc,8BACd,sEACD;AAGH,MAAI,CAAC,KAAK,SAAS,gBACjB,OAAM,IAAI,iBACR,cAAc,uBACd,qCACD;EAGH,MAAM,eAAe,OAAO;EAC5B,MAAM,eAAe,KAAK,OAAO,UAAU;EAC3C,MAAM,iBAAiB,KAAK,SAAS;EACrC,MAAM,aAAa,OAAO,KAAK,OAAO,WAAW;EAEjD,MAAM,YAAY,MAAM,sBAAsB,QAAQ,OAAO,YAAY;GAEvE,MAAM,SAAS,
|
|
1
|
+
{"version":3,"file":"TronCheckAllowanceTask.js","names":[],"sources":["../../../../src/core/tasks/TronCheckAllowanceTask.ts"],"sourcesContent":["import {\n BaseStepExecutionTask,\n LiFiErrorCode,\n type TaskResult,\n TransactionError,\n} from '@lifi/sdk'\nimport { callTronRpcsWithRetry } from '../../rpc/callTronRpcsWithRetry.js'\nimport type { TronStepExecutorContext } from '../../types.js'\n\nexport class TronCheckAllowanceTask extends BaseStepExecutionTask {\n override async shouldRun(context: TronStepExecutorContext): Promise<boolean> {\n return !context.hasSufficientAllowance\n }\n\n async run(context: TronStepExecutorContext): Promise<TaskResult> {\n const { step, client, wallet, statusManager } = context\n\n const action = statusManager.initializeAction({\n step,\n type: 'CHECK_ALLOWANCE',\n chainId: step.action.fromChainId,\n status: 'STARTED',\n })\n\n if (!wallet.address) {\n throw new TransactionError(\n LiFiErrorCode.WalletChangedDuringExecution,\n 'Wallet address is not available. Wallet may have been disconnected.'\n )\n }\n\n if (!step.estimate.approvalAddress) {\n throw new TransactionError(\n LiFiErrorCode.TransactionUnprepared,\n 'Approval address is not available.'\n )\n }\n\n const ownerAddress = wallet.address\n const tokenAddress = step.action.fromToken.address\n const spenderAddress = step.estimate.approvalAddress\n const fromAmount = BigInt(step.action.fromAmount)\n\n const allowance = await callTronRpcsWithRetry(client, async (tronWeb) => {\n const contract = await tronWeb.contract().at(tokenAddress)\n const result = await contract\n .allowance(ownerAddress, spenderAddress)\n .call({ from: ownerAddress })\n return BigInt(result.toString())\n })\n\n statusManager.updateAction(step, action.type, 'DONE')\n\n return {\n status: 'COMPLETED',\n context: {\n hasSufficientAllowance: fromAmount <= allowance,\n },\n }\n }\n}\n"],"mappings":";;;AASA,IAAa,yBAAb,cAA4C,sBAAsB;CAChE,MAAe,UAAU,SAAoD;AAC3E,SAAO,CAAC,QAAQ;;CAGlB,MAAM,IAAI,SAAuD;EAC/D,MAAM,EAAE,MAAM,QAAQ,QAAQ,kBAAkB;EAEhD,MAAM,SAAS,cAAc,iBAAiB;GAC5C;GACA,MAAM;GACN,SAAS,KAAK,OAAO;GACrB,QAAQ;GACT,CAAC;AAEF,MAAI,CAAC,OAAO,QACV,OAAM,IAAI,iBACR,cAAc,8BACd,sEACD;AAGH,MAAI,CAAC,KAAK,SAAS,gBACjB,OAAM,IAAI,iBACR,cAAc,uBACd,qCACD;EAGH,MAAM,eAAe,OAAO;EAC5B,MAAM,eAAe,KAAK,OAAO,UAAU;EAC3C,MAAM,iBAAiB,KAAK,SAAS;EACrC,MAAM,aAAa,OAAO,KAAK,OAAO,WAAW;EAEjD,MAAM,YAAY,MAAM,sBAAsB,QAAQ,OAAO,YAAY;GAEvE,MAAM,SAAS,OAAM,MADE,QAAQ,UAAU,CAAC,GAAG,aAAa,EAEvD,UAAU,cAAc,eAAe,CACvC,KAAK,EAAE,MAAM,cAAc,CAAC;AAC/B,UAAO,OAAO,OAAO,UAAU,CAAC;IAChC;AAEF,gBAAc,aAAa,MAAM,OAAO,MAAM,OAAO;AAErD,SAAO;GACL,QAAQ;GACR,SAAS,EACP,wBAAwB,cAAc,WACvC;GACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TronSetAllowanceTask.js","names":[],"sources":["../../../../src/core/tasks/TronSetAllowanceTask.ts"],"sourcesContent":["import {\n BaseStepExecutionTask,\n LiFiErrorCode,\n type TaskResult,\n TransactionError,\n} from '@lifi/sdk'\nimport { callTronRpcsWithRetry } from '../../rpc/callTronRpcsWithRetry.js'\nimport { waitForTronTxConfirmation } from '../../rpc/waitForTronTxConfirmation.js'\nimport type { TronStepExecutorContext } from '../../types.js'\nimport { getTronTxLink } from '../../utils/getTronTxLink.js'\nimport { stripHexPrefix } from '../../utils/stripHexPrefix.js'\n\n// 100 TRX in sun (1 TRX = 1_000_000 sun) — generous default for TRC-20 approve calls.\nconst DEFAULT_APPROVE_FEE_LIMIT = 100_000_000\n\nexport class TronSetAllowanceTask extends BaseStepExecutionTask {\n override async shouldRun(context: TronStepExecutorContext): Promise<boolean> {\n return !context.hasSufficientAllowance\n }\n\n async run(context: TronStepExecutorContext): Promise<TaskResult> {\n const { step, client, wallet, statusManager, fromChain } = context\n\n const action = statusManager.initializeAction({\n step,\n type: 'SET_ALLOWANCE',\n chainId: step.action.fromChainId,\n status: 'STARTED',\n })\n\n statusManager.updateAction(step, action.type, 'ACTION_REQUIRED')\n\n if (!wallet.address) {\n throw new TransactionError(\n LiFiErrorCode.WalletChangedDuringExecution,\n 'Wallet address is not available. Wallet may have been disconnected.'\n )\n }\n\n if (!step.estimate.approvalAddress) {\n throw new TransactionError(\n LiFiErrorCode.TransactionUnprepared,\n 'Approval address is not available.'\n )\n }\n\n const tokenAddress = step.action.fromToken.address\n const spenderAddress = step.estimate.approvalAddress\n const ownerAddress = wallet.address\n const approveAmount = BigInt(step.action.fromAmount).toString()\n\n const approveGasCost = step.estimate.gasCosts?.find(\n (gc) => gc.type === 'APPROVE'\n )\n const parsedLimit = approveGasCost?.limit ? Number(approveGasCost.limit) : 0\n if (\n approveGasCost?.limit &&\n (!Number.isFinite(parsedLimit) || parsedLimit <= 0)\n ) {\n console.warn(\n '[TronSetAllowanceTask] Invalid fee limit estimate, using default:',\n approveGasCost.limit\n )\n }\n const feeLimit = parsedLimit > 0 ? parsedLimit : DEFAULT_APPROVE_FEE_LIMIT\n\n const transaction = await callTronRpcsWithRetry(client, async (tronWeb) => {\n const { transaction } =\n await tronWeb.transactionBuilder.triggerSmartContract(\n tokenAddress,\n 'approve(address,uint256)',\n { feeLimit },\n [\n { type: 'address', value: spenderAddress },\n { type: 'uint256', value: approveAmount },\n ],\n ownerAddress\n )\n return transaction\n })\n\n const signedTransaction = await wallet.signTransaction(transaction)\n\n statusManager.updateAction(step, action.type, 'PENDING')\n\n const broadcastResult = await callTronRpcsWithRetry(\n client,\n async (tronWeb) => {\n const result = await tronWeb.trx.sendRawTransaction(signedTransaction)\n\n if (!result.result && String(result.code) !== 'DUP_TRANSACTION_ERROR') {\n throw new TransactionError(\n LiFiErrorCode.TransactionFailed,\n `Approval broadcast failed: ${result.code || 'Unknown error'}`\n )\n }\n\n return result\n }\n )\n\n // DUP_TRANSACTION_ERROR responses omit the `transaction` field — fall back\n // to the txID computed locally from the signed transaction in that case.\n const txHash = stripHexPrefix(\n broadcastResult.transaction?.txID ?? signedTransaction.txID\n )\n\n statusManager.updateAction(step, action.type, 'PENDING', {\n txHash,\n txLink: getTronTxLink(fromChain, txHash),\n })\n\n await waitForTronTxConfirmation(\n client,\n txHash,\n 'Approval transaction failed on-chain.'\n )\n\n statusManager.updateAction(step, action.type, 'DONE', {\n txHash,\n txLink: getTronTxLink(fromChain, txHash),\n })\n\n return {\n status: 'COMPLETED',\n context: { hasSufficientAllowance: true },\n }\n }\n}\n"],"mappings":";;;;;;AAaA,MAAM,4BAA4B;AAElC,IAAa,uBAAb,cAA0C,sBAAsB;CAC9D,MAAe,UAAU,SAAoD;AAC3E,SAAO,CAAC,QAAQ;;CAGlB,MAAM,IAAI,SAAuD;EAC/D,MAAM,EAAE,MAAM,QAAQ,QAAQ,eAAe,cAAc;EAE3D,MAAM,SAAS,cAAc,iBAAiB;GAC5C;GACA,MAAM;GACN,SAAS,KAAK,OAAO;GACrB,QAAQ;GACT,CAAC;AAEF,gBAAc,aAAa,MAAM,OAAO,MAAM,kBAAkB;AAEhE,MAAI,CAAC,OAAO,QACV,OAAM,IAAI,iBACR,cAAc,8BACd,sEACD;AAGH,MAAI,CAAC,KAAK,SAAS,gBACjB,OAAM,IAAI,iBACR,cAAc,uBACd,qCACD;EAGH,MAAM,eAAe,KAAK,OAAO,UAAU;EAC3C,MAAM,iBAAiB,KAAK,SAAS;EACrC,MAAM,eAAe,OAAO;EAC5B,MAAM,gBAAgB,OAAO,KAAK,OAAO,WAAW,CAAC,UAAU;EAE/D,MAAM,iBAAiB,KAAK,SAAS,UAAU,MAC5C,OAAO,GAAG,SAAS,UACrB;EACD,MAAM,cAAc,gBAAgB,QAAQ,OAAO,eAAe,MAAM,GAAG;AAC3E,MACE,gBAAgB,UACf,CAAC,OAAO,SAAS,YAAY,IAAI,eAAe,GAEjD,SAAQ,KACN,qEACA,eAAe,MAChB;EAEH,MAAM,WAAW,cAAc,IAAI,cAAc;EAEjD,MAAM,cAAc,MAAM,sBAAsB,QAAQ,OAAO,YAAY;GACzE,MAAM,EAAE,gBACN,MAAM,QAAQ,mBAAmB,qBAC/B,cACA,4BACA,EAAE,UAAU,EACZ,CACE;IAAE,MAAM;IAAW,OAAO;IAAgB,EAC1C;IAAE,MAAM;IAAW,OAAO;IAAe,CAC1C,EACD,aACD;AACH,UAAO;IACP;EAEF,MAAM,oBAAoB,MAAM,OAAO,gBAAgB,YAAY;AAEnE,gBAAc,aAAa,MAAM,OAAO,MAAM,UAAU;EAoBxD,MAAM,SAAS,
|
|
1
|
+
{"version":3,"file":"TronSetAllowanceTask.js","names":[],"sources":["../../../../src/core/tasks/TronSetAllowanceTask.ts"],"sourcesContent":["import {\n BaseStepExecutionTask,\n LiFiErrorCode,\n type TaskResult,\n TransactionError,\n} from '@lifi/sdk'\nimport { callTronRpcsWithRetry } from '../../rpc/callTronRpcsWithRetry.js'\nimport { waitForTronTxConfirmation } from '../../rpc/waitForTronTxConfirmation.js'\nimport type { TronStepExecutorContext } from '../../types.js'\nimport { getTronTxLink } from '../../utils/getTronTxLink.js'\nimport { stripHexPrefix } from '../../utils/stripHexPrefix.js'\n\n// 100 TRX in sun (1 TRX = 1_000_000 sun) — generous default for TRC-20 approve calls.\nconst DEFAULT_APPROVE_FEE_LIMIT = 100_000_000\n\nexport class TronSetAllowanceTask extends BaseStepExecutionTask {\n override async shouldRun(context: TronStepExecutorContext): Promise<boolean> {\n return !context.hasSufficientAllowance\n }\n\n async run(context: TronStepExecutorContext): Promise<TaskResult> {\n const { step, client, wallet, statusManager, fromChain } = context\n\n const action = statusManager.initializeAction({\n step,\n type: 'SET_ALLOWANCE',\n chainId: step.action.fromChainId,\n status: 'STARTED',\n })\n\n statusManager.updateAction(step, action.type, 'ACTION_REQUIRED')\n\n if (!wallet.address) {\n throw new TransactionError(\n LiFiErrorCode.WalletChangedDuringExecution,\n 'Wallet address is not available. Wallet may have been disconnected.'\n )\n }\n\n if (!step.estimate.approvalAddress) {\n throw new TransactionError(\n LiFiErrorCode.TransactionUnprepared,\n 'Approval address is not available.'\n )\n }\n\n const tokenAddress = step.action.fromToken.address\n const spenderAddress = step.estimate.approvalAddress\n const ownerAddress = wallet.address\n const approveAmount = BigInt(step.action.fromAmount).toString()\n\n const approveGasCost = step.estimate.gasCosts?.find(\n (gc) => gc.type === 'APPROVE'\n )\n const parsedLimit = approveGasCost?.limit ? Number(approveGasCost.limit) : 0\n if (\n approveGasCost?.limit &&\n (!Number.isFinite(parsedLimit) || parsedLimit <= 0)\n ) {\n console.warn(\n '[TronSetAllowanceTask] Invalid fee limit estimate, using default:',\n approveGasCost.limit\n )\n }\n const feeLimit = parsedLimit > 0 ? parsedLimit : DEFAULT_APPROVE_FEE_LIMIT\n\n const transaction = await callTronRpcsWithRetry(client, async (tronWeb) => {\n const { transaction } =\n await tronWeb.transactionBuilder.triggerSmartContract(\n tokenAddress,\n 'approve(address,uint256)',\n { feeLimit },\n [\n { type: 'address', value: spenderAddress },\n { type: 'uint256', value: approveAmount },\n ],\n ownerAddress\n )\n return transaction\n })\n\n const signedTransaction = await wallet.signTransaction(transaction)\n\n statusManager.updateAction(step, action.type, 'PENDING')\n\n const broadcastResult = await callTronRpcsWithRetry(\n client,\n async (tronWeb) => {\n const result = await tronWeb.trx.sendRawTransaction(signedTransaction)\n\n if (!result.result && String(result.code) !== 'DUP_TRANSACTION_ERROR') {\n throw new TransactionError(\n LiFiErrorCode.TransactionFailed,\n `Approval broadcast failed: ${result.code || 'Unknown error'}`\n )\n }\n\n return result\n }\n )\n\n // DUP_TRANSACTION_ERROR responses omit the `transaction` field — fall back\n // to the txID computed locally from the signed transaction in that case.\n const txHash = stripHexPrefix(\n broadcastResult.transaction?.txID ?? signedTransaction.txID\n )\n\n statusManager.updateAction(step, action.type, 'PENDING', {\n txHash,\n txLink: getTronTxLink(fromChain, txHash),\n })\n\n await waitForTronTxConfirmation(\n client,\n txHash,\n 'Approval transaction failed on-chain.'\n )\n\n statusManager.updateAction(step, action.type, 'DONE', {\n txHash,\n txLink: getTronTxLink(fromChain, txHash),\n })\n\n return {\n status: 'COMPLETED',\n context: { hasSufficientAllowance: true },\n }\n }\n}\n"],"mappings":";;;;;;AAaA,MAAM,4BAA4B;AAElC,IAAa,uBAAb,cAA0C,sBAAsB;CAC9D,MAAe,UAAU,SAAoD;AAC3E,SAAO,CAAC,QAAQ;;CAGlB,MAAM,IAAI,SAAuD;EAC/D,MAAM,EAAE,MAAM,QAAQ,QAAQ,eAAe,cAAc;EAE3D,MAAM,SAAS,cAAc,iBAAiB;GAC5C;GACA,MAAM;GACN,SAAS,KAAK,OAAO;GACrB,QAAQ;GACT,CAAC;AAEF,gBAAc,aAAa,MAAM,OAAO,MAAM,kBAAkB;AAEhE,MAAI,CAAC,OAAO,QACV,OAAM,IAAI,iBACR,cAAc,8BACd,sEACD;AAGH,MAAI,CAAC,KAAK,SAAS,gBACjB,OAAM,IAAI,iBACR,cAAc,uBACd,qCACD;EAGH,MAAM,eAAe,KAAK,OAAO,UAAU;EAC3C,MAAM,iBAAiB,KAAK,SAAS;EACrC,MAAM,eAAe,OAAO;EAC5B,MAAM,gBAAgB,OAAO,KAAK,OAAO,WAAW,CAAC,UAAU;EAE/D,MAAM,iBAAiB,KAAK,SAAS,UAAU,MAC5C,OAAO,GAAG,SAAS,UACrB;EACD,MAAM,cAAc,gBAAgB,QAAQ,OAAO,eAAe,MAAM,GAAG;AAC3E,MACE,gBAAgB,UACf,CAAC,OAAO,SAAS,YAAY,IAAI,eAAe,GAEjD,SAAQ,KACN,qEACA,eAAe,MAChB;EAEH,MAAM,WAAW,cAAc,IAAI,cAAc;EAEjD,MAAM,cAAc,MAAM,sBAAsB,QAAQ,OAAO,YAAY;GACzE,MAAM,EAAE,gBACN,MAAM,QAAQ,mBAAmB,qBAC/B,cACA,4BACA,EAAE,UAAU,EACZ,CACE;IAAE,MAAM;IAAW,OAAO;IAAgB,EAC1C;IAAE,MAAM;IAAW,OAAO;IAAe,CAC1C,EACD,aACD;AACH,UAAO;IACP;EAEF,MAAM,oBAAoB,MAAM,OAAO,gBAAgB,YAAY;AAEnE,gBAAc,aAAa,MAAM,OAAO,MAAM,UAAU;EAoBxD,MAAM,SAAS,gBACb,MAnB4B,sBAC5B,QACA,OAAO,YAAY;GACjB,MAAM,SAAS,MAAM,QAAQ,IAAI,mBAAmB,kBAAkB;AAEtE,OAAI,CAAC,OAAO,UAAU,OAAO,OAAO,KAAK,KAAK,wBAC5C,OAAM,IAAI,iBACR,cAAc,mBACd,8BAA8B,OAAO,QAAQ,kBAC9C;AAGH,UAAO;IAEV,EAKiB,aAAa,QAAQ,kBAAkB,KACxD;AAED,gBAAc,aAAa,MAAM,OAAO,MAAM,WAAW;GACvD;GACA,QAAQ,cAAc,WAAW,OAAO;GACzC,CAAC;AAEF,QAAM,0BACJ,QACA,QACA,wCACD;AAED,gBAAc,aAAa,MAAM,OAAO,MAAM,QAAQ;GACpD;GACA,QAAQ,cAAc,WAAW,OAAO;GACzC,CAAC;AAEF,SAAO;GACL,QAAQ;GACR,SAAS,EAAE,wBAAwB,MAAM;GAC1C"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TronSignAndExecuteTask.d.ts","names":[],"sources":["../../../../src/core/tasks/TronSignAndExecuteTask.ts"],"mappings":";;;;
|
|
1
|
+
{"version":3,"file":"TronSignAndExecuteTask.d.ts","names":[],"sources":["../../../../src/core/tasks/TronSignAndExecuteTask.ts"],"mappings":";;;;cAYa,sBAAA,SAA+B,qBAAA;EAC1C,GAAA,CAAU,OAAA,EAAS,uBAAA,GAA0B,OAAA,CAAQ,UAAA;AAAA"}
|
|
@@ -1,10 +1,11 @@
|
|
|
1
|
+
import { callTronRpcsWithRetry } from "../../rpc/callTronRpcsWithRetry.js";
|
|
1
2
|
import { stripHexPrefix } from "../../utils/stripHexPrefix.js";
|
|
2
3
|
import { BaseStepExecutionTask, LiFiErrorCode, TransactionError } from "@lifi/sdk";
|
|
3
4
|
import { utils } from "tronweb";
|
|
4
5
|
//#region src/core/tasks/TronSignAndExecuteTask.ts
|
|
5
6
|
var TronSignAndExecuteTask = class extends BaseStepExecutionTask {
|
|
6
7
|
async run(context) {
|
|
7
|
-
const { step, wallet, statusManager, isBridgeExecution, checkWallet } = context;
|
|
8
|
+
const { step, wallet, statusManager, isBridgeExecution, checkWallet, client } = context;
|
|
8
9
|
const action = statusManager.findAction(step, isBridgeExecution ? "CROSS_CHAIN" : "SWAP");
|
|
9
10
|
if (!action) throw new TransactionError(LiFiErrorCode.TransactionUnprepared, "Unable to prepare transaction. Action not found.");
|
|
10
11
|
if (!step.transactionRequest?.data) throw new TransactionError(LiFiErrorCode.TransactionUnprepared, "Unable to prepare transaction. Transaction request is not found.");
|
|
@@ -13,17 +14,16 @@ var TronSignAndExecuteTask = class extends BaseStepExecutionTask {
|
|
|
13
14
|
if (!context.allowUserInteraction) return { status: "PAUSED" };
|
|
14
15
|
const rawDataHex = stripHexPrefix(step.transactionRequest.data);
|
|
15
16
|
const contractType = step.transactionRequest.customData?.contractType ?? "TriggerSmartContract";
|
|
16
|
-
const
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
17
|
+
const transaction = await callTronRpcsWithRetry(client, async (tronWeb) => {
|
|
18
|
+
const rawData = utils.deserializeTx.deserializeTransaction(contractType, rawDataHex);
|
|
19
|
+
Object.assign(rawData, await tronWeb.trx.getCurrentRefBlockParams());
|
|
20
|
+
return tronWeb.transactionBuilder.newTxID({
|
|
21
|
+
visible: false,
|
|
22
|
+
txID: "",
|
|
23
|
+
raw_data: rawData,
|
|
24
|
+
raw_data_hex: ""
|
|
25
|
+
}, { txLocal: true });
|
|
20
26
|
});
|
|
21
|
-
const transaction = {
|
|
22
|
-
visible: false,
|
|
23
|
-
txID: stripHexPrefix(utils.transaction.txPbToTxID(transactionPb)),
|
|
24
|
-
raw_data,
|
|
25
|
-
raw_data_hex: rawDataHex
|
|
26
|
-
};
|
|
27
27
|
const signedTransaction = await wallet.signTransaction(transaction);
|
|
28
28
|
statusManager.updateAction(step, action.type, "PENDING", { signedAt: Date.now() });
|
|
29
29
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TronSignAndExecuteTask.js","names":[],"sources":["../../../../src/core/tasks/TronSignAndExecuteTask.ts"],"sourcesContent":["import {\n BaseStepExecutionTask,\n LiFiErrorCode,\n type TaskResult,\n TransactionError,\n} from '@lifi/sdk'\nimport type { Transaction } from '@tronweb3/tronwallet-abstract-adapter'\nimport { utils } from 'tronweb'\nimport type { TronStepExecutorContext } from '../../types.js'\nimport { stripHexPrefix } from '../../utils/stripHexPrefix.js'\n\nexport class TronSignAndExecuteTask extends BaseStepExecutionTask {\n async run(context: TronStepExecutorContext): Promise<TaskResult> {\n const {
|
|
1
|
+
{"version":3,"file":"TronSignAndExecuteTask.js","names":[],"sources":["../../../../src/core/tasks/TronSignAndExecuteTask.ts"],"sourcesContent":["import {\n BaseStepExecutionTask,\n LiFiErrorCode,\n type TaskResult,\n TransactionError,\n} from '@lifi/sdk'\nimport type { Transaction } from '@tronweb3/tronwallet-abstract-adapter'\nimport { utils } from 'tronweb'\nimport { callTronRpcsWithRetry } from '../../rpc/callTronRpcsWithRetry.js'\nimport type { TronStepExecutorContext } from '../../types.js'\nimport { stripHexPrefix } from '../../utils/stripHexPrefix.js'\n\nexport class TronSignAndExecuteTask extends BaseStepExecutionTask {\n async run(context: TronStepExecutorContext): Promise<TaskResult> {\n const {\n step,\n wallet,\n statusManager,\n isBridgeExecution,\n checkWallet,\n client,\n } = context\n\n const action = statusManager.findAction(\n step,\n isBridgeExecution ? 'CROSS_CHAIN' : 'SWAP'\n )\n\n if (!action) {\n throw new TransactionError(\n LiFiErrorCode.TransactionUnprepared,\n 'Unable to prepare transaction. Action not found.'\n )\n }\n\n if (!step.transactionRequest?.data) {\n throw new TransactionError(\n LiFiErrorCode.TransactionUnprepared,\n 'Unable to prepare transaction. Transaction request is not found.'\n )\n }\n\n checkWallet(step)\n\n statusManager.updateAction(step, action.type, 'ACTION_REQUIRED')\n\n if (!context.allowUserInteraction) {\n return { status: 'PAUSED' }\n }\n\n const rawDataHex = stripHexPrefix(step.transactionRequest.data as string)\n\n const contractType =\n (step.transactionRequest.customData?.contractType as string) ??\n 'TriggerSmartContract'\n\n // Re-anchor to a fresh block — a stale `ref_block_hash` falls outside TronLink's\n // recent-block window and surfaces as a generic \"Network mismatched\" error. Then\n // `newTxID` re-runs the tx through TronWeb's `createTransaction`, dropping the\n // deserializer's non-protobuf artifacts and producing a consistent `txID` /\n // `raw_data_hex` pair.\n const transaction: Transaction = await callTronRpcsWithRetry(\n client,\n async (tronWeb) => {\n const rawData = utils.deserializeTx.deserializeTransaction(\n contractType,\n rawDataHex\n )\n Object.assign(rawData, await tronWeb.trx.getCurrentRefBlockParams())\n return tronWeb.transactionBuilder.newTxID(\n { visible: false, txID: '', raw_data: rawData, raw_data_hex: '' },\n { txLocal: true }\n )\n }\n )\n\n const signedTransaction = await wallet.signTransaction(transaction)\n\n statusManager.updateAction(step, action.type, 'PENDING', {\n signedAt: Date.now(),\n })\n\n return {\n status: 'COMPLETED',\n context: { signedTransaction },\n }\n }\n}\n"],"mappings":";;;;;AAYA,IAAa,yBAAb,cAA4C,sBAAsB;CAChE,MAAM,IAAI,SAAuD;EAC/D,MAAM,EACJ,MACA,QACA,eACA,mBACA,aACA,WACE;EAEJ,MAAM,SAAS,cAAc,WAC3B,MACA,oBAAoB,gBAAgB,OACrC;AAED,MAAI,CAAC,OACH,OAAM,IAAI,iBACR,cAAc,uBACd,mDACD;AAGH,MAAI,CAAC,KAAK,oBAAoB,KAC5B,OAAM,IAAI,iBACR,cAAc,uBACd,mEACD;AAGH,cAAY,KAAK;AAEjB,gBAAc,aAAa,MAAM,OAAO,MAAM,kBAAkB;AAEhE,MAAI,CAAC,QAAQ,qBACX,QAAO,EAAE,QAAQ,UAAU;EAG7B,MAAM,aAAa,eAAe,KAAK,mBAAmB,KAAe;EAEzE,MAAM,eACH,KAAK,mBAAmB,YAAY,gBACrC;EAOF,MAAM,cAA2B,MAAM,sBACrC,QACA,OAAO,YAAY;GACjB,MAAM,UAAU,MAAM,cAAc,uBAClC,cACA,WACD;AACD,UAAO,OAAO,SAAS,MAAM,QAAQ,IAAI,0BAA0B,CAAC;AACpE,UAAO,QAAQ,mBAAmB,QAChC;IAAE,SAAS;IAAO,MAAM;IAAI,UAAU;IAAS,cAAc;IAAI,EACjE,EAAE,SAAS,MAAM,CAClB;IAEJ;EAED,MAAM,oBAAoB,MAAM,OAAO,gBAAgB,YAAY;AAEnE,gBAAc,aAAa,MAAM,OAAO,MAAM,WAAW,EACvD,UAAU,KAAK,KAAK,EACrB,CAAC;AAEF,SAAO;GACL,QAAQ;GACR,SAAS,EAAE,mBAAmB;GAC/B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TronWaitForTransactionTask.js","names":[],"sources":["../../../../src/core/tasks/TronWaitForTransactionTask.ts"],"sourcesContent":["import {\n BaseStepExecutionTask,\n LiFiErrorCode,\n type TaskResult,\n TransactionError,\n} from '@lifi/sdk'\nimport { callTronRpcsWithRetry } from '../../rpc/callTronRpcsWithRetry.js'\nimport { waitForTronTxConfirmation } from '../../rpc/waitForTronTxConfirmation.js'\nimport type { TronStepExecutorContext } from '../../types.js'\nimport { getTronTxLink } from '../../utils/getTronTxLink.js'\nimport { stripHexPrefix } from '../../utils/stripHexPrefix.js'\n\nexport class TronWaitForTransactionTask extends BaseStepExecutionTask {\n async run(context: TronStepExecutorContext): Promise<TaskResult> {\n const {\n client,\n step,\n statusManager,\n fromChain,\n isBridgeExecution,\n signedTransaction,\n } = context\n\n if (!signedTransaction) {\n throw new TransactionError(\n LiFiErrorCode.TransactionUnprepared,\n 'Unable to prepare transaction. Signed transaction is not found.'\n )\n }\n\n const action = statusManager.findAction(\n step,\n isBridgeExecution ? 'CROSS_CHAIN' : 'SWAP'\n )\n if (!action) {\n throw new TransactionError(\n LiFiErrorCode.TransactionUnprepared,\n 'Unable to prepare transaction. Action not found.'\n )\n }\n\n const broadcastResult = await callTronRpcsWithRetry(\n client,\n async (tronWeb) => {\n const result = await tronWeb.trx.sendRawTransaction(signedTransaction)\n\n if (!result.result && String(result.code) !== 'DUP_TRANSACTION_ERROR') {\n throw new TransactionError(\n LiFiErrorCode.TransactionFailed,\n `Transaction broadcast failed: ${result.code || 'Unknown error'}`\n )\n }\n\n return result\n }\n )\n\n // DUP_TRANSACTION_ERROR responses omit the `transaction` field — fall back\n // to the txID computed locally from the signed transaction in that case.\n const txHash = stripHexPrefix(\n broadcastResult.transaction?.txID ?? signedTransaction.txID\n )\n\n statusManager.updateAction(step, action.type, 'PENDING', {\n txHash,\n txLink: getTronTxLink(fromChain, txHash),\n })\n\n await waitForTronTxConfirmation(client, txHash)\n\n if (isBridgeExecution) {\n statusManager.updateAction(step, action.type, 'DONE')\n }\n\n return { status: 'COMPLETED' }\n }\n}\n"],"mappings":";;;;;;AAYA,IAAa,6BAAb,cAAgD,sBAAsB;CACpE,MAAM,IAAI,SAAuD;EAC/D,MAAM,EACJ,QACA,MACA,eACA,WACA,mBACA,sBACE;AAEJ,MAAI,CAAC,kBACH,OAAM,IAAI,iBACR,cAAc,uBACd,kEACD;EAGH,MAAM,SAAS,cAAc,WAC3B,MACA,oBAAoB,gBAAgB,OACrC;AACD,MAAI,CAAC,OACH,OAAM,IAAI,iBACR,cAAc,uBACd,mDACD;EAqBH,MAAM,SAAS,
|
|
1
|
+
{"version":3,"file":"TronWaitForTransactionTask.js","names":[],"sources":["../../../../src/core/tasks/TronWaitForTransactionTask.ts"],"sourcesContent":["import {\n BaseStepExecutionTask,\n LiFiErrorCode,\n type TaskResult,\n TransactionError,\n} from '@lifi/sdk'\nimport { callTronRpcsWithRetry } from '../../rpc/callTronRpcsWithRetry.js'\nimport { waitForTronTxConfirmation } from '../../rpc/waitForTronTxConfirmation.js'\nimport type { TronStepExecutorContext } from '../../types.js'\nimport { getTronTxLink } from '../../utils/getTronTxLink.js'\nimport { stripHexPrefix } from '../../utils/stripHexPrefix.js'\n\nexport class TronWaitForTransactionTask extends BaseStepExecutionTask {\n async run(context: TronStepExecutorContext): Promise<TaskResult> {\n const {\n client,\n step,\n statusManager,\n fromChain,\n isBridgeExecution,\n signedTransaction,\n } = context\n\n if (!signedTransaction) {\n throw new TransactionError(\n LiFiErrorCode.TransactionUnprepared,\n 'Unable to prepare transaction. Signed transaction is not found.'\n )\n }\n\n const action = statusManager.findAction(\n step,\n isBridgeExecution ? 'CROSS_CHAIN' : 'SWAP'\n )\n if (!action) {\n throw new TransactionError(\n LiFiErrorCode.TransactionUnprepared,\n 'Unable to prepare transaction. Action not found.'\n )\n }\n\n const broadcastResult = await callTronRpcsWithRetry(\n client,\n async (tronWeb) => {\n const result = await tronWeb.trx.sendRawTransaction(signedTransaction)\n\n if (!result.result && String(result.code) !== 'DUP_TRANSACTION_ERROR') {\n throw new TransactionError(\n LiFiErrorCode.TransactionFailed,\n `Transaction broadcast failed: ${result.code || 'Unknown error'}`\n )\n }\n\n return result\n }\n )\n\n // DUP_TRANSACTION_ERROR responses omit the `transaction` field — fall back\n // to the txID computed locally from the signed transaction in that case.\n const txHash = stripHexPrefix(\n broadcastResult.transaction?.txID ?? signedTransaction.txID\n )\n\n statusManager.updateAction(step, action.type, 'PENDING', {\n txHash,\n txLink: getTronTxLink(fromChain, txHash),\n })\n\n await waitForTronTxConfirmation(client, txHash)\n\n if (isBridgeExecution) {\n statusManager.updateAction(step, action.type, 'DONE')\n }\n\n return { status: 'COMPLETED' }\n }\n}\n"],"mappings":";;;;;;AAYA,IAAa,6BAAb,cAAgD,sBAAsB;CACpE,MAAM,IAAI,SAAuD;EAC/D,MAAM,EACJ,QACA,MACA,eACA,WACA,mBACA,sBACE;AAEJ,MAAI,CAAC,kBACH,OAAM,IAAI,iBACR,cAAc,uBACd,kEACD;EAGH,MAAM,SAAS,cAAc,WAC3B,MACA,oBAAoB,gBAAgB,OACrC;AACD,MAAI,CAAC,OACH,OAAM,IAAI,iBACR,cAAc,uBACd,mDACD;EAqBH,MAAM,SAAS,gBACb,MAnB4B,sBAC5B,QACA,OAAO,YAAY;GACjB,MAAM,SAAS,MAAM,QAAQ,IAAI,mBAAmB,kBAAkB;AAEtE,OAAI,CAAC,OAAO,UAAU,OAAO,OAAO,KAAK,KAAK,wBAC5C,OAAM,IAAI,iBACR,cAAc,mBACd,iCAAiC,OAAO,QAAQ,kBACjD;AAGH,UAAO;IAEV,EAKiB,aAAa,QAAQ,kBAAkB,KACxD;AAED,gBAAc,aAAa,MAAM,OAAO,MAAM,WAAW;GACvD;GACA,QAAQ,cAAc,WAAW,OAAO;GACzC,CAAC;AAEF,QAAM,0BAA0B,QAAQ,OAAO;AAE/C,MAAI,kBACF,eAAc,aAAa,MAAM,OAAO,MAAM,OAAO;AAGvD,SAAO,EAAE,QAAQ,aAAa"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parseTronErrors.js","names":[],"sources":["../../../src/errors/parseTronErrors.ts"],"sourcesContent":["import {\n BaseError,\n ErrorMessage,\n type ExecutionAction,\n LiFiErrorCode,\n type LiFiStep,\n ProviderError,\n SDKError,\n TransactionError,\n UnknownError,\n} from '@lifi/sdk'\nimport {\n WalletDisconnectedError,\n WalletNotFoundError,\n WalletNotSelectedError,\n WalletSignTransactionError,\n WalletWindowClosedError,\n} from '@tronweb3/tronwallet-abstract-adapter'\n\n// \"BANDWITH\" is the Tron protocol's own misspelling. Matched by substring because\n// the error code can appear embedded within a larger error message from TronWeb.\nconst isBandwidthError = (message?: string): boolean =>\n !!message?.includes('BANDWITH_ERROR')\n\nexport const parseTronErrors = async (\n e: Error,\n step?: LiFiStep,\n action?: ExecutionAction\n): Promise<SDKError> => {\n if (e instanceof SDKError) {\n if (isBandwidthError(e.message)) {\n // Preserve the original cause (e.g. the TronWeb error) rather than wrapping\n // the outer SDKError — keeps log/stack traces pointing at the true origin.\n const baseError = new TransactionError(\n LiFiErrorCode.InsufficientFunds,\n 'Insufficient TRX for network bandwidth. The account needs more TRX to cover transaction fees.',\n (e.cause as Error | undefined) ?? e\n )\n return new SDKError(baseError, step ?? e.step, action ?? e.action)\n }\n e.step = e.step ?? step\n e.action = e.action ?? action\n return e\n }\n\n const baseError = handleSpecificErrors(e)\n\n return new SDKError(baseError, step, action)\n}\n\nconst handleSpecificErrors = (e: unknown): BaseError => {\n const message: string =\n typeof e === 'string' ? e : e instanceof Error ? e.message : ''\n const cause: Error | undefined = e instanceof Error ? e : undefined\n\n if (\n e instanceof WalletSignTransactionError ||\n e instanceof WalletWindowClosedError\n ) {\n return new TransactionError(LiFiErrorCode.SignatureRejected, message, e)\n }\n\n if (e instanceof WalletNotFoundError || e instanceof WalletNotSelectedError) {\n return new ProviderError(LiFiErrorCode.ProviderUnavailable, message, e)\n }\n\n if (e instanceof WalletDisconnectedError) {\n return new TransactionError(\n LiFiErrorCode.WalletChangedDuringExecution,\n message,\n e\n )\n }\n\n // TronWeb trx.sign() validation errors — string literals from tronweb@^6 (src/lib/trx.ts).\n // If upgrading tronweb, verify these strings haven't changed.\n if (\n message === 'Invalid transaction provided' ||\n message === 'Invalid transaction' ||\n message === 'Transaction is not signed'\n ) {\n return new TransactionError(\n LiFiErrorCode.TransactionUnprepared,\n message,\n cause\n )\n }\n\n if (message === 'Transaction is already signed') {\n return new TransactionError(LiFiErrorCode.TransactionFailed, message, cause)\n }\n\n if (message === 'Private key does not match address in transaction') {\n return new TransactionError(\n LiFiErrorCode.WalletChangedDuringExecution,\n message,\n cause\n )\n }\n\n if (isBandwidthError(message)) {\n return new TransactionError(\n LiFiErrorCode.InsufficientFunds,\n 'Insufficient TRX for network bandwidth. The account needs more TRX to cover transaction fees.',\n cause\n )\n }\n\n if (e instanceof BaseError) {\n return e\n }\n\n return new UnknownError(message || ErrorMessage.UnknownError, cause)\n}\n"],"mappings":";;;AAqBA,MAAM,oBAAoB,YACxB,CAAC,CAAC,SAAS,SAAS,iBAAiB;AAEvC,MAAa,kBAAkB,OAC7B,GACA,MACA,WACsB;AACtB,KAAI,aAAa,UAAU;AACzB,MAAI,iBAAiB,EAAE,QAAQ,CAQ7B,QAAO,IAAI,
|
|
1
|
+
{"version":3,"file":"parseTronErrors.js","names":[],"sources":["../../../src/errors/parseTronErrors.ts"],"sourcesContent":["import {\n BaseError,\n ErrorMessage,\n type ExecutionAction,\n LiFiErrorCode,\n type LiFiStep,\n ProviderError,\n SDKError,\n TransactionError,\n UnknownError,\n} from '@lifi/sdk'\nimport {\n WalletDisconnectedError,\n WalletNotFoundError,\n WalletNotSelectedError,\n WalletSignTransactionError,\n WalletWindowClosedError,\n} from '@tronweb3/tronwallet-abstract-adapter'\n\n// \"BANDWITH\" is the Tron protocol's own misspelling. Matched by substring because\n// the error code can appear embedded within a larger error message from TronWeb.\nconst isBandwidthError = (message?: string): boolean =>\n !!message?.includes('BANDWITH_ERROR')\n\nexport const parseTronErrors = async (\n e: Error,\n step?: LiFiStep,\n action?: ExecutionAction\n): Promise<SDKError> => {\n if (e instanceof SDKError) {\n if (isBandwidthError(e.message)) {\n // Preserve the original cause (e.g. the TronWeb error) rather than wrapping\n // the outer SDKError — keeps log/stack traces pointing at the true origin.\n const baseError = new TransactionError(\n LiFiErrorCode.InsufficientFunds,\n 'Insufficient TRX for network bandwidth. The account needs more TRX to cover transaction fees.',\n (e.cause as Error | undefined) ?? e\n )\n return new SDKError(baseError, step ?? e.step, action ?? e.action)\n }\n e.step = e.step ?? step\n e.action = e.action ?? action\n return e\n }\n\n const baseError = handleSpecificErrors(e)\n\n return new SDKError(baseError, step, action)\n}\n\nconst handleSpecificErrors = (e: unknown): BaseError => {\n const message: string =\n typeof e === 'string' ? e : e instanceof Error ? e.message : ''\n const cause: Error | undefined = e instanceof Error ? e : undefined\n\n if (\n e instanceof WalletSignTransactionError ||\n e instanceof WalletWindowClosedError\n ) {\n return new TransactionError(LiFiErrorCode.SignatureRejected, message, e)\n }\n\n if (e instanceof WalletNotFoundError || e instanceof WalletNotSelectedError) {\n return new ProviderError(LiFiErrorCode.ProviderUnavailable, message, e)\n }\n\n if (e instanceof WalletDisconnectedError) {\n return new TransactionError(\n LiFiErrorCode.WalletChangedDuringExecution,\n message,\n e\n )\n }\n\n // TronWeb trx.sign() validation errors — string literals from tronweb@^6 (src/lib/trx.ts).\n // If upgrading tronweb, verify these strings haven't changed.\n if (\n message === 'Invalid transaction provided' ||\n message === 'Invalid transaction' ||\n message === 'Transaction is not signed'\n ) {\n return new TransactionError(\n LiFiErrorCode.TransactionUnprepared,\n message,\n cause\n )\n }\n\n if (message === 'Transaction is already signed') {\n return new TransactionError(LiFiErrorCode.TransactionFailed, message, cause)\n }\n\n if (message === 'Private key does not match address in transaction') {\n return new TransactionError(\n LiFiErrorCode.WalletChangedDuringExecution,\n message,\n cause\n )\n }\n\n if (isBandwidthError(message)) {\n return new TransactionError(\n LiFiErrorCode.InsufficientFunds,\n 'Insufficient TRX for network bandwidth. The account needs more TRX to cover transaction fees.',\n cause\n )\n }\n\n if (e instanceof BaseError) {\n return e\n }\n\n return new UnknownError(message || ErrorMessage.UnknownError, cause)\n}\n"],"mappings":";;;AAqBA,MAAM,oBAAoB,YACxB,CAAC,CAAC,SAAS,SAAS,iBAAiB;AAEvC,MAAa,kBAAkB,OAC7B,GACA,MACA,WACsB;AACtB,KAAI,aAAa,UAAU;AACzB,MAAI,iBAAiB,EAAE,QAAQ,CAQ7B,QAAO,IAAI,SAAS,IALE,iBACpB,cAAc,mBACd,iGACC,EAAE,SAA+B,EAEP,EAAE,QAAQ,EAAE,MAAM,UAAU,EAAE,OAAO;AAEpE,IAAE,OAAO,EAAE,QAAQ;AACnB,IAAE,SAAS,EAAE,UAAU;AACvB,SAAO;;AAKT,QAAO,IAAI,SAFO,qBAAqB,EAEV,EAAE,MAAM,OAAO;;AAG9C,MAAM,wBAAwB,MAA0B;CACtD,MAAM,UACJ,OAAO,MAAM,WAAW,IAAI,aAAa,QAAQ,EAAE,UAAU;CAC/D,MAAM,QAA2B,aAAa,QAAQ,IAAI,KAAA;AAE1D,KACE,aAAa,8BACb,aAAa,wBAEb,QAAO,IAAI,iBAAiB,cAAc,mBAAmB,SAAS,EAAE;AAG1E,KAAI,aAAa,uBAAuB,aAAa,uBACnD,QAAO,IAAI,cAAc,cAAc,qBAAqB,SAAS,EAAE;AAGzE,KAAI,aAAa,wBACf,QAAO,IAAI,iBACT,cAAc,8BACd,SACA,EACD;AAKH,KACE,YAAY,kCACZ,YAAY,yBACZ,YAAY,4BAEZ,QAAO,IAAI,iBACT,cAAc,uBACd,SACA,MACD;AAGH,KAAI,YAAY,gCACd,QAAO,IAAI,iBAAiB,cAAc,mBAAmB,SAAS,MAAM;AAG9E,KAAI,YAAY,oDACd,QAAO,IAAI,iBACT,cAAc,8BACd,SACA,MACD;AAGH,KAAI,iBAAiB,QAAQ,CAC3B,QAAO,IAAI,iBACT,cAAc,mBACd,iGACA,MACD;AAGH,KAAI,aAAa,UACf,QAAO;AAGT,QAAO,IAAI,aAAa,WAAW,aAAa,cAAc,MAAM"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"address.js","names":[],"sources":["../../../src/utils/address.ts"],"sourcesContent":["import { TronWeb } from 'tronweb'\n\n// TronWeb.address.toHex returns a 41-prefixed hex string for valid Tron base58 addresses.\n// Replacing the leading '41' with '0x' yields the standard EVM-format hex address.\nexport function toEvmHex(tronAddress: string): string {\n const hex = TronWeb.address.toHex(tronAddress)\n if (!hex.startsWith('41')) {\n throw new Error(`Unexpected Tron address hex prefix: ${hex}`)\n }\n return `0x${hex.slice(2)}`\n}\n\nexport function encodeAddressCalldata(\n selector: string,\n address: string\n): string {\n // Pad 20-byte address to 32 bytes, left-padded with zeros\n const addr = address.replace(/^0x/, '').padStart(64, '0')\n return `0x${selector}${addr}`\n}\n"],"mappings":";;AAIA,SAAgB,SAAS,aAA6B;CACpD,MAAM,MAAM,QAAQ,QAAQ,MAAM,YAAY;AAC9C,KAAI,CAAC,IAAI,WAAW,KAAK,CACvB,OAAM,IAAI,MAAM,uCAAuC,MAAM;AAE/D,QAAO,KAAK,IAAI,MAAM,EAAE;;AAG1B,SAAgB,sBACd,UACA,SACQ;AAGR,QAAO,KAAK,WADC,QAAQ,QAAQ,OAAO,GAAG,CAAC,SAAS,IAAI,
|
|
1
|
+
{"version":3,"file":"address.js","names":[],"sources":["../../../src/utils/address.ts"],"sourcesContent":["import { TronWeb } from 'tronweb'\n\n// TronWeb.address.toHex returns a 41-prefixed hex string for valid Tron base58 addresses.\n// Replacing the leading '41' with '0x' yields the standard EVM-format hex address.\nexport function toEvmHex(tronAddress: string): string {\n const hex = TronWeb.address.toHex(tronAddress)\n if (!hex.startsWith('41')) {\n throw new Error(`Unexpected Tron address hex prefix: ${hex}`)\n }\n return `0x${hex.slice(2)}`\n}\n\nexport function encodeAddressCalldata(\n selector: string,\n address: string\n): string {\n // Pad 20-byte address to 32 bytes, left-padded with zeros\n const addr = address.replace(/^0x/, '').padStart(64, '0')\n return `0x${selector}${addr}`\n}\n"],"mappings":";;AAIA,SAAgB,SAAS,aAA6B;CACpD,MAAM,MAAM,QAAQ,QAAQ,MAAM,YAAY;AAC9C,KAAI,CAAC,IAAI,WAAW,KAAK,CACvB,OAAM,IAAI,MAAM,uCAAuC,MAAM;AAE/D,QAAO,KAAK,IAAI,MAAM,EAAE;;AAG1B,SAAgB,sBACd,UACA,SACQ;AAGR,QAAO,KAAK,WADC,QAAQ,QAAQ,OAAO,GAAG,CAAC,SAAS,IAAI,IAC1B"}
|
package/dist/esm/version.d.ts
CHANGED
package/dist/esm/version.js
CHANGED
package/dist/esm/version.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"version.js","names":[],"sources":["../../src/version.ts"],"sourcesContent":["export const name = '@lifi/sdk-provider-tron'\nexport const version = '4.0.0-beta.
|
|
1
|
+
{"version":3,"file":"version.js","names":[],"sources":["../../src/version.ts"],"sourcesContent":["export const name = '@lifi/sdk-provider-tron'\nexport const version = '4.0.0-beta.8'\n"],"mappings":";AAAA,MAAa,OAAO;AACpB,MAAa,UAAU"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lifi/sdk-provider-tron",
|
|
3
|
-
"version": "4.0.0-beta.
|
|
3
|
+
"version": "4.0.0-beta.8",
|
|
4
4
|
"description": "LI.FI Tron SDK Provider for Any-to-Any Cross-Chain-Swap",
|
|
5
5
|
"homepage": "https://github.com/lifinance/sdk",
|
|
6
6
|
"bugs": {
|
|
@@ -28,9 +28,9 @@
|
|
|
28
28
|
"./package.json": "./package.json"
|
|
29
29
|
},
|
|
30
30
|
"dependencies": {
|
|
31
|
-
"@tronweb3/tronwallet-abstract-adapter": "^1.1.
|
|
32
|
-
"tronweb": "^6.
|
|
33
|
-
"@lifi/sdk": "4.0.0-beta.
|
|
31
|
+
"@tronweb3/tronwallet-abstract-adapter": "^1.1.13",
|
|
32
|
+
"tronweb": "^6.3.0",
|
|
33
|
+
"@lifi/sdk": "4.0.0-beta.8"
|
|
34
34
|
},
|
|
35
35
|
"publishConfig": {
|
|
36
36
|
"access": "public"
|
|
@@ -6,13 +6,20 @@ import {
|
|
|
6
6
|
} from '@lifi/sdk'
|
|
7
7
|
import type { Transaction } from '@tronweb3/tronwallet-abstract-adapter'
|
|
8
8
|
import { utils } from 'tronweb'
|
|
9
|
+
import { callTronRpcsWithRetry } from '../../rpc/callTronRpcsWithRetry.js'
|
|
9
10
|
import type { TronStepExecutorContext } from '../../types.js'
|
|
10
11
|
import { stripHexPrefix } from '../../utils/stripHexPrefix.js'
|
|
11
12
|
|
|
12
13
|
export class TronSignAndExecuteTask extends BaseStepExecutionTask {
|
|
13
14
|
async run(context: TronStepExecutorContext): Promise<TaskResult> {
|
|
14
|
-
const {
|
|
15
|
-
|
|
15
|
+
const {
|
|
16
|
+
step,
|
|
17
|
+
wallet,
|
|
18
|
+
statusManager,
|
|
19
|
+
isBridgeExecution,
|
|
20
|
+
checkWallet,
|
|
21
|
+
client,
|
|
22
|
+
} = context
|
|
16
23
|
|
|
17
24
|
const action = statusManager.findAction(
|
|
18
25
|
step,
|
|
@@ -47,28 +54,26 @@ export class TronSignAndExecuteTask extends BaseStepExecutionTask {
|
|
|
47
54
|
(step.transactionRequest.customData?.contractType as string) ??
|
|
48
55
|
'TriggerSmartContract'
|
|
49
56
|
|
|
50
|
-
//
|
|
51
|
-
//
|
|
52
|
-
//
|
|
53
|
-
//
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
+
// Re-anchor to a fresh block — a stale `ref_block_hash` falls outside TronLink's
|
|
58
|
+
// recent-block window and surfaces as a generic "Network mismatched" error. Then
|
|
59
|
+
// `newTxID` re-runs the tx through TronWeb's `createTransaction`, dropping the
|
|
60
|
+
// deserializer's non-protobuf artifacts and producing a consistent `txID` /
|
|
61
|
+
// `raw_data_hex` pair.
|
|
62
|
+
const transaction: Transaction = await callTronRpcsWithRetry(
|
|
63
|
+
client,
|
|
64
|
+
async (tronWeb) => {
|
|
65
|
+
const rawData = utils.deserializeTx.deserializeTransaction(
|
|
66
|
+
contractType,
|
|
67
|
+
rawDataHex
|
|
68
|
+
)
|
|
69
|
+
Object.assign(rawData, await tronWeb.trx.getCurrentRefBlockParams())
|
|
70
|
+
return tronWeb.transactionBuilder.newTxID(
|
|
71
|
+
{ visible: false, txID: '', raw_data: rawData, raw_data_hex: '' },
|
|
72
|
+
{ txLocal: true }
|
|
73
|
+
)
|
|
74
|
+
}
|
|
57
75
|
)
|
|
58
76
|
|
|
59
|
-
const transactionPb = utils.transaction.txJsonToPb({
|
|
60
|
-
visible: false,
|
|
61
|
-
raw_data,
|
|
62
|
-
})
|
|
63
|
-
const txID = stripHexPrefix(utils.transaction.txPbToTxID(transactionPb))
|
|
64
|
-
|
|
65
|
-
const transaction: Transaction = {
|
|
66
|
-
visible: false,
|
|
67
|
-
txID,
|
|
68
|
-
raw_data,
|
|
69
|
-
raw_data_hex: rawDataHex,
|
|
70
|
-
}
|
|
71
|
-
|
|
72
77
|
const signedTransaction = await wallet.signTransaction(transaction)
|
|
73
78
|
|
|
74
79
|
statusManager.updateAction(step, action.type, 'PENDING', {
|
package/src/version.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
export const name = '@lifi/sdk-provider-tron'
|
|
2
|
-
export const version = '4.0.0-beta.
|
|
2
|
+
export const version = '4.0.0-beta.8'
|