@lifi/sdk-provider-tron 4.0.0-beta.10 → 4.0.0-beta.11

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.
Files changed (42) hide show
  1. package/dist/cjs/TronProvider.js.map +1 -1
  2. package/dist/cjs/actions/getMulticallAddress.js.map +1 -1
  3. package/dist/cjs/actions/getTronBalance.js.map +1 -1
  4. package/dist/cjs/actions/resolveTronAddress.js.map +1 -1
  5. package/dist/cjs/core/TronStepExecutor.js.map +1 -1
  6. package/dist/cjs/core/tasks/TronCheckAllowanceTask.js.map +1 -1
  7. package/dist/cjs/core/tasks/TronSetAllowanceTask.js.map +1 -1
  8. package/dist/cjs/core/tasks/TronSignAndExecuteTask.js.map +1 -1
  9. package/dist/cjs/core/tasks/TronWaitForTransactionTask.js.map +1 -1
  10. package/dist/cjs/errors/parseTronErrors.js.map +1 -1
  11. package/dist/cjs/rpc/callTronRpcsWithRetry.js.map +1 -1
  12. package/dist/cjs/rpc/waitForTronTxConfirmation.js.map +1 -1
  13. package/dist/cjs/types.js.map +1 -1
  14. package/dist/cjs/utils/address.js.map +1 -1
  15. package/dist/cjs/utils/getTronTxLink.js.map +1 -1
  16. package/dist/cjs/utils/multicall3Abi.js.map +1 -1
  17. package/dist/cjs/utils/stripHexPrefix.js.map +1 -1
  18. package/dist/cjs/version.d.ts +1 -1
  19. package/dist/cjs/version.js +1 -1
  20. package/dist/cjs/version.js.map +1 -1
  21. package/dist/esm/TronProvider.js.map +1 -1
  22. package/dist/esm/actions/getMulticallAddress.js.map +1 -1
  23. package/dist/esm/actions/getTronBalance.js.map +1 -1
  24. package/dist/esm/actions/resolveTronAddress.js.map +1 -1
  25. package/dist/esm/core/TronStepExecutor.js.map +1 -1
  26. package/dist/esm/core/tasks/TronCheckAllowanceTask.js.map +1 -1
  27. package/dist/esm/core/tasks/TronSetAllowanceTask.js.map +1 -1
  28. package/dist/esm/core/tasks/TronSignAndExecuteTask.js.map +1 -1
  29. package/dist/esm/core/tasks/TronWaitForTransactionTask.js.map +1 -1
  30. package/dist/esm/errors/parseTronErrors.js.map +1 -1
  31. package/dist/esm/rpc/callTronRpcsWithRetry.js.map +1 -1
  32. package/dist/esm/rpc/waitForTronTxConfirmation.js.map +1 -1
  33. package/dist/esm/types.js.map +1 -1
  34. package/dist/esm/utils/address.js.map +1 -1
  35. package/dist/esm/utils/getTronTxLink.js.map +1 -1
  36. package/dist/esm/utils/multicall3Abi.js.map +1 -1
  37. package/dist/esm/utils/stripHexPrefix.js.map +1 -1
  38. package/dist/esm/version.d.ts +1 -1
  39. package/dist/esm/version.js +1 -1
  40. package/dist/esm/version.js.map +1 -1
  41. package/package.json +2 -2
  42. 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;CACnD,OAAO;EACL,IAAI,OAAO;GACT,OAAOA,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;GAC3B,IAAI,CAAC,SAAS,WACZ,MAAM,IAAIC,UAAAA,cACRC,UAAAA,cAAc,qBACd,8CACD;GAWH,OAAO,IANcC,8BAAAA,iBAAiB;IACpC,QAAA,MAHmB,SAAS,WAAW;IAIvC,SAAS,QAAQ;IACjB,kBAAkB,QAAQ;IAC3B,CAEc;;EAEjB,WAAW,SAA8B;GACvC,OAAO,OAAO,UAAU,QAAQ;;EAEnC"}
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,CAAC;CAClD,OAAO;EACL,IAAI,OAAO;GACT,OAAOA,UAAAA,UAAU;EACnB;EACA,YAAY,YAAoBC,QAAAA,QAAQ,UAAU,OAAO;EACzD,gBAAgBC,mCAAAA;EAChB,aAAa,QAAQ,eAAe,WAClCC,+BAAAA,eACE,QACA,eACA,QACA,SAAS,kBACX;EACF,MAAM,gBACJ,SAC2B;GAC3B,IAAI,CAAC,SAAS,WACZ,MAAM,IAAIC,UAAAA,cACRC,UAAAA,cAAc,qBACd,6CACF;GAWF,OAAO,IANcC,8BAAAA,iBAAiB;IACpC,QAAA,MAHmB,SAAS,UAAU;IAItC,SAAS,QAAQ;IACjB,kBAAkB,QAAQ;GAC5B,CAEc;EAChB;EACA,WAAW,SAA8B;GACvC,OAAO,OAAO,UAAU,OAAO;EACjC;CACF;AACF"}
@@ -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;CAEhC,QAAO,MADc,OAAO,WAAW,GACxB,MACZ,UAAU,MAAM,OAAO,WAAW,MAAM,cAAcA,UAAAA,UAAU,IAClE,EAAE"}
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;CAEhC,QAAO,MADc,OAAO,UAAU,IACvB,MACZ,UAAU,MAAM,OAAO,WAAW,MAAM,cAAcA,UAAAA,UAAU,GACnE,GAAG;AACL"}
@@ -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":"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"}
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":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"resolveTronAddress.js","names":[],"sources":["../../../src/actions/resolveTronAddress.ts"],"sourcesContent":["export async function resolveTronAddress(name: string): Promise<string> {\n // Tron does not have a name service, return the address as-is\n return name\n}\n"],"mappings":";;AAAA,eAAsB,mBAAmB,MAA+B;CAEtE,OAAO"}
1
+ {"version":3,"file":"resolveTronAddress.js","names":[],"sources":["../../../src/actions/resolveTronAddress.ts"],"sourcesContent":["export async function resolveTronAddress(name: string): Promise<string> {\n // Tron does not have a name service, return the address as-is\n return name\n}\n"],"mappings":";;AAAA,eAAsB,mBAAmB,MAA+B;CAEtE,OAAO;AACT"}
@@ -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;EAC5C,MAAM,QAAQ;EACd,KAAK,SAAS,QAAQ;;CAGxB,eAAe,SAAiC;EAC9C,MAAM,UAAU,KAAK,OAAO;EAC5B,IAAI,WAAW,YAAY,KAAK,OAAO,aACrC,MAAM,IAAIC,UAAAA,iBACRC,UAAAA,cAAc,8BACd,oHACD;;CAIL,eACE,OACA,MACA,WACsBC,+BAAAA,gBAAgB,OAAO,MAAM,OAAO;CAE5D,gBAAyB,OACvB,gBACqC;EACrC,OAAO;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;EACJ,IAAI,kBACF,WAAWN,0CAAAA,uBAAuB;OAElC,WACE,oBAAoB,UAAU,oBAAoB,WAAW,SACzDM,UAAAA,6BAA6B,OAC7BJ,UAAAA,iBAAiB;EAGzB,MAAM,iBAAiB,MAAM,WAC1B,SAAS,KAAK,YAAY,SAAS,SACrC;EAID,OAAO,IAAIK,UAAAA,aAFQ,MAAM,MAAM,eAEG,CAAC"}
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;EAC5C,MAAM,OAAO;EACb,KAAK,SAAS,QAAQ;CACxB;CAEA,eAAe,SAAiC;EAC9C,MAAM,UAAU,KAAK,OAAO;EAC5B,IAAI,WAAW,YAAY,KAAK,OAAO,aACrC,MAAM,IAAIC,UAAAA,iBACRC,UAAAA,cAAc,8BACd,mHACF;CAEJ;CAEA,eACE,OACA,MACA,WACsBC,+BAAAA,gBAAgB,OAAO,MAAM,MAAM;CAE3D,gBAAyB,OACvB,gBACqC;EACrC,OAAO;GACL,GAAG;GACH,QAAQ,KAAK;GACb,aAAa,KAAK;EACpB;CACF;CAEA,kBACE,YACiB;EACjB,MAAM,EAAE,MAAM,sBAAsB;EAEpC,MAAM,oBAAoBC,4BAAAA,cAAc,KAAK,OAAO,UAAU,OAAO;EAErE,MAAM,QAAQ;GACZ,IAAIC,0CAAAA,uBAAuB;GAC3B,IAAIC,wCAAAA,qBAAqB;GACzB,IAAIC,UAAAA,iBAAiB;GACrB,IAAIC,UAAAA,uBAAuB;GAC3B,IAAIC,0CAAAA,uBAAuB;GAC3B,IAAIC,8CAAAA,2BAA2B;GAC/B,IAAIC,UAAAA,6BACF,oBAAoB,oBAAoB,MAC1C;EACF;EAEA,MAAM,qBAAqB,KAAK,cAAc,WAC5C,MACA,oBAAoB,gBAAgB,MACtC;EAEA,MAAM,mBACJ,CAAC,oBAAoB,UACrB,CAAC,qBACD,CAAC,CAAC,KAAK,SAAS,mBAChB,CAAC,KAAK,SAAS;EAEjB,IAAI;EACJ,IAAI,kBACF,WAAWN,0CAAAA,uBAAuB;OAElC,WACE,oBAAoB,UAAU,oBAAoB,WAAW,SACzDM,UAAAA,6BAA6B,OAC7BJ,UAAAA,iBAAiB;EAGzB,MAAM,iBAAiB,MAAM,WAC1B,SAAS,KAAK,YAAY,SAAS,QACtC;EAIA,OAAO,IAAIK,UAAAA,aAFQ,MAAM,MAAM,cAEE,CAAC;CACpC;AACF"}
@@ -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;EAC3E,OAAO,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;EAEF,IAAI,CAAC,OAAO,SACV,MAAM,IAAIC,UAAAA,iBACRC,UAAAA,cAAc,8BACd,sEACD;EAGH,IAAI,CAAC,KAAK,SAAS,iBACjB,MAAM,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;GAC/B,OAAO,OAAO,OAAO,UAAU,CAAC;IAChC;EAEF,cAAc,aAAa,MAAM,OAAO,MAAM,OAAO;EAErD,OAAO;GACL,QAAQ;GACR,SAAS,EACP,wBAAwB,cAAc,WACvC;GACF"}
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;EAC3E,OAAO,CAAC,QAAQ;CAClB;CAEA,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;EACV,CAAC;EAED,IAAI,CAAC,OAAO,SACV,MAAM,IAAIC,UAAAA,iBACRC,UAAAA,cAAc,8BACd,qEACF;EAGF,IAAI,CAAC,KAAK,SAAS,iBACjB,MAAM,IAAID,UAAAA,iBACRC,UAAAA,cAAc,uBACd,oCACF;EAGF,MAAM,eAAe,OAAO;EAC5B,MAAM,eAAe,KAAK,OAAO,UAAU;EAC3C,MAAM,iBAAiB,KAAK,SAAS;EACrC,MAAM,aAAa,OAAO,KAAK,OAAO,UAAU;EAEhD,MAAM,YAAY,MAAMC,kCAAAA,sBAAsB,QAAQ,OAAO,YAAY;GAEvE,MAAM,SAAS,OAAM,MADE,QAAQ,SAAS,EAAE,GAAG,YAAY,GAEtD,UAAU,cAAc,cAAc,EACtC,KAAK,EAAE,MAAM,aAAa,CAAC;GAC9B,OAAO,OAAO,OAAO,SAAS,CAAC;EACjC,CAAC;EAED,cAAc,aAAa,MAAM,OAAO,MAAM,MAAM;EAEpD,OAAO;GACL,QAAQ;GACR,SAAS,EACP,wBAAwB,cAAc,UACxC;EACF;CACF;AACF"}
@@ -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;EAC3E,OAAO,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;EAEF,cAAc,aAAa,MAAM,OAAO,MAAM,kBAAkB;EAEhE,IAAI,CAAC,OAAO,SACV,MAAM,IAAIC,UAAAA,iBACRC,UAAAA,cAAc,8BACd,sEACD;EAGH,IAAI,CAAC,KAAK,SAAS,iBACjB,MAAM,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;EAC3E,IACE,gBAAgB,UACf,CAAC,OAAO,SAAS,YAAY,IAAI,eAAe,IAEjD,QAAQ,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;GACH,OAAO;IACP;EAEF,MAAM,oBAAoB,MAAM,OAAO,gBAAgB,YAAY;EAEnE,cAAc,aAAa,MAAM,OAAO,MAAM,UAAU;EAoBxD,MAAM,SAASC,6BAAAA,gBACb,MAnB4BD,kCAAAA,sBAC5B,QACA,OAAO,YAAY;GACjB,MAAM,SAAS,MAAM,QAAQ,IAAI,mBAAmB,kBAAkB;GAEtE,IAAI,CAAC,OAAO,UAAU,OAAO,OAAO,KAAK,KAAK,yBAC5C,MAAM,IAAIF,UAAAA,iBACRC,UAAAA,cAAc,mBACd,8BAA8B,OAAO,QAAQ,kBAC9C;GAGH,OAAO;IAEV,EAKiB,aAAa,QAAQ,kBAAkB,KACxD;EAED,cAAc,aAAa,MAAM,OAAO,MAAM,WAAW;GACvD;GACA,QAAQG,4BAAAA,cAAc,WAAW,OAAO;GACzC,CAAC;EAEF,MAAMC,sCAAAA,0BACJ,QACA,QACA,wCACD;EAED,cAAc,aAAa,MAAM,OAAO,MAAM,QAAQ;GACpD;GACA,QAAQD,4BAAAA,cAAc,WAAW,OAAO;GACzC,CAAC;EAEF,OAAO;GACL,QAAQ;GACR,SAAS,EAAE,wBAAwB,MAAM;GAC1C"}
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;EAC3E,OAAO,CAAC,QAAQ;CAClB;CAEA,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;EACV,CAAC;EAED,cAAc,aAAa,MAAM,OAAO,MAAM,iBAAiB;EAE/D,IAAI,CAAC,OAAO,SACV,MAAM,IAAIC,UAAAA,iBACRC,UAAAA,cAAc,8BACd,qEACF;EAGF,IAAI,CAAC,KAAK,SAAS,iBACjB,MAAM,IAAID,UAAAA,iBACRC,UAAAA,cAAc,uBACd,oCACF;EAGF,MAAM,eAAe,KAAK,OAAO,UAAU;EAC3C,MAAM,iBAAiB,KAAK,SAAS;EACrC,MAAM,eAAe,OAAO;EAC5B,MAAM,gBAAgB,OAAO,KAAK,OAAO,UAAU,EAAE,SAAS;EAE9D,MAAM,iBAAiB,KAAK,SAAS,UAAU,MAC5C,OAAO,GAAG,SAAS,SACtB;EACA,MAAM,cAAc,gBAAgB,QAAQ,OAAO,eAAe,KAAK,IAAI;EAC3E,IACE,gBAAgB,UACf,CAAC,OAAO,SAAS,WAAW,KAAK,eAAe,IAEjD,QAAQ,KACN,qEACA,eAAe,KACjB;EAEF,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,SAAS,GACX,CACE;IAAE,MAAM;IAAW,OAAO;GAAe,GACzC;IAAE,MAAM;IAAW,OAAO;GAAc,CAC1C,GACA,YACF;GACF,OAAO;EACT,CAAC;EAED,MAAM,oBAAoB,MAAM,OAAO,gBAAgB,WAAW;EAElE,cAAc,aAAa,MAAM,OAAO,MAAM,SAAS;EAoBvD,MAAM,SAASC,6BAAAA,gBACb,MAnB4BD,kCAAAA,sBAC5B,QACA,OAAO,YAAY;GACjB,MAAM,SAAS,MAAM,QAAQ,IAAI,mBAAmB,iBAAiB;GAErE,IAAI,CAAC,OAAO,UAAU,OAAO,OAAO,IAAI,MAAM,yBAC5C,MAAM,IAAIF,UAAAA,iBACRC,UAAAA,cAAc,mBACd,8BAA8B,OAAO,QAAQ,iBAC/C;GAGF,OAAO;EACT,CACF,GAKkB,aAAa,QAAQ,kBAAkB,IACzD;EAEA,cAAc,aAAa,MAAM,OAAO,MAAM,WAAW;GACvD;GACA,QAAQG,4BAAAA,cAAc,WAAW,MAAM;EACzC,CAAC;EAED,MAAMC,sCAAAA,0BACJ,QACA,QACA,uCACF;EAEA,cAAc,aAAa,MAAM,OAAO,MAAM,QAAQ;GACpD;GACA,QAAQD,4BAAAA,cAAc,WAAW,MAAM;EACzC,CAAC;EAED,OAAO;GACL,QAAQ;GACR,SAAS,EAAE,wBAAwB,KAAK;EAC1C;CACF;AACF"}
@@ -1 +1 @@
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;EAED,IAAI,CAAC,QACH,MAAM,IAAIC,UAAAA,iBACRC,UAAAA,cAAc,uBACd,mDACD;EAGH,IAAI,CAAC,KAAK,oBAAoB,MAC5B,MAAM,IAAID,UAAAA,iBACRC,UAAAA,cAAc,uBACd,mEACD;EAGH,YAAY,KAAK;EAEjB,cAAc,aAAa,MAAM,OAAO,MAAM,kBAAkB;EAEhE,IAAI,CAAC,QAAQ,sBACX,OAAO,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;GACD,OAAO,OAAO,SAAS,MAAM,QAAQ,IAAI,0BAA0B,CAAC;GACpE,OAAO,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;EAEnE,cAAc,aAAa,MAAM,OAAO,MAAM,WAAW,EACvD,UAAU,KAAK,KAAK,EACrB,CAAC;EAEF,OAAO;GACL,QAAQ;GACR,SAAS,EAAE,mBAAmB;GAC/B"}
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,MACtC;EAEA,IAAI,CAAC,QACH,MAAM,IAAIC,UAAAA,iBACRC,UAAAA,cAAc,uBACd,kDACF;EAGF,IAAI,CAAC,KAAK,oBAAoB,MAC5B,MAAM,IAAID,UAAAA,iBACRC,UAAAA,cAAc,uBACd,kEACF;EAGF,YAAY,IAAI;EAEhB,cAAc,aAAa,MAAM,OAAO,MAAM,iBAAiB;EAE/D,IAAI,CAAC,QAAQ,sBACX,OAAO,EAAE,QAAQ,SAAS;EAG5B,MAAM,aAAaC,6BAAAA,eAAe,KAAK,mBAAmB,IAAc;EAExE,MAAM,eACH,KAAK,mBAAmB,YAAY,gBACrC;EAOF,MAAM,cAA2B,MAAMC,kCAAAA,sBACrC,QACA,OAAO,YAAY;GACjB,MAAM,UAAUC,QAAAA,MAAM,cAAc,uBAClC,cACA,UACF;GACA,OAAO,OAAO,SAAS,MAAM,QAAQ,IAAI,yBAAyB,CAAC;GACnE,OAAO,QAAQ,mBAAmB,QAChC;IAAE,SAAS;IAAO,MAAM;IAAI,UAAU;IAAS,cAAc;GAAG,GAChE,EAAE,SAAS,KAAK,CAClB;EACF,CACF;EAEA,MAAM,oBAAoB,MAAM,OAAO,gBAAgB,WAAW;EAElE,cAAc,aAAa,MAAM,OAAO,MAAM,WAAW,EACvD,UAAU,KAAK,IAAI,EACrB,CAAC;EAED,OAAO;GACL,QAAQ;GACR,SAAS,EAAE,kBAAkB;EAC/B;CACF;AACF"}
@@ -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;EAEJ,IAAI,CAAC,mBACH,MAAM,IAAIC,UAAAA,iBACRC,UAAAA,cAAc,uBACd,kEACD;EAGH,MAAM,SAAS,cAAc,WAC3B,MACA,oBAAoB,gBAAgB,OACrC;EACD,IAAI,CAAC,QACH,MAAM,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;GAEtE,IAAI,CAAC,OAAO,UAAU,OAAO,OAAO,KAAK,KAAK,yBAC5C,MAAM,IAAIH,UAAAA,iBACRC,UAAAA,cAAc,mBACd,iCAAiC,OAAO,QAAQ,kBACjD;GAGH,OAAO;IAEV,EAKiB,aAAa,QAAQ,kBAAkB,KACxD;EAED,cAAc,aAAa,MAAM,OAAO,MAAM,WAAW;GACvD;GACA,QAAQG,4BAAAA,cAAc,WAAW,OAAO;GACzC,CAAC;EAEF,MAAMC,sCAAAA,0BAA0B,QAAQ,OAAO;EAE/C,IAAI,mBACF,cAAc,aAAa,MAAM,OAAO,MAAM,OAAO;EAGvD,OAAO,EAAE,QAAQ,aAAa"}
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;EAEJ,IAAI,CAAC,mBACH,MAAM,IAAIC,UAAAA,iBACRC,UAAAA,cAAc,uBACd,iEACF;EAGF,MAAM,SAAS,cAAc,WAC3B,MACA,oBAAoB,gBAAgB,MACtC;EACA,IAAI,CAAC,QACH,MAAM,IAAID,UAAAA,iBACRC,UAAAA,cAAc,uBACd,kDACF;EAqBF,MAAM,SAASC,6BAAAA,gBACb,MAnB4BC,kCAAAA,sBAC5B,QACA,OAAO,YAAY;GACjB,MAAM,SAAS,MAAM,QAAQ,IAAI,mBAAmB,iBAAiB;GAErE,IAAI,CAAC,OAAO,UAAU,OAAO,OAAO,IAAI,MAAM,yBAC5C,MAAM,IAAIH,UAAAA,iBACRC,UAAAA,cAAc,mBACd,iCAAiC,OAAO,QAAQ,iBAClD;GAGF,OAAO;EACT,CACF,GAKkB,aAAa,QAAQ,kBAAkB,IACzD;EAEA,cAAc,aAAa,MAAM,OAAO,MAAM,WAAW;GACvD;GACA,QAAQG,4BAAAA,cAAc,WAAW,MAAM;EACzC,CAAC;EAED,MAAMC,sCAAAA,0BAA0B,QAAQ,MAAM;EAE9C,IAAI,mBACF,cAAc,aAAa,MAAM,OAAO,MAAM,MAAM;EAGtD,OAAO,EAAE,QAAQ,YAAY;CAC/B;AACF"}
@@ -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;CACtB,IAAI,aAAaA,UAAAA,UAAU;EACzB,IAAI,iBAAiB,EAAE,QAAQ,EAQ7B,OAAO,IAAIA,UAAAA,SAAS,IALEC,UAAAA,iBACpBC,UAAAA,cAAc,mBACd,iGACC,EAAE,SAA+B,EAEP,EAAE,QAAQ,EAAE,MAAM,UAAU,EAAE,OAAO;EAEpE,EAAE,OAAO,EAAE,QAAQ;EACnB,EAAE,SAAS,EAAE,UAAU;EACvB,OAAO;;CAKT,OAAO,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;CAE1D,IACE,aAAaG,sCAAAA,8BACb,aAAaC,sCAAAA,yBAEb,OAAO,IAAIH,UAAAA,iBAAiBC,UAAAA,cAAc,mBAAmB,SAAS,EAAE;CAG1E,IAAI,aAAaG,sCAAAA,uBAAuB,aAAaC,sCAAAA,wBACnD,OAAO,IAAIC,UAAAA,cAAcL,UAAAA,cAAc,qBAAqB,SAAS,EAAE;CAGzE,IAAI,aAAaM,sCAAAA,yBACf,OAAO,IAAIP,UAAAA,iBACTC,UAAAA,cAAc,8BACd,SACA,EACD;CAKH,IACE,YAAY,kCACZ,YAAY,yBACZ,YAAY,6BAEZ,OAAO,IAAID,UAAAA,iBACTC,UAAAA,cAAc,uBACd,SACA,MACD;CAGH,IAAI,YAAY,iCACd,OAAO,IAAID,UAAAA,iBAAiBC,UAAAA,cAAc,mBAAmB,SAAS,MAAM;CAG9E,IAAI,YAAY,qDACd,OAAO,IAAID,UAAAA,iBACTC,UAAAA,cAAc,8BACd,SACA,MACD;CAGH,IAAI,iBAAiB,QAAQ,EAC3B,OAAO,IAAID,UAAAA,iBACTC,UAAAA,cAAc,mBACd,iGACA,MACD;CAGH,IAAI,aAAaO,UAAAA,WACf,OAAO;CAGT,OAAO,IAAIC,UAAAA,aAAa,WAAWC,UAAAA,aAAa,cAAc,MAAM"}
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,gBAAgB;AAEtC,MAAa,kBAAkB,OAC7B,GACA,MACA,WACsB;CACtB,IAAI,aAAaA,UAAAA,UAAU;EACzB,IAAI,iBAAiB,EAAE,OAAO,GAQ5B,OAAO,IAAIA,UAAAA,SAAS,IALEC,UAAAA,iBACpBC,UAAAA,cAAc,mBACd,iGACC,EAAE,SAA+B,CAER,GAAG,QAAQ,EAAE,MAAM,UAAU,EAAE,MAAM;EAEnE,EAAE,OAAO,EAAE,QAAQ;EACnB,EAAE,SAAS,EAAE,UAAU;EACvB,OAAO;CACT;CAIA,OAAO,IAAIF,UAAAA,SAFO,qBAAqB,CAEX,GAAG,MAAM,MAAM;AAC7C;AAEA,MAAM,wBAAwB,MAA0B;CACtD,MAAM,UACJ,OAAO,MAAM,WAAW,IAAI,aAAa,QAAQ,EAAE,UAAU;CAC/D,MAAM,QAA2B,aAAa,QAAQ,IAAI,KAAA;CAE1D,IACE,aAAaG,sCAAAA,8BACb,aAAaC,sCAAAA,yBAEb,OAAO,IAAIH,UAAAA,iBAAiBC,UAAAA,cAAc,mBAAmB,SAAS,CAAC;CAGzE,IAAI,aAAaG,sCAAAA,uBAAuB,aAAaC,sCAAAA,wBACnD,OAAO,IAAIC,UAAAA,cAAcL,UAAAA,cAAc,qBAAqB,SAAS,CAAC;CAGxE,IAAI,aAAaM,sCAAAA,yBACf,OAAO,IAAIP,UAAAA,iBACTC,UAAAA,cAAc,8BACd,SACA,CACF;CAKF,IACE,YAAY,kCACZ,YAAY,yBACZ,YAAY,6BAEZ,OAAO,IAAID,UAAAA,iBACTC,UAAAA,cAAc,uBACd,SACA,KACF;CAGF,IAAI,YAAY,iCACd,OAAO,IAAID,UAAAA,iBAAiBC,UAAAA,cAAc,mBAAmB,SAAS,KAAK;CAG7E,IAAI,YAAY,qDACd,OAAO,IAAID,UAAAA,iBACTC,UAAAA,cAAc,8BACd,SACA,KACF;CAGF,IAAI,iBAAiB,OAAO,GAC1B,OAAO,IAAID,UAAAA,iBACTC,UAAAA,cAAc,mBACd,iGACA,KACF;CAGF,IAAI,aAAaO,UAAAA,WACf,OAAO;CAGT,OAAO,IAAIC,UAAAA,aAAa,WAAWC,UAAAA,aAAa,cAAc,KAAK;AACrE"}
@@ -1 +1 @@
1
- {"version":3,"file":"callTronRpcsWithRetry.js","names":["LruMap","ChainId","TronWeb"],"sources":["../../../src/rpc/callTronRpcsWithRetry.ts"],"sourcesContent":["import { ChainId, LruMap, type SDKClient } from '@lifi/sdk'\nimport { TronWeb } from 'tronweb'\n\n/** @internal Exposed so unit tests can clear between cases (e.g. `tronWebCache.clear()`). */\nexport const tronWebCache: LruMap<TronWeb> = new LruMap<TronWeb>(12)\n\nexport async function callTronRpcsWithRetry<R>(\n client: SDKClient,\n fn: (tronWeb: TronWeb) => Promise<R>\n): Promise<R> {\n const urls = await client.getRpcUrlsByChainId(ChainId.TRN)\n\n if (!urls.length) {\n throw new Error('No Tron RPC URLs available')\n }\n\n const errors: Error[] = []\n for (const url of urls) {\n try {\n let tronWeb = tronWebCache.get(url)\n if (!tronWeb) {\n tronWeb = new TronWeb({ fullHost: url })\n tronWebCache.set(url, tronWeb)\n }\n return await fn(tronWeb)\n } catch (error) {\n errors.push(error instanceof Error ? error : new Error(String(error)))\n }\n }\n\n throw new AggregateError(errors, `All ${urls.length} Tron RPCs failed`)\n}\n"],"mappings":";;;;;AAIA,MAAa,eAAgC,IAAIA,UAAAA,OAAgB,GAAG;AAEpE,eAAsB,sBACpB,QACA,IACY;CACZ,MAAM,OAAO,MAAM,OAAO,oBAAoBC,UAAAA,QAAQ,IAAI;CAE1D,IAAI,CAAC,KAAK,QACR,MAAM,IAAI,MAAM,6BAA6B;CAG/C,MAAM,SAAkB,EAAE;CAC1B,KAAK,MAAM,OAAO,MAChB,IAAI;EACF,IAAI,UAAU,aAAa,IAAI,IAAI;EACnC,IAAI,CAAC,SAAS;GACZ,UAAU,IAAIC,QAAAA,QAAQ,EAAE,UAAU,KAAK,CAAC;GACxC,aAAa,IAAI,KAAK,QAAQ;;EAEhC,OAAO,MAAM,GAAG,QAAQ;UACjB,OAAO;EACd,OAAO,KAAK,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,MAAM,CAAC,CAAC;;CAI1E,MAAM,IAAI,eAAe,QAAQ,OAAO,KAAK,OAAO,mBAAmB"}
1
+ {"version":3,"file":"callTronRpcsWithRetry.js","names":["LruMap","ChainId","TronWeb"],"sources":["../../../src/rpc/callTronRpcsWithRetry.ts"],"sourcesContent":["import { ChainId, LruMap, type SDKClient } from '@lifi/sdk'\nimport { TronWeb } from 'tronweb'\n\n/** @internal Exposed so unit tests can clear between cases (e.g. `tronWebCache.clear()`). */\nexport const tronWebCache: LruMap<TronWeb> = new LruMap<TronWeb>(12)\n\nexport async function callTronRpcsWithRetry<R>(\n client: SDKClient,\n fn: (tronWeb: TronWeb) => Promise<R>\n): Promise<R> {\n const urls = await client.getRpcUrlsByChainId(ChainId.TRN)\n\n if (!urls.length) {\n throw new Error('No Tron RPC URLs available')\n }\n\n const errors: Error[] = []\n for (const url of urls) {\n try {\n let tronWeb = tronWebCache.get(url)\n if (!tronWeb) {\n tronWeb = new TronWeb({ fullHost: url })\n tronWebCache.set(url, tronWeb)\n }\n return await fn(tronWeb)\n } catch (error) {\n errors.push(error instanceof Error ? error : new Error(String(error)))\n }\n }\n\n throw new AggregateError(errors, `All ${urls.length} Tron RPCs failed`)\n}\n"],"mappings":";;;;;AAIA,MAAa,eAAgC,IAAIA,UAAAA,OAAgB,EAAE;AAEnE,eAAsB,sBACpB,QACA,IACY;CACZ,MAAM,OAAO,MAAM,OAAO,oBAAoBC,UAAAA,QAAQ,GAAG;CAEzD,IAAI,CAAC,KAAK,QACR,MAAM,IAAI,MAAM,4BAA4B;CAG9C,MAAM,SAAkB,CAAC;CACzB,KAAK,MAAM,OAAO,MAChB,IAAI;EACF,IAAI,UAAU,aAAa,IAAI,GAAG;EAClC,IAAI,CAAC,SAAS;GACZ,UAAU,IAAIC,QAAAA,QAAQ,EAAE,UAAU,IAAI,CAAC;GACvC,aAAa,IAAI,KAAK,OAAO;EAC/B;EACA,OAAO,MAAM,GAAG,OAAO;CACzB,SAAS,OAAO;EACd,OAAO,KAAK,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC,CAAC;CACvE;CAGF,MAAM,IAAI,eAAe,QAAQ,OAAO,KAAK,OAAO,kBAAkB;AACxE"}
@@ -1 +1 @@
1
- {"version":3,"file":"waitForTronTxConfirmation.js","names":["TransactionError","LiFiErrorCode","callTronRpcsWithRetry","TRON_POLL_INTERVAL_MS"],"sources":["../../../src/rpc/waitForTronTxConfirmation.ts"],"sourcesContent":["import {\n LiFiErrorCode,\n type SDKClient,\n TransactionError,\n waitForResult,\n} from '@lifi/sdk'\nimport {\n TRON_POLL_INTERVAL_MS,\n TRON_POLL_MAX_ERROR_RETRIES,\n TRON_POLL_MAX_POLLS,\n} from '../core/constants.js'\nimport { callTronRpcsWithRetry } from './callTronRpcsWithRetry.js'\n\n/**\n * Polls getTransactionInfo until the transaction is indexed, then resolves.\n *\n * Throws `TransactionError(TransactionFailed)` immediately (no retry) when the\n * receipt indicates on-chain failure. Tolerates up to\n * `TRON_POLL_MAX_ERROR_RETRIES` transient RPC errors. Caps total polls at\n * `TRON_POLL_MAX_POLLS` to prevent hanging on stuck indexing — note that\n * `waitForResult`'s own maxRetries counts errors only, so an explicit poll\n * budget is enforced here.\n */\nexport async function waitForTronTxConfirmation(\n client: SDKClient,\n txHash: string,\n onChainFailureMessage = 'Transaction failed on-chain.'\n): Promise<void> {\n let polls = 0\n await waitForResult(\n async () => {\n if (++polls > TRON_POLL_MAX_POLLS) {\n throw new TransactionError(\n LiFiErrorCode.TransactionFailed,\n 'Transaction confirmation timeout.'\n )\n }\n const txInfo = await callTronRpcsWithRetry(client, (tronWeb) =>\n tronWeb.trx.getTransactionInfo(txHash)\n )\n if (txInfo?.id) {\n if (txInfo.receipt?.result === 'FAILED') {\n throw new TransactionError(\n LiFiErrorCode.TransactionFailed,\n onChainFailureMessage\n )\n }\n return txInfo\n }\n return undefined\n },\n TRON_POLL_INTERVAL_MS,\n TRON_POLL_MAX_ERROR_RETRIES,\n (_count, error) => !(error instanceof TransactionError)\n )\n}\n"],"mappings":";;;;;;;;;;;;;;;AAuBA,eAAsB,0BACpB,QACA,QACA,wBAAwB,gCACT;CACf,IAAI,QAAQ;CACZ,OAAA,GAAA,UAAA,eACE,YAAY;EACV,IAAI,EAAE,QAAA,IACJ,MAAM,IAAIA,UAAAA,iBACRC,UAAAA,cAAc,mBACd,oCACD;EAEH,MAAM,SAAS,MAAMC,kCAAAA,sBAAsB,SAAS,YAClD,QAAQ,IAAI,mBAAmB,OAAO,CACvC;EACD,IAAI,QAAQ,IAAI;GACd,IAAI,OAAO,SAAS,WAAW,UAC7B,MAAM,IAAIF,UAAAA,iBACRC,UAAAA,cAAc,mBACd,sBACD;GAEH,OAAO;;IAIXE,uBAAAA,uBAAAA,IAEC,QAAQ,UAAU,EAAE,iBAAiBH,UAAAA,kBACvC"}
1
+ {"version":3,"file":"waitForTronTxConfirmation.js","names":["TransactionError","LiFiErrorCode","callTronRpcsWithRetry","TRON_POLL_INTERVAL_MS"],"sources":["../../../src/rpc/waitForTronTxConfirmation.ts"],"sourcesContent":["import {\n LiFiErrorCode,\n type SDKClient,\n TransactionError,\n waitForResult,\n} from '@lifi/sdk'\nimport {\n TRON_POLL_INTERVAL_MS,\n TRON_POLL_MAX_ERROR_RETRIES,\n TRON_POLL_MAX_POLLS,\n} from '../core/constants.js'\nimport { callTronRpcsWithRetry } from './callTronRpcsWithRetry.js'\n\n/**\n * Polls getTransactionInfo until the transaction is indexed, then resolves.\n *\n * Throws `TransactionError(TransactionFailed)` immediately (no retry) when the\n * receipt indicates on-chain failure. Tolerates up to\n * `TRON_POLL_MAX_ERROR_RETRIES` transient RPC errors. Caps total polls at\n * `TRON_POLL_MAX_POLLS` to prevent hanging on stuck indexing — note that\n * `waitForResult`'s own maxRetries counts errors only, so an explicit poll\n * budget is enforced here.\n */\nexport async function waitForTronTxConfirmation(\n client: SDKClient,\n txHash: string,\n onChainFailureMessage = 'Transaction failed on-chain.'\n): Promise<void> {\n let polls = 0\n await waitForResult(\n async () => {\n if (++polls > TRON_POLL_MAX_POLLS) {\n throw new TransactionError(\n LiFiErrorCode.TransactionFailed,\n 'Transaction confirmation timeout.'\n )\n }\n const txInfo = await callTronRpcsWithRetry(client, (tronWeb) =>\n tronWeb.trx.getTransactionInfo(txHash)\n )\n if (txInfo?.id) {\n if (txInfo.receipt?.result === 'FAILED') {\n throw new TransactionError(\n LiFiErrorCode.TransactionFailed,\n onChainFailureMessage\n )\n }\n return txInfo\n }\n return undefined\n },\n TRON_POLL_INTERVAL_MS,\n TRON_POLL_MAX_ERROR_RETRIES,\n (_count, error) => !(error instanceof TransactionError)\n )\n}\n"],"mappings":";;;;;;;;;;;;;;;AAuBA,eAAsB,0BACpB,QACA,QACA,wBAAwB,gCACT;CACf,IAAI,QAAQ;CACZ,OAAA,GAAA,UAAA,eACE,YAAY;EACV,IAAI,EAAE,QAAA,IACJ,MAAM,IAAIA,UAAAA,iBACRC,UAAAA,cAAc,mBACd,mCACF;EAEF,MAAM,SAAS,MAAMC,kCAAAA,sBAAsB,SAAS,YAClD,QAAQ,IAAI,mBAAmB,MAAM,CACvC;EACA,IAAI,QAAQ,IAAI;GACd,IAAI,OAAO,SAAS,WAAW,UAC7B,MAAM,IAAIF,UAAAA,iBACRC,UAAAA,cAAc,mBACd,qBACF;GAEF,OAAO;EACT;CAEF,GACAE,uBAAAA,uBAAAA,IAEC,QAAQ,UAAU,EAAE,iBAAiBH,UAAAA,iBACxC;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","names":["ChainType"],"sources":["../../src/types.ts"],"sourcesContent":["import {\n ChainType,\n type LiFiStepExtended,\n type SDKProvider,\n type StepExecutorContext,\n type StepExecutorOptions,\n} from '@lifi/sdk'\nimport type {\n Adapter,\n SignedTransaction,\n} from '@tronweb3/tronwallet-abstract-adapter'\n\nexport interface TronProviderOptions {\n getWallet?: () => Promise<Adapter>\n multicallBatchSize?: number\n}\n\nexport interface TronTaskContext {\n signedTransaction?: SignedTransaction\n hasSufficientAllowance?: boolean\n}\n\nexport interface TronStepExecutorContext\n extends StepExecutorContext,\n TronTaskContext {\n wallet: Adapter\n checkWallet: (step: LiFiStepExtended) => void\n}\n\nexport interface TronSDKProvider extends SDKProvider {\n setOptions(options: TronProviderOptions): void\n}\n\nexport function isTronProvider(\n provider: SDKProvider\n): provider is TronSDKProvider {\n return provider.type === ChainType.TVM\n}\n\nexport interface TronStepExecutorOptions extends StepExecutorOptions {\n wallet: Adapter\n}\n"],"mappings":";;;AAiCA,SAAgB,eACd,UAC6B;CAC7B,OAAO,SAAS,SAASA,UAAAA,UAAU"}
1
+ {"version":3,"file":"types.js","names":["ChainType"],"sources":["../../src/types.ts"],"sourcesContent":["import {\n ChainType,\n type LiFiStepExtended,\n type SDKProvider,\n type StepExecutorContext,\n type StepExecutorOptions,\n} from '@lifi/sdk'\nimport type {\n Adapter,\n SignedTransaction,\n} from '@tronweb3/tronwallet-abstract-adapter'\n\nexport interface TronProviderOptions {\n getWallet?: () => Promise<Adapter>\n multicallBatchSize?: number\n}\n\nexport interface TronTaskContext {\n signedTransaction?: SignedTransaction\n hasSufficientAllowance?: boolean\n}\n\nexport interface TronStepExecutorContext\n extends StepExecutorContext,\n TronTaskContext {\n wallet: Adapter\n checkWallet: (step: LiFiStepExtended) => void\n}\n\nexport interface TronSDKProvider extends SDKProvider {\n setOptions(options: TronProviderOptions): void\n}\n\nexport function isTronProvider(\n provider: SDKProvider\n): provider is TronSDKProvider {\n return provider.type === ChainType.TVM\n}\n\nexport interface TronStepExecutorOptions extends StepExecutorOptions {\n wallet: Adapter\n}\n"],"mappings":";;;AAiCA,SAAgB,eACd,UAC6B;CAC7B,OAAO,SAAS,SAASA,UAAAA,UAAU;AACrC"}
@@ -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;CAC9C,IAAI,CAAC,IAAI,WAAW,KAAK,EACvB,MAAM,IAAI,MAAM,uCAAuC,MAAM;CAE/D,OAAO,KAAK,IAAI,MAAM,EAAE;;AAG1B,SAAgB,sBACd,UACA,SACQ;CAGR,OAAO,KAAK,WADC,QAAQ,QAAQ,OAAO,GAAG,CAAC,SAAS,IAAI,IAC1B"}
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,WAAW;CAC7C,IAAI,CAAC,IAAI,WAAW,IAAI,GACtB,MAAM,IAAI,MAAM,uCAAuC,KAAK;CAE9D,OAAO,KAAK,IAAI,MAAM,CAAC;AACzB;AAEA,SAAgB,sBACd,UACA,SACQ;CAGR,OAAO,KAAK,WADC,QAAQ,QAAQ,OAAO,EAAE,EAAE,SAAS,IAAI,GAC3B;AAC5B"}
@@ -1 +1 @@
1
- {"version":3,"file":"getTronTxLink.js","names":[],"sources":["../../../src/utils/getTronTxLink.ts"],"sourcesContent":["import type { ExtendedChain } from '@lifi/sdk'\n\nexport const getTronTxLink = (\n chain: ExtendedChain,\n txHash: string\n): string | undefined => {\n const explorerUrl = chain.metamask.blockExplorerUrls[0]\n if (!explorerUrl) {\n return undefined\n }\n const base = explorerUrl.endsWith('/')\n ? explorerUrl.slice(0, -1)\n : explorerUrl\n return `${base}#/transaction/${txHash}`\n}\n"],"mappings":";;AAEA,MAAa,iBACX,OACA,WACuB;CACvB,MAAM,cAAc,MAAM,SAAS,kBAAkB;CACrD,IAAI,CAAC,aACH;CAKF,OAAO,GAHM,YAAY,SAAS,IAAI,GAClC,YAAY,MAAM,GAAG,GAAG,GACxB,YACW,gBAAgB"}
1
+ {"version":3,"file":"getTronTxLink.js","names":[],"sources":["../../../src/utils/getTronTxLink.ts"],"sourcesContent":["import type { ExtendedChain } from '@lifi/sdk'\n\nexport const getTronTxLink = (\n chain: ExtendedChain,\n txHash: string\n): string | undefined => {\n const explorerUrl = chain.metamask.blockExplorerUrls[0]\n if (!explorerUrl) {\n return undefined\n }\n const base = explorerUrl.endsWith('/')\n ? explorerUrl.slice(0, -1)\n : explorerUrl\n return `${base}#/transaction/${txHash}`\n}\n"],"mappings":";;AAEA,MAAa,iBACX,OACA,WACuB;CACvB,MAAM,cAAc,MAAM,SAAS,kBAAkB;CACrD,IAAI,CAAC,aACH;CAKF,OAAO,GAHM,YAAY,SAAS,GAAG,IACjC,YAAY,MAAM,GAAG,EAAE,IACvB,YACW,gBAAgB;AACjC"}
@@ -1 +1 @@
1
- {"version":3,"file":"multicall3Abi.js","names":[],"sources":["../../../src/utils/multicall3Abi.ts"],"sourcesContent":["import type { Types } from 'tronweb'\n\nexport const multicall3Abi: Types.ContractAbiInterface = [\n {\n inputs: [\n {\n components: [\n { internalType: 'address', name: 'target', type: 'address' },\n { internalType: 'bool', name: 'allowFailure', type: 'bool' },\n { internalType: 'bytes', name: 'callData', type: 'bytes' },\n ],\n internalType: 'struct Multicall3.Call3[]',\n name: 'calls',\n type: 'tuple[]',\n },\n ],\n name: 'aggregate3',\n outputs: [\n {\n components: [\n { internalType: 'bool', name: 'success', type: 'bool' },\n { internalType: 'bytes', name: 'returnData', type: 'bytes' },\n ],\n internalType: 'struct Multicall3.Result[]',\n name: 'returnData',\n type: 'tuple[]',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [{ internalType: 'address', name: 'addr', type: 'address' }],\n name: 'getEthBalance',\n outputs: [{ internalType: 'uint256', name: 'balance', type: 'uint256' }],\n stateMutability: 'view',\n type: 'function',\n },\n]\n"],"mappings":";;AAEA,MAAa,gBAA4C,CACvD;CACE,QAAQ,CACN;EACE,YAAY;GACV;IAAE,cAAc;IAAW,MAAM;IAAU,MAAM;IAAW;GAC5D;IAAE,cAAc;IAAQ,MAAM;IAAgB,MAAM;IAAQ;GAC5D;IAAE,cAAc;IAAS,MAAM;IAAY,MAAM;IAAS;GAC3D;EACD,cAAc;EACd,MAAM;EACN,MAAM;EACP,CACF;CACD,MAAM;CACN,SAAS,CACP;EACE,YAAY,CACV;GAAE,cAAc;GAAQ,MAAM;GAAW,MAAM;GAAQ,EACvD;GAAE,cAAc;GAAS,MAAM;GAAc,MAAM;GAAS,CAC7D;EACD,cAAc;EACd,MAAM;EACN,MAAM;EACP,CACF;CACD,iBAAiB;CACjB,MAAM;CACP,EACD;CACE,QAAQ,CAAC;EAAE,cAAc;EAAW,MAAM;EAAQ,MAAM;EAAW,CAAC;CACpE,MAAM;CACN,SAAS,CAAC;EAAE,cAAc;EAAW,MAAM;EAAW,MAAM;EAAW,CAAC;CACxE,iBAAiB;CACjB,MAAM;CACP,CACF"}
1
+ {"version":3,"file":"multicall3Abi.js","names":[],"sources":["../../../src/utils/multicall3Abi.ts"],"sourcesContent":["import type { Types } from 'tronweb'\n\nexport const multicall3Abi: Types.ContractAbiInterface = [\n {\n inputs: [\n {\n components: [\n { internalType: 'address', name: 'target', type: 'address' },\n { internalType: 'bool', name: 'allowFailure', type: 'bool' },\n { internalType: 'bytes', name: 'callData', type: 'bytes' },\n ],\n internalType: 'struct Multicall3.Call3[]',\n name: 'calls',\n type: 'tuple[]',\n },\n ],\n name: 'aggregate3',\n outputs: [\n {\n components: [\n { internalType: 'bool', name: 'success', type: 'bool' },\n { internalType: 'bytes', name: 'returnData', type: 'bytes' },\n ],\n internalType: 'struct Multicall3.Result[]',\n name: 'returnData',\n type: 'tuple[]',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [{ internalType: 'address', name: 'addr', type: 'address' }],\n name: 'getEthBalance',\n outputs: [{ internalType: 'uint256', name: 'balance', type: 'uint256' }],\n stateMutability: 'view',\n type: 'function',\n },\n]\n"],"mappings":";;AAEA,MAAa,gBAA4C,CACvD;CACE,QAAQ,CACN;EACE,YAAY;GACV;IAAE,cAAc;IAAW,MAAM;IAAU,MAAM;GAAU;GAC3D;IAAE,cAAc;IAAQ,MAAM;IAAgB,MAAM;GAAO;GAC3D;IAAE,cAAc;IAAS,MAAM;IAAY,MAAM;GAAQ;EAC3D;EACA,cAAc;EACd,MAAM;EACN,MAAM;CACR,CACF;CACA,MAAM;CACN,SAAS,CACP;EACE,YAAY,CACV;GAAE,cAAc;GAAQ,MAAM;GAAW,MAAM;EAAO,GACtD;GAAE,cAAc;GAAS,MAAM;GAAc,MAAM;EAAQ,CAC7D;EACA,cAAc;EACd,MAAM;EACN,MAAM;CACR,CACF;CACA,iBAAiB;CACjB,MAAM;AACR,GACA;CACE,QAAQ,CAAC;EAAE,cAAc;EAAW,MAAM;EAAQ,MAAM;CAAU,CAAC;CACnE,MAAM;CACN,SAAS,CAAC;EAAE,cAAc;EAAW,MAAM;EAAW,MAAM;CAAU,CAAC;CACvE,iBAAiB;CACjB,MAAM;AACR,CACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"stripHexPrefix.js","names":[],"sources":["../../../src/utils/stripHexPrefix.ts"],"sourcesContent":["export const stripHexPrefix = (value: string): string =>\n value.replace(/^0x/, '')\n"],"mappings":";;AAAA,MAAa,kBAAkB,UAC7B,MAAM,QAAQ,OAAO,GAAG"}
1
+ {"version":3,"file":"stripHexPrefix.js","names":[],"sources":["../../../src/utils/stripHexPrefix.ts"],"sourcesContent":["export const stripHexPrefix = (value: string): string =>\n value.replace(/^0x/, '')\n"],"mappings":";;AAAA,MAAa,kBAAkB,UAC7B,MAAM,QAAQ,OAAO,EAAE"}
@@ -1,6 +1,6 @@
1
1
  //#region src/version.d.ts
2
2
  declare const name = "@lifi/sdk-provider-tron";
3
- declare const version = "4.0.0-beta.10";
3
+ declare const version = "4.0.0-beta.11";
4
4
  //#endregion
5
5
  export { name, version };
6
6
  //# sourceMappingURL=version.d.ts.map
@@ -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.10";
4
+ const version = "4.0.0-beta.11";
5
5
  //#endregion
6
6
  exports.name = name;
7
7
  exports.version = version;
@@ -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.10'\n"],"mappings":";;AAAA,MAAa,OAAO;AACpB,MAAa,UAAU"}
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.11'\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;CACnD,OAAO;EACL,IAAI,OAAO;GACT,OAAO,UAAU;;EAEnB,YAAY,YAAoB,QAAQ,UAAU,QAAQ;EAC1D,gBAAgB;EAChB,aAAa,QAAQ,eAAe,WAClC,eACE,QACA,eACA,QACA,SAAS,mBACV;EACH,MAAM,gBACJ,SAC2B;GAC3B,IAAI,CAAC,SAAS,WACZ,MAAM,IAAI,cACR,cAAc,qBACd,8CACD;GAWH,OAAO,IANc,iBAAiB;IACpC,QAAA,MAHmB,SAAS,WAAW;IAIvC,SAAS,QAAQ;IACjB,kBAAkB,QAAQ;IAC3B,CAEc;;EAEjB,WAAW,SAA8B;GACvC,OAAO,OAAO,UAAU,QAAQ;;EAEnC"}
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,CAAC;CAClD,OAAO;EACL,IAAI,OAAO;GACT,OAAO,UAAU;EACnB;EACA,YAAY,YAAoB,QAAQ,UAAU,OAAO;EACzD,gBAAgB;EAChB,aAAa,QAAQ,eAAe,WAClC,eACE,QACA,eACA,QACA,SAAS,kBACX;EACF,MAAM,gBACJ,SAC2B;GAC3B,IAAI,CAAC,SAAS,WACZ,MAAM,IAAI,cACR,cAAc,qBACd,6CACF;GAWF,OAAO,IANc,iBAAiB;IACpC,QAAA,MAHmB,SAAS,UAAU;IAItC,SAAS,QAAQ;IACjB,kBAAkB,QAAQ;GAC5B,CAEc;EAChB;EACA,WAAW,SAA8B;GACvC,OAAO,OAAO,UAAU,OAAO;EACjC;CACF;AACF"}
@@ -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;CAEhC,QAAO,MADc,OAAO,WAAW,GACxB,MACZ,UAAU,MAAM,OAAO,WAAW,MAAM,cAAc,UAAU,IAClE,EAAE"}
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;CAEhC,QAAO,MADc,OAAO,UAAU,IACvB,MACZ,UAAU,MAAM,OAAO,WAAW,MAAM,cAAc,UAAU,GACnE,GAAG;AACL"}
@@ -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":"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"}
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":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"resolveTronAddress.js","names":[],"sources":["../../../src/actions/resolveTronAddress.ts"],"sourcesContent":["export async function resolveTronAddress(name: string): Promise<string> {\n // Tron does not have a name service, return the address as-is\n return name\n}\n"],"mappings":";AAAA,eAAsB,mBAAmB,MAA+B;CAEtE,OAAO"}
1
+ {"version":3,"file":"resolveTronAddress.js","names":[],"sources":["../../../src/actions/resolveTronAddress.ts"],"sourcesContent":["export async function resolveTronAddress(name: string): Promise<string> {\n // Tron does not have a name service, return the address as-is\n return name\n}\n"],"mappings":";AAAA,eAAsB,mBAAmB,MAA+B;CAEtE,OAAO;AACT"}
@@ -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;EAC5C,MAAM,QAAQ;EACd,KAAK,SAAS,QAAQ;;CAGxB,eAAe,SAAiC;EAC9C,MAAM,UAAU,KAAK,OAAO;EAC5B,IAAI,WAAW,YAAY,KAAK,OAAO,aACrC,MAAM,IAAI,iBACR,cAAc,8BACd,oHACD;;CAIL,eACE,OACA,MACA,WACsB,gBAAgB,OAAO,MAAM,OAAO;CAE5D,gBAAyB,OACvB,gBACqC;EACrC,OAAO;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;EACJ,IAAI,kBACF,WAAW,uBAAuB;OAElC,WACE,oBAAoB,UAAU,oBAAoB,WAAW,SACzD,6BAA6B,OAC7B,iBAAiB;EAGzB,MAAM,iBAAiB,MAAM,WAC1B,SAAS,KAAK,YAAY,SAAS,SACrC;EAID,OAAO,IAAI,aAFQ,MAAM,MAAM,eAEG,CAAC"}
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;EAC5C,MAAM,OAAO;EACb,KAAK,SAAS,QAAQ;CACxB;CAEA,eAAe,SAAiC;EAC9C,MAAM,UAAU,KAAK,OAAO;EAC5B,IAAI,WAAW,YAAY,KAAK,OAAO,aACrC,MAAM,IAAI,iBACR,cAAc,8BACd,mHACF;CAEJ;CAEA,eACE,OACA,MACA,WACsB,gBAAgB,OAAO,MAAM,MAAM;CAE3D,gBAAyB,OACvB,gBACqC;EACrC,OAAO;GACL,GAAG;GACH,QAAQ,KAAK;GACb,aAAa,KAAK;EACpB;CACF;CAEA,kBACE,YACiB;EACjB,MAAM,EAAE,MAAM,sBAAsB;EAEpC,MAAM,oBAAoB,cAAc,KAAK,OAAO,UAAU,OAAO;EAErE,MAAM,QAAQ;GACZ,IAAI,uBAAuB;GAC3B,IAAI,qBAAqB;GACzB,IAAI,iBAAiB;GACrB,IAAI,uBAAuB;GAC3B,IAAI,uBAAuB;GAC3B,IAAI,2BAA2B;GAC/B,IAAI,6BACF,oBAAoB,oBAAoB,MAC1C;EACF;EAEA,MAAM,qBAAqB,KAAK,cAAc,WAC5C,MACA,oBAAoB,gBAAgB,MACtC;EAEA,MAAM,mBACJ,CAAC,oBAAoB,UACrB,CAAC,qBACD,CAAC,CAAC,KAAK,SAAS,mBAChB,CAAC,KAAK,SAAS;EAEjB,IAAI;EACJ,IAAI,kBACF,WAAW,uBAAuB;OAElC,WACE,oBAAoB,UAAU,oBAAoB,WAAW,SACzD,6BAA6B,OAC7B,iBAAiB;EAGzB,MAAM,iBAAiB,MAAM,WAC1B,SAAS,KAAK,YAAY,SAAS,QACtC;EAIA,OAAO,IAAI,aAFQ,MAAM,MAAM,cAEE,CAAC;CACpC;AACF"}
@@ -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;EAC3E,OAAO,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;EAEF,IAAI,CAAC,OAAO,SACV,MAAM,IAAI,iBACR,cAAc,8BACd,sEACD;EAGH,IAAI,CAAC,KAAK,SAAS,iBACjB,MAAM,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;GAC/B,OAAO,OAAO,OAAO,UAAU,CAAC;IAChC;EAEF,cAAc,aAAa,MAAM,OAAO,MAAM,OAAO;EAErD,OAAO;GACL,QAAQ;GACR,SAAS,EACP,wBAAwB,cAAc,WACvC;GACF"}
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;EAC3E,OAAO,CAAC,QAAQ;CAClB;CAEA,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;EACV,CAAC;EAED,IAAI,CAAC,OAAO,SACV,MAAM,IAAI,iBACR,cAAc,8BACd,qEACF;EAGF,IAAI,CAAC,KAAK,SAAS,iBACjB,MAAM,IAAI,iBACR,cAAc,uBACd,oCACF;EAGF,MAAM,eAAe,OAAO;EAC5B,MAAM,eAAe,KAAK,OAAO,UAAU;EAC3C,MAAM,iBAAiB,KAAK,SAAS;EACrC,MAAM,aAAa,OAAO,KAAK,OAAO,UAAU;EAEhD,MAAM,YAAY,MAAM,sBAAsB,QAAQ,OAAO,YAAY;GAEvE,MAAM,SAAS,OAAM,MADE,QAAQ,SAAS,EAAE,GAAG,YAAY,GAEtD,UAAU,cAAc,cAAc,EACtC,KAAK,EAAE,MAAM,aAAa,CAAC;GAC9B,OAAO,OAAO,OAAO,SAAS,CAAC;EACjC,CAAC;EAED,cAAc,aAAa,MAAM,OAAO,MAAM,MAAM;EAEpD,OAAO;GACL,QAAQ;GACR,SAAS,EACP,wBAAwB,cAAc,UACxC;EACF;CACF;AACF"}
@@ -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;EAC3E,OAAO,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;EAEF,cAAc,aAAa,MAAM,OAAO,MAAM,kBAAkB;EAEhE,IAAI,CAAC,OAAO,SACV,MAAM,IAAI,iBACR,cAAc,8BACd,sEACD;EAGH,IAAI,CAAC,KAAK,SAAS,iBACjB,MAAM,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;EAC3E,IACE,gBAAgB,UACf,CAAC,OAAO,SAAS,YAAY,IAAI,eAAe,IAEjD,QAAQ,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;GACH,OAAO;IACP;EAEF,MAAM,oBAAoB,MAAM,OAAO,gBAAgB,YAAY;EAEnE,cAAc,aAAa,MAAM,OAAO,MAAM,UAAU;EAoBxD,MAAM,SAAS,gBACb,MAnB4B,sBAC5B,QACA,OAAO,YAAY;GACjB,MAAM,SAAS,MAAM,QAAQ,IAAI,mBAAmB,kBAAkB;GAEtE,IAAI,CAAC,OAAO,UAAU,OAAO,OAAO,KAAK,KAAK,yBAC5C,MAAM,IAAI,iBACR,cAAc,mBACd,8BAA8B,OAAO,QAAQ,kBAC9C;GAGH,OAAO;IAEV,EAKiB,aAAa,QAAQ,kBAAkB,KACxD;EAED,cAAc,aAAa,MAAM,OAAO,MAAM,WAAW;GACvD;GACA,QAAQ,cAAc,WAAW,OAAO;GACzC,CAAC;EAEF,MAAM,0BACJ,QACA,QACA,wCACD;EAED,cAAc,aAAa,MAAM,OAAO,MAAM,QAAQ;GACpD;GACA,QAAQ,cAAc,WAAW,OAAO;GACzC,CAAC;EAEF,OAAO;GACL,QAAQ;GACR,SAAS,EAAE,wBAAwB,MAAM;GAC1C"}
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;EAC3E,OAAO,CAAC,QAAQ;CAClB;CAEA,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;EACV,CAAC;EAED,cAAc,aAAa,MAAM,OAAO,MAAM,iBAAiB;EAE/D,IAAI,CAAC,OAAO,SACV,MAAM,IAAI,iBACR,cAAc,8BACd,qEACF;EAGF,IAAI,CAAC,KAAK,SAAS,iBACjB,MAAM,IAAI,iBACR,cAAc,uBACd,oCACF;EAGF,MAAM,eAAe,KAAK,OAAO,UAAU;EAC3C,MAAM,iBAAiB,KAAK,SAAS;EACrC,MAAM,eAAe,OAAO;EAC5B,MAAM,gBAAgB,OAAO,KAAK,OAAO,UAAU,EAAE,SAAS;EAE9D,MAAM,iBAAiB,KAAK,SAAS,UAAU,MAC5C,OAAO,GAAG,SAAS,SACtB;EACA,MAAM,cAAc,gBAAgB,QAAQ,OAAO,eAAe,KAAK,IAAI;EAC3E,IACE,gBAAgB,UACf,CAAC,OAAO,SAAS,WAAW,KAAK,eAAe,IAEjD,QAAQ,KACN,qEACA,eAAe,KACjB;EAEF,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,SAAS,GACX,CACE;IAAE,MAAM;IAAW,OAAO;GAAe,GACzC;IAAE,MAAM;IAAW,OAAO;GAAc,CAC1C,GACA,YACF;GACF,OAAO;EACT,CAAC;EAED,MAAM,oBAAoB,MAAM,OAAO,gBAAgB,WAAW;EAElE,cAAc,aAAa,MAAM,OAAO,MAAM,SAAS;EAoBvD,MAAM,SAAS,gBACb,MAnB4B,sBAC5B,QACA,OAAO,YAAY;GACjB,MAAM,SAAS,MAAM,QAAQ,IAAI,mBAAmB,iBAAiB;GAErE,IAAI,CAAC,OAAO,UAAU,OAAO,OAAO,IAAI,MAAM,yBAC5C,MAAM,IAAI,iBACR,cAAc,mBACd,8BAA8B,OAAO,QAAQ,iBAC/C;GAGF,OAAO;EACT,CACF,GAKkB,aAAa,QAAQ,kBAAkB,IACzD;EAEA,cAAc,aAAa,MAAM,OAAO,MAAM,WAAW;GACvD;GACA,QAAQ,cAAc,WAAW,MAAM;EACzC,CAAC;EAED,MAAM,0BACJ,QACA,QACA,uCACF;EAEA,cAAc,aAAa,MAAM,OAAO,MAAM,QAAQ;GACpD;GACA,QAAQ,cAAc,WAAW,MAAM;EACzC,CAAC;EAED,OAAO;GACL,QAAQ;GACR,SAAS,EAAE,wBAAwB,KAAK;EAC1C;CACF;AACF"}
@@ -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 { 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;EAED,IAAI,CAAC,QACH,MAAM,IAAI,iBACR,cAAc,uBACd,mDACD;EAGH,IAAI,CAAC,KAAK,oBAAoB,MAC5B,MAAM,IAAI,iBACR,cAAc,uBACd,mEACD;EAGH,YAAY,KAAK;EAEjB,cAAc,aAAa,MAAM,OAAO,MAAM,kBAAkB;EAEhE,IAAI,CAAC,QAAQ,sBACX,OAAO,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;GACD,OAAO,OAAO,SAAS,MAAM,QAAQ,IAAI,0BAA0B,CAAC;GACpE,OAAO,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;EAEnE,cAAc,aAAa,MAAM,OAAO,MAAM,WAAW,EACvD,UAAU,KAAK,KAAK,EACrB,CAAC;EAEF,OAAO;GACL,QAAQ;GACR,SAAS,EAAE,mBAAmB;GAC/B"}
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,MACtC;EAEA,IAAI,CAAC,QACH,MAAM,IAAI,iBACR,cAAc,uBACd,kDACF;EAGF,IAAI,CAAC,KAAK,oBAAoB,MAC5B,MAAM,IAAI,iBACR,cAAc,uBACd,kEACF;EAGF,YAAY,IAAI;EAEhB,cAAc,aAAa,MAAM,OAAO,MAAM,iBAAiB;EAE/D,IAAI,CAAC,QAAQ,sBACX,OAAO,EAAE,QAAQ,SAAS;EAG5B,MAAM,aAAa,eAAe,KAAK,mBAAmB,IAAc;EAExE,MAAM,eACH,KAAK,mBAAmB,YAAY,gBACrC;EAOF,MAAM,cAA2B,MAAM,sBACrC,QACA,OAAO,YAAY;GACjB,MAAM,UAAU,MAAM,cAAc,uBAClC,cACA,UACF;GACA,OAAO,OAAO,SAAS,MAAM,QAAQ,IAAI,yBAAyB,CAAC;GACnE,OAAO,QAAQ,mBAAmB,QAChC;IAAE,SAAS;IAAO,MAAM;IAAI,UAAU;IAAS,cAAc;GAAG,GAChE,EAAE,SAAS,KAAK,CAClB;EACF,CACF;EAEA,MAAM,oBAAoB,MAAM,OAAO,gBAAgB,WAAW;EAElE,cAAc,aAAa,MAAM,OAAO,MAAM,WAAW,EACvD,UAAU,KAAK,IAAI,EACrB,CAAC;EAED,OAAO;GACL,QAAQ;GACR,SAAS,EAAE,kBAAkB;EAC/B;CACF;AACF"}
@@ -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;EAEJ,IAAI,CAAC,mBACH,MAAM,IAAI,iBACR,cAAc,uBACd,kEACD;EAGH,MAAM,SAAS,cAAc,WAC3B,MACA,oBAAoB,gBAAgB,OACrC;EACD,IAAI,CAAC,QACH,MAAM,IAAI,iBACR,cAAc,uBACd,mDACD;EAqBH,MAAM,SAAS,gBACb,MAnB4B,sBAC5B,QACA,OAAO,YAAY;GACjB,MAAM,SAAS,MAAM,QAAQ,IAAI,mBAAmB,kBAAkB;GAEtE,IAAI,CAAC,OAAO,UAAU,OAAO,OAAO,KAAK,KAAK,yBAC5C,MAAM,IAAI,iBACR,cAAc,mBACd,iCAAiC,OAAO,QAAQ,kBACjD;GAGH,OAAO;IAEV,EAKiB,aAAa,QAAQ,kBAAkB,KACxD;EAED,cAAc,aAAa,MAAM,OAAO,MAAM,WAAW;GACvD;GACA,QAAQ,cAAc,WAAW,OAAO;GACzC,CAAC;EAEF,MAAM,0BAA0B,QAAQ,OAAO;EAE/C,IAAI,mBACF,cAAc,aAAa,MAAM,OAAO,MAAM,OAAO;EAGvD,OAAO,EAAE,QAAQ,aAAa"}
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;EAEJ,IAAI,CAAC,mBACH,MAAM,IAAI,iBACR,cAAc,uBACd,iEACF;EAGF,MAAM,SAAS,cAAc,WAC3B,MACA,oBAAoB,gBAAgB,MACtC;EACA,IAAI,CAAC,QACH,MAAM,IAAI,iBACR,cAAc,uBACd,kDACF;EAqBF,MAAM,SAAS,gBACb,MAnB4B,sBAC5B,QACA,OAAO,YAAY;GACjB,MAAM,SAAS,MAAM,QAAQ,IAAI,mBAAmB,iBAAiB;GAErE,IAAI,CAAC,OAAO,UAAU,OAAO,OAAO,IAAI,MAAM,yBAC5C,MAAM,IAAI,iBACR,cAAc,mBACd,iCAAiC,OAAO,QAAQ,iBAClD;GAGF,OAAO;EACT,CACF,GAKkB,aAAa,QAAQ,kBAAkB,IACzD;EAEA,cAAc,aAAa,MAAM,OAAO,MAAM,WAAW;GACvD;GACA,QAAQ,cAAc,WAAW,MAAM;EACzC,CAAC;EAED,MAAM,0BAA0B,QAAQ,MAAM;EAE9C,IAAI,mBACF,cAAc,aAAa,MAAM,OAAO,MAAM,MAAM;EAGtD,OAAO,EAAE,QAAQ,YAAY;CAC/B;AACF"}
@@ -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;CACtB,IAAI,aAAa,UAAU;EACzB,IAAI,iBAAiB,EAAE,QAAQ,EAQ7B,OAAO,IAAI,SAAS,IALE,iBACpB,cAAc,mBACd,iGACC,EAAE,SAA+B,EAEP,EAAE,QAAQ,EAAE,MAAM,UAAU,EAAE,OAAO;EAEpE,EAAE,OAAO,EAAE,QAAQ;EACnB,EAAE,SAAS,EAAE,UAAU;EACvB,OAAO;;CAKT,OAAO,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;CAE1D,IACE,aAAa,8BACb,aAAa,yBAEb,OAAO,IAAI,iBAAiB,cAAc,mBAAmB,SAAS,EAAE;CAG1E,IAAI,aAAa,uBAAuB,aAAa,wBACnD,OAAO,IAAI,cAAc,cAAc,qBAAqB,SAAS,EAAE;CAGzE,IAAI,aAAa,yBACf,OAAO,IAAI,iBACT,cAAc,8BACd,SACA,EACD;CAKH,IACE,YAAY,kCACZ,YAAY,yBACZ,YAAY,6BAEZ,OAAO,IAAI,iBACT,cAAc,uBACd,SACA,MACD;CAGH,IAAI,YAAY,iCACd,OAAO,IAAI,iBAAiB,cAAc,mBAAmB,SAAS,MAAM;CAG9E,IAAI,YAAY,qDACd,OAAO,IAAI,iBACT,cAAc,8BACd,SACA,MACD;CAGH,IAAI,iBAAiB,QAAQ,EAC3B,OAAO,IAAI,iBACT,cAAc,mBACd,iGACA,MACD;CAGH,IAAI,aAAa,WACf,OAAO;CAGT,OAAO,IAAI,aAAa,WAAW,aAAa,cAAc,MAAM"}
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,gBAAgB;AAEtC,MAAa,kBAAkB,OAC7B,GACA,MACA,WACsB;CACtB,IAAI,aAAa,UAAU;EACzB,IAAI,iBAAiB,EAAE,OAAO,GAQ5B,OAAO,IAAI,SAAS,IALE,iBACpB,cAAc,mBACd,iGACC,EAAE,SAA+B,CAER,GAAG,QAAQ,EAAE,MAAM,UAAU,EAAE,MAAM;EAEnE,EAAE,OAAO,EAAE,QAAQ;EACnB,EAAE,SAAS,EAAE,UAAU;EACvB,OAAO;CACT;CAIA,OAAO,IAAI,SAFO,qBAAqB,CAEX,GAAG,MAAM,MAAM;AAC7C;AAEA,MAAM,wBAAwB,MAA0B;CACtD,MAAM,UACJ,OAAO,MAAM,WAAW,IAAI,aAAa,QAAQ,EAAE,UAAU;CAC/D,MAAM,QAA2B,aAAa,QAAQ,IAAI,KAAA;CAE1D,IACE,aAAa,8BACb,aAAa,yBAEb,OAAO,IAAI,iBAAiB,cAAc,mBAAmB,SAAS,CAAC;CAGzE,IAAI,aAAa,uBAAuB,aAAa,wBACnD,OAAO,IAAI,cAAc,cAAc,qBAAqB,SAAS,CAAC;CAGxE,IAAI,aAAa,yBACf,OAAO,IAAI,iBACT,cAAc,8BACd,SACA,CACF;CAKF,IACE,YAAY,kCACZ,YAAY,yBACZ,YAAY,6BAEZ,OAAO,IAAI,iBACT,cAAc,uBACd,SACA,KACF;CAGF,IAAI,YAAY,iCACd,OAAO,IAAI,iBAAiB,cAAc,mBAAmB,SAAS,KAAK;CAG7E,IAAI,YAAY,qDACd,OAAO,IAAI,iBACT,cAAc,8BACd,SACA,KACF;CAGF,IAAI,iBAAiB,OAAO,GAC1B,OAAO,IAAI,iBACT,cAAc,mBACd,iGACA,KACF;CAGF,IAAI,aAAa,WACf,OAAO;CAGT,OAAO,IAAI,aAAa,WAAW,aAAa,cAAc,KAAK;AACrE"}
@@ -1 +1 @@
1
- {"version":3,"file":"callTronRpcsWithRetry.js","names":[],"sources":["../../../src/rpc/callTronRpcsWithRetry.ts"],"sourcesContent":["import { ChainId, LruMap, type SDKClient } from '@lifi/sdk'\nimport { TronWeb } from 'tronweb'\n\n/** @internal Exposed so unit tests can clear between cases (e.g. `tronWebCache.clear()`). */\nexport const tronWebCache: LruMap<TronWeb> = new LruMap<TronWeb>(12)\n\nexport async function callTronRpcsWithRetry<R>(\n client: SDKClient,\n fn: (tronWeb: TronWeb) => Promise<R>\n): Promise<R> {\n const urls = await client.getRpcUrlsByChainId(ChainId.TRN)\n\n if (!urls.length) {\n throw new Error('No Tron RPC URLs available')\n }\n\n const errors: Error[] = []\n for (const url of urls) {\n try {\n let tronWeb = tronWebCache.get(url)\n if (!tronWeb) {\n tronWeb = new TronWeb({ fullHost: url })\n tronWebCache.set(url, tronWeb)\n }\n return await fn(tronWeb)\n } catch (error) {\n errors.push(error instanceof Error ? error : new Error(String(error)))\n }\n }\n\n throw new AggregateError(errors, `All ${urls.length} Tron RPCs failed`)\n}\n"],"mappings":";;;;AAIA,MAAa,eAAgC,IAAI,OAAgB,GAAG;AAEpE,eAAsB,sBACpB,QACA,IACY;CACZ,MAAM,OAAO,MAAM,OAAO,oBAAoB,QAAQ,IAAI;CAE1D,IAAI,CAAC,KAAK,QACR,MAAM,IAAI,MAAM,6BAA6B;CAG/C,MAAM,SAAkB,EAAE;CAC1B,KAAK,MAAM,OAAO,MAChB,IAAI;EACF,IAAI,UAAU,aAAa,IAAI,IAAI;EACnC,IAAI,CAAC,SAAS;GACZ,UAAU,IAAI,QAAQ,EAAE,UAAU,KAAK,CAAC;GACxC,aAAa,IAAI,KAAK,QAAQ;;EAEhC,OAAO,MAAM,GAAG,QAAQ;UACjB,OAAO;EACd,OAAO,KAAK,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,MAAM,CAAC,CAAC;;CAI1E,MAAM,IAAI,eAAe,QAAQ,OAAO,KAAK,OAAO,mBAAmB"}
1
+ {"version":3,"file":"callTronRpcsWithRetry.js","names":[],"sources":["../../../src/rpc/callTronRpcsWithRetry.ts"],"sourcesContent":["import { ChainId, LruMap, type SDKClient } from '@lifi/sdk'\nimport { TronWeb } from 'tronweb'\n\n/** @internal Exposed so unit tests can clear between cases (e.g. `tronWebCache.clear()`). */\nexport const tronWebCache: LruMap<TronWeb> = new LruMap<TronWeb>(12)\n\nexport async function callTronRpcsWithRetry<R>(\n client: SDKClient,\n fn: (tronWeb: TronWeb) => Promise<R>\n): Promise<R> {\n const urls = await client.getRpcUrlsByChainId(ChainId.TRN)\n\n if (!urls.length) {\n throw new Error('No Tron RPC URLs available')\n }\n\n const errors: Error[] = []\n for (const url of urls) {\n try {\n let tronWeb = tronWebCache.get(url)\n if (!tronWeb) {\n tronWeb = new TronWeb({ fullHost: url })\n tronWebCache.set(url, tronWeb)\n }\n return await fn(tronWeb)\n } catch (error) {\n errors.push(error instanceof Error ? error : new Error(String(error)))\n }\n }\n\n throw new AggregateError(errors, `All ${urls.length} Tron RPCs failed`)\n}\n"],"mappings":";;;;AAIA,MAAa,eAAgC,IAAI,OAAgB,EAAE;AAEnE,eAAsB,sBACpB,QACA,IACY;CACZ,MAAM,OAAO,MAAM,OAAO,oBAAoB,QAAQ,GAAG;CAEzD,IAAI,CAAC,KAAK,QACR,MAAM,IAAI,MAAM,4BAA4B;CAG9C,MAAM,SAAkB,CAAC;CACzB,KAAK,MAAM,OAAO,MAChB,IAAI;EACF,IAAI,UAAU,aAAa,IAAI,GAAG;EAClC,IAAI,CAAC,SAAS;GACZ,UAAU,IAAI,QAAQ,EAAE,UAAU,IAAI,CAAC;GACvC,aAAa,IAAI,KAAK,OAAO;EAC/B;EACA,OAAO,MAAM,GAAG,OAAO;CACzB,SAAS,OAAO;EACd,OAAO,KAAK,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC,CAAC;CACvE;CAGF,MAAM,IAAI,eAAe,QAAQ,OAAO,KAAK,OAAO,kBAAkB;AACxE"}
@@ -1 +1 @@
1
- {"version":3,"file":"waitForTronTxConfirmation.js","names":[],"sources":["../../../src/rpc/waitForTronTxConfirmation.ts"],"sourcesContent":["import {\n LiFiErrorCode,\n type SDKClient,\n TransactionError,\n waitForResult,\n} from '@lifi/sdk'\nimport {\n TRON_POLL_INTERVAL_MS,\n TRON_POLL_MAX_ERROR_RETRIES,\n TRON_POLL_MAX_POLLS,\n} from '../core/constants.js'\nimport { callTronRpcsWithRetry } from './callTronRpcsWithRetry.js'\n\n/**\n * Polls getTransactionInfo until the transaction is indexed, then resolves.\n *\n * Throws `TransactionError(TransactionFailed)` immediately (no retry) when the\n * receipt indicates on-chain failure. Tolerates up to\n * `TRON_POLL_MAX_ERROR_RETRIES` transient RPC errors. Caps total polls at\n * `TRON_POLL_MAX_POLLS` to prevent hanging on stuck indexing — note that\n * `waitForResult`'s own maxRetries counts errors only, so an explicit poll\n * budget is enforced here.\n */\nexport async function waitForTronTxConfirmation(\n client: SDKClient,\n txHash: string,\n onChainFailureMessage = 'Transaction failed on-chain.'\n): Promise<void> {\n let polls = 0\n await waitForResult(\n async () => {\n if (++polls > TRON_POLL_MAX_POLLS) {\n throw new TransactionError(\n LiFiErrorCode.TransactionFailed,\n 'Transaction confirmation timeout.'\n )\n }\n const txInfo = await callTronRpcsWithRetry(client, (tronWeb) =>\n tronWeb.trx.getTransactionInfo(txHash)\n )\n if (txInfo?.id) {\n if (txInfo.receipt?.result === 'FAILED') {\n throw new TransactionError(\n LiFiErrorCode.TransactionFailed,\n onChainFailureMessage\n )\n }\n return txInfo\n }\n return undefined\n },\n TRON_POLL_INTERVAL_MS,\n TRON_POLL_MAX_ERROR_RETRIES,\n (_count, error) => !(error instanceof TransactionError)\n )\n}\n"],"mappings":";;;;;;;;;;;;;;AAuBA,eAAsB,0BACpB,QACA,QACA,wBAAwB,gCACT;CACf,IAAI,QAAQ;CACZ,MAAM,cACJ,YAAY;EACV,IAAI,EAAE,QAAA,IACJ,MAAM,IAAI,iBACR,cAAc,mBACd,oCACD;EAEH,MAAM,SAAS,MAAM,sBAAsB,SAAS,YAClD,QAAQ,IAAI,mBAAmB,OAAO,CACvC;EACD,IAAI,QAAQ,IAAI;GACd,IAAI,OAAO,SAAS,WAAW,UAC7B,MAAM,IAAI,iBACR,cAAc,mBACd,sBACD;GAEH,OAAO;;IAIX,uBAAA,IAEC,QAAQ,UAAU,EAAE,iBAAiB,kBACvC"}
1
+ {"version":3,"file":"waitForTronTxConfirmation.js","names":[],"sources":["../../../src/rpc/waitForTronTxConfirmation.ts"],"sourcesContent":["import {\n LiFiErrorCode,\n type SDKClient,\n TransactionError,\n waitForResult,\n} from '@lifi/sdk'\nimport {\n TRON_POLL_INTERVAL_MS,\n TRON_POLL_MAX_ERROR_RETRIES,\n TRON_POLL_MAX_POLLS,\n} from '../core/constants.js'\nimport { callTronRpcsWithRetry } from './callTronRpcsWithRetry.js'\n\n/**\n * Polls getTransactionInfo until the transaction is indexed, then resolves.\n *\n * Throws `TransactionError(TransactionFailed)` immediately (no retry) when the\n * receipt indicates on-chain failure. Tolerates up to\n * `TRON_POLL_MAX_ERROR_RETRIES` transient RPC errors. Caps total polls at\n * `TRON_POLL_MAX_POLLS` to prevent hanging on stuck indexing — note that\n * `waitForResult`'s own maxRetries counts errors only, so an explicit poll\n * budget is enforced here.\n */\nexport async function waitForTronTxConfirmation(\n client: SDKClient,\n txHash: string,\n onChainFailureMessage = 'Transaction failed on-chain.'\n): Promise<void> {\n let polls = 0\n await waitForResult(\n async () => {\n if (++polls > TRON_POLL_MAX_POLLS) {\n throw new TransactionError(\n LiFiErrorCode.TransactionFailed,\n 'Transaction confirmation timeout.'\n )\n }\n const txInfo = await callTronRpcsWithRetry(client, (tronWeb) =>\n tronWeb.trx.getTransactionInfo(txHash)\n )\n if (txInfo?.id) {\n if (txInfo.receipt?.result === 'FAILED') {\n throw new TransactionError(\n LiFiErrorCode.TransactionFailed,\n onChainFailureMessage\n )\n }\n return txInfo\n }\n return undefined\n },\n TRON_POLL_INTERVAL_MS,\n TRON_POLL_MAX_ERROR_RETRIES,\n (_count, error) => !(error instanceof TransactionError)\n )\n}\n"],"mappings":";;;;;;;;;;;;;;AAuBA,eAAsB,0BACpB,QACA,QACA,wBAAwB,gCACT;CACf,IAAI,QAAQ;CACZ,MAAM,cACJ,YAAY;EACV,IAAI,EAAE,QAAA,IACJ,MAAM,IAAI,iBACR,cAAc,mBACd,mCACF;EAEF,MAAM,SAAS,MAAM,sBAAsB,SAAS,YAClD,QAAQ,IAAI,mBAAmB,MAAM,CACvC;EACA,IAAI,QAAQ,IAAI;GACd,IAAI,OAAO,SAAS,WAAW,UAC7B,MAAM,IAAI,iBACR,cAAc,mBACd,qBACF;GAEF,OAAO;EACT;CAEF,GACA,uBAAA,IAEC,QAAQ,UAAU,EAAE,iBAAiB,iBACxC;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","names":[],"sources":["../../src/types.ts"],"sourcesContent":["import {\n ChainType,\n type LiFiStepExtended,\n type SDKProvider,\n type StepExecutorContext,\n type StepExecutorOptions,\n} from '@lifi/sdk'\nimport type {\n Adapter,\n SignedTransaction,\n} from '@tronweb3/tronwallet-abstract-adapter'\n\nexport interface TronProviderOptions {\n getWallet?: () => Promise<Adapter>\n multicallBatchSize?: number\n}\n\nexport interface TronTaskContext {\n signedTransaction?: SignedTransaction\n hasSufficientAllowance?: boolean\n}\n\nexport interface TronStepExecutorContext\n extends StepExecutorContext,\n TronTaskContext {\n wallet: Adapter\n checkWallet: (step: LiFiStepExtended) => void\n}\n\nexport interface TronSDKProvider extends SDKProvider {\n setOptions(options: TronProviderOptions): void\n}\n\nexport function isTronProvider(\n provider: SDKProvider\n): provider is TronSDKProvider {\n return provider.type === ChainType.TVM\n}\n\nexport interface TronStepExecutorOptions extends StepExecutorOptions {\n wallet: Adapter\n}\n"],"mappings":";;AAiCA,SAAgB,eACd,UAC6B;CAC7B,OAAO,SAAS,SAAS,UAAU"}
1
+ {"version":3,"file":"types.js","names":[],"sources":["../../src/types.ts"],"sourcesContent":["import {\n ChainType,\n type LiFiStepExtended,\n type SDKProvider,\n type StepExecutorContext,\n type StepExecutorOptions,\n} from '@lifi/sdk'\nimport type {\n Adapter,\n SignedTransaction,\n} from '@tronweb3/tronwallet-abstract-adapter'\n\nexport interface TronProviderOptions {\n getWallet?: () => Promise<Adapter>\n multicallBatchSize?: number\n}\n\nexport interface TronTaskContext {\n signedTransaction?: SignedTransaction\n hasSufficientAllowance?: boolean\n}\n\nexport interface TronStepExecutorContext\n extends StepExecutorContext,\n TronTaskContext {\n wallet: Adapter\n checkWallet: (step: LiFiStepExtended) => void\n}\n\nexport interface TronSDKProvider extends SDKProvider {\n setOptions(options: TronProviderOptions): void\n}\n\nexport function isTronProvider(\n provider: SDKProvider\n): provider is TronSDKProvider {\n return provider.type === ChainType.TVM\n}\n\nexport interface TronStepExecutorOptions extends StepExecutorOptions {\n wallet: Adapter\n}\n"],"mappings":";;AAiCA,SAAgB,eACd,UAC6B;CAC7B,OAAO,SAAS,SAAS,UAAU;AACrC"}
@@ -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;CAC9C,IAAI,CAAC,IAAI,WAAW,KAAK,EACvB,MAAM,IAAI,MAAM,uCAAuC,MAAM;CAE/D,OAAO,KAAK,IAAI,MAAM,EAAE;;AAG1B,SAAgB,sBACd,UACA,SACQ;CAGR,OAAO,KAAK,WADC,QAAQ,QAAQ,OAAO,GAAG,CAAC,SAAS,IAAI,IAC1B"}
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,WAAW;CAC7C,IAAI,CAAC,IAAI,WAAW,IAAI,GACtB,MAAM,IAAI,MAAM,uCAAuC,KAAK;CAE9D,OAAO,KAAK,IAAI,MAAM,CAAC;AACzB;AAEA,SAAgB,sBACd,UACA,SACQ;CAGR,OAAO,KAAK,WADC,QAAQ,QAAQ,OAAO,EAAE,EAAE,SAAS,IAAI,GAC3B;AAC5B"}
@@ -1 +1 @@
1
- {"version":3,"file":"getTronTxLink.js","names":[],"sources":["../../../src/utils/getTronTxLink.ts"],"sourcesContent":["import type { ExtendedChain } from '@lifi/sdk'\n\nexport const getTronTxLink = (\n chain: ExtendedChain,\n txHash: string\n): string | undefined => {\n const explorerUrl = chain.metamask.blockExplorerUrls[0]\n if (!explorerUrl) {\n return undefined\n }\n const base = explorerUrl.endsWith('/')\n ? explorerUrl.slice(0, -1)\n : explorerUrl\n return `${base}#/transaction/${txHash}`\n}\n"],"mappings":";AAEA,MAAa,iBACX,OACA,WACuB;CACvB,MAAM,cAAc,MAAM,SAAS,kBAAkB;CACrD,IAAI,CAAC,aACH;CAKF,OAAO,GAHM,YAAY,SAAS,IAAI,GAClC,YAAY,MAAM,GAAG,GAAG,GACxB,YACW,gBAAgB"}
1
+ {"version":3,"file":"getTronTxLink.js","names":[],"sources":["../../../src/utils/getTronTxLink.ts"],"sourcesContent":["import type { ExtendedChain } from '@lifi/sdk'\n\nexport const getTronTxLink = (\n chain: ExtendedChain,\n txHash: string\n): string | undefined => {\n const explorerUrl = chain.metamask.blockExplorerUrls[0]\n if (!explorerUrl) {\n return undefined\n }\n const base = explorerUrl.endsWith('/')\n ? explorerUrl.slice(0, -1)\n : explorerUrl\n return `${base}#/transaction/${txHash}`\n}\n"],"mappings":";AAEA,MAAa,iBACX,OACA,WACuB;CACvB,MAAM,cAAc,MAAM,SAAS,kBAAkB;CACrD,IAAI,CAAC,aACH;CAKF,OAAO,GAHM,YAAY,SAAS,GAAG,IACjC,YAAY,MAAM,GAAG,EAAE,IACvB,YACW,gBAAgB;AACjC"}
@@ -1 +1 @@
1
- {"version":3,"file":"multicall3Abi.js","names":[],"sources":["../../../src/utils/multicall3Abi.ts"],"sourcesContent":["import type { Types } from 'tronweb'\n\nexport const multicall3Abi: Types.ContractAbiInterface = [\n {\n inputs: [\n {\n components: [\n { internalType: 'address', name: 'target', type: 'address' },\n { internalType: 'bool', name: 'allowFailure', type: 'bool' },\n { internalType: 'bytes', name: 'callData', type: 'bytes' },\n ],\n internalType: 'struct Multicall3.Call3[]',\n name: 'calls',\n type: 'tuple[]',\n },\n ],\n name: 'aggregate3',\n outputs: [\n {\n components: [\n { internalType: 'bool', name: 'success', type: 'bool' },\n { internalType: 'bytes', name: 'returnData', type: 'bytes' },\n ],\n internalType: 'struct Multicall3.Result[]',\n name: 'returnData',\n type: 'tuple[]',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [{ internalType: 'address', name: 'addr', type: 'address' }],\n name: 'getEthBalance',\n outputs: [{ internalType: 'uint256', name: 'balance', type: 'uint256' }],\n stateMutability: 'view',\n type: 'function',\n },\n]\n"],"mappings":";AAEA,MAAa,gBAA4C,CACvD;CACE,QAAQ,CACN;EACE,YAAY;GACV;IAAE,cAAc;IAAW,MAAM;IAAU,MAAM;IAAW;GAC5D;IAAE,cAAc;IAAQ,MAAM;IAAgB,MAAM;IAAQ;GAC5D;IAAE,cAAc;IAAS,MAAM;IAAY,MAAM;IAAS;GAC3D;EACD,cAAc;EACd,MAAM;EACN,MAAM;EACP,CACF;CACD,MAAM;CACN,SAAS,CACP;EACE,YAAY,CACV;GAAE,cAAc;GAAQ,MAAM;GAAW,MAAM;GAAQ,EACvD;GAAE,cAAc;GAAS,MAAM;GAAc,MAAM;GAAS,CAC7D;EACD,cAAc;EACd,MAAM;EACN,MAAM;EACP,CACF;CACD,iBAAiB;CACjB,MAAM;CACP,EACD;CACE,QAAQ,CAAC;EAAE,cAAc;EAAW,MAAM;EAAQ,MAAM;EAAW,CAAC;CACpE,MAAM;CACN,SAAS,CAAC;EAAE,cAAc;EAAW,MAAM;EAAW,MAAM;EAAW,CAAC;CACxE,iBAAiB;CACjB,MAAM;CACP,CACF"}
1
+ {"version":3,"file":"multicall3Abi.js","names":[],"sources":["../../../src/utils/multicall3Abi.ts"],"sourcesContent":["import type { Types } from 'tronweb'\n\nexport const multicall3Abi: Types.ContractAbiInterface = [\n {\n inputs: [\n {\n components: [\n { internalType: 'address', name: 'target', type: 'address' },\n { internalType: 'bool', name: 'allowFailure', type: 'bool' },\n { internalType: 'bytes', name: 'callData', type: 'bytes' },\n ],\n internalType: 'struct Multicall3.Call3[]',\n name: 'calls',\n type: 'tuple[]',\n },\n ],\n name: 'aggregate3',\n outputs: [\n {\n components: [\n { internalType: 'bool', name: 'success', type: 'bool' },\n { internalType: 'bytes', name: 'returnData', type: 'bytes' },\n ],\n internalType: 'struct Multicall3.Result[]',\n name: 'returnData',\n type: 'tuple[]',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [{ internalType: 'address', name: 'addr', type: 'address' }],\n name: 'getEthBalance',\n outputs: [{ internalType: 'uint256', name: 'balance', type: 'uint256' }],\n stateMutability: 'view',\n type: 'function',\n },\n]\n"],"mappings":";AAEA,MAAa,gBAA4C,CACvD;CACE,QAAQ,CACN;EACE,YAAY;GACV;IAAE,cAAc;IAAW,MAAM;IAAU,MAAM;GAAU;GAC3D;IAAE,cAAc;IAAQ,MAAM;IAAgB,MAAM;GAAO;GAC3D;IAAE,cAAc;IAAS,MAAM;IAAY,MAAM;GAAQ;EAC3D;EACA,cAAc;EACd,MAAM;EACN,MAAM;CACR,CACF;CACA,MAAM;CACN,SAAS,CACP;EACE,YAAY,CACV;GAAE,cAAc;GAAQ,MAAM;GAAW,MAAM;EAAO,GACtD;GAAE,cAAc;GAAS,MAAM;GAAc,MAAM;EAAQ,CAC7D;EACA,cAAc;EACd,MAAM;EACN,MAAM;CACR,CACF;CACA,iBAAiB;CACjB,MAAM;AACR,GACA;CACE,QAAQ,CAAC;EAAE,cAAc;EAAW,MAAM;EAAQ,MAAM;CAAU,CAAC;CACnE,MAAM;CACN,SAAS,CAAC;EAAE,cAAc;EAAW,MAAM;EAAW,MAAM;CAAU,CAAC;CACvE,iBAAiB;CACjB,MAAM;AACR,CACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"stripHexPrefix.js","names":[],"sources":["../../../src/utils/stripHexPrefix.ts"],"sourcesContent":["export const stripHexPrefix = (value: string): string =>\n value.replace(/^0x/, '')\n"],"mappings":";AAAA,MAAa,kBAAkB,UAC7B,MAAM,QAAQ,OAAO,GAAG"}
1
+ {"version":3,"file":"stripHexPrefix.js","names":[],"sources":["../../../src/utils/stripHexPrefix.ts"],"sourcesContent":["export const stripHexPrefix = (value: string): string =>\n value.replace(/^0x/, '')\n"],"mappings":";AAAA,MAAa,kBAAkB,UAC7B,MAAM,QAAQ,OAAO,EAAE"}
@@ -1,6 +1,6 @@
1
1
  //#region src/version.d.ts
2
2
  declare const name = "@lifi/sdk-provider-tron";
3
- declare const version = "4.0.0-beta.10";
3
+ declare const version = "4.0.0-beta.11";
4
4
  //#endregion
5
5
  export { name, version };
6
6
  //# sourceMappingURL=version.d.ts.map
@@ -1,6 +1,6 @@
1
1
  //#region src/version.ts
2
2
  const name = "@lifi/sdk-provider-tron";
3
- const version = "4.0.0-beta.10";
3
+ const version = "4.0.0-beta.11";
4
4
  //#endregion
5
5
  export { name, version };
6
6
 
@@ -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.10'\n"],"mappings":";AAAA,MAAa,OAAO;AACpB,MAAa,UAAU"}
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.11'\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.10",
3
+ "version": "4.0.0-beta.11",
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": {
@@ -30,7 +30,7 @@
30
30
  "dependencies": {
31
31
  "@tronweb3/tronwallet-abstract-adapter": "^1.1.13",
32
32
  "tronweb": "^6.3.0",
33
- "@lifi/sdk": "4.0.0-beta.10"
33
+ "@lifi/sdk": "4.0.0-beta.11"
34
34
  },
35
35
  "publishConfig": {
36
36
  "access": "public"
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.10'
2
+ export const version = '4.0.0-beta.11'