@avalabs/fusion-sdk 0.8.0 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/mod.d.cts +2 -2
- package/dist/mod.d.ts +2 -2
- package/dist/transfer-service/_tracking-utilities.cjs +1 -1
- package/dist/transfer-service/_tracking-utilities.cjs.map +1 -1
- package/dist/transfer-service/_tracking-utilities.js +1 -1
- package/dist/transfer-service/_tracking-utilities.js.map +1 -1
- package/dist/transfer-service/_utils.cjs +1 -1
- package/dist/transfer-service/_utils.cjs.map +1 -1
- package/dist/transfer-service/_utils.js +1 -1
- package/dist/transfer-service/_utils.js.map +1 -1
- package/dist/transfer-service/_warden-config-schema.cjs.map +1 -1
- package/dist/transfer-service/_warden-config-schema.js.map +1 -1
- package/dist/transfer-service/avalanche-evm/_handlers/track-transfer.cjs +1 -1
- package/dist/transfer-service/avalanche-evm/_handlers/track-transfer.cjs.map +1 -1
- package/dist/transfer-service/avalanche-evm/_handlers/track-transfer.js +1 -1
- package/dist/transfer-service/avalanche-evm/_handlers/track-transfer.js.map +1 -1
- package/dist/transfer-service/avalanche-evm/_utils/transfer-data.cjs +1 -1
- package/dist/transfer-service/avalanche-evm/_utils/transfer-data.cjs.map +1 -1
- package/dist/transfer-service/avalanche-evm/_utils/transfer-data.js +1 -1
- package/dist/transfer-service/avalanche-evm/_utils/transfer-data.js.map +1 -1
- package/dist/transfer-service/lombard/btc-to-btcb/_handlers/track-transfer.cjs +1 -1
- package/dist/transfer-service/lombard/btc-to-btcb/_handlers/track-transfer.cjs.map +1 -1
- package/dist/transfer-service/lombard/btc-to-btcb/_handlers/track-transfer.js +1 -1
- package/dist/transfer-service/lombard/btc-to-btcb/_handlers/track-transfer.js.map +1 -1
- package/dist/transfer-service/lombard/btcb-to-btc/_handlers/track-transfer.cjs +1 -1
- package/dist/transfer-service/lombard/btcb-to-btc/_handlers/track-transfer.cjs.map +1 -1
- package/dist/transfer-service/lombard/btcb-to-btc/_handlers/track-transfer.js +1 -1
- package/dist/transfer-service/lombard/btcb-to-btc/_handlers/track-transfer.js.map +1 -1
- package/dist/transfer-service/markr/_handlers/estimate-native-fee.cjs +1 -1
- package/dist/transfer-service/markr/_handlers/estimate-native-fee.cjs.map +1 -1
- package/dist/transfer-service/markr/_handlers/estimate-native-fee.js +1 -1
- package/dist/transfer-service/markr/_handlers/estimate-native-fee.js.map +1 -1
- package/dist/transfer-service/markr/_handlers/track-transfer.cjs +1 -1
- package/dist/transfer-service/markr/_handlers/track-transfer.cjs.map +1 -1
- package/dist/transfer-service/markr/_handlers/track-transfer.js +1 -1
- package/dist/transfer-service/markr/_handlers/track-transfer.js.map +1 -1
- package/dist/transfer-service/markr/_handlers/transfer-asset.cjs +1 -1
- package/dist/transfer-service/markr/_handlers/transfer-asset.cjs.map +1 -1
- package/dist/transfer-service/markr/_handlers/transfer-asset.js +1 -1
- package/dist/transfer-service/markr/_handlers/transfer-asset.js.map +1 -1
- package/dist/transfer-service/markr/_schema.cjs +1 -1
- package/dist/transfer-service/markr/_schema.cjs.map +1 -1
- package/dist/transfer-service/markr/_schema.js +1 -1
- package/dist/transfer-service/markr/_schema.js.map +1 -1
- package/dist/transfer-service/markr/_solana-utils.cjs +2 -0
- package/dist/transfer-service/markr/_solana-utils.cjs.map +1 -0
- package/dist/transfer-service/markr/_solana-utils.js +2 -0
- package/dist/transfer-service/markr/_solana-utils.js.map +1 -0
- package/dist/types/transfer.d.cts +24 -5
- package/dist/types/transfer.d.ts +24 -5
- package/dist/utils/transfer-utils.cjs +1 -1
- package/dist/utils/transfer-utils.cjs.map +1 -1
- package/dist/utils/transfer-utils.js +1 -1
- package/dist/utils/transfer-utils.js.map +1 -1
- package/package.json +1 -1
package/dist/mod.d.cts
CHANGED
|
@@ -6,7 +6,7 @@ import { AVALANCHE_FUJI_CHAIN, AVALANCHE_MAINNET_CHAIN, AvalancheChainIds, BITCO
|
|
|
6
6
|
import { Asset, BridgeableUiAsset, ChainAssetMap, DestinationInfo, Erc20Asset, NativeAsset, SplAsset, TransferableAsset } from "./types/asset.cjs";
|
|
7
7
|
import { Quote, QuoteFee, QuoteFeeToken, QuoteFeeType, QuoteFees, QuoterDoneReason, QuoterEventArgs, QuoterEventHandler, QuoterInterface, QuoterProps, QuotesTuple, ServiceQuoteEventArgs, ServiceQuoteEventHandler } from "./types/quote.cjs";
|
|
8
8
|
import { AbortedError, ErrorCode, ErrorReason, HttpError, InvalidParamsError, ResponseValidationError, SdkError, ServiceInitializationError, ServiceUnavailableError, TimeoutError, isAbortedError, isHttpError, isInvalidParamsError, isResponseValidationError, isSdkError, isServiceInitializationError, isServiceUnavailableError, isTimeoutError } from "./errors.cjs";
|
|
9
|
-
import { CompletedTransfer, FailedTransfer, SourceCompletedTransfer, SourcePendingTransfer, TargetPendingTransfer, Transfer, TransferBase, TransferSourceProgress, TransferStatus, TransferStepDetails, TransferTargetProgress } from "./types/transfer.cjs";
|
|
9
|
+
import { CompletedTransfer, FailedTransfer, RefundedTransfer, SourceCompletedTransfer, SourcePendingTransfer, TargetPendingTransfer, Transfer, TransferBase, TransferSourceProgress, TransferStatus, TransferStepDetails, TransferTargetProgress } from "./types/transfer.cjs";
|
|
10
10
|
import { SolanaSendOptions, SolanaTransactionParams } from "./utils/solana-transaction.cjs";
|
|
11
11
|
import { BtcDispatch, BtcSign, BtcSigner, BtcTransactionRequest, EvmDispatch, EvmSign, EvmSignBatch, EvmSignMessage, EvmSigner, EvmSignerWithMessage, EvmTransactionRequest, Hex, SolanaSign, SolanaSigner } from "./types/signer.cjs";
|
|
12
12
|
import { ArrayElement, DeepMutable, Fetch, Mutable } from "./types/utility-types.cjs";
|
|
@@ -16,4 +16,4 @@ import { isEnvironment, isErc20Asset, isEvmBridgeInitializer, isLombardServiceIn
|
|
|
16
16
|
import { createTransferManager } from "./transfer-manager.cjs";
|
|
17
17
|
import { caip2ToEip155ChainId, caip2ToEip155HexChainId, eip155ChainIdToCaip2, isCaip2ChainId, splitCaip2ChainId } from "./utils/caip.cjs";
|
|
18
18
|
import { parseTransfer, stringifyTransfer } from "./utils/transfer-utils.cjs";
|
|
19
|
-
export { AVALANCHE_FUJI_CHAIN, AVALANCHE_MAINNET_CHAIN, AbortedError, ArrayElement, Asset, AssetBridgeMap, AvalancheChainIds, BITCOIN_MAINNET_CHAIN, BITCOIN_TESTNET_CHAIN, BTC_SERVICE_TYPES, BitcoinChainIds, BitcoinFeeRateTier, BitcoinFunctions, BitcoinInputUTXO, BitcoinInputUTXOWithOptionalScript, BitcoinOutputUTXO, BitcoinTx, Blockchain, BridgeableUiAsset, BtcDispatch, BtcSign, BtcSigner, BtcTransactionRequest, Caip10AccountId, Caip2ChainId, Chain, ChainAssetMap, CompletedTransfer, CreateTransferManagerOptions, DeepMutable, DestinationInfo, ERC_ZERO_ADDRESS, ETHEREUM_MAINNET_CHAIN, ETHEREUM_SEPOLIA_CHAIN, EVM_SERVICE_TYPES, Environment, Erc20Asset, ErrorCode, ErrorReason, EstimateNativeFeeOptions, EthereumChainIds, EvmChainId, EvmDispatch, EvmServiceInitializer, EvmSign, EvmSignBatch, EvmSignMessage, EvmSigner, EvmSignerWithMessage, EvmTransactionRequest, FEE_RATE_TIER_TO_BITCOIN, FailedTransfer, FeeRateTier, Fetch, GasSettings, GetBridgeableAssetsProps, GetMinimumTransferAmountProps, GetSupportedChainsResult, Hex, HttpError, InvalidParamsError, LombardServiceInitializer, MarkrServiceInitializer, Mutable, MutableGetSupportedChainsResult, NATIVE_AVAX, NATIVE_ETH, NativeAsset, NativeFeeEstimate, Quote, QuoteFee, QuoteFeeToken, QuoteFeeType, QuoteFees, QuoterDoneReason, QuoterEventArgs, QuoterEventHandler, QuoterInterface, QuoterProps, QuotesTuple, ResponseValidationError, SOLANA_DEVNET_CHAIN, SOLANA_MAINNET_CHAIN, SOL_MINT_ADDRESS, SdkError, ServiceInitializationError, ServiceInitializer, ServiceQuoteEventArgs, ServiceQuoteEventHandler, ServiceStatus, ServiceStatusBaseRecord, ServiceStatusErrorRecord, ServiceStatusInitializedRecord, ServiceStatusRecord, ServiceStatusUnsupportedEnvironmentRecord, ServiceType, ServiceUnavailableError, SolanaChainIds, SolanaSendOptions, SolanaSign, SolanaSigner, SolanaTransactionParams, SourceCompletedTransfer, SourcePendingTransfer, SplAsset, TargetPendingTransfer, TimeoutError, TokenType, TrackTransferProps, Transfer, TransferAssetProps, TransferBase, TransferManager, TransferManagerStatus, TransferManagerStatusServicesRecord, TransferService, TransferSignatureReason, TransferSourceProgress, TransferStatus, TransferStepDetails, TransferTargetProgress, TransferableAsset, caip2ToEip155ChainId, caip2ToEip155HexChainId, createTransferManager, eip155ChainIdToCaip2, isAbortedError, isCaip2ChainId, isEnvironment, isErc20Asset, isEvmBridgeInitializer, isHttpError, isInvalidParamsError, isLombardServiceInitializer, isMarkrServiceInitializer, isNativeAsset, isResponseValidationError, isSdkError, isServiceInitializationError, isServiceInitializer, isServiceUnavailableError, isSplAsset, isTimeoutError, parseTransfer, splitCaip2ChainId, stringifyTransfer };
|
|
19
|
+
export { AVALANCHE_FUJI_CHAIN, AVALANCHE_MAINNET_CHAIN, AbortedError, ArrayElement, Asset, AssetBridgeMap, AvalancheChainIds, BITCOIN_MAINNET_CHAIN, BITCOIN_TESTNET_CHAIN, BTC_SERVICE_TYPES, BitcoinChainIds, BitcoinFeeRateTier, BitcoinFunctions, BitcoinInputUTXO, BitcoinInputUTXOWithOptionalScript, BitcoinOutputUTXO, BitcoinTx, Blockchain, BridgeableUiAsset, BtcDispatch, BtcSign, BtcSigner, BtcTransactionRequest, Caip10AccountId, Caip2ChainId, Chain, ChainAssetMap, CompletedTransfer, CreateTransferManagerOptions, DeepMutable, DestinationInfo, ERC_ZERO_ADDRESS, ETHEREUM_MAINNET_CHAIN, ETHEREUM_SEPOLIA_CHAIN, EVM_SERVICE_TYPES, Environment, Erc20Asset, ErrorCode, ErrorReason, EstimateNativeFeeOptions, EthereumChainIds, EvmChainId, EvmDispatch, EvmServiceInitializer, EvmSign, EvmSignBatch, EvmSignMessage, EvmSigner, EvmSignerWithMessage, EvmTransactionRequest, FEE_RATE_TIER_TO_BITCOIN, FailedTransfer, FeeRateTier, Fetch, GasSettings, GetBridgeableAssetsProps, GetMinimumTransferAmountProps, GetSupportedChainsResult, Hex, HttpError, InvalidParamsError, LombardServiceInitializer, MarkrServiceInitializer, Mutable, MutableGetSupportedChainsResult, NATIVE_AVAX, NATIVE_ETH, NativeAsset, NativeFeeEstimate, Quote, QuoteFee, QuoteFeeToken, QuoteFeeType, QuoteFees, QuoterDoneReason, QuoterEventArgs, QuoterEventHandler, QuoterInterface, QuoterProps, QuotesTuple, RefundedTransfer, ResponseValidationError, SOLANA_DEVNET_CHAIN, SOLANA_MAINNET_CHAIN, SOL_MINT_ADDRESS, SdkError, ServiceInitializationError, ServiceInitializer, ServiceQuoteEventArgs, ServiceQuoteEventHandler, ServiceStatus, ServiceStatusBaseRecord, ServiceStatusErrorRecord, ServiceStatusInitializedRecord, ServiceStatusRecord, ServiceStatusUnsupportedEnvironmentRecord, ServiceType, ServiceUnavailableError, SolanaChainIds, SolanaSendOptions, SolanaSign, SolanaSigner, SolanaTransactionParams, SourceCompletedTransfer, SourcePendingTransfer, SplAsset, TargetPendingTransfer, TimeoutError, TokenType, TrackTransferProps, Transfer, TransferAssetProps, TransferBase, TransferManager, TransferManagerStatus, TransferManagerStatusServicesRecord, TransferService, TransferSignatureReason, TransferSourceProgress, TransferStatus, TransferStepDetails, TransferTargetProgress, TransferableAsset, caip2ToEip155ChainId, caip2ToEip155HexChainId, createTransferManager, eip155ChainIdToCaip2, isAbortedError, isCaip2ChainId, isEnvironment, isErc20Asset, isEvmBridgeInitializer, isHttpError, isInvalidParamsError, isLombardServiceInitializer, isMarkrServiceInitializer, isNativeAsset, isResponseValidationError, isSdkError, isServiceInitializationError, isServiceInitializer, isServiceUnavailableError, isSplAsset, isTimeoutError, parseTransfer, splitCaip2ChainId, stringifyTransfer };
|
package/dist/mod.d.ts
CHANGED
|
@@ -6,7 +6,7 @@ import { AVALANCHE_FUJI_CHAIN, AVALANCHE_MAINNET_CHAIN, AvalancheChainIds, BITCO
|
|
|
6
6
|
import { Asset, BridgeableUiAsset, ChainAssetMap, DestinationInfo, Erc20Asset, NativeAsset, SplAsset, TransferableAsset } from "./types/asset.js";
|
|
7
7
|
import { Quote, QuoteFee, QuoteFeeToken, QuoteFeeType, QuoteFees, QuoterDoneReason, QuoterEventArgs, QuoterEventHandler, QuoterInterface, QuoterProps, QuotesTuple, ServiceQuoteEventArgs, ServiceQuoteEventHandler } from "./types/quote.js";
|
|
8
8
|
import { AbortedError, ErrorCode, ErrorReason, HttpError, InvalidParamsError, ResponseValidationError, SdkError, ServiceInitializationError, ServiceUnavailableError, TimeoutError, isAbortedError, isHttpError, isInvalidParamsError, isResponseValidationError, isSdkError, isServiceInitializationError, isServiceUnavailableError, isTimeoutError } from "./errors.js";
|
|
9
|
-
import { CompletedTransfer, FailedTransfer, SourceCompletedTransfer, SourcePendingTransfer, TargetPendingTransfer, Transfer, TransferBase, TransferSourceProgress, TransferStatus, TransferStepDetails, TransferTargetProgress } from "./types/transfer.js";
|
|
9
|
+
import { CompletedTransfer, FailedTransfer, RefundedTransfer, SourceCompletedTransfer, SourcePendingTransfer, TargetPendingTransfer, Transfer, TransferBase, TransferSourceProgress, TransferStatus, TransferStepDetails, TransferTargetProgress } from "./types/transfer.js";
|
|
10
10
|
import { SolanaSendOptions, SolanaTransactionParams } from "./utils/solana-transaction.js";
|
|
11
11
|
import { BtcDispatch, BtcSign, BtcSigner, BtcTransactionRequest, EvmDispatch, EvmSign, EvmSignBatch, EvmSignMessage, EvmSigner, EvmSignerWithMessage, EvmTransactionRequest, Hex, SolanaSign, SolanaSigner } from "./types/signer.js";
|
|
12
12
|
import { ArrayElement, DeepMutable, Fetch, Mutable } from "./types/utility-types.js";
|
|
@@ -16,4 +16,4 @@ import { isEnvironment, isErc20Asset, isEvmBridgeInitializer, isLombardServiceIn
|
|
|
16
16
|
import { createTransferManager } from "./transfer-manager.js";
|
|
17
17
|
import { caip2ToEip155ChainId, caip2ToEip155HexChainId, eip155ChainIdToCaip2, isCaip2ChainId, splitCaip2ChainId } from "./utils/caip.js";
|
|
18
18
|
import { parseTransfer, stringifyTransfer } from "./utils/transfer-utils.js";
|
|
19
|
-
export { AVALANCHE_FUJI_CHAIN, AVALANCHE_MAINNET_CHAIN, AbortedError, ArrayElement, Asset, AssetBridgeMap, AvalancheChainIds, BITCOIN_MAINNET_CHAIN, BITCOIN_TESTNET_CHAIN, BTC_SERVICE_TYPES, BitcoinChainIds, BitcoinFeeRateTier, BitcoinFunctions, BitcoinInputUTXO, BitcoinInputUTXOWithOptionalScript, BitcoinOutputUTXO, BitcoinTx, Blockchain, BridgeableUiAsset, BtcDispatch, BtcSign, BtcSigner, BtcTransactionRequest, Caip10AccountId, Caip2ChainId, Chain, ChainAssetMap, CompletedTransfer, CreateTransferManagerOptions, DeepMutable, DestinationInfo, ERC_ZERO_ADDRESS, ETHEREUM_MAINNET_CHAIN, ETHEREUM_SEPOLIA_CHAIN, EVM_SERVICE_TYPES, Environment, Erc20Asset, ErrorCode, ErrorReason, EstimateNativeFeeOptions, EthereumChainIds, EvmChainId, EvmDispatch, EvmServiceInitializer, EvmSign, EvmSignBatch, EvmSignMessage, EvmSigner, EvmSignerWithMessage, EvmTransactionRequest, FEE_RATE_TIER_TO_BITCOIN, FailedTransfer, FeeRateTier, Fetch, GasSettings, GetBridgeableAssetsProps, GetMinimumTransferAmountProps, GetSupportedChainsResult, Hex, HttpError, InvalidParamsError, LombardServiceInitializer, MarkrServiceInitializer, Mutable, MutableGetSupportedChainsResult, NATIVE_AVAX, NATIVE_ETH, NativeAsset, NativeFeeEstimate, Quote, QuoteFee, QuoteFeeToken, QuoteFeeType, QuoteFees, QuoterDoneReason, QuoterEventArgs, QuoterEventHandler, QuoterInterface, QuoterProps, QuotesTuple, ResponseValidationError, SOLANA_DEVNET_CHAIN, SOLANA_MAINNET_CHAIN, SOL_MINT_ADDRESS, SdkError, ServiceInitializationError, ServiceInitializer, ServiceQuoteEventArgs, ServiceQuoteEventHandler, ServiceStatus, ServiceStatusBaseRecord, ServiceStatusErrorRecord, ServiceStatusInitializedRecord, ServiceStatusRecord, ServiceStatusUnsupportedEnvironmentRecord, ServiceType, ServiceUnavailableError, SolanaChainIds, SolanaSendOptions, SolanaSign, SolanaSigner, SolanaTransactionParams, SourceCompletedTransfer, SourcePendingTransfer, SplAsset, TargetPendingTransfer, TimeoutError, TokenType, TrackTransferProps, Transfer, TransferAssetProps, TransferBase, TransferManager, TransferManagerStatus, TransferManagerStatusServicesRecord, TransferService, TransferSignatureReason, TransferSourceProgress, TransferStatus, TransferStepDetails, TransferTargetProgress, TransferableAsset, caip2ToEip155ChainId, caip2ToEip155HexChainId, createTransferManager, eip155ChainIdToCaip2, isAbortedError, isCaip2ChainId, isEnvironment, isErc20Asset, isEvmBridgeInitializer, isHttpError, isInvalidParamsError, isLombardServiceInitializer, isMarkrServiceInitializer, isNativeAsset, isResponseValidationError, isSdkError, isServiceInitializationError, isServiceInitializer, isServiceUnavailableError, isSplAsset, isTimeoutError, parseTransfer, splitCaip2ChainId, stringifyTransfer };
|
|
19
|
+
export { AVALANCHE_FUJI_CHAIN, AVALANCHE_MAINNET_CHAIN, AbortedError, ArrayElement, Asset, AssetBridgeMap, AvalancheChainIds, BITCOIN_MAINNET_CHAIN, BITCOIN_TESTNET_CHAIN, BTC_SERVICE_TYPES, BitcoinChainIds, BitcoinFeeRateTier, BitcoinFunctions, BitcoinInputUTXO, BitcoinInputUTXOWithOptionalScript, BitcoinOutputUTXO, BitcoinTx, Blockchain, BridgeableUiAsset, BtcDispatch, BtcSign, BtcSigner, BtcTransactionRequest, Caip10AccountId, Caip2ChainId, Chain, ChainAssetMap, CompletedTransfer, CreateTransferManagerOptions, DeepMutable, DestinationInfo, ERC_ZERO_ADDRESS, ETHEREUM_MAINNET_CHAIN, ETHEREUM_SEPOLIA_CHAIN, EVM_SERVICE_TYPES, Environment, Erc20Asset, ErrorCode, ErrorReason, EstimateNativeFeeOptions, EthereumChainIds, EvmChainId, EvmDispatch, EvmServiceInitializer, EvmSign, EvmSignBatch, EvmSignMessage, EvmSigner, EvmSignerWithMessage, EvmTransactionRequest, FEE_RATE_TIER_TO_BITCOIN, FailedTransfer, FeeRateTier, Fetch, GasSettings, GetBridgeableAssetsProps, GetMinimumTransferAmountProps, GetSupportedChainsResult, Hex, HttpError, InvalidParamsError, LombardServiceInitializer, MarkrServiceInitializer, Mutable, MutableGetSupportedChainsResult, NATIVE_AVAX, NATIVE_ETH, NativeAsset, NativeFeeEstimate, Quote, QuoteFee, QuoteFeeToken, QuoteFeeType, QuoteFees, QuoterDoneReason, QuoterEventArgs, QuoterEventHandler, QuoterInterface, QuoterProps, QuotesTuple, RefundedTransfer, ResponseValidationError, SOLANA_DEVNET_CHAIN, SOLANA_MAINNET_CHAIN, SOL_MINT_ADDRESS, SdkError, ServiceInitializationError, ServiceInitializer, ServiceQuoteEventArgs, ServiceQuoteEventHandler, ServiceStatus, ServiceStatusBaseRecord, ServiceStatusErrorRecord, ServiceStatusInitializedRecord, ServiceStatusRecord, ServiceStatusUnsupportedEnvironmentRecord, ServiceType, ServiceUnavailableError, SolanaChainIds, SolanaSendOptions, SolanaSign, SolanaSigner, SolanaTransactionParams, SourceCompletedTransfer, SourcePendingTransfer, SplAsset, TargetPendingTransfer, TimeoutError, TokenType, TrackTransferProps, Transfer, TransferAssetProps, TransferBase, TransferManager, TransferManagerStatus, TransferManagerStatusServicesRecord, TransferService, TransferSignatureReason, TransferSourceProgress, TransferStatus, TransferStepDetails, TransferTargetProgress, TransferableAsset, caip2ToEip155ChainId, caip2ToEip155HexChainId, createTransferManager, eip155ChainIdToCaip2, isAbortedError, isCaip2ChainId, isEnvironment, isErc20Asset, isEvmBridgeInitializer, isHttpError, isInvalidParamsError, isLombardServiceInitializer, isMarkrServiceInitializer, isNativeAsset, isResponseValidationError, isSdkError, isServiceInitializationError, isServiceInitializer, isServiceUnavailableError, isSplAsset, isTimeoutError, parseTransfer, splitCaip2ChainId, stringifyTransfer };
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
require(`../_virtual/_rolldown/runtime.cjs`);const e=require(`../errors.cjs`),t=require(`./_utils.cjs`);let n=require(`viem`);function r({transfer:r,updateListener:i},a){let o=new AbortController,s=()=>o.abort();if(r.status!==`source-pending`)return{cancel:s,result:Promise.resolve(r)};let c=a??t.getEvmClientForChain({chain:r.sourceChain}),l=structuredClone(r);return{cancel:s,result:(async()=>{if(l.status!==`source-pending`)return l;let{requiredConfirmationCount:r,txHash:a}=l.source;if(!(0,n.isHash)(a)){let t={...l,errorCode:e.ErrorCode.INVALID_PARAMS,failedAtMs:Date.now(),status:`failed`};return i(t),t}try{let n=await t.awaitOrAbort(c.waitForTransactionReceipt({confirmations:Math.max(r,1),hash:a}),o.signal);if(n.status===`aborted`)return l;if(n.value.status===`reverted`){let t={...l,errorCode:e.ErrorCode.TRANSACTION_REVERTED,failedAtMs:Date.now(),status:`failed`};return i(t),t}let s={...l,completedAtMs:Date.now(),source:{...l.source,confirmationCount:r},status:`completed`,target:null};return i(s),s}catch
|
|
1
|
+
require(`../_virtual/_rolldown/runtime.cjs`);const e=require(`../errors.cjs`),t=require(`./_utils.cjs`);let n=require(`viem`);function r({transfer:r,updateListener:i},a){let o=new AbortController,s=()=>o.abort();if(r.status!==`source-pending`)return{cancel:s,result:Promise.resolve(r)};let c=a??t.getEvmClientForChain({chain:r.sourceChain}),l=structuredClone(r);return{cancel:s,result:(async()=>{if(l.status!==`source-pending`)return l;let{requiredConfirmationCount:r,txHash:a}=l.source;if(!(0,n.isHash)(a)){let t={...l,errorCode:e.ErrorCode.INVALID_PARAMS,errorReason:`Invalid source transaction hash`,failedAtMs:Date.now(),status:`failed`};return i(t),t}try{let n=await t.awaitOrAbort(c.waitForTransactionReceipt({confirmations:Math.max(r,1),hash:a}),o.signal);if(n.status===`aborted`)return l;if(n.value.status===`reverted`){let t={...l,errorCode:e.ErrorCode.TRANSACTION_REVERTED,errorReason:`Source transaction was reverted`,failedAtMs:Date.now(),status:`failed`};return i(t),t}let s={...l,completedAtMs:Date.now(),source:{...l.source,confirmationCount:r},status:`completed`,target:null};return i(s),s}catch{return l}})()}}exports.trackSameChainEvmTransfer=r;
|
|
2
2
|
//# sourceMappingURL=_tracking-utilities.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"_tracking-utilities.cjs","names":["getEvmClientForChain","ErrorCode","awaitOrAbort"
|
|
1
|
+
{"version":3,"file":"_tracking-utilities.cjs","names":["getEvmClientForChain","ErrorCode","awaitOrAbort"],"sources":["../../src/transfer-service/_tracking-utilities.ts"],"sourcesContent":["/**\n * @module\n * @internal\n *\n * Shared EVM transfer tracking utilities.\n */\nimport { isHash } from 'viem';\nimport { ErrorCode } from '../errors';\nimport type { TrackTransferProps } from '../types/service';\nimport type { FailedTransfer, Transfer } from '../types/transfer';\nimport { awaitOrAbort, getEvmClientForChain } from './_utils';\n\n/**\n * Track a same-chain EVM transfer by waiting for the transaction receipt.\n * Shared across services that produce same-chain transfers (markr, wrap-unwrap).\n *\n * @param evmClient - Optional pre-built client (for testing); defaults to `getEvmClientForChain`.\n */\nexport function trackSameChainEvmTransfer(\n { transfer, updateListener }: TrackTransferProps,\n evmClient?: ReturnType<typeof getEvmClientForChain>,\n): {\n cancel: () => void;\n result: Promise<Transfer>;\n} {\n const ac = new AbortController();\n const cancel = () => ac.abort();\n\n if (transfer.status !== 'source-pending') {\n return { cancel, result: Promise.resolve(transfer) };\n }\n\n const client = evmClient ?? getEvmClientForChain({ chain: transfer.sourceChain });\n const currentTransfer: Transfer = structuredClone(transfer);\n\n const executeTracking = async (): Promise<Transfer> => {\n if (currentTransfer.status !== 'source-pending') {\n return currentTransfer;\n }\n\n const { requiredConfirmationCount, txHash } = currentTransfer.source;\n\n if (!isHash(txHash)) {\n const failedTransfer: FailedTransfer = {\n ...currentTransfer,\n errorCode: ErrorCode.INVALID_PARAMS,\n errorReason: 'Invalid source transaction hash',\n failedAtMs: Date.now(),\n status: 'failed',\n };\n updateListener(failedTransfer);\n return failedTransfer;\n }\n\n try {\n const receiptResult = await awaitOrAbort(\n client.waitForTransactionReceipt({\n confirmations: Math.max(requiredConfirmationCount, 1),\n hash: txHash,\n }),\n ac.signal,\n );\n\n if (receiptResult.status === 'aborted') {\n return currentTransfer;\n }\n\n if (receiptResult.value.status === 'reverted') {\n const failedTransfer: FailedTransfer = {\n ...currentTransfer,\n errorCode: ErrorCode.TRANSACTION_REVERTED,\n errorReason: 'Source transaction was reverted',\n failedAtMs: Date.now(),\n status: 'failed',\n };\n updateListener(failedTransfer);\n return failedTransfer;\n }\n\n const completedTransfer: Transfer = {\n ...currentTransfer,\n completedAtMs: Date.now(),\n source: {\n ...currentTransfer.source,\n confirmationCount: requiredConfirmationCount,\n },\n status: 'completed',\n target: null,\n };\n\n updateListener(completedTransfer);\n return completedTransfer;\n } catch {\n return currentTransfer;\n }\n };\n\n return { cancel, result: executeTracking() };\n}\n"],"mappings":"8HAkBA,SAAgB,EACd,CAAE,WAAU,kBACZ,EAIA,CACA,IAAM,EAAK,IAAI,gBACT,MAAe,EAAG,OAAO,CAE/B,GAAI,EAAS,SAAW,iBACtB,MAAO,CAAE,SAAQ,OAAQ,QAAQ,QAAQ,EAAS,CAAE,CAGtD,IAAM,EAAS,GAAaA,EAAAA,qBAAqB,CAAE,MAAO,EAAS,YAAa,CAAC,CAC3E,EAA4B,gBAAgB,EAAS,CAgE3D,MAAO,CAAE,SAAQ,QA9DO,SAA+B,CACrD,GAAI,EAAgB,SAAW,iBAC7B,OAAO,EAGT,GAAM,CAAE,4BAA2B,UAAW,EAAgB,OAE9D,GAAI,EAAA,EAAA,EAAA,QAAQ,EAAO,CAAE,CACnB,IAAM,EAAiC,CACrC,GAAG,EACH,UAAWC,EAAAA,UAAU,eACrB,YAAa,kCACb,WAAY,KAAK,KAAK,CACtB,OAAQ,SACT,CAED,OADA,EAAe,EAAe,CACvB,EAGT,GAAI,CACF,IAAM,EAAgB,MAAMC,EAAAA,aAC1B,EAAO,0BAA0B,CAC/B,cAAe,KAAK,IAAI,EAA2B,EAAE,CACrD,KAAM,EACP,CAAC,CACF,EAAG,OACJ,CAED,GAAI,EAAc,SAAW,UAC3B,OAAO,EAGT,GAAI,EAAc,MAAM,SAAW,WAAY,CAC7C,IAAM,EAAiC,CACrC,GAAG,EACH,UAAWD,EAAAA,UAAU,qBACrB,YAAa,kCACb,WAAY,KAAK,KAAK,CACtB,OAAQ,SACT,CAED,OADA,EAAe,EAAe,CACvB,EAGT,IAAM,EAA8B,CAClC,GAAG,EACH,cAAe,KAAK,KAAK,CACzB,OAAQ,CACN,GAAG,EAAgB,OACnB,kBAAmB,EACpB,CACD,OAAQ,YACR,OAAQ,KACT,CAGD,OADA,EAAe,EAAkB,CAC1B,OACD,CACN,OAAO,MAI+B,CAAE"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{ErrorCode as e}from"../errors.js";import{awaitOrAbort as t,
|
|
1
|
+
import{ErrorCode as e}from"../errors.js";import{awaitOrAbort as t,getEvmClientForChain as n}from"./_utils.js";import{isHash as r}from"viem";function i({transfer:i,updateListener:a},o){let s=new AbortController,c=()=>s.abort();if(i.status!==`source-pending`)return{cancel:c,result:Promise.resolve(i)};let l=o??n({chain:i.sourceChain}),u=structuredClone(i);return{cancel:c,result:(async()=>{if(u.status!==`source-pending`)return u;let{requiredConfirmationCount:n,txHash:i}=u.source;if(!r(i)){let t={...u,errorCode:e.INVALID_PARAMS,errorReason:`Invalid source transaction hash`,failedAtMs:Date.now(),status:`failed`};return a(t),t}try{let r=await t(l.waitForTransactionReceipt({confirmations:Math.max(n,1),hash:i}),s.signal);if(r.status===`aborted`)return u;if(r.value.status===`reverted`){let t={...u,errorCode:e.TRANSACTION_REVERTED,errorReason:`Source transaction was reverted`,failedAtMs:Date.now(),status:`failed`};return a(t),t}let o={...u,completedAtMs:Date.now(),source:{...u.source,confirmationCount:n},status:`completed`,target:null};return a(o),o}catch{return u}})()}}export{i as trackSameChainEvmTransfer};
|
|
2
2
|
//# sourceMappingURL=_tracking-utilities.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"_tracking-utilities.js","names":[],"sources":["../../src/transfer-service/_tracking-utilities.ts"],"sourcesContent":["/**\n * @module\n * @internal\n *\n * Shared EVM transfer tracking utilities.\n */\nimport { isHash } from 'viem';\nimport { ErrorCode } from '../errors';\nimport type { TrackTransferProps } from '../types/service';\nimport type { FailedTransfer, Transfer } from '../types/transfer';\nimport { awaitOrAbort,
|
|
1
|
+
{"version":3,"file":"_tracking-utilities.js","names":[],"sources":["../../src/transfer-service/_tracking-utilities.ts"],"sourcesContent":["/**\n * @module\n * @internal\n *\n * Shared EVM transfer tracking utilities.\n */\nimport { isHash } from 'viem';\nimport { ErrorCode } from '../errors';\nimport type { TrackTransferProps } from '../types/service';\nimport type { FailedTransfer, Transfer } from '../types/transfer';\nimport { awaitOrAbort, getEvmClientForChain } from './_utils';\n\n/**\n * Track a same-chain EVM transfer by waiting for the transaction receipt.\n * Shared across services that produce same-chain transfers (markr, wrap-unwrap).\n *\n * @param evmClient - Optional pre-built client (for testing); defaults to `getEvmClientForChain`.\n */\nexport function trackSameChainEvmTransfer(\n { transfer, updateListener }: TrackTransferProps,\n evmClient?: ReturnType<typeof getEvmClientForChain>,\n): {\n cancel: () => void;\n result: Promise<Transfer>;\n} {\n const ac = new AbortController();\n const cancel = () => ac.abort();\n\n if (transfer.status !== 'source-pending') {\n return { cancel, result: Promise.resolve(transfer) };\n }\n\n const client = evmClient ?? getEvmClientForChain({ chain: transfer.sourceChain });\n const currentTransfer: Transfer = structuredClone(transfer);\n\n const executeTracking = async (): Promise<Transfer> => {\n if (currentTransfer.status !== 'source-pending') {\n return currentTransfer;\n }\n\n const { requiredConfirmationCount, txHash } = currentTransfer.source;\n\n if (!isHash(txHash)) {\n const failedTransfer: FailedTransfer = {\n ...currentTransfer,\n errorCode: ErrorCode.INVALID_PARAMS,\n errorReason: 'Invalid source transaction hash',\n failedAtMs: Date.now(),\n status: 'failed',\n };\n updateListener(failedTransfer);\n return failedTransfer;\n }\n\n try {\n const receiptResult = await awaitOrAbort(\n client.waitForTransactionReceipt({\n confirmations: Math.max(requiredConfirmationCount, 1),\n hash: txHash,\n }),\n ac.signal,\n );\n\n if (receiptResult.status === 'aborted') {\n return currentTransfer;\n }\n\n if (receiptResult.value.status === 'reverted') {\n const failedTransfer: FailedTransfer = {\n ...currentTransfer,\n errorCode: ErrorCode.TRANSACTION_REVERTED,\n errorReason: 'Source transaction was reverted',\n failedAtMs: Date.now(),\n status: 'failed',\n };\n updateListener(failedTransfer);\n return failedTransfer;\n }\n\n const completedTransfer: Transfer = {\n ...currentTransfer,\n completedAtMs: Date.now(),\n source: {\n ...currentTransfer.source,\n confirmationCount: requiredConfirmationCount,\n },\n status: 'completed',\n target: null,\n };\n\n updateListener(completedTransfer);\n return completedTransfer;\n } catch {\n return currentTransfer;\n }\n };\n\n return { cancel, result: executeTracking() };\n}\n"],"mappings":"4IAkBA,SAAgB,EACd,CAAE,WAAU,kBACZ,EAIA,CACA,IAAM,EAAK,IAAI,gBACT,MAAe,EAAG,OAAO,CAE/B,GAAI,EAAS,SAAW,iBACtB,MAAO,CAAE,SAAQ,OAAQ,QAAQ,QAAQ,EAAS,CAAE,CAGtD,IAAM,EAAS,GAAa,EAAqB,CAAE,MAAO,EAAS,YAAa,CAAC,CAC3E,EAA4B,gBAAgB,EAAS,CAgE3D,MAAO,CAAE,SAAQ,QA9DO,SAA+B,CACrD,GAAI,EAAgB,SAAW,iBAC7B,OAAO,EAGT,GAAM,CAAE,4BAA2B,UAAW,EAAgB,OAE9D,GAAI,CAAC,EAAO,EAAO,CAAE,CACnB,IAAM,EAAiC,CACrC,GAAG,EACH,UAAW,EAAU,eACrB,YAAa,kCACb,WAAY,KAAK,KAAK,CACtB,OAAQ,SACT,CAED,OADA,EAAe,EAAe,CACvB,EAGT,GAAI,CACF,IAAM,EAAgB,MAAM,EAC1B,EAAO,0BAA0B,CAC/B,cAAe,KAAK,IAAI,EAA2B,EAAE,CACrD,KAAM,EACP,CAAC,CACF,EAAG,OACJ,CAED,GAAI,EAAc,SAAW,UAC3B,OAAO,EAGT,GAAI,EAAc,MAAM,SAAW,WAAY,CAC7C,IAAM,EAAiC,CACrC,GAAG,EACH,UAAW,EAAU,qBACrB,YAAa,kCACb,WAAY,KAAK,KAAK,CACtB,OAAQ,SACT,CAED,OADA,EAAe,EAAe,CACvB,EAGT,IAAM,EAA8B,CAClC,GAAG,EACH,cAAe,KAAK,KAAK,CACzB,OAAQ,CACN,GAAG,EAAgB,OACnB,kBAAmB,EACpB,CACD,OAAQ,YACR,OAAQ,KACT,CAGD,OADA,EAAe,EAAkB,CAC1B,OACD,CACN,OAAO,MAI+B,CAAE"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
require(`../_virtual/_rolldown/runtime.cjs`);const e=require(`../errors.cjs`),t=require(`../utils/caip.cjs`);let n=require(`viem`),r=require(`@solana/kit`);function i(n){let{namespace:r,reference:i}=t.splitCaip2ChainId(n.chainId);if(r!==`eip155`)throw new e.InvalidParamsError(`Can not get Viem chain for unsupported chain`,`Unsupported chain namespace: ${r}. Only eip155 chains are supported.`);return{id:Number(i),name:n.chainName,nativeCurrency:{decimals:n.networkToken.decimals,symbol:n.networkToken.symbol,name:n.networkToken.name},rpcUrls:{default:{http:[n.rpcUrl]},public:{http:[n.rpcUrl]}},...n.utilityAddresses?.multicall&&{contracts:{multicall3:{address:n.utilityAddresses.multicall}}}}}function a({chain:e}){return(0,n.createWalletClient)({chain:i(e),transport:(0,n.http)(e.rpcUrl,{batch:!0,retryCount:6,retryDelay:200,timeout:15e3})}).extend(n.publicActions)}function o({chain:e}){return(0,r.createSolanaRpc)(e.rpcUrl)}function s(t,n){if(n===void 0)return t;if(!Number.isInteger(n)||n<0)throw new e.InvalidParamsError(`Invalid feeUnitsMarginBps`,`feeUnitsMarginBps must be a non-negative integer, but got ${n}`);return t*BigInt(1e4+n)/10000n}function c(
|
|
1
|
+
require(`../_virtual/_rolldown/runtime.cjs`);const e=require(`../errors.cjs`),t=require(`../utils/caip.cjs`);let n=require(`viem`),r=require(`@solana/kit`);function i(n){let{namespace:r,reference:i}=t.splitCaip2ChainId(n.chainId);if(r!==`eip155`)throw new e.InvalidParamsError(`Can not get Viem chain for unsupported chain`,`Unsupported chain namespace: ${r}. Only eip155 chains are supported.`);return{id:Number(i),name:n.chainName,nativeCurrency:{decimals:n.networkToken.decimals,symbol:n.networkToken.symbol,name:n.networkToken.name},rpcUrls:{default:{http:[n.rpcUrl]},public:{http:[n.rpcUrl]}},...n.utilityAddresses?.multicall&&{contracts:{multicall3:{address:n.utilityAddresses.multicall}}}}}function a({chain:e}){return(0,n.createWalletClient)({chain:i(e),transport:(0,n.http)(e.rpcUrl,{batch:!0,retryCount:6,retryDelay:200,timeout:15e3})}).extend(n.publicActions)}function o({chain:e}){return(0,r.createSolanaRpc)(e.rpcUrl)}function s(t,n){if(n===void 0)return t;if(!Number.isInteger(n)||n<0)throw new e.InvalidParamsError(`Invalid feeUnitsMarginBps`,`feeUnitsMarginBps must be a non-negative integer, but got ${n}`);return t*BigInt(1e4+n)/10000n}function c({timeoutMs:e,signal:t}){return new Promise(n=>{let r=!1,i=()=>{r||(r=!0,clearTimeout(o),t.removeEventListener(`abort`,a),n())},a=()=>{i()},o=setTimeout(()=>{i()},e);t.addEventListener(`abort`,a,{once:!0}),t.aborted&&i()})}const l=Symbol(`aborted`);async function u(e,t){let n=await Promise.race([e,new Promise(e=>{t.addEventListener(`abort`,()=>e(l),{once:!0})})]);return n===l||t.aborted?{status:`aborted`}:{status:`ok`,value:n}}function d(e,t){return{amountIn:e.amountIn,amountOut:e.amountOut,environment:t.environment,errorCode:t.errorCode,errorReason:t.errorReason,failedAtMs:Date.now(),fees:e.fees,fromAddress:e.fromAddress,id:e.id,partnerFeeBps:e.partnerFeeBps,sourceAsset:e.assetIn,sourceChain:e.sourceChain,status:`failed`,targetAsset:e.assetOut,targetChain:e.targetChain,toAddress:e.toAddress,type:e.serviceType}}exports.applyFeeUnitsBpsMargin=s,exports.awaitOrAbort=u,exports.getEvmClientForChain=a,exports.getSolanaRpcForChain=o,exports.makeFailedTransferFromQuote=d,exports.waitForTimeoutOrAbort=c;
|
|
2
2
|
//# sourceMappingURL=_utils.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"_utils.cjs","names":["splitCaip2ChainId","InvalidParamsError","publicActions","WaitForTransactionReceiptTimeoutError","ErrorCode","SOLANA_ERROR__JSON_RPC__SERVER_ERROR_NODE_UNHEALTHY","SOLANA_ERROR__RPC__TRANSPORT_HTTP_ERROR","SOLANA_ERROR__BLOCK_HEIGHT_EXCEEDED"],"sources":["../../src/transfer-service/_utils.ts"],"sourcesContent":["/**\n * @module\n * @internal\n *\n * Internal utility functions for transfer services.\n */\nimport {\n createSolanaRpc,\n isSolanaError,\n SOLANA_ERROR__BLOCK_HEIGHT_EXCEEDED,\n SOLANA_ERROR__JSON_RPC__SERVER_ERROR_NODE_UNHEALTHY,\n SOLANA_ERROR__RPC__TRANSPORT_HTTP_ERROR,\n type Rpc,\n type SolanaRpcApi,\n} from '@solana/kit';\nimport {\n createWalletClient,\n http,\n publicActions,\n WaitForTransactionReceiptTimeoutError,\n type Client,\n type HttpTransport,\n type PublicActions,\n type Chain as ViemChain,\n type WalletRpcSchema,\n} from 'viem';\nimport { splitCaip2ChainId } from '../utils/caip';\nimport type { Environment } from '../constants';\nimport { ErrorCode, InvalidParamsError } from '../errors';\nimport type { Chain } from '../types/chain';\nimport type { Quote } from '../types/quote';\nimport type { FailedTransfer } from '../types/transfer';\n\nfunction getViemChain(chain: Chain): ViemChain {\n const { namespace, reference: chainId } = splitCaip2ChainId(chain.chainId);\n\n if (namespace !== 'eip155') {\n throw new InvalidParamsError(\n 'Can not get Viem chain for unsupported chain',\n `Unsupported chain namespace: ${namespace}. Only eip155 chains are supported.`,\n );\n }\n\n return {\n id: Number(chainId),\n name: chain.chainName,\n nativeCurrency: {\n decimals: chain.networkToken.decimals,\n symbol: chain.networkToken.symbol,\n name: chain.networkToken.name,\n },\n rpcUrls: {\n default: {\n http: [chain.rpcUrl],\n },\n public: {\n http: [chain.rpcUrl],\n },\n },\n ...(chain.utilityAddresses?.multicall && {\n contracts: {\n multicall3: {\n address: chain.utilityAddresses.multicall,\n },\n },\n }),\n };\n}\n\nexport function getEvmClientForChain({\n chain,\n}: {\n chain: Chain;\n}): Client<HttpTransport, ViemChain, undefined, WalletRpcSchema, PublicActions> {\n const chainInfo = getViemChain(chain);\n\n const transport = http(chain.rpcUrl, {\n batch: true,\n retryCount: 6,\n retryDelay: 200,\n timeout: 15_000,\n });\n\n const client = createWalletClient({\n chain: chainInfo,\n transport,\n }).extend(publicActions);\n\n return client;\n}\n\nexport function getSolanaRpcForChain({ chain }: { chain: Chain }): Rpc<SolanaRpcApi> {\n return createSolanaRpc(chain.rpcUrl);\n}\n\nexport function applyFeeUnitsBpsMargin(feeUnits: bigint, feeUnitsMarginBps: number | undefined): bigint {\n if (feeUnitsMarginBps === undefined) {\n return feeUnits;\n }\n\n if (!Number.isInteger(feeUnitsMarginBps) || feeUnitsMarginBps < 0) {\n throw new InvalidParamsError(\n 'Invalid feeUnitsMarginBps',\n `feeUnitsMarginBps must be a non-negative integer, but got ${feeUnitsMarginBps}`,\n );\n }\n\n return (feeUnits * BigInt(10_000 + feeUnitsMarginBps)) / 10_000n;\n}\n\nexport function scaleAmount(amount: bigint, multiplier: number, precisionFactor = 1_000_000): bigint {\n // Verify precisionFactor is a positive integer\n if (!Number.isInteger(precisionFactor) || precisionFactor <= 0) {\n throw new Error('precisionFactor must be a positive integer');\n }\n\n return (amount * BigInt(multiplier * precisionFactor)) / BigInt(precisionFactor);\n}\n\n/**\n * Subtracts the partner fee from the given amount.\n *\n * @param amount - The original amount.\n * @param partnerFeeBps - Fee in basis points (1 bps = 0.01%)\n * @returns The amount after subtracting the partner fee.\n *\n * @throws {Error} If partnerFeeBps is not an integer or is out of range.\n */\nexport function subtractPartnerFee(amount: bigint, partnerFeeBps: number): bigint {\n if (!Number.isInteger(partnerFeeBps)) {\n throw new Error('partnerFeeBps must be an integer');\n }\n\n if (partnerFeeBps < 0 || partnerFeeBps > 10_000) {\n throw new Error('partnerFeeBps must be between 0 and 10,000');\n }\n\n return (amount * BigInt(10_000 - partnerFeeBps)) / 10_000n;\n}\n\n/**\n * Calculates the fee percentage given an input amount and a fee amount.\n *\n * @param inputAmount - The original input amount.\n * @param feeAmount - The fee amount to be calculated as a percentage of the input amount.\n * @returns An object containing the fee percentage and the number of decimal places.\n *\n * @throws {Error} If inputAmount is less than or equal to zero, or if feeAmount is negative.\n */\nexport function calculateFeePercentage(\n inputAmount: bigint,\n feeAmount: bigint,\n): { feePercentage: number; feePercentageDecimals: number } {\n if (inputAmount <= 0n) {\n throw new Error('Input amount must be greater than zero');\n }\n\n if (feeAmount < 0n) {\n throw new Error('Fee amount must be >= zero');\n }\n\n if (feeAmount === 0n) {\n return { feePercentage: 0, feePercentageDecimals: 0 };\n }\n\n const MAX_DECIMALS = 18;\n\n for (let decimals = 0; decimals <= MAX_DECIMALS; decimals++) {\n const scale = 10n ** BigInt(decimals);\n const numerator = feeAmount * 100n * scale;\n\n if (numerator % inputAmount === 0n) {\n const value = numerator / inputAmount;\n\n if (value > BigInt(Number.MAX_SAFE_INTEGER)) {\n throw new Error('feePercentage exceeds Number.MAX_SAFE_INTEGER');\n }\n\n return {\n feePercentage: Number(value),\n feePercentageDecimals: decimals,\n };\n }\n }\n\n // Fallback: highest precision, truncated\n const scale = 10n ** BigInt(MAX_DECIMALS);\n const value = (feeAmount * 100n * scale) / inputAmount;\n\n if (value > BigInt(Number.MAX_SAFE_INTEGER)) {\n throw new Error('feePercentage exceeds Number.MAX_SAFE_INTEGER');\n }\n\n return {\n feePercentage: Number(value),\n feePercentageDecimals: MAX_DECIMALS,\n };\n}\n\n/**\n * Maps Viem errors to corresponding ErrorCode values.\n *\n * @param error - The error thrown by Viem.\n * @returns The corresponding ErrorCode.\n */\nexport function getErrorCodeForViemError(error: unknown): ErrorCode {\n if (error instanceof WaitForTransactionReceiptTimeoutError) {\n return ErrorCode.TIMEOUT;\n }\n\n return ErrorCode.TRANSACTION_REVERTED;\n}\n\n/**\n * Maps `@solana/kit` errors to SDK ErrorCode values.\n *\n * `@solana/kit` throws typed `SolanaError` instances with numeric codes.\n * We use the `isSolanaError` type guard to match specific codes:\n *\n * - Transport / node-health errors → SERVICE_NOT_AVAILABLE\n * (HTTP transport failures, node-unhealthy JSON-RPC responses)\n *\n * - Block-height exceeded → TIMEOUT\n * (the transaction's blockhash has expired — the 150-slot validity\n * window has passed and the tx can no longer land)\n *\n * - Everything else → UNKNOWN\n * (unexpected JSON-RPC errors, malformed responses, internal errors, etc.)\n */\nexport function getErrorCodeForSolanaRpcError(error: unknown): ErrorCode {\n if (\n isSolanaError(error, SOLANA_ERROR__JSON_RPC__SERVER_ERROR_NODE_UNHEALTHY) ||\n isSolanaError(error, SOLANA_ERROR__RPC__TRANSPORT_HTTP_ERROR)\n ) {\n return ErrorCode.SERVICE_NOT_AVAILABLE;\n }\n\n if (isSolanaError(error, SOLANA_ERROR__BLOCK_HEIGHT_EXCEEDED)) {\n return ErrorCode.TIMEOUT;\n }\n\n return ErrorCode.UNKNOWN;\n}\n\n/**\n * Waits for either a timeout to elapse or an abort signal to be triggered.\n *\n * @param timeoutMs - The timeout duration in milliseconds.\n * @param signal - The AbortSignal to listen for abort events.\n *\n * @returns A promise that resolves when either the timeout elapses or the abort signal is triggered.\n */\nexport function waitForTimeoutOrAbort({\n timeoutMs,\n signal,\n}: Readonly<{\n timeoutMs: number;\n signal: AbortSignal;\n}>): Promise<void> {\n return new Promise((resolve) => {\n let settled = false;\n\n const finish = (): void => {\n if (settled) {\n return;\n }\n\n settled = true;\n clearTimeout(timeoutId);\n signal.removeEventListener('abort', onAbort);\n resolve();\n };\n\n const onAbort = (): void => {\n finish();\n };\n\n const timeoutId = setTimeout(() => {\n finish();\n }, timeoutMs);\n\n signal.addEventListener('abort', onAbort, { once: true });\n\n if (signal.aborted) {\n finish();\n }\n });\n}\n\nconst ABORT_TAG: unique symbol = Symbol('aborted');\n\n/**\n * @internal\n *\n * Waits for a promise to resolve or an abort signal to be triggered, whichever comes first.\n *\n * If the promise resolves first, returns an object with status 'ok' and the resolved value.\n * If the abort signal is triggered first, returns an object with status 'aborted'.\n *\n * @param awaitable - The promise to wait for.\n * @param signal - The AbortSignal to listen for abort events.\n * @returns A promise that resolves to an object indicating whether the operation was aborted or completed successfully.\n *\n * @throws Any error thrown by the awaitable promise will be propagated to the caller.\n *\n * @example\n * ```ts\n * const ac = new AbortController();\n * const result = await awaitOrAbort(someAsyncOperation(), ac.signal);\n *\n * if (result.status === 'aborted') {\n * console.log('Operation was aborted');\n * } else {\n * console.log('Operation completed with value:', result.value);\n * }\n * ```\n */\nexport async function awaitOrAbort<T>(\n awaitable: Promise<T>,\n signal: AbortSignal,\n): Promise<{ status: 'aborted' } | { status: 'ok'; value: T }> {\n const maybeAwaitable = await Promise.race([\n awaitable,\n new Promise<typeof ABORT_TAG>((resolve) => {\n signal.addEventListener('abort', () => resolve(ABORT_TAG), { once: true });\n }),\n ]);\n\n if (maybeAwaitable === ABORT_TAG || signal.aborted) {\n return { status: 'aborted' };\n }\n\n return { status: 'ok', value: maybeAwaitable };\n}\n\n/**\n * Build a `FailedTransfer` from a quote.\n *\n * Centralises the boilerplate that every transfer-service handler repeats\n * when it needs to return a failed transfer before a source tx is recorded.\n */\nexport function makeFailedTransferFromQuote(\n quote: Quote,\n options: {\n environment: Environment;\n errorCode: ErrorCode;\n errorReason: string;\n },\n): FailedTransfer {\n return {\n amountIn: quote.amountIn,\n amountOut: quote.amountOut,\n environment: options.environment,\n errorCode: options.errorCode,\n errorReason: options.errorReason,\n failedAtMs: Date.now(),\n fees: quote.fees,\n fromAddress: quote.fromAddress,\n id: quote.id,\n partnerFeeBps: quote.partnerFeeBps,\n sourceAsset: quote.assetIn,\n sourceChain: quote.sourceChain,\n status: 'failed',\n targetAsset: quote.assetOut,\n targetChain: quote.targetChain,\n toAddress: quote.toAddress,\n type: quote.serviceType,\n };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"_utils.cjs","names":["splitCaip2ChainId","InvalidParamsError","publicActions"],"sources":["../../src/transfer-service/_utils.ts"],"sourcesContent":["/**\n * @module\n * @internal\n *\n * Internal utility functions for transfer services.\n */\nimport {\n createSolanaRpc,\n isSolanaError,\n SOLANA_ERROR__BLOCK_HEIGHT_EXCEEDED,\n SOLANA_ERROR__JSON_RPC__SERVER_ERROR_NODE_UNHEALTHY,\n SOLANA_ERROR__RPC__TRANSPORT_HTTP_ERROR,\n type Rpc,\n type SolanaRpcApi,\n} from '@solana/kit';\nimport {\n createWalletClient,\n http,\n publicActions,\n WaitForTransactionReceiptTimeoutError,\n type Client,\n type HttpTransport,\n type PublicActions,\n type Chain as ViemChain,\n type WalletRpcSchema,\n} from 'viem';\nimport { splitCaip2ChainId } from '../utils/caip';\nimport type { Environment } from '../constants';\nimport { ErrorCode, InvalidParamsError } from '../errors';\nimport type { Chain } from '../types/chain';\nimport type { Quote } from '../types/quote';\nimport type { FailedTransfer } from '../types/transfer';\n\nfunction getViemChain(chain: Chain): ViemChain {\n const { namespace, reference: chainId } = splitCaip2ChainId(chain.chainId);\n\n if (namespace !== 'eip155') {\n throw new InvalidParamsError(\n 'Can not get Viem chain for unsupported chain',\n `Unsupported chain namespace: ${namespace}. Only eip155 chains are supported.`,\n );\n }\n\n return {\n id: Number(chainId),\n name: chain.chainName,\n nativeCurrency: {\n decimals: chain.networkToken.decimals,\n symbol: chain.networkToken.symbol,\n name: chain.networkToken.name,\n },\n rpcUrls: {\n default: {\n http: [chain.rpcUrl],\n },\n public: {\n http: [chain.rpcUrl],\n },\n },\n ...(chain.utilityAddresses?.multicall && {\n contracts: {\n multicall3: {\n address: chain.utilityAddresses.multicall,\n },\n },\n }),\n };\n}\n\nexport function getEvmClientForChain({\n chain,\n}: {\n chain: Chain;\n}): Client<HttpTransport, ViemChain, undefined, WalletRpcSchema, PublicActions> {\n const chainInfo = getViemChain(chain);\n\n const transport = http(chain.rpcUrl, {\n batch: true,\n retryCount: 6,\n retryDelay: 200,\n timeout: 15_000,\n });\n\n const client = createWalletClient({\n chain: chainInfo,\n transport,\n }).extend(publicActions);\n\n return client;\n}\n\nexport function getSolanaRpcForChain({ chain }: { chain: Chain }): Rpc<SolanaRpcApi> {\n return createSolanaRpc(chain.rpcUrl);\n}\n\nexport function applyFeeUnitsBpsMargin(feeUnits: bigint, feeUnitsMarginBps: number | undefined): bigint {\n if (feeUnitsMarginBps === undefined) {\n return feeUnits;\n }\n\n if (!Number.isInteger(feeUnitsMarginBps) || feeUnitsMarginBps < 0) {\n throw new InvalidParamsError(\n 'Invalid feeUnitsMarginBps',\n `feeUnitsMarginBps must be a non-negative integer, but got ${feeUnitsMarginBps}`,\n );\n }\n\n return (feeUnits * BigInt(10_000 + feeUnitsMarginBps)) / 10_000n;\n}\n\nexport function scaleAmount(amount: bigint, multiplier: number, precisionFactor = 1_000_000): bigint {\n // Verify precisionFactor is a positive integer\n if (!Number.isInteger(precisionFactor) || precisionFactor <= 0) {\n throw new Error('precisionFactor must be a positive integer');\n }\n\n return (amount * BigInt(multiplier * precisionFactor)) / BigInt(precisionFactor);\n}\n\n/**\n * Subtracts the partner fee from the given amount.\n *\n * @param amount - The original amount.\n * @param partnerFeeBps - Fee in basis points (1 bps = 0.01%)\n * @returns The amount after subtracting the partner fee.\n *\n * @throws {Error} If partnerFeeBps is not an integer or is out of range.\n */\nexport function subtractPartnerFee(amount: bigint, partnerFeeBps: number): bigint {\n if (!Number.isInteger(partnerFeeBps)) {\n throw new Error('partnerFeeBps must be an integer');\n }\n\n if (partnerFeeBps < 0 || partnerFeeBps > 10_000) {\n throw new Error('partnerFeeBps must be between 0 and 10,000');\n }\n\n return (amount * BigInt(10_000 - partnerFeeBps)) / 10_000n;\n}\n\n/**\n * Calculates the fee percentage given an input amount and a fee amount.\n *\n * @param inputAmount - The original input amount.\n * @param feeAmount - The fee amount to be calculated as a percentage of the input amount.\n * @returns An object containing the fee percentage and the number of decimal places.\n *\n * @throws {Error} If inputAmount is less than or equal to zero, or if feeAmount is negative.\n */\nexport function calculateFeePercentage(\n inputAmount: bigint,\n feeAmount: bigint,\n): { feePercentage: number; feePercentageDecimals: number } {\n if (inputAmount <= 0n) {\n throw new Error('Input amount must be greater than zero');\n }\n\n if (feeAmount < 0n) {\n throw new Error('Fee amount must be >= zero');\n }\n\n if (feeAmount === 0n) {\n return { feePercentage: 0, feePercentageDecimals: 0 };\n }\n\n const MAX_DECIMALS = 18;\n\n for (let decimals = 0; decimals <= MAX_DECIMALS; decimals++) {\n const scale = 10n ** BigInt(decimals);\n const numerator = feeAmount * 100n * scale;\n\n if (numerator % inputAmount === 0n) {\n const value = numerator / inputAmount;\n\n if (value > BigInt(Number.MAX_SAFE_INTEGER)) {\n throw new Error('feePercentage exceeds Number.MAX_SAFE_INTEGER');\n }\n\n return {\n feePercentage: Number(value),\n feePercentageDecimals: decimals,\n };\n }\n }\n\n // Fallback: highest precision, truncated\n const scale = 10n ** BigInt(MAX_DECIMALS);\n const value = (feeAmount * 100n * scale) / inputAmount;\n\n if (value > BigInt(Number.MAX_SAFE_INTEGER)) {\n throw new Error('feePercentage exceeds Number.MAX_SAFE_INTEGER');\n }\n\n return {\n feePercentage: Number(value),\n feePercentageDecimals: MAX_DECIMALS,\n };\n}\n\n/**\n * Maps Viem errors to corresponding ErrorCode values.\n *\n * @param error - The error thrown by Viem.\n * @returns The corresponding ErrorCode.\n */\nexport function getErrorCodeForViemError(error: unknown): ErrorCode {\n if (error instanceof WaitForTransactionReceiptTimeoutError) {\n return ErrorCode.TIMEOUT;\n }\n\n return ErrorCode.TRANSACTION_REVERTED;\n}\n\n/**\n * Maps `@solana/kit` errors to SDK ErrorCode values.\n *\n * `@solana/kit` throws typed `SolanaError` instances with numeric codes.\n * We use the `isSolanaError` type guard to match specific codes:\n *\n * - Transport / node-health errors → SERVICE_NOT_AVAILABLE\n * (HTTP transport failures, node-unhealthy JSON-RPC responses)\n *\n * - Block-height exceeded → TIMEOUT\n * (the transaction's blockhash has expired — the 150-slot validity\n * window has passed and the tx can no longer land)\n *\n * - Everything else → UNKNOWN\n * (unexpected JSON-RPC errors, malformed responses, internal errors, etc.)\n */\nexport function getErrorCodeForSolanaRpcError(error: unknown): ErrorCode {\n if (\n isSolanaError(error, SOLANA_ERROR__JSON_RPC__SERVER_ERROR_NODE_UNHEALTHY) ||\n isSolanaError(error, SOLANA_ERROR__RPC__TRANSPORT_HTTP_ERROR)\n ) {\n return ErrorCode.SERVICE_NOT_AVAILABLE;\n }\n\n if (isSolanaError(error, SOLANA_ERROR__BLOCK_HEIGHT_EXCEEDED)) {\n return ErrorCode.TIMEOUT;\n }\n\n return ErrorCode.UNKNOWN;\n}\n\n/**\n * Waits for either a timeout to elapse or an abort signal to be triggered.\n *\n * @param timeoutMs - The timeout duration in milliseconds.\n * @param signal - The AbortSignal to listen for abort events.\n *\n * @returns A promise that resolves when either the timeout elapses or the abort signal is triggered.\n */\nexport function waitForTimeoutOrAbort({\n timeoutMs,\n signal,\n}: Readonly<{\n timeoutMs: number;\n signal: AbortSignal;\n}>): Promise<void> {\n return new Promise((resolve) => {\n let settled = false;\n\n const finish = (): void => {\n if (settled) {\n return;\n }\n\n settled = true;\n clearTimeout(timeoutId);\n signal.removeEventListener('abort', onAbort);\n resolve();\n };\n\n const onAbort = (): void => {\n finish();\n };\n\n const timeoutId = setTimeout(() => {\n finish();\n }, timeoutMs);\n\n signal.addEventListener('abort', onAbort, { once: true });\n\n if (signal.aborted) {\n finish();\n }\n });\n}\n\nconst ABORT_TAG: unique symbol = Symbol('aborted');\n\n/**\n * @internal\n *\n * Waits for a promise to resolve or an abort signal to be triggered, whichever comes first.\n *\n * If the promise resolves first, returns an object with status 'ok' and the resolved value.\n * If the abort signal is triggered first, returns an object with status 'aborted'.\n *\n * @param awaitable - The promise to wait for.\n * @param signal - The AbortSignal to listen for abort events.\n * @returns A promise that resolves to an object indicating whether the operation was aborted or completed successfully.\n *\n * @throws Any error thrown by the awaitable promise will be propagated to the caller.\n *\n * @example\n * ```ts\n * const ac = new AbortController();\n * const result = await awaitOrAbort(someAsyncOperation(), ac.signal);\n *\n * if (result.status === 'aborted') {\n * console.log('Operation was aborted');\n * } else {\n * console.log('Operation completed with value:', result.value);\n * }\n * ```\n */\nexport async function awaitOrAbort<T>(\n awaitable: Promise<T>,\n signal: AbortSignal,\n): Promise<{ status: 'aborted' } | { status: 'ok'; value: T }> {\n const maybeAwaitable = await Promise.race([\n awaitable,\n new Promise<typeof ABORT_TAG>((resolve) => {\n signal.addEventListener('abort', () => resolve(ABORT_TAG), { once: true });\n }),\n ]);\n\n if (maybeAwaitable === ABORT_TAG || signal.aborted) {\n return { status: 'aborted' };\n }\n\n return { status: 'ok', value: maybeAwaitable };\n}\n\n/**\n * Build a `FailedTransfer` from a quote.\n *\n * Centralises the boilerplate that every transfer-service handler repeats\n * when it needs to return a failed transfer before a source tx is recorded.\n */\nexport function makeFailedTransferFromQuote(\n quote: Quote,\n options: {\n environment: Environment;\n errorCode: ErrorCode;\n errorReason: string;\n },\n): FailedTransfer {\n return {\n amountIn: quote.amountIn,\n amountOut: quote.amountOut,\n environment: options.environment,\n errorCode: options.errorCode,\n errorReason: options.errorReason,\n failedAtMs: Date.now(),\n fees: quote.fees,\n fromAddress: quote.fromAddress,\n id: quote.id,\n partnerFeeBps: quote.partnerFeeBps,\n sourceAsset: quote.assetIn,\n sourceChain: quote.sourceChain,\n status: 'failed',\n targetAsset: quote.assetOut,\n targetChain: quote.targetChain,\n toAddress: quote.toAddress,\n type: quote.serviceType,\n };\n}\n"],"mappings":"4JAiCA,SAAS,EAAa,EAAyB,CAC7C,GAAM,CAAE,YAAW,UAAW,GAAYA,EAAAA,kBAAkB,EAAM,QAAQ,CAE1E,GAAI,IAAc,SAChB,MAAM,IAAIC,EAAAA,mBACR,+CACA,gCAAgC,EAAU,qCAC3C,CAGH,MAAO,CACL,GAAI,OAAO,EAAQ,CACnB,KAAM,EAAM,UACZ,eAAgB,CACd,SAAU,EAAM,aAAa,SAC7B,OAAQ,EAAM,aAAa,OAC3B,KAAM,EAAM,aAAa,KAC1B,CACD,QAAS,CACP,QAAS,CACP,KAAM,CAAC,EAAM,OAAO,CACrB,CACD,OAAQ,CACN,KAAM,CAAC,EAAM,OAAO,CACrB,CACF,CACD,GAAI,EAAM,kBAAkB,WAAa,CACvC,UAAW,CACT,WAAY,CACV,QAAS,EAAM,iBAAiB,UACjC,CACF,CACF,CACF,CAGH,SAAgB,EAAqB,CACnC,SAG8E,CAe9E,OAAA,EAAA,EAAA,oBALkC,CAChC,MAVgB,EAAa,EAAM,CAWnC,WAAA,EAAA,EAAA,MATqB,EAAM,OAAQ,CACnC,MAAO,GACP,WAAY,EACZ,WAAY,IACZ,QAAS,KACV,CAAC,CAKD,CAAC,CAAC,OAAOC,EAAAA,cAAc,CAK1B,SAAgB,EAAqB,CAAE,SAA8C,CACnF,OAAA,EAAA,EAAA,iBAAuB,EAAM,OAAO,CAGtC,SAAgB,EAAuB,EAAkB,EAA+C,CACtG,GAAI,IAAsB,IAAA,GACxB,OAAO,EAGT,GAAI,CAAC,OAAO,UAAU,EAAkB,EAAI,EAAoB,EAC9D,MAAM,IAAID,EAAAA,mBACR,4BACA,6DAA6D,IAC9D,CAGH,OAAQ,EAAW,OAAO,IAAS,EAAkB,CAAI,OAiJ3D,SAAgB,EAAsB,CACpC,YACA,UAIiB,CACjB,OAAO,IAAI,QAAS,GAAY,CAC9B,IAAI,EAAU,GAER,MAAqB,CACrB,IAIJ,EAAU,GACV,aAAa,EAAU,CACvB,EAAO,oBAAoB,QAAS,EAAQ,CAC5C,GAAS,GAGL,MAAsB,CAC1B,GAAQ,EAGJ,EAAY,eAAiB,CACjC,GAAQ,EACP,EAAU,CAEb,EAAO,iBAAiB,QAAS,EAAS,CAAE,KAAM,GAAM,CAAC,CAErD,EAAO,SACT,GAAQ,EAEV,CAGJ,MAAM,EAA2B,OAAO,UAAU,CA4BlD,eAAsB,EACpB,EACA,EAC6D,CAC7D,IAAM,EAAiB,MAAM,QAAQ,KAAK,CACxC,EACA,IAAI,QAA2B,GAAY,CACzC,EAAO,iBAAiB,YAAe,EAAQ,EAAU,CAAE,CAAE,KAAM,GAAM,CAAC,EAC1E,CACH,CAAC,CAMF,OAJI,IAAmB,GAAa,EAAO,QAClC,CAAE,OAAQ,UAAW,CAGvB,CAAE,OAAQ,KAAM,MAAO,EAAgB,CAShD,SAAgB,EACd,EACA,EAKgB,CAChB,MAAO,CACL,SAAU,EAAM,SAChB,UAAW,EAAM,UACjB,YAAa,EAAQ,YACrB,UAAW,EAAQ,UACnB,YAAa,EAAQ,YACrB,WAAY,KAAK,KAAK,CACtB,KAAM,EAAM,KACZ,YAAa,EAAM,YACnB,GAAI,EAAM,GACV,cAAe,EAAM,cACrB,YAAa,EAAM,QACnB,YAAa,EAAM,YACnB,OAAQ,SACR,YAAa,EAAM,SACnB,YAAa,EAAM,YACnB,UAAW,EAAM,UACjB,KAAM,EAAM,YACb"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{InvalidParamsError as e}from"../errors.js";import{splitCaip2ChainId as t}from"../utils/caip.js";import{createWalletClient as n,http as r,publicActions as i}from"viem";import{createSolanaRpc as a}from"@solana/kit";function o(n){let{namespace:r,reference:i}=t(n.chainId);if(r!==`eip155`)throw new e(`Can not get Viem chain for unsupported chain`,`Unsupported chain namespace: ${r}. Only eip155 chains are supported.`);return{id:Number(i),name:n.chainName,nativeCurrency:{decimals:n.networkToken.decimals,symbol:n.networkToken.symbol,name:n.networkToken.name},rpcUrls:{default:{http:[n.rpcUrl]},public:{http:[n.rpcUrl]}},...n.utilityAddresses?.multicall&&{contracts:{multicall3:{address:n.utilityAddresses.multicall}}}}}function s({chain:e}){return n({chain:o(e),transport:r(e.rpcUrl,{batch:!0,retryCount:6,retryDelay:200,timeout:15e3})}).extend(i)}function c({chain:e}){return a(e.rpcUrl)}function l(t,n){if(n===void 0)return t;if(!Number.isInteger(n)||n<0)throw new e(`Invalid feeUnitsMarginBps`,`feeUnitsMarginBps must be a non-negative integer, but got ${n}`);return t*BigInt(1e4+n)/10000n}function u({timeoutMs:e,signal:t}){return new Promise(n=>{let r=!1,i=()=>{r||(r=!0,clearTimeout(o),t.removeEventListener(`abort`,a),n())},a=()=>{i()},o=setTimeout(()=>{i()},e);t.addEventListener(`abort`,a,{once:!0}),t.aborted&&i()})}const d=Symbol(`aborted`);async function f(e,t){let n=await Promise.race([e,new Promise(e=>{t.addEventListener(`abort`,()=>e(d),{once:!0})})]);return n===d||t.aborted?{status:`aborted`}:{status:`ok`,value:n}}function p(e,t){return{amountIn:e.amountIn,amountOut:e.amountOut,environment:t.environment,errorCode:t.errorCode,errorReason:t.errorReason,failedAtMs:Date.now(),fees:e.fees,fromAddress:e.fromAddress,id:e.id,partnerFeeBps:e.partnerFeeBps,sourceAsset:e.assetIn,sourceChain:e.sourceChain,status:`failed`,targetAsset:e.assetOut,targetChain:e.targetChain,toAddress:e.toAddress,type:e.serviceType}}export{l as applyFeeUnitsBpsMargin,f as awaitOrAbort,s as getEvmClientForChain,c as getSolanaRpcForChain,p as makeFailedTransferFromQuote,u as waitForTimeoutOrAbort};
|
|
2
2
|
//# sourceMappingURL=_utils.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"_utils.js","names":[],"sources":["../../src/transfer-service/_utils.ts"],"sourcesContent":["/**\n * @module\n * @internal\n *\n * Internal utility functions for transfer services.\n */\nimport {\n createSolanaRpc,\n isSolanaError,\n SOLANA_ERROR__BLOCK_HEIGHT_EXCEEDED,\n SOLANA_ERROR__JSON_RPC__SERVER_ERROR_NODE_UNHEALTHY,\n SOLANA_ERROR__RPC__TRANSPORT_HTTP_ERROR,\n type Rpc,\n type SolanaRpcApi,\n} from '@solana/kit';\nimport {\n createWalletClient,\n http,\n publicActions,\n WaitForTransactionReceiptTimeoutError,\n type Client,\n type HttpTransport,\n type PublicActions,\n type Chain as ViemChain,\n type WalletRpcSchema,\n} from 'viem';\nimport { splitCaip2ChainId } from '../utils/caip';\nimport type { Environment } from '../constants';\nimport { ErrorCode, InvalidParamsError } from '../errors';\nimport type { Chain } from '../types/chain';\nimport type { Quote } from '../types/quote';\nimport type { FailedTransfer } from '../types/transfer';\n\nfunction getViemChain(chain: Chain): ViemChain {\n const { namespace, reference: chainId } = splitCaip2ChainId(chain.chainId);\n\n if (namespace !== 'eip155') {\n throw new InvalidParamsError(\n 'Can not get Viem chain for unsupported chain',\n `Unsupported chain namespace: ${namespace}. Only eip155 chains are supported.`,\n );\n }\n\n return {\n id: Number(chainId),\n name: chain.chainName,\n nativeCurrency: {\n decimals: chain.networkToken.decimals,\n symbol: chain.networkToken.symbol,\n name: chain.networkToken.name,\n },\n rpcUrls: {\n default: {\n http: [chain.rpcUrl],\n },\n public: {\n http: [chain.rpcUrl],\n },\n },\n ...(chain.utilityAddresses?.multicall && {\n contracts: {\n multicall3: {\n address: chain.utilityAddresses.multicall,\n },\n },\n }),\n };\n}\n\nexport function getEvmClientForChain({\n chain,\n}: {\n chain: Chain;\n}): Client<HttpTransport, ViemChain, undefined, WalletRpcSchema, PublicActions> {\n const chainInfo = getViemChain(chain);\n\n const transport = http(chain.rpcUrl, {\n batch: true,\n retryCount: 6,\n retryDelay: 200,\n timeout: 15_000,\n });\n\n const client = createWalletClient({\n chain: chainInfo,\n transport,\n }).extend(publicActions);\n\n return client;\n}\n\nexport function getSolanaRpcForChain({ chain }: { chain: Chain }): Rpc<SolanaRpcApi> {\n return createSolanaRpc(chain.rpcUrl);\n}\n\nexport function applyFeeUnitsBpsMargin(feeUnits: bigint, feeUnitsMarginBps: number | undefined): bigint {\n if (feeUnitsMarginBps === undefined) {\n return feeUnits;\n }\n\n if (!Number.isInteger(feeUnitsMarginBps) || feeUnitsMarginBps < 0) {\n throw new InvalidParamsError(\n 'Invalid feeUnitsMarginBps',\n `feeUnitsMarginBps must be a non-negative integer, but got ${feeUnitsMarginBps}`,\n );\n }\n\n return (feeUnits * BigInt(10_000 + feeUnitsMarginBps)) / 10_000n;\n}\n\nexport function scaleAmount(amount: bigint, multiplier: number, precisionFactor = 1_000_000): bigint {\n // Verify precisionFactor is a positive integer\n if (!Number.isInteger(precisionFactor) || precisionFactor <= 0) {\n throw new Error('precisionFactor must be a positive integer');\n }\n\n return (amount * BigInt(multiplier * precisionFactor)) / BigInt(precisionFactor);\n}\n\n/**\n * Subtracts the partner fee from the given amount.\n *\n * @param amount - The original amount.\n * @param partnerFeeBps - Fee in basis points (1 bps = 0.01%)\n * @returns The amount after subtracting the partner fee.\n *\n * @throws {Error} If partnerFeeBps is not an integer or is out of range.\n */\nexport function subtractPartnerFee(amount: bigint, partnerFeeBps: number): bigint {\n if (!Number.isInteger(partnerFeeBps)) {\n throw new Error('partnerFeeBps must be an integer');\n }\n\n if (partnerFeeBps < 0 || partnerFeeBps > 10_000) {\n throw new Error('partnerFeeBps must be between 0 and 10,000');\n }\n\n return (amount * BigInt(10_000 - partnerFeeBps)) / 10_000n;\n}\n\n/**\n * Calculates the fee percentage given an input amount and a fee amount.\n *\n * @param inputAmount - The original input amount.\n * @param feeAmount - The fee amount to be calculated as a percentage of the input amount.\n * @returns An object containing the fee percentage and the number of decimal places.\n *\n * @throws {Error} If inputAmount is less than or equal to zero, or if feeAmount is negative.\n */\nexport function calculateFeePercentage(\n inputAmount: bigint,\n feeAmount: bigint,\n): { feePercentage: number; feePercentageDecimals: number } {\n if (inputAmount <= 0n) {\n throw new Error('Input amount must be greater than zero');\n }\n\n if (feeAmount < 0n) {\n throw new Error('Fee amount must be >= zero');\n }\n\n if (feeAmount === 0n) {\n return { feePercentage: 0, feePercentageDecimals: 0 };\n }\n\n const MAX_DECIMALS = 18;\n\n for (let decimals = 0; decimals <= MAX_DECIMALS; decimals++) {\n const scale = 10n ** BigInt(decimals);\n const numerator = feeAmount * 100n * scale;\n\n if (numerator % inputAmount === 0n) {\n const value = numerator / inputAmount;\n\n if (value > BigInt(Number.MAX_SAFE_INTEGER)) {\n throw new Error('feePercentage exceeds Number.MAX_SAFE_INTEGER');\n }\n\n return {\n feePercentage: Number(value),\n feePercentageDecimals: decimals,\n };\n }\n }\n\n // Fallback: highest precision, truncated\n const scale = 10n ** BigInt(MAX_DECIMALS);\n const value = (feeAmount * 100n * scale) / inputAmount;\n\n if (value > BigInt(Number.MAX_SAFE_INTEGER)) {\n throw new Error('feePercentage exceeds Number.MAX_SAFE_INTEGER');\n }\n\n return {\n feePercentage: Number(value),\n feePercentageDecimals: MAX_DECIMALS,\n };\n}\n\n/**\n * Maps Viem errors to corresponding ErrorCode values.\n *\n * @param error - The error thrown by Viem.\n * @returns The corresponding ErrorCode.\n */\nexport function getErrorCodeForViemError(error: unknown): ErrorCode {\n if (error instanceof WaitForTransactionReceiptTimeoutError) {\n return ErrorCode.TIMEOUT;\n }\n\n return ErrorCode.TRANSACTION_REVERTED;\n}\n\n/**\n * Maps `@solana/kit` errors to SDK ErrorCode values.\n *\n * `@solana/kit` throws typed `SolanaError` instances with numeric codes.\n * We use the `isSolanaError` type guard to match specific codes:\n *\n * - Transport / node-health errors → SERVICE_NOT_AVAILABLE\n * (HTTP transport failures, node-unhealthy JSON-RPC responses)\n *\n * - Block-height exceeded → TIMEOUT\n * (the transaction's blockhash has expired — the 150-slot validity\n * window has passed and the tx can no longer land)\n *\n * - Everything else → UNKNOWN\n * (unexpected JSON-RPC errors, malformed responses, internal errors, etc.)\n */\nexport function getErrorCodeForSolanaRpcError(error: unknown): ErrorCode {\n if (\n isSolanaError(error, SOLANA_ERROR__JSON_RPC__SERVER_ERROR_NODE_UNHEALTHY) ||\n isSolanaError(error, SOLANA_ERROR__RPC__TRANSPORT_HTTP_ERROR)\n ) {\n return ErrorCode.SERVICE_NOT_AVAILABLE;\n }\n\n if (isSolanaError(error, SOLANA_ERROR__BLOCK_HEIGHT_EXCEEDED)) {\n return ErrorCode.TIMEOUT;\n }\n\n return ErrorCode.UNKNOWN;\n}\n\n/**\n * Waits for either a timeout to elapse or an abort signal to be triggered.\n *\n * @param timeoutMs - The timeout duration in milliseconds.\n * @param signal - The AbortSignal to listen for abort events.\n *\n * @returns A promise that resolves when either the timeout elapses or the abort signal is triggered.\n */\nexport function waitForTimeoutOrAbort({\n timeoutMs,\n signal,\n}: Readonly<{\n timeoutMs: number;\n signal: AbortSignal;\n}>): Promise<void> {\n return new Promise((resolve) => {\n let settled = false;\n\n const finish = (): void => {\n if (settled) {\n return;\n }\n\n settled = true;\n clearTimeout(timeoutId);\n signal.removeEventListener('abort', onAbort);\n resolve();\n };\n\n const onAbort = (): void => {\n finish();\n };\n\n const timeoutId = setTimeout(() => {\n finish();\n }, timeoutMs);\n\n signal.addEventListener('abort', onAbort, { once: true });\n\n if (signal.aborted) {\n finish();\n }\n });\n}\n\nconst ABORT_TAG: unique symbol = Symbol('aborted');\n\n/**\n * @internal\n *\n * Waits for a promise to resolve or an abort signal to be triggered, whichever comes first.\n *\n * If the promise resolves first, returns an object with status 'ok' and the resolved value.\n * If the abort signal is triggered first, returns an object with status 'aborted'.\n *\n * @param awaitable - The promise to wait for.\n * @param signal - The AbortSignal to listen for abort events.\n * @returns A promise that resolves to an object indicating whether the operation was aborted or completed successfully.\n *\n * @throws Any error thrown by the awaitable promise will be propagated to the caller.\n *\n * @example\n * ```ts\n * const ac = new AbortController();\n * const result = await awaitOrAbort(someAsyncOperation(), ac.signal);\n *\n * if (result.status === 'aborted') {\n * console.log('Operation was aborted');\n * } else {\n * console.log('Operation completed with value:', result.value);\n * }\n * ```\n */\nexport async function awaitOrAbort<T>(\n awaitable: Promise<T>,\n signal: AbortSignal,\n): Promise<{ status: 'aborted' } | { status: 'ok'; value: T }> {\n const maybeAwaitable = await Promise.race([\n awaitable,\n new Promise<typeof ABORT_TAG>((resolve) => {\n signal.addEventListener('abort', () => resolve(ABORT_TAG), { once: true });\n }),\n ]);\n\n if (maybeAwaitable === ABORT_TAG || signal.aborted) {\n return { status: 'aborted' };\n }\n\n return { status: 'ok', value: maybeAwaitable };\n}\n\n/**\n * Build a `FailedTransfer` from a quote.\n *\n * Centralises the boilerplate that every transfer-service handler repeats\n * when it needs to return a failed transfer before a source tx is recorded.\n */\nexport function makeFailedTransferFromQuote(\n quote: Quote,\n options: {\n environment: Environment;\n errorCode: ErrorCode;\n errorReason: string;\n },\n): FailedTransfer {\n return {\n amountIn: quote.amountIn,\n amountOut: quote.amountOut,\n environment: options.environment,\n errorCode: options.errorCode,\n errorReason: options.errorReason,\n failedAtMs: Date.now(),\n fees: quote.fees,\n fromAddress: quote.fromAddress,\n id: quote.id,\n partnerFeeBps: quote.partnerFeeBps,\n sourceAsset: quote.assetIn,\n sourceChain: quote.sourceChain,\n status: 'failed',\n targetAsset: quote.assetOut,\n targetChain: quote.targetChain,\n toAddress: quote.toAddress,\n type: quote.serviceType,\n };\n}\n"],"mappings":"wbAiCA,SAAS,EAAa,EAAyB,CAC7C,GAAM,CAAE,YAAW,UAAW,GAAY,EAAkB,EAAM,QAAQ,CAE1E,GAAI,IAAc,SAChB,MAAM,IAAI,EACR,+CACA,gCAAgC,EAAU,qCAC3C,CAGH,MAAO,CACL,GAAI,OAAO,EAAQ,CACnB,KAAM,EAAM,UACZ,eAAgB,CACd,SAAU,EAAM,aAAa,SAC7B,OAAQ,EAAM,aAAa,OAC3B,KAAM,EAAM,aAAa,KAC1B,CACD,QAAS,CACP,QAAS,CACP,KAAM,CAAC,EAAM,OAAO,CACrB,CACD,OAAQ,CACN,KAAM,CAAC,EAAM,OAAO,CACrB,CACF,CACD,GAAI,EAAM,kBAAkB,WAAa,CACvC,UAAW,CACT,WAAY,CACV,QAAS,EAAM,iBAAiB,UACjC,CACF,CACF,CACF,CAGH,SAAgB,EAAqB,CACnC,SAG8E,CAe9E,OALe,EAAmB,CAChC,MAVgB,EAAa,EAAM,CAWnC,UATgB,EAAK,EAAM,OAAQ,CACnC,MAAO,GACP,WAAY,EACZ,WAAY,IACZ,QAAS,KACV,CAAC,CAKD,CAAC,CAAC,OAAO,EAAc,CAK1B,SAAgB,EAAqB,CAAE,SAA8C,CACnF,OAAO,EAAgB,EAAM,OAAO,CAGtC,SAAgB,EAAuB,EAAkB,EAA+C,CACtG,GAAI,IAAsB,IAAA,GACxB,OAAO,EAGT,GAAI,CAAC,OAAO,UAAU,EAAkB,EAAI,EAAoB,EAC9D,MAAM,IAAI,EACR,4BACA,6DAA6D,IAC9D,CAGH,OAAQ,EAAW,OAAO,IAAS,EAAkB,CAAI,OAkG3D,SAAgB,EAAyB,EAA2B,CAKlE,OAJI,aAAiB,EACZ,EAAU,QAGZ,EAAU,qBAmBnB,SAAgB,EAA8B,EAA2B,CAYvE,OAVE,EAAc,EAAO,EAAoD,EACzE,EAAc,EAAO,EAAwC,CAEtD,EAAU,sBAGf,EAAc,EAAO,EAAoC,CACpD,EAAU,QAGZ,EAAU,QAWnB,SAAgB,EAAsB,CACpC,YACA,UAIiB,CACjB,OAAO,IAAI,QAAS,GAAY,CAC9B,IAAI,EAAU,GAER,MAAqB,CACrB,IAIJ,EAAU,GACV,aAAa,EAAU,CACvB,EAAO,oBAAoB,QAAS,EAAQ,CAC5C,GAAS,GAGL,MAAsB,CAC1B,GAAQ,EAGJ,EAAY,eAAiB,CACjC,GAAQ,EACP,EAAU,CAEb,EAAO,iBAAiB,QAAS,EAAS,CAAE,KAAM,GAAM,CAAC,CAErD,EAAO,SACT,GAAQ,EAEV,CAGJ,MAAM,EAA2B,OAAO,UAAU,CA4BlD,eAAsB,EACpB,EACA,EAC6D,CAC7D,IAAM,EAAiB,MAAM,QAAQ,KAAK,CACxC,EACA,IAAI,QAA2B,GAAY,CACzC,EAAO,iBAAiB,YAAe,EAAQ,EAAU,CAAE,CAAE,KAAM,GAAM,CAAC,EAC1E,CACH,CAAC,CAMF,OAJI,IAAmB,GAAa,EAAO,QAClC,CAAE,OAAQ,UAAW,CAGvB,CAAE,OAAQ,KAAM,MAAO,EAAgB,CAShD,SAAgB,EACd,EACA,EAKgB,CAChB,MAAO,CACL,SAAU,EAAM,SAChB,UAAW,EAAM,UACjB,YAAa,EAAQ,YACrB,UAAW,EAAQ,UACnB,YAAa,EAAQ,YACrB,WAAY,KAAK,KAAK,CACtB,KAAM,EAAM,KACZ,YAAa,EAAM,YACnB,GAAI,EAAM,GACV,cAAe,EAAM,cACrB,YAAa,EAAM,QACnB,YAAa,EAAM,YACnB,OAAQ,SACR,YAAa,EAAM,SACnB,YAAa,EAAM,YACnB,UAAW,EAAM,UACjB,KAAM,EAAM,YACb"}
|
|
1
|
+
{"version":3,"file":"_utils.js","names":[],"sources":["../../src/transfer-service/_utils.ts"],"sourcesContent":["/**\n * @module\n * @internal\n *\n * Internal utility functions for transfer services.\n */\nimport {\n createSolanaRpc,\n isSolanaError,\n SOLANA_ERROR__BLOCK_HEIGHT_EXCEEDED,\n SOLANA_ERROR__JSON_RPC__SERVER_ERROR_NODE_UNHEALTHY,\n SOLANA_ERROR__RPC__TRANSPORT_HTTP_ERROR,\n type Rpc,\n type SolanaRpcApi,\n} from '@solana/kit';\nimport {\n createWalletClient,\n http,\n publicActions,\n WaitForTransactionReceiptTimeoutError,\n type Client,\n type HttpTransport,\n type PublicActions,\n type Chain as ViemChain,\n type WalletRpcSchema,\n} from 'viem';\nimport { splitCaip2ChainId } from '../utils/caip';\nimport type { Environment } from '../constants';\nimport { ErrorCode, InvalidParamsError } from '../errors';\nimport type { Chain } from '../types/chain';\nimport type { Quote } from '../types/quote';\nimport type { FailedTransfer } from '../types/transfer';\n\nfunction getViemChain(chain: Chain): ViemChain {\n const { namespace, reference: chainId } = splitCaip2ChainId(chain.chainId);\n\n if (namespace !== 'eip155') {\n throw new InvalidParamsError(\n 'Can not get Viem chain for unsupported chain',\n `Unsupported chain namespace: ${namespace}. Only eip155 chains are supported.`,\n );\n }\n\n return {\n id: Number(chainId),\n name: chain.chainName,\n nativeCurrency: {\n decimals: chain.networkToken.decimals,\n symbol: chain.networkToken.symbol,\n name: chain.networkToken.name,\n },\n rpcUrls: {\n default: {\n http: [chain.rpcUrl],\n },\n public: {\n http: [chain.rpcUrl],\n },\n },\n ...(chain.utilityAddresses?.multicall && {\n contracts: {\n multicall3: {\n address: chain.utilityAddresses.multicall,\n },\n },\n }),\n };\n}\n\nexport function getEvmClientForChain({\n chain,\n}: {\n chain: Chain;\n}): Client<HttpTransport, ViemChain, undefined, WalletRpcSchema, PublicActions> {\n const chainInfo = getViemChain(chain);\n\n const transport = http(chain.rpcUrl, {\n batch: true,\n retryCount: 6,\n retryDelay: 200,\n timeout: 15_000,\n });\n\n const client = createWalletClient({\n chain: chainInfo,\n transport,\n }).extend(publicActions);\n\n return client;\n}\n\nexport function getSolanaRpcForChain({ chain }: { chain: Chain }): Rpc<SolanaRpcApi> {\n return createSolanaRpc(chain.rpcUrl);\n}\n\nexport function applyFeeUnitsBpsMargin(feeUnits: bigint, feeUnitsMarginBps: number | undefined): bigint {\n if (feeUnitsMarginBps === undefined) {\n return feeUnits;\n }\n\n if (!Number.isInteger(feeUnitsMarginBps) || feeUnitsMarginBps < 0) {\n throw new InvalidParamsError(\n 'Invalid feeUnitsMarginBps',\n `feeUnitsMarginBps must be a non-negative integer, but got ${feeUnitsMarginBps}`,\n );\n }\n\n return (feeUnits * BigInt(10_000 + feeUnitsMarginBps)) / 10_000n;\n}\n\nexport function scaleAmount(amount: bigint, multiplier: number, precisionFactor = 1_000_000): bigint {\n // Verify precisionFactor is a positive integer\n if (!Number.isInteger(precisionFactor) || precisionFactor <= 0) {\n throw new Error('precisionFactor must be a positive integer');\n }\n\n return (amount * BigInt(multiplier * precisionFactor)) / BigInt(precisionFactor);\n}\n\n/**\n * Subtracts the partner fee from the given amount.\n *\n * @param amount - The original amount.\n * @param partnerFeeBps - Fee in basis points (1 bps = 0.01%)\n * @returns The amount after subtracting the partner fee.\n *\n * @throws {Error} If partnerFeeBps is not an integer or is out of range.\n */\nexport function subtractPartnerFee(amount: bigint, partnerFeeBps: number): bigint {\n if (!Number.isInteger(partnerFeeBps)) {\n throw new Error('partnerFeeBps must be an integer');\n }\n\n if (partnerFeeBps < 0 || partnerFeeBps > 10_000) {\n throw new Error('partnerFeeBps must be between 0 and 10,000');\n }\n\n return (amount * BigInt(10_000 - partnerFeeBps)) / 10_000n;\n}\n\n/**\n * Calculates the fee percentage given an input amount and a fee amount.\n *\n * @param inputAmount - The original input amount.\n * @param feeAmount - The fee amount to be calculated as a percentage of the input amount.\n * @returns An object containing the fee percentage and the number of decimal places.\n *\n * @throws {Error} If inputAmount is less than or equal to zero, or if feeAmount is negative.\n */\nexport function calculateFeePercentage(\n inputAmount: bigint,\n feeAmount: bigint,\n): { feePercentage: number; feePercentageDecimals: number } {\n if (inputAmount <= 0n) {\n throw new Error('Input amount must be greater than zero');\n }\n\n if (feeAmount < 0n) {\n throw new Error('Fee amount must be >= zero');\n }\n\n if (feeAmount === 0n) {\n return { feePercentage: 0, feePercentageDecimals: 0 };\n }\n\n const MAX_DECIMALS = 18;\n\n for (let decimals = 0; decimals <= MAX_DECIMALS; decimals++) {\n const scale = 10n ** BigInt(decimals);\n const numerator = feeAmount * 100n * scale;\n\n if (numerator % inputAmount === 0n) {\n const value = numerator / inputAmount;\n\n if (value > BigInt(Number.MAX_SAFE_INTEGER)) {\n throw new Error('feePercentage exceeds Number.MAX_SAFE_INTEGER');\n }\n\n return {\n feePercentage: Number(value),\n feePercentageDecimals: decimals,\n };\n }\n }\n\n // Fallback: highest precision, truncated\n const scale = 10n ** BigInt(MAX_DECIMALS);\n const value = (feeAmount * 100n * scale) / inputAmount;\n\n if (value > BigInt(Number.MAX_SAFE_INTEGER)) {\n throw new Error('feePercentage exceeds Number.MAX_SAFE_INTEGER');\n }\n\n return {\n feePercentage: Number(value),\n feePercentageDecimals: MAX_DECIMALS,\n };\n}\n\n/**\n * Maps Viem errors to corresponding ErrorCode values.\n *\n * @param error - The error thrown by Viem.\n * @returns The corresponding ErrorCode.\n */\nexport function getErrorCodeForViemError(error: unknown): ErrorCode {\n if (error instanceof WaitForTransactionReceiptTimeoutError) {\n return ErrorCode.TIMEOUT;\n }\n\n return ErrorCode.TRANSACTION_REVERTED;\n}\n\n/**\n * Maps `@solana/kit` errors to SDK ErrorCode values.\n *\n * `@solana/kit` throws typed `SolanaError` instances with numeric codes.\n * We use the `isSolanaError` type guard to match specific codes:\n *\n * - Transport / node-health errors → SERVICE_NOT_AVAILABLE\n * (HTTP transport failures, node-unhealthy JSON-RPC responses)\n *\n * - Block-height exceeded → TIMEOUT\n * (the transaction's blockhash has expired — the 150-slot validity\n * window has passed and the tx can no longer land)\n *\n * - Everything else → UNKNOWN\n * (unexpected JSON-RPC errors, malformed responses, internal errors, etc.)\n */\nexport function getErrorCodeForSolanaRpcError(error: unknown): ErrorCode {\n if (\n isSolanaError(error, SOLANA_ERROR__JSON_RPC__SERVER_ERROR_NODE_UNHEALTHY) ||\n isSolanaError(error, SOLANA_ERROR__RPC__TRANSPORT_HTTP_ERROR)\n ) {\n return ErrorCode.SERVICE_NOT_AVAILABLE;\n }\n\n if (isSolanaError(error, SOLANA_ERROR__BLOCK_HEIGHT_EXCEEDED)) {\n return ErrorCode.TIMEOUT;\n }\n\n return ErrorCode.UNKNOWN;\n}\n\n/**\n * Waits for either a timeout to elapse or an abort signal to be triggered.\n *\n * @param timeoutMs - The timeout duration in milliseconds.\n * @param signal - The AbortSignal to listen for abort events.\n *\n * @returns A promise that resolves when either the timeout elapses or the abort signal is triggered.\n */\nexport function waitForTimeoutOrAbort({\n timeoutMs,\n signal,\n}: Readonly<{\n timeoutMs: number;\n signal: AbortSignal;\n}>): Promise<void> {\n return new Promise((resolve) => {\n let settled = false;\n\n const finish = (): void => {\n if (settled) {\n return;\n }\n\n settled = true;\n clearTimeout(timeoutId);\n signal.removeEventListener('abort', onAbort);\n resolve();\n };\n\n const onAbort = (): void => {\n finish();\n };\n\n const timeoutId = setTimeout(() => {\n finish();\n }, timeoutMs);\n\n signal.addEventListener('abort', onAbort, { once: true });\n\n if (signal.aborted) {\n finish();\n }\n });\n}\n\nconst ABORT_TAG: unique symbol = Symbol('aborted');\n\n/**\n * @internal\n *\n * Waits for a promise to resolve or an abort signal to be triggered, whichever comes first.\n *\n * If the promise resolves first, returns an object with status 'ok' and the resolved value.\n * If the abort signal is triggered first, returns an object with status 'aborted'.\n *\n * @param awaitable - The promise to wait for.\n * @param signal - The AbortSignal to listen for abort events.\n * @returns A promise that resolves to an object indicating whether the operation was aborted or completed successfully.\n *\n * @throws Any error thrown by the awaitable promise will be propagated to the caller.\n *\n * @example\n * ```ts\n * const ac = new AbortController();\n * const result = await awaitOrAbort(someAsyncOperation(), ac.signal);\n *\n * if (result.status === 'aborted') {\n * console.log('Operation was aborted');\n * } else {\n * console.log('Operation completed with value:', result.value);\n * }\n * ```\n */\nexport async function awaitOrAbort<T>(\n awaitable: Promise<T>,\n signal: AbortSignal,\n): Promise<{ status: 'aborted' } | { status: 'ok'; value: T }> {\n const maybeAwaitable = await Promise.race([\n awaitable,\n new Promise<typeof ABORT_TAG>((resolve) => {\n signal.addEventListener('abort', () => resolve(ABORT_TAG), { once: true });\n }),\n ]);\n\n if (maybeAwaitable === ABORT_TAG || signal.aborted) {\n return { status: 'aborted' };\n }\n\n return { status: 'ok', value: maybeAwaitable };\n}\n\n/**\n * Build a `FailedTransfer` from a quote.\n *\n * Centralises the boilerplate that every transfer-service handler repeats\n * when it needs to return a failed transfer before a source tx is recorded.\n */\nexport function makeFailedTransferFromQuote(\n quote: Quote,\n options: {\n environment: Environment;\n errorCode: ErrorCode;\n errorReason: string;\n },\n): FailedTransfer {\n return {\n amountIn: quote.amountIn,\n amountOut: quote.amountOut,\n environment: options.environment,\n errorCode: options.errorCode,\n errorReason: options.errorReason,\n failedAtMs: Date.now(),\n fees: quote.fees,\n fromAddress: quote.fromAddress,\n id: quote.id,\n partnerFeeBps: quote.partnerFeeBps,\n sourceAsset: quote.assetIn,\n sourceChain: quote.sourceChain,\n status: 'failed',\n targetAsset: quote.assetOut,\n targetChain: quote.targetChain,\n toAddress: quote.toAddress,\n type: quote.serviceType,\n };\n}\n"],"mappings":"4NAiCA,SAAS,EAAa,EAAyB,CAC7C,GAAM,CAAE,YAAW,UAAW,GAAY,EAAkB,EAAM,QAAQ,CAE1E,GAAI,IAAc,SAChB,MAAM,IAAI,EACR,+CACA,gCAAgC,EAAU,qCAC3C,CAGH,MAAO,CACL,GAAI,OAAO,EAAQ,CACnB,KAAM,EAAM,UACZ,eAAgB,CACd,SAAU,EAAM,aAAa,SAC7B,OAAQ,EAAM,aAAa,OAC3B,KAAM,EAAM,aAAa,KAC1B,CACD,QAAS,CACP,QAAS,CACP,KAAM,CAAC,EAAM,OAAO,CACrB,CACD,OAAQ,CACN,KAAM,CAAC,EAAM,OAAO,CACrB,CACF,CACD,GAAI,EAAM,kBAAkB,WAAa,CACvC,UAAW,CACT,WAAY,CACV,QAAS,EAAM,iBAAiB,UACjC,CACF,CACF,CACF,CAGH,SAAgB,EAAqB,CACnC,SAG8E,CAe9E,OALe,EAAmB,CAChC,MAVgB,EAAa,EAAM,CAWnC,UATgB,EAAK,EAAM,OAAQ,CACnC,MAAO,GACP,WAAY,EACZ,WAAY,IACZ,QAAS,KACV,CAAC,CAKD,CAAC,CAAC,OAAO,EAAc,CAK1B,SAAgB,EAAqB,CAAE,SAA8C,CACnF,OAAO,EAAgB,EAAM,OAAO,CAGtC,SAAgB,EAAuB,EAAkB,EAA+C,CACtG,GAAI,IAAsB,IAAA,GACxB,OAAO,EAGT,GAAI,CAAC,OAAO,UAAU,EAAkB,EAAI,EAAoB,EAC9D,MAAM,IAAI,EACR,4BACA,6DAA6D,IAC9D,CAGH,OAAQ,EAAW,OAAO,IAAS,EAAkB,CAAI,OAiJ3D,SAAgB,EAAsB,CACpC,YACA,UAIiB,CACjB,OAAO,IAAI,QAAS,GAAY,CAC9B,IAAI,EAAU,GAER,MAAqB,CACrB,IAIJ,EAAU,GACV,aAAa,EAAU,CACvB,EAAO,oBAAoB,QAAS,EAAQ,CAC5C,GAAS,GAGL,MAAsB,CAC1B,GAAQ,EAGJ,EAAY,eAAiB,CACjC,GAAQ,EACP,EAAU,CAEb,EAAO,iBAAiB,QAAS,EAAS,CAAE,KAAM,GAAM,CAAC,CAErD,EAAO,SACT,GAAQ,EAEV,CAGJ,MAAM,EAA2B,OAAO,UAAU,CA4BlD,eAAsB,EACpB,EACA,EAC6D,CAC7D,IAAM,EAAiB,MAAM,QAAQ,KAAK,CACxC,EACA,IAAI,QAA2B,GAAY,CACzC,EAAO,iBAAiB,YAAe,EAAQ,EAAU,CAAE,CAAE,KAAM,GAAM,CAAC,EAC1E,CACH,CAAC,CAMF,OAJI,IAAmB,GAAa,EAAO,QAClC,CAAE,OAAQ,UAAW,CAGvB,CAAE,OAAQ,KAAM,MAAO,EAAgB,CAShD,SAAgB,EACd,EACA,EAKgB,CAChB,MAAO,CACL,SAAU,EAAM,SAChB,UAAW,EAAM,UACjB,YAAa,EAAQ,YACrB,UAAW,EAAQ,UACnB,YAAa,EAAQ,YACrB,WAAY,KAAK,KAAK,CACtB,KAAM,EAAM,KACZ,YAAa,EAAM,YACnB,GAAI,EAAM,GACV,cAAe,EAAM,cACrB,YAAa,EAAM,QACnB,YAAa,EAAM,YACnB,OAAQ,SACR,YAAa,EAAM,SACnB,YAAa,EAAM,YACnB,UAAW,EAAM,UACjB,KAAM,EAAM,YACb"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"_warden-config-schema.cjs","names":["z","Blockchain","EvmAddressSchema","BtcAddressSchema"],"sources":["../../src/transfer-service/_warden-config-schema.ts"],"sourcesContent":["import { z } from 'zod';\nimport { BtcAddressSchema, EvmAddressSchema } from './service-schemas';\nimport { Blockchain } from '../constants';\n\nconst BlockchainEnum = z.enum(Blockchain);\n\nconst AssetBase = z.object({\n tokenName: z.string(),\n nativeNetwork: BlockchainEnum,\n denomination: z.number(),\n});\n\nconst EthereumAssetConfig = AssetBase.extend({\n nativeContractAddress: EvmAddressSchema,\n wrappedContractAddress: EvmAddressSchema,\n wrappedNetwork: BlockchainEnum,\n});\n\nconst CriticalConfigBase = z.object({\n disableFrontend: z.boolean(),\n addressBlocklist: z.array(z.string()),\n});\n\nconst EthereumCriticalConfig = CriticalConfigBase.extend({\n assets: z.record(z.string(), EthereumAssetConfig), // key is token symbol\n networks: z.partialRecord(BlockchainEnum, z.union([z.number(), z.undefined()])),\n walletAddresses: z.partialRecord(BlockchainEnum, EvmAddressSchema),\n});\n\nconst EthereumNonCriticalConfigBase = z.object({\n minimumConfirmations: z.partialRecord(BlockchainEnum, z.optional(z.number())),\n});\n\nexport const DynamicFeeEstimation: z.ZodType<{\n feePercentage: number;\n feePercentageDecimals: number;\n maximumFeeAmount: bigint;\n minimumFeeAmount: bigint;\n}> = z.object({\n minimumFeeAmount: z.coerce.bigint().nonnegative(),\n maximumFeeAmount: z.coerce.bigint().nonnegative(),\n feePercentage: z.int().nonnegative(),\n feePercentageDecimals: z.int().nonnegative(),\n});\n\nconst EthereumDynamicFeeNonCriticalConfig = EthereumNonCriticalConfigBase.extend({\n unwrapFeeApproximation: z.record(z.string(), DynamicFeeEstimation),\n wrapFeeApproximation: z.record(z.string(), DynamicFeeEstimation),\n});\n\nconst EthereumDynamicFeeConfig = z.object({\n critical: EthereumCriticalConfig,\n nonCritical: EthereumDynamicFeeNonCriticalConfig,\n});\n\nconst BitcoinAssetConfig = z.object({\n tokenName: z.string(),\n bech32AddressPrefix: z.union([z.literal('tb'), z.literal('bc')]),\n wrappedContractAddress: EvmAddressSchema,\n wrappedNetwork: BlockchainEnum,\n});\n\nconst BitcoinCritical = CriticalConfigBase.extend({\n addressBlocklist: z.array(z.string()),\n avalancheChainId: z.number(),\n bitcoinAssets: z.record(z.string(), BitcoinAssetConfig), // key is token symbol\n walletAddresses: z.object({\n btc: BtcAddressSchema,\n avalanche: EvmAddressSchema,\n }),\n});\n\nconst BitcoinCurrentBridgeFeeEstimateDynamic = z.object({\n dustThreshold: z.number(),\n wrapFeeEstimate: z.object({\n minimumFeeAmount: z.string(),\n maximumFeeAmount: z.string(),\n feePercentage: z.number(),\n feePercentageDecimals: z.number(),\n }),\n unwrapFeeEstimate: z.object({\n bridgeToll: z.object({\n minimumFeeAmount: z.string(),\n maximumFeeAmount: z.string(),\n feePercentage: z.number(),\n feePercentageDecimals: z.number(),\n }),\n estimatedTxFee: z.object({\n constAmount: z.number(),\n numeratorPerSat: z.number(),\n denominatorPerSat: z.number(),\n }),\n }),\n});\n\nconst BitcoinCurrentBridgeFeeEstimateStatic = z.object({\n wrapFeeAmount: z.number(),\n constUnwrapFeeAmount: z.number(),\n unwrapFeeNumerator: z.number(),\n unwrapFeeDenominator: z.number(),\n dustThreshold: z.number(),\n});\n\nconst BitcoinNetworkInfo = z.object({\n minimumConfirmations: z.number(),\n minimumOnboardSize: z.number(),\n currentBridgeFeeEstimate: z.union([BitcoinCurrentBridgeFeeEstimateDynamic, BitcoinCurrentBridgeFeeEstimateStatic]),\n});\n\nconst BitcoinNonCritical = z.object({\n networkInfo: z.record(z.string(), BitcoinNetworkInfo).nullable(),\n});\n\n// BitcoinConfig supports both dynamic and static\nconst BitcoinConfig = z.object({\n criticalBitcoin: BitcoinCritical,\n nonCriticalBitcoin: BitcoinNonCritical,\n});\n\n/**\n * The schema for the Warden configuration used by the Unified Asset Transfer service.\n *\n * > [!NOTE]\n * >\n * > The typing for this schema is auto-generated and should not be manually edited.\n * > If changes are made to the schema, the typing must be regenerated.\n * >\n * > You can regenerate the typing by deleting the existing typing and using\n * > VS Code's quick fix feature to generate the new typing.\n * >\n * > This typing is necessary to satisfy the isolatedDeclarations TypeScript compiler option.\n *\n * > [!INFO]\n * >\n * > Warden bridge settings are updated every 15 seconds.\n */\nexport const WardenConfigSchema: z.ZodIntersection<\n z.ZodObject<\n {\n critical: z.ZodObject<\n {\n disableFrontend: z.ZodBoolean;\n addressBlocklist: z.ZodArray<z.ZodString>;\n assets: z.ZodRecord<\n z.ZodString,\n z.ZodObject<\n {\n tokenName: z.ZodString;\n nativeNetwork: z.ZodEnum<typeof Blockchain>;\n denomination: z.ZodNumber;\n nativeContractAddress: z.ZodType<\n `0x${string}`,\n unknown,\n z.core.$ZodTypeInternals<`0x${string}`, unknown>\n >;\n wrappedContractAddress: z.ZodType<\n `0x${string}`,\n unknown,\n z.core.$ZodTypeInternals<`0x${string}`, unknown>\n >;\n wrappedNetwork: z.ZodEnum<typeof Blockchain>;\n },\n z.core.$strip\n >\n >;\n networks: z.ZodRecord<\n z.ZodEnum<typeof Blockchain> & z.core.$partial,\n z.ZodUnion<readonly [z.ZodNumber, z.ZodUndefined]>\n >;\n walletAddresses: z.ZodRecord<\n z.ZodEnum<typeof Blockchain> & z.core.$partial,\n z.ZodType<`0x${string}`, unknown, z.core.$ZodTypeInternals<`0x${string}`, unknown>>\n >;\n },\n z.core.$strip\n >;\n nonCritical: z.ZodObject<\n {\n minimumConfirmations: z.ZodRecord<z.ZodEnum<typeof Blockchain> & z.core.$partial, z.ZodOptional<z.ZodNumber>>;\n unwrapFeeApproximation: z.ZodRecord<\n z.ZodString,\n z.ZodType<\n {\n feePercentage: number;\n feePercentageDecimals: number;\n maximumFeeAmount: bigint;\n minimumFeeAmount: bigint;\n },\n unknown,\n z.core.$ZodTypeInternals<\n {\n feePercentage: number;\n feePercentageDecimals: number;\n maximumFeeAmount: bigint;\n minimumFeeAmount: bigint;\n },\n unknown\n >\n >\n >;\n wrapFeeApproximation: z.ZodRecord<\n z.ZodString,\n z.ZodType<\n {\n feePercentage: number;\n feePercentageDecimals: number;\n maximumFeeAmount: bigint;\n minimumFeeAmount: bigint;\n },\n unknown,\n z.core.$ZodTypeInternals<\n {\n feePercentage: number;\n feePercentageDecimals: number;\n maximumFeeAmount: bigint;\n minimumFeeAmount: bigint;\n },\n unknown\n >\n >\n >;\n },\n z.core.$strip\n >;\n },\n z.core.$strip\n >,\n z.ZodObject<\n {\n criticalBitcoin: z.ZodObject<\n {\n disableFrontend: z.ZodBoolean;\n addressBlocklist: z.ZodArray<z.ZodString>;\n avalancheChainId: z.ZodNumber;\n bitcoinAssets: z.ZodRecord<\n z.ZodString,\n z.ZodObject<\n {\n tokenName: z.ZodString;\n bech32AddressPrefix: z.ZodUnion<readonly [z.ZodLiteral<'tb'>, z.ZodLiteral<'bc'>]>;\n wrappedContractAddress: z.ZodType<\n `0x${string}`,\n unknown,\n z.core.$ZodTypeInternals<`0x${string}`, unknown>\n >;\n wrappedNetwork: z.ZodEnum<typeof Blockchain>;\n },\n z.core.$strip\n >\n >;\n walletAddresses: z.ZodObject<\n {\n btc: z.ZodType<string, unknown, z.core.$ZodTypeInternals<string, unknown>>;\n avalanche: z.ZodType<`0x${string}`, unknown, z.core.$ZodTypeInternals<`0x${string}`, unknown>>;\n },\n z.core.$strip\n >;\n },\n z.core.$strip\n >;\n nonCriticalBitcoin: z.ZodObject<\n {\n networkInfo: z.ZodNullable<\n z.ZodRecord<\n z.ZodString,\n z.ZodObject<\n {\n minimumConfirmations: z.ZodNumber;\n minimumOnboardSize: z.ZodNumber;\n currentBridgeFeeEstimate: z.ZodUnion<\n readonly [\n z.ZodObject<\n {\n dustThreshold: z.ZodNumber;\n wrapFeeEstimate: z.ZodObject<\n {\n minimumFeeAmount: z.ZodString;\n maximumFeeAmount: z.ZodString;\n feePercentage: z.ZodNumber;\n feePercentageDecimals: z.ZodNumber;\n },\n z.core.$strip\n >;\n unwrapFeeEstimate: z.ZodObject<\n {\n bridgeToll: z.ZodObject<\n {\n minimumFeeAmount: z.ZodString;\n maximumFeeAmount: z.ZodString;\n feePercentage: z.ZodNumber;\n feePercentageDecimals: z.ZodNumber;\n },\n z.core.$strip\n >;\n estimatedTxFee: z.ZodObject<\n {\n constAmount: z.ZodNumber;\n numeratorPerSat: z.ZodNumber;\n denominatorPerSat: z.ZodNumber;\n },\n z.core.$strip\n >;\n },\n z.core.$strip\n >;\n },\n z.core.$strip\n >,\n z.ZodObject<\n {\n wrapFeeAmount: z.ZodNumber;\n constUnwrapFeeAmount: z.ZodNumber;\n unwrapFeeNumerator: z.ZodNumber;\n unwrapFeeDenominator: z.ZodNumber;\n dustThreshold: z.ZodNumber;\n },\n z.core.$strip\n >,\n ]\n >;\n },\n z.core.$strip\n >\n >\n >;\n },\n z.core.$strip\n >;\n },\n z.core.$strip\n >\n> = z.intersection(EthereumDynamicFeeConfig, BitcoinConfig);\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"_warden-config-schema.cjs","names":["z","Blockchain","EvmAddressSchema","BtcAddressSchema"],"sources":["../../src/transfer-service/_warden-config-schema.ts"],"sourcesContent":["import { z } from 'zod';\nimport { BtcAddressSchema, EvmAddressSchema } from './service-schemas';\nimport { Blockchain } from '../constants';\n\nconst BlockchainEnum = z.enum(Blockchain);\n\nconst AssetBase = z.object({\n tokenName: z.string(),\n nativeNetwork: BlockchainEnum,\n denomination: z.number(),\n});\n\nconst EthereumAssetConfig = AssetBase.extend({\n nativeContractAddress: EvmAddressSchema,\n wrappedContractAddress: EvmAddressSchema,\n wrappedNetwork: BlockchainEnum,\n});\n\nconst CriticalConfigBase = z.object({\n disableFrontend: z.boolean(),\n addressBlocklist: z.array(z.string()),\n});\n\nconst EthereumCriticalConfig = CriticalConfigBase.extend({\n assets: z.record(z.string(), EthereumAssetConfig), // key is token symbol\n networks: z.partialRecord(BlockchainEnum, z.union([z.number(), z.undefined()])),\n walletAddresses: z.partialRecord(BlockchainEnum, EvmAddressSchema),\n});\n\nconst EthereumNonCriticalConfigBase = z.object({\n minimumConfirmations: z.partialRecord(BlockchainEnum, z.optional(z.number())),\n});\n\nexport const DynamicFeeEstimation: z.ZodType<{\n feePercentage: number;\n feePercentageDecimals: number;\n maximumFeeAmount: bigint;\n minimumFeeAmount: bigint;\n}> = z.object({\n minimumFeeAmount: z.coerce.bigint().nonnegative(),\n maximumFeeAmount: z.coerce.bigint().nonnegative(),\n feePercentage: z.int().nonnegative(),\n feePercentageDecimals: z.int().nonnegative(),\n});\n\nconst EthereumDynamicFeeNonCriticalConfig = EthereumNonCriticalConfigBase.extend({\n unwrapFeeApproximation: z.record(z.string(), DynamicFeeEstimation),\n wrapFeeApproximation: z.record(z.string(), DynamicFeeEstimation),\n});\n\nconst EthereumDynamicFeeConfig = z.object({\n critical: EthereumCriticalConfig,\n nonCritical: EthereumDynamicFeeNonCriticalConfig,\n});\n\nconst BitcoinAssetConfig = z.object({\n tokenName: z.string(),\n bech32AddressPrefix: z.union([z.literal('tb'), z.literal('bc')]),\n wrappedContractAddress: EvmAddressSchema,\n wrappedNetwork: BlockchainEnum,\n});\n\nconst BitcoinCritical = CriticalConfigBase.extend({\n addressBlocklist: z.array(z.string()),\n avalancheChainId: z.number(),\n bitcoinAssets: z.record(z.string(), BitcoinAssetConfig), // key is token symbol\n walletAddresses: z.object({\n btc: BtcAddressSchema,\n avalanche: EvmAddressSchema,\n }),\n});\n\nconst BitcoinCurrentBridgeFeeEstimateDynamic = z.object({\n dustThreshold: z.number(),\n wrapFeeEstimate: z.object({\n minimumFeeAmount: z.string(),\n maximumFeeAmount: z.string(),\n feePercentage: z.number(),\n feePercentageDecimals: z.number(),\n }),\n unwrapFeeEstimate: z.object({\n bridgeToll: z.object({\n minimumFeeAmount: z.string(),\n maximumFeeAmount: z.string(),\n feePercentage: z.number(),\n feePercentageDecimals: z.number(),\n }),\n estimatedTxFee: z.object({\n constAmount: z.number(),\n numeratorPerSat: z.number(),\n denominatorPerSat: z.number(),\n }),\n }),\n});\n\nconst BitcoinCurrentBridgeFeeEstimateStatic = z.object({\n wrapFeeAmount: z.number(),\n constUnwrapFeeAmount: z.number(),\n unwrapFeeNumerator: z.number(),\n unwrapFeeDenominator: z.number(),\n dustThreshold: z.number(),\n});\n\nconst BitcoinNetworkInfo = z.object({\n minimumConfirmations: z.number(),\n minimumOnboardSize: z.number(),\n currentBridgeFeeEstimate: z.union([BitcoinCurrentBridgeFeeEstimateDynamic, BitcoinCurrentBridgeFeeEstimateStatic]),\n});\n\nconst BitcoinNonCritical = z.object({\n networkInfo: z.record(z.string(), BitcoinNetworkInfo).nullable(),\n});\n\n// BitcoinConfig supports both dynamic and static\nconst BitcoinConfig = z.object({\n criticalBitcoin: BitcoinCritical,\n nonCriticalBitcoin: BitcoinNonCritical,\n});\n\n/**\n * The schema for the Warden configuration used by the Fusion SDK services.\n *\n * > [!NOTE]\n * >\n * > The typing for this schema is auto-generated and should not be manually edited.\n * > If changes are made to the schema, the typing must be regenerated.\n * >\n * > You can regenerate the typing by deleting the existing typing and using\n * > VS Code's quick fix feature to generate the new typing.\n * >\n * > This typing is necessary to satisfy the isolatedDeclarations TypeScript compiler option.\n *\n * > [!INFO]\n * >\n * > Warden bridge settings are updated every 15 seconds.\n */\nexport const WardenConfigSchema: z.ZodIntersection<\n z.ZodObject<\n {\n critical: z.ZodObject<\n {\n disableFrontend: z.ZodBoolean;\n addressBlocklist: z.ZodArray<z.ZodString>;\n assets: z.ZodRecord<\n z.ZodString,\n z.ZodObject<\n {\n tokenName: z.ZodString;\n nativeNetwork: z.ZodEnum<typeof Blockchain>;\n denomination: z.ZodNumber;\n nativeContractAddress: z.ZodType<\n `0x${string}`,\n unknown,\n z.core.$ZodTypeInternals<`0x${string}`, unknown>\n >;\n wrappedContractAddress: z.ZodType<\n `0x${string}`,\n unknown,\n z.core.$ZodTypeInternals<`0x${string}`, unknown>\n >;\n wrappedNetwork: z.ZodEnum<typeof Blockchain>;\n },\n z.core.$strip\n >\n >;\n networks: z.ZodRecord<\n z.ZodEnum<typeof Blockchain> & z.core.$partial,\n z.ZodUnion<readonly [z.ZodNumber, z.ZodUndefined]>\n >;\n walletAddresses: z.ZodRecord<\n z.ZodEnum<typeof Blockchain> & z.core.$partial,\n z.ZodType<`0x${string}`, unknown, z.core.$ZodTypeInternals<`0x${string}`, unknown>>\n >;\n },\n z.core.$strip\n >;\n nonCritical: z.ZodObject<\n {\n minimumConfirmations: z.ZodRecord<z.ZodEnum<typeof Blockchain> & z.core.$partial, z.ZodOptional<z.ZodNumber>>;\n unwrapFeeApproximation: z.ZodRecord<\n z.ZodString,\n z.ZodType<\n {\n feePercentage: number;\n feePercentageDecimals: number;\n maximumFeeAmount: bigint;\n minimumFeeAmount: bigint;\n },\n unknown,\n z.core.$ZodTypeInternals<\n {\n feePercentage: number;\n feePercentageDecimals: number;\n maximumFeeAmount: bigint;\n minimumFeeAmount: bigint;\n },\n unknown\n >\n >\n >;\n wrapFeeApproximation: z.ZodRecord<\n z.ZodString,\n z.ZodType<\n {\n feePercentage: number;\n feePercentageDecimals: number;\n maximumFeeAmount: bigint;\n minimumFeeAmount: bigint;\n },\n unknown,\n z.core.$ZodTypeInternals<\n {\n feePercentage: number;\n feePercentageDecimals: number;\n maximumFeeAmount: bigint;\n minimumFeeAmount: bigint;\n },\n unknown\n >\n >\n >;\n },\n z.core.$strip\n >;\n },\n z.core.$strip\n >,\n z.ZodObject<\n {\n criticalBitcoin: z.ZodObject<\n {\n disableFrontend: z.ZodBoolean;\n addressBlocklist: z.ZodArray<z.ZodString>;\n avalancheChainId: z.ZodNumber;\n bitcoinAssets: z.ZodRecord<\n z.ZodString,\n z.ZodObject<\n {\n tokenName: z.ZodString;\n bech32AddressPrefix: z.ZodUnion<readonly [z.ZodLiteral<'tb'>, z.ZodLiteral<'bc'>]>;\n wrappedContractAddress: z.ZodType<\n `0x${string}`,\n unknown,\n z.core.$ZodTypeInternals<`0x${string}`, unknown>\n >;\n wrappedNetwork: z.ZodEnum<typeof Blockchain>;\n },\n z.core.$strip\n >\n >;\n walletAddresses: z.ZodObject<\n {\n btc: z.ZodType<string, unknown, z.core.$ZodTypeInternals<string, unknown>>;\n avalanche: z.ZodType<`0x${string}`, unknown, z.core.$ZodTypeInternals<`0x${string}`, unknown>>;\n },\n z.core.$strip\n >;\n },\n z.core.$strip\n >;\n nonCriticalBitcoin: z.ZodObject<\n {\n networkInfo: z.ZodNullable<\n z.ZodRecord<\n z.ZodString,\n z.ZodObject<\n {\n minimumConfirmations: z.ZodNumber;\n minimumOnboardSize: z.ZodNumber;\n currentBridgeFeeEstimate: z.ZodUnion<\n readonly [\n z.ZodObject<\n {\n dustThreshold: z.ZodNumber;\n wrapFeeEstimate: z.ZodObject<\n {\n minimumFeeAmount: z.ZodString;\n maximumFeeAmount: z.ZodString;\n feePercentage: z.ZodNumber;\n feePercentageDecimals: z.ZodNumber;\n },\n z.core.$strip\n >;\n unwrapFeeEstimate: z.ZodObject<\n {\n bridgeToll: z.ZodObject<\n {\n minimumFeeAmount: z.ZodString;\n maximumFeeAmount: z.ZodString;\n feePercentage: z.ZodNumber;\n feePercentageDecimals: z.ZodNumber;\n },\n z.core.$strip\n >;\n estimatedTxFee: z.ZodObject<\n {\n constAmount: z.ZodNumber;\n numeratorPerSat: z.ZodNumber;\n denominatorPerSat: z.ZodNumber;\n },\n z.core.$strip\n >;\n },\n z.core.$strip\n >;\n },\n z.core.$strip\n >,\n z.ZodObject<\n {\n wrapFeeAmount: z.ZodNumber;\n constUnwrapFeeAmount: z.ZodNumber;\n unwrapFeeNumerator: z.ZodNumber;\n unwrapFeeDenominator: z.ZodNumber;\n dustThreshold: z.ZodNumber;\n },\n z.core.$strip\n >,\n ]\n >;\n },\n z.core.$strip\n >\n >\n >;\n },\n z.core.$strip\n >;\n },\n z.core.$strip\n >\n> = z.intersection(EthereumDynamicFeeConfig, BitcoinConfig);\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"_warden-config-schema.js","names":[],"sources":["../../src/transfer-service/_warden-config-schema.ts"],"sourcesContent":["import { z } from 'zod';\nimport { BtcAddressSchema, EvmAddressSchema } from './service-schemas';\nimport { Blockchain } from '../constants';\n\nconst BlockchainEnum = z.enum(Blockchain);\n\nconst AssetBase = z.object({\n tokenName: z.string(),\n nativeNetwork: BlockchainEnum,\n denomination: z.number(),\n});\n\nconst EthereumAssetConfig = AssetBase.extend({\n nativeContractAddress: EvmAddressSchema,\n wrappedContractAddress: EvmAddressSchema,\n wrappedNetwork: BlockchainEnum,\n});\n\nconst CriticalConfigBase = z.object({\n disableFrontend: z.boolean(),\n addressBlocklist: z.array(z.string()),\n});\n\nconst EthereumCriticalConfig = CriticalConfigBase.extend({\n assets: z.record(z.string(), EthereumAssetConfig), // key is token symbol\n networks: z.partialRecord(BlockchainEnum, z.union([z.number(), z.undefined()])),\n walletAddresses: z.partialRecord(BlockchainEnum, EvmAddressSchema),\n});\n\nconst EthereumNonCriticalConfigBase = z.object({\n minimumConfirmations: z.partialRecord(BlockchainEnum, z.optional(z.number())),\n});\n\nexport const DynamicFeeEstimation: z.ZodType<{\n feePercentage: number;\n feePercentageDecimals: number;\n maximumFeeAmount: bigint;\n minimumFeeAmount: bigint;\n}> = z.object({\n minimumFeeAmount: z.coerce.bigint().nonnegative(),\n maximumFeeAmount: z.coerce.bigint().nonnegative(),\n feePercentage: z.int().nonnegative(),\n feePercentageDecimals: z.int().nonnegative(),\n});\n\nconst EthereumDynamicFeeNonCriticalConfig = EthereumNonCriticalConfigBase.extend({\n unwrapFeeApproximation: z.record(z.string(), DynamicFeeEstimation),\n wrapFeeApproximation: z.record(z.string(), DynamicFeeEstimation),\n});\n\nconst EthereumDynamicFeeConfig = z.object({\n critical: EthereumCriticalConfig,\n nonCritical: EthereumDynamicFeeNonCriticalConfig,\n});\n\nconst BitcoinAssetConfig = z.object({\n tokenName: z.string(),\n bech32AddressPrefix: z.union([z.literal('tb'), z.literal('bc')]),\n wrappedContractAddress: EvmAddressSchema,\n wrappedNetwork: BlockchainEnum,\n});\n\nconst BitcoinCritical = CriticalConfigBase.extend({\n addressBlocklist: z.array(z.string()),\n avalancheChainId: z.number(),\n bitcoinAssets: z.record(z.string(), BitcoinAssetConfig), // key is token symbol\n walletAddresses: z.object({\n btc: BtcAddressSchema,\n avalanche: EvmAddressSchema,\n }),\n});\n\nconst BitcoinCurrentBridgeFeeEstimateDynamic = z.object({\n dustThreshold: z.number(),\n wrapFeeEstimate: z.object({\n minimumFeeAmount: z.string(),\n maximumFeeAmount: z.string(),\n feePercentage: z.number(),\n feePercentageDecimals: z.number(),\n }),\n unwrapFeeEstimate: z.object({\n bridgeToll: z.object({\n minimumFeeAmount: z.string(),\n maximumFeeAmount: z.string(),\n feePercentage: z.number(),\n feePercentageDecimals: z.number(),\n }),\n estimatedTxFee: z.object({\n constAmount: z.number(),\n numeratorPerSat: z.number(),\n denominatorPerSat: z.number(),\n }),\n }),\n});\n\nconst BitcoinCurrentBridgeFeeEstimateStatic = z.object({\n wrapFeeAmount: z.number(),\n constUnwrapFeeAmount: z.number(),\n unwrapFeeNumerator: z.number(),\n unwrapFeeDenominator: z.number(),\n dustThreshold: z.number(),\n});\n\nconst BitcoinNetworkInfo = z.object({\n minimumConfirmations: z.number(),\n minimumOnboardSize: z.number(),\n currentBridgeFeeEstimate: z.union([BitcoinCurrentBridgeFeeEstimateDynamic, BitcoinCurrentBridgeFeeEstimateStatic]),\n});\n\nconst BitcoinNonCritical = z.object({\n networkInfo: z.record(z.string(), BitcoinNetworkInfo).nullable(),\n});\n\n// BitcoinConfig supports both dynamic and static\nconst BitcoinConfig = z.object({\n criticalBitcoin: BitcoinCritical,\n nonCriticalBitcoin: BitcoinNonCritical,\n});\n\n/**\n * The schema for the Warden configuration used by the Unified Asset Transfer service.\n *\n * > [!NOTE]\n * >\n * > The typing for this schema is auto-generated and should not be manually edited.\n * > If changes are made to the schema, the typing must be regenerated.\n * >\n * > You can regenerate the typing by deleting the existing typing and using\n * > VS Code's quick fix feature to generate the new typing.\n * >\n * > This typing is necessary to satisfy the isolatedDeclarations TypeScript compiler option.\n *\n * > [!INFO]\n * >\n * > Warden bridge settings are updated every 15 seconds.\n */\nexport const WardenConfigSchema: z.ZodIntersection<\n z.ZodObject<\n {\n critical: z.ZodObject<\n {\n disableFrontend: z.ZodBoolean;\n addressBlocklist: z.ZodArray<z.ZodString>;\n assets: z.ZodRecord<\n z.ZodString,\n z.ZodObject<\n {\n tokenName: z.ZodString;\n nativeNetwork: z.ZodEnum<typeof Blockchain>;\n denomination: z.ZodNumber;\n nativeContractAddress: z.ZodType<\n `0x${string}`,\n unknown,\n z.core.$ZodTypeInternals<`0x${string}`, unknown>\n >;\n wrappedContractAddress: z.ZodType<\n `0x${string}`,\n unknown,\n z.core.$ZodTypeInternals<`0x${string}`, unknown>\n >;\n wrappedNetwork: z.ZodEnum<typeof Blockchain>;\n },\n z.core.$strip\n >\n >;\n networks: z.ZodRecord<\n z.ZodEnum<typeof Blockchain> & z.core.$partial,\n z.ZodUnion<readonly [z.ZodNumber, z.ZodUndefined]>\n >;\n walletAddresses: z.ZodRecord<\n z.ZodEnum<typeof Blockchain> & z.core.$partial,\n z.ZodType<`0x${string}`, unknown, z.core.$ZodTypeInternals<`0x${string}`, unknown>>\n >;\n },\n z.core.$strip\n >;\n nonCritical: z.ZodObject<\n {\n minimumConfirmations: z.ZodRecord<z.ZodEnum<typeof Blockchain> & z.core.$partial, z.ZodOptional<z.ZodNumber>>;\n unwrapFeeApproximation: z.ZodRecord<\n z.ZodString,\n z.ZodType<\n {\n feePercentage: number;\n feePercentageDecimals: number;\n maximumFeeAmount: bigint;\n minimumFeeAmount: bigint;\n },\n unknown,\n z.core.$ZodTypeInternals<\n {\n feePercentage: number;\n feePercentageDecimals: number;\n maximumFeeAmount: bigint;\n minimumFeeAmount: bigint;\n },\n unknown\n >\n >\n >;\n wrapFeeApproximation: z.ZodRecord<\n z.ZodString,\n z.ZodType<\n {\n feePercentage: number;\n feePercentageDecimals: number;\n maximumFeeAmount: bigint;\n minimumFeeAmount: bigint;\n },\n unknown,\n z.core.$ZodTypeInternals<\n {\n feePercentage: number;\n feePercentageDecimals: number;\n maximumFeeAmount: bigint;\n minimumFeeAmount: bigint;\n },\n unknown\n >\n >\n >;\n },\n z.core.$strip\n >;\n },\n z.core.$strip\n >,\n z.ZodObject<\n {\n criticalBitcoin: z.ZodObject<\n {\n disableFrontend: z.ZodBoolean;\n addressBlocklist: z.ZodArray<z.ZodString>;\n avalancheChainId: z.ZodNumber;\n bitcoinAssets: z.ZodRecord<\n z.ZodString,\n z.ZodObject<\n {\n tokenName: z.ZodString;\n bech32AddressPrefix: z.ZodUnion<readonly [z.ZodLiteral<'tb'>, z.ZodLiteral<'bc'>]>;\n wrappedContractAddress: z.ZodType<\n `0x${string}`,\n unknown,\n z.core.$ZodTypeInternals<`0x${string}`, unknown>\n >;\n wrappedNetwork: z.ZodEnum<typeof Blockchain>;\n },\n z.core.$strip\n >\n >;\n walletAddresses: z.ZodObject<\n {\n btc: z.ZodType<string, unknown, z.core.$ZodTypeInternals<string, unknown>>;\n avalanche: z.ZodType<`0x${string}`, unknown, z.core.$ZodTypeInternals<`0x${string}`, unknown>>;\n },\n z.core.$strip\n >;\n },\n z.core.$strip\n >;\n nonCriticalBitcoin: z.ZodObject<\n {\n networkInfo: z.ZodNullable<\n z.ZodRecord<\n z.ZodString,\n z.ZodObject<\n {\n minimumConfirmations: z.ZodNumber;\n minimumOnboardSize: z.ZodNumber;\n currentBridgeFeeEstimate: z.ZodUnion<\n readonly [\n z.ZodObject<\n {\n dustThreshold: z.ZodNumber;\n wrapFeeEstimate: z.ZodObject<\n {\n minimumFeeAmount: z.ZodString;\n maximumFeeAmount: z.ZodString;\n feePercentage: z.ZodNumber;\n feePercentageDecimals: z.ZodNumber;\n },\n z.core.$strip\n >;\n unwrapFeeEstimate: z.ZodObject<\n {\n bridgeToll: z.ZodObject<\n {\n minimumFeeAmount: z.ZodString;\n maximumFeeAmount: z.ZodString;\n feePercentage: z.ZodNumber;\n feePercentageDecimals: z.ZodNumber;\n },\n z.core.$strip\n >;\n estimatedTxFee: z.ZodObject<\n {\n constAmount: z.ZodNumber;\n numeratorPerSat: z.ZodNumber;\n denominatorPerSat: z.ZodNumber;\n },\n z.core.$strip\n >;\n },\n z.core.$strip\n >;\n },\n z.core.$strip\n >,\n z.ZodObject<\n {\n wrapFeeAmount: z.ZodNumber;\n constUnwrapFeeAmount: z.ZodNumber;\n unwrapFeeNumerator: z.ZodNumber;\n unwrapFeeDenominator: z.ZodNumber;\n dustThreshold: z.ZodNumber;\n },\n z.core.$strip\n >,\n ]\n >;\n },\n z.core.$strip\n >\n >\n >;\n },\n z.core.$strip\n >;\n },\n z.core.$strip\n >\n> = z.intersection(EthereumDynamicFeeConfig, BitcoinConfig);\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"_warden-config-schema.js","names":[],"sources":["../../src/transfer-service/_warden-config-schema.ts"],"sourcesContent":["import { z } from 'zod';\nimport { BtcAddressSchema, EvmAddressSchema } from './service-schemas';\nimport { Blockchain } from '../constants';\n\nconst BlockchainEnum = z.enum(Blockchain);\n\nconst AssetBase = z.object({\n tokenName: z.string(),\n nativeNetwork: BlockchainEnum,\n denomination: z.number(),\n});\n\nconst EthereumAssetConfig = AssetBase.extend({\n nativeContractAddress: EvmAddressSchema,\n wrappedContractAddress: EvmAddressSchema,\n wrappedNetwork: BlockchainEnum,\n});\n\nconst CriticalConfigBase = z.object({\n disableFrontend: z.boolean(),\n addressBlocklist: z.array(z.string()),\n});\n\nconst EthereumCriticalConfig = CriticalConfigBase.extend({\n assets: z.record(z.string(), EthereumAssetConfig), // key is token symbol\n networks: z.partialRecord(BlockchainEnum, z.union([z.number(), z.undefined()])),\n walletAddresses: z.partialRecord(BlockchainEnum, EvmAddressSchema),\n});\n\nconst EthereumNonCriticalConfigBase = z.object({\n minimumConfirmations: z.partialRecord(BlockchainEnum, z.optional(z.number())),\n});\n\nexport const DynamicFeeEstimation: z.ZodType<{\n feePercentage: number;\n feePercentageDecimals: number;\n maximumFeeAmount: bigint;\n minimumFeeAmount: bigint;\n}> = z.object({\n minimumFeeAmount: z.coerce.bigint().nonnegative(),\n maximumFeeAmount: z.coerce.bigint().nonnegative(),\n feePercentage: z.int().nonnegative(),\n feePercentageDecimals: z.int().nonnegative(),\n});\n\nconst EthereumDynamicFeeNonCriticalConfig = EthereumNonCriticalConfigBase.extend({\n unwrapFeeApproximation: z.record(z.string(), DynamicFeeEstimation),\n wrapFeeApproximation: z.record(z.string(), DynamicFeeEstimation),\n});\n\nconst EthereumDynamicFeeConfig = z.object({\n critical: EthereumCriticalConfig,\n nonCritical: EthereumDynamicFeeNonCriticalConfig,\n});\n\nconst BitcoinAssetConfig = z.object({\n tokenName: z.string(),\n bech32AddressPrefix: z.union([z.literal('tb'), z.literal('bc')]),\n wrappedContractAddress: EvmAddressSchema,\n wrappedNetwork: BlockchainEnum,\n});\n\nconst BitcoinCritical = CriticalConfigBase.extend({\n addressBlocklist: z.array(z.string()),\n avalancheChainId: z.number(),\n bitcoinAssets: z.record(z.string(), BitcoinAssetConfig), // key is token symbol\n walletAddresses: z.object({\n btc: BtcAddressSchema,\n avalanche: EvmAddressSchema,\n }),\n});\n\nconst BitcoinCurrentBridgeFeeEstimateDynamic = z.object({\n dustThreshold: z.number(),\n wrapFeeEstimate: z.object({\n minimumFeeAmount: z.string(),\n maximumFeeAmount: z.string(),\n feePercentage: z.number(),\n feePercentageDecimals: z.number(),\n }),\n unwrapFeeEstimate: z.object({\n bridgeToll: z.object({\n minimumFeeAmount: z.string(),\n maximumFeeAmount: z.string(),\n feePercentage: z.number(),\n feePercentageDecimals: z.number(),\n }),\n estimatedTxFee: z.object({\n constAmount: z.number(),\n numeratorPerSat: z.number(),\n denominatorPerSat: z.number(),\n }),\n }),\n});\n\nconst BitcoinCurrentBridgeFeeEstimateStatic = z.object({\n wrapFeeAmount: z.number(),\n constUnwrapFeeAmount: z.number(),\n unwrapFeeNumerator: z.number(),\n unwrapFeeDenominator: z.number(),\n dustThreshold: z.number(),\n});\n\nconst BitcoinNetworkInfo = z.object({\n minimumConfirmations: z.number(),\n minimumOnboardSize: z.number(),\n currentBridgeFeeEstimate: z.union([BitcoinCurrentBridgeFeeEstimateDynamic, BitcoinCurrentBridgeFeeEstimateStatic]),\n});\n\nconst BitcoinNonCritical = z.object({\n networkInfo: z.record(z.string(), BitcoinNetworkInfo).nullable(),\n});\n\n// BitcoinConfig supports both dynamic and static\nconst BitcoinConfig = z.object({\n criticalBitcoin: BitcoinCritical,\n nonCriticalBitcoin: BitcoinNonCritical,\n});\n\n/**\n * The schema for the Warden configuration used by the Fusion SDK services.\n *\n * > [!NOTE]\n * >\n * > The typing for this schema is auto-generated and should not be manually edited.\n * > If changes are made to the schema, the typing must be regenerated.\n * >\n * > You can regenerate the typing by deleting the existing typing and using\n * > VS Code's quick fix feature to generate the new typing.\n * >\n * > This typing is necessary to satisfy the isolatedDeclarations TypeScript compiler option.\n *\n * > [!INFO]\n * >\n * > Warden bridge settings are updated every 15 seconds.\n */\nexport const WardenConfigSchema: z.ZodIntersection<\n z.ZodObject<\n {\n critical: z.ZodObject<\n {\n disableFrontend: z.ZodBoolean;\n addressBlocklist: z.ZodArray<z.ZodString>;\n assets: z.ZodRecord<\n z.ZodString,\n z.ZodObject<\n {\n tokenName: z.ZodString;\n nativeNetwork: z.ZodEnum<typeof Blockchain>;\n denomination: z.ZodNumber;\n nativeContractAddress: z.ZodType<\n `0x${string}`,\n unknown,\n z.core.$ZodTypeInternals<`0x${string}`, unknown>\n >;\n wrappedContractAddress: z.ZodType<\n `0x${string}`,\n unknown,\n z.core.$ZodTypeInternals<`0x${string}`, unknown>\n >;\n wrappedNetwork: z.ZodEnum<typeof Blockchain>;\n },\n z.core.$strip\n >\n >;\n networks: z.ZodRecord<\n z.ZodEnum<typeof Blockchain> & z.core.$partial,\n z.ZodUnion<readonly [z.ZodNumber, z.ZodUndefined]>\n >;\n walletAddresses: z.ZodRecord<\n z.ZodEnum<typeof Blockchain> & z.core.$partial,\n z.ZodType<`0x${string}`, unknown, z.core.$ZodTypeInternals<`0x${string}`, unknown>>\n >;\n },\n z.core.$strip\n >;\n nonCritical: z.ZodObject<\n {\n minimumConfirmations: z.ZodRecord<z.ZodEnum<typeof Blockchain> & z.core.$partial, z.ZodOptional<z.ZodNumber>>;\n unwrapFeeApproximation: z.ZodRecord<\n z.ZodString,\n z.ZodType<\n {\n feePercentage: number;\n feePercentageDecimals: number;\n maximumFeeAmount: bigint;\n minimumFeeAmount: bigint;\n },\n unknown,\n z.core.$ZodTypeInternals<\n {\n feePercentage: number;\n feePercentageDecimals: number;\n maximumFeeAmount: bigint;\n minimumFeeAmount: bigint;\n },\n unknown\n >\n >\n >;\n wrapFeeApproximation: z.ZodRecord<\n z.ZodString,\n z.ZodType<\n {\n feePercentage: number;\n feePercentageDecimals: number;\n maximumFeeAmount: bigint;\n minimumFeeAmount: bigint;\n },\n unknown,\n z.core.$ZodTypeInternals<\n {\n feePercentage: number;\n feePercentageDecimals: number;\n maximumFeeAmount: bigint;\n minimumFeeAmount: bigint;\n },\n unknown\n >\n >\n >;\n },\n z.core.$strip\n >;\n },\n z.core.$strip\n >,\n z.ZodObject<\n {\n criticalBitcoin: z.ZodObject<\n {\n disableFrontend: z.ZodBoolean;\n addressBlocklist: z.ZodArray<z.ZodString>;\n avalancheChainId: z.ZodNumber;\n bitcoinAssets: z.ZodRecord<\n z.ZodString,\n z.ZodObject<\n {\n tokenName: z.ZodString;\n bech32AddressPrefix: z.ZodUnion<readonly [z.ZodLiteral<'tb'>, z.ZodLiteral<'bc'>]>;\n wrappedContractAddress: z.ZodType<\n `0x${string}`,\n unknown,\n z.core.$ZodTypeInternals<`0x${string}`, unknown>\n >;\n wrappedNetwork: z.ZodEnum<typeof Blockchain>;\n },\n z.core.$strip\n >\n >;\n walletAddresses: z.ZodObject<\n {\n btc: z.ZodType<string, unknown, z.core.$ZodTypeInternals<string, unknown>>;\n avalanche: z.ZodType<`0x${string}`, unknown, z.core.$ZodTypeInternals<`0x${string}`, unknown>>;\n },\n z.core.$strip\n >;\n },\n z.core.$strip\n >;\n nonCriticalBitcoin: z.ZodObject<\n {\n networkInfo: z.ZodNullable<\n z.ZodRecord<\n z.ZodString,\n z.ZodObject<\n {\n minimumConfirmations: z.ZodNumber;\n minimumOnboardSize: z.ZodNumber;\n currentBridgeFeeEstimate: z.ZodUnion<\n readonly [\n z.ZodObject<\n {\n dustThreshold: z.ZodNumber;\n wrapFeeEstimate: z.ZodObject<\n {\n minimumFeeAmount: z.ZodString;\n maximumFeeAmount: z.ZodString;\n feePercentage: z.ZodNumber;\n feePercentageDecimals: z.ZodNumber;\n },\n z.core.$strip\n >;\n unwrapFeeEstimate: z.ZodObject<\n {\n bridgeToll: z.ZodObject<\n {\n minimumFeeAmount: z.ZodString;\n maximumFeeAmount: z.ZodString;\n feePercentage: z.ZodNumber;\n feePercentageDecimals: z.ZodNumber;\n },\n z.core.$strip\n >;\n estimatedTxFee: z.ZodObject<\n {\n constAmount: z.ZodNumber;\n numeratorPerSat: z.ZodNumber;\n denominatorPerSat: z.ZodNumber;\n },\n z.core.$strip\n >;\n },\n z.core.$strip\n >;\n },\n z.core.$strip\n >,\n z.ZodObject<\n {\n wrapFeeAmount: z.ZodNumber;\n constUnwrapFeeAmount: z.ZodNumber;\n unwrapFeeNumerator: z.ZodNumber;\n unwrapFeeDenominator: z.ZodNumber;\n dustThreshold: z.ZodNumber;\n },\n z.core.$strip\n >,\n ]\n >;\n },\n z.core.$strip\n >\n >\n >;\n },\n z.core.$strip\n >;\n },\n z.core.$strip\n >\n> = z.intersection(EthereumDynamicFeeConfig, BitcoinConfig);\n"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
require(`../../../_virtual/_rolldown/runtime.cjs`);const e=require(`../../../errors.cjs`),t=require(`../../_utils.cjs`),n=require(`../_utils/transfer-data.cjs`);let r=require(`viem`);function
|
|
1
|
+
require(`../../../_virtual/_rolldown/runtime.cjs`);const e=require(`../../../errors.cjs`),t=require(`../../_utils.cjs`),n=require(`../_utils/transfer-data.cjs`);let r=require(`viem`);const i=1024n;function a({config:n}){return({transfer:i,updateListener:a})=>{let c=new AbortController,l=()=>{c.abort()};if(i.status===`completed`||i.status===`failed`)return{cancel:l,result:Promise.resolve(i)};let{txHash:u}=i.source;if(!(0,r.isHash)(u)){let t={...i,errorCode:e.ErrorCode.INVALID_PARAMS,errorReason:`Invalid source transaction hash`,failedAtMs:Date.now(),status:`failed`};return a(t),{cancel:l,result:Promise.resolve(t)}}let f=t.getEvmClientForChain({chain:i.sourceChain}),p=t.getEvmClientForChain({chain:i.targetChain}),m=structuredClone(i);return{cancel:l,result:(async()=>{for(;!c.signal.aborted;){let e=!1;switch(m.status){case`source-pending`:m=await o({currentTransfer:m,signal:c.signal,sourceClient:f}),a(m);break;case`target-pending`:m=await s({assetIn:m.sourceAsset,currentTransfer:m,evmConfig:n,signal:c.signal,sourceChainId:m.sourceChain.chainId,targetChainId:m.targetChain.chainId,targetClient:p}),e=m.status===`target-pending`&&!m.target?.txHash,a(m),e&&await d({signal:c.signal});break;default:return m}}return m})()}}}async function o({currentTransfer:n,signal:i,sourceClient:a}){let{confirmationCount:o,requiredConfirmationCount:s,txHash:c}=n.source;if(!(0,r.isHash)(c))return{...n,errorCode:e.ErrorCode.INVALID_PARAMS,errorReason:`Invalid source transaction hash`,failedAtMs:Date.now(),status:`failed`};if(o>=s)return{...n,status:`target-pending`,target:{confirmationCount:0,requiredConfirmationCount:1,startedAtMs:Date.now()}};try{let r=await t.awaitOrAbort(a.waitForTransactionReceipt({confirmations:Math.min(o+1,s),hash:c}),i);if(r.status===`aborted`)return n;let l=r.value;if(l.status===`reverted`)return{...n,errorCode:e.ErrorCode.TRANSACTION_REVERTED,errorReason:`Source transaction was reverted`,failedAtMs:Date.now(),status:`failed`};let u=await a.getTransactionConfirmations({transactionReceipt:l}).then(e=>Number(e)).catch(()=>o+1);return u<s?{...n,source:{...n.source,confirmationCount:u}}:{...n,source:{...n.source,confirmationCount:u},status:`target-pending`,target:{confirmationCount:0,requiredConfirmationCount:1,startedAtMs:Date.now()}}}catch{return n}}async function s({assetIn:i,currentTransfer:a,evmConfig:o,signal:s,sourceChainId:u,targetChainId:d,targetClient:f}){let p=a.target??{confirmationCount:0,requiredConfirmationCount:1,startedAtMs:Date.now()};if(p.confirmationCount>=p.requiredConfirmationCount)return{...a,status:`completed`,completedAtMs:Date.now()};if(!p.txHash){let{ethToAva:e,target:{token:{address:t}}}=n.getTransferData({assetIn:i,sourceChainId:u,targetChainId:d},o),r=typeof f.getBlockNumber==`function`?await f.getBlockNumber().catch(()=>void 0):void 0,s=await(e?c({contractAddress:t,latestBlockNumber:r,sourceTxHash:a.source.txHash,targetClient:f,targetStartBlockNumber:a.source.targetStartBlockNumber}):l({contractAddress:t,evmConfig:o,fromAddress:a.fromAddress,latestBlockNumber:r,targetClient:f,targetStartBlockNumber:a.source.targetStartBlockNumber})).catch(()=>null);return s?{...a,target:{...p,txHash:s}}:r===void 0?a:{...a,source:{...a.source,targetStartBlockNumber:r}}}if(!(0,r.isHash)(p.txHash))return{...a,errorCode:e.ErrorCode.INVALID_PARAMS,errorReason:`Invalid target transaction hash`,failedAtMs:Date.now(),status:`failed`};try{let n=await t.awaitOrAbort(f.waitForTransactionReceipt({confirmations:p.requiredConfirmationCount,hash:p.txHash}),s);if(n.status===`aborted`)return a;let r=n.value;return r.status===`reverted`?{...a,errorCode:e.ErrorCode.TRANSACTION_REVERTED,errorReason:`Target transaction was reverted`,failedAtMs:Date.now(),status:`failed`}:{...a,completedAtMs:Date.now(),status:`completed`,target:{...p,confirmationCount:await f.getTransactionConfirmations({transactionReceipt:r}).then(e=>Number(e)).catch(()=>p.requiredConfirmationCount)}}}catch{return a}}async function c({contractAddress:e,latestBlockNumber:t,sourceTxHash:n,targetClient:r,targetStartBlockNumber:i}){if(i===void 0)return null;let{fromBlock:a,toBlock:o}=u({latestBlockNumber:t,targetStartBlockNumber:i}),s=(await r.getLogs({address:e,event:{inputs:[{indexed:!1,name:`to`,type:`address`},{indexed:!1,name:`amount`,type:`uint256`},{indexed:!1,name:`feeAddress`,type:`address`},{indexed:!1,name:`feeAmount`,type:`uint256`},{indexed:!1,name:`originTxId`,type:`bytes32`}],name:`Mint`,type:`event`},fromBlock:a,toBlock:o})).find(e=>e.args.originTxId===n);return s?s.transactionHash:null}async function l({contractAddress:e,evmConfig:t,fromAddress:n,latestBlockNumber:i,targetClient:a,targetStartBlockNumber:o}){if(o===void 0||!(0,r.isAddress)(n))return null;let{fromBlock:s,toBlock:c}=u({latestBlockNumber:i,targetStartBlockNumber:o}),l=(await a.getLogs({address:e,args:{dst:n,src:t.walletAddresses.ethereum},event:{inputs:[{indexed:!0,name:`src`,type:`address`},{indexed:!0,name:`dst`,type:`address`},{indexed:!1,name:`wad`,type:`uint256`}],name:`Transfer`,type:`event`},fromBlock:s,toBlock:c})).at(-1);return l?l.transactionHash:null}function u({latestBlockNumber:e,targetStartBlockNumber:t}){let n=t>i?t-i:`earliest`,r=t+i;return{fromBlock:n,toBlock:e!==void 0&&r<e?r:`latest`}}async function d({signal:e}){await t.awaitOrAbort(new Promise(e=>setTimeout(e,15e3)),e)}exports.trackTransferFactory=a;
|
|
2
2
|
//# sourceMappingURL=track-transfer.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"track-transfer.cjs","names":["ErrorCode","getEvmClientForChain","awaitOrAbort","getErrorCodeForViemError","getTransferData"],"sources":["../../../../src/transfer-service/avalanche-evm/_handlers/track-transfer.ts"],"sourcesContent":["import { isAddress, isHash, type Hash } from 'viem';\nimport { ErrorCode } from '../../../errors';\nimport type { Asset } from '../../../types/asset';\nimport type { Caip2ChainId } from '../../../types/caip';\nimport type {\n CompletedTransfer,\n FailedTransfer,\n SourcePendingTransfer,\n TargetPendingTransfer,\n Transfer,\n} from '../../../types/transfer';\nimport type { TransferService } from '../../../types/service';\nimport { awaitOrAbort, getErrorCodeForViemError, getEvmClientForChain } from '../../_utils';\nimport type { EvmConfig } from '../_types';\nimport { getTransferData } from '../_utils/transfer-data';\n\nexport interface TrackTransferFactoryConfig {\n config: EvmConfig;\n}\n\nexport function trackTransferFactory({\n config: evmConfig,\n}: TrackTransferFactoryConfig): TransferService['trackTransfer'] {\n return ({ transfer, updateListener }) => {\n const ac = new AbortController();\n const cancel = () => {\n ac.abort();\n };\n\n // Failed and completed transfers are terminal states.\n if (transfer.status === 'completed' || transfer.status === 'failed') {\n return {\n cancel,\n result: Promise.resolve(transfer),\n };\n }\n\n const { txHash } = transfer.source;\n\n if (!isHash(txHash)) {\n const failedTransfer: FailedTransfer = {\n ...transfer,\n errorCode: ErrorCode.INVALID_PARAMS,\n failedAtMs: Date.now(),\n status: 'failed',\n };\n updateListener(failedTransfer);\n\n return {\n cancel,\n result: Promise.resolve(failedTransfer),\n };\n }\n\n const sourceClient = getEvmClientForChain({ chain: transfer.sourceChain });\n const targetClient = getEvmClientForChain({ chain: transfer.targetChain });\n let currentTransfer: Transfer = structuredClone(transfer);\n\n const executeTracking = async (): Promise<Transfer> => {\n // Create a loop to poll for confirmations and update the transfer status until\n // failed or completed.\n while (!ac.signal.aborted) {\n switch (currentTransfer.status) {\n case 'source-pending': {\n currentTransfer = await _trackSourceTx({\n currentTransfer,\n signal: ac.signal,\n sourceClient,\n });\n updateListener(currentTransfer);\n break;\n }\n case 'target-pending': {\n currentTransfer = await _trackTargetTx({\n assetIn: currentTransfer.sourceAsset,\n currentTransfer,\n evmConfig,\n signal: ac.signal,\n sourceChainId: currentTransfer.sourceChain.chainId,\n targetChainId: currentTransfer.targetChain.chainId,\n targetClient,\n });\n updateListener(currentTransfer);\n break;\n }\n default: {\n return currentTransfer;\n }\n }\n }\n\n return currentTransfer;\n };\n\n return {\n cancel,\n result: executeTracking(),\n };\n };\n}\n\nexport interface TrackBaseParams {\n currentTransfer: Transfer;\n signal: AbortSignal;\n}\n\nexport interface TrackSourceTxParams extends TrackBaseParams {\n currentTransfer: SourcePendingTransfer;\n sourceClient: ReturnType<typeof getEvmClientForChain>;\n}\n\nexport interface TrackTargetTxParams extends TrackBaseParams {\n assetIn: Asset;\n currentTransfer: TargetPendingTransfer;\n evmConfig: EvmConfig;\n sourceChainId: Caip2ChainId;\n targetChainId: Caip2ChainId;\n targetClient: ReturnType<typeof getEvmClientForChain>;\n}\n\nexport async function _trackSourceTx({\n currentTransfer,\n signal,\n sourceClient,\n}: TrackSourceTxParams): Promise<Transfer> {\n const { confirmationCount, requiredConfirmationCount, txHash } = currentTransfer.source;\n\n if (!isHash(txHash)) {\n const failedTransfer: FailedTransfer = {\n ...currentTransfer,\n errorCode: ErrorCode.INVALID_PARAMS,\n failedAtMs: Date.now(),\n status: 'failed',\n };\n return failedTransfer;\n }\n\n if (confirmationCount >= requiredConfirmationCount) {\n // Move to target-pending\n\n const updatedTransfer: TargetPendingTransfer = {\n ...currentTransfer,\n status: 'target-pending',\n target: {\n confirmationCount: 0,\n requiredConfirmationCount: 1, // EVM txs need 1 confirmation on target chain.\n startedAtMs: Date.now(),\n },\n };\n\n return updatedTransfer;\n }\n\n try {\n const receiptResult = await awaitOrAbort(\n sourceClient.waitForTransactionReceipt({\n confirmations: Math.min(confirmationCount + 1, requiredConfirmationCount),\n hash: txHash,\n }),\n signal,\n );\n\n if (receiptResult.status === 'aborted') {\n return currentTransfer;\n }\n\n const transactionReceipt = receiptResult.value;\n\n if (transactionReceipt.status === 'reverted') {\n return {\n ...currentTransfer,\n errorCode: ErrorCode.TRANSACTION_REVERTED,\n failedAtMs: Date.now(),\n status: 'failed',\n } satisfies FailedTransfer;\n }\n\n // Either update confirmation count or move to target-pending\n const newConfirmationCount: number = await sourceClient\n .getTransactionConfirmations({\n // hash: txHash,\n transactionReceipt,\n })\n .then((count) => Number(count))\n .catch(() => confirmationCount + 1);\n\n // If still not enough confirmations, just update count\n if (newConfirmationCount < requiredConfirmationCount) {\n return {\n ...currentTransfer,\n source: {\n ...currentTransfer.source,\n confirmationCount: newConfirmationCount,\n },\n } satisfies SourcePendingTransfer;\n }\n\n // Move to target-pending\n return {\n ...currentTransfer,\n source: {\n ...currentTransfer.source,\n confirmationCount: newConfirmationCount,\n },\n status: 'target-pending',\n target: {\n confirmationCount: 0,\n requiredConfirmationCount: 1, // EVM txs need 1 confirmation on target chain.\n startedAtMs: Date.now(),\n },\n } satisfies TargetPendingTransfer;\n } catch (error) {\n return {\n ...currentTransfer,\n errorCode: getErrorCodeForViemError(error),\n failedAtMs: Date.now(),\n status: 'failed',\n } satisfies FailedTransfer;\n }\n}\n\nexport async function _trackTargetTx({\n assetIn,\n currentTransfer,\n evmConfig,\n signal,\n sourceChainId,\n targetChainId,\n targetClient,\n}: TrackTargetTxParams): Promise<Transfer> {\n const target = currentTransfer.target ?? {\n confirmationCount: 0,\n requiredConfirmationCount: 1,\n startedAtMs: Date.now(),\n };\n\n if (target.confirmationCount >= target.requiredConfirmationCount) {\n // Move to completed\n const completedTransfer: Transfer = {\n ...currentTransfer,\n status: 'completed',\n completedAtMs: Date.now(),\n };\n return completedTransfer;\n }\n\n if (!target.txHash) {\n // Find the target tx hash via logs and then update the transfer.\n const {\n ethToAva,\n target: {\n token: { address: contractAddress },\n },\n } = getTransferData(\n {\n assetIn,\n sourceChainId,\n targetChainId,\n },\n evmConfig,\n );\n\n const targetTxHash = ethToAva\n ? await _getTargetTxHashEthToAva({\n contractAddress,\n sourceTxHash: currentTransfer.source.txHash,\n targetClient,\n targetStartBlockNumber: currentTransfer.source.targetStartBlockNumber,\n })\n : await _getTargetTxHashAvaToEth({\n contractAddress,\n evmConfig,\n fromAddress: currentTransfer.fromAddress,\n targetClient,\n targetStartBlockNumber: currentTransfer.source.targetStartBlockNumber,\n });\n\n if (!targetTxHash) {\n return {\n ...currentTransfer,\n errorCode: ErrorCode.UNKNOWN,\n errorReason: 'Target transaction hash could not be found',\n failedAtMs: Date.now(),\n status: 'failed',\n } satisfies FailedTransfer;\n }\n\n return {\n ...currentTransfer,\n target: {\n ...target,\n txHash: targetTxHash,\n },\n } satisfies TargetPendingTransfer;\n }\n\n if (!isHash(target.txHash)) {\n return {\n ...currentTransfer,\n errorCode: ErrorCode.INVALID_PARAMS,\n failedAtMs: Date.now(),\n status: 'failed',\n } satisfies FailedTransfer;\n }\n\n try {\n const receiptResult = await awaitOrAbort(\n targetClient.waitForTransactionReceipt({\n // Wait for all required confirmations (which should just be 1 on target).\n // This is a safety in case it's ever more than 1. We just won't \"poll\" multiple times\n // like we do for the source.\n confirmations: target.requiredConfirmationCount,\n hash: target.txHash,\n }),\n signal,\n );\n\n if (receiptResult.status === 'aborted') {\n return currentTransfer;\n }\n\n const transactionReceipt = receiptResult.value;\n\n if (transactionReceipt.status === 'reverted') {\n return {\n ...currentTransfer,\n errorCode: ErrorCode.TRANSACTION_REVERTED,\n failedAtMs: Date.now(),\n status: 'failed',\n } satisfies FailedTransfer;\n }\n\n return {\n ...currentTransfer,\n completedAtMs: Date.now(),\n status: 'completed',\n target: {\n ...target,\n confirmationCount: await targetClient\n .getTransactionConfirmations({\n // hash: target.txHash,\n transactionReceipt,\n })\n .then((count) => Number(count))\n .catch(() => target.requiredConfirmationCount),\n },\n } satisfies CompletedTransfer;\n } catch (error) {\n return {\n ...currentTransfer,\n errorCode: getErrorCodeForViemError(error),\n failedAtMs: Date.now(),\n status: 'failed',\n } satisfies FailedTransfer;\n }\n}\n\nexport async function _getTargetTxHashEthToAva({\n contractAddress,\n sourceTxHash,\n targetClient,\n targetStartBlockNumber,\n}: {\n contractAddress: Hash;\n sourceTxHash: string;\n targetClient: ReturnType<typeof getEvmClientForChain>;\n targetStartBlockNumber: bigint | undefined;\n}): Promise<Hash | null> {\n if (targetStartBlockNumber === undefined) {\n return null;\n }\n\n const logs = await targetClient.getLogs({\n address: contractAddress,\n event: {\n inputs: [\n {\n indexed: false,\n name: 'to',\n type: 'address',\n },\n {\n indexed: false,\n name: 'amount',\n type: 'uint256',\n },\n {\n indexed: false,\n name: 'feeAddress',\n type: 'address',\n },\n {\n indexed: false,\n name: 'feeAmount',\n type: 'uint256',\n },\n {\n indexed: false,\n name: 'originTxId',\n type: 'bytes32',\n },\n ],\n name: 'Mint',\n type: 'event',\n },\n fromBlock: targetStartBlockNumber,\n toBlock: 'latest', // TODO: Consider limiting the range?\n });\n\n // OriginTxId is not indexed. So it cannot be part of the filter.\n const foundLog = logs.find((log) => log.args.originTxId === sourceTxHash); // TODO: Is my assumption correct here? ie that we want to compare the sourceTxHash?\n\n if (!foundLog) {\n return null;\n }\n\n return foundLog.transactionHash;\n}\n\nexport async function _getTargetTxHashAvaToEth({\n contractAddress,\n evmConfig,\n fromAddress,\n targetClient,\n targetStartBlockNumber,\n}: {\n contractAddress: Hash;\n evmConfig: EvmConfig;\n fromAddress: string;\n targetClient: ReturnType<typeof getEvmClientForChain>;\n targetStartBlockNumber: bigint | undefined;\n}): Promise<Hash | null> {\n if (targetStartBlockNumber === undefined) {\n return null;\n }\n\n if (!isAddress(fromAddress)) {\n return null;\n }\n\n const logs = await targetClient.getLogs({\n address: contractAddress,\n args: {\n dst: fromAddress,\n src: evmConfig.walletAddresses.ethereum,\n },\n event: {\n inputs: [\n {\n indexed: true,\n name: 'src',\n type: 'address',\n },\n {\n indexed: true,\n name: 'dst',\n type: 'address',\n },\n {\n indexed: false,\n name: 'wad',\n type: 'uint256',\n },\n ],\n name: 'Transfer',\n type: 'event',\n },\n fromBlock: targetStartBlockNumber,\n toBlock: 'latest', // TODO: Consider limiting the range?\n });\n\n const foundLog = logs.at(0); // TODO: Is this correct? Original code was using -1. But we want \"oldest\" log right? ie the closest to the \"fromBlock\"?\n\n if (!foundLog) {\n return null;\n }\n\n return foundLog.transactionHash;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"track-transfer.cjs","names":["ErrorCode","getEvmClientForChain","awaitOrAbort","getTransferData"],"sources":["../../../../src/transfer-service/avalanche-evm/_handlers/track-transfer.ts"],"sourcesContent":["import { isAddress, isHash, type Hash } from 'viem';\nimport { ErrorCode } from '../../../errors';\nimport type { Asset } from '../../../types/asset';\nimport type { Caip2ChainId } from '../../../types/caip';\nimport type {\n CompletedTransfer,\n FailedTransfer,\n SourcePendingTransfer,\n TargetPendingTransfer,\n Transfer,\n} from '../../../types/transfer';\nimport type { TransferService } from '../../../types/service';\nimport { awaitOrAbort, getEvmClientForChain } from '../../_utils';\nimport type { EvmConfig } from '../_types';\nimport { getTransferData } from '../_utils/transfer-data';\n\nconst MAX_LOG_BLOCK_RANGE = 1024n;\nconst TARGET_HASH_POLL_INTERVAL_MS = 15_000;\n\ntype LogSearchRange = {\n fromBlock: bigint | 'earliest';\n toBlock: bigint | 'latest';\n};\n\nexport interface TrackTransferFactoryConfig {\n config: EvmConfig;\n}\n\nexport function trackTransferFactory({\n config: evmConfig,\n}: TrackTransferFactoryConfig): TransferService['trackTransfer'] {\n return ({ transfer, updateListener }) => {\n const ac = new AbortController();\n const cancel = () => {\n ac.abort();\n };\n\n // Failed and completed transfers are terminal states.\n if (transfer.status === 'completed' || transfer.status === 'failed') {\n return {\n cancel,\n result: Promise.resolve(transfer),\n };\n }\n\n const { txHash } = transfer.source;\n\n if (!isHash(txHash)) {\n const failedTransfer: FailedTransfer = {\n ...transfer,\n errorCode: ErrorCode.INVALID_PARAMS,\n errorReason: 'Invalid source transaction hash',\n failedAtMs: Date.now(),\n status: 'failed',\n };\n updateListener(failedTransfer);\n\n return {\n cancel,\n result: Promise.resolve(failedTransfer),\n };\n }\n\n const sourceClient = getEvmClientForChain({ chain: transfer.sourceChain });\n const targetClient = getEvmClientForChain({ chain: transfer.targetChain });\n let currentTransfer: Transfer = structuredClone(transfer);\n\n const executeTracking = async (): Promise<Transfer> => {\n // Create a loop to poll for confirmations and update the transfer status until\n // failed or completed.\n while (!ac.signal.aborted) {\n let shouldDelayAfterUpdate = false;\n\n switch (currentTransfer.status) {\n case 'source-pending': {\n currentTransfer = await _trackSourceTx({\n currentTransfer,\n signal: ac.signal,\n sourceClient,\n });\n updateListener(currentTransfer);\n break;\n }\n case 'target-pending': {\n currentTransfer = await _trackTargetTx({\n assetIn: currentTransfer.sourceAsset,\n currentTransfer,\n evmConfig,\n signal: ac.signal,\n sourceChainId: currentTransfer.sourceChain.chainId,\n targetChainId: currentTransfer.targetChain.chainId,\n targetClient,\n });\n shouldDelayAfterUpdate = currentTransfer.status === 'target-pending' && !currentTransfer.target?.txHash;\n updateListener(currentTransfer);\n\n if (shouldDelayAfterUpdate) {\n await _waitForNextTargetHashPollingCycle({ signal: ac.signal });\n }\n\n break;\n }\n default: {\n return currentTransfer;\n }\n }\n }\n\n return currentTransfer;\n };\n\n return {\n cancel,\n result: executeTracking(),\n };\n };\n}\n\nexport interface TrackBaseParams {\n currentTransfer: Transfer;\n signal: AbortSignal;\n}\n\nexport interface TrackSourceTxParams extends TrackBaseParams {\n currentTransfer: SourcePendingTransfer;\n sourceClient: ReturnType<typeof getEvmClientForChain>;\n}\n\nexport interface TrackTargetTxParams extends TrackBaseParams {\n assetIn: Asset;\n currentTransfer: TargetPendingTransfer;\n evmConfig: EvmConfig;\n sourceChainId: Caip2ChainId;\n targetChainId: Caip2ChainId;\n targetClient: ReturnType<typeof getEvmClientForChain>;\n}\n\nexport async function _trackSourceTx({\n currentTransfer,\n signal,\n sourceClient,\n}: TrackSourceTxParams): Promise<Transfer> {\n const { confirmationCount, requiredConfirmationCount, txHash } = currentTransfer.source;\n\n if (!isHash(txHash)) {\n const failedTransfer: FailedTransfer = {\n ...currentTransfer,\n errorCode: ErrorCode.INVALID_PARAMS,\n errorReason: 'Invalid source transaction hash',\n failedAtMs: Date.now(),\n status: 'failed',\n };\n return failedTransfer;\n }\n\n if (confirmationCount >= requiredConfirmationCount) {\n // Move to target-pending\n\n const updatedTransfer: TargetPendingTransfer = {\n ...currentTransfer,\n status: 'target-pending',\n target: {\n confirmationCount: 0,\n requiredConfirmationCount: 1, // EVM txs need 1 confirmation on target chain.\n startedAtMs: Date.now(),\n },\n };\n\n return updatedTransfer;\n }\n\n try {\n const receiptResult = await awaitOrAbort(\n sourceClient.waitForTransactionReceipt({\n confirmations: Math.min(confirmationCount + 1, requiredConfirmationCount),\n hash: txHash,\n }),\n signal,\n );\n\n if (receiptResult.status === 'aborted') {\n return currentTransfer;\n }\n\n const transactionReceipt = receiptResult.value;\n\n if (transactionReceipt.status === 'reverted') {\n return {\n ...currentTransfer,\n errorCode: ErrorCode.TRANSACTION_REVERTED,\n errorReason: 'Source transaction was reverted',\n failedAtMs: Date.now(),\n status: 'failed',\n } satisfies FailedTransfer;\n }\n\n // Either update confirmation count or move to target-pending\n const newConfirmationCount: number = await sourceClient\n .getTransactionConfirmations({\n // hash: txHash,\n transactionReceipt,\n })\n .then((count) => Number(count))\n .catch(() => confirmationCount + 1);\n\n // If still not enough confirmations, just update count\n if (newConfirmationCount < requiredConfirmationCount) {\n return {\n ...currentTransfer,\n source: {\n ...currentTransfer.source,\n confirmationCount: newConfirmationCount,\n },\n } satisfies SourcePendingTransfer;\n }\n\n // Move to target-pending\n return {\n ...currentTransfer,\n source: {\n ...currentTransfer.source,\n confirmationCount: newConfirmationCount,\n },\n status: 'target-pending',\n target: {\n confirmationCount: 0,\n requiredConfirmationCount: 1, // EVM txs need 1 confirmation on target chain.\n startedAtMs: Date.now(),\n },\n } satisfies TargetPendingTransfer;\n } catch {\n return currentTransfer;\n }\n}\n\nexport async function _trackTargetTx({\n assetIn,\n currentTransfer,\n evmConfig,\n signal,\n sourceChainId,\n targetChainId,\n targetClient,\n}: TrackTargetTxParams): Promise<Transfer> {\n const target = currentTransfer.target ?? {\n confirmationCount: 0,\n requiredConfirmationCount: 1,\n startedAtMs: Date.now(),\n };\n\n if (target.confirmationCount >= target.requiredConfirmationCount) {\n // Move to completed\n const completedTransfer: Transfer = {\n ...currentTransfer,\n status: 'completed',\n completedAtMs: Date.now(),\n };\n return completedTransfer;\n }\n\n if (!target.txHash) {\n // Find the target tx hash via logs and then update the transfer.\n const {\n ethToAva,\n target: {\n token: { address: contractAddress },\n },\n } = getTransferData(\n {\n assetIn,\n sourceChainId,\n targetChainId,\n },\n evmConfig,\n );\n\n const latestBlockNumber =\n typeof targetClient.getBlockNumber === 'function'\n ? await targetClient.getBlockNumber().catch(() => undefined)\n : undefined;\n\n const targetTxHash = await (ethToAva\n ? _getTargetTxHashEthToAva({\n contractAddress,\n latestBlockNumber,\n sourceTxHash: currentTransfer.source.txHash,\n targetClient,\n targetStartBlockNumber: currentTransfer.source.targetStartBlockNumber,\n })\n : _getTargetTxHashAvaToEth({\n contractAddress,\n evmConfig,\n fromAddress: currentTransfer.fromAddress,\n latestBlockNumber,\n targetClient,\n targetStartBlockNumber: currentTransfer.source.targetStartBlockNumber,\n })\n ).catch(() => null);\n\n if (!targetTxHash) {\n if (latestBlockNumber === undefined) {\n return currentTransfer;\n }\n\n return {\n ...currentTransfer,\n source: {\n ...currentTransfer.source,\n targetStartBlockNumber: latestBlockNumber,\n },\n } satisfies TargetPendingTransfer;\n }\n\n return {\n ...currentTransfer,\n target: {\n ...target,\n txHash: targetTxHash,\n },\n } satisfies TargetPendingTransfer;\n }\n\n if (!isHash(target.txHash)) {\n return {\n ...currentTransfer,\n errorCode: ErrorCode.INVALID_PARAMS,\n errorReason: 'Invalid target transaction hash',\n failedAtMs: Date.now(),\n status: 'failed',\n } satisfies FailedTransfer;\n }\n\n try {\n const receiptResult = await awaitOrAbort(\n targetClient.waitForTransactionReceipt({\n // Wait for all required confirmations (which should just be 1 on target).\n // This is a safety in case it's ever more than 1. We just won't \"poll\" multiple times\n // like we do for the source.\n confirmations: target.requiredConfirmationCount,\n hash: target.txHash,\n }),\n signal,\n );\n\n if (receiptResult.status === 'aborted') {\n return currentTransfer;\n }\n\n const transactionReceipt = receiptResult.value;\n\n if (transactionReceipt.status === 'reverted') {\n return {\n ...currentTransfer,\n errorCode: ErrorCode.TRANSACTION_REVERTED,\n errorReason: 'Target transaction was reverted',\n failedAtMs: Date.now(),\n status: 'failed',\n } satisfies FailedTransfer;\n }\n\n return {\n ...currentTransfer,\n completedAtMs: Date.now(),\n status: 'completed',\n target: {\n ...target,\n confirmationCount: await targetClient\n .getTransactionConfirmations({\n // hash: target.txHash,\n transactionReceipt,\n })\n .then((count) => Number(count))\n .catch(() => target.requiredConfirmationCount),\n },\n } satisfies CompletedTransfer;\n } catch {\n return currentTransfer;\n }\n}\n\nexport async function _getTargetTxHashEthToAva({\n contractAddress,\n latestBlockNumber,\n sourceTxHash,\n targetClient,\n targetStartBlockNumber,\n}: {\n contractAddress: Hash;\n latestBlockNumber: bigint | undefined;\n sourceTxHash: string;\n targetClient: ReturnType<typeof getEvmClientForChain>;\n targetStartBlockNumber: bigint | undefined;\n}): Promise<Hash | null> {\n if (targetStartBlockNumber === undefined) {\n return null;\n }\n\n const { fromBlock, toBlock } = _getLogSearchRange({\n latestBlockNumber,\n targetStartBlockNumber,\n });\n\n const logs = await targetClient.getLogs({\n address: contractAddress,\n event: {\n inputs: [\n {\n indexed: false,\n name: 'to',\n type: 'address',\n },\n {\n indexed: false,\n name: 'amount',\n type: 'uint256',\n },\n {\n indexed: false,\n name: 'feeAddress',\n type: 'address',\n },\n {\n indexed: false,\n name: 'feeAmount',\n type: 'uint256',\n },\n {\n indexed: false,\n name: 'originTxId',\n type: 'bytes32',\n },\n ],\n name: 'Mint',\n type: 'event',\n },\n fromBlock,\n toBlock,\n });\n\n // OriginTxId is not indexed. So it cannot be part of the filter.\n const foundLog = logs.find((log) => log.args.originTxId === sourceTxHash); // TODO: Is my assumption correct here? ie that we want to compare the sourceTxHash?\n\n if (!foundLog) {\n return null;\n }\n\n return foundLog.transactionHash;\n}\n\nexport async function _getTargetTxHashAvaToEth({\n contractAddress,\n evmConfig,\n fromAddress,\n latestBlockNumber,\n targetClient,\n targetStartBlockNumber,\n}: {\n contractAddress: Hash;\n evmConfig: EvmConfig;\n fromAddress: string;\n latestBlockNumber: bigint | undefined;\n targetClient: ReturnType<typeof getEvmClientForChain>;\n targetStartBlockNumber: bigint | undefined;\n}): Promise<Hash | null> {\n if (targetStartBlockNumber === undefined) {\n return null;\n }\n\n if (!isAddress(fromAddress)) {\n return null;\n }\n\n const { fromBlock, toBlock } = _getLogSearchRange({\n latestBlockNumber,\n targetStartBlockNumber,\n });\n\n const logs = await targetClient.getLogs({\n address: contractAddress,\n args: {\n dst: fromAddress,\n src: evmConfig.walletAddresses.ethereum,\n },\n event: {\n inputs: [\n {\n indexed: true,\n name: 'src',\n type: 'address',\n },\n {\n indexed: true,\n name: 'dst',\n type: 'address',\n },\n {\n indexed: false,\n name: 'wad',\n type: 'uint256',\n },\n ],\n name: 'Transfer',\n type: 'event',\n },\n fromBlock,\n toBlock,\n });\n\n const foundLog = logs.at(-1);\n\n if (!foundLog) {\n return null;\n }\n\n return foundLog.transactionHash;\n}\n\nfunction _getLogSearchRange({\n latestBlockNumber,\n targetStartBlockNumber,\n}: {\n latestBlockNumber: bigint | undefined;\n targetStartBlockNumber: bigint;\n}): LogSearchRange {\n const fromBlock =\n targetStartBlockNumber > MAX_LOG_BLOCK_RANGE ? targetStartBlockNumber - MAX_LOG_BLOCK_RANGE : 'earliest';\n const highestBlockNumber = targetStartBlockNumber + MAX_LOG_BLOCK_RANGE;\n const toBlock =\n latestBlockNumber !== undefined && highestBlockNumber < latestBlockNumber ? highestBlockNumber : 'latest';\n\n return {\n fromBlock,\n toBlock,\n };\n}\n\nasync function _waitForNextTargetHashPollingCycle({ signal }: { signal: AbortSignal }): Promise<void> {\n await awaitOrAbort(new Promise<void>((resolve) => setTimeout(resolve, TARGET_HASH_POLL_INTERVAL_MS)), signal);\n}\n"],"mappings":"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"}
|