@lifi/sdk 3.3.0-alpha.3 → 3.3.0-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/package.json +5 -8
- package/src/_cjs/config.js +4 -1
- package/src/_cjs/config.js.map +1 -1
- package/src/_cjs/core/EVM/EVM.js +1 -1
- package/src/_cjs/core/EVM/EVMStepExecutor.js +19 -7
- package/src/_cjs/core/EVM/EVMStepExecutor.js.map +1 -1
- package/src/_cjs/core/EVM/checkAllowance.js +5 -1
- package/src/_cjs/core/EVM/checkAllowance.js.map +1 -1
- package/src/_cjs/core/EVM/getAllowance.js +3 -3
- package/src/_cjs/core/EVM/getAllowance.js.map +1 -1
- package/src/_cjs/core/EVM/getEVMBalance.js +4 -6
- package/src/_cjs/core/EVM/getEVMBalance.js.map +1 -1
- package/src/_cjs/core/EVM/parseEVMErrors.js +3 -3
- package/src/_cjs/core/EVM/parseEVMErrors.js.map +1 -1
- package/src/_cjs/core/EVM/switchChain.js +5 -1
- package/src/_cjs/core/EVM/switchChain.js.map +1 -1
- package/src/_cjs/core/EVM/utils.js +4 -1
- package/src/_cjs/core/EVM/utils.js.map +1 -1
- package/src/_cjs/core/EVM/waitForTransactionReceipt.js +5 -4
- package/src/_cjs/core/EVM/waitForTransactionReceipt.js.map +1 -1
- package/src/_cjs/core/Solana/Solana.js +1 -1
- package/src/_cjs/core/Solana/SolanaStepExecutor.js +14 -6
- package/src/_cjs/core/Solana/SolanaStepExecutor.js.map +1 -1
- package/src/_cjs/core/Solana/connection.js +1 -3
- package/src/_cjs/core/Solana/connection.js.map +1 -1
- package/src/_cjs/core/Solana/getSolanaBalance.js +3 -3
- package/src/_cjs/core/Solana/getSolanaBalance.js.map +1 -1
- package/src/_cjs/core/Solana/isSVMAddress.js +1 -1
- package/src/_cjs/core/Solana/isSVMAddress.js.map +1 -1
- package/src/_cjs/core/Solana/parseSolanaErrors.js +1 -1
- package/src/_cjs/core/Solana/parseSolanaErrors.js.map +1 -1
- package/src/_cjs/core/StatusManager.js +4 -3
- package/src/_cjs/core/StatusManager.js.map +1 -1
- package/src/_cjs/core/UTXO/UTXO.js +1 -1
- package/src/_cjs/core/UTXO/UTXOStepExecutor.js +43 -21
- package/src/_cjs/core/UTXO/UTXOStepExecutor.js.map +1 -1
- package/src/_cjs/core/UTXO/getUTXOBalance.js +3 -3
- package/src/_cjs/core/UTXO/getUTXOBalance.js.map +1 -1
- package/src/_cjs/core/UTXO/getUTXOPublicClient.js +1 -0
- package/src/_cjs/core/UTXO/getUTXOPublicClient.js.map +1 -1
- package/src/_cjs/core/UTXO/isUTXOAddress.js +7 -7
- package/src/_cjs/core/UTXO/isUTXOAddress.js.map +1 -1
- package/src/_cjs/core/UTXO/parseUTXOErrors.js +5 -1
- package/src/_cjs/core/UTXO/parseUTXOErrors.js.map +1 -1
- package/src/_cjs/core/UTXO/utxo-stack/actions/getBlock.js +31 -0
- package/src/_cjs/core/UTXO/utxo-stack/actions/getBlock.js.map +1 -0
- package/src/_cjs/core/UTXO/utxo-stack/actions/getBlockStats.js +27 -0
- package/src/_cjs/core/UTXO/utxo-stack/actions/getBlockStats.js.map +1 -0
- package/src/_cjs/core/UTXO/utxo-stack/actions/getUTXOTransaction.js +18 -9
- package/src/_cjs/core/UTXO/utxo-stack/actions/getUTXOTransaction.js.map +1 -1
- package/src/_cjs/core/UTXO/utxo-stack/actions/waitForTransaction.js +185 -0
- package/src/_cjs/core/UTXO/utxo-stack/actions/waitForTransaction.js.map +1 -0
- package/src/_cjs/core/UTXO/utxo-stack/actions/watchBlockNumber.js +45 -0
- package/src/_cjs/core/UTXO/utxo-stack/actions/watchBlockNumber.js.map +1 -0
- package/src/_cjs/core/UTXO/utxo-stack/decorators/UTXOAPIActions.js.map +1 -1
- package/src/_cjs/core/UTXO/utxo-stack/types/blockStats.js +3 -0
- package/src/_cjs/core/UTXO/utxo-stack/types/blockStats.js.map +1 -0
- package/src/_cjs/core/UTXO/utxo-stack/utils/cancelTransaction.js +51 -0
- package/src/_cjs/core/UTXO/utxo-stack/utils/cancelTransaction.js.map +1 -0
- package/src/_cjs/core/UTXO/utxo-stack/utils/modifyFee.js +50 -0
- package/src/_cjs/core/UTXO/utxo-stack/utils/modifyFee.js.map +1 -0
- package/src/_cjs/core/UTXO/utxo-stack/utils/observe.js +48 -0
- package/src/_cjs/core/UTXO/utxo-stack/utils/observe.js.map +1 -0
- package/src/_cjs/core/UTXO/utxo-stack/utils/poll.js +30 -0
- package/src/_cjs/core/UTXO/utxo-stack/utils/poll.js.map +1 -0
- package/src/_cjs/core/checkBalance.js +2 -7
- package/src/_cjs/core/checkBalance.js.map +1 -1
- package/src/_cjs/core/execution.js.map +1 -1
- package/src/_cjs/core/stepComparison.js +1 -1
- package/src/_cjs/core/waitForReceivingTransaction.js +36 -41
- package/src/_cjs/core/waitForReceivingTransaction.js.map +1 -1
- package/src/_cjs/createConfig.js.map +1 -1
- package/src/_cjs/errors/baseError.js +1 -1
- package/src/_cjs/errors/baseError.js.map +1 -1
- package/src/_cjs/errors/constants.js +1 -0
- package/src/_cjs/errors/constants.js.map +1 -1
- package/src/_cjs/errors/errors.js +1 -1
- package/src/_cjs/errors/errors.js.map +1 -1
- package/src/_cjs/errors/httpError.js +1 -1
- package/src/_cjs/errors/httpError.js.map +1 -1
- package/src/_cjs/helpers.js +3 -3
- package/src/_cjs/helpers.js.map +1 -1
- package/src/_cjs/index.js +67 -11
- package/src/_cjs/index.js.map +1 -1
- package/src/_cjs/request.js +1 -1
- package/src/_cjs/request.js.map +1 -1
- package/src/_cjs/services/api.js +30 -18
- package/src/_cjs/services/api.js.map +1 -1
- package/src/_cjs/services/balance.js +11 -4
- package/src/_cjs/services/balance.js.map +1 -1
- package/src/_cjs/utils/getTransactionMessage.js +3 -4
- package/src/_cjs/utils/getTransactionMessage.js.map +1 -1
- package/src/_cjs/utils/withDedupe.js.map +1 -1
- package/src/_cjs/version.js +1 -1
- package/src/_cjs/version.js.map +1 -1
- package/src/_esm/config.js +4 -1
- package/src/_esm/config.js.map +1 -1
- package/src/_esm/core/EVM/EVM.js +1 -1
- package/src/_esm/core/EVM/EVMStepExecutor.js +18 -6
- package/src/_esm/core/EVM/EVMStepExecutor.js.map +1 -1
- package/src/_esm/core/EVM/checkAllowance.js +5 -1
- package/src/_esm/core/EVM/checkAllowance.js.map +1 -1
- package/src/_esm/core/EVM/getAllowance.js +3 -3
- package/src/_esm/core/EVM/getAllowance.js.map +1 -1
- package/src/_esm/core/EVM/getEVMBalance.js +4 -6
- package/src/_esm/core/EVM/getEVMBalance.js.map +1 -1
- package/src/_esm/core/EVM/parseEVMErrors.js +2 -3
- package/src/_esm/core/EVM/parseEVMErrors.js.map +1 -1
- package/src/_esm/core/EVM/publicClient.js +1 -1
- package/src/_esm/core/EVM/publicClient.js.map +1 -1
- package/src/_esm/core/EVM/switchChain.js +5 -1
- package/src/_esm/core/EVM/switchChain.js.map +1 -1
- package/src/_esm/core/EVM/types.js +0 -1
- package/src/_esm/core/EVM/types.js.map +1 -1
- package/src/_esm/core/EVM/utils.js +4 -2
- package/src/_esm/core/EVM/utils.js.map +1 -1
- package/src/_esm/core/EVM/waitForTransactionReceipt.js +3 -2
- package/src/_esm/core/EVM/waitForTransactionReceipt.js.map +1 -1
- package/src/_esm/core/Solana/Solana.js +1 -1
- package/src/_esm/core/Solana/SolanaStepExecutor.js +13 -6
- package/src/_esm/core/Solana/SolanaStepExecutor.js.map +1 -1
- package/src/_esm/core/Solana/connection.js +1 -3
- package/src/_esm/core/Solana/connection.js.map +1 -1
- package/src/_esm/core/Solana/getSolanaBalance.js +3 -3
- package/src/_esm/core/Solana/getSolanaBalance.js.map +1 -1
- package/src/_esm/core/Solana/isSVMAddress.js +1 -1
- package/src/_esm/core/Solana/isSVMAddress.js.map +1 -1
- package/src/_esm/core/Solana/parseSolanaErrors.js +1 -1
- package/src/_esm/core/Solana/parseSolanaErrors.js.map +1 -1
- package/src/_esm/core/Solana/types.js +0 -1
- package/src/_esm/core/Solana/types.js.map +1 -1
- package/src/_esm/core/StatusManager.js +13 -6
- package/src/_esm/core/StatusManager.js.map +1 -1
- package/src/_esm/core/UTXO/UTXO.js +1 -1
- package/src/_esm/core/UTXO/UTXOStepExecutor.js +44 -38
- package/src/_esm/core/UTXO/UTXOStepExecutor.js.map +1 -1
- package/src/_esm/core/UTXO/getUTXOAPIPublicClient.js.map +1 -1
- package/src/_esm/core/UTXO/getUTXOBalance.js +3 -3
- package/src/_esm/core/UTXO/getUTXOBalance.js.map +1 -1
- package/src/_esm/core/UTXO/getUTXOPublicClient.js +2 -1
- package/src/_esm/core/UTXO/getUTXOPublicClient.js.map +1 -1
- package/src/_esm/core/UTXO/isUTXOAddress.js +7 -7
- package/src/_esm/core/UTXO/isUTXOAddress.js.map +1 -1
- package/src/_esm/core/UTXO/parseUTXOErrors.js +6 -1
- package/src/_esm/core/UTXO/parseUTXOErrors.js.map +1 -1
- package/src/_esm/core/UTXO/types.js +0 -1
- package/src/_esm/core/UTXO/types.js.map +1 -1
- package/src/_esm/core/UTXO/utxo-stack/actions/getBalance.js +0 -1
- package/src/_esm/core/UTXO/utxo-stack/actions/getBalance.js.map +1 -1
- package/src/_esm/core/UTXO/utxo-stack/actions/getBlock.js +28 -0
- package/src/_esm/core/UTXO/utxo-stack/actions/getBlock.js.map +1 -0
- package/src/_esm/core/UTXO/utxo-stack/actions/getBlockCount.js +0 -1
- package/src/_esm/core/UTXO/utxo-stack/actions/getBlockCount.js.map +1 -1
- package/src/_esm/core/UTXO/utxo-stack/actions/getBlockStats.js +24 -0
- package/src/_esm/core/UTXO/utxo-stack/actions/getBlockStats.js.map +1 -0
- package/src/_esm/core/UTXO/utxo-stack/actions/getUTXOTransaction.js +18 -10
- package/src/_esm/core/UTXO/utxo-stack/actions/getUTXOTransaction.js.map +1 -1
- package/src/_esm/core/UTXO/utxo-stack/actions/sendUTXOTransaction.js +0 -1
- package/src/_esm/core/UTXO/utxo-stack/actions/sendUTXOTransaction.js.map +1 -1
- package/src/_esm/core/UTXO/utxo-stack/actions/signPsbt.js +0 -1
- package/src/_esm/core/UTXO/utxo-stack/actions/signPsbt.js.map +1 -1
- package/src/_esm/core/UTXO/utxo-stack/actions/waitForTransaction.js +230 -0
- package/src/_esm/core/UTXO/utxo-stack/actions/waitForTransaction.js.map +1 -0
- package/src/_esm/core/UTXO/utxo-stack/actions/watchBlockNumber.js +58 -0
- package/src/_esm/core/UTXO/utxo-stack/actions/watchBlockNumber.js.map +1 -0
- package/src/_esm/core/UTXO/utxo-stack/decorators/UTXOAPIActions.js.map +1 -1
- package/src/_esm/core/UTXO/utxo-stack/decorators/UTXOActions.js.map +1 -1
- package/src/_esm/core/UTXO/utxo-stack/transports/utxo/getHttpRpcClient.js +1 -1
- package/src/_esm/core/UTXO/utxo-stack/transports/utxo/getHttpRpcClient.js.map +1 -1
- package/src/_esm/core/UTXO/utxo-stack/transports/utxo/utxo.js +1 -1
- package/src/_esm/core/UTXO/utxo-stack/transports/utxo/utxo.js.map +1 -1
- package/src/_esm/core/UTXO/utxo-stack/types/blockStats.js +2 -0
- package/src/_esm/core/UTXO/utxo-stack/types/blockStats.js.map +1 -0
- package/src/_esm/core/UTXO/utxo-stack/utils/cancelTransaction.js +55 -0
- package/src/_esm/core/UTXO/utxo-stack/utils/cancelTransaction.js.map +1 -0
- package/src/_esm/core/UTXO/utxo-stack/utils/modifyFee.js +53 -0
- package/src/_esm/core/UTXO/utxo-stack/utils/modifyFee.js.map +1 -0
- package/src/_esm/core/UTXO/utxo-stack/utils/observe.js +51 -0
- package/src/_esm/core/UTXO/utxo-stack/utils/observe.js.map +1 -0
- package/src/_esm/core/UTXO/utxo-stack/utils/poll.js +30 -0
- package/src/_esm/core/UTXO/utxo-stack/utils/poll.js.map +1 -0
- package/src/_esm/core/checkBalance.js +2 -7
- package/src/_esm/core/checkBalance.js.map +1 -1
- package/src/_esm/core/execution.js.map +1 -1
- package/src/_esm/core/processMessages.js +0 -1
- package/src/_esm/core/processMessages.js.map +1 -1
- package/src/_esm/core/rpc.js +0 -1
- package/src/_esm/core/rpc.js.map +1 -1
- package/src/_esm/core/stepComparison.js +1 -1
- package/src/_esm/core/utils.js +0 -1
- package/src/_esm/core/utils.js.map +1 -1
- package/src/_esm/core/waitForReceivingTransaction.js +36 -41
- package/src/_esm/core/waitForReceivingTransaction.js.map +1 -1
- package/src/_esm/createConfig.js +0 -1
- package/src/_esm/createConfig.js.map +1 -1
- package/src/_esm/errors/SDKError.js +0 -1
- package/src/_esm/errors/SDKError.js.map +1 -1
- package/src/_esm/errors/baseError.js +2 -2
- package/src/_esm/errors/baseError.js.map +1 -1
- package/src/_esm/errors/constants.js +1 -0
- package/src/_esm/errors/constants.js.map +1 -1
- package/src/_esm/errors/errors.js +1 -1
- package/src/_esm/errors/errors.js.map +1 -1
- package/src/_esm/errors/httpError.js +2 -2
- package/src/_esm/errors/httpError.js.map +1 -1
- package/src/_esm/helpers.js +4 -6
- package/src/_esm/helpers.js.map +1 -1
- package/src/_esm/index.js +13 -9
- package/src/_esm/index.js.map +1 -1
- package/src/_esm/request.js +1 -1
- package/src/_esm/request.js.map +1 -1
- package/src/_esm/services/api.js +30 -19
- package/src/_esm/services/api.js.map +1 -1
- package/src/_esm/services/balance.js +11 -4
- package/src/_esm/services/balance.js.map +1 -1
- package/src/_esm/utils/getTransactionMessage.js +3 -4
- package/src/_esm/utils/getTransactionMessage.js.map +1 -1
- package/src/_esm/utils/withDedupe.js +0 -1
- package/src/_esm/utils/withDedupe.js.map +1 -1
- package/src/_esm/version.js +1 -1
- package/src/_esm/version.js.map +1 -1
- package/src/_types/config.d.ts.map +1 -1
- package/src/_types/core/EVM/EVMStepExecutor.d.ts.map +1 -1
- package/src/_types/core/EVM/checkAllowance.d.ts.map +1 -1
- package/src/_types/core/EVM/getEVMBalance.d.ts.map +1 -1
- package/src/_types/core/EVM/parseEVMErrors.d.ts +1 -1
- package/src/_types/core/EVM/parseEVMErrors.d.ts.map +1 -1
- package/src/_types/core/EVM/types.d.ts +1 -1
- package/src/_types/core/EVM/types.d.ts.map +1 -1
- package/src/_types/core/EVM/utils.d.ts +1 -1
- package/src/_types/core/EVM/utils.d.ts.map +1 -1
- package/src/_types/core/EVM/waitForTransactionReceipt.d.ts.map +1 -1
- package/src/_types/core/Solana/SolanaStepExecutor.d.ts +1 -1
- package/src/_types/core/Solana/SolanaStepExecutor.d.ts.map +1 -1
- package/src/_types/core/Solana/connection.d.ts.map +1 -1
- package/src/_types/core/Solana/parseSolanaErrors.d.ts.map +1 -1
- package/src/_types/core/Solana/types.d.ts +1 -1
- package/src/_types/core/Solana/types.d.ts.map +1 -1
- package/src/_types/core/StatusManager.d.ts +18 -8
- package/src/_types/core/StatusManager.d.ts.map +1 -1
- package/src/_types/core/UTXO/UTXOStepExecutor.d.ts.map +1 -1
- package/src/_types/core/UTXO/getUTXOAPIPublicClient.d.ts.map +1 -1
- package/src/_types/core/UTXO/getUTXOBalance.d.ts.map +1 -1
- package/src/_types/core/UTXO/getUTXOPublicClient.d.ts.map +1 -1
- package/src/_types/core/UTXO/isUTXOAddress.d.ts.map +1 -1
- package/src/_types/core/UTXO/parseUTXOErrors.d.ts.map +1 -1
- package/src/_types/core/UTXO/types.d.ts +1 -1
- package/src/_types/core/UTXO/types.d.ts.map +1 -1
- package/src/_types/core/UTXO/utxo-stack/actions/getBalance.d.ts +1 -1
- package/src/_types/core/UTXO/utxo-stack/actions/getBalance.d.ts.map +1 -1
- package/src/_types/core/UTXO/utxo-stack/actions/getBlock.d.ts +13 -0
- package/src/_types/core/UTXO/utxo-stack/actions/getBlock.d.ts.map +1 -0
- package/src/_types/core/UTXO/utxo-stack/actions/getBlockCount.d.ts +1 -1
- package/src/_types/core/UTXO/utxo-stack/actions/getBlockCount.d.ts.map +1 -1
- package/src/_types/core/UTXO/utxo-stack/actions/getBlockStats.d.ts +15 -0
- package/src/_types/core/UTXO/utxo-stack/actions/getBlockStats.d.ts.map +1 -0
- package/src/_types/core/UTXO/utxo-stack/actions/getUTXOTransaction.d.ts +2 -2
- package/src/_types/core/UTXO/utxo-stack/actions/getUTXOTransaction.d.ts.map +1 -1
- package/src/_types/core/UTXO/utxo-stack/actions/sendUTXOTransaction.d.ts +2 -2
- package/src/_types/core/UTXO/utxo-stack/actions/sendUTXOTransaction.d.ts.map +1 -1
- package/src/_types/core/UTXO/utxo-stack/actions/signPsbt.d.ts +1 -1
- package/src/_types/core/UTXO/utxo-stack/actions/signPsbt.d.ts.map +1 -1
- package/src/_types/core/UTXO/utxo-stack/actions/waitForTransaction.d.ts +76 -0
- package/src/_types/core/UTXO/utxo-stack/actions/waitForTransaction.d.ts.map +1 -0
- package/src/_types/core/UTXO/utxo-stack/actions/watchBlockNumber.d.ts +26 -0
- package/src/_types/core/UTXO/utxo-stack/actions/watchBlockNumber.d.ts.map +1 -0
- package/src/_types/core/UTXO/utxo-stack/decorators/UTXOAPIActions.d.ts.map +1 -1
- package/src/_types/core/UTXO/utxo-stack/decorators/UTXOActions.d.ts.map +1 -1
- package/src/_types/core/UTXO/utxo-stack/transports/utxo/types.d.ts +16 -0
- package/src/_types/core/UTXO/utxo-stack/transports/utxo/types.d.ts.map +1 -1
- package/src/_types/core/UTXO/utxo-stack/transports/utxo/utxo.d.ts.map +1 -1
- package/src/_types/core/UTXO/utxo-stack/types/blockStats.d.ts +35 -0
- package/src/_types/core/UTXO/utxo-stack/types/blockStats.d.ts.map +1 -0
- package/src/_types/core/UTXO/utxo-stack/utils/cancelTransaction.d.ts +3 -0
- package/src/_types/core/UTXO/utxo-stack/utils/cancelTransaction.d.ts.map +1 -0
- package/src/_types/core/UTXO/utxo-stack/utils/modifyFee.d.ts +3 -0
- package/src/_types/core/UTXO/utxo-stack/utils/modifyFee.d.ts.map +1 -0
- package/src/_types/core/UTXO/utxo-stack/utils/observe.d.ts +19 -0
- package/src/_types/core/UTXO/utxo-stack/utils/observe.d.ts.map +1 -0
- package/src/_types/core/UTXO/utxo-stack/utils/poll.d.ts +13 -0
- package/src/_types/core/UTXO/utxo-stack/utils/poll.d.ts.map +1 -0
- package/src/_types/core/checkBalance.d.ts.map +1 -1
- package/src/_types/core/execution.d.ts.map +1 -1
- package/src/_types/core/processMessages.d.ts +1 -1
- package/src/_types/core/processMessages.d.ts.map +1 -1
- package/src/_types/core/rpc.d.ts +1 -1
- package/src/_types/core/rpc.d.ts.map +1 -1
- package/src/_types/core/utils.d.ts +1 -1
- package/src/_types/core/utils.d.ts.map +1 -1
- package/src/_types/core/waitForReceivingTransaction.d.ts.map +1 -1
- package/src/_types/createConfig.d.ts +1 -1
- package/src/_types/createConfig.d.ts.map +1 -1
- package/src/_types/errors/SDKError.d.ts +1 -1
- package/src/_types/errors/SDKError.d.ts.map +1 -1
- package/src/_types/errors/constants.d.ts +2 -1
- package/src/_types/errors/constants.d.ts.map +1 -1
- package/src/_types/errors/errors.d.ts +1 -1
- package/src/_types/errors/errors.d.ts.map +1 -1
- package/src/_types/errors/httpError.d.ts +1 -1
- package/src/_types/errors/httpError.d.ts.map +1 -1
- package/src/_types/helpers.d.ts +1 -1
- package/src/_types/helpers.d.ts.map +1 -1
- package/src/_types/index.d.ts +15 -9
- package/src/_types/index.d.ts.map +1 -1
- package/src/_types/services/api.d.ts.map +1 -1
- package/src/_types/services/balance.d.ts.map +1 -1
- package/src/_types/types/internal.d.ts +1 -39
- package/src/_types/types/internal.d.ts.map +1 -1
- package/src/_types/utils/getTransactionMessage.d.ts.map +1 -1
- package/src/_types/utils/withDedupe.d.ts.map +1 -1
- package/src/_types/version.d.ts +1 -1
- package/src/_types/version.d.ts.map +1 -1
- package/src/config.ts +4 -1
- package/src/core/EVM/EVM.ts +1 -1
- package/src/core/EVM/EVMStepExecutor.ts +15 -13
- package/src/core/EVM/checkAllowance.ts +4 -3
- package/src/core/EVM/getAllowance.ts +3 -3
- package/src/core/EVM/getEVMBalance.ts +4 -5
- package/src/core/EVM/parseEVMErrors.ts +3 -3
- package/src/core/EVM/publicClient.ts +2 -2
- package/src/core/EVM/switchChain.ts +5 -5
- package/src/core/EVM/types.ts +2 -2
- package/src/core/EVM/utils.ts +5 -5
- package/src/core/EVM/waitForTransactionReceipt.ts +3 -2
- package/src/core/Solana/Solana.ts +1 -1
- package/src/core/Solana/SolanaStepExecutor.ts +13 -12
- package/src/core/Solana/connection.ts +1 -2
- package/src/core/Solana/getSolanaBalance.ts +3 -3
- package/src/core/Solana/isSVMAddress.ts +1 -1
- package/src/core/Solana/parseSolanaErrors.ts +1 -1
- package/src/core/Solana/types.ts +1 -1
- package/src/core/StatusManager.ts +26 -28
- package/src/core/UTXO/UTXO.ts +1 -1
- package/src/core/UTXO/UTXOStepExecutor.ts +59 -56
- package/src/core/UTXO/getUTXOAPIPublicClient.ts +3 -3
- package/src/core/UTXO/getUTXOBalance.ts +3 -4
- package/src/core/UTXO/getUTXOPublicClient.ts +4 -3
- package/src/core/UTXO/isUTXOAddress.ts +10 -11
- package/src/core/UTXO/parseUTXOErrors.ts +12 -1
- package/src/core/UTXO/types.ts +1 -1
- package/src/core/UTXO/utxo-stack/actions/getBalance.ts +1 -1
- package/src/core/UTXO/utxo-stack/actions/getBlock.ts +58 -0
- package/src/core/UTXO/utxo-stack/actions/getBlockCount.ts +1 -1
- package/src/core/UTXO/utxo-stack/actions/getBlockStats.ts +55 -0
- package/src/core/UTXO/utxo-stack/actions/getUTXOTransaction.ts +24 -11
- package/src/core/UTXO/utxo-stack/actions/sendUTXOTransaction.ts +2 -2
- package/src/core/UTXO/utxo-stack/actions/signPsbt.ts +1 -1
- package/src/core/UTXO/utxo-stack/actions/waitForTransaction.ts +387 -0
- package/src/core/UTXO/utxo-stack/actions/watchBlockNumber.ts +105 -0
- package/src/core/UTXO/utxo-stack/decorators/UTXOAPIActions.ts +1 -2
- package/src/core/UTXO/utxo-stack/decorators/UTXOActions.ts +3 -3
- package/src/core/UTXO/utxo-stack/transports/utxo/getHttpRpcClient.ts +1 -1
- package/src/core/UTXO/utxo-stack/transports/utxo/types.ts +16 -0
- package/src/core/UTXO/utxo-stack/transports/utxo/utxo.ts +3 -3
- package/src/core/UTXO/utxo-stack/types/blockStats.ts +35 -0
- package/src/core/UTXO/utxo-stack/utils/cancelTransaction.ts +75 -0
- package/src/core/UTXO/utxo-stack/utils/modifyFee.ts +78 -0
- package/src/core/UTXO/utxo-stack/utils/observe.ts +81 -0
- package/src/core/UTXO/utxo-stack/utils/poll.ts +48 -0
- package/src/core/checkBalance.ts +2 -8
- package/src/core/execution.ts +0 -1
- package/src/core/processMessages.ts +5 -5
- package/src/core/rpc.ts +1 -1
- package/src/core/stepComparison.ts +1 -1
- package/src/core/utils.ts +1 -1
- package/src/core/waitForReceivingTransaction.ts +42 -46
- package/src/createConfig.ts +1 -2
- package/src/errors/SDKError.ts +1 -1
- package/src/errors/baseError.ts +2 -2
- package/src/errors/constants.ts +1 -0
- package/src/errors/errors.ts +1 -1
- package/src/errors/httpError.ts +3 -3
- package/src/helpers.ts +4 -5
- package/src/index.ts +84 -9
- package/src/request.ts +1 -1
- package/src/services/api.ts +29 -33
- package/src/services/balance.ts +13 -4
- package/src/types/internal.ts +1 -40
- package/src/utils/getTransactionMessage.ts +3 -4
- package/src/utils/withDedupe.ts +0 -1
- package/src/version.ts +1 -1
- package/src/_cjs/core/UTXO/blockchairApi.js +0 -169
- package/src/_cjs/core/UTXO/blockchairApi.js.map +0 -1
- package/src/_cjs/core/UTXO/blockchairApiTypes.js +0 -26
- package/src/_cjs/core/UTXO/blockchairApiTypes.js.map +0 -1
- package/src/_cjs/core/UTXO/requestClient.js +0 -63
- package/src/_cjs/core/UTXO/requestClient.js.map +0 -1
- package/src/_cjs/core/index.js +0 -7
- package/src/_cjs/core/index.js.map +0 -1
- package/src/_cjs/errors/index.js +0 -11
- package/src/_cjs/errors/index.js.map +0 -1
- package/src/_cjs/types/index.js +0 -5
- package/src/_cjs/types/index.js.map +0 -1
- package/src/_cjs/utils/index.js +0 -8
- package/src/_cjs/utils/index.js.map +0 -1
- package/src/_esm/core/UTXO/blockchairApi.js +0 -167
- package/src/_esm/core/UTXO/blockchairApi.js.map +0 -1
- package/src/_esm/core/UTXO/blockchairApiTypes.js +0 -23
- package/src/_esm/core/UTXO/blockchairApiTypes.js.map +0 -1
- package/src/_esm/core/UTXO/requestClient.js +0 -59
- package/src/_esm/core/UTXO/requestClient.js.map +0 -1
- package/src/_esm/core/index.js +0 -4
- package/src/_esm/core/index.js.map +0 -1
- package/src/_esm/errors/index.js +0 -8
- package/src/_esm/errors/index.js.map +0 -1
- package/src/_esm/types/index.js +0 -2
- package/src/_esm/types/index.js.map +0 -1
- package/src/_esm/utils/index.js +0 -5
- package/src/_esm/utils/index.js.map +0 -1
- package/src/_types/core/UTXO/blockchairApi.d.ts +0 -37
- package/src/_types/core/UTXO/blockchairApi.d.ts.map +0 -1
- package/src/_types/core/UTXO/blockchairApiTypes.d.ts +0 -229
- package/src/_types/core/UTXO/blockchairApiTypes.d.ts.map +0 -1
- package/src/_types/core/UTXO/requestClient.d.ts +0 -22
- package/src/_types/core/UTXO/requestClient.d.ts.map +0 -1
- package/src/_types/core/index.d.ts +0 -4
- package/src/_types/core/index.d.ts.map +0 -1
- package/src/_types/errors/index.d.ts +0 -8
- package/src/_types/errors/index.d.ts.map +0 -1
- package/src/_types/types/index.d.ts +0 -2
- package/src/_types/types/index.d.ts.map +0 -1
- package/src/_types/utils/index.d.ts +0 -5
- package/src/_types/utils/index.d.ts.map +0 -1
- package/src/core/UTXO/blockchairApi.ts +0 -273
- package/src/core/UTXO/blockchairApiTypes.ts +0 -253
- package/src/core/UTXO/requestClient.ts +0 -84
- package/src/core/index.ts +0 -3
- package/src/errors/index.ts +0 -7
- package/src/types/index.ts +0 -1
- package/src/utils/index.ts +0 -4
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { sha256 } from '@noble/hashes/sha256'
|
|
2
|
-
import { bech32, bech32m } from 'bech32'
|
|
2
|
+
import { type Decoded, bech32, bech32m } from 'bech32'
|
|
3
3
|
import bs58 from 'bs58'
|
|
4
4
|
|
|
5
5
|
export enum UTXONetwork {
|
|
@@ -26,26 +26,26 @@ export type UTXOAddress = {
|
|
|
26
26
|
const addressTypes: {
|
|
27
27
|
[key: number]: { type: UTXOAddressType; network: UTXONetwork }
|
|
28
28
|
} = {
|
|
29
|
-
|
|
29
|
+
0: {
|
|
30
30
|
type: UTXOAddressType.p2pkh,
|
|
31
31
|
network: UTXONetwork.Mainnet,
|
|
32
32
|
},
|
|
33
|
-
|
|
33
|
+
111: {
|
|
34
34
|
type: UTXOAddressType.p2pkh,
|
|
35
35
|
network: UTXONetwork.Testnet,
|
|
36
36
|
},
|
|
37
|
-
|
|
37
|
+
5: {
|
|
38
38
|
type: UTXOAddressType.p2sh,
|
|
39
39
|
network: UTXONetwork.Mainnet,
|
|
40
40
|
},
|
|
41
|
-
|
|
41
|
+
196: {
|
|
42
42
|
type: UTXOAddressType.p2sh,
|
|
43
43
|
network: UTXONetwork.Testnet,
|
|
44
44
|
},
|
|
45
45
|
}
|
|
46
46
|
|
|
47
47
|
const parseBech32 = (address: string): UTXOAddress => {
|
|
48
|
-
let decoded
|
|
48
|
+
let decoded: Decoded
|
|
49
49
|
|
|
50
50
|
try {
|
|
51
51
|
if (
|
|
@@ -57,7 +57,7 @@ const parseBech32 = (address: string): UTXOAddress => {
|
|
|
57
57
|
} else {
|
|
58
58
|
decoded = bech32.decode(address)
|
|
59
59
|
}
|
|
60
|
-
} catch (
|
|
60
|
+
} catch (_error) {
|
|
61
61
|
throw new Error('Invalid address')
|
|
62
62
|
}
|
|
63
63
|
|
|
@@ -80,8 +80,7 @@ const parseBech32 = (address: string): UTXOAddress => {
|
|
|
80
80
|
}
|
|
81
81
|
const data = bech32.fromWords(decoded.words.slice(1))
|
|
82
82
|
|
|
83
|
-
let type
|
|
84
|
-
|
|
83
|
+
let type: UTXOAddressType
|
|
85
84
|
if (data.length === 20) {
|
|
86
85
|
type = UTXOAddressType.p2wpkh
|
|
87
86
|
} else if (witnessVersion === 1) {
|
|
@@ -108,7 +107,7 @@ export const getUTXOAddress = (address: string): UTXOAddress => {
|
|
|
108
107
|
|
|
109
108
|
try {
|
|
110
109
|
decoded = bs58.decode(address)
|
|
111
|
-
} catch (
|
|
110
|
+
} catch (_error) {
|
|
112
111
|
throw new Error('Invalid address')
|
|
113
112
|
}
|
|
114
113
|
|
|
@@ -160,7 +159,7 @@ export const isUTXOAddress = (
|
|
|
160
159
|
}
|
|
161
160
|
|
|
162
161
|
return true
|
|
163
|
-
} catch (
|
|
162
|
+
} catch (_error) {
|
|
164
163
|
return false
|
|
165
164
|
}
|
|
166
165
|
}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import type { LiFiStep, Process } from '@lifi/types'
|
|
2
|
+
import { SDKError } from '../../errors/SDKError.js'
|
|
2
3
|
import { BaseError } from '../../errors/baseError.js'
|
|
3
4
|
import { ErrorMessage, LiFiErrorCode } from '../../errors/constants.js'
|
|
4
5
|
import { TransactionError, UnknownError } from '../../errors/errors.js'
|
|
5
|
-
import { SDKError } from '../../errors/SDKError.js'
|
|
6
6
|
|
|
7
7
|
export const parseUTXOErrors = async (
|
|
8
8
|
e: Error,
|
|
@@ -21,6 +21,17 @@ export const parseUTXOErrors = async (
|
|
|
21
21
|
}
|
|
22
22
|
|
|
23
23
|
const handleSpecificErrors = (e: any) => {
|
|
24
|
+
// txn-mempool-conflict
|
|
25
|
+
if (
|
|
26
|
+
e.details?.includes?.('conflict') ||
|
|
27
|
+
e.cause?.message?.includes?.('conflict')
|
|
28
|
+
) {
|
|
29
|
+
return new TransactionError(
|
|
30
|
+
LiFiErrorCode.TransactionConflict,
|
|
31
|
+
'Your transaction conflicts with another transaction already in the mempool. One or more inputs have been spent by another transaction.',
|
|
32
|
+
e
|
|
33
|
+
)
|
|
34
|
+
}
|
|
24
35
|
if (e.code === 4001 || e.code === -32000 || e.cause?.includes?.('rejected')) {
|
|
25
36
|
return new TransactionError(LiFiErrorCode.SignatureRejected, e.message, e)
|
|
26
37
|
}
|
package/src/core/UTXO/types.ts
CHANGED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { Block } from 'bitcoinjs-lib'
|
|
2
|
+
import {
|
|
3
|
+
type Account,
|
|
4
|
+
BlockNotFoundError,
|
|
5
|
+
type Chain,
|
|
6
|
+
type Client,
|
|
7
|
+
type Transport,
|
|
8
|
+
} from 'viem'
|
|
9
|
+
import type { UTXOSchema } from '../transports/utxo/types.js'
|
|
10
|
+
|
|
11
|
+
export type GetBlockParameters =
|
|
12
|
+
| {
|
|
13
|
+
blockHash: string
|
|
14
|
+
blockNumber?: never
|
|
15
|
+
}
|
|
16
|
+
| {
|
|
17
|
+
blockHash?: never
|
|
18
|
+
blockNumber: number
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export type GetBlockReturnType = Block
|
|
22
|
+
|
|
23
|
+
export async function getBlock<
|
|
24
|
+
C extends Chain | undefined,
|
|
25
|
+
A extends Account | undefined = Account | undefined,
|
|
26
|
+
>(
|
|
27
|
+
client: Client<Transport, C, A, UTXOSchema>,
|
|
28
|
+
{ blockHash, blockNumber }: GetBlockParameters
|
|
29
|
+
): Promise<GetBlockReturnType> {
|
|
30
|
+
let blockHex: string | undefined
|
|
31
|
+
try {
|
|
32
|
+
let _blockHash = blockHash
|
|
33
|
+
if (!_blockHash && blockNumber) {
|
|
34
|
+
_blockHash = await client.request(
|
|
35
|
+
{
|
|
36
|
+
method: 'getblockhash',
|
|
37
|
+
params: [blockNumber],
|
|
38
|
+
},
|
|
39
|
+
{ dedupe: true }
|
|
40
|
+
)
|
|
41
|
+
}
|
|
42
|
+
if (_blockHash) {
|
|
43
|
+
blockHex = await client.request(
|
|
44
|
+
{
|
|
45
|
+
method: 'getblock',
|
|
46
|
+
params: [_blockHash, 0],
|
|
47
|
+
},
|
|
48
|
+
{ dedupe: true }
|
|
49
|
+
)
|
|
50
|
+
}
|
|
51
|
+
} catch (_error) {
|
|
52
|
+
throw new BlockNotFoundError({ blockHash, blockNumber } as never)
|
|
53
|
+
}
|
|
54
|
+
if (!blockHex) {
|
|
55
|
+
throw new BlockNotFoundError({ blockHash, blockNumber } as never)
|
|
56
|
+
}
|
|
57
|
+
return Block.fromHex(blockHex)
|
|
58
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import {
|
|
2
|
+
type Account,
|
|
3
|
+
BlockNotFoundError,
|
|
4
|
+
type Chain,
|
|
5
|
+
type Client,
|
|
6
|
+
type Transport,
|
|
7
|
+
} from 'viem'
|
|
8
|
+
import type { UTXOSchema } from '../transports/utxo/types.js'
|
|
9
|
+
import type { BlockStats, BlockStatsKeys } from '../types/blockStats.js'
|
|
10
|
+
|
|
11
|
+
export type GetBlockStatsParameters = (
|
|
12
|
+
| {
|
|
13
|
+
blockHash: string
|
|
14
|
+
blockNumber?: never
|
|
15
|
+
}
|
|
16
|
+
| {
|
|
17
|
+
blockHash?: never
|
|
18
|
+
blockNumber: number
|
|
19
|
+
}
|
|
20
|
+
) & {
|
|
21
|
+
stats?: Array<BlockStatsKeys>
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export type GetBlockStatsReturnType = BlockStats
|
|
25
|
+
|
|
26
|
+
export async function getBlockStats<
|
|
27
|
+
C extends Chain | undefined,
|
|
28
|
+
A extends Account | undefined = Account | undefined,
|
|
29
|
+
>(
|
|
30
|
+
client: Client<Transport, C, A, UTXOSchema>,
|
|
31
|
+
{ blockHash, blockNumber, stats }: GetBlockStatsParameters
|
|
32
|
+
): Promise<GetBlockStatsReturnType> {
|
|
33
|
+
const blockHashOrNumber = blockHash || blockNumber
|
|
34
|
+
if (!blockHashOrNumber) {
|
|
35
|
+
throw new BlockNotFoundError({ blockHash, blockNumber } as never)
|
|
36
|
+
}
|
|
37
|
+
try {
|
|
38
|
+
const params: [string | number, Array<BlockStatsKeys>?] = [
|
|
39
|
+
blockHashOrNumber,
|
|
40
|
+
]
|
|
41
|
+
if (stats) {
|
|
42
|
+
params.push(stats)
|
|
43
|
+
}
|
|
44
|
+
const data = await client.request(
|
|
45
|
+
{
|
|
46
|
+
method: 'getblockstats',
|
|
47
|
+
params: params,
|
|
48
|
+
},
|
|
49
|
+
{ dedupe: true }
|
|
50
|
+
)
|
|
51
|
+
return data
|
|
52
|
+
} catch (_error) {
|
|
53
|
+
throw new BlockNotFoundError({ blockHash, blockNumber } as never)
|
|
54
|
+
}
|
|
55
|
+
}
|
|
@@ -1,4 +1,10 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {
|
|
2
|
+
type Account,
|
|
3
|
+
type Chain,
|
|
4
|
+
type Client,
|
|
5
|
+
TransactionNotFoundError,
|
|
6
|
+
type Transport,
|
|
7
|
+
} from 'viem'
|
|
2
8
|
import type { UTXOSchema } from '../transports/utxo/types.js'
|
|
3
9
|
import type { UTXOTransaction } from '../types/transaction.js'
|
|
4
10
|
|
|
@@ -6,7 +12,7 @@ export type GetUTXOTransactionParameters = {
|
|
|
6
12
|
/** The Id of the transaction */
|
|
7
13
|
txId: string
|
|
8
14
|
/** The block in which to look for the transaction */
|
|
9
|
-
|
|
15
|
+
blockHash?: string
|
|
10
16
|
}
|
|
11
17
|
|
|
12
18
|
export type GetUTXOTransactionReturnType = UTXOTransaction
|
|
@@ -16,15 +22,22 @@ export async function getUTXOTransaction<
|
|
|
16
22
|
A extends Account | undefined = Account | undefined,
|
|
17
23
|
>(
|
|
18
24
|
client: Client<Transport, C, A, UTXOSchema>,
|
|
19
|
-
{ txId,
|
|
25
|
+
{ txId, blockHash }: GetUTXOTransactionParameters
|
|
20
26
|
): Promise<GetUTXOTransactionReturnType> {
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
27
|
+
try {
|
|
28
|
+
const params: [string, boolean, string?] = [txId, true]
|
|
29
|
+
if (blockHash) {
|
|
30
|
+
params.push(blockHash)
|
|
31
|
+
}
|
|
32
|
+
const data = await client.request({
|
|
33
|
+
method: 'getrawtransaction',
|
|
34
|
+
params: params,
|
|
35
|
+
})
|
|
36
|
+
return data
|
|
37
|
+
} catch (_error) {
|
|
38
|
+
throw new TransactionNotFoundError({
|
|
39
|
+
blockHash: blockHash as never,
|
|
40
|
+
hash: txId as never,
|
|
41
|
+
})
|
|
24
42
|
}
|
|
25
|
-
const data = await client.request({
|
|
26
|
-
method: 'getrawtransaction',
|
|
27
|
-
params: params,
|
|
28
|
-
})
|
|
29
|
-
return data
|
|
30
43
|
}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import type { Account, Chain, Client, Transport } from 'viem'
|
|
2
2
|
import type { UTXOSchema } from '../transports/utxo/types.js'
|
|
3
3
|
|
|
4
4
|
export type SendUTXOTransactionParameters = {
|
|
5
|
-
/** The hex string of the raw transaction */
|
|
5
|
+
/** The hex string of the raw transaction. */
|
|
6
6
|
hex: string
|
|
7
7
|
/** Rejects transactions whose fee rate is higher than the specified value, expressed in BTC/kB. Set to 0 to accept any fee rate. Default = 0.10 */
|
|
8
8
|
maxFeeRate?: number
|
|
@@ -0,0 +1,387 @@
|
|
|
1
|
+
import { Transaction, address } from 'bitcoinjs-lib'
|
|
2
|
+
import {
|
|
3
|
+
type Chain,
|
|
4
|
+
type Client,
|
|
5
|
+
TransactionNotFoundError,
|
|
6
|
+
TransactionReceiptNotFoundError,
|
|
7
|
+
type Transport,
|
|
8
|
+
WaitForTransactionReceiptTimeoutError,
|
|
9
|
+
stringify,
|
|
10
|
+
withRetry,
|
|
11
|
+
} from 'viem'
|
|
12
|
+
import { getAction } from 'viem/utils'
|
|
13
|
+
import type { UTXOTransaction } from '../types/transaction.js'
|
|
14
|
+
import { observe } from '../utils/observe.js'
|
|
15
|
+
import { getBlock } from './getBlock.js'
|
|
16
|
+
import { getBlockStats } from './getBlockStats.js'
|
|
17
|
+
import { getUTXOTransaction } from './getUTXOTransaction.js'
|
|
18
|
+
import { watchBlockNumber } from './watchBlockNumber.js'
|
|
19
|
+
|
|
20
|
+
export type ReplacementReason = 'cancelled' | 'replaced' | 'repriced'
|
|
21
|
+
export type ReplacementReturnType = {
|
|
22
|
+
reason: ReplacementReason
|
|
23
|
+
replacedTransaction: Transaction
|
|
24
|
+
transaction: UTXOTransaction
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export type WaitForTransactionReceiptReturnType = UTXOTransaction
|
|
28
|
+
|
|
29
|
+
export type WithRetryParameters = {
|
|
30
|
+
// The delay (in ms) between retries.
|
|
31
|
+
delay?:
|
|
32
|
+
| ((config: { count: number; error: Error }) => number)
|
|
33
|
+
| number
|
|
34
|
+
| undefined
|
|
35
|
+
// The max number of times to retry.
|
|
36
|
+
retryCount?: number | undefined
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export type WaitForTransactionReceiptParameters = {
|
|
40
|
+
/** The Id of the transaction. */
|
|
41
|
+
txId: string
|
|
42
|
+
/** The hex string of the raw transaction. */
|
|
43
|
+
txHex: string
|
|
44
|
+
/** The sender address of the transaction. */
|
|
45
|
+
senderAddress?: string
|
|
46
|
+
/**
|
|
47
|
+
* The number of confirmations (blocks that have passed) to wait before resolving.
|
|
48
|
+
* @default 1
|
|
49
|
+
*/
|
|
50
|
+
confirmations?: number | undefined
|
|
51
|
+
/** Optional callback to emit if the transaction has been replaced. */
|
|
52
|
+
onReplaced?: ((response: ReplacementReturnType) => void) | undefined
|
|
53
|
+
/**
|
|
54
|
+
* Polling frequency (in ms). Defaults to the client's pollingInterval config.
|
|
55
|
+
* @default client.pollingInterval
|
|
56
|
+
*/
|
|
57
|
+
pollingInterval?: number | undefined
|
|
58
|
+
/**
|
|
59
|
+
* Number of times to retry if the transaction or block is not found.
|
|
60
|
+
* @default 6 (exponential backoff)
|
|
61
|
+
*/
|
|
62
|
+
retryCount?: number
|
|
63
|
+
/**
|
|
64
|
+
* Time to wait (in ms) between retries.
|
|
65
|
+
*/
|
|
66
|
+
retryDelay?: ((config: { count: number; error: Error }) => number) | number
|
|
67
|
+
/** Optional timeout (in milliseconds) to wait before stopping polling. */
|
|
68
|
+
timeout?: number | undefined
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Waits for the transaction to be included on a block (one confirmation), and then returns the transaction.
|
|
73
|
+
* - JSON-RPC Methods:
|
|
74
|
+
* - Polls getrawtransaction on each block until it has been processed.
|
|
75
|
+
* - If a transaction has been replaced:
|
|
76
|
+
* - Calls getblock and extracts the transactions
|
|
77
|
+
* - Checks if one of the transactions is a replacement
|
|
78
|
+
* - If so, calls getrawtransaction.
|
|
79
|
+
*
|
|
80
|
+
* The `waitForTransaction` action additionally supports replacement detection (e.g. RBF - transactions replaced-by-fee ).
|
|
81
|
+
*
|
|
82
|
+
* Transactions can be replaced when a user modifies their transaction in their wallet (to speed up or cancel).
|
|
83
|
+
* https://bitcoinops.org/en/topics/replace-by-fee/
|
|
84
|
+
*
|
|
85
|
+
* There are 3 types of Transaction Replacement reasons:
|
|
86
|
+
*
|
|
87
|
+
* - `repriced`: The fee has been modified (e.g. same outputs, different amounts)
|
|
88
|
+
* - `cancelled`: The Transaction has been cancelled (e.g. output is sender address)
|
|
89
|
+
* - `replaced`: The Transaction has been replaced (e.g. different outputs)
|
|
90
|
+
* @param client - Client to use
|
|
91
|
+
* @param parameters - {@link WaitForTransactionReceiptParameters}
|
|
92
|
+
* @returns The UTXO transaction. {@link WaitForTransactionReceiptReturnType}
|
|
93
|
+
*/
|
|
94
|
+
export async function waitForTransaction<chain extends Chain | undefined>(
|
|
95
|
+
client: Client<Transport, chain>,
|
|
96
|
+
{
|
|
97
|
+
confirmations = 1,
|
|
98
|
+
txId,
|
|
99
|
+
txHex,
|
|
100
|
+
senderAddress,
|
|
101
|
+
onReplaced,
|
|
102
|
+
pollingInterval = client.pollingInterval,
|
|
103
|
+
retryCount = 10,
|
|
104
|
+
retryDelay = 3_000,
|
|
105
|
+
timeout,
|
|
106
|
+
}: WaitForTransactionReceiptParameters
|
|
107
|
+
): Promise<WaitForTransactionReceiptReturnType> {
|
|
108
|
+
const observerId = stringify(['waitForTransaction', client.uid, txId])
|
|
109
|
+
|
|
110
|
+
let count = 0
|
|
111
|
+
let transaction: UTXOTransaction | undefined
|
|
112
|
+
let replacedTransaction: Transaction | undefined
|
|
113
|
+
let retrying = false
|
|
114
|
+
|
|
115
|
+
return new Promise((resolve, reject) => {
|
|
116
|
+
if (timeout) {
|
|
117
|
+
setTimeout(
|
|
118
|
+
() =>
|
|
119
|
+
reject(
|
|
120
|
+
new WaitForTransactionReceiptTimeoutError({ hash: txId as never })
|
|
121
|
+
),
|
|
122
|
+
timeout
|
|
123
|
+
)
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
const _unobserve = observe(
|
|
127
|
+
observerId,
|
|
128
|
+
{ onReplaced, resolve, reject },
|
|
129
|
+
(emit) => {
|
|
130
|
+
const _unwatch = getAction(
|
|
131
|
+
client,
|
|
132
|
+
watchBlockNumber,
|
|
133
|
+
'watchBlockNumber'
|
|
134
|
+
)({
|
|
135
|
+
emitMissed: true,
|
|
136
|
+
emitOnBegin: true,
|
|
137
|
+
pollingInterval,
|
|
138
|
+
async onBlockNumber(blockNumber_) {
|
|
139
|
+
const done = (fn: () => void) => {
|
|
140
|
+
_unwatch()
|
|
141
|
+
fn()
|
|
142
|
+
_unobserve()
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
let blockNumber = blockNumber_
|
|
146
|
+
|
|
147
|
+
if (retrying) {
|
|
148
|
+
return
|
|
149
|
+
}
|
|
150
|
+
if (count > retryCount) {
|
|
151
|
+
done(() =>
|
|
152
|
+
emit.reject(
|
|
153
|
+
new WaitForTransactionReceiptTimeoutError({
|
|
154
|
+
hash: txId as never,
|
|
155
|
+
})
|
|
156
|
+
)
|
|
157
|
+
)
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
try {
|
|
161
|
+
// If we already have a valid receipt, let's check if we have enough
|
|
162
|
+
// confirmations. If we do, then we can resolve.
|
|
163
|
+
if (transaction?.blockhash) {
|
|
164
|
+
const blockStats = await getAction(
|
|
165
|
+
client,
|
|
166
|
+
getBlockStats,
|
|
167
|
+
'getBlockStats'
|
|
168
|
+
)({
|
|
169
|
+
blockHash: transaction.blockhash,
|
|
170
|
+
stats: ['height'],
|
|
171
|
+
})
|
|
172
|
+
if (
|
|
173
|
+
confirmations > 1 &&
|
|
174
|
+
(!blockStats.height ||
|
|
175
|
+
blockNumber - blockStats.height + 1 < confirmations)
|
|
176
|
+
) {
|
|
177
|
+
return
|
|
178
|
+
}
|
|
179
|
+
done(() => emit.resolve(transaction!))
|
|
180
|
+
return
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
// Get the transaction to check if it's been replaced.
|
|
184
|
+
// We need to retry as some RPC Providers may be slow to sync
|
|
185
|
+
// up mined transactions.
|
|
186
|
+
retrying = true
|
|
187
|
+
transaction = await withRetry(
|
|
188
|
+
() =>
|
|
189
|
+
getAction(
|
|
190
|
+
client,
|
|
191
|
+
getUTXOTransaction,
|
|
192
|
+
'getUTXOTransaction'
|
|
193
|
+
// If transaction exists it might be the replaced one with different txId
|
|
194
|
+
)({ txId: transaction?.txid || txId }),
|
|
195
|
+
{
|
|
196
|
+
delay: retryDelay,
|
|
197
|
+
retryCount,
|
|
198
|
+
}
|
|
199
|
+
)
|
|
200
|
+
if (transaction.blockhash) {
|
|
201
|
+
const blockStats = await getAction(
|
|
202
|
+
client,
|
|
203
|
+
getBlockStats,
|
|
204
|
+
'getBlockStats'
|
|
205
|
+
)({
|
|
206
|
+
blockHash: transaction.blockhash,
|
|
207
|
+
stats: ['height'],
|
|
208
|
+
})
|
|
209
|
+
if (blockStats.height) {
|
|
210
|
+
blockNumber = blockStats.height
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
retrying = false
|
|
214
|
+
|
|
215
|
+
// Check if transaction has been processed.
|
|
216
|
+
if (!transaction?.confirmations) {
|
|
217
|
+
throw new TransactionReceiptNotFoundError({
|
|
218
|
+
hash: txId as never,
|
|
219
|
+
})
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
// Check if we have enough confirmations. If not, continue polling.
|
|
223
|
+
if (transaction.confirmations < confirmations) {
|
|
224
|
+
return
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
done(() => emit.resolve(transaction!))
|
|
228
|
+
} catch (err) {
|
|
229
|
+
// If the receipt is not found, the transaction will be pending.
|
|
230
|
+
// We need to check if it has potentially been replaced.
|
|
231
|
+
if (
|
|
232
|
+
err instanceof TransactionNotFoundError ||
|
|
233
|
+
err instanceof TransactionReceiptNotFoundError
|
|
234
|
+
) {
|
|
235
|
+
try {
|
|
236
|
+
replacedTransaction = Transaction.fromHex(
|
|
237
|
+
transaction?.hex || txHex
|
|
238
|
+
)
|
|
239
|
+
|
|
240
|
+
// Let's retrieve the transactions from the current block.
|
|
241
|
+
// We need to retry as some RPC Providers may be slow to sync
|
|
242
|
+
// up mined blocks.
|
|
243
|
+
retrying = true
|
|
244
|
+
const block = await withRetry(
|
|
245
|
+
() =>
|
|
246
|
+
getAction(
|
|
247
|
+
client,
|
|
248
|
+
getBlock,
|
|
249
|
+
'getBlock'
|
|
250
|
+
)({
|
|
251
|
+
blockNumber,
|
|
252
|
+
}),
|
|
253
|
+
{
|
|
254
|
+
delay: retryDelay,
|
|
255
|
+
retryCount,
|
|
256
|
+
// shouldRetry: ({ error }) =>
|
|
257
|
+
// error instanceof BlockNotFoundError,
|
|
258
|
+
}
|
|
259
|
+
)
|
|
260
|
+
retrying = false
|
|
261
|
+
|
|
262
|
+
// Create a set of input identifiers for mempool transaction
|
|
263
|
+
const replacedTransactionInputs = new Set<string>()
|
|
264
|
+
|
|
265
|
+
for (const input of replacedTransaction.ins) {
|
|
266
|
+
const txid = Array.from(input.hash)
|
|
267
|
+
.reverse()
|
|
268
|
+
.map((byte) => `00${byte.toString(16)}`.slice(-2))
|
|
269
|
+
.join('')
|
|
270
|
+
const vout = input.index
|
|
271
|
+
const inputId = `${txid}:${vout}`
|
|
272
|
+
replacedTransactionInputs.add(inputId)
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
let replacementTransaction: Transaction | undefined
|
|
276
|
+
|
|
277
|
+
for (const tx of block.transactions!) {
|
|
278
|
+
if (tx.isCoinbase()) {
|
|
279
|
+
continue
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
// Check if any input of this transaction matches an input of mempool transaction
|
|
283
|
+
for (const input of tx.ins) {
|
|
284
|
+
const txid = Array.from(input.hash)
|
|
285
|
+
.reverse()
|
|
286
|
+
.map((byte) => `00${byte.toString(16)}`.slice(-2))
|
|
287
|
+
.join('')
|
|
288
|
+
const vout = input.index
|
|
289
|
+
const inputId = `${txid}:${vout}`
|
|
290
|
+
if (replacedTransactionInputs.has(inputId)) {
|
|
291
|
+
replacementTransaction = tx
|
|
292
|
+
break
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
if (replacementTransaction) {
|
|
296
|
+
break
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
// If we couldn't find a replacement transaction, continue polling.
|
|
301
|
+
if (!replacementTransaction) {
|
|
302
|
+
return
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
// If we found a replacement transaction, return it's receipt.
|
|
306
|
+
transaction = await getAction(
|
|
307
|
+
client,
|
|
308
|
+
getUTXOTransaction,
|
|
309
|
+
'getUTXOTransaction'
|
|
310
|
+
)({
|
|
311
|
+
txId: replacementTransaction.getId(),
|
|
312
|
+
})
|
|
313
|
+
|
|
314
|
+
// Check if we have enough confirmations. If not, continue polling.
|
|
315
|
+
if (
|
|
316
|
+
transaction.confirmations &&
|
|
317
|
+
transaction.confirmations < confirmations
|
|
318
|
+
) {
|
|
319
|
+
return
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
let reason: ReplacementReason = 'replaced'
|
|
323
|
+
|
|
324
|
+
// Function to get output addresses
|
|
325
|
+
function getOutputAddresses(tx: Transaction): string[] {
|
|
326
|
+
const addresses: string[] = []
|
|
327
|
+
for (const output of tx.outs) {
|
|
328
|
+
try {
|
|
329
|
+
const outputAddress = address.fromOutputScript(
|
|
330
|
+
output.script
|
|
331
|
+
)
|
|
332
|
+
addresses.push(outputAddress)
|
|
333
|
+
} catch (_e) {
|
|
334
|
+
// Handle non-standard scripts (e.g., OP_RETURN)
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
return addresses
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
// Get the recipient addresses from the original transaction
|
|
341
|
+
const originalOutputAddresses =
|
|
342
|
+
getOutputAddresses(replacedTransaction)
|
|
343
|
+
|
|
344
|
+
// Get the recipient addresses from the replacement transaction
|
|
345
|
+
const replacementOutputAddresses = getOutputAddresses(
|
|
346
|
+
replacementTransaction
|
|
347
|
+
)
|
|
348
|
+
|
|
349
|
+
if (
|
|
350
|
+
originalOutputAddresses.length ===
|
|
351
|
+
replacementOutputAddresses.length &&
|
|
352
|
+
originalOutputAddresses.every((address) =>
|
|
353
|
+
replacementOutputAddresses.includes(address)
|
|
354
|
+
)
|
|
355
|
+
) {
|
|
356
|
+
reason = 'repriced'
|
|
357
|
+
} else if (
|
|
358
|
+
senderAddress &&
|
|
359
|
+
replacementOutputAddresses.length === 1 &&
|
|
360
|
+
replacementOutputAddresses.includes(senderAddress)
|
|
361
|
+
) {
|
|
362
|
+
reason = 'cancelled'
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
done(() => {
|
|
366
|
+
emit.onReplaced?.({
|
|
367
|
+
reason,
|
|
368
|
+
replacedTransaction: replacedTransaction!,
|
|
369
|
+
transaction: transaction!,
|
|
370
|
+
})
|
|
371
|
+
emit.resolve(transaction!)
|
|
372
|
+
})
|
|
373
|
+
} catch (err_) {
|
|
374
|
+
done(() => emit.reject(err_))
|
|
375
|
+
}
|
|
376
|
+
} else {
|
|
377
|
+
done(() => emit.reject(err))
|
|
378
|
+
}
|
|
379
|
+
} finally {
|
|
380
|
+
count++
|
|
381
|
+
}
|
|
382
|
+
},
|
|
383
|
+
})
|
|
384
|
+
}
|
|
385
|
+
)
|
|
386
|
+
})
|
|
387
|
+
}
|