@avalabs/fusion-sdk 0.20.0 → 0.22.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 (101) hide show
  1. package/dist/mod.cjs +1 -1
  2. package/dist/mod.d.cts +5 -1
  3. package/dist/mod.d.ts +5 -1
  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/_evm-approval.cjs +2 -0
  10. package/dist/transfer-service/_evm-approval.cjs.map +1 -0
  11. package/dist/transfer-service/_evm-approval.d.cts +23 -0
  12. package/dist/transfer-service/_evm-approval.d.ts +23 -0
  13. package/dist/transfer-service/_evm-approval.js +2 -0
  14. package/dist/transfer-service/_evm-approval.js.map +1 -0
  15. package/dist/transfer-service/_utils.cjs +1 -1
  16. package/dist/transfer-service/_utils.cjs.map +1 -1
  17. package/dist/transfer-service/_utils.d.ts +1 -0
  18. package/dist/transfer-service/_utils.js +1 -1
  19. package/dist/transfer-service/_utils.js.map +1 -1
  20. package/dist/transfer-service/avalanche-cct/_handlers/estimate-native-fee.cjs +1 -1
  21. package/dist/transfer-service/avalanche-cct/_handlers/estimate-native-fee.js +1 -1
  22. package/dist/transfer-service/avalanche-cct/_handlers/track-transfer.cjs +1 -1
  23. package/dist/transfer-service/avalanche-cct/_handlers/track-transfer.js +1 -1
  24. package/dist/transfer-service/avalanche-cct/_handlers/transfer-asset.cjs +1 -1
  25. package/dist/transfer-service/avalanche-cct/_handlers/transfer-asset.js +1 -1
  26. package/dist/transfer-service/avalanche-cct/_utils/fees.cjs +1 -1
  27. package/dist/transfer-service/avalanche-cct/_utils/fees.js +1 -1
  28. package/dist/transfer-service/avalanche-cct/_utils/polling.cjs +1 -1
  29. package/dist/transfer-service/avalanche-cct/_utils/polling.js +1 -1
  30. package/dist/transfer-service/avalanche-evm/_handlers/estimate-native-fee.cjs +1 -1
  31. package/dist/transfer-service/avalanche-evm/_handlers/estimate-native-fee.js +1 -1
  32. package/dist/transfer-service/markr/_api.cjs +1 -1
  33. package/dist/transfer-service/markr/_api.cjs.map +1 -1
  34. package/dist/transfer-service/markr/_api.js +1 -1
  35. package/dist/transfer-service/markr/_api.js.map +1 -1
  36. package/dist/transfer-service/markr/_handlers/estimate-native-fee.cjs +1 -1
  37. package/dist/transfer-service/markr/_handlers/estimate-native-fee.cjs.map +1 -1
  38. package/dist/transfer-service/markr/_handlers/estimate-native-fee.js +1 -1
  39. package/dist/transfer-service/markr/_handlers/estimate-native-fee.js.map +1 -1
  40. package/dist/transfer-service/markr/_handlers/stream-quotes.cjs +1 -1
  41. package/dist/transfer-service/markr/_handlers/stream-quotes.cjs.map +1 -1
  42. package/dist/transfer-service/markr/_handlers/stream-quotes.js +1 -1
  43. package/dist/transfer-service/markr/_handlers/stream-quotes.js.map +1 -1
  44. package/dist/transfer-service/markr/_handlers/transfer-asset.cjs +1 -1
  45. package/dist/transfer-service/markr/_handlers/transfer-asset.cjs.map +1 -1
  46. package/dist/transfer-service/markr/_handlers/transfer-asset.js +1 -1
  47. package/dist/transfer-service/markr/_handlers/transfer-asset.js.map +1 -1
  48. package/dist/transfer-service/markr/_schema.cjs +1 -1
  49. package/dist/transfer-service/markr/_schema.cjs.map +1 -1
  50. package/dist/transfer-service/markr/_schema.js +1 -1
  51. package/dist/transfer-service/markr/_schema.js.map +1 -1
  52. package/dist/transfer-service/markr/_utils.cjs +1 -1
  53. package/dist/transfer-service/markr/_utils.cjs.map +1 -1
  54. package/dist/transfer-service/markr/_utils.js +1 -1
  55. package/dist/transfer-service/markr/_utils.js.map +1 -1
  56. package/dist/transfer-service/markr/markr-service.cjs +1 -1
  57. package/dist/transfer-service/markr/markr-service.cjs.map +1 -1
  58. package/dist/transfer-service/markr/markr-service.d.cts +26 -0
  59. package/dist/transfer-service/markr/markr-service.d.ts +26 -0
  60. package/dist/transfer-service/markr/markr-service.js +1 -1
  61. package/dist/transfer-service/markr/markr-service.js.map +1 -1
  62. package/dist/transfer-service/markr/recurring/_api.cjs +2 -0
  63. package/dist/transfer-service/markr/recurring/_api.cjs.map +1 -0
  64. package/dist/transfer-service/markr/recurring/_api.js +2 -0
  65. package/dist/transfer-service/markr/recurring/_api.js.map +1 -0
  66. package/dist/transfer-service/markr/recurring/_chain-info.cjs +2 -0
  67. package/dist/transfer-service/markr/recurring/_chain-info.cjs.map +1 -0
  68. package/dist/transfer-service/markr/recurring/_chain-info.js +2 -0
  69. package/dist/transfer-service/markr/recurring/_chain-info.js.map +1 -0
  70. package/dist/transfer-service/markr/recurring/_eligibility.cjs +2 -0
  71. package/dist/transfer-service/markr/recurring/_eligibility.cjs.map +1 -0
  72. package/dist/transfer-service/markr/recurring/_eligibility.js +2 -0
  73. package/dist/transfer-service/markr/recurring/_eligibility.js.map +1 -0
  74. package/dist/transfer-service/markr/recurring/_frequency.cjs +2 -0
  75. package/dist/transfer-service/markr/recurring/_frequency.cjs.map +1 -0
  76. package/dist/transfer-service/markr/recurring/_frequency.d.cts +17 -0
  77. package/dist/transfer-service/markr/recurring/_frequency.d.ts +17 -0
  78. package/dist/transfer-service/markr/recurring/_frequency.js +2 -0
  79. package/dist/transfer-service/markr/recurring/_frequency.js.map +1 -0
  80. package/dist/transfer-service/markr/recurring/_namespace.cjs +2 -0
  81. package/dist/transfer-service/markr/recurring/_namespace.cjs.map +1 -0
  82. package/dist/transfer-service/markr/recurring/_namespace.js +2 -0
  83. package/dist/transfer-service/markr/recurring/_namespace.js.map +1 -0
  84. package/dist/transfer-service/markr/recurring/_schema.cjs +2 -0
  85. package/dist/transfer-service/markr/recurring/_schema.cjs.map +1 -0
  86. package/dist/transfer-service/markr/recurring/_schema.js +2 -0
  87. package/dist/transfer-service/markr/recurring/_schema.js.map +1 -0
  88. package/dist/transfer-service/markr/recurring/index.d.ts +2 -0
  89. package/dist/transfer-service/markr/recurring/types.cjs +2 -0
  90. package/dist/transfer-service/markr/recurring/types.cjs.map +1 -0
  91. package/dist/transfer-service/markr/recurring/types.d.cts +439 -0
  92. package/dist/transfer-service/markr/recurring/types.d.ts +439 -0
  93. package/dist/transfer-service/markr/recurring/types.js +2 -0
  94. package/dist/transfer-service/markr/recurring/types.js.map +1 -0
  95. package/dist/transfer-service/wrap-unwrap/_handlers/transfer-asset.cjs +1 -1
  96. package/dist/transfer-service/wrap-unwrap/_handlers/transfer-asset.js +1 -1
  97. package/dist/types/quote.d.cts +9 -0
  98. package/dist/types/quote.d.ts +9 -0
  99. package/dist/types/transfer-manager.d.cts +16 -0
  100. package/dist/types/transfer-manager.d.ts +16 -0
  101. package/package.json +1 -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(`./transfer-manager.cjs`),i=require(`./utils/caip.cjs`),a=require(`./utils/bridgeable-assets.cjs`),o=require(`./utils/price-impact.cjs`),s=require(`./utils/transfer-utils.cjs`);exports.AVALANCHE_CAIP2_TO_BLOCKCHAIN_ID_BY_NETWORK=e.AVALANCHE_CAIP2_TO_BLOCKCHAIN_ID_BY_NETWORK,exports.AVALANCHE_FUJI_CHAIN=e.AVALANCHE_FUJI_CHAIN,exports.AVALANCHE_FUJI_P_CHAIN=e.AVALANCHE_FUJI_P_CHAIN,exports.AVALANCHE_FUJI_X_CHAIN=e.AVALANCHE_FUJI_X_CHAIN,exports.AVALANCHE_MAINNET_CHAIN=e.AVALANCHE_MAINNET_CHAIN,exports.AVALANCHE_MAINNET_P_CHAIN=e.AVALANCHE_MAINNET_P_CHAIN,exports.AVALANCHE_MAINNET_X_CHAIN=e.AVALANCHE_MAINNET_X_CHAIN,exports.AbortedError=t.AbortedError,exports.AvalancheChainIds=e.AvalancheChainIds,exports.AvalancheFujiBlockchainChainIds=e.AvalancheFujiBlockchainChainIds,exports.AvalancheFujiBlockchainIds=e.AvalancheFujiBlockchainIds,exports.AvalancheMainnetBlockchainChainIds=e.AvalancheMainnetBlockchainChainIds,exports.AvalancheMainnetBlockchainIds=e.AvalancheMainnetBlockchainIds,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.EstimateNativeFeeError=t.EstimateNativeFeeError,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.HyperliquidChainIds=e.HyperliquidChainIds,exports.InsufficientFundsError=t.InsufficientFundsError,exports.InvalidParamsError=t.InvalidParamsError,exports.NATIVE_AVAX=e.NATIVE_AVAX,exports.NATIVE_ETH=e.NATIVE_ETH,exports.NATIVE_SOL_ADDRESS=e.NATIVE_SOL_ADDRESS,exports.ResponseValidationError=t.ResponseValidationError,exports.SOLANA_DEVNET_CHAIN=e.SOLANA_DEVNET_CHAIN,exports.SOLANA_MAINNET_CHAIN=e.SOLANA_MAINNET_CHAIN,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.calculatePriceImpactFromQuote=o.calculatePriceImpactFromQuote,exports.createTransferManager=r.createTransferManager,exports.dedupeBridgeableAssets=a.dedupeBridgeableAssets,exports.eip155ChainIdToCaip2=i.eip155ChainIdToCaip2,exports.isAbortedError=t.isAbortedError,exports.isCaip2ChainId=i.isCaip2ChainId,exports.isEnvironment=n.isEnvironment,exports.isErc20Asset=n.isErc20Asset,exports.isEstimateNativeFeeError=t.isEstimateNativeFeeError,exports.isEvmBridgeInitializer=n.isEvmBridgeInitializer,exports.isHttpError=t.isHttpError,exports.isInsufficientFundsError=t.isInsufficientFundsError,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=s.parseTransfer,exports.splitCaip2ChainId=i.splitCaip2ChainId,exports.stringifyTransfer=s.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/bridgeable-assets.cjs`),o=require(`./utils/price-impact.cjs`),s=require(`./utils/transfer-utils.cjs`),c=require(`./transfer-service/markr/recurring/types.cjs`),l=require(`./transfer-service/markr/recurring/_frequency.cjs`),u=require(`./transfer-service/_evm-approval.cjs`);exports.AVALANCHE_CAIP2_TO_BLOCKCHAIN_ID_BY_NETWORK=e.AVALANCHE_CAIP2_TO_BLOCKCHAIN_ID_BY_NETWORK,exports.AVALANCHE_FUJI_CHAIN=e.AVALANCHE_FUJI_CHAIN,exports.AVALANCHE_FUJI_P_CHAIN=e.AVALANCHE_FUJI_P_CHAIN,exports.AVALANCHE_FUJI_X_CHAIN=e.AVALANCHE_FUJI_X_CHAIN,exports.AVALANCHE_MAINNET_CHAIN=e.AVALANCHE_MAINNET_CHAIN,exports.AVALANCHE_MAINNET_P_CHAIN=e.AVALANCHE_MAINNET_P_CHAIN,exports.AVALANCHE_MAINNET_X_CHAIN=e.AVALANCHE_MAINNET_X_CHAIN,exports.AbortedError=t.AbortedError,exports.ApprovalRevertedError=u.ApprovalRevertedError,exports.AvalancheChainIds=e.AvalancheChainIds,exports.AvalancheFujiBlockchainChainIds=e.AvalancheFujiBlockchainChainIds,exports.AvalancheFujiBlockchainIds=e.AvalancheFujiBlockchainIds,exports.AvalancheMainnetBlockchainChainIds=e.AvalancheMainnetBlockchainChainIds,exports.AvalancheMainnetBlockchainIds=e.AvalancheMainnetBlockchainIds,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.EstimateNativeFeeError=t.EstimateNativeFeeError,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.HyperliquidChainIds=e.HyperliquidChainIds,exports.InsufficientFundsError=t.InsufficientFundsError,exports.InvalidParamsError=t.InvalidParamsError,exports.NATIVE_AVAX=e.NATIVE_AVAX,exports.NATIVE_ETH=e.NATIVE_ETH,exports.NATIVE_SOL_ADDRESS=e.NATIVE_SOL_ADDRESS,exports.RECURRING_FREQUENCY_UNITS=c.RECURRING_FREQUENCY_UNITS,exports.RECURRING_FREQUENCY_VALUE_MAX=l.RECURRING_FREQUENCY_VALUE_MAX,exports.RECURRING_UNLIMITED_ORDERS_SENTINEL=c.RECURRING_UNLIMITED_ORDERS_SENTINEL,exports.RecurringEligibilityReason=c.RecurringEligibilityReason,exports.RecurringOrderStatus=c.RecurringOrderStatus,exports.ResponseValidationError=t.ResponseValidationError,exports.SOLANA_DEVNET_CHAIN=e.SOLANA_DEVNET_CHAIN,exports.SOLANA_MAINNET_CHAIN=e.SOLANA_MAINNET_CHAIN,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.calculatePriceImpactFromQuote=o.calculatePriceImpactFromQuote,exports.createTransferManager=r.createTransferManager,exports.dedupeBridgeableAssets=a.dedupeBridgeableAssets,exports.deriveIntervalSeconds=l.deriveIntervalSeconds,exports.eip155ChainIdToCaip2=i.eip155ChainIdToCaip2,exports.isAbortedError=t.isAbortedError,exports.isCaip2ChainId=i.isCaip2ChainId,exports.isEnvironment=n.isEnvironment,exports.isErc20Asset=n.isErc20Asset,exports.isEstimateNativeFeeError=t.isEstimateNativeFeeError,exports.isEvmBridgeInitializer=n.isEvmBridgeInitializer,exports.isHttpError=t.isHttpError,exports.isInsufficientFundsError=t.isInsufficientFundsError,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=s.parseTransfer,exports.splitCaip2ChainId=i.splitCaip2ChainId,exports.stringifyTransfer=s.stringifyTransfer,exports.validateFrequency=l.validateFrequency;
package/dist/mod.d.cts CHANGED
@@ -12,6 +12,7 @@ import { CompletedTransfer, FailedTransfer, RefundedTransfer, SourceCompletedTra
12
12
  import { SolanaSendOptions, SolanaTransactionParams } from "./utils/solana-transaction.cjs";
13
13
  import { BtcDispatch, BtcSign, BtcSigner, BtcTransactionRequest, EvmDispatch, EvmSign, EvmSignBatch, EvmSignMessage, EvmSignTypedData, EvmSigner, EvmSignerWithMessage, EvmTransactionRequest, EvmTypedData, Hex, SolanaSign, SolanaSigner } from "./types/signer.cjs";
14
14
  import { AssetSearchQuery, AvalancheCctInitializer, AvalancheSendTxFunction, AvalancheSendTxParams, EstimateNativeFeeOptions, EvmServiceInitializer, GasSettings, GetBridgeableAssetsProps, GetBridgeableAssetsResult, GetMinimumTransferAmountProps, GetSupportedChainsResult, LombardServiceInitializer, MarkrServiceInitializer, MutableGetSupportedChainsResult, NativeFeeEstimate, ServiceInitializer, ServiceQuoteOptions, TrackTransferProps, TransferAssetProps, TransferService } from "./types/service.cjs";
15
+ import { CheckRecurringEligibilityParams, ListRecurringOrdersParams, ListRecurringOrdersResponse, RECURRING_FREQUENCY_UNITS, RECURRING_UNLIMITED_ORDERS_SENTINEL, RecurringChainInfoEntry, RecurringChainInfoMap, RecurringEligibility, RecurringEligibilityReason, RecurringExecuteFirstFillParams, RecurringExecuteOrderActionParams, RecurringExecuteResult, RecurringFrequency, RecurringFrequencyUnit, RecurringNamespace, RecurringNamespaceCheckEligibilityParams, RecurringNamespaceQuoteParams, RecurringOrder, RecurringOrderFailure, RecurringOrderStatus, RecurringQuoteFee, RecurringQuoteFeeType, RecurringQuoteParams, RecurringQuoteResponse, RecurringSwapParams } from "./transfer-service/markr/recurring/types.cjs";
15
16
  import { AssetBridgeMap, CreateTransferManagerOptions, ServiceStatus, ServiceStatusBaseRecord, ServiceStatusErrorRecord, ServiceStatusInitializedRecord, ServiceStatusRecord, ServiceStatusUnsupportedEnvironmentRecord, TransferManager, TransferManagerStatus, TransferManagerStatusServicesRecord } from "./types/transfer-manager.cjs";
16
17
  import { isEnvironment, isErc20Asset, isEvmBridgeInitializer, isLombardServiceInitializer, isMarkrServiceInitializer, isNativeAsset, isServiceInitializer, isSplAsset } from "./type-guards.cjs";
17
18
  import { createTransferManager } from "./transfer-manager.cjs";
@@ -19,4 +20,7 @@ import { caip2ToEip155ChainId, caip2ToEip155HexChainId, eip155ChainIdToCaip2, is
19
20
  import { dedupeBridgeableAssets } from "./utils/bridgeable-assets.cjs";
20
21
  import { calculatePriceImpactFromQuote } from "./utils/price-impact.cjs";
21
22
  import { parseTransfer, stringifyTransfer } from "./utils/transfer-utils.cjs";
22
- export { AVALANCHE_CAIP2_TO_BLOCKCHAIN_ID_BY_NETWORK, AVALANCHE_FUJI_CHAIN, AVALANCHE_FUJI_P_CHAIN, AVALANCHE_FUJI_X_CHAIN, AVALANCHE_MAINNET_CHAIN, AVALANCHE_MAINNET_P_CHAIN, AVALANCHE_MAINNET_X_CHAIN, AbortedError, ArrayElement, Asset, AssetBridgeMap, AssetSearchQuery, AssetWithExtras, AvalancheBlockchainAlias, AvalancheCctInitializer, AvalancheChainIds, AvalancheFujiBlockchainChainIds, AvalancheFujiBlockchainIds, AvalancheMainnetBlockchainChainIds, AvalancheMainnetBlockchainIds, AvalancheSendTxFunction, AvalancheSendTxParams, BITCOIN_MAINNET_CHAIN, BITCOIN_TESTNET_CHAIN, BTC_SERVICE_TYPES, BitcoinChainIds, BitcoinFeeRateTier, BitcoinFunctions, BitcoinInputUTXO, BitcoinInputUTXOWithOptionalScript, BitcoinOutputUTXO, BitcoinTx, Blockchain, Brand, BridgeableAsset, 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, EstimateNativeFeeError, type EstimateNativeFeeErrorDetails, EstimateNativeFeeOptions, EthereumChainIds, EvmChainId, EvmDispatch, EvmServiceInitializer, EvmSign, EvmSignBatch, EvmSignMessage, EvmSignTypedData, EvmSigner, EvmSignerWithMessage, EvmTransactionRequest, EvmTypedData, FEE_RATE_TIER_TO_BITCOIN, FailedTransfer, FeeRateTier, Fetch, GasSettings, type GetAtomicUtxosCallback, GetBridgeableAssetsProps, GetBridgeableAssetsResult, type GetCoreEthAddressCallback, GetMinimumTransferAmountProps, GetSupportedChainsResult, type GetUtxosCallback, type GetWalletAddressesForChainAliasCallback, type GetWalletChangeAddressForChainAliasCallback, Hex, HttpError, HyperliquidChainIds, InsufficientFundsError, InvalidParamsError, LombardServiceInitializer, MarkrServiceInitializer, Mutable, MutableGetSupportedChainsResult, NATIVE_AVAX, NATIVE_ETH, NATIVE_SOL_ADDRESS, NativeAsset, NativeFeeEstimate, Quote, QuoteFee, QuoteFeeFundingModel, QuoteFeeToken, QuoteFeeType, QuoteFees, QuoterDonePayload, QuoterDonePayloadNoEligibleServices, QuoterDonePayloadNoQuotes, QuoterDonePayloadUnsubscribed, QuoterDoneReason, QuoterEventArgs, QuoterEventHandler, QuoterInterface, QuoterProps, QuotesTuple, RefundedTransfer, ResponseValidationError, SOLANA_DEVNET_CHAIN, SOLANA_MAINNET_CHAIN, SdkError, ServiceInitializationError, ServiceInitializer, ServiceQuoteEventArgs, ServiceQuoteEventHandler, ServiceQuoteOptions, 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, calculatePriceImpactFromQuote, createTransferManager, dedupeBridgeableAssets, eip155ChainIdToCaip2, isAbortedError, isCaip2ChainId, isEnvironment, isErc20Asset, isEstimateNativeFeeError, isEvmBridgeInitializer, isHttpError, isInsufficientFundsError, isInvalidParamsError, isLombardServiceInitializer, isMarkrServiceInitializer, isNativeAsset, isResponseValidationError, isSdkError, isServiceInitializationError, isServiceInitializer, isServiceUnavailableError, isSplAsset, isTimeoutError, parseTransfer, splitCaip2ChainId, stringifyTransfer };
23
+ import { MarkrService } from "./transfer-service/markr/markr-service.cjs";
24
+ import { FrequencyValidationResult, RECURRING_FREQUENCY_VALUE_MAX, deriveIntervalSeconds, validateFrequency } from "./transfer-service/markr/recurring/_frequency.cjs";
25
+ import { ApprovalRevertedError } from "./transfer-service/_evm-approval.cjs";
26
+ export { AVALANCHE_CAIP2_TO_BLOCKCHAIN_ID_BY_NETWORK, AVALANCHE_FUJI_CHAIN, AVALANCHE_FUJI_P_CHAIN, AVALANCHE_FUJI_X_CHAIN, AVALANCHE_MAINNET_CHAIN, AVALANCHE_MAINNET_P_CHAIN, AVALANCHE_MAINNET_X_CHAIN, AbortedError, ApprovalRevertedError, ArrayElement, Asset, AssetBridgeMap, AssetSearchQuery, AssetWithExtras, AvalancheBlockchainAlias, AvalancheCctInitializer, AvalancheChainIds, AvalancheFujiBlockchainChainIds, AvalancheFujiBlockchainIds, AvalancheMainnetBlockchainChainIds, AvalancheMainnetBlockchainIds, AvalancheSendTxFunction, AvalancheSendTxParams, BITCOIN_MAINNET_CHAIN, BITCOIN_TESTNET_CHAIN, BTC_SERVICE_TYPES, BitcoinChainIds, BitcoinFeeRateTier, BitcoinFunctions, BitcoinInputUTXO, BitcoinInputUTXOWithOptionalScript, BitcoinOutputUTXO, BitcoinTx, Blockchain, Brand, BridgeableAsset, BridgeableUiAsset, BtcDispatch, BtcSign, BtcSigner, BtcTransactionRequest, Caip10AccountId, Caip2ChainId, Chain, ChainAssetMap, type CheckRecurringEligibilityParams, CompletedTransfer, CreateTransferManagerOptions, DeepMutable, DestinationInfo, ERC_ZERO_ADDRESS, ETHEREUM_MAINNET_CHAIN, ETHEREUM_SEPOLIA_CHAIN, EVM_SERVICE_TYPES, Environment, Erc20Asset, ErrorCode, ErrorReason, EstimateNativeFeeError, type EstimateNativeFeeErrorDetails, EstimateNativeFeeOptions, EthereumChainIds, EvmChainId, EvmDispatch, EvmServiceInitializer, EvmSign, EvmSignBatch, EvmSignMessage, EvmSignTypedData, EvmSigner, EvmSignerWithMessage, EvmTransactionRequest, EvmTypedData, FEE_RATE_TIER_TO_BITCOIN, FailedTransfer, FeeRateTier, Fetch, type FrequencyValidationResult, GasSettings, type GetAtomicUtxosCallback, GetBridgeableAssetsProps, GetBridgeableAssetsResult, type GetCoreEthAddressCallback, GetMinimumTransferAmountProps, GetSupportedChainsResult, type GetUtxosCallback, type GetWalletAddressesForChainAliasCallback, type GetWalletChangeAddressForChainAliasCallback, Hex, HttpError, HyperliquidChainIds, InsufficientFundsError, InvalidParamsError, type ListRecurringOrdersParams, type ListRecurringOrdersResponse, LombardServiceInitializer, type MarkrService, MarkrServiceInitializer, Mutable, MutableGetSupportedChainsResult, NATIVE_AVAX, NATIVE_ETH, NATIVE_SOL_ADDRESS, NativeAsset, NativeFeeEstimate, Quote, QuoteFee, QuoteFeeFundingModel, QuoteFeeToken, QuoteFeeType, QuoteFees, QuoterDonePayload, QuoterDonePayloadNoEligibleServices, QuoterDonePayloadNoQuotes, QuoterDonePayloadUnsubscribed, QuoterDoneReason, QuoterEventArgs, QuoterEventHandler, QuoterInterface, QuoterProps, QuotesTuple, RECURRING_FREQUENCY_UNITS, RECURRING_FREQUENCY_VALUE_MAX, RECURRING_UNLIMITED_ORDERS_SENTINEL, type RecurringChainInfoEntry, type RecurringChainInfoMap, type RecurringEligibility, RecurringEligibilityReason, type RecurringExecuteFirstFillParams, type RecurringExecuteOrderActionParams, type RecurringExecuteResult, type RecurringFrequency, type RecurringFrequencyUnit, type RecurringNamespace, type RecurringNamespaceCheckEligibilityParams, type RecurringNamespaceQuoteParams, type RecurringOrder, type RecurringOrderFailure, RecurringOrderStatus, type RecurringQuoteFee, type RecurringQuoteFeeType, type RecurringQuoteParams, type RecurringQuoteResponse, type RecurringSwapParams, RefundedTransfer, ResponseValidationError, SOLANA_DEVNET_CHAIN, SOLANA_MAINNET_CHAIN, SdkError, ServiceInitializationError, ServiceInitializer, ServiceQuoteEventArgs, ServiceQuoteEventHandler, ServiceQuoteOptions, 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, calculatePriceImpactFromQuote, createTransferManager, dedupeBridgeableAssets, deriveIntervalSeconds, eip155ChainIdToCaip2, isAbortedError, isCaip2ChainId, isEnvironment, isErc20Asset, isEstimateNativeFeeError, isEvmBridgeInitializer, isHttpError, isInsufficientFundsError, isInvalidParamsError, isLombardServiceInitializer, isMarkrServiceInitializer, isNativeAsset, isResponseValidationError, isSdkError, isServiceInitializationError, isServiceInitializer, isServiceUnavailableError, isSplAsset, isTimeoutError, parseTransfer, splitCaip2ChainId, stringifyTransfer, validateFrequency };
package/dist/mod.d.ts CHANGED
@@ -12,6 +12,7 @@ import { CompletedTransfer, FailedTransfer, RefundedTransfer, SourceCompletedTra
12
12
  import { SolanaSendOptions, SolanaTransactionParams } from "./utils/solana-transaction.js";
13
13
  import { BtcDispatch, BtcSign, BtcSigner, BtcTransactionRequest, EvmDispatch, EvmSign, EvmSignBatch, EvmSignMessage, EvmSignTypedData, EvmSigner, EvmSignerWithMessage, EvmTransactionRequest, EvmTypedData, Hex, SolanaSign, SolanaSigner } from "./types/signer.js";
14
14
  import { AssetSearchQuery, AvalancheCctInitializer, AvalancheSendTxFunction, AvalancheSendTxParams, EstimateNativeFeeOptions, EvmServiceInitializer, GasSettings, GetBridgeableAssetsProps, GetBridgeableAssetsResult, GetMinimumTransferAmountProps, GetSupportedChainsResult, LombardServiceInitializer, MarkrServiceInitializer, MutableGetSupportedChainsResult, NativeFeeEstimate, ServiceInitializer, ServiceQuoteOptions, TrackTransferProps, TransferAssetProps, TransferService } from "./types/service.js";
15
+ import { CheckRecurringEligibilityParams, ListRecurringOrdersParams, ListRecurringOrdersResponse, RECURRING_FREQUENCY_UNITS, RECURRING_UNLIMITED_ORDERS_SENTINEL, RecurringChainInfoEntry, RecurringChainInfoMap, RecurringEligibility, RecurringEligibilityReason, RecurringExecuteFirstFillParams, RecurringExecuteOrderActionParams, RecurringExecuteResult, RecurringFrequency, RecurringFrequencyUnit, RecurringNamespace, RecurringNamespaceCheckEligibilityParams, RecurringNamespaceQuoteParams, RecurringOrder, RecurringOrderFailure, RecurringOrderStatus, RecurringQuoteFee, RecurringQuoteFeeType, RecurringQuoteParams, RecurringQuoteResponse, RecurringSwapParams } from "./transfer-service/markr/recurring/types.js";
15
16
  import { AssetBridgeMap, CreateTransferManagerOptions, ServiceStatus, ServiceStatusBaseRecord, ServiceStatusErrorRecord, ServiceStatusInitializedRecord, ServiceStatusRecord, ServiceStatusUnsupportedEnvironmentRecord, TransferManager, TransferManagerStatus, TransferManagerStatusServicesRecord } from "./types/transfer-manager.js";
16
17
  import { isEnvironment, isErc20Asset, isEvmBridgeInitializer, isLombardServiceInitializer, isMarkrServiceInitializer, isNativeAsset, isServiceInitializer, isSplAsset } from "./type-guards.js";
17
18
  import { createTransferManager } from "./transfer-manager.js";
@@ -19,4 +20,7 @@ import { caip2ToEip155ChainId, caip2ToEip155HexChainId, eip155ChainIdToCaip2, is
19
20
  import { dedupeBridgeableAssets } from "./utils/bridgeable-assets.js";
20
21
  import { calculatePriceImpactFromQuote } from "./utils/price-impact.js";
21
22
  import { parseTransfer, stringifyTransfer } from "./utils/transfer-utils.js";
22
- export { AVALANCHE_CAIP2_TO_BLOCKCHAIN_ID_BY_NETWORK, AVALANCHE_FUJI_CHAIN, AVALANCHE_FUJI_P_CHAIN, AVALANCHE_FUJI_X_CHAIN, AVALANCHE_MAINNET_CHAIN, AVALANCHE_MAINNET_P_CHAIN, AVALANCHE_MAINNET_X_CHAIN, AbortedError, ArrayElement, Asset, AssetBridgeMap, AssetSearchQuery, AssetWithExtras, AvalancheBlockchainAlias, AvalancheCctInitializer, AvalancheChainIds, AvalancheFujiBlockchainChainIds, AvalancheFujiBlockchainIds, AvalancheMainnetBlockchainChainIds, AvalancheMainnetBlockchainIds, AvalancheSendTxFunction, AvalancheSendTxParams, BITCOIN_MAINNET_CHAIN, BITCOIN_TESTNET_CHAIN, BTC_SERVICE_TYPES, BitcoinChainIds, BitcoinFeeRateTier, BitcoinFunctions, BitcoinInputUTXO, BitcoinInputUTXOWithOptionalScript, BitcoinOutputUTXO, BitcoinTx, Blockchain, Brand, BridgeableAsset, 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, EstimateNativeFeeError, type EstimateNativeFeeErrorDetails, EstimateNativeFeeOptions, EthereumChainIds, EvmChainId, EvmDispatch, EvmServiceInitializer, EvmSign, EvmSignBatch, EvmSignMessage, EvmSignTypedData, EvmSigner, EvmSignerWithMessage, EvmTransactionRequest, EvmTypedData, FEE_RATE_TIER_TO_BITCOIN, FailedTransfer, FeeRateTier, Fetch, GasSettings, type GetAtomicUtxosCallback, GetBridgeableAssetsProps, GetBridgeableAssetsResult, type GetCoreEthAddressCallback, GetMinimumTransferAmountProps, GetSupportedChainsResult, type GetUtxosCallback, type GetWalletAddressesForChainAliasCallback, type GetWalletChangeAddressForChainAliasCallback, Hex, HttpError, HyperliquidChainIds, InsufficientFundsError, InvalidParamsError, LombardServiceInitializer, MarkrServiceInitializer, Mutable, MutableGetSupportedChainsResult, NATIVE_AVAX, NATIVE_ETH, NATIVE_SOL_ADDRESS, NativeAsset, NativeFeeEstimate, Quote, QuoteFee, QuoteFeeFundingModel, QuoteFeeToken, QuoteFeeType, QuoteFees, QuoterDonePayload, QuoterDonePayloadNoEligibleServices, QuoterDonePayloadNoQuotes, QuoterDonePayloadUnsubscribed, QuoterDoneReason, QuoterEventArgs, QuoterEventHandler, QuoterInterface, QuoterProps, QuotesTuple, RefundedTransfer, ResponseValidationError, SOLANA_DEVNET_CHAIN, SOLANA_MAINNET_CHAIN, SdkError, ServiceInitializationError, ServiceInitializer, ServiceQuoteEventArgs, ServiceQuoteEventHandler, ServiceQuoteOptions, 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, calculatePriceImpactFromQuote, createTransferManager, dedupeBridgeableAssets, eip155ChainIdToCaip2, isAbortedError, isCaip2ChainId, isEnvironment, isErc20Asset, isEstimateNativeFeeError, isEvmBridgeInitializer, isHttpError, isInsufficientFundsError, isInvalidParamsError, isLombardServiceInitializer, isMarkrServiceInitializer, isNativeAsset, isResponseValidationError, isSdkError, isServiceInitializationError, isServiceInitializer, isServiceUnavailableError, isSplAsset, isTimeoutError, parseTransfer, splitCaip2ChainId, stringifyTransfer };
23
+ import { MarkrService } from "./transfer-service/markr/markr-service.js";
24
+ import { FrequencyValidationResult, RECURRING_FREQUENCY_VALUE_MAX, deriveIntervalSeconds, validateFrequency } from "./transfer-service/markr/recurring/_frequency.js";
25
+ import { ApprovalRevertedError } from "./transfer-service/_evm-approval.js";
26
+ export { AVALANCHE_CAIP2_TO_BLOCKCHAIN_ID_BY_NETWORK, AVALANCHE_FUJI_CHAIN, AVALANCHE_FUJI_P_CHAIN, AVALANCHE_FUJI_X_CHAIN, AVALANCHE_MAINNET_CHAIN, AVALANCHE_MAINNET_P_CHAIN, AVALANCHE_MAINNET_X_CHAIN, AbortedError, ApprovalRevertedError, ArrayElement, Asset, AssetBridgeMap, AssetSearchQuery, AssetWithExtras, AvalancheBlockchainAlias, AvalancheCctInitializer, AvalancheChainIds, AvalancheFujiBlockchainChainIds, AvalancheFujiBlockchainIds, AvalancheMainnetBlockchainChainIds, AvalancheMainnetBlockchainIds, AvalancheSendTxFunction, AvalancheSendTxParams, BITCOIN_MAINNET_CHAIN, BITCOIN_TESTNET_CHAIN, BTC_SERVICE_TYPES, BitcoinChainIds, BitcoinFeeRateTier, BitcoinFunctions, BitcoinInputUTXO, BitcoinInputUTXOWithOptionalScript, BitcoinOutputUTXO, BitcoinTx, Blockchain, Brand, BridgeableAsset, BridgeableUiAsset, BtcDispatch, BtcSign, BtcSigner, BtcTransactionRequest, Caip10AccountId, Caip2ChainId, Chain, ChainAssetMap, type CheckRecurringEligibilityParams, CompletedTransfer, CreateTransferManagerOptions, DeepMutable, DestinationInfo, ERC_ZERO_ADDRESS, ETHEREUM_MAINNET_CHAIN, ETHEREUM_SEPOLIA_CHAIN, EVM_SERVICE_TYPES, Environment, Erc20Asset, ErrorCode, ErrorReason, EstimateNativeFeeError, type EstimateNativeFeeErrorDetails, EstimateNativeFeeOptions, EthereumChainIds, EvmChainId, EvmDispatch, EvmServiceInitializer, EvmSign, EvmSignBatch, EvmSignMessage, EvmSignTypedData, EvmSigner, EvmSignerWithMessage, EvmTransactionRequest, EvmTypedData, FEE_RATE_TIER_TO_BITCOIN, FailedTransfer, FeeRateTier, Fetch, type FrequencyValidationResult, GasSettings, type GetAtomicUtxosCallback, GetBridgeableAssetsProps, GetBridgeableAssetsResult, type GetCoreEthAddressCallback, GetMinimumTransferAmountProps, GetSupportedChainsResult, type GetUtxosCallback, type GetWalletAddressesForChainAliasCallback, type GetWalletChangeAddressForChainAliasCallback, Hex, HttpError, HyperliquidChainIds, InsufficientFundsError, InvalidParamsError, type ListRecurringOrdersParams, type ListRecurringOrdersResponse, LombardServiceInitializer, type MarkrService, MarkrServiceInitializer, Mutable, MutableGetSupportedChainsResult, NATIVE_AVAX, NATIVE_ETH, NATIVE_SOL_ADDRESS, NativeAsset, NativeFeeEstimate, Quote, QuoteFee, QuoteFeeFundingModel, QuoteFeeToken, QuoteFeeType, QuoteFees, QuoterDonePayload, QuoterDonePayloadNoEligibleServices, QuoterDonePayloadNoQuotes, QuoterDonePayloadUnsubscribed, QuoterDoneReason, QuoterEventArgs, QuoterEventHandler, QuoterInterface, QuoterProps, QuotesTuple, RECURRING_FREQUENCY_UNITS, RECURRING_FREQUENCY_VALUE_MAX, RECURRING_UNLIMITED_ORDERS_SENTINEL, type RecurringChainInfoEntry, type RecurringChainInfoMap, type RecurringEligibility, RecurringEligibilityReason, type RecurringExecuteFirstFillParams, type RecurringExecuteOrderActionParams, type RecurringExecuteResult, type RecurringFrequency, type RecurringFrequencyUnit, type RecurringNamespace, type RecurringNamespaceCheckEligibilityParams, type RecurringNamespaceQuoteParams, type RecurringOrder, type RecurringOrderFailure, RecurringOrderStatus, type RecurringQuoteFee, type RecurringQuoteFeeType, type RecurringQuoteParams, type RecurringQuoteResponse, type RecurringSwapParams, RefundedTransfer, ResponseValidationError, SOLANA_DEVNET_CHAIN, SOLANA_MAINNET_CHAIN, SdkError, ServiceInitializationError, ServiceInitializer, ServiceQuoteEventArgs, ServiceQuoteEventHandler, ServiceQuoteOptions, 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, calculatePriceImpactFromQuote, createTransferManager, dedupeBridgeableAssets, deriveIntervalSeconds, eip155ChainIdToCaip2, isAbortedError, isCaip2ChainId, isEnvironment, isErc20Asset, isEstimateNativeFeeError, isEvmBridgeInitializer, isHttpError, isInsufficientFundsError, isInvalidParamsError, isLombardServiceInitializer, isMarkrServiceInitializer, isNativeAsset, isResponseValidationError, isSdkError, isServiceInitializationError, isServiceInitializer, isServiceUnavailableError, isSplAsset, isTimeoutError, parseTransfer, splitCaip2ChainId, stringifyTransfer, validateFrequency };
package/dist/mod.js CHANGED
@@ -1 +1 @@
1
- import{AVALANCHE_CAIP2_TO_BLOCKCHAIN_ID_BY_NETWORK as e,AVALANCHE_FUJI_CHAIN as t,AVALANCHE_FUJI_P_CHAIN as n,AVALANCHE_FUJI_X_CHAIN as r,AVALANCHE_MAINNET_CHAIN as i,AVALANCHE_MAINNET_P_CHAIN as a,AVALANCHE_MAINNET_X_CHAIN as o,AvalancheChainIds as s,AvalancheFujiBlockchainChainIds as c,AvalancheFujiBlockchainIds as l,AvalancheMainnetBlockchainChainIds as u,AvalancheMainnetBlockchainIds as d,BITCOIN_MAINNET_CHAIN as f,BITCOIN_TESTNET_CHAIN as p,BTC_SERVICE_TYPES as m,BitcoinChainIds as h,Blockchain as g,ERC_ZERO_ADDRESS as _,ETHEREUM_MAINNET_CHAIN as v,ETHEREUM_SEPOLIA_CHAIN as y,EVM_SERVICE_TYPES as b,Environment as x,EthereumChainIds as S,EvmChainId as C,FEE_RATE_TIER_TO_BITCOIN as w,HyperliquidChainIds as T,NATIVE_AVAX as E,NATIVE_ETH as D,NATIVE_SOL_ADDRESS as O,SOLANA_DEVNET_CHAIN as k,SOLANA_MAINNET_CHAIN as A,ServiceType as j,SolanaChainIds as M,TokenType as N,TransferSignatureReason as P}from"./constants.js";import{AbortedError as F,ErrorCode as I,ErrorReason as L,EstimateNativeFeeError as R,HttpError as z,InsufficientFundsError as B,InvalidParamsError as V,ResponseValidationError as H,SdkError as U,ServiceInitializationError as W,ServiceUnavailableError as G,TimeoutError as K,isAbortedError as q,isEstimateNativeFeeError as J,isHttpError as Y,isInsufficientFundsError as X,isInvalidParamsError as Z,isResponseValidationError as Q,isSdkError as $,isServiceInitializationError as ee,isServiceUnavailableError as te,isTimeoutError as ne}from"./errors.js";import{isEnvironment as re,isErc20Asset as ie,isEvmBridgeInitializer as ae,isLombardServiceInitializer as oe,isMarkrServiceInitializer as se,isNativeAsset as ce,isServiceInitializer as le,isSplAsset as ue}from"./type-guards.js";import{createTransferManager as de}from"./transfer-manager.js";import{caip2ToEip155ChainId as fe,caip2ToEip155HexChainId as pe,eip155ChainIdToCaip2 as me,isCaip2ChainId as he,splitCaip2ChainId as ge}from"./utils/caip.js";import{dedupeBridgeableAssets as _e}from"./utils/bridgeable-assets.js";import{calculatePriceImpactFromQuote as ve}from"./utils/price-impact.js";import{parseTransfer as ye,stringifyTransfer as be}from"./utils/transfer-utils.js";export{e as AVALANCHE_CAIP2_TO_BLOCKCHAIN_ID_BY_NETWORK,t as AVALANCHE_FUJI_CHAIN,n as AVALANCHE_FUJI_P_CHAIN,r as AVALANCHE_FUJI_X_CHAIN,i as AVALANCHE_MAINNET_CHAIN,a as AVALANCHE_MAINNET_P_CHAIN,o as AVALANCHE_MAINNET_X_CHAIN,F as AbortedError,s as AvalancheChainIds,c as AvalancheFujiBlockchainChainIds,l as AvalancheFujiBlockchainIds,u as AvalancheMainnetBlockchainChainIds,d as AvalancheMainnetBlockchainIds,f as BITCOIN_MAINNET_CHAIN,p as BITCOIN_TESTNET_CHAIN,m as BTC_SERVICE_TYPES,h as BitcoinChainIds,g as Blockchain,_ as ERC_ZERO_ADDRESS,v as ETHEREUM_MAINNET_CHAIN,y as ETHEREUM_SEPOLIA_CHAIN,b as EVM_SERVICE_TYPES,x as Environment,I as ErrorCode,L as ErrorReason,R as EstimateNativeFeeError,S as EthereumChainIds,C as EvmChainId,w as FEE_RATE_TIER_TO_BITCOIN,z as HttpError,T as HyperliquidChainIds,B as InsufficientFundsError,V as InvalidParamsError,E as NATIVE_AVAX,D as NATIVE_ETH,O as NATIVE_SOL_ADDRESS,H as ResponseValidationError,k as SOLANA_DEVNET_CHAIN,A as SOLANA_MAINNET_CHAIN,U as SdkError,W as ServiceInitializationError,j as ServiceType,G as ServiceUnavailableError,M as SolanaChainIds,K as TimeoutError,N as TokenType,P as TransferSignatureReason,fe as caip2ToEip155ChainId,pe as caip2ToEip155HexChainId,ve as calculatePriceImpactFromQuote,de as createTransferManager,_e as dedupeBridgeableAssets,me as eip155ChainIdToCaip2,q as isAbortedError,he as isCaip2ChainId,re as isEnvironment,ie as isErc20Asset,J as isEstimateNativeFeeError,ae as isEvmBridgeInitializer,Y as isHttpError,X as isInsufficientFundsError,Z as isInvalidParamsError,oe as isLombardServiceInitializer,se as isMarkrServiceInitializer,ce as isNativeAsset,Q as isResponseValidationError,$ as isSdkError,ee as isServiceInitializationError,le as isServiceInitializer,te as isServiceUnavailableError,ue as isSplAsset,ne as isTimeoutError,ye as parseTransfer,ge as splitCaip2ChainId,be as stringifyTransfer};
1
+ import{AVALANCHE_CAIP2_TO_BLOCKCHAIN_ID_BY_NETWORK as e,AVALANCHE_FUJI_CHAIN as t,AVALANCHE_FUJI_P_CHAIN as n,AVALANCHE_FUJI_X_CHAIN as r,AVALANCHE_MAINNET_CHAIN as i,AVALANCHE_MAINNET_P_CHAIN as a,AVALANCHE_MAINNET_X_CHAIN as o,AvalancheChainIds as s,AvalancheFujiBlockchainChainIds as c,AvalancheFujiBlockchainIds as l,AvalancheMainnetBlockchainChainIds as u,AvalancheMainnetBlockchainIds as d,BITCOIN_MAINNET_CHAIN as f,BITCOIN_TESTNET_CHAIN as p,BTC_SERVICE_TYPES as m,BitcoinChainIds as h,Blockchain as g,ERC_ZERO_ADDRESS as _,ETHEREUM_MAINNET_CHAIN as v,ETHEREUM_SEPOLIA_CHAIN as y,EVM_SERVICE_TYPES as b,Environment as x,EthereumChainIds as S,EvmChainId as C,FEE_RATE_TIER_TO_BITCOIN as w,HyperliquidChainIds as T,NATIVE_AVAX as E,NATIVE_ETH as D,NATIVE_SOL_ADDRESS as O,SOLANA_DEVNET_CHAIN as k,SOLANA_MAINNET_CHAIN as A,ServiceType as j,SolanaChainIds as M,TokenType as N,TransferSignatureReason as P}from"./constants.js";import{AbortedError as F,ErrorCode as I,ErrorReason as L,EstimateNativeFeeError as R,HttpError as z,InsufficientFundsError as B,InvalidParamsError as V,ResponseValidationError as H,SdkError as U,ServiceInitializationError as W,ServiceUnavailableError as G,TimeoutError as K,isAbortedError as q,isEstimateNativeFeeError as J,isHttpError as Y,isInsufficientFundsError as X,isInvalidParamsError as Z,isResponseValidationError as Q,isSdkError as $,isServiceInitializationError as ee,isServiceUnavailableError as te,isTimeoutError as ne}from"./errors.js";import{isEnvironment as re,isErc20Asset as ie,isEvmBridgeInitializer as ae,isLombardServiceInitializer as oe,isMarkrServiceInitializer as se,isNativeAsset as ce,isServiceInitializer as le,isSplAsset as ue}from"./type-guards.js";import{createTransferManager as de}from"./transfer-manager.js";import{caip2ToEip155ChainId as fe,caip2ToEip155HexChainId as pe,eip155ChainIdToCaip2 as me,isCaip2ChainId as he,splitCaip2ChainId as ge}from"./utils/caip.js";import{dedupeBridgeableAssets as _e}from"./utils/bridgeable-assets.js";import{calculatePriceImpactFromQuote as ve}from"./utils/price-impact.js";import{parseTransfer as ye,stringifyTransfer as be}from"./utils/transfer-utils.js";import{RECURRING_FREQUENCY_UNITS as xe,RECURRING_UNLIMITED_ORDERS_SENTINEL as Se,RecurringEligibilityReason as Ce,RecurringOrderStatus as we}from"./transfer-service/markr/recurring/types.js";import{RECURRING_FREQUENCY_VALUE_MAX as Te,deriveIntervalSeconds as Ee,validateFrequency as De}from"./transfer-service/markr/recurring/_frequency.js";import{ApprovalRevertedError as Oe}from"./transfer-service/_evm-approval.js";export{e as AVALANCHE_CAIP2_TO_BLOCKCHAIN_ID_BY_NETWORK,t as AVALANCHE_FUJI_CHAIN,n as AVALANCHE_FUJI_P_CHAIN,r as AVALANCHE_FUJI_X_CHAIN,i as AVALANCHE_MAINNET_CHAIN,a as AVALANCHE_MAINNET_P_CHAIN,o as AVALANCHE_MAINNET_X_CHAIN,F as AbortedError,Oe as ApprovalRevertedError,s as AvalancheChainIds,c as AvalancheFujiBlockchainChainIds,l as AvalancheFujiBlockchainIds,u as AvalancheMainnetBlockchainChainIds,d as AvalancheMainnetBlockchainIds,f as BITCOIN_MAINNET_CHAIN,p as BITCOIN_TESTNET_CHAIN,m as BTC_SERVICE_TYPES,h as BitcoinChainIds,g as Blockchain,_ as ERC_ZERO_ADDRESS,v as ETHEREUM_MAINNET_CHAIN,y as ETHEREUM_SEPOLIA_CHAIN,b as EVM_SERVICE_TYPES,x as Environment,I as ErrorCode,L as ErrorReason,R as EstimateNativeFeeError,S as EthereumChainIds,C as EvmChainId,w as FEE_RATE_TIER_TO_BITCOIN,z as HttpError,T as HyperliquidChainIds,B as InsufficientFundsError,V as InvalidParamsError,E as NATIVE_AVAX,D as NATIVE_ETH,O as NATIVE_SOL_ADDRESS,xe as RECURRING_FREQUENCY_UNITS,Te as RECURRING_FREQUENCY_VALUE_MAX,Se as RECURRING_UNLIMITED_ORDERS_SENTINEL,Ce as RecurringEligibilityReason,we as RecurringOrderStatus,H as ResponseValidationError,k as SOLANA_DEVNET_CHAIN,A as SOLANA_MAINNET_CHAIN,U as SdkError,W as ServiceInitializationError,j as ServiceType,G as ServiceUnavailableError,M as SolanaChainIds,K as TimeoutError,N as TokenType,P as TransferSignatureReason,fe as caip2ToEip155ChainId,pe as caip2ToEip155HexChainId,ve as calculatePriceImpactFromQuote,de as createTransferManager,_e as dedupeBridgeableAssets,Ee as deriveIntervalSeconds,me as eip155ChainIdToCaip2,q as isAbortedError,he as isCaip2ChainId,re as isEnvironment,ie as isErc20Asset,J as isEstimateNativeFeeError,ae as isEvmBridgeInitializer,Y as isHttpError,X as isInsufficientFundsError,Z as isInvalidParamsError,oe as isLombardServiceInitializer,se as isMarkrServiceInitializer,ce as isNativeAsset,Q as isResponseValidationError,$ as isSdkError,ee as isServiceInitializationError,le as isServiceInitializer,te as isServiceUnavailableError,ue as isSplAsset,ne as isTimeoutError,ye as parseTransfer,ge as splitCaip2ChainId,be as stringifyTransfer,De as validateFrequency};
@@ -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=e=>{if(!n.isEnvironment(e))throw new t.ServiceInitializationError(t.ErrorReason.ENVIRONMENT_NOT_SUPPORTED)},a=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)}},o=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_CCT:if(!(n===e.Environment.PROD||n===e.Environment.TEST)){o[e.ServiceType.AVALANCHE_CCT]={status:`unsupported-environment`,message:`Service type "${e.ServiceType.AVALANCHE_CCT}" is only supported in production or test environment.`};break}await c(e.ServiceType.AVALANCHE_CCT,async()=>{let{createAvalancheCctService:e}=await Promise.resolve().then(()=>require(`./transfer-service/avalanche-cct/avalanche-cct-service.cjs`));return await e({avalancheSendTx:s.avalancheSendTx,environment:n,fetch:i,getCoreEthAddress:s.getCoreEthAddress,getAtomicUtxos:s.getAtomicUtxos,getUtxos:s.getUtxos,getWalletAddressesForChainAlias:s.getWalletAddressesForChainAlias,getWalletChangeAddressForChainAlias:s.getWalletChangeAddressForChainAlias})});break;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}}},s=async({environment:n,fetch:s,serviceInitializers:c})=>{i(n),a(c);let{services:l,status:u}=await o({environment:n,serviceInitializers:c,fetch:s});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:n,sourceChainId:r,targetChainId:i,limit:a,search:o,page:s})=>{if(a!==void 0&&(!Number.isInteger(a)||a<=0))throw new t.InvalidParamsError(t.ErrorReason.INVALID_PARAMS,`Invalid "limit" provided: ${String(a)}. Expected a positive integer.`);if(s!==void 0&&(!Number.isInteger(s)||s<=0))throw new t.InvalidParamsError(t.ErrorReason.INVALID_PARAMS,`Invalid "page" provided: ${String(s)}. Expected a positive integer.`);let c=a??100,u=s??1,d=Array.from(l.values()),f=d.filter(t=>t.type!==e.ServiceType.MARKR).sort((e,t)=>e.type.localeCompare(t.type)),p=[...d.filter(t=>t.type===e.ServiceType.MARKR),...f],m=await Promise.all(p.map(async e=>{try{return{status:`fulfilled`,result:await e.getBridgeableAssets({sourceAsset:n,sourceChainId:r,targetChainId:i,limit:c,search:o,page:u})}}catch{return{status:`rejected`}}})),h=[],g=!1;for(let e of m)e.status===`fulfilled`&&(h.push(...e.result.assets),g||=e.result.meta.hasMore);return{assets:h,meta:{currentPage:u,hasMore:g,...g?{nextPage:u+1}:{}}}},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,n=await Promise.allSettled(Array.from(l.values()).map(e=>e.getSupportedChains())),r=n.filter(e=>e.status===`fulfilled`),i=n.filter(e=>e.status===`rejected`);if(n.length>0&&r.length===0){let e=i.map(e=>e.reason instanceof Error?e.reason.message:String(e.reason)).join(`; `);throw new t.ServiceUnavailableError(t.ErrorReason.UNKNOWN,`Failed to fetch supported chains from all configured services. ${e}`)}for(let t of r){let n=t.value;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=s;
1
+ const e=require(`./constants.cjs`),t=require(`./errors.cjs`),n=require(`./type-guards.cjs`),r=require(`./quoter/quoter.cjs`),i=n=>{let r=()=>{let r=n.get(e.ServiceType.MARKR);if(!r||!(`recurring`in r))throw new t.ServiceUnavailableError(t.ErrorReason.SERVICE_TYPE_NOT_CONFIGURED,`Recurring swaps require the Markr service, which was not initialized.`);return r};return{quote:async e=>r().recurring.quote(e),executeFirstFill:async e=>r().recurring.executeFirstFill(e),listOrders:async e=>r().recurring.listOrders(e),executeCancellation:async e=>r().recurring.executeCancellation(e),executePause:async e=>r().recurring.executePause(e),executeUnpause:async e=>r().recurring.executeUnpause(e),checkEligibility:e=>r().recurring.checkEligibility(e),getRecurringChainInfo:()=>r().recurring.getRecurringChainInfo()}},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_CCT:if(!(n===e.Environment.PROD||n===e.Environment.TEST)){o[e.ServiceType.AVALANCHE_CCT]={status:`unsupported-environment`,message:`Service type "${e.ServiceType.AVALANCHE_CCT}" is only supported in production or test environment.`};break}await c(e.ServiceType.AVALANCHE_CCT,async()=>{let{createAvalancheCctService:e}=await Promise.resolve().then(()=>require(`./transfer-service/avalanche-cct/avalanche-cct-service.cjs`));return await e({avalancheSendTx:s.avalancheSendTx,environment:n,fetch:i,getCoreEthAddress:s.getCoreEthAddress,getAtomicUtxos:s.getAtomicUtxos,getUtxos:s.getUtxos,getWalletAddressesForChainAlias:s.getWalletAddressesForChainAlias,getWalletChangeAddressForChainAlias:s.getWalletChangeAddressForChainAlias})});break;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:n,fetch:c,serviceInitializers:l})=>{a(n),o(l);let{services:u,status:d}=await s({environment:n,serviceInitializers:l,fetch:c});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=u.get(e.serviceType);if(!i)throw new t.ServiceUnavailableError(t.ErrorReason.SERVICE_TYPE_NOT_CONFIGURED);return await i.estimateNativeFee(e,n)},getBridgeableAssets:async({sourceAsset:n,sourceChainId:r,targetChainId:i,limit:a,search:o,page:s})=>{if(a!==void 0&&(!Number.isInteger(a)||a<=0))throw new t.InvalidParamsError(t.ErrorReason.INVALID_PARAMS,`Invalid "limit" provided: ${String(a)}. Expected a positive integer.`);if(s!==void 0&&(!Number.isInteger(s)||s<=0))throw new t.InvalidParamsError(t.ErrorReason.INVALID_PARAMS,`Invalid "page" provided: ${String(s)}. Expected a positive integer.`);let c=a??100,l=s??1,d=Array.from(u.values()),f=d.filter(t=>t.type!==e.ServiceType.MARKR).sort((e,t)=>e.type.localeCompare(t.type)),p=[...d.filter(t=>t.type===e.ServiceType.MARKR),...f],m=await Promise.all(p.map(async e=>{try{return{status:`fulfilled`,result:await e.getBridgeableAssets({sourceAsset:n,sourceChainId:r,targetChainId:i,limit:c,search:o,page:l})}}catch{return{status:`rejected`}}})),h=[],g=!1;for(let e of m)e.status===`fulfilled`&&(h.push(...e.result.assets),g||=e.result.meta.hasMore);return{assets:h,meta:{currentPage:l,hasMore:g,...g?{nextPage:l+1}:{}}}},getMinimumTransferAmount:async e=>{let t={};for(let n of u.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,n=await Promise.allSettled(Array.from(u.values()).map(e=>e.getSupportedChains())),r=n.filter(e=>e.status===`fulfilled`),i=n.filter(e=>e.status===`rejected`);if(n.length>0&&r.length===0){let e=i.map(e=>e.reason instanceof Error?e.reason.message:String(e.reason)).join(`; `);throw new t.ServiceUnavailableError(t.ErrorReason.UNKNOWN,`Failed to fetch supported chains from all configured services. ${e}`)}for(let t of r){let n=t.value;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(u.values()),t),recurring:i(u),status:()=>d,trackTransfer:e=>{let{transfer:n}=e,r=u.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=u.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","InvalidParamsError","ServiceUnavailableError","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 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_CCT: {\n if (!(environment === Environment.PROD || environment === Environment.TEST)) {\n serviceStatuses[ServiceType.AVALANCHE_CCT] = {\n status: 'unsupported-environment',\n message: `Service type \"${ServiceType.AVALANCHE_CCT}\" is only supported in production or test environment.`,\n };\n break;\n }\n\n await initializeService(ServiceType.AVALANCHE_CCT, async () => {\n const { createAvalancheCctService } = await import('./transfer-service/avalanche-cct/avalanche-cct-service');\n\n return await createAvalancheCctService({\n avalancheSendTx: initializer.avalancheSendTx,\n environment,\n fetch: customFetch,\n getCoreEthAddress: initializer.getCoreEthAddress,\n getAtomicUtxos: initializer.getAtomicUtxos,\n getUtxos: initializer.getUtxos,\n getWalletAddressesForChainAlias: initializer.getWalletAddressesForChainAlias,\n getWalletChangeAddressForChainAlias: initializer.getWalletChangeAddressForChainAlias,\n });\n });\n\n break;\n }\n\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, limit, search, page }) => {\n if (limit !== undefined && (!Number.isInteger(limit) || limit <= 0)) {\n throw new InvalidParamsError(\n ErrorReason.INVALID_PARAMS,\n `Invalid \"limit\" provided: ${String(limit)}. Expected a positive integer.`,\n );\n }\n if (page !== undefined && (!Number.isInteger(page) || page <= 0)) {\n throw new InvalidParamsError(\n ErrorReason.INVALID_PARAMS,\n `Invalid \"page\" provided: ${String(page)}. Expected a positive integer.`,\n );\n }\n\n const pageLimit = limit ?? 100;\n const currentPage = page ?? 1;\n const configuredServices = Array.from(services.values());\n const nonMarkrServices = configuredServices\n .filter((service) => service.type !== ServiceType.MARKR)\n .sort((a, b) => a.type.localeCompare(b.type));\n const orderedServices = [\n ...configuredServices.filter((service) => service.type === ServiceType.MARKR),\n ...nonMarkrServices,\n ];\n\n const serviceResults = await Promise.all(\n orderedServices.map(async (service) => {\n try {\n const result = await service.getBridgeableAssets({\n sourceAsset,\n sourceChainId,\n targetChainId,\n limit: pageLimit,\n search,\n page: currentPage,\n });\n\n return { status: 'fulfilled' as const, result };\n } catch {\n return { status: 'rejected' as const };\n }\n }),\n );\n\n const combinedAssets: BridgeableUiAsset[] = [];\n let hasMore = false;\n\n for (const serviceResult of serviceResults) {\n if (serviceResult.status !== 'fulfilled') {\n continue;\n }\n\n combinedAssets.push(...serviceResult.result.assets);\n hasMore = hasMore || serviceResult.result.meta.hasMore;\n }\n\n return {\n assets: combinedAssets,\n meta: {\n currentPage,\n hasMore,\n ...(hasMore ? { nextPage: currentPage + 1 } : {}),\n },\n };\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 // Merge fulfilled results. If every call fails, throw so callers can distinguish\n // \"no supported chains\" from \"service outage/misconfiguration\".\n const settledResults = await Promise.allSettled(\n Array.from(services.values()).map((service) => service.getSupportedChains()),\n );\n\n const fulfilledResults = settledResults.filter((settled) => settled.status === 'fulfilled');\n const rejectedResults = settledResults.filter((settled) => settled.status === 'rejected');\n\n if (settledResults.length > 0 && fulfilledResults.length === 0) {\n const details = rejectedResults\n .map((result) => (result.reason instanceof Error ? result.reason.message : String(result.reason)))\n .join('; ');\n\n throw new ServiceUnavailableError(\n ErrorReason.UNKNOWN,\n `Failed to fetch supported chains from all configured services. ${details}`,\n );\n }\n\n // Merge results: union destination sets for identical source chain IDs.\n for (const settled of fulfilledResults) {\n const result = settled.value;\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
+ {"version":3,"file":"transfer-manager.cjs","names":["ServiceType","ServiceUnavailableError","ErrorReason","isEnvironment","ServiceInitializationError","isServiceInitializer","Environment","InvalidParamsError","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 type { Caip2ChainId } from './types/caip';\nimport type { Fetch } from './types/utility-types';\nimport type { MarkrService } from './transfer-service/markr/markr-service';\nimport type { RecurringNamespace } from './transfer-service/markr/recurring/types';\n\n/**\n * Builds the `TransferManager.recurring` capability surface by delegating\n * each call to whichever underlying service implements recurring (today:\n * Markr). The delegate captures the services map by reference so a future\n * call sees whatever is currently initialized.\n *\n * Throws `ServiceUnavailableError` from every method when no recurring-\n * capable service is registered — same failure shape as `transferAsset`,\n * `estimateNativeFee`, and `trackTransfer` when the relevant service is\n * absent.\n */\nconst createRecurringDelegate = (services: Map<ServiceType, TransferService>): RecurringNamespace => {\n const requireMarkrService = (): MarkrService => {\n const service = services.get(ServiceType.MARKR);\n // The `'recurring' in service` guard documents the invariant in code:\n // `initializeServices` registers a `MarkrService` (which extends\n // `TransferService` with `.recurring`) for `ServiceType.MARKR`. The check\n // also gives us a clear `ServiceUnavailableError` instead of a runtime\n // `Cannot read property 'X' of undefined` if a future refactor ever\n // registers a plain `TransferService` for the Markr slot.\n if (!service || !('recurring' in service)) {\n throw new ServiceUnavailableError(\n ErrorReason.SERVICE_TYPE_NOT_CONFIGURED,\n 'Recurring swaps require the Markr service, which was not initialized.',\n );\n }\n return service as MarkrService;\n };\n\n // `async` on the Promise-returning methods so a sync throw from\n // `requireMarkrService()` becomes a Promise rejection (consumers expect\n // `manager.recurring.quote(...)` to return a Promise, not to throw before\n // returning one). The sync methods (`checkEligibility`,\n // `getRecurringChainInfo`) keep their natural sync shape — sync throws\n // are the contract there.\n return {\n quote: async (props) => requireMarkrService().recurring.quote(props),\n executeFirstFill: async (props) => requireMarkrService().recurring.executeFirstFill(props),\n listOrders: async (props) => requireMarkrService().recurring.listOrders(props),\n executeCancellation: async (props) => requireMarkrService().recurring.executeCancellation(props),\n executePause: async (props) => requireMarkrService().recurring.executePause(props),\n executeUnpause: async (props) => requireMarkrService().recurring.executeUnpause(props),\n checkEligibility: (props) => requireMarkrService().recurring.checkEligibility(props),\n getRecurringChainInfo: () => requireMarkrService().recurring.getRecurringChainInfo(),\n };\n};\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_CCT: {\n if (!(environment === Environment.PROD || environment === Environment.TEST)) {\n serviceStatuses[ServiceType.AVALANCHE_CCT] = {\n status: 'unsupported-environment',\n message: `Service type \"${ServiceType.AVALANCHE_CCT}\" is only supported in production or test environment.`,\n };\n break;\n }\n\n await initializeService(ServiceType.AVALANCHE_CCT, async () => {\n const { createAvalancheCctService } = await import('./transfer-service/avalanche-cct/avalanche-cct-service');\n\n return await createAvalancheCctService({\n avalancheSendTx: initializer.avalancheSendTx,\n environment,\n fetch: customFetch,\n getCoreEthAddress: initializer.getCoreEthAddress,\n getAtomicUtxos: initializer.getAtomicUtxos,\n getUtxos: initializer.getUtxos,\n getWalletAddressesForChainAlias: initializer.getWalletAddressesForChainAlias,\n getWalletChangeAddressForChainAlias: initializer.getWalletChangeAddressForChainAlias,\n });\n });\n\n break;\n }\n\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, limit, search, page }) => {\n if (limit !== undefined && (!Number.isInteger(limit) || limit <= 0)) {\n throw new InvalidParamsError(\n ErrorReason.INVALID_PARAMS,\n `Invalid \"limit\" provided: ${String(limit)}. Expected a positive integer.`,\n );\n }\n if (page !== undefined && (!Number.isInteger(page) || page <= 0)) {\n throw new InvalidParamsError(\n ErrorReason.INVALID_PARAMS,\n `Invalid \"page\" provided: ${String(page)}. Expected a positive integer.`,\n );\n }\n\n const pageLimit = limit ?? 100;\n const currentPage = page ?? 1;\n const configuredServices = Array.from(services.values());\n const nonMarkrServices = configuredServices\n .filter((service) => service.type !== ServiceType.MARKR)\n .sort((a, b) => a.type.localeCompare(b.type));\n const orderedServices = [\n ...configuredServices.filter((service) => service.type === ServiceType.MARKR),\n ...nonMarkrServices,\n ];\n\n const serviceResults = await Promise.all(\n orderedServices.map(async (service) => {\n try {\n const result = await service.getBridgeableAssets({\n sourceAsset,\n sourceChainId,\n targetChainId,\n limit: pageLimit,\n search,\n page: currentPage,\n });\n\n return { status: 'fulfilled' as const, result };\n } catch {\n return { status: 'rejected' as const };\n }\n }),\n );\n\n const combinedAssets: BridgeableUiAsset[] = [];\n let hasMore = false;\n\n for (const serviceResult of serviceResults) {\n if (serviceResult.status !== 'fulfilled') {\n continue;\n }\n\n combinedAssets.push(...serviceResult.result.assets);\n hasMore = hasMore || serviceResult.result.meta.hasMore;\n }\n\n return {\n assets: combinedAssets,\n meta: {\n currentPage,\n hasMore,\n ...(hasMore ? { nextPage: currentPage + 1 } : {}),\n },\n };\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 // Merge fulfilled results. If every call fails, throw so callers can distinguish\n // \"no supported chains\" from \"service outage/misconfiguration\".\n const settledResults = await Promise.allSettled(\n Array.from(services.values()).map((service) => service.getSupportedChains()),\n );\n\n const fulfilledResults = settledResults.filter((settled) => settled.status === 'fulfilled');\n const rejectedResults = settledResults.filter((settled) => settled.status === 'rejected');\n\n if (settledResults.length > 0 && fulfilledResults.length === 0) {\n const details = rejectedResults\n .map((result) => (result.reason instanceof Error ? result.reason.message : String(result.reason)))\n .join('; ');\n\n throw new ServiceUnavailableError(\n ErrorReason.UNKNOWN,\n `Failed to fetch supported chains from all configured services. ${details}`,\n );\n }\n\n // Merge results: union destination sets for identical source chain IDs.\n for (const settled of fulfilledResults) {\n const result = settled.value;\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 recurring: createRecurringDelegate(services),\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}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";const l=e=>{if(!o(e))throw new i(n.ENVIRONMENT_NOT_SUPPORTED)},u=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)}},d=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_CCT:if(!(r===e.PROD||r===e.TEST)){c[t.AVALANCHE_CCT]={status:`unsupported-environment`,message:`Service type "${t.AVALANCHE_CCT}" is only supported in production or test environment.`};break}await u(t.AVALANCHE_CCT,async()=>{let{createAvalancheCctService:e}=await import(`./transfer-service/avalanche-cct/avalanche-cct-service.js`);return await e({avalancheSendTx:l.avalancheSendTx,environment:r,fetch:o,getCoreEthAddress:l.getCoreEthAddress,getAtomicUtxos:l.getAtomicUtxos,getUtxos:l.getUtxos,getWalletAddressesForChainAlias:l.getWalletAddressesForChainAlias,getWalletChangeAddressForChainAlias:l.getWalletChangeAddressForChainAlias})});break;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}}},f=async({environment:e,fetch:i,serviceInitializers:o})=>{l(e),u(o);let{services:s,status:f}=await d({environment:e,serviceInitializers:o,fetch:i});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 o=s.get(e.serviceType);if(!o)throw new a(n.SERVICE_TYPE_NOT_CONFIGURED);return await o.estimateNativeFee(e,t)},getBridgeableAssets:async({sourceAsset:e,sourceChainId:i,targetChainId:a,limit:o,search:c,page:l})=>{if(o!==void 0&&(!Number.isInteger(o)||o<=0))throw new r(n.INVALID_PARAMS,`Invalid "limit" provided: ${String(o)}. Expected a positive integer.`);if(l!==void 0&&(!Number.isInteger(l)||l<=0))throw new r(n.INVALID_PARAMS,`Invalid "page" provided: ${String(l)}. Expected a positive integer.`);let u=o??100,d=l??1,f=Array.from(s.values()),p=f.filter(e=>e.type!==t.MARKR).sort((e,t)=>e.type.localeCompare(t.type)),m=[...f.filter(e=>e.type===t.MARKR),...p],h=await Promise.all(m.map(async t=>{try{return{status:`fulfilled`,result:await t.getBridgeableAssets({sourceAsset:e,sourceChainId:i,targetChainId:a,limit:u,search:c,page:d})}}catch{return{status:`rejected`}}})),g=[],_=!1;for(let e of h)e.status===`fulfilled`&&(g.push(...e.result.assets),_||=e.result.meta.hasMore);return{assets:g,meta:{currentPage:d,hasMore:_,..._?{nextPage:d+1}:{}}}},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.allSettled(Array.from(s.values()).map(e=>e.getSupportedChains())),r=t.filter(e=>e.status===`fulfilled`),i=t.filter(e=>e.status===`rejected`);if(t.length>0&&r.length===0){let e=i.map(e=>e.reason instanceof Error?e.reason.message:String(e.reason)).join(`; `);throw new a(n.UNKNOWN,`Failed to fetch supported chains from all configured services. ${e}`)}for(let t of r){let n=t.value;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(s.values()),t),status:()=>f,trackTransfer:e=>{let{transfer:t}=e,r=s.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=s.get(t.serviceType);if(!r)throw new a(n.SERVICE_TYPE_NOT_CONFIGURED);return await r.transferAsset(e)}}};export{f 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";const l=e=>{let r=()=>{let r=e.get(t.MARKR);if(!r||!(`recurring`in r))throw new a(n.SERVICE_TYPE_NOT_CONFIGURED,`Recurring swaps require the Markr service, which was not initialized.`);return r};return{quote:async e=>r().recurring.quote(e),executeFirstFill:async e=>r().recurring.executeFirstFill(e),listOrders:async e=>r().recurring.listOrders(e),executeCancellation:async e=>r().recurring.executeCancellation(e),executePause:async e=>r().recurring.executePause(e),executeUnpause:async e=>r().recurring.executeUnpause(e),checkEligibility:e=>r().recurring.checkEligibility(e),getRecurringChainInfo:()=>r().recurring.getRecurringChainInfo()}},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_CCT:if(!(r===e.PROD||r===e.TEST)){c[t.AVALANCHE_CCT]={status:`unsupported-environment`,message:`Service type "${t.AVALANCHE_CCT}" is only supported in production or test environment.`};break}await u(t.AVALANCHE_CCT,async()=>{let{createAvalancheCctService:e}=await import(`./transfer-service/avalanche-cct/avalanche-cct-service.js`);return await e({avalancheSendTx:l.avalancheSendTx,environment:r,fetch:o,getCoreEthAddress:l.getCoreEthAddress,getAtomicUtxos:l.getAtomicUtxos,getUtxos:l.getUtxos,getWalletAddressesForChainAlias:l.getWalletAddressesForChainAlias,getWalletChangeAddressForChainAlias:l.getWalletChangeAddressForChainAlias})});break;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:i,serviceInitializers:o})=>{u(e),d(o);let{services:s,status:p}=await f({environment:e,serviceInitializers:o,fetch:i});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 o=s.get(e.serviceType);if(!o)throw new a(n.SERVICE_TYPE_NOT_CONFIGURED);return await o.estimateNativeFee(e,t)},getBridgeableAssets:async({sourceAsset:e,sourceChainId:i,targetChainId:a,limit:o,search:c,page:l})=>{if(o!==void 0&&(!Number.isInteger(o)||o<=0))throw new r(n.INVALID_PARAMS,`Invalid "limit" provided: ${String(o)}. Expected a positive integer.`);if(l!==void 0&&(!Number.isInteger(l)||l<=0))throw new r(n.INVALID_PARAMS,`Invalid "page" provided: ${String(l)}. Expected a positive integer.`);let u=o??100,d=l??1,f=Array.from(s.values()),p=f.filter(e=>e.type!==t.MARKR).sort((e,t)=>e.type.localeCompare(t.type)),m=[...f.filter(e=>e.type===t.MARKR),...p],h=await Promise.all(m.map(async t=>{try{return{status:`fulfilled`,result:await t.getBridgeableAssets({sourceAsset:e,sourceChainId:i,targetChainId:a,limit:u,search:c,page:d})}}catch{return{status:`rejected`}}})),g=[],_=!1;for(let e of h)e.status===`fulfilled`&&(g.push(...e.result.assets),_||=e.result.meta.hasMore);return{assets:g,meta:{currentPage:d,hasMore:_,..._?{nextPage:d+1}:{}}}},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.allSettled(Array.from(s.values()).map(e=>e.getSupportedChains())),r=t.filter(e=>e.status===`fulfilled`),i=t.filter(e=>e.status===`rejected`);if(t.length>0&&r.length===0){let e=i.map(e=>e.reason instanceof Error?e.reason.message:String(e.reason)).join(`; `);throw new a(n.UNKNOWN,`Failed to fetch supported chains from all configured services. ${e}`)}for(let t of r){let n=t.value;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(s.values()),t),recurring:l(s),status:()=>p,trackTransfer:e=>{let{transfer:t}=e,r=s.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=s.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 } 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 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_CCT: {\n if (!(environment === Environment.PROD || environment === Environment.TEST)) {\n serviceStatuses[ServiceType.AVALANCHE_CCT] = {\n status: 'unsupported-environment',\n message: `Service type \"${ServiceType.AVALANCHE_CCT}\" is only supported in production or test environment.`,\n };\n break;\n }\n\n await initializeService(ServiceType.AVALANCHE_CCT, async () => {\n const { createAvalancheCctService } = await import('./transfer-service/avalanche-cct/avalanche-cct-service');\n\n return await createAvalancheCctService({\n avalancheSendTx: initializer.avalancheSendTx,\n environment,\n fetch: customFetch,\n getCoreEthAddress: initializer.getCoreEthAddress,\n getAtomicUtxos: initializer.getAtomicUtxos,\n getUtxos: initializer.getUtxos,\n getWalletAddressesForChainAlias: initializer.getWalletAddressesForChainAlias,\n getWalletChangeAddressForChainAlias: initializer.getWalletChangeAddressForChainAlias,\n });\n });\n\n break;\n }\n\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, limit, search, page }) => {\n if (limit !== undefined && (!Number.isInteger(limit) || limit <= 0)) {\n throw new InvalidParamsError(\n ErrorReason.INVALID_PARAMS,\n `Invalid \"limit\" provided: ${String(limit)}. Expected a positive integer.`,\n );\n }\n if (page !== undefined && (!Number.isInteger(page) || page <= 0)) {\n throw new InvalidParamsError(\n ErrorReason.INVALID_PARAMS,\n `Invalid \"page\" provided: ${String(page)}. Expected a positive integer.`,\n );\n }\n\n const pageLimit = limit ?? 100;\n const currentPage = page ?? 1;\n const configuredServices = Array.from(services.values());\n const nonMarkrServices = configuredServices\n .filter((service) => service.type !== ServiceType.MARKR)\n .sort((a, b) => a.type.localeCompare(b.type));\n const orderedServices = [\n ...configuredServices.filter((service) => service.type === ServiceType.MARKR),\n ...nonMarkrServices,\n ];\n\n const serviceResults = await Promise.all(\n orderedServices.map(async (service) => {\n try {\n const result = await service.getBridgeableAssets({\n sourceAsset,\n sourceChainId,\n targetChainId,\n limit: pageLimit,\n search,\n page: currentPage,\n });\n\n return { status: 'fulfilled' as const, result };\n } catch {\n return { status: 'rejected' as const };\n }\n }),\n );\n\n const combinedAssets: BridgeableUiAsset[] = [];\n let hasMore = false;\n\n for (const serviceResult of serviceResults) {\n if (serviceResult.status !== 'fulfilled') {\n continue;\n }\n\n combinedAssets.push(...serviceResult.result.assets);\n hasMore = hasMore || serviceResult.result.meta.hasMore;\n }\n\n return {\n assets: combinedAssets,\n meta: {\n currentPage,\n hasMore,\n ...(hasMore ? { nextPage: currentPage + 1 } : {}),\n },\n };\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 // Merge fulfilled results. If every call fails, throw so callers can distinguish\n // \"no supported chains\" from \"service outage/misconfiguration\".\n const settledResults = await Promise.allSettled(\n Array.from(services.values()).map((service) => service.getSupportedChains()),\n );\n\n const fulfilledResults = settledResults.filter((settled) => settled.status === 'fulfilled');\n const rejectedResults = settledResults.filter((settled) => settled.status === 'rejected');\n\n if (settledResults.length > 0 && fulfilledResults.length === 0) {\n const details = rejectedResults\n .map((result) => (result.reason instanceof Error ? result.reason.message : String(result.reason)))\n .join('; ');\n\n throw new ServiceUnavailableError(\n ErrorReason.UNKNOWN,\n `Failed to fetch supported chains from all configured services. ${details}`,\n );\n }\n\n // Merge results: union destination sets for identical source chain IDs.\n for (const settled of fulfilledResults) {\n const result = settled.value;\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
+ {"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 type { Caip2ChainId } from './types/caip';\nimport type { Fetch } from './types/utility-types';\nimport type { MarkrService } from './transfer-service/markr/markr-service';\nimport type { RecurringNamespace } from './transfer-service/markr/recurring/types';\n\n/**\n * Builds the `TransferManager.recurring` capability surface by delegating\n * each call to whichever underlying service implements recurring (today:\n * Markr). The delegate captures the services map by reference so a future\n * call sees whatever is currently initialized.\n *\n * Throws `ServiceUnavailableError` from every method when no recurring-\n * capable service is registered — same failure shape as `transferAsset`,\n * `estimateNativeFee`, and `trackTransfer` when the relevant service is\n * absent.\n */\nconst createRecurringDelegate = (services: Map<ServiceType, TransferService>): RecurringNamespace => {\n const requireMarkrService = (): MarkrService => {\n const service = services.get(ServiceType.MARKR);\n // The `'recurring' in service` guard documents the invariant in code:\n // `initializeServices` registers a `MarkrService` (which extends\n // `TransferService` with `.recurring`) for `ServiceType.MARKR`. The check\n // also gives us a clear `ServiceUnavailableError` instead of a runtime\n // `Cannot read property 'X' of undefined` if a future refactor ever\n // registers a plain `TransferService` for the Markr slot.\n if (!service || !('recurring' in service)) {\n throw new ServiceUnavailableError(\n ErrorReason.SERVICE_TYPE_NOT_CONFIGURED,\n 'Recurring swaps require the Markr service, which was not initialized.',\n );\n }\n return service as MarkrService;\n };\n\n // `async` on the Promise-returning methods so a sync throw from\n // `requireMarkrService()` becomes a Promise rejection (consumers expect\n // `manager.recurring.quote(...)` to return a Promise, not to throw before\n // returning one). The sync methods (`checkEligibility`,\n // `getRecurringChainInfo`) keep their natural sync shape — sync throws\n // are the contract there.\n return {\n quote: async (props) => requireMarkrService().recurring.quote(props),\n executeFirstFill: async (props) => requireMarkrService().recurring.executeFirstFill(props),\n listOrders: async (props) => requireMarkrService().recurring.listOrders(props),\n executeCancellation: async (props) => requireMarkrService().recurring.executeCancellation(props),\n executePause: async (props) => requireMarkrService().recurring.executePause(props),\n executeUnpause: async (props) => requireMarkrService().recurring.executeUnpause(props),\n checkEligibility: (props) => requireMarkrService().recurring.checkEligibility(props),\n getRecurringChainInfo: () => requireMarkrService().recurring.getRecurringChainInfo(),\n };\n};\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_CCT: {\n if (!(environment === Environment.PROD || environment === Environment.TEST)) {\n serviceStatuses[ServiceType.AVALANCHE_CCT] = {\n status: 'unsupported-environment',\n message: `Service type \"${ServiceType.AVALANCHE_CCT}\" is only supported in production or test environment.`,\n };\n break;\n }\n\n await initializeService(ServiceType.AVALANCHE_CCT, async () => {\n const { createAvalancheCctService } = await import('./transfer-service/avalanche-cct/avalanche-cct-service');\n\n return await createAvalancheCctService({\n avalancheSendTx: initializer.avalancheSendTx,\n environment,\n fetch: customFetch,\n getCoreEthAddress: initializer.getCoreEthAddress,\n getAtomicUtxos: initializer.getAtomicUtxos,\n getUtxos: initializer.getUtxos,\n getWalletAddressesForChainAlias: initializer.getWalletAddressesForChainAlias,\n getWalletChangeAddressForChainAlias: initializer.getWalletChangeAddressForChainAlias,\n });\n });\n\n break;\n }\n\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, limit, search, page }) => {\n if (limit !== undefined && (!Number.isInteger(limit) || limit <= 0)) {\n throw new InvalidParamsError(\n ErrorReason.INVALID_PARAMS,\n `Invalid \"limit\" provided: ${String(limit)}. Expected a positive integer.`,\n );\n }\n if (page !== undefined && (!Number.isInteger(page) || page <= 0)) {\n throw new InvalidParamsError(\n ErrorReason.INVALID_PARAMS,\n `Invalid \"page\" provided: ${String(page)}. Expected a positive integer.`,\n );\n }\n\n const pageLimit = limit ?? 100;\n const currentPage = page ?? 1;\n const configuredServices = Array.from(services.values());\n const nonMarkrServices = configuredServices\n .filter((service) => service.type !== ServiceType.MARKR)\n .sort((a, b) => a.type.localeCompare(b.type));\n const orderedServices = [\n ...configuredServices.filter((service) => service.type === ServiceType.MARKR),\n ...nonMarkrServices,\n ];\n\n const serviceResults = await Promise.all(\n orderedServices.map(async (service) => {\n try {\n const result = await service.getBridgeableAssets({\n sourceAsset,\n sourceChainId,\n targetChainId,\n limit: pageLimit,\n search,\n page: currentPage,\n });\n\n return { status: 'fulfilled' as const, result };\n } catch {\n return { status: 'rejected' as const };\n }\n }),\n );\n\n const combinedAssets: BridgeableUiAsset[] = [];\n let hasMore = false;\n\n for (const serviceResult of serviceResults) {\n if (serviceResult.status !== 'fulfilled') {\n continue;\n }\n\n combinedAssets.push(...serviceResult.result.assets);\n hasMore = hasMore || serviceResult.result.meta.hasMore;\n }\n\n return {\n assets: combinedAssets,\n meta: {\n currentPage,\n hasMore,\n ...(hasMore ? { nextPage: currentPage + 1 } : {}),\n },\n };\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 // Merge fulfilled results. If every call fails, throw so callers can distinguish\n // \"no supported chains\" from \"service outage/misconfiguration\".\n const settledResults = await Promise.allSettled(\n Array.from(services.values()).map((service) => service.getSupportedChains()),\n );\n\n const fulfilledResults = settledResults.filter((settled) => settled.status === 'fulfilled');\n const rejectedResults = settledResults.filter((settled) => settled.status === 'rejected');\n\n if (settledResults.length > 0 && fulfilledResults.length === 0) {\n const details = rejectedResults\n .map((result) => (result.reason instanceof Error ? result.reason.message : String(result.reason)))\n .join('; ');\n\n throw new ServiceUnavailableError(\n ErrorReason.UNKNOWN,\n `Failed to fetch supported chains from all configured services. ${details}`,\n );\n }\n\n // Merge results: union destination sets for identical source chain IDs.\n for (const settled of fulfilledResults) {\n const result = settled.value;\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 recurring: createRecurringDelegate(services),\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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"}
@@ -0,0 +1,2 @@
1
+ require(`../_virtual/_rolldown/runtime.cjs`);const e=require(`../errors.cjs`),t=require(`./_utils.cjs`),n=require(`./_evm-errors.cjs`);let r=require(`viem`);var i=class extends e.SdkError{constructor(){super(`ERC20 approval transaction was reverted.`,e.ErrorCode.TRANSACTION_REVERTED),this.name=`ApprovalRevertedError`}};async function a({chainIdHex:e,client:i,gasSettings:a,owner:o,requiredAllowance:s,spender:c,token:l}){if(await i.readContract({address:l,abi:r.erc20Abi,functionName:`allowance`,args:[o,c]})>=s)return;let u=(0,r.encodeFunctionData)({abi:r.erc20Abi,functionName:`approve`,args:[c,s]});return{chainId:e,data:u,from:o,gas:t.applyFeeUnitsBpsMargin(await n.estimateGasWithRevert(i,{account:o,to:l,data:u},r.erc20Abi,`Failed to estimate gas for ERC20 approval transaction.`),a?.estimateGasMarginBps),to:l,value:0n,...t.maybe1559(a)}}async function o({client:e,evmSigner:t,onStepChange:n,request:r,step:a}){n?.(a);let o=await t.sign(r,async t=>e.sendRawTransaction({serializedTransaction:t}),a);if((await e.waitForTransactionReceipt({hash:o})).status===`reverted`)throw new i}exports.ApprovalRevertedError=i,exports.buildErc20ApprovalRequest=a,exports.signApprovalAndAssertConfirmed=o;
2
+ //# sourceMappingURL=_evm-approval.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_evm-approval.cjs","names":["SdkError","ErrorCode","erc20Abi","applyFeeUnitsBpsMargin","estimateGasWithRevert","maybe1559"],"sources":["../../src/transfer-service/_evm-approval.ts"],"sourcesContent":["/**\n * @module\n * @internal\n *\n * Shared EVM allowance + approval helpers reused by the regular\n * `transferAsset` path and the recurring `executeFirstFill` path. Captures the\n * \"read on-chain allowance, build an `approve(spender, amount)` TX when short,\n * sign + wait + revert-check\" subroutines that both call sites need —\n * orchestration (one-click batch attempt, fallback to sequential, final swap\n * sign) stays at each call site because the surrounding contract differs\n * (return type, gas estimation flavor, native-token short-circuit, etc.).\n */\nimport { encodeFunctionData, erc20Abi, type Address as EvmAddress } from 'viem';\nimport { ErrorCode, SdkError } from '../errors';\nimport type { GasSettings } from '../types/service';\nimport type { EvmSigner, EvmTransactionRequest, Hex } from '../types/signer';\nimport type { TransferStepDetails } from '../types/transfer';\nimport { applyFeeUnitsBpsMargin, maybe1559 } from './_utils';\nimport type { EvmSourceClient } from './_utils';\nimport { estimateGasWithRevert } from './_evm-errors';\n\n/**\n * Thrown by {@link signApprovalAndAssertConfirmed} when the approval TX is\n * mined as reverted (i.e. broadcast succeeded, but the on-chain receipt's\n * `status === 'reverted'`).\n *\n * Distinct class so callers can `instanceof`-discriminate this specific\n * confirmed-then-reverted signal from other failures (signer rejection, RPC\n * timeout on the receipt poll, etc.) — the regular `transferAsset` path\n * converts this to a failed `Transfer`; the recurring path lets it bubble.\n *\n * Extends `SdkError` (with `ErrorCode.TRANSACTION_REVERTED`) so existing\n * error-code-based consumers still observe the documented semantics.\n */\nexport class ApprovalRevertedError extends SdkError {\n constructor() {\n super('ERC20 approval transaction was reverted.', ErrorCode.TRANSACTION_REVERTED);\n this.name = 'ApprovalRevertedError';\n }\n}\n\n/**\n * Reads `allowance(token → spender)` for `owner` and, if short of\n * `requiredAllowance`, builds an `approve(spender, requiredAllowance)`\n * {@link EvmTransactionRequest} with a gas estimate (plus\n * `gasSettings.estimateGasMarginBps` margin) and optional 1559 overrides\n * already applied.\n *\n * Returns `undefined` when the existing allowance already covers — caller\n * skips the approval step entirely.\n *\n * Native-token short-circuits live at the call site (this helper only runs\n * for ERC-20 inputs).\n */\nexport async function buildErc20ApprovalRequest({\n chainIdHex,\n client,\n gasSettings,\n owner,\n requiredAllowance,\n spender,\n token,\n}: {\n chainIdHex: Hex;\n client: EvmSourceClient;\n gasSettings?: GasSettings;\n owner: EvmAddress;\n requiredAllowance: bigint;\n spender: EvmAddress;\n token: EvmAddress;\n}): Promise<EvmTransactionRequest | undefined> {\n const allowance = await client.readContract({\n address: token,\n abi: erc20Abi,\n functionName: 'allowance',\n args: [owner, spender],\n });\n\n if (allowance >= requiredAllowance) {\n return undefined;\n }\n\n const data = encodeFunctionData({\n abi: erc20Abi,\n functionName: 'approve',\n args: [spender, requiredAllowance],\n });\n\n const gasEstimate = await estimateGasWithRevert(\n client,\n { account: owner, to: token, data },\n erc20Abi,\n 'Failed to estimate gas for ERC20 approval transaction.',\n );\n\n return {\n chainId: chainIdHex,\n data,\n from: owner,\n gas: applyFeeUnitsBpsMargin(gasEstimate, gasSettings?.estimateGasMarginBps),\n to: token,\n value: 0n,\n ...maybe1559(gasSettings),\n };\n}\n\n/**\n * Signs the given approval `EvmTransactionRequest`, dispatches it via the\n * chain's RPC, and waits for the receipt. Throws {@link ApprovalRevertedError}\n * (an `SdkError` subclass with `ErrorCode.TRANSACTION_REVERTED`) when the\n * approval TX is mined as reverted — callers may `instanceof`-discriminate\n * to convert into a service-specific failure envelope (e.g.\n * `makeFailedTransferFromQuote`). Other errors (signer rejection, RPC\n * timeouts on the receipt poll, etc.) propagate unchanged.\n *\n * Fires `onStepChange(step)` before signing so consumers can advance their\n * step-tracking UI; omit for paths that don't surface per-step progress\n * (e.g. the recurring namespace).\n */\nexport async function signApprovalAndAssertConfirmed({\n client,\n evmSigner,\n onStepChange,\n request,\n step,\n}: {\n client: EvmSourceClient;\n evmSigner: EvmSigner;\n onStepChange?: (step: TransferStepDetails) => void;\n request: EvmTransactionRequest;\n step: TransferStepDetails;\n}): Promise<void> {\n onStepChange?.(step);\n\n const approvalTxHash = await evmSigner.sign(\n request,\n async (signedTxHash) => client.sendRawTransaction({ serializedTransaction: signedTxHash }),\n step,\n );\n\n const receipt = await client.waitForTransactionReceipt({ hash: approvalTxHash });\n\n if (receipt.status === 'reverted') {\n throw new ApprovalRevertedError();\n }\n}\n"],"mappings":"6JAkCA,IAAa,EAAb,cAA2CA,EAAAA,QAAS,CAClD,aAAc,CACZ,MAAM,2CAA4CC,EAAAA,UAAU,qBAAqB,CACjF,KAAK,KAAO,0BAiBhB,eAAsB,EAA0B,CAC9C,aACA,SACA,cACA,QACA,oBACA,UACA,SAS6C,CAQ7C,GAPkB,MAAM,EAAO,aAAa,CAC1C,QAAS,EACT,IAAKC,EAAAA,SACL,aAAc,YACd,KAAM,CAAC,EAAO,EAAQ,CACvB,CAAC,EAEe,EACf,OAGF,IAAM,GAAA,EAAA,EAAA,oBAA0B,CAC9B,IAAKA,EAAAA,SACL,aAAc,UACd,KAAM,CAAC,EAAS,EAAkB,CACnC,CAAC,CASF,MAAO,CACL,QAAS,EACT,OACA,KAAM,EACN,IAAKC,EAAAA,uBAXa,MAAMC,EAAAA,sBACxB,EACA,CAAE,QAAS,EAAO,GAAI,EAAO,OAAM,CACnCF,EAAAA,SACA,yDACD,CAM0C,GAAa,qBAAqB,CAC3E,GAAI,EACJ,MAAO,GACP,GAAGG,EAAAA,UAAU,EAAY,CAC1B,CAgBH,eAAsB,EAA+B,CACnD,SACA,YACA,eACA,UACA,QAOgB,CAChB,IAAe,EAAK,CAEpB,IAAM,EAAiB,MAAM,EAAU,KACrC,EACA,KAAO,IAAiB,EAAO,mBAAmB,CAAE,sBAAuB,EAAc,CAAC,CAC1F,EACD,CAID,IAFgB,MAAM,EAAO,0BAA0B,CAAE,KAAM,EAAgB,CAAC,EAEpE,SAAW,WACrB,MAAM,IAAI"}
@@ -0,0 +1,23 @@
1
+ import { SdkError } from "../errors.cjs";
2
+ import { Address } from "viem";
3
+
4
+ //#region src/transfer-service/_evm-approval.d.ts
5
+ /**
6
+ * Thrown by {@link signApprovalAndAssertConfirmed} when the approval TX is
7
+ * mined as reverted (i.e. broadcast succeeded, but the on-chain receipt's
8
+ * `status === 'reverted'`).
9
+ *
10
+ * Distinct class so callers can `instanceof`-discriminate this specific
11
+ * confirmed-then-reverted signal from other failures (signer rejection, RPC
12
+ * timeout on the receipt poll, etc.) — the regular `transferAsset` path
13
+ * converts this to a failed `Transfer`; the recurring path lets it bubble.
14
+ *
15
+ * Extends `SdkError` (with `ErrorCode.TRANSACTION_REVERTED`) so existing
16
+ * error-code-based consumers still observe the documented semantics.
17
+ */
18
+ declare class ApprovalRevertedError extends SdkError {
19
+ constructor();
20
+ }
21
+ //#endregion
22
+ export { ApprovalRevertedError };
23
+ //# sourceMappingURL=_evm-approval.d.cts.map
@@ -0,0 +1,23 @@
1
+ import { SdkError } from "../errors.js";
2
+ import { Address } from "viem";
3
+
4
+ //#region src/transfer-service/_evm-approval.d.ts
5
+ /**
6
+ * Thrown by {@link signApprovalAndAssertConfirmed} when the approval TX is
7
+ * mined as reverted (i.e. broadcast succeeded, but the on-chain receipt's
8
+ * `status === 'reverted'`).
9
+ *
10
+ * Distinct class so callers can `instanceof`-discriminate this specific
11
+ * confirmed-then-reverted signal from other failures (signer rejection, RPC
12
+ * timeout on the receipt poll, etc.) — the regular `transferAsset` path
13
+ * converts this to a failed `Transfer`; the recurring path lets it bubble.
14
+ *
15
+ * Extends `SdkError` (with `ErrorCode.TRANSACTION_REVERTED`) so existing
16
+ * error-code-based consumers still observe the documented semantics.
17
+ */
18
+ declare class ApprovalRevertedError extends SdkError {
19
+ constructor();
20
+ }
21
+ //#endregion
22
+ export { ApprovalRevertedError };
23
+ //# sourceMappingURL=_evm-approval.d.ts.map
@@ -0,0 +1,2 @@
1
+ import{ErrorCode as e,SdkError as t}from"../errors.js";import{applyFeeUnitsBpsMargin as n,maybe1559 as r}from"./_utils.js";import{estimateGasWithRevert as i}from"./_evm-errors.js";import{encodeFunctionData as a,erc20Abi as o}from"viem";var s=class extends t{constructor(){super(`ERC20 approval transaction was reverted.`,e.TRANSACTION_REVERTED),this.name=`ApprovalRevertedError`}};async function c({chainIdHex:e,client:t,gasSettings:s,owner:c,requiredAllowance:l,spender:u,token:d}){if(await t.readContract({address:d,abi:o,functionName:`allowance`,args:[c,u]})>=l)return;let f=a({abi:o,functionName:`approve`,args:[u,l]});return{chainId:e,data:f,from:c,gas:n(await i(t,{account:c,to:d,data:f},o,`Failed to estimate gas for ERC20 approval transaction.`),s?.estimateGasMarginBps),to:d,value:0n,...r(s)}}async function l({client:e,evmSigner:t,onStepChange:n,request:r,step:i}){n?.(i);let a=await t.sign(r,async t=>e.sendRawTransaction({serializedTransaction:t}),i);if((await e.waitForTransactionReceipt({hash:a})).status===`reverted`)throw new s}export{s as ApprovalRevertedError,c as buildErc20ApprovalRequest,l as signApprovalAndAssertConfirmed};
2
+ //# sourceMappingURL=_evm-approval.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_evm-approval.js","names":[],"sources":["../../src/transfer-service/_evm-approval.ts"],"sourcesContent":["/**\n * @module\n * @internal\n *\n * Shared EVM allowance + approval helpers reused by the regular\n * `transferAsset` path and the recurring `executeFirstFill` path. Captures the\n * \"read on-chain allowance, build an `approve(spender, amount)` TX when short,\n * sign + wait + revert-check\" subroutines that both call sites need —\n * orchestration (one-click batch attempt, fallback to sequential, final swap\n * sign) stays at each call site because the surrounding contract differs\n * (return type, gas estimation flavor, native-token short-circuit, etc.).\n */\nimport { encodeFunctionData, erc20Abi, type Address as EvmAddress } from 'viem';\nimport { ErrorCode, SdkError } from '../errors';\nimport type { GasSettings } from '../types/service';\nimport type { EvmSigner, EvmTransactionRequest, Hex } from '../types/signer';\nimport type { TransferStepDetails } from '../types/transfer';\nimport { applyFeeUnitsBpsMargin, maybe1559 } from './_utils';\nimport type { EvmSourceClient } from './_utils';\nimport { estimateGasWithRevert } from './_evm-errors';\n\n/**\n * Thrown by {@link signApprovalAndAssertConfirmed} when the approval TX is\n * mined as reverted (i.e. broadcast succeeded, but the on-chain receipt's\n * `status === 'reverted'`).\n *\n * Distinct class so callers can `instanceof`-discriminate this specific\n * confirmed-then-reverted signal from other failures (signer rejection, RPC\n * timeout on the receipt poll, etc.) — the regular `transferAsset` path\n * converts this to a failed `Transfer`; the recurring path lets it bubble.\n *\n * Extends `SdkError` (with `ErrorCode.TRANSACTION_REVERTED`) so existing\n * error-code-based consumers still observe the documented semantics.\n */\nexport class ApprovalRevertedError extends SdkError {\n constructor() {\n super('ERC20 approval transaction was reverted.', ErrorCode.TRANSACTION_REVERTED);\n this.name = 'ApprovalRevertedError';\n }\n}\n\n/**\n * Reads `allowance(token → spender)` for `owner` and, if short of\n * `requiredAllowance`, builds an `approve(spender, requiredAllowance)`\n * {@link EvmTransactionRequest} with a gas estimate (plus\n * `gasSettings.estimateGasMarginBps` margin) and optional 1559 overrides\n * already applied.\n *\n * Returns `undefined` when the existing allowance already covers — caller\n * skips the approval step entirely.\n *\n * Native-token short-circuits live at the call site (this helper only runs\n * for ERC-20 inputs).\n */\nexport async function buildErc20ApprovalRequest({\n chainIdHex,\n client,\n gasSettings,\n owner,\n requiredAllowance,\n spender,\n token,\n}: {\n chainIdHex: Hex;\n client: EvmSourceClient;\n gasSettings?: GasSettings;\n owner: EvmAddress;\n requiredAllowance: bigint;\n spender: EvmAddress;\n token: EvmAddress;\n}): Promise<EvmTransactionRequest | undefined> {\n const allowance = await client.readContract({\n address: token,\n abi: erc20Abi,\n functionName: 'allowance',\n args: [owner, spender],\n });\n\n if (allowance >= requiredAllowance) {\n return undefined;\n }\n\n const data = encodeFunctionData({\n abi: erc20Abi,\n functionName: 'approve',\n args: [spender, requiredAllowance],\n });\n\n const gasEstimate = await estimateGasWithRevert(\n client,\n { account: owner, to: token, data },\n erc20Abi,\n 'Failed to estimate gas for ERC20 approval transaction.',\n );\n\n return {\n chainId: chainIdHex,\n data,\n from: owner,\n gas: applyFeeUnitsBpsMargin(gasEstimate, gasSettings?.estimateGasMarginBps),\n to: token,\n value: 0n,\n ...maybe1559(gasSettings),\n };\n}\n\n/**\n * Signs the given approval `EvmTransactionRequest`, dispatches it via the\n * chain's RPC, and waits for the receipt. Throws {@link ApprovalRevertedError}\n * (an `SdkError` subclass with `ErrorCode.TRANSACTION_REVERTED`) when the\n * approval TX is mined as reverted — callers may `instanceof`-discriminate\n * to convert into a service-specific failure envelope (e.g.\n * `makeFailedTransferFromQuote`). Other errors (signer rejection, RPC\n * timeouts on the receipt poll, etc.) propagate unchanged.\n *\n * Fires `onStepChange(step)` before signing so consumers can advance their\n * step-tracking UI; omit for paths that don't surface per-step progress\n * (e.g. the recurring namespace).\n */\nexport async function signApprovalAndAssertConfirmed({\n client,\n evmSigner,\n onStepChange,\n request,\n step,\n}: {\n client: EvmSourceClient;\n evmSigner: EvmSigner;\n onStepChange?: (step: TransferStepDetails) => void;\n request: EvmTransactionRequest;\n step: TransferStepDetails;\n}): Promise<void> {\n onStepChange?.(step);\n\n const approvalTxHash = await evmSigner.sign(\n request,\n async (signedTxHash) => client.sendRawTransaction({ serializedTransaction: signedTxHash }),\n step,\n );\n\n const receipt = await client.waitForTransactionReceipt({ hash: approvalTxHash });\n\n if (receipt.status === 'reverted') {\n throw new ApprovalRevertedError();\n }\n}\n"],"mappings":"4OAkCA,IAAa,EAAb,cAA2C,CAAS,CAClD,aAAc,CACZ,MAAM,2CAA4C,EAAU,qBAAqB,CACjF,KAAK,KAAO,0BAiBhB,eAAsB,EAA0B,CAC9C,aACA,SACA,cACA,QACA,oBACA,UACA,SAS6C,CAQ7C,GAPkB,MAAM,EAAO,aAAa,CAC1C,QAAS,EACT,IAAK,EACL,aAAc,YACd,KAAM,CAAC,EAAO,EAAQ,CACvB,CAAC,EAEe,EACf,OAGF,IAAM,EAAO,EAAmB,CAC9B,IAAK,EACL,aAAc,UACd,KAAM,CAAC,EAAS,EAAkB,CACnC,CAAC,CASF,MAAO,CACL,QAAS,EACT,OACA,KAAM,EACN,IAAK,EAXa,MAAM,EACxB,EACA,CAAE,QAAS,EAAO,GAAI,EAAO,OAAM,CACnC,EACA,yDACD,CAM0C,GAAa,qBAAqB,CAC3E,GAAI,EACJ,MAAO,GACP,GAAG,EAAU,EAAY,CAC1B,CAgBH,eAAsB,EAA+B,CACnD,SACA,YACA,eACA,UACA,QAOgB,CAChB,IAAe,EAAK,CAEpB,IAAM,EAAiB,MAAM,EAAU,KACrC,EACA,KAAO,IAAiB,EAAO,mBAAmB,CAAE,sBAAuB,EAAc,CAAC,CAC1F,EACD,CAID,IAFgB,MAAM,EAAO,0BAA0B,CAAE,KAAM,EAAgB,CAAC,EAEpE,SAAW,WACrB,MAAM,IAAI"}
@@ -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({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}}async function f(t,n){return new Promise((r,i)=>{if(t<=0)return r();let a=setTimeout(()=>{s(),r()},t),o=()=>{s(),i(new e.AbortedError)},s=()=>{clearTimeout(a),n&&n.removeEventListener(`abort`,o)};if(n){if(n.aborted)return s(),i(new e.AbortedError);n.addEventListener(`abort`,o)}})}exports.applyFeeUnitsBpsMargin=s,exports.awaitOrAbort=u,exports.getEvmClientForChain=a,exports.getSolanaRpcForChain=o,exports.makeFailedTransferFromQuote=d,exports.wait=f,exports.waitForTimeoutOrAbort=c;
1
+ require(`../_virtual/_rolldown/runtime.cjs`);const e=require(`../errors.cjs`),t=require(`../utils/caip.cjs`);let n=require(`viem`),r=require(`@solana/kit`);function i(n){let{namespace:r,reference:i}=t.splitCaip2ChainId(n.chainId);if(r!==`eip155`)throw new e.InvalidParamsError(`Can not get Viem chain for unsupported chain`,`Unsupported chain namespace: ${r}. Only eip155 chains are supported.`);return{id:Number(i),name:n.chainName,nativeCurrency:{decimals:n.networkToken.decimals,symbol:n.networkToken.symbol,name:n.networkToken.name},rpcUrls:{default:{http:[n.rpcUrl]},public:{http:[n.rpcUrl]}},...n.utilityAddresses?.multicall&&{contracts:{multicall3:{address:n.utilityAddresses.multicall}}}}}function a({chain:e}){return(0,n.createWalletClient)({chain:i(e),transport:(0,n.http)(e.rpcUrl,{batch:!0,retryCount:6,retryDelay:200,timeout:15e3})}).extend(n.publicActions)}function o({chain:e}){return(0,r.createSolanaRpc)(e.rpcUrl)}function s(e){return e?.maxFeePerGas===void 0?{}:{maxFeePerGas:e.maxFeePerGas,maxPriorityFeePerGas:e.maxPriorityFeePerGas}}function c(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 l({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 u=Symbol(`aborted`);async function d(e,t){let n=await Promise.race([e,new Promise(e=>{t.addEventListener(`abort`,()=>e(u),{once:!0})})]);return n===u||t.aborted?{status:`aborted`}:{status:`ok`,value:n}}function f(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}}async function p(t,n){return new Promise((r,i)=>{if(t<=0)return r();let a=setTimeout(()=>{s(),r()},t),o=()=>{s(),i(new e.AbortedError)},s=()=>{clearTimeout(a),n&&n.removeEventListener(`abort`,o)};if(n){if(n.aborted)return s(),i(new e.AbortedError);n.addEventListener(`abort`,o)}})}exports.applyFeeUnitsBpsMargin=c,exports.awaitOrAbort=d,exports.getEvmClientForChain=a,exports.getSolanaRpcForChain=o,exports.makeFailedTransferFromQuote=f,exports.maybe1559=s,exports.wait=p,exports.waitForTimeoutOrAbort=l;
2
2
  //# sourceMappingURL=_utils.cjs.map