@avalabs/fusion-sdk 0.7.0 → 0.9.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.
Files changed (69) hide show
  1. package/dist/mod.cjs +1 -1
  2. package/dist/mod.d.cts +2 -2
  3. package/dist/mod.d.ts +2 -2
  4. package/dist/mod.js +1 -1
  5. package/dist/transfer-manager.cjs +1 -1
  6. package/dist/transfer-manager.cjs.map +1 -1
  7. package/dist/transfer-manager.js +1 -1
  8. package/dist/transfer-manager.js.map +1 -1
  9. package/dist/transfer-service/_tracking-utilities.cjs +1 -1
  10. package/dist/transfer-service/_tracking-utilities.cjs.map +1 -1
  11. package/dist/transfer-service/_tracking-utilities.js +1 -1
  12. package/dist/transfer-service/_tracking-utilities.js.map +1 -1
  13. package/dist/transfer-service/_utils.cjs +1 -1
  14. package/dist/transfer-service/_utils.cjs.map +1 -1
  15. package/dist/transfer-service/_utils.js +1 -1
  16. package/dist/transfer-service/_utils.js.map +1 -1
  17. package/dist/transfer-service/_warden-config-schema.cjs.map +1 -1
  18. package/dist/transfer-service/_warden-config-schema.js.map +1 -1
  19. package/dist/transfer-service/avalanche-evm/_handlers/track-transfer.cjs +1 -1
  20. package/dist/transfer-service/avalanche-evm/_handlers/track-transfer.cjs.map +1 -1
  21. package/dist/transfer-service/avalanche-evm/_handlers/track-transfer.js +1 -1
  22. package/dist/transfer-service/avalanche-evm/_handlers/track-transfer.js.map +1 -1
  23. package/dist/transfer-service/avalanche-evm/_utils/get-config.cjs +1 -1
  24. package/dist/transfer-service/avalanche-evm/_utils/get-config.js +1 -1
  25. package/dist/transfer-service/avalanche-evm/_utils/transfer-data.cjs +1 -1
  26. package/dist/transfer-service/avalanche-evm/_utils/transfer-data.cjs.map +1 -1
  27. package/dist/transfer-service/avalanche-evm/_utils/transfer-data.js +1 -1
  28. package/dist/transfer-service/avalanche-evm/_utils/transfer-data.js.map +1 -1
  29. package/dist/transfer-service/lombard/btc-to-btcb/_handlers/stream-quotes.cjs +1 -1
  30. package/dist/transfer-service/lombard/btc-to-btcb/_handlers/stream-quotes.js +1 -1
  31. package/dist/transfer-service/lombard/btc-to-btcb/_handlers/track-transfer.cjs +1 -1
  32. package/dist/transfer-service/lombard/btc-to-btcb/_handlers/track-transfer.cjs.map +1 -1
  33. package/dist/transfer-service/lombard/btc-to-btcb/_handlers/track-transfer.js +1 -1
  34. package/dist/transfer-service/lombard/btc-to-btcb/_handlers/track-transfer.js.map +1 -1
  35. package/dist/transfer-service/lombard/btcb-to-btc/_handlers/stream-quotes.cjs +1 -1
  36. package/dist/transfer-service/lombard/btcb-to-btc/_handlers/stream-quotes.js +1 -1
  37. package/dist/transfer-service/lombard/btcb-to-btc/_handlers/track-transfer.cjs +1 -1
  38. package/dist/transfer-service/lombard/btcb-to-btc/_handlers/track-transfer.cjs.map +1 -1
  39. package/dist/transfer-service/lombard/btcb-to-btc/_handlers/track-transfer.js +1 -1
  40. package/dist/transfer-service/lombard/btcb-to-btc/_handlers/track-transfer.js.map +1 -1
  41. package/dist/transfer-service/markr/_handlers/estimate-native-fee.cjs +1 -1
  42. package/dist/transfer-service/markr/_handlers/estimate-native-fee.cjs.map +1 -1
  43. package/dist/transfer-service/markr/_handlers/estimate-native-fee.js +1 -1
  44. package/dist/transfer-service/markr/_handlers/estimate-native-fee.js.map +1 -1
  45. package/dist/transfer-service/markr/_handlers/stream-quotes.cjs +1 -1
  46. package/dist/transfer-service/markr/_handlers/stream-quotes.js +1 -1
  47. package/dist/transfer-service/markr/_handlers/track-transfer.cjs +1 -1
  48. package/dist/transfer-service/markr/_handlers/track-transfer.cjs.map +1 -1
  49. package/dist/transfer-service/markr/_handlers/track-transfer.js +1 -1
  50. package/dist/transfer-service/markr/_handlers/track-transfer.js.map +1 -1
  51. package/dist/transfer-service/markr/_schema.cjs +1 -1
  52. package/dist/transfer-service/markr/_schema.cjs.map +1 -1
  53. package/dist/transfer-service/markr/_schema.js +1 -1
  54. package/dist/transfer-service/markr/_schema.js.map +1 -1
  55. package/dist/transfer-service/markr/_utils.cjs +1 -1
  56. package/dist/transfer-service/markr/_utils.js +1 -1
  57. package/dist/types/transfer-manager.d.cts +0 -12
  58. package/dist/types/transfer-manager.d.ts +0 -12
  59. package/dist/types/transfer.d.cts +24 -5
  60. package/dist/types/transfer.d.ts +24 -5
  61. package/dist/utils/transfer-utils.cjs +1 -1
  62. package/dist/utils/transfer-utils.cjs.map +1 -1
  63. package/dist/utils/transfer-utils.js +1 -1
  64. package/dist/utils/transfer-utils.js.map +1 -1
  65. package/package.json +3 -3
  66. package/dist/_utils/merge-assets.cjs +0 -2
  67. package/dist/_utils/merge-assets.cjs.map +0 -1
  68. package/dist/_utils/merge-assets.js +0 -2
  69. package/dist/_utils/merge-assets.js.map +0 -1
package/dist/mod.cjs CHANGED
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./constants.cjs`),t=require(`./errors.cjs`),n=require(`./type-guards.cjs`),r=require(`./utils/caip.cjs`),i=require(`./transfer-manager.cjs`),a=require(`./utils/transfer-utils.cjs`);exports.AVALANCHE_FUJI_CHAIN=e.AVALANCHE_FUJI_CHAIN,exports.AVALANCHE_MAINNET_CHAIN=e.AVALANCHE_MAINNET_CHAIN,exports.AbortedError=t.AbortedError,exports.AvalancheChainIds=e.AvalancheChainIds,exports.BITCOIN_MAINNET_CHAIN=e.BITCOIN_MAINNET_CHAIN,exports.BITCOIN_TESTNET_CHAIN=e.BITCOIN_TESTNET_CHAIN,exports.BTC_SERVICE_TYPES=e.BTC_SERVICE_TYPES,exports.BitcoinChainIds=e.BitcoinChainIds,exports.Blockchain=e.Blockchain,exports.ERC_ZERO_ADDRESS=e.ERC_ZERO_ADDRESS,exports.ETHEREUM_MAINNET_CHAIN=e.ETHEREUM_MAINNET_CHAIN,exports.ETHEREUM_SEPOLIA_CHAIN=e.ETHEREUM_SEPOLIA_CHAIN,exports.EVM_SERVICE_TYPES=e.EVM_SERVICE_TYPES,exports.Environment=e.Environment,exports.ErrorCode=t.ErrorCode,exports.ErrorReason=t.ErrorReason,exports.EthereumChainIds=e.EthereumChainIds,exports.EvmChainId=e.EvmChainId,exports.FEE_RATE_TIER_TO_BITCOIN=e.FEE_RATE_TIER_TO_BITCOIN,exports.HttpError=t.HttpError,exports.InvalidParamsError=t.InvalidParamsError,exports.NATIVE_AVAX=e.NATIVE_AVAX,exports.NATIVE_ETH=e.NATIVE_ETH,exports.ResponseValidationError=t.ResponseValidationError,exports.SOLANA_DEVNET_CHAIN=e.SOLANA_DEVNET_CHAIN,exports.SOLANA_MAINNET_CHAIN=e.SOLANA_MAINNET_CHAIN,exports.SOL_MINT_ADDRESS=e.SOL_MINT_ADDRESS,exports.SdkError=t.SdkError,exports.ServiceInitializationError=t.ServiceInitializationError,exports.ServiceType=e.ServiceType,exports.ServiceUnavailableError=t.ServiceUnavailableError,exports.SolanaChainIds=e.SolanaChainIds,exports.TimeoutError=t.TimeoutError,exports.TokenType=e.TokenType,exports.TransferSignatureReason=e.TransferSignatureReason,exports.caip2ToEip155ChainId=r.caip2ToEip155ChainId,exports.caip2ToEip155HexChainId=r.caip2ToEip155HexChainId,exports.createTransferManager=i.createTransferManager,exports.eip155ChainIdToCaip2=r.eip155ChainIdToCaip2,exports.isAbortedError=t.isAbortedError,exports.isCaip2ChainId=r.isCaip2ChainId,exports.isEnvironment=n.isEnvironment,exports.isErc20Asset=n.isErc20Asset,exports.isEvmBridgeInitializer=n.isEvmBridgeInitializer,exports.isHttpError=t.isHttpError,exports.isInvalidParamsError=t.isInvalidParamsError,exports.isLombardServiceInitializer=n.isLombardServiceInitializer,exports.isMarkrServiceInitializer=n.isMarkrServiceInitializer,exports.isNativeAsset=n.isNativeAsset,exports.isResponseValidationError=t.isResponseValidationError,exports.isSdkError=t.isSdkError,exports.isServiceInitializationError=t.isServiceInitializationError,exports.isServiceInitializer=n.isServiceInitializer,exports.isServiceUnavailableError=t.isServiceUnavailableError,exports.isSplAsset=n.isSplAsset,exports.isTimeoutError=t.isTimeoutError,exports.parseTransfer=a.parseTransfer,exports.splitCaip2ChainId=r.splitCaip2ChainId,exports.stringifyTransfer=a.stringifyTransfer;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./constants.cjs`),t=require(`./errors.cjs`),n=require(`./type-guards.cjs`),r=require(`./transfer-manager.cjs`),i=require(`./utils/caip.cjs`),a=require(`./utils/transfer-utils.cjs`);exports.AVALANCHE_FUJI_CHAIN=e.AVALANCHE_FUJI_CHAIN,exports.AVALANCHE_MAINNET_CHAIN=e.AVALANCHE_MAINNET_CHAIN,exports.AbortedError=t.AbortedError,exports.AvalancheChainIds=e.AvalancheChainIds,exports.BITCOIN_MAINNET_CHAIN=e.BITCOIN_MAINNET_CHAIN,exports.BITCOIN_TESTNET_CHAIN=e.BITCOIN_TESTNET_CHAIN,exports.BTC_SERVICE_TYPES=e.BTC_SERVICE_TYPES,exports.BitcoinChainIds=e.BitcoinChainIds,exports.Blockchain=e.Blockchain,exports.ERC_ZERO_ADDRESS=e.ERC_ZERO_ADDRESS,exports.ETHEREUM_MAINNET_CHAIN=e.ETHEREUM_MAINNET_CHAIN,exports.ETHEREUM_SEPOLIA_CHAIN=e.ETHEREUM_SEPOLIA_CHAIN,exports.EVM_SERVICE_TYPES=e.EVM_SERVICE_TYPES,exports.Environment=e.Environment,exports.ErrorCode=t.ErrorCode,exports.ErrorReason=t.ErrorReason,exports.EthereumChainIds=e.EthereumChainIds,exports.EvmChainId=e.EvmChainId,exports.FEE_RATE_TIER_TO_BITCOIN=e.FEE_RATE_TIER_TO_BITCOIN,exports.HttpError=t.HttpError,exports.InvalidParamsError=t.InvalidParamsError,exports.NATIVE_AVAX=e.NATIVE_AVAX,exports.NATIVE_ETH=e.NATIVE_ETH,exports.ResponseValidationError=t.ResponseValidationError,exports.SOLANA_DEVNET_CHAIN=e.SOLANA_DEVNET_CHAIN,exports.SOLANA_MAINNET_CHAIN=e.SOLANA_MAINNET_CHAIN,exports.SOL_MINT_ADDRESS=e.SOL_MINT_ADDRESS,exports.SdkError=t.SdkError,exports.ServiceInitializationError=t.ServiceInitializationError,exports.ServiceType=e.ServiceType,exports.ServiceUnavailableError=t.ServiceUnavailableError,exports.SolanaChainIds=e.SolanaChainIds,exports.TimeoutError=t.TimeoutError,exports.TokenType=e.TokenType,exports.TransferSignatureReason=e.TransferSignatureReason,exports.caip2ToEip155ChainId=i.caip2ToEip155ChainId,exports.caip2ToEip155HexChainId=i.caip2ToEip155HexChainId,exports.createTransferManager=r.createTransferManager,exports.eip155ChainIdToCaip2=i.eip155ChainIdToCaip2,exports.isAbortedError=t.isAbortedError,exports.isCaip2ChainId=i.isCaip2ChainId,exports.isEnvironment=n.isEnvironment,exports.isErc20Asset=n.isErc20Asset,exports.isEvmBridgeInitializer=n.isEvmBridgeInitializer,exports.isHttpError=t.isHttpError,exports.isInvalidParamsError=t.isInvalidParamsError,exports.isLombardServiceInitializer=n.isLombardServiceInitializer,exports.isMarkrServiceInitializer=n.isMarkrServiceInitializer,exports.isNativeAsset=n.isNativeAsset,exports.isResponseValidationError=t.isResponseValidationError,exports.isSdkError=t.isSdkError,exports.isServiceInitializationError=t.isServiceInitializationError,exports.isServiceInitializer=n.isServiceInitializer,exports.isServiceUnavailableError=t.isServiceUnavailableError,exports.isSplAsset=n.isSplAsset,exports.isTimeoutError=t.isTimeoutError,exports.parseTransfer=a.parseTransfer,exports.splitCaip2ChainId=i.splitCaip2ChainId,exports.stringifyTransfer=a.stringifyTransfer;
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 };
package/dist/mod.js CHANGED
@@ -1 +1 @@
1
- import{AVALANCHE_FUJI_CHAIN as e,AVALANCHE_MAINNET_CHAIN as t,AvalancheChainIds as n,BITCOIN_MAINNET_CHAIN as r,BITCOIN_TESTNET_CHAIN as i,BTC_SERVICE_TYPES as a,BitcoinChainIds as o,Blockchain as s,ERC_ZERO_ADDRESS as c,ETHEREUM_MAINNET_CHAIN as l,ETHEREUM_SEPOLIA_CHAIN as u,EVM_SERVICE_TYPES as d,Environment as f,EthereumChainIds as p,EvmChainId as m,FEE_RATE_TIER_TO_BITCOIN as h,NATIVE_AVAX as g,NATIVE_ETH as _,SOLANA_DEVNET_CHAIN as v,SOLANA_MAINNET_CHAIN as y,SOL_MINT_ADDRESS as b,ServiceType as x,SolanaChainIds as S,TokenType as C,TransferSignatureReason as w}from"./constants.js";import{AbortedError as T,ErrorCode as E,ErrorReason as D,HttpError as O,InvalidParamsError as k,ResponseValidationError as A,SdkError as j,ServiceInitializationError as M,ServiceUnavailableError as N,TimeoutError as P,isAbortedError as F,isHttpError as I,isInvalidParamsError as L,isResponseValidationError as R,isSdkError as z,isServiceInitializationError as B,isServiceUnavailableError as V,isTimeoutError as H}from"./errors.js";import{isEnvironment as U,isErc20Asset as W,isEvmBridgeInitializer as G,isLombardServiceInitializer as K,isMarkrServiceInitializer as q,isNativeAsset as J,isServiceInitializer as Y,isSplAsset as X}from"./type-guards.js";import{caip2ToEip155ChainId as Z,caip2ToEip155HexChainId as Q,eip155ChainIdToCaip2 as $,isCaip2ChainId as ee,splitCaip2ChainId as te}from"./utils/caip.js";import{createTransferManager as ne}from"./transfer-manager.js";import{parseTransfer as re,stringifyTransfer as ie}from"./utils/transfer-utils.js";export{e as AVALANCHE_FUJI_CHAIN,t as AVALANCHE_MAINNET_CHAIN,T as AbortedError,n as AvalancheChainIds,r as BITCOIN_MAINNET_CHAIN,i as BITCOIN_TESTNET_CHAIN,a as BTC_SERVICE_TYPES,o as BitcoinChainIds,s as Blockchain,c as ERC_ZERO_ADDRESS,l as ETHEREUM_MAINNET_CHAIN,u as ETHEREUM_SEPOLIA_CHAIN,d as EVM_SERVICE_TYPES,f as Environment,E as ErrorCode,D as ErrorReason,p as EthereumChainIds,m as EvmChainId,h as FEE_RATE_TIER_TO_BITCOIN,O as HttpError,k as InvalidParamsError,g as NATIVE_AVAX,_ as NATIVE_ETH,A as ResponseValidationError,v as SOLANA_DEVNET_CHAIN,y as SOLANA_MAINNET_CHAIN,b as SOL_MINT_ADDRESS,j as SdkError,M as ServiceInitializationError,x as ServiceType,N as ServiceUnavailableError,S as SolanaChainIds,P as TimeoutError,C as TokenType,w as TransferSignatureReason,Z as caip2ToEip155ChainId,Q as caip2ToEip155HexChainId,ne as createTransferManager,$ as eip155ChainIdToCaip2,F as isAbortedError,ee as isCaip2ChainId,U as isEnvironment,W as isErc20Asset,G as isEvmBridgeInitializer,I as isHttpError,L as isInvalidParamsError,K as isLombardServiceInitializer,q as isMarkrServiceInitializer,J as isNativeAsset,R as isResponseValidationError,z as isSdkError,B as isServiceInitializationError,Y as isServiceInitializer,V as isServiceUnavailableError,X as isSplAsset,H as isTimeoutError,re as parseTransfer,te as splitCaip2ChainId,ie as stringifyTransfer};
1
+ import{AVALANCHE_FUJI_CHAIN as e,AVALANCHE_MAINNET_CHAIN as t,AvalancheChainIds as n,BITCOIN_MAINNET_CHAIN as r,BITCOIN_TESTNET_CHAIN as i,BTC_SERVICE_TYPES as a,BitcoinChainIds as o,Blockchain as s,ERC_ZERO_ADDRESS as c,ETHEREUM_MAINNET_CHAIN as l,ETHEREUM_SEPOLIA_CHAIN as u,EVM_SERVICE_TYPES as d,Environment as f,EthereumChainIds as p,EvmChainId as m,FEE_RATE_TIER_TO_BITCOIN as h,NATIVE_AVAX as g,NATIVE_ETH as _,SOLANA_DEVNET_CHAIN as v,SOLANA_MAINNET_CHAIN as y,SOL_MINT_ADDRESS as b,ServiceType as x,SolanaChainIds as S,TokenType as C,TransferSignatureReason as w}from"./constants.js";import{AbortedError as T,ErrorCode as E,ErrorReason as D,HttpError as O,InvalidParamsError as k,ResponseValidationError as A,SdkError as j,ServiceInitializationError as M,ServiceUnavailableError as N,TimeoutError as P,isAbortedError as F,isHttpError as I,isInvalidParamsError as L,isResponseValidationError as R,isSdkError as z,isServiceInitializationError as B,isServiceUnavailableError as V,isTimeoutError as H}from"./errors.js";import{isEnvironment as U,isErc20Asset as W,isEvmBridgeInitializer as G,isLombardServiceInitializer as K,isMarkrServiceInitializer as q,isNativeAsset as J,isServiceInitializer as Y,isSplAsset as X}from"./type-guards.js";import{createTransferManager as Z}from"./transfer-manager.js";import{caip2ToEip155ChainId as Q,caip2ToEip155HexChainId as $,eip155ChainIdToCaip2 as ee,isCaip2ChainId as te,splitCaip2ChainId as ne}from"./utils/caip.js";import{parseTransfer as re,stringifyTransfer as ie}from"./utils/transfer-utils.js";export{e as AVALANCHE_FUJI_CHAIN,t as AVALANCHE_MAINNET_CHAIN,T as AbortedError,n as AvalancheChainIds,r as BITCOIN_MAINNET_CHAIN,i as BITCOIN_TESTNET_CHAIN,a as BTC_SERVICE_TYPES,o as BitcoinChainIds,s as Blockchain,c as ERC_ZERO_ADDRESS,l as ETHEREUM_MAINNET_CHAIN,u as ETHEREUM_SEPOLIA_CHAIN,d as EVM_SERVICE_TYPES,f as Environment,E as ErrorCode,D as ErrorReason,p as EthereumChainIds,m as EvmChainId,h as FEE_RATE_TIER_TO_BITCOIN,O as HttpError,k as InvalidParamsError,g as NATIVE_AVAX,_ as NATIVE_ETH,A as ResponseValidationError,v as SOLANA_DEVNET_CHAIN,y as SOLANA_MAINNET_CHAIN,b as SOL_MINT_ADDRESS,j as SdkError,M as ServiceInitializationError,x as ServiceType,N as ServiceUnavailableError,S as SolanaChainIds,P as TimeoutError,C as TokenType,w as TransferSignatureReason,Q as caip2ToEip155ChainId,$ as caip2ToEip155HexChainId,Z as createTransferManager,ee as eip155ChainIdToCaip2,F as isAbortedError,te as isCaip2ChainId,U as isEnvironment,W as isErc20Asset,G as isEvmBridgeInitializer,I as isHttpError,L as isInvalidParamsError,K as isLombardServiceInitializer,q as isMarkrServiceInitializer,J as isNativeAsset,R as isResponseValidationError,z as isSdkError,B as isServiceInitializationError,Y as isServiceInitializer,V as isServiceUnavailableError,X as isSplAsset,H as isTimeoutError,re as parseTransfer,ne as splitCaip2ChainId,ie as stringifyTransfer};
@@ -1,2 +1,2 @@
1
- const e=require(`./constants.cjs`),t=require(`./errors.cjs`),n=require(`./type-guards.cjs`),r=require(`./quoter/quoter.cjs`),i=require(`./utils/caip.cjs`),a=require(`./_utils/merge-assets.cjs`),o=require(`./utils/asset-id.cjs`),s=e=>{if(!n.isEnvironment(e))throw new t.ServiceInitializationError(t.ErrorReason.ENVIRONMENT_NOT_SUPPORTED)},c=e=>{if(e.length===0)throw new t.ServiceInitializationError(`No service initializers provided.`);if(e.some(e=>!n.isServiceInitializer(e)))throw new t.ServiceInitializationError(`One or more service initializers are invalid.`);let r=new Set;for(let n of e){if(r.has(n.type))throw new t.ServiceInitializationError(t.ErrorReason.DUPLICATE_SERVICE_INITIALIZATION,`Service type "${n.type}" has been initialized more than once.`);r.add(n.type)}},l=async({environment:n,serviceInitializers:r,fetch:i})=>{let a=new Map,o={},s=(e,n)=>{if(n instanceof t.ServiceInitializationError)return n;let r=n instanceof Error?n.message:String(n);return new t.ServiceInitializationError(t.ErrorReason.UNKNOWN,`Failed to initialize service type "${e}". ${r}`,n)},c=async(e,t)=>{try{let n=await t();a.set(e,n),o[e]={status:`initialized`}}catch(t){o[e]={status:`error`,error:s(e,t)}}};for(let s of r){if(a.has(s.type))throw new t.ServiceInitializationError(t.ErrorReason.DUPLICATE_SERVICE_INITIALIZATION,`Service type "${s.type}" has been initialized more than once.`);switch(s.type){case e.ServiceType.AVALANCHE_EVM:await c(e.ServiceType.AVALANCHE_EVM,async()=>{let{createAvalancheEvmService:e}=await Promise.resolve().then(()=>require(`./transfer-service/avalanche-evm/avalanche-evm-service.cjs`));return await e({environment:n,evmSigner:s.evmSigner,fetch:i})});break;case e.ServiceType.LOMBARD_BTCB_TO_BTC:await c(e.ServiceType.LOMBARD_BTCB_TO_BTC,async()=>{let{createBtcbToBtcService:e}=await Promise.resolve().then(()=>require(`./transfer-service/lombard/btcb-to-btc-service.cjs`));return await e({bitcoinFunctions:s.btcFunctions,environment:n,evmSigner:s.evmSigner,fetch:i})});break;case e.ServiceType.LOMBARD_BTC_TO_BTCB:await c(e.ServiceType.LOMBARD_BTC_TO_BTCB,async()=>{let{createBtcToBtcbService:e}=await Promise.resolve().then(()=>require(`./transfer-service/lombard/btc-to-btcb-service.cjs`));return await e({bitcoinFunctions:s.btcFunctions,btcSigner:s.btcSigner,environment:n,evmSigner:s.evmSigner,fetch:i})});break;case e.ServiceType.MARKR:if(n!==e.Environment.PROD){o[e.ServiceType.MARKR]={status:`unsupported-environment`,message:`Service type "${e.ServiceType.MARKR}" is only supported in production environment.`};break}await c(e.ServiceType.MARKR,async()=>{let{createMarkrService:e}=await Promise.resolve().then(()=>require(`./transfer-service/markr/markr-service.cjs`));return await e({apiBaseUrl:s.markrApiUrl,apiToken:s.markrApiToken,appId:s.markrAppId,disableCrossChainSwaps:s.disableCrossChainSwaps,fetch:i,environment:n,evmSigner:s.evmSigner,getTargetChainAssets:s.getTargetChainAssets,solanaSigner:s.solanaSigner})});break;case e.ServiceType.WRAP_UNWRAP:await c(e.ServiceType.WRAP_UNWRAP,async()=>{let{createWrapUnwrapService:e}=await Promise.resolve().then(()=>require(`./transfer-service/wrap-unwrap/wrap-unwrap-service.cjs`));return await e({environment:n,evmSigner:s.evmSigner,fetch:i})});break;default:break}}return{services:a,status:{environment:n,services:o}}},u=async e=>{let t=[];for(let n of e.values()){let e=await n.getAssets();t.push(e)}return a.mergeChainAssetMaps(t)},d=async({environment:n,fetch:a,serviceInitializers:d})=>{s(n),c(d);let{services:f,status:p}=await l({environment:n,serviceInitializers:d,fetch:a});return{id:crypto.randomUUID(),estimateNativeFee:async(e,n)=>{let r=Math.floor(Date.now()/1e3);if(e.expiresAt<=r){let n=r-e.expiresAt;throw new t.InvalidParamsError(t.ErrorReason.QUOTE_EXPIRED,`Quote expired ${n} seconds ago.`)}let i=f.get(e.serviceType);if(!i)throw new t.ServiceUnavailableError(t.ErrorReason.SERVICE_TYPE_NOT_CONFIGURED);return await i.estimateNativeFee(e,n)},getAssetBridgeMap:async({sourceAsset:t,sourceChainId:n})=>{let r=await u(f),a=r[n];if(!a)return null;let o=a.find(n=>t.type===e.TokenType.NATIVE?n.type===e.TokenType.NATIVE:n.type===t.type&&n.address===t.address);if(!o||!o.destinations)return null;let s=o.destinations,c={};for(let[t,n]of Object.entries(s)){if(!i.isCaip2ChainId(t))continue;let a=r[t];if(!a)continue;let o=a.find(t=>n.address===e.TokenType.NATIVE?t.type===e.TokenType.NATIVE:t.type!==e.TokenType.NATIVE&&t.address===n.address);if(!o)continue;let{destinations:s,swapProviders:l,...u}=o;c[t]={bridgedAsset:u,bridgeProviders:n.bridgeProviders}}return Object.keys(c).length>0?c:null},getMinimumTransferAmount:async e=>{let t={};for(let n of f.values())if(n.analyzeSupport(e)){let r=await n.getMinimumTransferAmount(e);t[n.type]=r}return Object.keys(t).length>0?t:null},getSupportedChains:async()=>{let e=new Map,t=await Promise.all(Array.from(f.values()).map(e=>e.getSupportedChains()));for(let n of t)for(let[t,r]of n.entries()){let n=e.get(t);n||(n=new Set,e.set(t,n));for(let e of r)n.add(e)}return e},getQuoter:(e,t)=>new r.Quoter(e,Array.from(f.values()),t),status:()=>p,trackTransfer:e=>{let{transfer:n}=e,r=f.get(n.type);if(!r)throw new t.ServiceUnavailableError(t.ErrorReason.SERVICE_TYPE_NOT_CONFIGURED);return r.trackTransfer(e)},transferAsset:async e=>{let{quote:n}=e,r=f.get(n.serviceType);if(!r)throw new t.ServiceUnavailableError(t.ErrorReason.SERVICE_TYPE_NOT_CONFIGURED);return await r.transferAsset(e)},getBridgeableAssets:async({sourceAsset:e,sourceChainId:t,targetChainId:n})=>{let r=await Promise.allSettled(Array.from(f.values()).map(r=>r.getBridgeableAssets({sourceAsset:e,sourceChainId:t,targetChainId:n}))),i=new Map;for(let e of r)if(e.status===`fulfilled`)for(let t of e.value){let{bridgeProviders:e,...r}=t,a=o.getAssetId(n,r),s=i.get(a);if(s){let t=[...new Set([...s.bridgeProviders,...e])];i.set(a,{...s,bridgeProviders:t})}else i.set(a,{...r,bridgeProviders:[...e]})}return Array.from(i.values())}}};exports.createTransferManager=d;
1
+ const e=require(`./constants.cjs`),t=require(`./errors.cjs`),n=require(`./type-guards.cjs`),r=require(`./quoter/quoter.cjs`),i=require(`./utils/asset-id.cjs`),a=e=>{if(!n.isEnvironment(e))throw new t.ServiceInitializationError(t.ErrorReason.ENVIRONMENT_NOT_SUPPORTED)},o=e=>{if(e.length===0)throw new t.ServiceInitializationError(`No service initializers provided.`);if(e.some(e=>!n.isServiceInitializer(e)))throw new t.ServiceInitializationError(`One or more service initializers are invalid.`);let r=new Set;for(let n of e){if(r.has(n.type))throw new t.ServiceInitializationError(t.ErrorReason.DUPLICATE_SERVICE_INITIALIZATION,`Service type "${n.type}" has been initialized more than once.`);r.add(n.type)}},s=async({environment:n,serviceInitializers:r,fetch:i})=>{let a=new Map,o={},s=(e,n)=>{if(n instanceof t.ServiceInitializationError)return n;let r=n instanceof Error?n.message:String(n);return new t.ServiceInitializationError(t.ErrorReason.UNKNOWN,`Failed to initialize service type "${e}". ${r}`,n)},c=async(e,t)=>{try{let n=await t();a.set(e,n),o[e]={status:`initialized`}}catch(t){o[e]={status:`error`,error:s(e,t)}}};for(let s of r){if(a.has(s.type))throw new t.ServiceInitializationError(t.ErrorReason.DUPLICATE_SERVICE_INITIALIZATION,`Service type "${s.type}" has been initialized more than once.`);switch(s.type){case e.ServiceType.AVALANCHE_EVM:await c(e.ServiceType.AVALANCHE_EVM,async()=>{let{createAvalancheEvmService:e}=await Promise.resolve().then(()=>require(`./transfer-service/avalanche-evm/avalanche-evm-service.cjs`));return await e({environment:n,evmSigner:s.evmSigner,fetch:i})});break;case e.ServiceType.LOMBARD_BTCB_TO_BTC:await c(e.ServiceType.LOMBARD_BTCB_TO_BTC,async()=>{let{createBtcbToBtcService:e}=await Promise.resolve().then(()=>require(`./transfer-service/lombard/btcb-to-btc-service.cjs`));return await e({bitcoinFunctions:s.btcFunctions,environment:n,evmSigner:s.evmSigner,fetch:i})});break;case e.ServiceType.LOMBARD_BTC_TO_BTCB:await c(e.ServiceType.LOMBARD_BTC_TO_BTCB,async()=>{let{createBtcToBtcbService:e}=await Promise.resolve().then(()=>require(`./transfer-service/lombard/btc-to-btcb-service.cjs`));return await e({bitcoinFunctions:s.btcFunctions,btcSigner:s.btcSigner,environment:n,evmSigner:s.evmSigner,fetch:i})});break;case e.ServiceType.MARKR:if(n!==e.Environment.PROD){o[e.ServiceType.MARKR]={status:`unsupported-environment`,message:`Service type "${e.ServiceType.MARKR}" is only supported in production environment.`};break}await c(e.ServiceType.MARKR,async()=>{let{createMarkrService:e}=await Promise.resolve().then(()=>require(`./transfer-service/markr/markr-service.cjs`));return await e({apiBaseUrl:s.markrApiUrl,apiToken:s.markrApiToken,appId:s.markrAppId,disableCrossChainSwaps:s.disableCrossChainSwaps,fetch:i,environment:n,evmSigner:s.evmSigner,getTargetChainAssets:s.getTargetChainAssets,solanaSigner:s.solanaSigner})});break;case e.ServiceType.WRAP_UNWRAP:await c(e.ServiceType.WRAP_UNWRAP,async()=>{let{createWrapUnwrapService:e}=await Promise.resolve().then(()=>require(`./transfer-service/wrap-unwrap/wrap-unwrap-service.cjs`));return await e({environment:n,evmSigner:s.evmSigner,fetch:i})});break;default:break}}return{services:a,status:{environment:n,services:o}}},c=async({environment:e,fetch:n,serviceInitializers:c})=>{a(e),o(c);let{services:l,status:u}=await s({environment:e,serviceInitializers:c,fetch:n});return{id:crypto.randomUUID(),estimateNativeFee:async(e,n)=>{let r=Math.floor(Date.now()/1e3);if(e.expiresAt<=r){let n=r-e.expiresAt;throw new t.InvalidParamsError(t.ErrorReason.QUOTE_EXPIRED,`Quote expired ${n} seconds ago.`)}let i=l.get(e.serviceType);if(!i)throw new t.ServiceUnavailableError(t.ErrorReason.SERVICE_TYPE_NOT_CONFIGURED);return await i.estimateNativeFee(e,n)},getBridgeableAssets:async({sourceAsset:e,sourceChainId:t,targetChainId:n})=>{let r=await Promise.allSettled(Array.from(l.values()).map(r=>r.getBridgeableAssets({sourceAsset:e,sourceChainId:t,targetChainId:n}))),a=new Map;for(let e of r)if(e.status===`fulfilled`)for(let t of e.value){let{bridgeProviders:e,...r}=t,o=i.getAssetId(n,r),s=a.get(o);if(s){let t=[...new Set([...s.bridgeProviders,...e])];a.set(o,{...s,bridgeProviders:t})}else a.set(o,{...r,bridgeProviders:[...e]})}return Array.from(a.values())},getMinimumTransferAmount:async e=>{let t={};for(let n of l.values())if(n.analyzeSupport(e)){let r=await n.getMinimumTransferAmount(e);t[n.type]=r}return Object.keys(t).length>0?t:null},getSupportedChains:async()=>{let e=new Map,t=await Promise.all(Array.from(l.values()).map(e=>e.getSupportedChains()));for(let n of t)for(let[t,r]of n.entries()){let n=e.get(t);n||(n=new Set,e.set(t,n));for(let e of r)n.add(e)}return e},getQuoter:(e,t)=>new r.Quoter(e,Array.from(l.values()),t),status:()=>u,trackTransfer:e=>{let{transfer:n}=e,r=l.get(n.type);if(!r)throw new t.ServiceUnavailableError(t.ErrorReason.SERVICE_TYPE_NOT_CONFIGURED);return r.trackTransfer(e)},transferAsset:async e=>{let{quote:n}=e,r=l.get(n.serviceType);if(!r)throw new t.ServiceUnavailableError(t.ErrorReason.SERVICE_TYPE_NOT_CONFIGURED);return await r.transferAsset(e)}}};exports.createTransferManager=c;
2
2
  //# sourceMappingURL=transfer-manager.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"transfer-manager.cjs","names":["isEnvironment","ServiceInitializationError","ErrorReason","isServiceInitializer","ServiceType","Environment","mergeChainAssetMaps","InvalidParamsError","ServiceUnavailableError","TokenType","isCaip2ChainId","Quoter","getAssetId"],"sources":["../src/transfer-manager.ts"],"sourcesContent":["import { Environment, ServiceType, TokenType } from './constants';\nimport { ErrorReason, InvalidParamsError, ServiceInitializationError, ServiceUnavailableError } from './errors';\nimport type { Asset, BridgeableUiAsset, ChainAssetMap } from './types/asset';\nimport { isEnvironment, isServiceInitializer } from './type-guards';\nimport type { MutableGetSupportedChainsResult, ServiceInitializer, TransferService } from './types/service';\nimport type {\n CreateTransferManagerOptions,\n TransferManager,\n TransferManagerStatus,\n TransferManagerStatusServicesRecord,\n} from './types/transfer-manager';\nimport { Quoter } from './quoter/quoter';\nimport { mergeChainAssetMaps } from './_utils/merge-assets';\nimport { getAssetId } from './utils/asset-id';\nimport { isCaip2ChainId } from './utils/caip';\nimport type { Caip2ChainId } from './types/caip';\nimport type { Fetch } from './types/utility-types';\n\n/**\n * Validates the provided \"environment\" option.\n *\n * @throws {ServiceInitializationError} If the environment is invalid.\n */\nconst validateEnvironment = (environment: Environment): void => {\n if (!isEnvironment(environment)) {\n throw new ServiceInitializationError(ErrorReason.ENVIRONMENT_NOT_SUPPORTED);\n }\n};\n\n/**\n * Validates the provided \"serviceInitializers\" option.\n *\n * Checks for the following:\n * - At least one service initializer is provided.\n * - All service initializers are valid.\n * - No duplicate service types are initialized.\n *\n * @throws {ServiceInitializationError} If the service initializers are invalid.\n */\nconst validateServiceInitializers = (serviceInitializers: readonly ServiceInitializer[]): void => {\n if (serviceInitializers.length === 0) {\n throw new ServiceInitializationError('No service initializers provided.');\n }\n\n if (serviceInitializers.some((serviceInitializer) => !isServiceInitializer(serviceInitializer))) {\n throw new ServiceInitializationError('One or more service initializers are invalid.');\n }\n\n const serviceInitializerTypes = new Set<ServiceType>();\n for (const initializer of serviceInitializers) {\n if (serviceInitializerTypes.has(initializer.type)) {\n throw new ServiceInitializationError(\n ErrorReason.DUPLICATE_SERVICE_INITIALIZATION,\n `Service type \"${initializer.type}\" has been initialized more than once.`,\n );\n }\n serviceInitializerTypes.add(initializer.type);\n }\n};\n\nconst initializeServices = async ({\n environment,\n serviceInitializers,\n fetch: customFetch,\n}: {\n environment: Environment;\n serviceInitializers: readonly ServiceInitializer[];\n fetch?: Fetch;\n}): Promise<{\n services: Map<ServiceType, TransferService>;\n status: TransferManagerStatus;\n}> => {\n const initializedServicesMap: Map<ServiceType, TransferService> = new Map();\n const serviceStatuses: TransferManagerStatusServicesRecord = {};\n\n const wrapInitializationError = (serviceType: ServiceType, error: unknown): ServiceInitializationError => {\n if (error instanceof ServiceInitializationError) {\n return error;\n }\n\n const details = error instanceof Error ? error.message : String(error);\n\n return new ServiceInitializationError(\n ErrorReason.UNKNOWN,\n `Failed to initialize service type \"${serviceType}\". ${details}`,\n error,\n );\n };\n\n const initializeService = async (\n serviceType: ServiceType,\n initializer: () => Promise<TransferService>,\n ): Promise<void> => {\n try {\n const service = await initializer();\n initializedServicesMap.set(serviceType, service);\n serviceStatuses[serviceType] = { status: 'initialized' };\n } catch (error) {\n const wrappedError = wrapInitializationError(serviceType, error);\n\n serviceStatuses[serviceType] = {\n status: 'error',\n error: wrappedError,\n };\n }\n };\n\n for (const initializer of serviceInitializers) {\n // Error on duplicate initialization attempts.\n if (initializedServicesMap.has(initializer.type)) {\n throw new ServiceInitializationError(\n ErrorReason.DUPLICATE_SERVICE_INITIALIZATION,\n `Service type \"${initializer.type}\" has been initialized more than once.`,\n );\n }\n\n switch (initializer.type) {\n case ServiceType.AVALANCHE_EVM: {\n await initializeService(ServiceType.AVALANCHE_EVM, async () => {\n const { createAvalancheEvmService } = await import('./transfer-service/avalanche-evm/avalanche-evm-service');\n\n return await createAvalancheEvmService({\n environment,\n evmSigner: initializer.evmSigner,\n fetch: customFetch,\n });\n });\n\n break;\n }\n\n case ServiceType.LOMBARD_BTCB_TO_BTC: {\n await initializeService(ServiceType.LOMBARD_BTCB_TO_BTC, async () => {\n const { createBtcbToBtcService } = await import('./transfer-service/lombard/btcb-to-btc-service');\n\n return await createBtcbToBtcService({\n bitcoinFunctions: initializer.btcFunctions,\n environment,\n evmSigner: initializer.evmSigner,\n fetch: customFetch,\n });\n });\n\n break;\n }\n\n case ServiceType.LOMBARD_BTC_TO_BTCB: {\n await initializeService(ServiceType.LOMBARD_BTC_TO_BTCB, async () => {\n const { createBtcToBtcbService } = await import('./transfer-service/lombard/btc-to-btcb-service');\n\n return await createBtcToBtcbService({\n bitcoinFunctions: initializer.btcFunctions,\n btcSigner: initializer.btcSigner,\n environment,\n evmSigner: initializer.evmSigner,\n fetch: customFetch,\n });\n });\n\n break;\n }\n\n case ServiceType.MARKR: {\n if (environment !== Environment.PROD) {\n serviceStatuses[ServiceType.MARKR] = {\n status: 'unsupported-environment',\n message: `Service type \"${ServiceType.MARKR}\" is only supported in production environment.`,\n };\n break;\n }\n\n await initializeService(ServiceType.MARKR, async () => {\n const { createMarkrService } = await import('./transfer-service/markr/markr-service');\n\n return await createMarkrService({\n apiBaseUrl: initializer.markrApiUrl,\n apiToken: initializer.markrApiToken,\n appId: initializer.markrAppId,\n disableCrossChainSwaps: initializer.disableCrossChainSwaps,\n fetch: customFetch,\n environment,\n evmSigner: initializer.evmSigner,\n getTargetChainAssets: initializer.getTargetChainAssets,\n solanaSigner: initializer.solanaSigner,\n });\n });\n\n break;\n }\n\n case ServiceType.WRAP_UNWRAP: {\n await initializeService(ServiceType.WRAP_UNWRAP, async () => {\n const { createWrapUnwrapService } = await import('./transfer-service/wrap-unwrap/wrap-unwrap-service');\n\n return await createWrapUnwrapService({\n environment,\n evmSigner: initializer.evmSigner,\n fetch: customFetch,\n });\n });\n\n break;\n }\n\n default: {\n break;\n }\n }\n }\n\n return {\n services: initializedServicesMap,\n status: {\n environment,\n services: serviceStatuses,\n },\n };\n};\n\nconst _getAssets = async (services: Map<ServiceType, TransferService>): Promise<ChainAssetMap> => {\n const assetMaps: ChainAssetMap[] = [];\n\n for (const service of services.values()) {\n const serviceAssets = await service.getAssets();\n assetMaps.push(serviceAssets);\n }\n\n return mergeChainAssetMaps(assetMaps);\n};\n\n/**\n * Creates a TransferManager instance.\n *\n * @returns {Promise<TransferManager>} The TransferManager instance.\n * @throws {ServiceInitializationError} If the provided options are invalid.\n */\nexport const createTransferManager = async ({\n environment,\n fetch: customFetch,\n serviceInitializers,\n}: CreateTransferManagerOptions): Promise<TransferManager> => {\n // Validate environment.\n validateEnvironment(environment);\n validateServiceInitializers(serviceInitializers);\n\n const { services, status } = await initializeServices({ environment, serviceInitializers, fetch: customFetch });\n\n return {\n id: crypto.randomUUID(),\n estimateNativeFee: async (quote, options) => {\n const now = Math.floor(Date.now() / 1_000);\n\n if (quote.expiresAt <= now) {\n const expiredSecondsAgo = now - quote.expiresAt;\n\n throw new InvalidParamsError(ErrorReason.QUOTE_EXPIRED, `Quote expired ${expiredSecondsAgo} seconds ago.`);\n }\n\n const service = services.get(quote.serviceType);\n\n if (!service) {\n throw new ServiceUnavailableError(ErrorReason.SERVICE_TYPE_NOT_CONFIGURED);\n }\n\n return await service.estimateNativeFee(quote, options);\n },\n getAssetBridgeMap: async ({ sourceAsset, sourceChainId }) => {\n const assets = await _getAssets(services);\n\n const chainAssets = assets[sourceChainId];\n\n if (!chainAssets) {\n return null;\n }\n\n const chainAsset = chainAssets.find((asset) => {\n if (sourceAsset.type === TokenType.NATIVE) {\n return asset.type === TokenType.NATIVE;\n } else {\n return asset.type === sourceAsset.type && asset.address === sourceAsset.address;\n }\n });\n\n if (!chainAsset || !chainAsset.destinations) {\n return null;\n }\n\n const destinations = chainAsset.destinations;\n\n // map destinations to the required format, lookup bridged asset from assets map\n const result: {\n [chainId: string]: {\n bridgedAsset: Asset;\n bridgeProviders: readonly ServiceType[];\n };\n } = {};\n\n for (const [destChainId, destInfo] of Object.entries(destinations)) {\n if (!isCaip2ChainId(destChainId)) {\n continue;\n }\n\n const destChainAssets = assets[destChainId];\n\n if (!destChainAssets) {\n continue;\n }\n\n // bridgedAsset is the asset from the assets map that matches the destInfo address\n const bridgedAsset = destChainAssets.find((asset) => {\n if (destInfo.address === TokenType.NATIVE) {\n return asset.type === TokenType.NATIVE;\n }\n\n return asset.type !== TokenType.NATIVE && asset.address === destInfo.address;\n });\n\n if (!bridgedAsset) {\n continue;\n }\n\n // Convert the TransferableAsset to Asset by omitting the 'destinations' field\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { destinations: _omit, swapProviders: _omitSwapProviders, ...convertedBridgedAsset } = bridgedAsset;\n\n result[destChainId] = {\n bridgedAsset: convertedBridgedAsset,\n bridgeProviders: destInfo.bridgeProviders,\n };\n }\n\n return Object.keys(result).length > 0 ? result : null;\n },\n getMinimumTransferAmount: async (props) => {\n const serviceMinimums: { [key in ServiceType]?: bigint } = {};\n\n for (const service of services.values()) {\n if (service.analyzeSupport(props)) {\n const serviceMinAmount = await service.getMinimumTransferAmount(props);\n serviceMinimums[service.type] = serviceMinAmount;\n }\n }\n\n return Object.keys(serviceMinimums).length > 0 ? serviceMinimums : null;\n },\n getSupportedChains: async () => {\n const supportedChainsMap: MutableGetSupportedChainsResult = new Map();\n\n // Fetch supported chains from all configured services in parallel.\n const serviceResults = await Promise.all(\n Array.from(services.values()).map((service) => service.getSupportedChains()),\n );\n\n // Merge results: union destination sets for identical source chain IDs.\n for (const result of serviceResults) {\n for (const [sourceChainId, targetChainIds] of result.entries()) {\n let mergedTargets = supportedChainsMap.get(sourceChainId);\n if (!mergedTargets) {\n mergedTargets = new Set<Caip2ChainId>();\n supportedChainsMap.set(sourceChainId, mergedTargets);\n }\n\n for (const targetChainId of targetChainIds) {\n mergedTargets.add(targetChainId);\n }\n }\n }\n\n return supportedChainsMap;\n },\n getQuoter: (props, options) => {\n return new Quoter(props, Array.from(services.values()), options);\n },\n status: () => status,\n trackTransfer: (props) => {\n const { transfer } = props;\n const service = services.get(transfer.type);\n\n if (!service) {\n throw new ServiceUnavailableError(ErrorReason.SERVICE_TYPE_NOT_CONFIGURED);\n }\n\n return service.trackTransfer(props);\n },\n transferAsset: async (props) => {\n const { quote } = props;\n const service = services.get(quote.serviceType);\n\n if (!service) {\n throw new ServiceUnavailableError(ErrorReason.SERVICE_TYPE_NOT_CONFIGURED);\n }\n\n return await service.transferAsset(props);\n },\n getBridgeableAssets: async ({ sourceAsset, sourceChainId, targetChainId }) => {\n const settledResults = await Promise.allSettled(\n Array.from(services.values()).map((service) =>\n service.getBridgeableAssets({ sourceAsset, sourceChainId, targetChainId }),\n ),\n );\n\n const merged = new Map<string, BridgeableUiAsset>();\n\n for (const settled of settledResults) {\n if (settled.status !== 'fulfilled') continue;\n for (const result of settled.value) {\n const { bridgeProviders, ...asset } = result;\n const key = getAssetId(targetChainId, asset);\n\n const existing = merged.get(key);\n if (existing) {\n const combined = [...new Set([...existing.bridgeProviders, ...bridgeProviders])];\n merged.set(key, { ...existing, bridgeProviders: combined });\n } else {\n merged.set(key, { ...asset, bridgeProviders: [...bridgeProviders] });\n }\n }\n }\n\n return Array.from(merged.values());\n },\n } satisfies TransferManager;\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"transfer-manager.cjs","names":["isEnvironment","ServiceInitializationError","ErrorReason","isServiceInitializer","ServiceType","Environment","InvalidParamsError","ServiceUnavailableError","getAssetId","Quoter"],"sources":["../src/transfer-manager.ts"],"sourcesContent":["import { Environment, ServiceType } from './constants';\nimport { ErrorReason, InvalidParamsError, ServiceInitializationError, ServiceUnavailableError } from './errors';\nimport type { BridgeableUiAsset } from './types/asset';\nimport { isEnvironment, isServiceInitializer } from './type-guards';\nimport type { MutableGetSupportedChainsResult, ServiceInitializer, TransferService } from './types/service';\nimport type {\n CreateTransferManagerOptions,\n TransferManager,\n TransferManagerStatus,\n TransferManagerStatusServicesRecord,\n} from './types/transfer-manager';\nimport { Quoter } from './quoter/quoter';\nimport { getAssetId } from './utils/asset-id';\nimport type { Caip2ChainId } from './types/caip';\nimport type { Fetch } from './types/utility-types';\n\n/**\n * Validates the provided \"environment\" option.\n *\n * @throws {ServiceInitializationError} If the environment is invalid.\n */\nconst validateEnvironment = (environment: Environment): void => {\n if (!isEnvironment(environment)) {\n throw new ServiceInitializationError(ErrorReason.ENVIRONMENT_NOT_SUPPORTED);\n }\n};\n\n/**\n * Validates the provided \"serviceInitializers\" option.\n *\n * Checks for the following:\n * - At least one service initializer is provided.\n * - All service initializers are valid.\n * - No duplicate service types are initialized.\n *\n * @throws {ServiceInitializationError} If the service initializers are invalid.\n */\nconst validateServiceInitializers = (serviceInitializers: readonly ServiceInitializer[]): void => {\n if (serviceInitializers.length === 0) {\n throw new ServiceInitializationError('No service initializers provided.');\n }\n\n if (serviceInitializers.some((serviceInitializer) => !isServiceInitializer(serviceInitializer))) {\n throw new ServiceInitializationError('One or more service initializers are invalid.');\n }\n\n const serviceInitializerTypes = new Set<ServiceType>();\n for (const initializer of serviceInitializers) {\n if (serviceInitializerTypes.has(initializer.type)) {\n throw new ServiceInitializationError(\n ErrorReason.DUPLICATE_SERVICE_INITIALIZATION,\n `Service type \"${initializer.type}\" has been initialized more than once.`,\n );\n }\n serviceInitializerTypes.add(initializer.type);\n }\n};\n\nconst initializeServices = async ({\n environment,\n serviceInitializers,\n fetch: customFetch,\n}: {\n environment: Environment;\n serviceInitializers: readonly ServiceInitializer[];\n fetch?: Fetch;\n}): Promise<{\n services: Map<ServiceType, TransferService>;\n status: TransferManagerStatus;\n}> => {\n const initializedServicesMap: Map<ServiceType, TransferService> = new Map();\n const serviceStatuses: TransferManagerStatusServicesRecord = {};\n\n const wrapInitializationError = (serviceType: ServiceType, error: unknown): ServiceInitializationError => {\n if (error instanceof ServiceInitializationError) {\n return error;\n }\n\n const details = error instanceof Error ? error.message : String(error);\n\n return new ServiceInitializationError(\n ErrorReason.UNKNOWN,\n `Failed to initialize service type \"${serviceType}\". ${details}`,\n error,\n );\n };\n\n const initializeService = async (\n serviceType: ServiceType,\n initializer: () => Promise<TransferService>,\n ): Promise<void> => {\n try {\n const service = await initializer();\n initializedServicesMap.set(serviceType, service);\n serviceStatuses[serviceType] = { status: 'initialized' };\n } catch (error) {\n const wrappedError = wrapInitializationError(serviceType, error);\n\n serviceStatuses[serviceType] = {\n status: 'error',\n error: wrappedError,\n };\n }\n };\n\n for (const initializer of serviceInitializers) {\n // Error on duplicate initialization attempts.\n if (initializedServicesMap.has(initializer.type)) {\n throw new ServiceInitializationError(\n ErrorReason.DUPLICATE_SERVICE_INITIALIZATION,\n `Service type \"${initializer.type}\" has been initialized more than once.`,\n );\n }\n\n switch (initializer.type) {\n case ServiceType.AVALANCHE_EVM: {\n await initializeService(ServiceType.AVALANCHE_EVM, async () => {\n const { createAvalancheEvmService } = await import('./transfer-service/avalanche-evm/avalanche-evm-service');\n\n return await createAvalancheEvmService({\n environment,\n evmSigner: initializer.evmSigner,\n fetch: customFetch,\n });\n });\n\n break;\n }\n\n case ServiceType.LOMBARD_BTCB_TO_BTC: {\n await initializeService(ServiceType.LOMBARD_BTCB_TO_BTC, async () => {\n const { createBtcbToBtcService } = await import('./transfer-service/lombard/btcb-to-btc-service');\n\n return await createBtcbToBtcService({\n bitcoinFunctions: initializer.btcFunctions,\n environment,\n evmSigner: initializer.evmSigner,\n fetch: customFetch,\n });\n });\n\n break;\n }\n\n case ServiceType.LOMBARD_BTC_TO_BTCB: {\n await initializeService(ServiceType.LOMBARD_BTC_TO_BTCB, async () => {\n const { createBtcToBtcbService } = await import('./transfer-service/lombard/btc-to-btcb-service');\n\n return await createBtcToBtcbService({\n bitcoinFunctions: initializer.btcFunctions,\n btcSigner: initializer.btcSigner,\n environment,\n evmSigner: initializer.evmSigner,\n fetch: customFetch,\n });\n });\n\n break;\n }\n\n case ServiceType.MARKR: {\n if (environment !== Environment.PROD) {\n serviceStatuses[ServiceType.MARKR] = {\n status: 'unsupported-environment',\n message: `Service type \"${ServiceType.MARKR}\" is only supported in production environment.`,\n };\n break;\n }\n\n await initializeService(ServiceType.MARKR, async () => {\n const { createMarkrService } = await import('./transfer-service/markr/markr-service');\n\n return await createMarkrService({\n apiBaseUrl: initializer.markrApiUrl,\n apiToken: initializer.markrApiToken,\n appId: initializer.markrAppId,\n disableCrossChainSwaps: initializer.disableCrossChainSwaps,\n fetch: customFetch,\n environment,\n evmSigner: initializer.evmSigner,\n getTargetChainAssets: initializer.getTargetChainAssets,\n solanaSigner: initializer.solanaSigner,\n });\n });\n\n break;\n }\n\n case ServiceType.WRAP_UNWRAP: {\n await initializeService(ServiceType.WRAP_UNWRAP, async () => {\n const { createWrapUnwrapService } = await import('./transfer-service/wrap-unwrap/wrap-unwrap-service');\n\n return await createWrapUnwrapService({\n environment,\n evmSigner: initializer.evmSigner,\n fetch: customFetch,\n });\n });\n\n break;\n }\n\n default: {\n break;\n }\n }\n }\n\n return {\n services: initializedServicesMap,\n status: {\n environment,\n services: serviceStatuses,\n },\n };\n};\n\n/**\n * Creates a TransferManager instance.\n *\n * @returns {Promise<TransferManager>} The TransferManager instance.\n * @throws {ServiceInitializationError} If the provided options are invalid.\n */\nexport const createTransferManager = async ({\n environment,\n fetch: customFetch,\n serviceInitializers,\n}: CreateTransferManagerOptions): Promise<TransferManager> => {\n // Validate environment.\n validateEnvironment(environment);\n validateServiceInitializers(serviceInitializers);\n\n const { services, status } = await initializeServices({ environment, serviceInitializers, fetch: customFetch });\n\n return {\n id: crypto.randomUUID(),\n estimateNativeFee: async (quote, options) => {\n const now = Math.floor(Date.now() / 1_000);\n\n if (quote.expiresAt <= now) {\n const expiredSecondsAgo = now - quote.expiresAt;\n\n throw new InvalidParamsError(ErrorReason.QUOTE_EXPIRED, `Quote expired ${expiredSecondsAgo} seconds ago.`);\n }\n\n const service = services.get(quote.serviceType);\n\n if (!service) {\n throw new ServiceUnavailableError(ErrorReason.SERVICE_TYPE_NOT_CONFIGURED);\n }\n\n return await service.estimateNativeFee(quote, options);\n },\n getBridgeableAssets: async ({ sourceAsset, sourceChainId, targetChainId }) => {\n const settledResults = await Promise.allSettled(\n Array.from(services.values()).map((service) =>\n service.getBridgeableAssets({ sourceAsset, sourceChainId, targetChainId }),\n ),\n );\n\n const merged = new Map<string, BridgeableUiAsset>();\n\n for (const settled of settledResults) {\n if (settled.status !== 'fulfilled') continue;\n for (const result of settled.value) {\n const { bridgeProviders, ...asset } = result;\n const key = getAssetId(targetChainId, asset);\n\n const existing = merged.get(key);\n if (existing) {\n const combined = [...new Set([...existing.bridgeProviders, ...bridgeProviders])];\n merged.set(key, { ...existing, bridgeProviders: combined });\n } else {\n merged.set(key, { ...asset, bridgeProviders: [...bridgeProviders] });\n }\n }\n }\n\n return Array.from(merged.values());\n },\n getMinimumTransferAmount: async (props) => {\n const serviceMinimums: { [key in ServiceType]?: bigint } = {};\n\n for (const service of services.values()) {\n if (service.analyzeSupport(props)) {\n const serviceMinAmount = await service.getMinimumTransferAmount(props);\n serviceMinimums[service.type] = serviceMinAmount;\n }\n }\n\n return Object.keys(serviceMinimums).length > 0 ? serviceMinimums : null;\n },\n getSupportedChains: async () => {\n const supportedChainsMap: MutableGetSupportedChainsResult = new Map();\n\n // Fetch supported chains from all configured services in parallel.\n const serviceResults = await Promise.all(\n Array.from(services.values()).map((service) => service.getSupportedChains()),\n );\n\n // Merge results: union destination sets for identical source chain IDs.\n for (const result of serviceResults) {\n for (const [sourceChainId, targetChainIds] of result.entries()) {\n let mergedTargets = supportedChainsMap.get(sourceChainId);\n if (!mergedTargets) {\n mergedTargets = new Set<Caip2ChainId>();\n supportedChainsMap.set(sourceChainId, mergedTargets);\n }\n\n for (const targetChainId of targetChainIds) {\n mergedTargets.add(targetChainId);\n }\n }\n }\n\n return supportedChainsMap;\n },\n getQuoter: (props, options) => {\n return new Quoter(props, Array.from(services.values()), options);\n },\n status: () => status,\n trackTransfer: (props) => {\n const { transfer } = props;\n const service = services.get(transfer.type);\n\n if (!service) {\n throw new ServiceUnavailableError(ErrorReason.SERVICE_TYPE_NOT_CONFIGURED);\n }\n\n return service.trackTransfer(props);\n },\n transferAsset: async (props) => {\n const { quote } = props;\n const service = services.get(quote.serviceType);\n\n if (!service) {\n throw new ServiceUnavailableError(ErrorReason.SERVICE_TYPE_NOT_CONFIGURED);\n }\n\n return await service.transferAsset(props);\n },\n } satisfies TransferManager;\n};\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{Environment as e,ServiceType as t,TokenType as n}from"./constants.js";import{ErrorReason as r,InvalidParamsError as i,ServiceInitializationError as a,ServiceUnavailableError as o}from"./errors.js";import{isEnvironment as s,isServiceInitializer as c}from"./type-guards.js";import{Quoter as l}from"./quoter/quoter.js";import{isCaip2ChainId as u}from"./utils/caip.js";import{mergeChainAssetMaps as d}from"./_utils/merge-assets.js";import{getAssetId as f}from"./utils/asset-id.js";const p=e=>{if(!s(e))throw new a(r.ENVIRONMENT_NOT_SUPPORTED)},m=e=>{if(e.length===0)throw new a(`No service initializers provided.`);if(e.some(e=>!c(e)))throw new a(`One or more service initializers are invalid.`);let t=new Set;for(let n of e){if(t.has(n.type))throw new a(r.DUPLICATE_SERVICE_INITIALIZATION,`Service type "${n.type}" has been initialized more than once.`);t.add(n.type)}},h=async({environment:n,serviceInitializers:i,fetch:o})=>{let s=new Map,c={},l=(e,t)=>{if(t instanceof a)return t;let n=t instanceof Error?t.message:String(t);return new a(r.UNKNOWN,`Failed to initialize service type "${e}". ${n}`,t)},u=async(e,t)=>{try{let n=await t();s.set(e,n),c[e]={status:`initialized`}}catch(t){c[e]={status:`error`,error:l(e,t)}}};for(let l of i){if(s.has(l.type))throw new a(r.DUPLICATE_SERVICE_INITIALIZATION,`Service type "${l.type}" has been initialized more than once.`);switch(l.type){case t.AVALANCHE_EVM:await u(t.AVALANCHE_EVM,async()=>{let{createAvalancheEvmService:e}=await import(`./transfer-service/avalanche-evm/avalanche-evm-service.js`);return await e({environment:n,evmSigner:l.evmSigner,fetch:o})});break;case t.LOMBARD_BTCB_TO_BTC:await u(t.LOMBARD_BTCB_TO_BTC,async()=>{let{createBtcbToBtcService:e}=await import(`./transfer-service/lombard/btcb-to-btc-service.js`);return await e({bitcoinFunctions:l.btcFunctions,environment:n,evmSigner:l.evmSigner,fetch:o})});break;case t.LOMBARD_BTC_TO_BTCB:await u(t.LOMBARD_BTC_TO_BTCB,async()=>{let{createBtcToBtcbService:e}=await import(`./transfer-service/lombard/btc-to-btcb-service.js`);return await e({bitcoinFunctions:l.btcFunctions,btcSigner:l.btcSigner,environment:n,evmSigner:l.evmSigner,fetch:o})});break;case t.MARKR:if(n!==e.PROD){c[t.MARKR]={status:`unsupported-environment`,message:`Service type "${t.MARKR}" is only supported in production environment.`};break}await u(t.MARKR,async()=>{let{createMarkrService:e}=await import(`./transfer-service/markr/markr-service.js`);return await e({apiBaseUrl:l.markrApiUrl,apiToken:l.markrApiToken,appId:l.markrAppId,disableCrossChainSwaps:l.disableCrossChainSwaps,fetch:o,environment:n,evmSigner:l.evmSigner,getTargetChainAssets:l.getTargetChainAssets,solanaSigner:l.solanaSigner})});break;case t.WRAP_UNWRAP:await u(t.WRAP_UNWRAP,async()=>{let{createWrapUnwrapService:e}=await import(`./transfer-service/wrap-unwrap/wrap-unwrap-service.js`);return await e({environment:n,evmSigner:l.evmSigner,fetch:o})});break;default:break}}return{services:s,status:{environment:n,services:c}}},g=async e=>{let t=[];for(let n of e.values()){let e=await n.getAssets();t.push(e)}return d(t)},_=async({environment:e,fetch:t,serviceInitializers:a})=>{p(e),m(a);let{services:s,status:c}=await h({environment:e,serviceInitializers:a,fetch:t});return{id:crypto.randomUUID(),estimateNativeFee:async(e,t)=>{let n=Math.floor(Date.now()/1e3);if(e.expiresAt<=n){let t=n-e.expiresAt;throw new i(r.QUOTE_EXPIRED,`Quote expired ${t} seconds ago.`)}let a=s.get(e.serviceType);if(!a)throw new o(r.SERVICE_TYPE_NOT_CONFIGURED);return await a.estimateNativeFee(e,t)},getAssetBridgeMap:async({sourceAsset:e,sourceChainId:t})=>{let r=await g(s),i=r[t];if(!i)return null;let a=i.find(t=>e.type===n.NATIVE?t.type===n.NATIVE:t.type===e.type&&t.address===e.address);if(!a||!a.destinations)return null;let o=a.destinations,c={};for(let[e,t]of Object.entries(o)){if(!u(e))continue;let i=r[e];if(!i)continue;let a=i.find(e=>t.address===n.NATIVE?e.type===n.NATIVE:e.type!==n.NATIVE&&e.address===t.address);if(!a)continue;let{destinations:o,swapProviders:s,...l}=a;c[e]={bridgedAsset:l,bridgeProviders:t.bridgeProviders}}return Object.keys(c).length>0?c:null},getMinimumTransferAmount:async e=>{let t={};for(let n of s.values())if(n.analyzeSupport(e)){let r=await n.getMinimumTransferAmount(e);t[n.type]=r}return Object.keys(t).length>0?t:null},getSupportedChains:async()=>{let e=new Map,t=await Promise.all(Array.from(s.values()).map(e=>e.getSupportedChains()));for(let n of t)for(let[t,r]of n.entries()){let n=e.get(t);n||(n=new Set,e.set(t,n));for(let e of r)n.add(e)}return e},getQuoter:(e,t)=>new l(e,Array.from(s.values()),t),status:()=>c,trackTransfer:e=>{let{transfer:t}=e,n=s.get(t.type);if(!n)throw new o(r.SERVICE_TYPE_NOT_CONFIGURED);return n.trackTransfer(e)},transferAsset:async e=>{let{quote:t}=e,n=s.get(t.serviceType);if(!n)throw new o(r.SERVICE_TYPE_NOT_CONFIGURED);return await n.transferAsset(e)},getBridgeableAssets:async({sourceAsset:e,sourceChainId:t,targetChainId:n})=>{let r=await Promise.allSettled(Array.from(s.values()).map(r=>r.getBridgeableAssets({sourceAsset:e,sourceChainId:t,targetChainId:n}))),i=new Map;for(let e of r)if(e.status===`fulfilled`)for(let t of e.value){let{bridgeProviders:e,...r}=t,a=f(n,r),o=i.get(a);if(o){let t=[...new Set([...o.bridgeProviders,...e])];i.set(a,{...o,bridgeProviders:t})}else i.set(a,{...r,bridgeProviders:[...e]})}return Array.from(i.values())}}};export{_ as createTransferManager};
1
+ import{Environment as e,ServiceType as t}from"./constants.js";import{ErrorReason as n,InvalidParamsError as r,ServiceInitializationError as i,ServiceUnavailableError as a}from"./errors.js";import{isEnvironment as o,isServiceInitializer as s}from"./type-guards.js";import{Quoter as c}from"./quoter/quoter.js";import{getAssetId as l}from"./utils/asset-id.js";const u=e=>{if(!o(e))throw new i(n.ENVIRONMENT_NOT_SUPPORTED)},d=e=>{if(e.length===0)throw new i(`No service initializers provided.`);if(e.some(e=>!s(e)))throw new i(`One or more service initializers are invalid.`);let t=new Set;for(let r of e){if(t.has(r.type))throw new i(n.DUPLICATE_SERVICE_INITIALIZATION,`Service type "${r.type}" has been initialized more than once.`);t.add(r.type)}},f=async({environment:r,serviceInitializers:a,fetch:o})=>{let s=new Map,c={},l=(e,t)=>{if(t instanceof i)return t;let r=t instanceof Error?t.message:String(t);return new i(n.UNKNOWN,`Failed to initialize service type "${e}". ${r}`,t)},u=async(e,t)=>{try{let n=await t();s.set(e,n),c[e]={status:`initialized`}}catch(t){c[e]={status:`error`,error:l(e,t)}}};for(let l of a){if(s.has(l.type))throw new i(n.DUPLICATE_SERVICE_INITIALIZATION,`Service type "${l.type}" has been initialized more than once.`);switch(l.type){case t.AVALANCHE_EVM:await u(t.AVALANCHE_EVM,async()=>{let{createAvalancheEvmService:e}=await import(`./transfer-service/avalanche-evm/avalanche-evm-service.js`);return await e({environment:r,evmSigner:l.evmSigner,fetch:o})});break;case t.LOMBARD_BTCB_TO_BTC:await u(t.LOMBARD_BTCB_TO_BTC,async()=>{let{createBtcbToBtcService:e}=await import(`./transfer-service/lombard/btcb-to-btc-service.js`);return await e({bitcoinFunctions:l.btcFunctions,environment:r,evmSigner:l.evmSigner,fetch:o})});break;case t.LOMBARD_BTC_TO_BTCB:await u(t.LOMBARD_BTC_TO_BTCB,async()=>{let{createBtcToBtcbService:e}=await import(`./transfer-service/lombard/btc-to-btcb-service.js`);return await e({bitcoinFunctions:l.btcFunctions,btcSigner:l.btcSigner,environment:r,evmSigner:l.evmSigner,fetch:o})});break;case t.MARKR:if(r!==e.PROD){c[t.MARKR]={status:`unsupported-environment`,message:`Service type "${t.MARKR}" is only supported in production environment.`};break}await u(t.MARKR,async()=>{let{createMarkrService:e}=await import(`./transfer-service/markr/markr-service.js`);return await e({apiBaseUrl:l.markrApiUrl,apiToken:l.markrApiToken,appId:l.markrAppId,disableCrossChainSwaps:l.disableCrossChainSwaps,fetch:o,environment:r,evmSigner:l.evmSigner,getTargetChainAssets:l.getTargetChainAssets,solanaSigner:l.solanaSigner})});break;case t.WRAP_UNWRAP:await u(t.WRAP_UNWRAP,async()=>{let{createWrapUnwrapService:e}=await import(`./transfer-service/wrap-unwrap/wrap-unwrap-service.js`);return await e({environment:r,evmSigner:l.evmSigner,fetch:o})});break;default:break}}return{services:s,status:{environment:r,services:c}}},p=async({environment:e,fetch:t,serviceInitializers:i})=>{u(e),d(i);let{services:o,status:s}=await f({environment:e,serviceInitializers:i,fetch:t});return{id:crypto.randomUUID(),estimateNativeFee:async(e,t)=>{let i=Math.floor(Date.now()/1e3);if(e.expiresAt<=i){let t=i-e.expiresAt;throw new r(n.QUOTE_EXPIRED,`Quote expired ${t} seconds ago.`)}let s=o.get(e.serviceType);if(!s)throw new a(n.SERVICE_TYPE_NOT_CONFIGURED);return await s.estimateNativeFee(e,t)},getBridgeableAssets:async({sourceAsset:e,sourceChainId:t,targetChainId:n})=>{let r=await Promise.allSettled(Array.from(o.values()).map(r=>r.getBridgeableAssets({sourceAsset:e,sourceChainId:t,targetChainId:n}))),i=new Map;for(let e of r)if(e.status===`fulfilled`)for(let t of e.value){let{bridgeProviders:e,...r}=t,a=l(n,r),o=i.get(a);if(o){let t=[...new Set([...o.bridgeProviders,...e])];i.set(a,{...o,bridgeProviders:t})}else i.set(a,{...r,bridgeProviders:[...e]})}return Array.from(i.values())},getMinimumTransferAmount:async e=>{let t={};for(let n of o.values())if(n.analyzeSupport(e)){let r=await n.getMinimumTransferAmount(e);t[n.type]=r}return Object.keys(t).length>0?t:null},getSupportedChains:async()=>{let e=new Map,t=await Promise.all(Array.from(o.values()).map(e=>e.getSupportedChains()));for(let n of t)for(let[t,r]of n.entries()){let n=e.get(t);n||(n=new Set,e.set(t,n));for(let e of r)n.add(e)}return e},getQuoter:(e,t)=>new c(e,Array.from(o.values()),t),status:()=>s,trackTransfer:e=>{let{transfer:t}=e,r=o.get(t.type);if(!r)throw new a(n.SERVICE_TYPE_NOT_CONFIGURED);return r.trackTransfer(e)},transferAsset:async e=>{let{quote:t}=e,r=o.get(t.serviceType);if(!r)throw new a(n.SERVICE_TYPE_NOT_CONFIGURED);return await r.transferAsset(e)}}};export{p as createTransferManager};
2
2
  //# sourceMappingURL=transfer-manager.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"transfer-manager.js","names":[],"sources":["../src/transfer-manager.ts"],"sourcesContent":["import { Environment, ServiceType, TokenType } from './constants';\nimport { ErrorReason, InvalidParamsError, ServiceInitializationError, ServiceUnavailableError } from './errors';\nimport type { Asset, BridgeableUiAsset, ChainAssetMap } from './types/asset';\nimport { isEnvironment, isServiceInitializer } from './type-guards';\nimport type { MutableGetSupportedChainsResult, ServiceInitializer, TransferService } from './types/service';\nimport type {\n CreateTransferManagerOptions,\n TransferManager,\n TransferManagerStatus,\n TransferManagerStatusServicesRecord,\n} from './types/transfer-manager';\nimport { Quoter } from './quoter/quoter';\nimport { mergeChainAssetMaps } from './_utils/merge-assets';\nimport { getAssetId } from './utils/asset-id';\nimport { isCaip2ChainId } from './utils/caip';\nimport type { Caip2ChainId } from './types/caip';\nimport type { Fetch } from './types/utility-types';\n\n/**\n * Validates the provided \"environment\" option.\n *\n * @throws {ServiceInitializationError} If the environment is invalid.\n */\nconst validateEnvironment = (environment: Environment): void => {\n if (!isEnvironment(environment)) {\n throw new ServiceInitializationError(ErrorReason.ENVIRONMENT_NOT_SUPPORTED);\n }\n};\n\n/**\n * Validates the provided \"serviceInitializers\" option.\n *\n * Checks for the following:\n * - At least one service initializer is provided.\n * - All service initializers are valid.\n * - No duplicate service types are initialized.\n *\n * @throws {ServiceInitializationError} If the service initializers are invalid.\n */\nconst validateServiceInitializers = (serviceInitializers: readonly ServiceInitializer[]): void => {\n if (serviceInitializers.length === 0) {\n throw new ServiceInitializationError('No service initializers provided.');\n }\n\n if (serviceInitializers.some((serviceInitializer) => !isServiceInitializer(serviceInitializer))) {\n throw new ServiceInitializationError('One or more service initializers are invalid.');\n }\n\n const serviceInitializerTypes = new Set<ServiceType>();\n for (const initializer of serviceInitializers) {\n if (serviceInitializerTypes.has(initializer.type)) {\n throw new ServiceInitializationError(\n ErrorReason.DUPLICATE_SERVICE_INITIALIZATION,\n `Service type \"${initializer.type}\" has been initialized more than once.`,\n );\n }\n serviceInitializerTypes.add(initializer.type);\n }\n};\n\nconst initializeServices = async ({\n environment,\n serviceInitializers,\n fetch: customFetch,\n}: {\n environment: Environment;\n serviceInitializers: readonly ServiceInitializer[];\n fetch?: Fetch;\n}): Promise<{\n services: Map<ServiceType, TransferService>;\n status: TransferManagerStatus;\n}> => {\n const initializedServicesMap: Map<ServiceType, TransferService> = new Map();\n const serviceStatuses: TransferManagerStatusServicesRecord = {};\n\n const wrapInitializationError = (serviceType: ServiceType, error: unknown): ServiceInitializationError => {\n if (error instanceof ServiceInitializationError) {\n return error;\n }\n\n const details = error instanceof Error ? error.message : String(error);\n\n return new ServiceInitializationError(\n ErrorReason.UNKNOWN,\n `Failed to initialize service type \"${serviceType}\". ${details}`,\n error,\n );\n };\n\n const initializeService = async (\n serviceType: ServiceType,\n initializer: () => Promise<TransferService>,\n ): Promise<void> => {\n try {\n const service = await initializer();\n initializedServicesMap.set(serviceType, service);\n serviceStatuses[serviceType] = { status: 'initialized' };\n } catch (error) {\n const wrappedError = wrapInitializationError(serviceType, error);\n\n serviceStatuses[serviceType] = {\n status: 'error',\n error: wrappedError,\n };\n }\n };\n\n for (const initializer of serviceInitializers) {\n // Error on duplicate initialization attempts.\n if (initializedServicesMap.has(initializer.type)) {\n throw new ServiceInitializationError(\n ErrorReason.DUPLICATE_SERVICE_INITIALIZATION,\n `Service type \"${initializer.type}\" has been initialized more than once.`,\n );\n }\n\n switch (initializer.type) {\n case ServiceType.AVALANCHE_EVM: {\n await initializeService(ServiceType.AVALANCHE_EVM, async () => {\n const { createAvalancheEvmService } = await import('./transfer-service/avalanche-evm/avalanche-evm-service');\n\n return await createAvalancheEvmService({\n environment,\n evmSigner: initializer.evmSigner,\n fetch: customFetch,\n });\n });\n\n break;\n }\n\n case ServiceType.LOMBARD_BTCB_TO_BTC: {\n await initializeService(ServiceType.LOMBARD_BTCB_TO_BTC, async () => {\n const { createBtcbToBtcService } = await import('./transfer-service/lombard/btcb-to-btc-service');\n\n return await createBtcbToBtcService({\n bitcoinFunctions: initializer.btcFunctions,\n environment,\n evmSigner: initializer.evmSigner,\n fetch: customFetch,\n });\n });\n\n break;\n }\n\n case ServiceType.LOMBARD_BTC_TO_BTCB: {\n await initializeService(ServiceType.LOMBARD_BTC_TO_BTCB, async () => {\n const { createBtcToBtcbService } = await import('./transfer-service/lombard/btc-to-btcb-service');\n\n return await createBtcToBtcbService({\n bitcoinFunctions: initializer.btcFunctions,\n btcSigner: initializer.btcSigner,\n environment,\n evmSigner: initializer.evmSigner,\n fetch: customFetch,\n });\n });\n\n break;\n }\n\n case ServiceType.MARKR: {\n if (environment !== Environment.PROD) {\n serviceStatuses[ServiceType.MARKR] = {\n status: 'unsupported-environment',\n message: `Service type \"${ServiceType.MARKR}\" is only supported in production environment.`,\n };\n break;\n }\n\n await initializeService(ServiceType.MARKR, async () => {\n const { createMarkrService } = await import('./transfer-service/markr/markr-service');\n\n return await createMarkrService({\n apiBaseUrl: initializer.markrApiUrl,\n apiToken: initializer.markrApiToken,\n appId: initializer.markrAppId,\n disableCrossChainSwaps: initializer.disableCrossChainSwaps,\n fetch: customFetch,\n environment,\n evmSigner: initializer.evmSigner,\n getTargetChainAssets: initializer.getTargetChainAssets,\n solanaSigner: initializer.solanaSigner,\n });\n });\n\n break;\n }\n\n case ServiceType.WRAP_UNWRAP: {\n await initializeService(ServiceType.WRAP_UNWRAP, async () => {\n const { createWrapUnwrapService } = await import('./transfer-service/wrap-unwrap/wrap-unwrap-service');\n\n return await createWrapUnwrapService({\n environment,\n evmSigner: initializer.evmSigner,\n fetch: customFetch,\n });\n });\n\n break;\n }\n\n default: {\n break;\n }\n }\n }\n\n return {\n services: initializedServicesMap,\n status: {\n environment,\n services: serviceStatuses,\n },\n };\n};\n\nconst _getAssets = async (services: Map<ServiceType, TransferService>): Promise<ChainAssetMap> => {\n const assetMaps: ChainAssetMap[] = [];\n\n for (const service of services.values()) {\n const serviceAssets = await service.getAssets();\n assetMaps.push(serviceAssets);\n }\n\n return mergeChainAssetMaps(assetMaps);\n};\n\n/**\n * Creates a TransferManager instance.\n *\n * @returns {Promise<TransferManager>} The TransferManager instance.\n * @throws {ServiceInitializationError} If the provided options are invalid.\n */\nexport const createTransferManager = async ({\n environment,\n fetch: customFetch,\n serviceInitializers,\n}: CreateTransferManagerOptions): Promise<TransferManager> => {\n // Validate environment.\n validateEnvironment(environment);\n validateServiceInitializers(serviceInitializers);\n\n const { services, status } = await initializeServices({ environment, serviceInitializers, fetch: customFetch });\n\n return {\n id: crypto.randomUUID(),\n estimateNativeFee: async (quote, options) => {\n const now = Math.floor(Date.now() / 1_000);\n\n if (quote.expiresAt <= now) {\n const expiredSecondsAgo = now - quote.expiresAt;\n\n throw new InvalidParamsError(ErrorReason.QUOTE_EXPIRED, `Quote expired ${expiredSecondsAgo} seconds ago.`);\n }\n\n const service = services.get(quote.serviceType);\n\n if (!service) {\n throw new ServiceUnavailableError(ErrorReason.SERVICE_TYPE_NOT_CONFIGURED);\n }\n\n return await service.estimateNativeFee(quote, options);\n },\n getAssetBridgeMap: async ({ sourceAsset, sourceChainId }) => {\n const assets = await _getAssets(services);\n\n const chainAssets = assets[sourceChainId];\n\n if (!chainAssets) {\n return null;\n }\n\n const chainAsset = chainAssets.find((asset) => {\n if (sourceAsset.type === TokenType.NATIVE) {\n return asset.type === TokenType.NATIVE;\n } else {\n return asset.type === sourceAsset.type && asset.address === sourceAsset.address;\n }\n });\n\n if (!chainAsset || !chainAsset.destinations) {\n return null;\n }\n\n const destinations = chainAsset.destinations;\n\n // map destinations to the required format, lookup bridged asset from assets map\n const result: {\n [chainId: string]: {\n bridgedAsset: Asset;\n bridgeProviders: readonly ServiceType[];\n };\n } = {};\n\n for (const [destChainId, destInfo] of Object.entries(destinations)) {\n if (!isCaip2ChainId(destChainId)) {\n continue;\n }\n\n const destChainAssets = assets[destChainId];\n\n if (!destChainAssets) {\n continue;\n }\n\n // bridgedAsset is the asset from the assets map that matches the destInfo address\n const bridgedAsset = destChainAssets.find((asset) => {\n if (destInfo.address === TokenType.NATIVE) {\n return asset.type === TokenType.NATIVE;\n }\n\n return asset.type !== TokenType.NATIVE && asset.address === destInfo.address;\n });\n\n if (!bridgedAsset) {\n continue;\n }\n\n // Convert the TransferableAsset to Asset by omitting the 'destinations' field\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { destinations: _omit, swapProviders: _omitSwapProviders, ...convertedBridgedAsset } = bridgedAsset;\n\n result[destChainId] = {\n bridgedAsset: convertedBridgedAsset,\n bridgeProviders: destInfo.bridgeProviders,\n };\n }\n\n return Object.keys(result).length > 0 ? result : null;\n },\n getMinimumTransferAmount: async (props) => {\n const serviceMinimums: { [key in ServiceType]?: bigint } = {};\n\n for (const service of services.values()) {\n if (service.analyzeSupport(props)) {\n const serviceMinAmount = await service.getMinimumTransferAmount(props);\n serviceMinimums[service.type] = serviceMinAmount;\n }\n }\n\n return Object.keys(serviceMinimums).length > 0 ? serviceMinimums : null;\n },\n getSupportedChains: async () => {\n const supportedChainsMap: MutableGetSupportedChainsResult = new Map();\n\n // Fetch supported chains from all configured services in parallel.\n const serviceResults = await Promise.all(\n Array.from(services.values()).map((service) => service.getSupportedChains()),\n );\n\n // Merge results: union destination sets for identical source chain IDs.\n for (const result of serviceResults) {\n for (const [sourceChainId, targetChainIds] of result.entries()) {\n let mergedTargets = supportedChainsMap.get(sourceChainId);\n if (!mergedTargets) {\n mergedTargets = new Set<Caip2ChainId>();\n supportedChainsMap.set(sourceChainId, mergedTargets);\n }\n\n for (const targetChainId of targetChainIds) {\n mergedTargets.add(targetChainId);\n }\n }\n }\n\n return supportedChainsMap;\n },\n getQuoter: (props, options) => {\n return new Quoter(props, Array.from(services.values()), options);\n },\n status: () => status,\n trackTransfer: (props) => {\n const { transfer } = props;\n const service = services.get(transfer.type);\n\n if (!service) {\n throw new ServiceUnavailableError(ErrorReason.SERVICE_TYPE_NOT_CONFIGURED);\n }\n\n return service.trackTransfer(props);\n },\n transferAsset: async (props) => {\n const { quote } = props;\n const service = services.get(quote.serviceType);\n\n if (!service) {\n throw new ServiceUnavailableError(ErrorReason.SERVICE_TYPE_NOT_CONFIGURED);\n }\n\n return await service.transferAsset(props);\n },\n getBridgeableAssets: async ({ sourceAsset, sourceChainId, targetChainId }) => {\n const settledResults = await Promise.allSettled(\n Array.from(services.values()).map((service) =>\n service.getBridgeableAssets({ sourceAsset, sourceChainId, targetChainId }),\n ),\n );\n\n const merged = new Map<string, BridgeableUiAsset>();\n\n for (const settled of settledResults) {\n if (settled.status !== 'fulfilled') continue;\n for (const result of settled.value) {\n const { bridgeProviders, ...asset } = result;\n const key = getAssetId(targetChainId, asset);\n\n const existing = merged.get(key);\n if (existing) {\n const combined = [...new Set([...existing.bridgeProviders, ...bridgeProviders])];\n merged.set(key, { ...existing, bridgeProviders: combined });\n } else {\n merged.set(key, { ...asset, bridgeProviders: [...bridgeProviders] });\n }\n }\n }\n\n return Array.from(merged.values());\n },\n } satisfies TransferManager;\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"transfer-manager.js","names":[],"sources":["../src/transfer-manager.ts"],"sourcesContent":["import { Environment, ServiceType } from './constants';\nimport { ErrorReason, InvalidParamsError, ServiceInitializationError, ServiceUnavailableError } from './errors';\nimport type { BridgeableUiAsset } from './types/asset';\nimport { isEnvironment, isServiceInitializer } from './type-guards';\nimport type { MutableGetSupportedChainsResult, ServiceInitializer, TransferService } from './types/service';\nimport type {\n CreateTransferManagerOptions,\n TransferManager,\n TransferManagerStatus,\n TransferManagerStatusServicesRecord,\n} from './types/transfer-manager';\nimport { Quoter } from './quoter/quoter';\nimport { getAssetId } from './utils/asset-id';\nimport type { Caip2ChainId } from './types/caip';\nimport type { Fetch } from './types/utility-types';\n\n/**\n * Validates the provided \"environment\" option.\n *\n * @throws {ServiceInitializationError} If the environment is invalid.\n */\nconst validateEnvironment = (environment: Environment): void => {\n if (!isEnvironment(environment)) {\n throw new ServiceInitializationError(ErrorReason.ENVIRONMENT_NOT_SUPPORTED);\n }\n};\n\n/**\n * Validates the provided \"serviceInitializers\" option.\n *\n * Checks for the following:\n * - At least one service initializer is provided.\n * - All service initializers are valid.\n * - No duplicate service types are initialized.\n *\n * @throws {ServiceInitializationError} If the service initializers are invalid.\n */\nconst validateServiceInitializers = (serviceInitializers: readonly ServiceInitializer[]): void => {\n if (serviceInitializers.length === 0) {\n throw new ServiceInitializationError('No service initializers provided.');\n }\n\n if (serviceInitializers.some((serviceInitializer) => !isServiceInitializer(serviceInitializer))) {\n throw new ServiceInitializationError('One or more service initializers are invalid.');\n }\n\n const serviceInitializerTypes = new Set<ServiceType>();\n for (const initializer of serviceInitializers) {\n if (serviceInitializerTypes.has(initializer.type)) {\n throw new ServiceInitializationError(\n ErrorReason.DUPLICATE_SERVICE_INITIALIZATION,\n `Service type \"${initializer.type}\" has been initialized more than once.`,\n );\n }\n serviceInitializerTypes.add(initializer.type);\n }\n};\n\nconst initializeServices = async ({\n environment,\n serviceInitializers,\n fetch: customFetch,\n}: {\n environment: Environment;\n serviceInitializers: readonly ServiceInitializer[];\n fetch?: Fetch;\n}): Promise<{\n services: Map<ServiceType, TransferService>;\n status: TransferManagerStatus;\n}> => {\n const initializedServicesMap: Map<ServiceType, TransferService> = new Map();\n const serviceStatuses: TransferManagerStatusServicesRecord = {};\n\n const wrapInitializationError = (serviceType: ServiceType, error: unknown): ServiceInitializationError => {\n if (error instanceof ServiceInitializationError) {\n return error;\n }\n\n const details = error instanceof Error ? error.message : String(error);\n\n return new ServiceInitializationError(\n ErrorReason.UNKNOWN,\n `Failed to initialize service type \"${serviceType}\". ${details}`,\n error,\n );\n };\n\n const initializeService = async (\n serviceType: ServiceType,\n initializer: () => Promise<TransferService>,\n ): Promise<void> => {\n try {\n const service = await initializer();\n initializedServicesMap.set(serviceType, service);\n serviceStatuses[serviceType] = { status: 'initialized' };\n } catch (error) {\n const wrappedError = wrapInitializationError(serviceType, error);\n\n serviceStatuses[serviceType] = {\n status: 'error',\n error: wrappedError,\n };\n }\n };\n\n for (const initializer of serviceInitializers) {\n // Error on duplicate initialization attempts.\n if (initializedServicesMap.has(initializer.type)) {\n throw new ServiceInitializationError(\n ErrorReason.DUPLICATE_SERVICE_INITIALIZATION,\n `Service type \"${initializer.type}\" has been initialized more than once.`,\n );\n }\n\n switch (initializer.type) {\n case ServiceType.AVALANCHE_EVM: {\n await initializeService(ServiceType.AVALANCHE_EVM, async () => {\n const { createAvalancheEvmService } = await import('./transfer-service/avalanche-evm/avalanche-evm-service');\n\n return await createAvalancheEvmService({\n environment,\n evmSigner: initializer.evmSigner,\n fetch: customFetch,\n });\n });\n\n break;\n }\n\n case ServiceType.LOMBARD_BTCB_TO_BTC: {\n await initializeService(ServiceType.LOMBARD_BTCB_TO_BTC, async () => {\n const { createBtcbToBtcService } = await import('./transfer-service/lombard/btcb-to-btc-service');\n\n return await createBtcbToBtcService({\n bitcoinFunctions: initializer.btcFunctions,\n environment,\n evmSigner: initializer.evmSigner,\n fetch: customFetch,\n });\n });\n\n break;\n }\n\n case ServiceType.LOMBARD_BTC_TO_BTCB: {\n await initializeService(ServiceType.LOMBARD_BTC_TO_BTCB, async () => {\n const { createBtcToBtcbService } = await import('./transfer-service/lombard/btc-to-btcb-service');\n\n return await createBtcToBtcbService({\n bitcoinFunctions: initializer.btcFunctions,\n btcSigner: initializer.btcSigner,\n environment,\n evmSigner: initializer.evmSigner,\n fetch: customFetch,\n });\n });\n\n break;\n }\n\n case ServiceType.MARKR: {\n if (environment !== Environment.PROD) {\n serviceStatuses[ServiceType.MARKR] = {\n status: 'unsupported-environment',\n message: `Service type \"${ServiceType.MARKR}\" is only supported in production environment.`,\n };\n break;\n }\n\n await initializeService(ServiceType.MARKR, async () => {\n const { createMarkrService } = await import('./transfer-service/markr/markr-service');\n\n return await createMarkrService({\n apiBaseUrl: initializer.markrApiUrl,\n apiToken: initializer.markrApiToken,\n appId: initializer.markrAppId,\n disableCrossChainSwaps: initializer.disableCrossChainSwaps,\n fetch: customFetch,\n environment,\n evmSigner: initializer.evmSigner,\n getTargetChainAssets: initializer.getTargetChainAssets,\n solanaSigner: initializer.solanaSigner,\n });\n });\n\n break;\n }\n\n case ServiceType.WRAP_UNWRAP: {\n await initializeService(ServiceType.WRAP_UNWRAP, async () => {\n const { createWrapUnwrapService } = await import('./transfer-service/wrap-unwrap/wrap-unwrap-service');\n\n return await createWrapUnwrapService({\n environment,\n evmSigner: initializer.evmSigner,\n fetch: customFetch,\n });\n });\n\n break;\n }\n\n default: {\n break;\n }\n }\n }\n\n return {\n services: initializedServicesMap,\n status: {\n environment,\n services: serviceStatuses,\n },\n };\n};\n\n/**\n * Creates a TransferManager instance.\n *\n * @returns {Promise<TransferManager>} The TransferManager instance.\n * @throws {ServiceInitializationError} If the provided options are invalid.\n */\nexport const createTransferManager = async ({\n environment,\n fetch: customFetch,\n serviceInitializers,\n}: CreateTransferManagerOptions): Promise<TransferManager> => {\n // Validate environment.\n validateEnvironment(environment);\n validateServiceInitializers(serviceInitializers);\n\n const { services, status } = await initializeServices({ environment, serviceInitializers, fetch: customFetch });\n\n return {\n id: crypto.randomUUID(),\n estimateNativeFee: async (quote, options) => {\n const now = Math.floor(Date.now() / 1_000);\n\n if (quote.expiresAt <= now) {\n const expiredSecondsAgo = now - quote.expiresAt;\n\n throw new InvalidParamsError(ErrorReason.QUOTE_EXPIRED, `Quote expired ${expiredSecondsAgo} seconds ago.`);\n }\n\n const service = services.get(quote.serviceType);\n\n if (!service) {\n throw new ServiceUnavailableError(ErrorReason.SERVICE_TYPE_NOT_CONFIGURED);\n }\n\n return await service.estimateNativeFee(quote, options);\n },\n getBridgeableAssets: async ({ sourceAsset, sourceChainId, targetChainId }) => {\n const settledResults = await Promise.allSettled(\n Array.from(services.values()).map((service) =>\n service.getBridgeableAssets({ sourceAsset, sourceChainId, targetChainId }),\n ),\n );\n\n const merged = new Map<string, BridgeableUiAsset>();\n\n for (const settled of settledResults) {\n if (settled.status !== 'fulfilled') continue;\n for (const result of settled.value) {\n const { bridgeProviders, ...asset } = result;\n const key = getAssetId(targetChainId, asset);\n\n const existing = merged.get(key);\n if (existing) {\n const combined = [...new Set([...existing.bridgeProviders, ...bridgeProviders])];\n merged.set(key, { ...existing, bridgeProviders: combined });\n } else {\n merged.set(key, { ...asset, bridgeProviders: [...bridgeProviders] });\n }\n }\n }\n\n return Array.from(merged.values());\n },\n getMinimumTransferAmount: async (props) => {\n const serviceMinimums: { [key in ServiceType]?: bigint } = {};\n\n for (const service of services.values()) {\n if (service.analyzeSupport(props)) {\n const serviceMinAmount = await service.getMinimumTransferAmount(props);\n serviceMinimums[service.type] = serviceMinAmount;\n }\n }\n\n return Object.keys(serviceMinimums).length > 0 ? serviceMinimums : null;\n },\n getSupportedChains: async () => {\n const supportedChainsMap: MutableGetSupportedChainsResult = new Map();\n\n // Fetch supported chains from all configured services in parallel.\n const serviceResults = await Promise.all(\n Array.from(services.values()).map((service) => service.getSupportedChains()),\n );\n\n // Merge results: union destination sets for identical source chain IDs.\n for (const result of serviceResults) {\n for (const [sourceChainId, targetChainIds] of result.entries()) {\n let mergedTargets = supportedChainsMap.get(sourceChainId);\n if (!mergedTargets) {\n mergedTargets = new Set<Caip2ChainId>();\n supportedChainsMap.set(sourceChainId, mergedTargets);\n }\n\n for (const targetChainId of targetChainIds) {\n mergedTargets.add(targetChainId);\n }\n }\n }\n\n return supportedChainsMap;\n },\n getQuoter: (props, options) => {\n return new Quoter(props, Array.from(services.values()), options);\n },\n status: () => status,\n trackTransfer: (props) => {\n const { transfer } = props;\n const service = services.get(transfer.type);\n\n if (!service) {\n throw new ServiceUnavailableError(ErrorReason.SERVICE_TYPE_NOT_CONFIGURED);\n }\n\n return service.trackTransfer(props);\n },\n transferAsset: async (props) => {\n const { quote } = props;\n const service = services.get(quote.serviceType);\n\n if (!service) {\n throw new ServiceUnavailableError(ErrorReason.SERVICE_TYPE_NOT_CONFIGURED);\n }\n\n return await service.transferAsset(props);\n },\n } satisfies TransferManager;\n};\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`);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(e){let n={...l,errorCode:t.getErrorCodeForViemError(e),failedAtMs:Date.now(),status:`failed`};return i(n),n}})()}}exports.trackSameChainEvmTransfer=r;
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","getErrorCodeForViemError"],"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, getErrorCodeForViemError, 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 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 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 (error) {\n const failedTransfer: FailedTransfer = {\n ...currentTransfer,\n errorCode: getErrorCodeForViemError(error),\n failedAtMs: Date.now(),\n status: 'failed',\n };\n updateListener(failedTransfer);\n return failedTransfer;\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,CAqE3D,MAAO,CAAE,SAAQ,QAnEO,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,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,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,QACA,EAAO,CACd,IAAM,EAAiC,CACrC,GAAG,EACH,UAAWE,EAAAA,yBAAyB,EAAM,CAC1C,WAAY,KAAK,KAAK,CACtB,OAAQ,SACT,CAED,OADA,EAAe,EAAe,CACvB,MAI+B,CAAE"}
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,getErrorCodeForViemError as n,getEvmClientForChain as r}from"./_utils.js";import{isHash as i}from"viem";function a({transfer:a,updateListener:o},s){let c=new AbortController,l=()=>c.abort();if(a.status!==`source-pending`)return{cancel:l,result:Promise.resolve(a)};let u=s??r({chain:a.sourceChain}),d=structuredClone(a);return{cancel:l,result:(async()=>{if(d.status!==`source-pending`)return d;let{requiredConfirmationCount:r,txHash:a}=d.source;if(!i(a)){let t={...d,errorCode:e.INVALID_PARAMS,failedAtMs:Date.now(),status:`failed`};return o(t),t}try{let n=await t(u.waitForTransactionReceipt({confirmations:Math.max(r,1),hash:a}),c.signal);if(n.status===`aborted`)return d;if(n.value.status===`reverted`){let t={...d,errorCode:e.TRANSACTION_REVERTED,failedAtMs:Date.now(),status:`failed`};return o(t),t}let i={...d,completedAtMs:Date.now(),source:{...d.source,confirmationCount:r},status:`completed`,target:null};return o(i),i}catch(e){let t={...d,errorCode:n(e),failedAtMs:Date.now(),status:`failed`};return o(t),t}})()}}export{a as trackSameChainEvmTransfer};
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, getErrorCodeForViemError, 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 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 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 (error) {\n const failedTransfer: FailedTransfer = {\n ...currentTransfer,\n errorCode: getErrorCodeForViemError(error),\n failedAtMs: Date.now(),\n status: 'failed',\n };\n updateListener(failedTransfer);\n return failedTransfer;\n }\n };\n\n return { cancel, result: executeTracking() };\n}\n"],"mappings":"0KAkBA,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,CAqE3D,MAAO,CAAE,SAAQ,QAnEO,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,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,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,QACA,EAAO,CACd,IAAM,EAAiC,CACrC,GAAG,EACH,UAAW,EAAyB,EAAM,CAC1C,WAAY,KAAK,KAAK,CACtB,OAAQ,SACT,CAED,OADA,EAAe,EAAe,CACvB,MAI+B,CAAE"}
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(t){return t instanceof n.WaitForTransactionReceiptTimeoutError?e.ErrorCode.TIMEOUT:e.ErrorCode.TRANSACTION_REVERTED}function l(t){return(0,r.isSolanaError)(t,r.SOLANA_ERROR__JSON_RPC__SERVER_ERROR_NODE_UNHEALTHY)||(0,r.isSolanaError)(t,r.SOLANA_ERROR__RPC__TRANSPORT_HTTP_ERROR)?e.ErrorCode.SERVICE_NOT_AVAILABLE:(0,r.isSolanaError)(t,r.SOLANA_ERROR__BLOCK_HEIGHT_EXCEEDED)?e.ErrorCode.TIMEOUT:e.ErrorCode.UNKNOWN}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}}exports.applyFeeUnitsBpsMargin=s,exports.awaitOrAbort=f,exports.getErrorCodeForSolanaRpcError=l,exports.getErrorCodeForViemError=c,exports.getEvmClientForChain=a,exports.getSolanaRpcForChain=o,exports.makeFailedTransferFromQuote=p,exports.waitForTimeoutOrAbort=u;
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{ErrorCode as e,InvalidParamsError as t}from"../errors.js";import{splitCaip2ChainId as n}from"../utils/caip.js";import{WaitForTransactionReceiptTimeoutError as r,createWalletClient as i,http as a,publicActions as o}from"viem";import{SOLANA_ERROR__BLOCK_HEIGHT_EXCEEDED as s,SOLANA_ERROR__JSON_RPC__SERVER_ERROR_NODE_UNHEALTHY as c,SOLANA_ERROR__RPC__TRANSPORT_HTTP_ERROR as l,createSolanaRpc as u,isSolanaError as d}from"@solana/kit";function f(e){let{namespace:r,reference:i}=n(e.chainId);if(r!==`eip155`)throw new t(`Can not get Viem chain for unsupported chain`,`Unsupported chain namespace: ${r}. Only eip155 chains are supported.`);return{id:Number(i),name:e.chainName,nativeCurrency:{decimals:e.networkToken.decimals,symbol:e.networkToken.symbol,name:e.networkToken.name},rpcUrls:{default:{http:[e.rpcUrl]},public:{http:[e.rpcUrl]}},...e.utilityAddresses?.multicall&&{contracts:{multicall3:{address:e.utilityAddresses.multicall}}}}}function p({chain:e}){return i({chain:f(e),transport:a(e.rpcUrl,{batch:!0,retryCount:6,retryDelay:200,timeout:15e3})}).extend(o)}function m({chain:e}){return u(e.rpcUrl)}function h(e,n){if(n===void 0)return e;if(!Number.isInteger(n)||n<0)throw new t(`Invalid feeUnitsMarginBps`,`feeUnitsMarginBps must be a non-negative integer, but got ${n}`);return e*BigInt(1e4+n)/10000n}function g(t){return t instanceof r?e.TIMEOUT:e.TRANSACTION_REVERTED}function _(t){return d(t,c)||d(t,l)?e.SERVICE_NOT_AVAILABLE:d(t,s)?e.TIMEOUT:e.UNKNOWN}function v({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 y=Symbol(`aborted`);async function b(e,t){let n=await Promise.race([e,new Promise(e=>{t.addEventListener(`abort`,()=>e(y),{once:!0})})]);return n===y||t.aborted?{status:`aborted`}:{status:`ok`,value:n}}function x(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{h as applyFeeUnitsBpsMargin,b as awaitOrAbort,_ as getErrorCodeForSolanaRpcError,g as getErrorCodeForViemError,p as getEvmClientForChain,m as getSolanaRpcForChain,x as makeFailedTransferFromQuote,v as waitForTimeoutOrAbort};
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"}