@avalabs/fusion-sdk 0.11.1 → 0.13.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 (37) hide show
  1. package/dist/mod.d.cts +2 -2
  2. package/dist/mod.d.ts +2 -2
  3. package/dist/transfer-service/avalanche-evm/_handlers/stream-quotes.cjs +1 -1
  4. package/dist/transfer-service/avalanche-evm/_handlers/stream-quotes.cjs.map +1 -1
  5. package/dist/transfer-service/avalanche-evm/_handlers/stream-quotes.js +1 -1
  6. package/dist/transfer-service/avalanche-evm/_handlers/stream-quotes.js.map +1 -1
  7. package/dist/transfer-service/lombard/btc-to-btcb/_handlers/stream-quotes.cjs +1 -1
  8. package/dist/transfer-service/lombard/btc-to-btcb/_handlers/stream-quotes.cjs.map +1 -1
  9. package/dist/transfer-service/lombard/btc-to-btcb/_handlers/stream-quotes.js +1 -1
  10. package/dist/transfer-service/lombard/btc-to-btcb/_handlers/stream-quotes.js.map +1 -1
  11. package/dist/transfer-service/lombard/btcb-to-btc/_handlers/stream-quotes.cjs +1 -1
  12. package/dist/transfer-service/lombard/btcb-to-btc/_handlers/stream-quotes.cjs.map +1 -1
  13. package/dist/transfer-service/lombard/btcb-to-btc/_handlers/stream-quotes.js +1 -1
  14. package/dist/transfer-service/lombard/btcb-to-btc/_handlers/stream-quotes.js.map +1 -1
  15. package/dist/transfer-service/markr/_handlers/transfer-asset.cjs +1 -1
  16. package/dist/transfer-service/markr/_handlers/transfer-asset.cjs.map +1 -1
  17. package/dist/transfer-service/markr/_handlers/transfer-asset.js +1 -1
  18. package/dist/transfer-service/markr/_handlers/transfer-asset.js.map +1 -1
  19. package/dist/transfer-service/markr/_schema.cjs +1 -1
  20. package/dist/transfer-service/markr/_schema.cjs.map +1 -1
  21. package/dist/transfer-service/markr/_schema.js +1 -1
  22. package/dist/transfer-service/markr/_schema.js.map +1 -1
  23. package/dist/transfer-service/markr/_utils.cjs +1 -1
  24. package/dist/transfer-service/markr/_utils.cjs.map +1 -1
  25. package/dist/transfer-service/markr/_utils.js +1 -1
  26. package/dist/transfer-service/markr/_utils.js.map +1 -1
  27. package/dist/transfer-service/markr/constants.cjs +1 -1
  28. package/dist/transfer-service/markr/constants.cjs.map +1 -1
  29. package/dist/transfer-service/markr/constants.js +1 -1
  30. package/dist/transfer-service/markr/constants.js.map +1 -1
  31. package/dist/types/quote.d.cts +4 -1
  32. package/dist/types/quote.d.ts +4 -1
  33. package/dist/utils/transfer-utils.cjs +1 -1
  34. package/dist/utils/transfer-utils.cjs.map +1 -1
  35. package/dist/utils/transfer-utils.js +1 -1
  36. package/dist/utils/transfer-utils.js.map +1 -1
  37. package/package.json +1 -1
package/dist/mod.d.cts CHANGED
@@ -4,7 +4,7 @@ import { Chain } from "./types/chain.cjs";
4
4
  import { FeeRateTier } from "./types/fee.cjs";
5
5
  import { AVALANCHE_FUJI_CHAIN, AVALANCHE_MAINNET_CHAIN, AvalancheChainIds, BITCOIN_MAINNET_CHAIN, BITCOIN_TESTNET_CHAIN, BTC_SERVICE_TYPES, BitcoinChainIds, Blockchain, ERC_ZERO_ADDRESS, ETHEREUM_MAINNET_CHAIN, ETHEREUM_SEPOLIA_CHAIN, EVM_SERVICE_TYPES, Environment, EthereumChainIds, EvmChainId, FEE_RATE_TIER_TO_BITCOIN, NATIVE_AVAX, NATIVE_ETH, NATIVE_SOL_ADDRESS, SOLANA_DEVNET_CHAIN, SOLANA_MAINNET_CHAIN, ServiceType, SolanaChainIds, TokenType, TransferSignatureReason } from "./constants.cjs";
6
6
  import { Asset, BridgeableUiAsset, ChainAssetMap, DestinationInfo, Erc20Asset, NativeAsset, SplAsset, TransferableAsset } from "./types/asset.cjs";
7
- import { Quote, QuoteFee, QuoteFeeToken, QuoteFeeType, QuoteFees, QuoterDoneReason, QuoterEventArgs, QuoterEventHandler, QuoterInterface, QuoterProps, QuotesTuple, ServiceQuoteEventArgs, ServiceQuoteEventHandler } from "./types/quote.cjs";
7
+ import { Quote, QuoteFee, QuoteFeeFundingModel, QuoteFeeToken, QuoteFeeType, QuoteFees, QuoterDoneReason, QuoterEventArgs, QuoterEventHandler, QuoterInterface, QuoterProps, QuotesTuple, ServiceQuoteEventArgs, ServiceQuoteEventHandler } from "./types/quote.cjs";
8
8
  import { AbortedError, ErrorCode, ErrorReason, HttpError, InvalidParamsError, ResponseValidationError, SdkError, ServiceInitializationError, ServiceUnavailableError, TimeoutError, isAbortedError, isHttpError, isInvalidParamsError, isResponseValidationError, isSdkError, isServiceInitializationError, isServiceUnavailableError, isTimeoutError } from "./errors.cjs";
9
9
  import { CompletedTransfer, FailedTransfer, RefundedTransfer, SourceCompletedTransfer, SourcePendingTransfer, TargetPendingTransfer, Transfer, TransferBase, TransferSourceProgress, TransferStatus, TransferStepDetails, TransferTargetProgress } from "./types/transfer.cjs";
10
10
  import { SolanaSendOptions, SolanaTransactionParams } from "./utils/solana-transaction.cjs";
@@ -16,4 +16,4 @@ import { isEnvironment, isErc20Asset, isEvmBridgeInitializer, isLombardServiceIn
16
16
  import { createTransferManager } from "./transfer-manager.cjs";
17
17
  import { caip2ToEip155ChainId, caip2ToEip155HexChainId, eip155ChainIdToCaip2, isCaip2ChainId, splitCaip2ChainId } from "./utils/caip.cjs";
18
18
  import { parseTransfer, stringifyTransfer } from "./utils/transfer-utils.cjs";
19
- export { AVALANCHE_FUJI_CHAIN, AVALANCHE_MAINNET_CHAIN, AbortedError, ArrayElement, Asset, AssetBridgeMap, AvalancheChainIds, BITCOIN_MAINNET_CHAIN, BITCOIN_TESTNET_CHAIN, BTC_SERVICE_TYPES, BitcoinChainIds, BitcoinFeeRateTier, BitcoinFunctions, BitcoinInputUTXO, BitcoinInputUTXOWithOptionalScript, BitcoinOutputUTXO, BitcoinTx, Blockchain, BridgeableUiAsset, BtcDispatch, BtcSign, BtcSigner, BtcTransactionRequest, Caip10AccountId, Caip2ChainId, Chain, ChainAssetMap, CompletedTransfer, CreateTransferManagerOptions, DeepMutable, DestinationInfo, ERC_ZERO_ADDRESS, ETHEREUM_MAINNET_CHAIN, ETHEREUM_SEPOLIA_CHAIN, EVM_SERVICE_TYPES, Environment, Erc20Asset, ErrorCode, ErrorReason, EstimateNativeFeeOptions, EthereumChainIds, EvmChainId, EvmDispatch, EvmServiceInitializer, EvmSign, EvmSignBatch, EvmSignMessage, EvmSigner, EvmSignerWithMessage, EvmTransactionRequest, FEE_RATE_TIER_TO_BITCOIN, FailedTransfer, FeeRateTier, Fetch, GasSettings, GetBridgeableAssetsProps, GetMinimumTransferAmountProps, GetSupportedChainsResult, Hex, HttpError, InvalidParamsError, LombardServiceInitializer, MarkrServiceInitializer, Mutable, MutableGetSupportedChainsResult, NATIVE_AVAX, NATIVE_ETH, NATIVE_SOL_ADDRESS, NativeAsset, NativeFeeEstimate, Quote, QuoteFee, QuoteFeeToken, QuoteFeeType, QuoteFees, QuoterDoneReason, QuoterEventArgs, QuoterEventHandler, QuoterInterface, QuoterProps, QuotesTuple, RefundedTransfer, ResponseValidationError, SOLANA_DEVNET_CHAIN, SOLANA_MAINNET_CHAIN, SdkError, ServiceInitializationError, ServiceInitializer, ServiceQuoteEventArgs, ServiceQuoteEventHandler, ServiceStatus, ServiceStatusBaseRecord, ServiceStatusErrorRecord, ServiceStatusInitializedRecord, ServiceStatusRecord, ServiceStatusUnsupportedEnvironmentRecord, ServiceType, ServiceUnavailableError, SolanaChainIds, SolanaSendOptions, SolanaSign, SolanaSigner, SolanaTransactionParams, SourceCompletedTransfer, SourcePendingTransfer, SplAsset, TargetPendingTransfer, TimeoutError, TokenType, TrackTransferProps, Transfer, TransferAssetProps, TransferBase, TransferManager, TransferManagerStatus, TransferManagerStatusServicesRecord, TransferService, TransferSignatureReason, TransferSourceProgress, TransferStatus, TransferStepDetails, TransferTargetProgress, TransferableAsset, caip2ToEip155ChainId, caip2ToEip155HexChainId, createTransferManager, eip155ChainIdToCaip2, isAbortedError, isCaip2ChainId, isEnvironment, isErc20Asset, isEvmBridgeInitializer, isHttpError, isInvalidParamsError, isLombardServiceInitializer, isMarkrServiceInitializer, isNativeAsset, isResponseValidationError, isSdkError, isServiceInitializationError, isServiceInitializer, isServiceUnavailableError, isSplAsset, isTimeoutError, parseTransfer, splitCaip2ChainId, stringifyTransfer };
19
+ export { AVALANCHE_FUJI_CHAIN, AVALANCHE_MAINNET_CHAIN, AbortedError, ArrayElement, Asset, AssetBridgeMap, AvalancheChainIds, BITCOIN_MAINNET_CHAIN, BITCOIN_TESTNET_CHAIN, BTC_SERVICE_TYPES, BitcoinChainIds, BitcoinFeeRateTier, BitcoinFunctions, BitcoinInputUTXO, BitcoinInputUTXOWithOptionalScript, BitcoinOutputUTXO, BitcoinTx, Blockchain, BridgeableUiAsset, BtcDispatch, BtcSign, BtcSigner, BtcTransactionRequest, Caip10AccountId, Caip2ChainId, Chain, ChainAssetMap, CompletedTransfer, CreateTransferManagerOptions, DeepMutable, DestinationInfo, ERC_ZERO_ADDRESS, ETHEREUM_MAINNET_CHAIN, ETHEREUM_SEPOLIA_CHAIN, EVM_SERVICE_TYPES, Environment, Erc20Asset, ErrorCode, ErrorReason, EstimateNativeFeeOptions, EthereumChainIds, EvmChainId, EvmDispatch, EvmServiceInitializer, EvmSign, EvmSignBatch, EvmSignMessage, EvmSigner, EvmSignerWithMessage, EvmTransactionRequest, FEE_RATE_TIER_TO_BITCOIN, FailedTransfer, FeeRateTier, Fetch, GasSettings, GetBridgeableAssetsProps, GetMinimumTransferAmountProps, GetSupportedChainsResult, Hex, HttpError, InvalidParamsError, LombardServiceInitializer, MarkrServiceInitializer, Mutable, MutableGetSupportedChainsResult, NATIVE_AVAX, NATIVE_ETH, NATIVE_SOL_ADDRESS, NativeAsset, NativeFeeEstimate, Quote, QuoteFee, QuoteFeeFundingModel, QuoteFeeToken, QuoteFeeType, QuoteFees, QuoterDoneReason, QuoterEventArgs, QuoterEventHandler, QuoterInterface, QuoterProps, QuotesTuple, RefundedTransfer, ResponseValidationError, SOLANA_DEVNET_CHAIN, SOLANA_MAINNET_CHAIN, SdkError, ServiceInitializationError, ServiceInitializer, ServiceQuoteEventArgs, ServiceQuoteEventHandler, ServiceStatus, ServiceStatusBaseRecord, ServiceStatusErrorRecord, ServiceStatusInitializedRecord, ServiceStatusRecord, ServiceStatusUnsupportedEnvironmentRecord, ServiceType, ServiceUnavailableError, SolanaChainIds, SolanaSendOptions, SolanaSign, SolanaSigner, SolanaTransactionParams, SourceCompletedTransfer, SourcePendingTransfer, SplAsset, TargetPendingTransfer, TimeoutError, TokenType, TrackTransferProps, Transfer, TransferAssetProps, TransferBase, TransferManager, TransferManagerStatus, TransferManagerStatusServicesRecord, TransferService, TransferSignatureReason, TransferSourceProgress, TransferStatus, TransferStepDetails, TransferTargetProgress, TransferableAsset, caip2ToEip155ChainId, caip2ToEip155HexChainId, createTransferManager, eip155ChainIdToCaip2, isAbortedError, isCaip2ChainId, isEnvironment, isErc20Asset, isEvmBridgeInitializer, isHttpError, isInvalidParamsError, isLombardServiceInitializer, isMarkrServiceInitializer, isNativeAsset, isResponseValidationError, isSdkError, isServiceInitializationError, isServiceInitializer, isServiceUnavailableError, isSplAsset, isTimeoutError, parseTransfer, splitCaip2ChainId, stringifyTransfer };
package/dist/mod.d.ts CHANGED
@@ -4,7 +4,7 @@ import { Chain } from "./types/chain.js";
4
4
  import { FeeRateTier } from "./types/fee.js";
5
5
  import { AVALANCHE_FUJI_CHAIN, AVALANCHE_MAINNET_CHAIN, AvalancheChainIds, BITCOIN_MAINNET_CHAIN, BITCOIN_TESTNET_CHAIN, BTC_SERVICE_TYPES, BitcoinChainIds, Blockchain, ERC_ZERO_ADDRESS, ETHEREUM_MAINNET_CHAIN, ETHEREUM_SEPOLIA_CHAIN, EVM_SERVICE_TYPES, Environment, EthereumChainIds, EvmChainId, FEE_RATE_TIER_TO_BITCOIN, NATIVE_AVAX, NATIVE_ETH, NATIVE_SOL_ADDRESS, SOLANA_DEVNET_CHAIN, SOLANA_MAINNET_CHAIN, ServiceType, SolanaChainIds, TokenType, TransferSignatureReason } from "./constants.js";
6
6
  import { Asset, BridgeableUiAsset, ChainAssetMap, DestinationInfo, Erc20Asset, NativeAsset, SplAsset, TransferableAsset } from "./types/asset.js";
7
- import { Quote, QuoteFee, QuoteFeeToken, QuoteFeeType, QuoteFees, QuoterDoneReason, QuoterEventArgs, QuoterEventHandler, QuoterInterface, QuoterProps, QuotesTuple, ServiceQuoteEventArgs, ServiceQuoteEventHandler } from "./types/quote.js";
7
+ import { Quote, QuoteFee, QuoteFeeFundingModel, QuoteFeeToken, QuoteFeeType, QuoteFees, QuoterDoneReason, QuoterEventArgs, QuoterEventHandler, QuoterInterface, QuoterProps, QuotesTuple, ServiceQuoteEventArgs, ServiceQuoteEventHandler } from "./types/quote.js";
8
8
  import { AbortedError, ErrorCode, ErrorReason, HttpError, InvalidParamsError, ResponseValidationError, SdkError, ServiceInitializationError, ServiceUnavailableError, TimeoutError, isAbortedError, isHttpError, isInvalidParamsError, isResponseValidationError, isSdkError, isServiceInitializationError, isServiceUnavailableError, isTimeoutError } from "./errors.js";
9
9
  import { CompletedTransfer, FailedTransfer, RefundedTransfer, SourceCompletedTransfer, SourcePendingTransfer, TargetPendingTransfer, Transfer, TransferBase, TransferSourceProgress, TransferStatus, TransferStepDetails, TransferTargetProgress } from "./types/transfer.js";
10
10
  import { SolanaSendOptions, SolanaTransactionParams } from "./utils/solana-transaction.js";
@@ -16,4 +16,4 @@ import { isEnvironment, isErc20Asset, isEvmBridgeInitializer, isLombardServiceIn
16
16
  import { createTransferManager } from "./transfer-manager.js";
17
17
  import { caip2ToEip155ChainId, caip2ToEip155HexChainId, eip155ChainIdToCaip2, isCaip2ChainId, splitCaip2ChainId } from "./utils/caip.js";
18
18
  import { parseTransfer, stringifyTransfer } from "./utils/transfer-utils.js";
19
- export { AVALANCHE_FUJI_CHAIN, AVALANCHE_MAINNET_CHAIN, AbortedError, ArrayElement, Asset, AssetBridgeMap, AvalancheChainIds, BITCOIN_MAINNET_CHAIN, BITCOIN_TESTNET_CHAIN, BTC_SERVICE_TYPES, BitcoinChainIds, BitcoinFeeRateTier, BitcoinFunctions, BitcoinInputUTXO, BitcoinInputUTXOWithOptionalScript, BitcoinOutputUTXO, BitcoinTx, Blockchain, BridgeableUiAsset, BtcDispatch, BtcSign, BtcSigner, BtcTransactionRequest, Caip10AccountId, Caip2ChainId, Chain, ChainAssetMap, CompletedTransfer, CreateTransferManagerOptions, DeepMutable, DestinationInfo, ERC_ZERO_ADDRESS, ETHEREUM_MAINNET_CHAIN, ETHEREUM_SEPOLIA_CHAIN, EVM_SERVICE_TYPES, Environment, Erc20Asset, ErrorCode, ErrorReason, EstimateNativeFeeOptions, EthereumChainIds, EvmChainId, EvmDispatch, EvmServiceInitializer, EvmSign, EvmSignBatch, EvmSignMessage, EvmSigner, EvmSignerWithMessage, EvmTransactionRequest, FEE_RATE_TIER_TO_BITCOIN, FailedTransfer, FeeRateTier, Fetch, GasSettings, GetBridgeableAssetsProps, GetMinimumTransferAmountProps, GetSupportedChainsResult, Hex, HttpError, InvalidParamsError, LombardServiceInitializer, MarkrServiceInitializer, Mutable, MutableGetSupportedChainsResult, NATIVE_AVAX, NATIVE_ETH, NATIVE_SOL_ADDRESS, NativeAsset, NativeFeeEstimate, Quote, QuoteFee, QuoteFeeToken, QuoteFeeType, QuoteFees, QuoterDoneReason, QuoterEventArgs, QuoterEventHandler, QuoterInterface, QuoterProps, QuotesTuple, RefundedTransfer, ResponseValidationError, SOLANA_DEVNET_CHAIN, SOLANA_MAINNET_CHAIN, SdkError, ServiceInitializationError, ServiceInitializer, ServiceQuoteEventArgs, ServiceQuoteEventHandler, ServiceStatus, ServiceStatusBaseRecord, ServiceStatusErrorRecord, ServiceStatusInitializedRecord, ServiceStatusRecord, ServiceStatusUnsupportedEnvironmentRecord, ServiceType, ServiceUnavailableError, SolanaChainIds, SolanaSendOptions, SolanaSign, SolanaSigner, SolanaTransactionParams, SourceCompletedTransfer, SourcePendingTransfer, SplAsset, TargetPendingTransfer, TimeoutError, TokenType, TrackTransferProps, Transfer, TransferAssetProps, TransferBase, TransferManager, TransferManagerStatus, TransferManagerStatusServicesRecord, TransferService, TransferSignatureReason, TransferSourceProgress, TransferStatus, TransferStepDetails, TransferTargetProgress, TransferableAsset, caip2ToEip155ChainId, caip2ToEip155HexChainId, createTransferManager, eip155ChainIdToCaip2, isAbortedError, isCaip2ChainId, isEnvironment, isErc20Asset, isEvmBridgeInitializer, isHttpError, isInvalidParamsError, isLombardServiceInitializer, isMarkrServiceInitializer, isNativeAsset, isResponseValidationError, isSdkError, isServiceInitializationError, isServiceInitializer, isServiceUnavailableError, isSplAsset, isTimeoutError, parseTransfer, splitCaip2ChainId, stringifyTransfer };
19
+ export { AVALANCHE_FUJI_CHAIN, AVALANCHE_MAINNET_CHAIN, AbortedError, ArrayElement, Asset, AssetBridgeMap, AvalancheChainIds, BITCOIN_MAINNET_CHAIN, BITCOIN_TESTNET_CHAIN, BTC_SERVICE_TYPES, BitcoinChainIds, BitcoinFeeRateTier, BitcoinFunctions, BitcoinInputUTXO, BitcoinInputUTXOWithOptionalScript, BitcoinOutputUTXO, BitcoinTx, Blockchain, BridgeableUiAsset, BtcDispatch, BtcSign, BtcSigner, BtcTransactionRequest, Caip10AccountId, Caip2ChainId, Chain, ChainAssetMap, CompletedTransfer, CreateTransferManagerOptions, DeepMutable, DestinationInfo, ERC_ZERO_ADDRESS, ETHEREUM_MAINNET_CHAIN, ETHEREUM_SEPOLIA_CHAIN, EVM_SERVICE_TYPES, Environment, Erc20Asset, ErrorCode, ErrorReason, EstimateNativeFeeOptions, EthereumChainIds, EvmChainId, EvmDispatch, EvmServiceInitializer, EvmSign, EvmSignBatch, EvmSignMessage, EvmSigner, EvmSignerWithMessage, EvmTransactionRequest, FEE_RATE_TIER_TO_BITCOIN, FailedTransfer, FeeRateTier, Fetch, GasSettings, GetBridgeableAssetsProps, GetMinimumTransferAmountProps, GetSupportedChainsResult, Hex, HttpError, InvalidParamsError, LombardServiceInitializer, MarkrServiceInitializer, Mutable, MutableGetSupportedChainsResult, NATIVE_AVAX, NATIVE_ETH, NATIVE_SOL_ADDRESS, NativeAsset, NativeFeeEstimate, Quote, QuoteFee, QuoteFeeFundingModel, QuoteFeeToken, QuoteFeeType, QuoteFees, QuoterDoneReason, QuoterEventArgs, QuoterEventHandler, QuoterInterface, QuoterProps, QuotesTuple, RefundedTransfer, ResponseValidationError, SOLANA_DEVNET_CHAIN, SOLANA_MAINNET_CHAIN, SdkError, ServiceInitializationError, ServiceInitializer, ServiceQuoteEventArgs, ServiceQuoteEventHandler, ServiceStatus, ServiceStatusBaseRecord, ServiceStatusErrorRecord, ServiceStatusInitializedRecord, ServiceStatusRecord, ServiceStatusUnsupportedEnvironmentRecord, ServiceType, ServiceUnavailableError, SolanaChainIds, SolanaSendOptions, SolanaSign, SolanaSigner, SolanaTransactionParams, SourceCompletedTransfer, SourcePendingTransfer, SplAsset, TargetPendingTransfer, TimeoutError, TokenType, TrackTransferProps, Transfer, TransferAssetProps, TransferBase, TransferManager, TransferManagerStatus, TransferManagerStatusServicesRecord, TransferService, TransferSignatureReason, TransferSourceProgress, TransferStatus, TransferStepDetails, TransferTargetProgress, TransferableAsset, caip2ToEip155ChainId, caip2ToEip155HexChainId, createTransferManager, eip155ChainIdToCaip2, isAbortedError, isCaip2ChainId, isEnvironment, isErc20Asset, isEvmBridgeInitializer, isHttpError, isInvalidParamsError, isLombardServiceInitializer, isMarkrServiceInitializer, isNativeAsset, isResponseValidationError, isSdkError, isServiceInitializationError, isServiceInitializer, isServiceUnavailableError, isSplAsset, isTimeoutError, parseTransfer, splitCaip2ChainId, stringifyTransfer };
@@ -1,2 +1,2 @@
1
- require(`../../../_virtual/_rolldown/runtime.cjs`);const e=require(`../../../constants.cjs`),t=require(`../../../errors.cjs`),n=require(`../_utils/validations.cjs`),r=require(`./analyze-support.cjs`),i=require(`../_utils/fee.cjs`),a=require(`./get-minimum-transfer-amount.cjs`),o=require(`../../../utils/quote-fees.cjs`);let s=require(`viem`);function c({config:c,feeEstimationMultiplier:l,serviceAssets:u}){let d=r.analyzeSupportFactory({serviceAssets:u});return({amount:r,fromAddress:u,slippageBps:f,sourceAsset:p,sourceChain:m,targetAsset:h,targetChain:g,toAddress:_},v)=>{let y=new AbortController,b=()=>{y.abort()},x=d({sourceAsset:p,sourceChainId:m.chainId,targetAsset:h,targetChainId:g.chainId});if(!((0,s.isAddress)(u)&&(0,s.isAddress)(_))||!x)return y.signal.aborted||(v(`error`,new t.InvalidParamsError(t.ErrorReason.INVALID_PARAMS,`Invalid addresses, assets, or chains provided.`)),v(`done`)),{cancel:b};try{n.validateTransferAddressesOrThrow(u,_),n.validateTransferAddressesNotBlockedOrThrow([u,_],c.addressBlocklist)}catch{return y.signal.aborted||(v(`error`,new t.InvalidParamsError(t.ErrorReason.INVALID_PARAMS,`Transfer addresses are not equal or blocked.`)),v(`done`)),{cancel:b}}return(async()=>{let n=await a.calculateMinimumTransferAmount({sourceAsset:p,sourceChainId:m.chainId,targetAsset:h,targetChainId:g.chainId},c)*l;if(r<n)y.signal.aborted||(v(`error`,new t.InvalidParamsError(t.ErrorReason.INVALID_PARAMS,`Transfer amount is below the minimum transfer amount of ${n.toString()}`)),v(`done`));else{let[t]=i.getFee({amountIn:r,evmConfig:c,sourceAsset:p,sourceChainId:m.chainId,targetChainId:g.chainId}),n={aggregator:{name:`Avalanche Bridge™`,id:`avalanche-bridge-evm`},amountIn:r,amountOut:r-t,assetIn:p,assetOut:h,expiresAt:Math.floor(Date.now()/1e3)+60,fees:[{type:`bridge`,name:`Bridge Fee`,amount:t,chainId:m.chainId,token:o.assetToQuoteFeeToken(p)}],fromAddress:u,id:crypto.randomUUID(),partnerFeeBps:null,serviceType:e.ServiceType.AVALANCHE_EVM,slippageBps:f??0,sourceChain:m,targetChain:g,toAddress:_};y.signal.aborted||(v(`quote`,n),v(`done`))}})().catch(e=>{y.signal.aborted||(v(`error`,new t.SdkError(t.ErrorReason.UNKNOWN,t.ErrorCode.UNKNOWN,{cause:e,details:`Failed to stream quotes`})),v(`done`))}),{cancel:b}}}exports.streamQuotesFactory=c;
1
+ require(`../../../_virtual/_rolldown/runtime.cjs`);const e=require(`../../../constants.cjs`),t=require(`../../../errors.cjs`),n=require(`../_utils/validations.cjs`),r=require(`./analyze-support.cjs`),i=require(`../_utils/fee.cjs`),a=require(`./get-minimum-transfer-amount.cjs`),o=require(`../../../utils/quote-fees.cjs`);let s=require(`viem`);function c({config:c,feeEstimationMultiplier:l,serviceAssets:u}){let d=r.analyzeSupportFactory({serviceAssets:u});return({amount:r,fromAddress:u,slippageBps:f,sourceAsset:p,sourceChain:m,targetAsset:h,targetChain:g,toAddress:_},v)=>{let y=new AbortController,b=()=>{y.abort()},x=d({sourceAsset:p,sourceChainId:m.chainId,targetAsset:h,targetChainId:g.chainId});if(!((0,s.isAddress)(u)&&(0,s.isAddress)(_))||!x)return y.signal.aborted||(v(`error`,new t.InvalidParamsError(t.ErrorReason.INVALID_PARAMS,`Invalid addresses, assets, or chains provided.`)),v(`done`)),{cancel:b};try{n.validateTransferAddressesOrThrow(u,_),n.validateTransferAddressesNotBlockedOrThrow([u,_],c.addressBlocklist)}catch{return y.signal.aborted||(v(`error`,new t.InvalidParamsError(t.ErrorReason.INVALID_PARAMS,`Transfer addresses are not equal or blocked.`)),v(`done`)),{cancel:b}}return(async()=>{let n=await a.calculateMinimumTransferAmount({sourceAsset:p,sourceChainId:m.chainId,targetAsset:h,targetChainId:g.chainId},c)*l;if(r<n)y.signal.aborted||(v(`error`,new t.InvalidParamsError(t.ErrorReason.INVALID_PARAMS,`Transfer amount is below the minimum transfer amount of ${n.toString()}`)),v(`done`));else{let[t]=i.getFee({amountIn:r,evmConfig:c,sourceAsset:p,sourceChainId:m.chainId,targetChainId:g.chainId}),n={aggregator:{name:`Avalanche Bridge™`,id:`avalanche-bridge-evm`},amountIn:r,amountOut:r-t,assetIn:p,assetOut:h,expiresAt:Math.floor(Date.now()/1e3)+60,fees:[{type:`bridge`,fundingModel:`included`,name:`Bridge Fee`,amount:t,chainId:m.chainId,token:o.assetToQuoteFeeToken(p)}],fromAddress:u,id:crypto.randomUUID(),partnerFeeBps:null,serviceType:e.ServiceType.AVALANCHE_EVM,slippageBps:f??0,sourceChain:m,targetChain:g,toAddress:_};y.signal.aborted||(v(`quote`,n),v(`done`))}})().catch(e=>{y.signal.aborted||(v(`error`,new t.SdkError(t.ErrorReason.UNKNOWN,t.ErrorCode.UNKNOWN,{cause:e,details:`Failed to stream quotes`})),v(`done`))}),{cancel:b}}}exports.streamQuotesFactory=c;
2
2
  //# sourceMappingURL=stream-quotes.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"stream-quotes.cjs","names":["analyzeSupportFactory","InvalidParamsError","ErrorReason","calculateMinimumTransferAmount","getFee","assetToQuoteFeeToken","ServiceType","SdkError","ErrorCode"],"sources":["../../../../src/transfer-service/avalanche-evm/_handlers/stream-quotes.ts"],"sourcesContent":["import { ServiceType } from '../../../constants';\nimport { ErrorCode, ErrorReason, InvalidParamsError, SdkError } from '../../../errors';\nimport type { ChainAssetMap } from '../../../types/asset';\nimport type { Quote } from '../../../types/quote';\nimport type { TransferService } from '../../../types/service';\nimport type { Mutable } from '../../../types/utility-types';\nimport { isAddress } from 'viem';\nimport { validateTransferAddressesNotBlockedOrThrow, validateTransferAddressesOrThrow } from '../_utils/validations';\nimport type { EvmConfig } from '../_types';\nimport { analyzeSupportFactory } from './analyze-support';\nimport { calculateMinimumTransferAmount } from './get-minimum-transfer-amount';\nimport { getFee } from '../_utils/fee';\nimport { assetToQuoteFeeToken } from '../../../utils/quote-fees';\n\nexport interface StreamQuotesFactoryConfig {\n config: EvmConfig;\n feeEstimationMultiplier: bigint;\n serviceAssets: ChainAssetMap;\n}\n\nexport function streamQuotesFactory({\n config,\n feeEstimationMultiplier,\n serviceAssets,\n}: StreamQuotesFactoryConfig): TransferService['streamQuotes'] {\n const analyzeSupport = analyzeSupportFactory({ serviceAssets });\n\n return (\n { amount, fromAddress, slippageBps, sourceAsset, sourceChain, targetAsset, targetChain, toAddress },\n handler,\n ) => {\n const ac = new AbortController();\n const cancel = () => {\n ac.abort();\n };\n\n const hasValidAssetsAndChains = analyzeSupport({\n sourceAsset,\n sourceChainId: sourceChain.chainId,\n targetAsset,\n targetChainId: targetChain.chainId,\n });\n\n // Validate to/from addresses are EVM.\n // Verify assets and chains are supported.\n if (!(isAddress(fromAddress) && isAddress(toAddress)) || !hasValidAssetsAndChains) {\n if (!ac.signal.aborted) {\n handler(\n 'error',\n new InvalidParamsError(ErrorReason.INVALID_PARAMS, 'Invalid addresses, assets, or chains provided.'),\n );\n handler('done');\n }\n\n return { cancel };\n }\n\n // Validate addresses match and are not block listed.\n try {\n validateTransferAddressesOrThrow(fromAddress, toAddress);\n validateTransferAddressesNotBlockedOrThrow([fromAddress, toAddress], config.addressBlocklist);\n } catch {\n if (!ac.signal.aborted) {\n handler(\n 'error',\n new InvalidParamsError(ErrorReason.INVALID_PARAMS, 'Transfer addresses are not equal or blocked.'),\n );\n handler('done');\n }\n\n return { cancel };\n }\n\n (async () => {\n // Validate minimum transfer amount\n const minimumAmount = await calculateMinimumTransferAmount(\n {\n sourceAsset,\n sourceChainId: sourceChain.chainId,\n targetAsset,\n targetChainId: targetChain.chainId,\n },\n config,\n );\n\n const minimumTransferAmount = minimumAmount * feeEstimationMultiplier;\n\n if (amount < minimumTransferAmount) {\n if (!ac.signal.aborted) {\n handler(\n 'error',\n new InvalidParamsError(\n ErrorReason.INVALID_PARAMS,\n `Transfer amount is below the minimum transfer amount of ${minimumTransferAmount.toString()}`,\n ),\n );\n handler('done');\n }\n } else {\n const [fee] = getFee({\n amountIn: amount,\n evmConfig: config,\n sourceAsset,\n sourceChainId: sourceChain.chainId,\n targetChainId: targetChain.chainId,\n });\n\n // Create a quote.\n const quote: Mutable<Quote> = {\n aggregator: {\n name: 'Avalanche Bridge™',\n id: 'avalanche-bridge-evm',\n },\n amountIn: amount,\n amountOut: amount - fee,\n assetIn: sourceAsset,\n assetOut: targetAsset,\n // Set the expiration further out since the amountOut isn't expected to change\n // since the Warden config data isn't refreshed. The only expected change would be estimated gas.\n expiresAt: Math.floor(Date.now() / 1_000) + 60,\n fees: [\n {\n type: 'bridge',\n name: 'Bridge Fee',\n amount: fee,\n chainId: sourceChain.chainId,\n token: assetToQuoteFeeToken(sourceAsset),\n },\n ],\n fromAddress,\n id: crypto.randomUUID(),\n partnerFeeBps: null,\n serviceType: ServiceType.AVALANCHE_EVM,\n slippageBps: slippageBps ?? 0,\n sourceChain,\n targetChain,\n toAddress,\n };\n\n if (!ac.signal.aborted) {\n handler('quote', quote);\n handler('done');\n }\n }\n })().catch((error) => {\n if (!ac.signal.aborted) {\n handler(\n 'error',\n new SdkError(ErrorReason.UNKNOWN, ErrorCode.UNKNOWN, { cause: error, details: 'Failed to stream quotes' }),\n );\n handler('done');\n }\n });\n\n return {\n cancel,\n };\n };\n}\n"],"mappings":"uVAoBA,SAAgB,EAAoB,CAClC,SACA,0BACA,iBAC6D,CAC7D,IAAM,EAAiBA,EAAAA,sBAAsB,CAAE,gBAAe,CAAC,CAE/D,OACE,CAAE,SAAQ,cAAa,cAAa,cAAa,cAAa,cAAa,cAAa,aACxF,IACG,CACH,IAAM,EAAK,IAAI,gBACT,MAAe,CACnB,EAAG,OAAO,EAGN,EAA0B,EAAe,CAC7C,cACA,cAAe,EAAY,QAC3B,cACA,cAAe,EAAY,QAC5B,CAAC,CAIF,GAAI,GAAA,EAAA,EAAA,WAAY,EAAY,GAAA,EAAA,EAAA,WAAc,EAAU,GAAK,CAAC,EASxD,OARK,EAAG,OAAO,UACb,EACE,QACA,IAAIC,EAAAA,mBAAmBC,EAAAA,YAAY,eAAgB,iDAAiD,CACrG,CACD,EAAQ,OAAO,EAGV,CAAE,SAAQ,CAInB,GAAI,CACF,EAAA,iCAAiC,EAAa,EAAU,CACxD,EAAA,2CAA2C,CAAC,EAAa,EAAU,CAAE,EAAO,iBAAiB,MACvF,CASN,OARK,EAAG,OAAO,UACb,EACE,QACA,IAAID,EAAAA,mBAAmBC,EAAAA,YAAY,eAAgB,+CAA+C,CACnG,CACD,EAAQ,OAAO,EAGV,CAAE,SAAQ,CAoFnB,OAjFC,SAAY,CAYX,IAAM,EAVgB,MAAMC,EAAAA,+BAC1B,CACE,cACA,cAAe,EAAY,QAC3B,cACA,cAAe,EAAY,QAC5B,CACD,EACD,CAE6C,EAE9C,GAAI,EAAS,EACN,EAAG,OAAO,UACb,EACE,QACA,IAAIF,EAAAA,mBACFC,EAAAA,YAAY,eACZ,2DAA2D,EAAsB,UAAU,GAC5F,CACF,CACD,EAAQ,OAAO,MAEZ,CACL,GAAM,CAAC,GAAOE,EAAAA,OAAO,CACnB,SAAU,EACV,UAAW,EACX,cACA,cAAe,EAAY,QAC3B,cAAe,EAAY,QAC5B,CAAC,CAGI,EAAwB,CAC5B,WAAY,CACV,KAAM,oBACN,GAAI,uBACL,CACD,SAAU,EACV,UAAW,EAAS,EACpB,QAAS,EACT,SAAU,EAGV,UAAW,KAAK,MAAM,KAAK,KAAK,CAAG,IAAM,CAAG,GAC5C,KAAM,CACJ,CACE,KAAM,SACN,KAAM,aACN,OAAQ,EACR,QAAS,EAAY,QACrB,MAAOC,EAAAA,qBAAqB,EAAY,CACzC,CACF,CACD,cACA,GAAI,OAAO,YAAY,CACvB,cAAe,KACf,YAAaC,EAAAA,YAAY,cACzB,YAAa,GAAe,EAC5B,cACA,cACA,YACD,CAEI,EAAG,OAAO,UACb,EAAQ,QAAS,EAAM,CACvB,EAAQ,OAAO,MAGjB,CAAC,MAAO,GAAU,CACf,EAAG,OAAO,UACb,EACE,QACA,IAAIC,EAAAA,SAASL,EAAAA,YAAY,QAASM,EAAAA,UAAU,QAAS,CAAE,MAAO,EAAO,QAAS,0BAA2B,CAAC,CAC3G,CACD,EAAQ,OAAO,GAEjB,CAEK,CACL,SACD"}
1
+ {"version":3,"file":"stream-quotes.cjs","names":["analyzeSupportFactory","InvalidParamsError","ErrorReason","calculateMinimumTransferAmount","getFee","assetToQuoteFeeToken","ServiceType","SdkError","ErrorCode"],"sources":["../../../../src/transfer-service/avalanche-evm/_handlers/stream-quotes.ts"],"sourcesContent":["import { ServiceType } from '../../../constants';\nimport { ErrorCode, ErrorReason, InvalidParamsError, SdkError } from '../../../errors';\nimport type { ChainAssetMap } from '../../../types/asset';\nimport type { Quote } from '../../../types/quote';\nimport type { TransferService } from '../../../types/service';\nimport type { Mutable } from '../../../types/utility-types';\nimport { isAddress } from 'viem';\nimport { validateTransferAddressesNotBlockedOrThrow, validateTransferAddressesOrThrow } from '../_utils/validations';\nimport type { EvmConfig } from '../_types';\nimport { analyzeSupportFactory } from './analyze-support';\nimport { calculateMinimumTransferAmount } from './get-minimum-transfer-amount';\nimport { getFee } from '../_utils/fee';\nimport { assetToQuoteFeeToken } from '../../../utils/quote-fees';\n\nexport interface StreamQuotesFactoryConfig {\n config: EvmConfig;\n feeEstimationMultiplier: bigint;\n serviceAssets: ChainAssetMap;\n}\n\nexport function streamQuotesFactory({\n config,\n feeEstimationMultiplier,\n serviceAssets,\n}: StreamQuotesFactoryConfig): TransferService['streamQuotes'] {\n const analyzeSupport = analyzeSupportFactory({ serviceAssets });\n\n return (\n { amount, fromAddress, slippageBps, sourceAsset, sourceChain, targetAsset, targetChain, toAddress },\n handler,\n ) => {\n const ac = new AbortController();\n const cancel = () => {\n ac.abort();\n };\n\n const hasValidAssetsAndChains = analyzeSupport({\n sourceAsset,\n sourceChainId: sourceChain.chainId,\n targetAsset,\n targetChainId: targetChain.chainId,\n });\n\n // Validate to/from addresses are EVM.\n // Verify assets and chains are supported.\n if (!(isAddress(fromAddress) && isAddress(toAddress)) || !hasValidAssetsAndChains) {\n if (!ac.signal.aborted) {\n handler(\n 'error',\n new InvalidParamsError(ErrorReason.INVALID_PARAMS, 'Invalid addresses, assets, or chains provided.'),\n );\n handler('done');\n }\n\n return { cancel };\n }\n\n // Validate addresses match and are not block listed.\n try {\n validateTransferAddressesOrThrow(fromAddress, toAddress);\n validateTransferAddressesNotBlockedOrThrow([fromAddress, toAddress], config.addressBlocklist);\n } catch {\n if (!ac.signal.aborted) {\n handler(\n 'error',\n new InvalidParamsError(ErrorReason.INVALID_PARAMS, 'Transfer addresses are not equal or blocked.'),\n );\n handler('done');\n }\n\n return { cancel };\n }\n\n (async () => {\n // Validate minimum transfer amount\n const minimumAmount = await calculateMinimumTransferAmount(\n {\n sourceAsset,\n sourceChainId: sourceChain.chainId,\n targetAsset,\n targetChainId: targetChain.chainId,\n },\n config,\n );\n\n const minimumTransferAmount = minimumAmount * feeEstimationMultiplier;\n\n if (amount < minimumTransferAmount) {\n if (!ac.signal.aborted) {\n handler(\n 'error',\n new InvalidParamsError(\n ErrorReason.INVALID_PARAMS,\n `Transfer amount is below the minimum transfer amount of ${minimumTransferAmount.toString()}`,\n ),\n );\n handler('done');\n }\n } else {\n const [fee] = getFee({\n amountIn: amount,\n evmConfig: config,\n sourceAsset,\n sourceChainId: sourceChain.chainId,\n targetChainId: targetChain.chainId,\n });\n\n // Create a quote.\n const quote: Mutable<Quote> = {\n aggregator: {\n name: 'Avalanche Bridge™',\n id: 'avalanche-bridge-evm',\n },\n amountIn: amount,\n amountOut: amount - fee,\n assetIn: sourceAsset,\n assetOut: targetAsset,\n // Set the expiration further out since the amountOut isn't expected to change\n // since the Warden config data isn't refreshed. The only expected change would be estimated gas.\n expiresAt: Math.floor(Date.now() / 1_000) + 60,\n fees: [\n {\n type: 'bridge',\n fundingModel: 'included',\n name: 'Bridge Fee',\n amount: fee,\n chainId: sourceChain.chainId,\n token: assetToQuoteFeeToken(sourceAsset),\n },\n ],\n fromAddress,\n id: crypto.randomUUID(),\n partnerFeeBps: null,\n serviceType: ServiceType.AVALANCHE_EVM,\n slippageBps: slippageBps ?? 0,\n sourceChain,\n targetChain,\n toAddress,\n };\n\n if (!ac.signal.aborted) {\n handler('quote', quote);\n handler('done');\n }\n }\n })().catch((error) => {\n if (!ac.signal.aborted) {\n handler(\n 'error',\n new SdkError(ErrorReason.UNKNOWN, ErrorCode.UNKNOWN, { cause: error, details: 'Failed to stream quotes' }),\n );\n handler('done');\n }\n });\n\n return {\n cancel,\n };\n };\n}\n"],"mappings":"uVAoBA,SAAgB,EAAoB,CAClC,SACA,0BACA,iBAC6D,CAC7D,IAAM,EAAiBA,EAAAA,sBAAsB,CAAE,gBAAe,CAAC,CAE/D,OACE,CAAE,SAAQ,cAAa,cAAa,cAAa,cAAa,cAAa,cAAa,aACxF,IACG,CACH,IAAM,EAAK,IAAI,gBACT,MAAe,CACnB,EAAG,OAAO,EAGN,EAA0B,EAAe,CAC7C,cACA,cAAe,EAAY,QAC3B,cACA,cAAe,EAAY,QAC5B,CAAC,CAIF,GAAI,GAAA,EAAA,EAAA,WAAY,EAAY,GAAA,EAAA,EAAA,WAAc,EAAU,GAAK,CAAC,EASxD,OARK,EAAG,OAAO,UACb,EACE,QACA,IAAIC,EAAAA,mBAAmBC,EAAAA,YAAY,eAAgB,iDAAiD,CACrG,CACD,EAAQ,OAAO,EAGV,CAAE,SAAQ,CAInB,GAAI,CACF,EAAA,iCAAiC,EAAa,EAAU,CACxD,EAAA,2CAA2C,CAAC,EAAa,EAAU,CAAE,EAAO,iBAAiB,MACvF,CASN,OARK,EAAG,OAAO,UACb,EACE,QACA,IAAID,EAAAA,mBAAmBC,EAAAA,YAAY,eAAgB,+CAA+C,CACnG,CACD,EAAQ,OAAO,EAGV,CAAE,SAAQ,CAqFnB,OAlFC,SAAY,CAYX,IAAM,EAVgB,MAAMC,EAAAA,+BAC1B,CACE,cACA,cAAe,EAAY,QAC3B,cACA,cAAe,EAAY,QAC5B,CACD,EACD,CAE6C,EAE9C,GAAI,EAAS,EACN,EAAG,OAAO,UACb,EACE,QACA,IAAIF,EAAAA,mBACFC,EAAAA,YAAY,eACZ,2DAA2D,EAAsB,UAAU,GAC5F,CACF,CACD,EAAQ,OAAO,MAEZ,CACL,GAAM,CAAC,GAAOE,EAAAA,OAAO,CACnB,SAAU,EACV,UAAW,EACX,cACA,cAAe,EAAY,QAC3B,cAAe,EAAY,QAC5B,CAAC,CAGI,EAAwB,CAC5B,WAAY,CACV,KAAM,oBACN,GAAI,uBACL,CACD,SAAU,EACV,UAAW,EAAS,EACpB,QAAS,EACT,SAAU,EAGV,UAAW,KAAK,MAAM,KAAK,KAAK,CAAG,IAAM,CAAG,GAC5C,KAAM,CACJ,CACE,KAAM,SACN,aAAc,WACd,KAAM,aACN,OAAQ,EACR,QAAS,EAAY,QACrB,MAAOC,EAAAA,qBAAqB,EAAY,CACzC,CACF,CACD,cACA,GAAI,OAAO,YAAY,CACvB,cAAe,KACf,YAAaC,EAAAA,YAAY,cACzB,YAAa,GAAe,EAC5B,cACA,cACA,YACD,CAEI,EAAG,OAAO,UACb,EAAQ,QAAS,EAAM,CACvB,EAAQ,OAAO,MAGjB,CAAC,MAAO,GAAU,CACf,EAAG,OAAO,UACb,EACE,QACA,IAAIC,EAAAA,SAASL,EAAAA,YAAY,QAASM,EAAAA,UAAU,QAAS,CAAE,MAAO,EAAO,QAAS,0BAA2B,CAAC,CAC3G,CACD,EAAQ,OAAO,GAEjB,CAEK,CACL,SACD"}
@@ -1,2 +1,2 @@
1
- import{ServiceType as e}from"../../../constants.js";import{ErrorCode as t,ErrorReason as n,InvalidParamsError as r,SdkError as i}from"../../../errors.js";import{validateTransferAddressesNotBlockedOrThrow as a,validateTransferAddressesOrThrow as o}from"../_utils/validations.js";import{analyzeSupportFactory as s}from"./analyze-support.js";import{getFee as c}from"../_utils/fee.js";import{calculateMinimumTransferAmount as l}from"./get-minimum-transfer-amount.js";import{assetToQuoteFeeToken as u}from"../../../utils/quote-fees.js";import{isAddress as d}from"viem";function f({config:f,feeEstimationMultiplier:p,serviceAssets:m}){let h=s({serviceAssets:m});return({amount:s,fromAddress:m,slippageBps:g,sourceAsset:_,sourceChain:v,targetAsset:y,targetChain:b,toAddress:x},S)=>{let C=new AbortController,w=()=>{C.abort()},T=h({sourceAsset:_,sourceChainId:v.chainId,targetAsset:y,targetChainId:b.chainId});if(!(d(m)&&d(x))||!T)return C.signal.aborted||(S(`error`,new r(n.INVALID_PARAMS,`Invalid addresses, assets, or chains provided.`)),S(`done`)),{cancel:w};try{o(m,x),a([m,x],f.addressBlocklist)}catch{return C.signal.aborted||(S(`error`,new r(n.INVALID_PARAMS,`Transfer addresses are not equal or blocked.`)),S(`done`)),{cancel:w}}return(async()=>{let t=await l({sourceAsset:_,sourceChainId:v.chainId,targetAsset:y,targetChainId:b.chainId},f)*p;if(s<t)C.signal.aborted||(S(`error`,new r(n.INVALID_PARAMS,`Transfer amount is below the minimum transfer amount of ${t.toString()}`)),S(`done`));else{let[t]=c({amountIn:s,evmConfig:f,sourceAsset:_,sourceChainId:v.chainId,targetChainId:b.chainId}),n={aggregator:{name:`Avalanche Bridge™`,id:`avalanche-bridge-evm`},amountIn:s,amountOut:s-t,assetIn:_,assetOut:y,expiresAt:Math.floor(Date.now()/1e3)+60,fees:[{type:`bridge`,name:`Bridge Fee`,amount:t,chainId:v.chainId,token:u(_)}],fromAddress:m,id:crypto.randomUUID(),partnerFeeBps:null,serviceType:e.AVALANCHE_EVM,slippageBps:g??0,sourceChain:v,targetChain:b,toAddress:x};C.signal.aborted||(S(`quote`,n),S(`done`))}})().catch(e=>{C.signal.aborted||(S(`error`,new i(n.UNKNOWN,t.UNKNOWN,{cause:e,details:`Failed to stream quotes`})),S(`done`))}),{cancel:w}}}export{f as streamQuotesFactory};
1
+ import{ServiceType as e}from"../../../constants.js";import{ErrorCode as t,ErrorReason as n,InvalidParamsError as r,SdkError as i}from"../../../errors.js";import{validateTransferAddressesNotBlockedOrThrow as a,validateTransferAddressesOrThrow as o}from"../_utils/validations.js";import{analyzeSupportFactory as s}from"./analyze-support.js";import{getFee as c}from"../_utils/fee.js";import{calculateMinimumTransferAmount as l}from"./get-minimum-transfer-amount.js";import{assetToQuoteFeeToken as u}from"../../../utils/quote-fees.js";import{isAddress as d}from"viem";function f({config:f,feeEstimationMultiplier:p,serviceAssets:m}){let h=s({serviceAssets:m});return({amount:s,fromAddress:m,slippageBps:g,sourceAsset:_,sourceChain:v,targetAsset:y,targetChain:b,toAddress:x},S)=>{let C=new AbortController,w=()=>{C.abort()},T=h({sourceAsset:_,sourceChainId:v.chainId,targetAsset:y,targetChainId:b.chainId});if(!(d(m)&&d(x))||!T)return C.signal.aborted||(S(`error`,new r(n.INVALID_PARAMS,`Invalid addresses, assets, or chains provided.`)),S(`done`)),{cancel:w};try{o(m,x),a([m,x],f.addressBlocklist)}catch{return C.signal.aborted||(S(`error`,new r(n.INVALID_PARAMS,`Transfer addresses are not equal or blocked.`)),S(`done`)),{cancel:w}}return(async()=>{let t=await l({sourceAsset:_,sourceChainId:v.chainId,targetAsset:y,targetChainId:b.chainId},f)*p;if(s<t)C.signal.aborted||(S(`error`,new r(n.INVALID_PARAMS,`Transfer amount is below the minimum transfer amount of ${t.toString()}`)),S(`done`));else{let[t]=c({amountIn:s,evmConfig:f,sourceAsset:_,sourceChainId:v.chainId,targetChainId:b.chainId}),n={aggregator:{name:`Avalanche Bridge™`,id:`avalanche-bridge-evm`},amountIn:s,amountOut:s-t,assetIn:_,assetOut:y,expiresAt:Math.floor(Date.now()/1e3)+60,fees:[{type:`bridge`,fundingModel:`included`,name:`Bridge Fee`,amount:t,chainId:v.chainId,token:u(_)}],fromAddress:m,id:crypto.randomUUID(),partnerFeeBps:null,serviceType:e.AVALANCHE_EVM,slippageBps:g??0,sourceChain:v,targetChain:b,toAddress:x};C.signal.aborted||(S(`quote`,n),S(`done`))}})().catch(e=>{C.signal.aborted||(S(`error`,new i(n.UNKNOWN,t.UNKNOWN,{cause:e,details:`Failed to stream quotes`})),S(`done`))}),{cancel:w}}}export{f as streamQuotesFactory};
2
2
  //# sourceMappingURL=stream-quotes.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"stream-quotes.js","names":[],"sources":["../../../../src/transfer-service/avalanche-evm/_handlers/stream-quotes.ts"],"sourcesContent":["import { ServiceType } from '../../../constants';\nimport { ErrorCode, ErrorReason, InvalidParamsError, SdkError } from '../../../errors';\nimport type { ChainAssetMap } from '../../../types/asset';\nimport type { Quote } from '../../../types/quote';\nimport type { TransferService } from '../../../types/service';\nimport type { Mutable } from '../../../types/utility-types';\nimport { isAddress } from 'viem';\nimport { validateTransferAddressesNotBlockedOrThrow, validateTransferAddressesOrThrow } from '../_utils/validations';\nimport type { EvmConfig } from '../_types';\nimport { analyzeSupportFactory } from './analyze-support';\nimport { calculateMinimumTransferAmount } from './get-minimum-transfer-amount';\nimport { getFee } from '../_utils/fee';\nimport { assetToQuoteFeeToken } from '../../../utils/quote-fees';\n\nexport interface StreamQuotesFactoryConfig {\n config: EvmConfig;\n feeEstimationMultiplier: bigint;\n serviceAssets: ChainAssetMap;\n}\n\nexport function streamQuotesFactory({\n config,\n feeEstimationMultiplier,\n serviceAssets,\n}: StreamQuotesFactoryConfig): TransferService['streamQuotes'] {\n const analyzeSupport = analyzeSupportFactory({ serviceAssets });\n\n return (\n { amount, fromAddress, slippageBps, sourceAsset, sourceChain, targetAsset, targetChain, toAddress },\n handler,\n ) => {\n const ac = new AbortController();\n const cancel = () => {\n ac.abort();\n };\n\n const hasValidAssetsAndChains = analyzeSupport({\n sourceAsset,\n sourceChainId: sourceChain.chainId,\n targetAsset,\n targetChainId: targetChain.chainId,\n });\n\n // Validate to/from addresses are EVM.\n // Verify assets and chains are supported.\n if (!(isAddress(fromAddress) && isAddress(toAddress)) || !hasValidAssetsAndChains) {\n if (!ac.signal.aborted) {\n handler(\n 'error',\n new InvalidParamsError(ErrorReason.INVALID_PARAMS, 'Invalid addresses, assets, or chains provided.'),\n );\n handler('done');\n }\n\n return { cancel };\n }\n\n // Validate addresses match and are not block listed.\n try {\n validateTransferAddressesOrThrow(fromAddress, toAddress);\n validateTransferAddressesNotBlockedOrThrow([fromAddress, toAddress], config.addressBlocklist);\n } catch {\n if (!ac.signal.aborted) {\n handler(\n 'error',\n new InvalidParamsError(ErrorReason.INVALID_PARAMS, 'Transfer addresses are not equal or blocked.'),\n );\n handler('done');\n }\n\n return { cancel };\n }\n\n (async () => {\n // Validate minimum transfer amount\n const minimumAmount = await calculateMinimumTransferAmount(\n {\n sourceAsset,\n sourceChainId: sourceChain.chainId,\n targetAsset,\n targetChainId: targetChain.chainId,\n },\n config,\n );\n\n const minimumTransferAmount = minimumAmount * feeEstimationMultiplier;\n\n if (amount < minimumTransferAmount) {\n if (!ac.signal.aborted) {\n handler(\n 'error',\n new InvalidParamsError(\n ErrorReason.INVALID_PARAMS,\n `Transfer amount is below the minimum transfer amount of ${minimumTransferAmount.toString()}`,\n ),\n );\n handler('done');\n }\n } else {\n const [fee] = getFee({\n amountIn: amount,\n evmConfig: config,\n sourceAsset,\n sourceChainId: sourceChain.chainId,\n targetChainId: targetChain.chainId,\n });\n\n // Create a quote.\n const quote: Mutable<Quote> = {\n aggregator: {\n name: 'Avalanche Bridge™',\n id: 'avalanche-bridge-evm',\n },\n amountIn: amount,\n amountOut: amount - fee,\n assetIn: sourceAsset,\n assetOut: targetAsset,\n // Set the expiration further out since the amountOut isn't expected to change\n // since the Warden config data isn't refreshed. The only expected change would be estimated gas.\n expiresAt: Math.floor(Date.now() / 1_000) + 60,\n fees: [\n {\n type: 'bridge',\n name: 'Bridge Fee',\n amount: fee,\n chainId: sourceChain.chainId,\n token: assetToQuoteFeeToken(sourceAsset),\n },\n ],\n fromAddress,\n id: crypto.randomUUID(),\n partnerFeeBps: null,\n serviceType: ServiceType.AVALANCHE_EVM,\n slippageBps: slippageBps ?? 0,\n sourceChain,\n targetChain,\n toAddress,\n };\n\n if (!ac.signal.aborted) {\n handler('quote', quote);\n handler('done');\n }\n }\n })().catch((error) => {\n if (!ac.signal.aborted) {\n handler(\n 'error',\n new SdkError(ErrorReason.UNKNOWN, ErrorCode.UNKNOWN, { cause: error, details: 'Failed to stream quotes' }),\n );\n handler('done');\n }\n });\n\n return {\n cancel,\n };\n };\n}\n"],"mappings":"ojBAoBA,SAAgB,EAAoB,CAClC,SACA,0BACA,iBAC6D,CAC7D,IAAM,EAAiB,EAAsB,CAAE,gBAAe,CAAC,CAE/D,OACE,CAAE,SAAQ,cAAa,cAAa,cAAa,cAAa,cAAa,cAAa,aACxF,IACG,CACH,IAAM,EAAK,IAAI,gBACT,MAAe,CACnB,EAAG,OAAO,EAGN,EAA0B,EAAe,CAC7C,cACA,cAAe,EAAY,QAC3B,cACA,cAAe,EAAY,QAC5B,CAAC,CAIF,GAAI,EAAE,EAAU,EAAY,EAAI,EAAU,EAAU,GAAK,CAAC,EASxD,OARK,EAAG,OAAO,UACb,EACE,QACA,IAAI,EAAmB,EAAY,eAAgB,iDAAiD,CACrG,CACD,EAAQ,OAAO,EAGV,CAAE,SAAQ,CAInB,GAAI,CACF,EAAiC,EAAa,EAAU,CACxD,EAA2C,CAAC,EAAa,EAAU,CAAE,EAAO,iBAAiB,MACvF,CASN,OARK,EAAG,OAAO,UACb,EACE,QACA,IAAI,EAAmB,EAAY,eAAgB,+CAA+C,CACnG,CACD,EAAQ,OAAO,EAGV,CAAE,SAAQ,CAoFnB,OAjFC,SAAY,CAYX,IAAM,EAVgB,MAAM,EAC1B,CACE,cACA,cAAe,EAAY,QAC3B,cACA,cAAe,EAAY,QAC5B,CACD,EACD,CAE6C,EAE9C,GAAI,EAAS,EACN,EAAG,OAAO,UACb,EACE,QACA,IAAI,EACF,EAAY,eACZ,2DAA2D,EAAsB,UAAU,GAC5F,CACF,CACD,EAAQ,OAAO,MAEZ,CACL,GAAM,CAAC,GAAO,EAAO,CACnB,SAAU,EACV,UAAW,EACX,cACA,cAAe,EAAY,QAC3B,cAAe,EAAY,QAC5B,CAAC,CAGI,EAAwB,CAC5B,WAAY,CACV,KAAM,oBACN,GAAI,uBACL,CACD,SAAU,EACV,UAAW,EAAS,EACpB,QAAS,EACT,SAAU,EAGV,UAAW,KAAK,MAAM,KAAK,KAAK,CAAG,IAAM,CAAG,GAC5C,KAAM,CACJ,CACE,KAAM,SACN,KAAM,aACN,OAAQ,EACR,QAAS,EAAY,QACrB,MAAO,EAAqB,EAAY,CACzC,CACF,CACD,cACA,GAAI,OAAO,YAAY,CACvB,cAAe,KACf,YAAa,EAAY,cACzB,YAAa,GAAe,EAC5B,cACA,cACA,YACD,CAEI,EAAG,OAAO,UACb,EAAQ,QAAS,EAAM,CACvB,EAAQ,OAAO,MAGjB,CAAC,MAAO,GAAU,CACf,EAAG,OAAO,UACb,EACE,QACA,IAAI,EAAS,EAAY,QAAS,EAAU,QAAS,CAAE,MAAO,EAAO,QAAS,0BAA2B,CAAC,CAC3G,CACD,EAAQ,OAAO,GAEjB,CAEK,CACL,SACD"}
1
+ {"version":3,"file":"stream-quotes.js","names":[],"sources":["../../../../src/transfer-service/avalanche-evm/_handlers/stream-quotes.ts"],"sourcesContent":["import { ServiceType } from '../../../constants';\nimport { ErrorCode, ErrorReason, InvalidParamsError, SdkError } from '../../../errors';\nimport type { ChainAssetMap } from '../../../types/asset';\nimport type { Quote } from '../../../types/quote';\nimport type { TransferService } from '../../../types/service';\nimport type { Mutable } from '../../../types/utility-types';\nimport { isAddress } from 'viem';\nimport { validateTransferAddressesNotBlockedOrThrow, validateTransferAddressesOrThrow } from '../_utils/validations';\nimport type { EvmConfig } from '../_types';\nimport { analyzeSupportFactory } from './analyze-support';\nimport { calculateMinimumTransferAmount } from './get-minimum-transfer-amount';\nimport { getFee } from '../_utils/fee';\nimport { assetToQuoteFeeToken } from '../../../utils/quote-fees';\n\nexport interface StreamQuotesFactoryConfig {\n config: EvmConfig;\n feeEstimationMultiplier: bigint;\n serviceAssets: ChainAssetMap;\n}\n\nexport function streamQuotesFactory({\n config,\n feeEstimationMultiplier,\n serviceAssets,\n}: StreamQuotesFactoryConfig): TransferService['streamQuotes'] {\n const analyzeSupport = analyzeSupportFactory({ serviceAssets });\n\n return (\n { amount, fromAddress, slippageBps, sourceAsset, sourceChain, targetAsset, targetChain, toAddress },\n handler,\n ) => {\n const ac = new AbortController();\n const cancel = () => {\n ac.abort();\n };\n\n const hasValidAssetsAndChains = analyzeSupport({\n sourceAsset,\n sourceChainId: sourceChain.chainId,\n targetAsset,\n targetChainId: targetChain.chainId,\n });\n\n // Validate to/from addresses are EVM.\n // Verify assets and chains are supported.\n if (!(isAddress(fromAddress) && isAddress(toAddress)) || !hasValidAssetsAndChains) {\n if (!ac.signal.aborted) {\n handler(\n 'error',\n new InvalidParamsError(ErrorReason.INVALID_PARAMS, 'Invalid addresses, assets, or chains provided.'),\n );\n handler('done');\n }\n\n return { cancel };\n }\n\n // Validate addresses match and are not block listed.\n try {\n validateTransferAddressesOrThrow(fromAddress, toAddress);\n validateTransferAddressesNotBlockedOrThrow([fromAddress, toAddress], config.addressBlocklist);\n } catch {\n if (!ac.signal.aborted) {\n handler(\n 'error',\n new InvalidParamsError(ErrorReason.INVALID_PARAMS, 'Transfer addresses are not equal or blocked.'),\n );\n handler('done');\n }\n\n return { cancel };\n }\n\n (async () => {\n // Validate minimum transfer amount\n const minimumAmount = await calculateMinimumTransferAmount(\n {\n sourceAsset,\n sourceChainId: sourceChain.chainId,\n targetAsset,\n targetChainId: targetChain.chainId,\n },\n config,\n );\n\n const minimumTransferAmount = minimumAmount * feeEstimationMultiplier;\n\n if (amount < minimumTransferAmount) {\n if (!ac.signal.aborted) {\n handler(\n 'error',\n new InvalidParamsError(\n ErrorReason.INVALID_PARAMS,\n `Transfer amount is below the minimum transfer amount of ${minimumTransferAmount.toString()}`,\n ),\n );\n handler('done');\n }\n } else {\n const [fee] = getFee({\n amountIn: amount,\n evmConfig: config,\n sourceAsset,\n sourceChainId: sourceChain.chainId,\n targetChainId: targetChain.chainId,\n });\n\n // Create a quote.\n const quote: Mutable<Quote> = {\n aggregator: {\n name: 'Avalanche Bridge™',\n id: 'avalanche-bridge-evm',\n },\n amountIn: amount,\n amountOut: amount - fee,\n assetIn: sourceAsset,\n assetOut: targetAsset,\n // Set the expiration further out since the amountOut isn't expected to change\n // since the Warden config data isn't refreshed. The only expected change would be estimated gas.\n expiresAt: Math.floor(Date.now() / 1_000) + 60,\n fees: [\n {\n type: 'bridge',\n fundingModel: 'included',\n name: 'Bridge Fee',\n amount: fee,\n chainId: sourceChain.chainId,\n token: assetToQuoteFeeToken(sourceAsset),\n },\n ],\n fromAddress,\n id: crypto.randomUUID(),\n partnerFeeBps: null,\n serviceType: ServiceType.AVALANCHE_EVM,\n slippageBps: slippageBps ?? 0,\n sourceChain,\n targetChain,\n toAddress,\n };\n\n if (!ac.signal.aborted) {\n handler('quote', quote);\n handler('done');\n }\n }\n })().catch((error) => {\n if (!ac.signal.aborted) {\n handler(\n 'error',\n new SdkError(ErrorReason.UNKNOWN, ErrorCode.UNKNOWN, { cause: error, details: 'Failed to stream quotes' }),\n );\n handler('done');\n }\n });\n\n return {\n cancel,\n };\n };\n}\n"],"mappings":"ojBAoBA,SAAgB,EAAoB,CAClC,SACA,0BACA,iBAC6D,CAC7D,IAAM,EAAiB,EAAsB,CAAE,gBAAe,CAAC,CAE/D,OACE,CAAE,SAAQ,cAAa,cAAa,cAAa,cAAa,cAAa,cAAa,aACxF,IACG,CACH,IAAM,EAAK,IAAI,gBACT,MAAe,CACnB,EAAG,OAAO,EAGN,EAA0B,EAAe,CAC7C,cACA,cAAe,EAAY,QAC3B,cACA,cAAe,EAAY,QAC5B,CAAC,CAIF,GAAI,EAAE,EAAU,EAAY,EAAI,EAAU,EAAU,GAAK,CAAC,EASxD,OARK,EAAG,OAAO,UACb,EACE,QACA,IAAI,EAAmB,EAAY,eAAgB,iDAAiD,CACrG,CACD,EAAQ,OAAO,EAGV,CAAE,SAAQ,CAInB,GAAI,CACF,EAAiC,EAAa,EAAU,CACxD,EAA2C,CAAC,EAAa,EAAU,CAAE,EAAO,iBAAiB,MACvF,CASN,OARK,EAAG,OAAO,UACb,EACE,QACA,IAAI,EAAmB,EAAY,eAAgB,+CAA+C,CACnG,CACD,EAAQ,OAAO,EAGV,CAAE,SAAQ,CAqFnB,OAlFC,SAAY,CAYX,IAAM,EAVgB,MAAM,EAC1B,CACE,cACA,cAAe,EAAY,QAC3B,cACA,cAAe,EAAY,QAC5B,CACD,EACD,CAE6C,EAE9C,GAAI,EAAS,EACN,EAAG,OAAO,UACb,EACE,QACA,IAAI,EACF,EAAY,eACZ,2DAA2D,EAAsB,UAAU,GAC5F,CACF,CACD,EAAQ,OAAO,MAEZ,CACL,GAAM,CAAC,GAAO,EAAO,CACnB,SAAU,EACV,UAAW,EACX,cACA,cAAe,EAAY,QAC3B,cAAe,EAAY,QAC5B,CAAC,CAGI,EAAwB,CAC5B,WAAY,CACV,KAAM,oBACN,GAAI,uBACL,CACD,SAAU,EACV,UAAW,EAAS,EACpB,QAAS,EACT,SAAU,EAGV,UAAW,KAAK,MAAM,KAAK,KAAK,CAAG,IAAM,CAAG,GAC5C,KAAM,CACJ,CACE,KAAM,SACN,aAAc,WACd,KAAM,aACN,OAAQ,EACR,QAAS,EAAY,QACrB,MAAO,EAAqB,EAAY,CACzC,CACF,CACD,cACA,GAAI,OAAO,YAAY,CACvB,cAAe,KACf,YAAa,EAAY,cACzB,YAAa,GAAe,EAC5B,cACA,cACA,YACD,CAEI,EAAG,OAAO,UACb,EAAQ,QAAS,EAAM,CACvB,EAAQ,OAAO,MAGjB,CAAC,MAAO,GAAU,CACf,EAAG,OAAO,UACb,EACE,QACA,IAAI,EAAS,EAAY,QAAS,EAAU,QAAS,CAAE,MAAO,EAAO,QAAS,0BAA2B,CAAC,CAC3G,CACD,EAAQ,OAAO,GAEjB,CAEK,CACL,SACD"}
@@ -1,2 +1,2 @@
1
- const e=require(`../../../../constants.cjs`),t=require(`../../../../errors.cjs`),n=require(`../../../../utils/bitcoin-address.cjs`),r=require(`../../../../utils/quote-fees.cjs`),i=require(`../../../../utils/evm-address.cjs`),a=require(`./analyze-support.cjs`),o=require(`./get-minimum-transfer-amount.cjs`);function s({config:s}){let c=a.analyzeSupportFactory({config:s});return(a,l)=>{let u=new AbortController,d=()=>{u.abort()};return!c({sourceAsset:a.sourceAsset,sourceChainId:a.sourceChain.chainId,targetAsset:a.targetAsset,targetChainId:a.targetChain.chainId})||!n.isBech32AddressInNetwork(a.fromAddress,s.sourceChain===e.BitcoinChainIds.MAINNET)||!i.isEvmAddress(a.toAddress)?(u.signal.aborted||(l(`error`,new t.InvalidParamsError(t.ErrorReason.INVALID_PARAMS,`Invalid addresses, assets, or chains provided.`)),l(`done`)),{cancel:d}):((async()=>{let n=o.getMinimumTransferAmount();if(a.amount<n){u.signal.aborted||(l(`error`,new t.InvalidParamsError(t.ErrorReason.INVALID_PARAMS,`Transfer amount is below the minimum transfer amount of ${n.toString()}.`)),l(`done`));return}let i={aggregator:{name:`Lombard`,id:`lombard-btc-to-btcb`},amountIn:a.amount,amountOut:a.amount-s.mintingFee,assetIn:a.sourceAsset,assetOut:a.targetAsset,expiresAt:Math.floor(Date.now()/1e3)+60,fees:[{type:`bridge`,name:`Bridge Fee`,amount:s.mintingFee,chainId:a.sourceChain.chainId,token:r.assetToQuoteFeeToken(a.sourceAsset)}],fromAddress:a.fromAddress,id:crypto.randomUUID(),partnerFeeBps:null,serviceType:e.ServiceType.LOMBARD_BTC_TO_BTCB,slippageBps:a.slippageBps??0,sourceChain:a.sourceChain,targetChain:a.targetChain,toAddress:a.toAddress};u.signal.aborted||(l(`quote`,i),l(`done`))})().catch(e=>{u.signal.aborted||(l(`error`,new t.SdkError(t.ErrorReason.UNKNOWN,t.ErrorCode.UNKNOWN,{cause:e,details:`Failed to stream quotes`})),l(`done`))}),{cancel:d})}}exports.streamQuotesFactory=s;
1
+ const e=require(`../../../../constants.cjs`),t=require(`../../../../errors.cjs`),n=require(`../../../../utils/bitcoin-address.cjs`),r=require(`../../../../utils/quote-fees.cjs`),i=require(`../../../../utils/evm-address.cjs`),a=require(`./analyze-support.cjs`),o=require(`./get-minimum-transfer-amount.cjs`);function s({config:s}){let c=a.analyzeSupportFactory({config:s});return(a,l)=>{let u=new AbortController,d=()=>{u.abort()};return!c({sourceAsset:a.sourceAsset,sourceChainId:a.sourceChain.chainId,targetAsset:a.targetAsset,targetChainId:a.targetChain.chainId})||!n.isBech32AddressInNetwork(a.fromAddress,s.sourceChain===e.BitcoinChainIds.MAINNET)||!i.isEvmAddress(a.toAddress)?(u.signal.aborted||(l(`error`,new t.InvalidParamsError(t.ErrorReason.INVALID_PARAMS,`Invalid addresses, assets, or chains provided.`)),l(`done`)),{cancel:d}):((async()=>{let n=o.getMinimumTransferAmount();if(a.amount<n){u.signal.aborted||(l(`error`,new t.InvalidParamsError(t.ErrorReason.INVALID_PARAMS,`Transfer amount is below the minimum transfer amount of ${n.toString()}.`)),l(`done`));return}let i={aggregator:{name:`Lombard`,id:`lombard-btc-to-btcb`},amountIn:a.amount,amountOut:a.amount-s.mintingFee,assetIn:a.sourceAsset,assetOut:a.targetAsset,expiresAt:Math.floor(Date.now()/1e3)+60,fees:[{type:`bridge`,fundingModel:`included`,name:`Bridge Fee`,amount:s.mintingFee,chainId:a.sourceChain.chainId,token:r.assetToQuoteFeeToken(a.sourceAsset)}],fromAddress:a.fromAddress,id:crypto.randomUUID(),partnerFeeBps:null,serviceType:e.ServiceType.LOMBARD_BTC_TO_BTCB,slippageBps:a.slippageBps??0,sourceChain:a.sourceChain,targetChain:a.targetChain,toAddress:a.toAddress};u.signal.aborted||(l(`quote`,i),l(`done`))})().catch(e=>{u.signal.aborted||(l(`error`,new t.SdkError(t.ErrorReason.UNKNOWN,t.ErrorCode.UNKNOWN,{cause:e,details:`Failed to stream quotes`})),l(`done`))}),{cancel:d})}}exports.streamQuotesFactory=s;
2
2
  //# sourceMappingURL=stream-quotes.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"stream-quotes.cjs","names":["analyzeSupportFactory","isBech32AddressInNetwork","BitcoinChainIds","isEvmAddress","InvalidParamsError","ErrorReason","getMinimumTransferAmount","assetToQuoteFeeToken","ServiceType","SdkError","ErrorCode"],"sources":["../../../../../src/transfer-service/lombard/btc-to-btcb/_handlers/stream-quotes.ts"],"sourcesContent":["import { BitcoinChainIds, ServiceType } from '../../../../constants';\nimport { ErrorCode, ErrorReason, InvalidParamsError, SdkError } from '../../../../errors';\nimport type { Quote } from '../../../../types/quote';\nimport type { TransferService } from '../../../../types/service';\nimport type { Mutable } from '../../../../types/utility-types';\nimport { isBech32AddressInNetwork } from '../../../../utils/bitcoin-address';\nimport { isEvmAddress } from '../../../../utils/evm-address';\nimport { assetToQuoteFeeToken } from '../../../../utils/quote-fees';\nimport type { BtcToBtcbConfig } from '../../types';\nimport { analyzeSupportFactory } from './analyze-support';\nimport { getMinimumTransferAmount } from './get-minimum-transfer-amount';\n\nexport interface StreamQuotesFactoryOptions {\n config: BtcToBtcbConfig;\n}\n\nexport function streamQuotesFactory({ config }: StreamQuotesFactoryOptions): TransferService['streamQuotes'] {\n const analyzeSupport = analyzeSupportFactory({ config });\n\n return (props, handler) => {\n const ac = new AbortController();\n const cancel = () => {\n ac.abort();\n };\n\n const hasValidAssetsAndChains = analyzeSupport({\n sourceAsset: props.sourceAsset,\n sourceChainId: props.sourceChain.chainId,\n targetAsset: props.targetAsset,\n targetChainId: props.targetChain.chainId,\n });\n\n if (\n !hasValidAssetsAndChains ||\n !isBech32AddressInNetwork(props.fromAddress, config.sourceChain === BitcoinChainIds.MAINNET) ||\n !isEvmAddress(props.toAddress)\n ) {\n if (!ac.signal.aborted) {\n handler(\n 'error',\n new InvalidParamsError(ErrorReason.INVALID_PARAMS, 'Invalid addresses, assets, or chains provided.'),\n );\n handler('done');\n }\n\n return { cancel };\n }\n\n (async () => {\n const minimumAmount = getMinimumTransferAmount();\n\n if (props.amount < minimumAmount) {\n if (!ac.signal.aborted) {\n handler(\n 'error',\n new InvalidParamsError(\n ErrorReason.INVALID_PARAMS,\n `Transfer amount is below the minimum transfer amount of ${minimumAmount.toString()}.`,\n ),\n );\n handler('done');\n }\n\n return;\n }\n\n const quote: Mutable<Quote> = {\n aggregator: {\n name: 'Lombard',\n id: 'lombard-btc-to-btcb',\n },\n amountIn: props.amount,\n amountOut: props.amount - config.mintingFee,\n assetIn: props.sourceAsset,\n assetOut: props.targetAsset,\n // Set the expiration time further out since the amountOut isn't expected to change,\n // since the fee is fixed in the config at service initialization.\n expiresAt: Math.floor(Date.now() / 1_000) + 60,\n fees: [\n {\n type: 'bridge',\n name: 'Bridge Fee',\n amount: config.mintingFee,\n chainId: props.sourceChain.chainId,\n token: assetToQuoteFeeToken(props.sourceAsset),\n },\n ],\n fromAddress: props.fromAddress,\n id: crypto.randomUUID(),\n partnerFeeBps: null,\n serviceType: ServiceType.LOMBARD_BTC_TO_BTCB,\n slippageBps: props.slippageBps ?? 0,\n sourceChain: props.sourceChain,\n targetChain: props.targetChain,\n toAddress: props.toAddress,\n };\n\n if (!ac.signal.aborted) {\n handler('quote', quote);\n handler('done');\n }\n })().catch((error) => {\n if (!ac.signal.aborted) {\n handler(\n 'error',\n new SdkError(ErrorReason.UNKNOWN, ErrorCode.UNKNOWN, { cause: error, details: 'Failed to stream quotes' }),\n );\n handler('done');\n }\n });\n\n return {\n cancel,\n };\n };\n}\n"],"mappings":"mTAgBA,SAAgB,EAAoB,CAAE,UAAuE,CAC3G,IAAM,EAAiBA,EAAAA,sBAAsB,CAAE,SAAQ,CAAC,CAExD,OAAQ,EAAO,IAAY,CACzB,IAAM,EAAK,IAAI,gBACT,MAAe,CACnB,EAAG,OAAO,EAyFZ,MA9EE,CAR8B,EAAe,CAC7C,YAAa,EAAM,YACnB,cAAe,EAAM,YAAY,QACjC,YAAa,EAAM,YACnB,cAAe,EAAM,YAAY,QAClC,CAAC,EAIA,CAACC,EAAAA,yBAAyB,EAAM,YAAa,EAAO,cAAgBC,EAAAA,gBAAgB,QAAQ,EAC5F,CAACC,EAAAA,aAAa,EAAM,UAAU,EAEzB,EAAG,OAAO,UACb,EACE,QACA,IAAIC,EAAAA,mBAAmBC,EAAAA,YAAY,eAAgB,iDAAiD,CACrG,CACD,EAAQ,OAAO,EAGV,CAAE,SAAQ,IAGlB,SAAY,CACX,IAAM,EAAgBC,EAAAA,0BAA0B,CAEhD,GAAI,EAAM,OAAS,EAAe,CAC3B,EAAG,OAAO,UACb,EACE,QACA,IAAIF,EAAAA,mBACFC,EAAAA,YAAY,eACZ,2DAA2D,EAAc,UAAU,CAAC,GACrF,CACF,CACD,EAAQ,OAAO,EAGjB,OAGF,IAAM,EAAwB,CAC5B,WAAY,CACV,KAAM,UACN,GAAI,sBACL,CACD,SAAU,EAAM,OAChB,UAAW,EAAM,OAAS,EAAO,WACjC,QAAS,EAAM,YACf,SAAU,EAAM,YAGhB,UAAW,KAAK,MAAM,KAAK,KAAK,CAAG,IAAM,CAAG,GAC5C,KAAM,CACJ,CACE,KAAM,SACN,KAAM,aACN,OAAQ,EAAO,WACf,QAAS,EAAM,YAAY,QAC3B,MAAOE,EAAAA,qBAAqB,EAAM,YAAY,CAC/C,CACF,CACD,YAAa,EAAM,YACnB,GAAI,OAAO,YAAY,CACvB,cAAe,KACf,YAAaC,EAAAA,YAAY,oBACzB,YAAa,EAAM,aAAe,EAClC,YAAa,EAAM,YACnB,YAAa,EAAM,YACnB,UAAW,EAAM,UAClB,CAEI,EAAG,OAAO,UACb,EAAQ,QAAS,EAAM,CACvB,EAAQ,OAAO,KAEf,CAAC,MAAO,GAAU,CACf,EAAG,OAAO,UACb,EACE,QACA,IAAIC,EAAAA,SAASJ,EAAAA,YAAY,QAASK,EAAAA,UAAU,QAAS,CAAE,MAAO,EAAO,QAAS,0BAA2B,CAAC,CAC3G,CACD,EAAQ,OAAO,GAEjB,CAEK,CACL,SACD"}
1
+ {"version":3,"file":"stream-quotes.cjs","names":["analyzeSupportFactory","isBech32AddressInNetwork","BitcoinChainIds","isEvmAddress","InvalidParamsError","ErrorReason","getMinimumTransferAmount","assetToQuoteFeeToken","ServiceType","SdkError","ErrorCode"],"sources":["../../../../../src/transfer-service/lombard/btc-to-btcb/_handlers/stream-quotes.ts"],"sourcesContent":["import { BitcoinChainIds, ServiceType } from '../../../../constants';\nimport { ErrorCode, ErrorReason, InvalidParamsError, SdkError } from '../../../../errors';\nimport type { Quote } from '../../../../types/quote';\nimport type { TransferService } from '../../../../types/service';\nimport type { Mutable } from '../../../../types/utility-types';\nimport { isBech32AddressInNetwork } from '../../../../utils/bitcoin-address';\nimport { isEvmAddress } from '../../../../utils/evm-address';\nimport { assetToQuoteFeeToken } from '../../../../utils/quote-fees';\nimport type { BtcToBtcbConfig } from '../../types';\nimport { analyzeSupportFactory } from './analyze-support';\nimport { getMinimumTransferAmount } from './get-minimum-transfer-amount';\n\nexport interface StreamQuotesFactoryOptions {\n config: BtcToBtcbConfig;\n}\n\nexport function streamQuotesFactory({ config }: StreamQuotesFactoryOptions): TransferService['streamQuotes'] {\n const analyzeSupport = analyzeSupportFactory({ config });\n\n return (props, handler) => {\n const ac = new AbortController();\n const cancel = () => {\n ac.abort();\n };\n\n const hasValidAssetsAndChains = analyzeSupport({\n sourceAsset: props.sourceAsset,\n sourceChainId: props.sourceChain.chainId,\n targetAsset: props.targetAsset,\n targetChainId: props.targetChain.chainId,\n });\n\n if (\n !hasValidAssetsAndChains ||\n !isBech32AddressInNetwork(props.fromAddress, config.sourceChain === BitcoinChainIds.MAINNET) ||\n !isEvmAddress(props.toAddress)\n ) {\n if (!ac.signal.aborted) {\n handler(\n 'error',\n new InvalidParamsError(ErrorReason.INVALID_PARAMS, 'Invalid addresses, assets, or chains provided.'),\n );\n handler('done');\n }\n\n return { cancel };\n }\n\n (async () => {\n const minimumAmount = getMinimumTransferAmount();\n\n if (props.amount < minimumAmount) {\n if (!ac.signal.aborted) {\n handler(\n 'error',\n new InvalidParamsError(\n ErrorReason.INVALID_PARAMS,\n `Transfer amount is below the minimum transfer amount of ${minimumAmount.toString()}.`,\n ),\n );\n handler('done');\n }\n\n return;\n }\n\n const quote: Mutable<Quote> = {\n aggregator: {\n name: 'Lombard',\n id: 'lombard-btc-to-btcb',\n },\n amountIn: props.amount,\n amountOut: props.amount - config.mintingFee,\n assetIn: props.sourceAsset,\n assetOut: props.targetAsset,\n // Set the expiration time further out since the amountOut isn't expected to change,\n // since the fee is fixed in the config at service initialization.\n expiresAt: Math.floor(Date.now() / 1_000) + 60,\n fees: [\n {\n type: 'bridge',\n fundingModel: 'included',\n name: 'Bridge Fee',\n amount: config.mintingFee,\n chainId: props.sourceChain.chainId,\n token: assetToQuoteFeeToken(props.sourceAsset),\n },\n ],\n fromAddress: props.fromAddress,\n id: crypto.randomUUID(),\n partnerFeeBps: null,\n serviceType: ServiceType.LOMBARD_BTC_TO_BTCB,\n slippageBps: props.slippageBps ?? 0,\n sourceChain: props.sourceChain,\n targetChain: props.targetChain,\n toAddress: props.toAddress,\n };\n\n if (!ac.signal.aborted) {\n handler('quote', quote);\n handler('done');\n }\n })().catch((error) => {\n if (!ac.signal.aborted) {\n handler(\n 'error',\n new SdkError(ErrorReason.UNKNOWN, ErrorCode.UNKNOWN, { cause: error, details: 'Failed to stream quotes' }),\n );\n handler('done');\n }\n });\n\n return {\n cancel,\n };\n };\n}\n"],"mappings":"mTAgBA,SAAgB,EAAoB,CAAE,UAAuE,CAC3G,IAAM,EAAiBA,EAAAA,sBAAsB,CAAE,SAAQ,CAAC,CAExD,OAAQ,EAAO,IAAY,CACzB,IAAM,EAAK,IAAI,gBACT,MAAe,CACnB,EAAG,OAAO,EA0FZ,MA/EE,CAR8B,EAAe,CAC7C,YAAa,EAAM,YACnB,cAAe,EAAM,YAAY,QACjC,YAAa,EAAM,YACnB,cAAe,EAAM,YAAY,QAClC,CAAC,EAIA,CAACC,EAAAA,yBAAyB,EAAM,YAAa,EAAO,cAAgBC,EAAAA,gBAAgB,QAAQ,EAC5F,CAACC,EAAAA,aAAa,EAAM,UAAU,EAEzB,EAAG,OAAO,UACb,EACE,QACA,IAAIC,EAAAA,mBAAmBC,EAAAA,YAAY,eAAgB,iDAAiD,CACrG,CACD,EAAQ,OAAO,EAGV,CAAE,SAAQ,IAGlB,SAAY,CACX,IAAM,EAAgBC,EAAAA,0BAA0B,CAEhD,GAAI,EAAM,OAAS,EAAe,CAC3B,EAAG,OAAO,UACb,EACE,QACA,IAAIF,EAAAA,mBACFC,EAAAA,YAAY,eACZ,2DAA2D,EAAc,UAAU,CAAC,GACrF,CACF,CACD,EAAQ,OAAO,EAGjB,OAGF,IAAM,EAAwB,CAC5B,WAAY,CACV,KAAM,UACN,GAAI,sBACL,CACD,SAAU,EAAM,OAChB,UAAW,EAAM,OAAS,EAAO,WACjC,QAAS,EAAM,YACf,SAAU,EAAM,YAGhB,UAAW,KAAK,MAAM,KAAK,KAAK,CAAG,IAAM,CAAG,GAC5C,KAAM,CACJ,CACE,KAAM,SACN,aAAc,WACd,KAAM,aACN,OAAQ,EAAO,WACf,QAAS,EAAM,YAAY,QAC3B,MAAOE,EAAAA,qBAAqB,EAAM,YAAY,CAC/C,CACF,CACD,YAAa,EAAM,YACnB,GAAI,OAAO,YAAY,CACvB,cAAe,KACf,YAAaC,EAAAA,YAAY,oBACzB,YAAa,EAAM,aAAe,EAClC,YAAa,EAAM,YACnB,YAAa,EAAM,YACnB,UAAW,EAAM,UAClB,CAEI,EAAG,OAAO,UACb,EAAQ,QAAS,EAAM,CACvB,EAAQ,OAAO,KAEf,CAAC,MAAO,GAAU,CACf,EAAG,OAAO,UACb,EACE,QACA,IAAIC,EAAAA,SAASJ,EAAAA,YAAY,QAASK,EAAAA,UAAU,QAAS,CAAE,MAAO,EAAO,QAAS,0BAA2B,CAAC,CAC3G,CACD,EAAQ,OAAO,GAEjB,CAEK,CACL,SACD"}
@@ -1,2 +1,2 @@
1
- import{BitcoinChainIds as e,ServiceType as t}from"../../../../constants.js";import{ErrorCode as n,ErrorReason as r,InvalidParamsError as i,SdkError as a}from"../../../../errors.js";import{isBech32AddressInNetwork as o}from"../../../../utils/bitcoin-address.js";import{assetToQuoteFeeToken as s}from"../../../../utils/quote-fees.js";import{isEvmAddress as c}from"../../../../utils/evm-address.js";import{analyzeSupportFactory as l}from"./analyze-support.js";import{getMinimumTransferAmount as u}from"./get-minimum-transfer-amount.js";function d({config:d}){let f=l({config:d});return(l,p)=>{let m=new AbortController,h=()=>{m.abort()};return!f({sourceAsset:l.sourceAsset,sourceChainId:l.sourceChain.chainId,targetAsset:l.targetAsset,targetChainId:l.targetChain.chainId})||!o(l.fromAddress,d.sourceChain===e.MAINNET)||!c(l.toAddress)?(m.signal.aborted||(p(`error`,new i(r.INVALID_PARAMS,`Invalid addresses, assets, or chains provided.`)),p(`done`)),{cancel:h}):((async()=>{let e=u();if(l.amount<e){m.signal.aborted||(p(`error`,new i(r.INVALID_PARAMS,`Transfer amount is below the minimum transfer amount of ${e.toString()}.`)),p(`done`));return}let n={aggregator:{name:`Lombard`,id:`lombard-btc-to-btcb`},amountIn:l.amount,amountOut:l.amount-d.mintingFee,assetIn:l.sourceAsset,assetOut:l.targetAsset,expiresAt:Math.floor(Date.now()/1e3)+60,fees:[{type:`bridge`,name:`Bridge Fee`,amount:d.mintingFee,chainId:l.sourceChain.chainId,token:s(l.sourceAsset)}],fromAddress:l.fromAddress,id:crypto.randomUUID(),partnerFeeBps:null,serviceType:t.LOMBARD_BTC_TO_BTCB,slippageBps:l.slippageBps??0,sourceChain:l.sourceChain,targetChain:l.targetChain,toAddress:l.toAddress};m.signal.aborted||(p(`quote`,n),p(`done`))})().catch(e=>{m.signal.aborted||(p(`error`,new a(r.UNKNOWN,n.UNKNOWN,{cause:e,details:`Failed to stream quotes`})),p(`done`))}),{cancel:h})}}export{d as streamQuotesFactory};
1
+ import{BitcoinChainIds as e,ServiceType as t}from"../../../../constants.js";import{ErrorCode as n,ErrorReason as r,InvalidParamsError as i,SdkError as a}from"../../../../errors.js";import{isBech32AddressInNetwork as o}from"../../../../utils/bitcoin-address.js";import{assetToQuoteFeeToken as s}from"../../../../utils/quote-fees.js";import{isEvmAddress as c}from"../../../../utils/evm-address.js";import{analyzeSupportFactory as l}from"./analyze-support.js";import{getMinimumTransferAmount as u}from"./get-minimum-transfer-amount.js";function d({config:d}){let f=l({config:d});return(l,p)=>{let m=new AbortController,h=()=>{m.abort()};return!f({sourceAsset:l.sourceAsset,sourceChainId:l.sourceChain.chainId,targetAsset:l.targetAsset,targetChainId:l.targetChain.chainId})||!o(l.fromAddress,d.sourceChain===e.MAINNET)||!c(l.toAddress)?(m.signal.aborted||(p(`error`,new i(r.INVALID_PARAMS,`Invalid addresses, assets, or chains provided.`)),p(`done`)),{cancel:h}):((async()=>{let e=u();if(l.amount<e){m.signal.aborted||(p(`error`,new i(r.INVALID_PARAMS,`Transfer amount is below the minimum transfer amount of ${e.toString()}.`)),p(`done`));return}let n={aggregator:{name:`Lombard`,id:`lombard-btc-to-btcb`},amountIn:l.amount,amountOut:l.amount-d.mintingFee,assetIn:l.sourceAsset,assetOut:l.targetAsset,expiresAt:Math.floor(Date.now()/1e3)+60,fees:[{type:`bridge`,fundingModel:`included`,name:`Bridge Fee`,amount:d.mintingFee,chainId:l.sourceChain.chainId,token:s(l.sourceAsset)}],fromAddress:l.fromAddress,id:crypto.randomUUID(),partnerFeeBps:null,serviceType:t.LOMBARD_BTC_TO_BTCB,slippageBps:l.slippageBps??0,sourceChain:l.sourceChain,targetChain:l.targetChain,toAddress:l.toAddress};m.signal.aborted||(p(`quote`,n),p(`done`))})().catch(e=>{m.signal.aborted||(p(`error`,new a(r.UNKNOWN,n.UNKNOWN,{cause:e,details:`Failed to stream quotes`})),p(`done`))}),{cancel:h})}}export{d as streamQuotesFactory};
2
2
  //# sourceMappingURL=stream-quotes.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"stream-quotes.js","names":[],"sources":["../../../../../src/transfer-service/lombard/btc-to-btcb/_handlers/stream-quotes.ts"],"sourcesContent":["import { BitcoinChainIds, ServiceType } from '../../../../constants';\nimport { ErrorCode, ErrorReason, InvalidParamsError, SdkError } from '../../../../errors';\nimport type { Quote } from '../../../../types/quote';\nimport type { TransferService } from '../../../../types/service';\nimport type { Mutable } from '../../../../types/utility-types';\nimport { isBech32AddressInNetwork } from '../../../../utils/bitcoin-address';\nimport { isEvmAddress } from '../../../../utils/evm-address';\nimport { assetToQuoteFeeToken } from '../../../../utils/quote-fees';\nimport type { BtcToBtcbConfig } from '../../types';\nimport { analyzeSupportFactory } from './analyze-support';\nimport { getMinimumTransferAmount } from './get-minimum-transfer-amount';\n\nexport interface StreamQuotesFactoryOptions {\n config: BtcToBtcbConfig;\n}\n\nexport function streamQuotesFactory({ config }: StreamQuotesFactoryOptions): TransferService['streamQuotes'] {\n const analyzeSupport = analyzeSupportFactory({ config });\n\n return (props, handler) => {\n const ac = new AbortController();\n const cancel = () => {\n ac.abort();\n };\n\n const hasValidAssetsAndChains = analyzeSupport({\n sourceAsset: props.sourceAsset,\n sourceChainId: props.sourceChain.chainId,\n targetAsset: props.targetAsset,\n targetChainId: props.targetChain.chainId,\n });\n\n if (\n !hasValidAssetsAndChains ||\n !isBech32AddressInNetwork(props.fromAddress, config.sourceChain === BitcoinChainIds.MAINNET) ||\n !isEvmAddress(props.toAddress)\n ) {\n if (!ac.signal.aborted) {\n handler(\n 'error',\n new InvalidParamsError(ErrorReason.INVALID_PARAMS, 'Invalid addresses, assets, or chains provided.'),\n );\n handler('done');\n }\n\n return { cancel };\n }\n\n (async () => {\n const minimumAmount = getMinimumTransferAmount();\n\n if (props.amount < minimumAmount) {\n if (!ac.signal.aborted) {\n handler(\n 'error',\n new InvalidParamsError(\n ErrorReason.INVALID_PARAMS,\n `Transfer amount is below the minimum transfer amount of ${minimumAmount.toString()}.`,\n ),\n );\n handler('done');\n }\n\n return;\n }\n\n const quote: Mutable<Quote> = {\n aggregator: {\n name: 'Lombard',\n id: 'lombard-btc-to-btcb',\n },\n amountIn: props.amount,\n amountOut: props.amount - config.mintingFee,\n assetIn: props.sourceAsset,\n assetOut: props.targetAsset,\n // Set the expiration time further out since the amountOut isn't expected to change,\n // since the fee is fixed in the config at service initialization.\n expiresAt: Math.floor(Date.now() / 1_000) + 60,\n fees: [\n {\n type: 'bridge',\n name: 'Bridge Fee',\n amount: config.mintingFee,\n chainId: props.sourceChain.chainId,\n token: assetToQuoteFeeToken(props.sourceAsset),\n },\n ],\n fromAddress: props.fromAddress,\n id: crypto.randomUUID(),\n partnerFeeBps: null,\n serviceType: ServiceType.LOMBARD_BTC_TO_BTCB,\n slippageBps: props.slippageBps ?? 0,\n sourceChain: props.sourceChain,\n targetChain: props.targetChain,\n toAddress: props.toAddress,\n };\n\n if (!ac.signal.aborted) {\n handler('quote', quote);\n handler('done');\n }\n })().catch((error) => {\n if (!ac.signal.aborted) {\n handler(\n 'error',\n new SdkError(ErrorReason.UNKNOWN, ErrorCode.UNKNOWN, { cause: error, details: 'Failed to stream quotes' }),\n );\n handler('done');\n }\n });\n\n return {\n cancel,\n };\n };\n}\n"],"mappings":"qhBAgBA,SAAgB,EAAoB,CAAE,UAAuE,CAC3G,IAAM,EAAiB,EAAsB,CAAE,SAAQ,CAAC,CAExD,OAAQ,EAAO,IAAY,CACzB,IAAM,EAAK,IAAI,gBACT,MAAe,CACnB,EAAG,OAAO,EAyFZ,MA9EE,CAR8B,EAAe,CAC7C,YAAa,EAAM,YACnB,cAAe,EAAM,YAAY,QACjC,YAAa,EAAM,YACnB,cAAe,EAAM,YAAY,QAClC,CAAC,EAIA,CAAC,EAAyB,EAAM,YAAa,EAAO,cAAgB,EAAgB,QAAQ,EAC5F,CAAC,EAAa,EAAM,UAAU,EAEzB,EAAG,OAAO,UACb,EACE,QACA,IAAI,EAAmB,EAAY,eAAgB,iDAAiD,CACrG,CACD,EAAQ,OAAO,EAGV,CAAE,SAAQ,IAGlB,SAAY,CACX,IAAM,EAAgB,GAA0B,CAEhD,GAAI,EAAM,OAAS,EAAe,CAC3B,EAAG,OAAO,UACb,EACE,QACA,IAAI,EACF,EAAY,eACZ,2DAA2D,EAAc,UAAU,CAAC,GACrF,CACF,CACD,EAAQ,OAAO,EAGjB,OAGF,IAAM,EAAwB,CAC5B,WAAY,CACV,KAAM,UACN,GAAI,sBACL,CACD,SAAU,EAAM,OAChB,UAAW,EAAM,OAAS,EAAO,WACjC,QAAS,EAAM,YACf,SAAU,EAAM,YAGhB,UAAW,KAAK,MAAM,KAAK,KAAK,CAAG,IAAM,CAAG,GAC5C,KAAM,CACJ,CACE,KAAM,SACN,KAAM,aACN,OAAQ,EAAO,WACf,QAAS,EAAM,YAAY,QAC3B,MAAO,EAAqB,EAAM,YAAY,CAC/C,CACF,CACD,YAAa,EAAM,YACnB,GAAI,OAAO,YAAY,CACvB,cAAe,KACf,YAAa,EAAY,oBACzB,YAAa,EAAM,aAAe,EAClC,YAAa,EAAM,YACnB,YAAa,EAAM,YACnB,UAAW,EAAM,UAClB,CAEI,EAAG,OAAO,UACb,EAAQ,QAAS,EAAM,CACvB,EAAQ,OAAO,KAEf,CAAC,MAAO,GAAU,CACf,EAAG,OAAO,UACb,EACE,QACA,IAAI,EAAS,EAAY,QAAS,EAAU,QAAS,CAAE,MAAO,EAAO,QAAS,0BAA2B,CAAC,CAC3G,CACD,EAAQ,OAAO,GAEjB,CAEK,CACL,SACD"}
1
+ {"version":3,"file":"stream-quotes.js","names":[],"sources":["../../../../../src/transfer-service/lombard/btc-to-btcb/_handlers/stream-quotes.ts"],"sourcesContent":["import { BitcoinChainIds, ServiceType } from '../../../../constants';\nimport { ErrorCode, ErrorReason, InvalidParamsError, SdkError } from '../../../../errors';\nimport type { Quote } from '../../../../types/quote';\nimport type { TransferService } from '../../../../types/service';\nimport type { Mutable } from '../../../../types/utility-types';\nimport { isBech32AddressInNetwork } from '../../../../utils/bitcoin-address';\nimport { isEvmAddress } from '../../../../utils/evm-address';\nimport { assetToQuoteFeeToken } from '../../../../utils/quote-fees';\nimport type { BtcToBtcbConfig } from '../../types';\nimport { analyzeSupportFactory } from './analyze-support';\nimport { getMinimumTransferAmount } from './get-minimum-transfer-amount';\n\nexport interface StreamQuotesFactoryOptions {\n config: BtcToBtcbConfig;\n}\n\nexport function streamQuotesFactory({ config }: StreamQuotesFactoryOptions): TransferService['streamQuotes'] {\n const analyzeSupport = analyzeSupportFactory({ config });\n\n return (props, handler) => {\n const ac = new AbortController();\n const cancel = () => {\n ac.abort();\n };\n\n const hasValidAssetsAndChains = analyzeSupport({\n sourceAsset: props.sourceAsset,\n sourceChainId: props.sourceChain.chainId,\n targetAsset: props.targetAsset,\n targetChainId: props.targetChain.chainId,\n });\n\n if (\n !hasValidAssetsAndChains ||\n !isBech32AddressInNetwork(props.fromAddress, config.sourceChain === BitcoinChainIds.MAINNET) ||\n !isEvmAddress(props.toAddress)\n ) {\n if (!ac.signal.aborted) {\n handler(\n 'error',\n new InvalidParamsError(ErrorReason.INVALID_PARAMS, 'Invalid addresses, assets, or chains provided.'),\n );\n handler('done');\n }\n\n return { cancel };\n }\n\n (async () => {\n const minimumAmount = getMinimumTransferAmount();\n\n if (props.amount < minimumAmount) {\n if (!ac.signal.aborted) {\n handler(\n 'error',\n new InvalidParamsError(\n ErrorReason.INVALID_PARAMS,\n `Transfer amount is below the minimum transfer amount of ${minimumAmount.toString()}.`,\n ),\n );\n handler('done');\n }\n\n return;\n }\n\n const quote: Mutable<Quote> = {\n aggregator: {\n name: 'Lombard',\n id: 'lombard-btc-to-btcb',\n },\n amountIn: props.amount,\n amountOut: props.amount - config.mintingFee,\n assetIn: props.sourceAsset,\n assetOut: props.targetAsset,\n // Set the expiration time further out since the amountOut isn't expected to change,\n // since the fee is fixed in the config at service initialization.\n expiresAt: Math.floor(Date.now() / 1_000) + 60,\n fees: [\n {\n type: 'bridge',\n fundingModel: 'included',\n name: 'Bridge Fee',\n amount: config.mintingFee,\n chainId: props.sourceChain.chainId,\n token: assetToQuoteFeeToken(props.sourceAsset),\n },\n ],\n fromAddress: props.fromAddress,\n id: crypto.randomUUID(),\n partnerFeeBps: null,\n serviceType: ServiceType.LOMBARD_BTC_TO_BTCB,\n slippageBps: props.slippageBps ?? 0,\n sourceChain: props.sourceChain,\n targetChain: props.targetChain,\n toAddress: props.toAddress,\n };\n\n if (!ac.signal.aborted) {\n handler('quote', quote);\n handler('done');\n }\n })().catch((error) => {\n if (!ac.signal.aborted) {\n handler(\n 'error',\n new SdkError(ErrorReason.UNKNOWN, ErrorCode.UNKNOWN, { cause: error, details: 'Failed to stream quotes' }),\n );\n handler('done');\n }\n });\n\n return {\n cancel,\n };\n };\n}\n"],"mappings":"qhBAgBA,SAAgB,EAAoB,CAAE,UAAuE,CAC3G,IAAM,EAAiB,EAAsB,CAAE,SAAQ,CAAC,CAExD,OAAQ,EAAO,IAAY,CACzB,IAAM,EAAK,IAAI,gBACT,MAAe,CACnB,EAAG,OAAO,EA0FZ,MA/EE,CAR8B,EAAe,CAC7C,YAAa,EAAM,YACnB,cAAe,EAAM,YAAY,QACjC,YAAa,EAAM,YACnB,cAAe,EAAM,YAAY,QAClC,CAAC,EAIA,CAAC,EAAyB,EAAM,YAAa,EAAO,cAAgB,EAAgB,QAAQ,EAC5F,CAAC,EAAa,EAAM,UAAU,EAEzB,EAAG,OAAO,UACb,EACE,QACA,IAAI,EAAmB,EAAY,eAAgB,iDAAiD,CACrG,CACD,EAAQ,OAAO,EAGV,CAAE,SAAQ,IAGlB,SAAY,CACX,IAAM,EAAgB,GAA0B,CAEhD,GAAI,EAAM,OAAS,EAAe,CAC3B,EAAG,OAAO,UACb,EACE,QACA,IAAI,EACF,EAAY,eACZ,2DAA2D,EAAc,UAAU,CAAC,GACrF,CACF,CACD,EAAQ,OAAO,EAGjB,OAGF,IAAM,EAAwB,CAC5B,WAAY,CACV,KAAM,UACN,GAAI,sBACL,CACD,SAAU,EAAM,OAChB,UAAW,EAAM,OAAS,EAAO,WACjC,QAAS,EAAM,YACf,SAAU,EAAM,YAGhB,UAAW,KAAK,MAAM,KAAK,KAAK,CAAG,IAAM,CAAG,GAC5C,KAAM,CACJ,CACE,KAAM,SACN,aAAc,WACd,KAAM,aACN,OAAQ,EAAO,WACf,QAAS,EAAM,YAAY,QAC3B,MAAO,EAAqB,EAAM,YAAY,CAC/C,CACF,CACD,YAAa,EAAM,YACnB,GAAI,OAAO,YAAY,CACvB,cAAe,KACf,YAAa,EAAY,oBACzB,YAAa,EAAM,aAAe,EAClC,YAAa,EAAM,YACnB,YAAa,EAAM,YACnB,UAAW,EAAM,UAClB,CAEI,EAAG,OAAO,UACb,EAAQ,QAAS,EAAM,CACvB,EAAQ,OAAO,KAEf,CAAC,MAAO,GAAU,CACf,EAAG,OAAO,UACb,EACE,QACA,IAAI,EAAS,EAAY,QAAS,EAAU,QAAS,CAAE,MAAO,EAAO,QAAS,0BAA2B,CAAC,CAC3G,CACD,EAAQ,OAAO,GAEjB,CAEK,CACL,SACD"}
@@ -1,2 +1,2 @@
1
- const e=require(`../../../../constants.cjs`),t=require(`../../../../errors.cjs`),n=require(`../../../../utils/bitcoin-address.cjs`),r=require(`../../../../utils/quote-fees.cjs`),i=require(`../../../../utils/evm-address.cjs`),a=require(`./analyze-support.cjs`);function o({config:o}){let s=a.analyzeSupportFactory({config:o});return(a,c)=>{let l=new AbortController,u=()=>{l.abort()};return!s({sourceAsset:a.sourceAsset,sourceChainId:a.sourceChain.chainId,targetAsset:a.targetAsset,targetChainId:a.targetChain.chainId})||!i.isEvmAddress(a.fromAddress)||!n.isBech32AddressInNetwork(a.toAddress,o.targetChain===e.BitcoinChainIds.MAINNET)?(l.signal.aborted||(c(`error`,new t.InvalidParamsError(t.ErrorReason.INVALID_PARAMS,`Invalid addresses, assets, or chains provided.`)),c(`done`)),{cancel:u}):((async()=>{let n=o.minRedeemAmount;if(a.amount<n){l.signal.aborted||(c(`error`,new t.InvalidParamsError(t.ErrorReason.INVALID_PARAMS,`Transfer amount is below the minimum transfer amount of ${n.toString()}.`)),c(`done`));return}let i={aggregator:{name:`Lombard`,id:`lombard-btcb-to-btc`},amountIn:a.amount,amountOut:a.amount-o.redeemFee,assetIn:a.sourceAsset,assetOut:a.targetAsset,expiresAt:Math.floor(Date.now()/1e3)+60,fees:[{type:`bridge`,name:`Bridge Fee`,amount:o.redeemFee,chainId:a.sourceChain.chainId,token:r.assetToQuoteFeeToken(a.sourceAsset)}],fromAddress:a.fromAddress,id:crypto.randomUUID(),partnerFeeBps:null,serviceType:e.ServiceType.LOMBARD_BTCB_TO_BTC,slippageBps:a.slippageBps??0,sourceChain:a.sourceChain,targetChain:a.targetChain,toAddress:a.toAddress};l.signal.aborted||(c(`quote`,i),c(`done`))})().catch(e=>{l.signal.aborted||(c(`error`,new t.SdkError(t.ErrorReason.UNKNOWN,t.ErrorCode.UNKNOWN,{cause:e,details:`Failed to stream quotes`})),c(`done`))}),{cancel:u})}}exports.streamQuotesFactory=o;
1
+ const e=require(`../../../../constants.cjs`),t=require(`../../../../errors.cjs`),n=require(`../../../../utils/bitcoin-address.cjs`),r=require(`../../../../utils/quote-fees.cjs`),i=require(`../../../../utils/evm-address.cjs`),a=require(`./analyze-support.cjs`);function o({config:o}){let s=a.analyzeSupportFactory({config:o});return(a,c)=>{let l=new AbortController,u=()=>{l.abort()};return!s({sourceAsset:a.sourceAsset,sourceChainId:a.sourceChain.chainId,targetAsset:a.targetAsset,targetChainId:a.targetChain.chainId})||!i.isEvmAddress(a.fromAddress)||!n.isBech32AddressInNetwork(a.toAddress,o.targetChain===e.BitcoinChainIds.MAINNET)?(l.signal.aborted||(c(`error`,new t.InvalidParamsError(t.ErrorReason.INVALID_PARAMS,`Invalid addresses, assets, or chains provided.`)),c(`done`)),{cancel:u}):((async()=>{let n=o.minRedeemAmount;if(a.amount<n){l.signal.aborted||(c(`error`,new t.InvalidParamsError(t.ErrorReason.INVALID_PARAMS,`Transfer amount is below the minimum transfer amount of ${n.toString()}.`)),c(`done`));return}let i={aggregator:{name:`Lombard`,id:`lombard-btcb-to-btc`},amountIn:a.amount,amountOut:a.amount-o.redeemFee,assetIn:a.sourceAsset,assetOut:a.targetAsset,expiresAt:Math.floor(Date.now()/1e3)+60,fees:[{type:`bridge`,fundingModel:`included`,name:`Bridge Fee`,amount:o.redeemFee,chainId:a.sourceChain.chainId,token:r.assetToQuoteFeeToken(a.sourceAsset)}],fromAddress:a.fromAddress,id:crypto.randomUUID(),partnerFeeBps:null,serviceType:e.ServiceType.LOMBARD_BTCB_TO_BTC,slippageBps:a.slippageBps??0,sourceChain:a.sourceChain,targetChain:a.targetChain,toAddress:a.toAddress};l.signal.aborted||(c(`quote`,i),c(`done`))})().catch(e=>{l.signal.aborted||(c(`error`,new t.SdkError(t.ErrorReason.UNKNOWN,t.ErrorCode.UNKNOWN,{cause:e,details:`Failed to stream quotes`})),c(`done`))}),{cancel:u})}}exports.streamQuotesFactory=o;
2
2
  //# sourceMappingURL=stream-quotes.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"stream-quotes.cjs","names":["analyzeSupportFactory","isEvmAddress","isBech32AddressInNetwork","BitcoinChainIds","InvalidParamsError","ErrorReason","assetToQuoteFeeToken","ServiceType","SdkError","ErrorCode"],"sources":["../../../../../src/transfer-service/lombard/btcb-to-btc/_handlers/stream-quotes.ts"],"sourcesContent":["import { BitcoinChainIds, ServiceType } from '../../../../constants';\nimport { ErrorCode, ErrorReason, InvalidParamsError, SdkError } from '../../../../errors';\nimport type { Quote } from '../../../../types/quote';\nimport type { TransferService } from '../../../../types/service';\nimport type { Mutable } from '../../../../types/utility-types';\nimport { isBech32AddressInNetwork } from '../../../../utils/bitcoin-address';\nimport { isEvmAddress } from '../../../../utils/evm-address';\nimport { assetToQuoteFeeToken } from '../../../../utils/quote-fees';\nimport type { BtcbToBtcConfig } from '../../types';\nimport { analyzeSupportFactory } from './analyze-support';\n\nexport interface StreamQuotesFactoryOptions {\n config: BtcbToBtcConfig;\n}\n\nexport function streamQuotesFactory({ config }: StreamQuotesFactoryOptions): TransferService['streamQuotes'] {\n const analyzeSupport = analyzeSupportFactory({ config });\n\n return (props, handler) => {\n const ac = new AbortController();\n const cancel = () => {\n ac.abort();\n };\n\n const hasValidAssetsAndChains = analyzeSupport({\n sourceAsset: props.sourceAsset,\n sourceChainId: props.sourceChain.chainId,\n targetAsset: props.targetAsset,\n targetChainId: props.targetChain.chainId,\n });\n\n if (\n !hasValidAssetsAndChains ||\n !isEvmAddress(props.fromAddress) ||\n !isBech32AddressInNetwork(props.toAddress, config.targetChain === BitcoinChainIds.MAINNET)\n ) {\n if (!ac.signal.aborted) {\n handler(\n 'error',\n new InvalidParamsError(ErrorReason.INVALID_PARAMS, 'Invalid addresses, assets, or chains provided.'),\n );\n handler('done');\n }\n\n return { cancel };\n }\n\n (async () => {\n const minimumAmount = config.minRedeemAmount;\n\n if (props.amount < minimumAmount) {\n if (!ac.signal.aborted) {\n handler(\n 'error',\n new InvalidParamsError(\n ErrorReason.INVALID_PARAMS,\n `Transfer amount is below the minimum transfer amount of ${minimumAmount.toString()}.`,\n ),\n );\n handler('done');\n }\n\n return;\n }\n\n const quote: Mutable<Quote> = {\n aggregator: {\n name: 'Lombard',\n id: 'lombard-btcb-to-btc',\n },\n amountIn: props.amount,\n amountOut: props.amount - config.redeemFee,\n assetIn: props.sourceAsset,\n assetOut: props.targetAsset,\n // Set the expiration time further out since the amountOut isn't expected to change,\n // since the fee is fixed in the config at service initialization.\n expiresAt: Math.floor(Date.now() / 1_000) + 60,\n fees: [\n {\n type: 'bridge',\n name: 'Bridge Fee',\n amount: config.redeemFee,\n chainId: props.sourceChain.chainId,\n token: assetToQuoteFeeToken(props.sourceAsset),\n },\n ],\n fromAddress: props.fromAddress,\n id: crypto.randomUUID(),\n partnerFeeBps: null,\n serviceType: ServiceType.LOMBARD_BTCB_TO_BTC,\n slippageBps: props.slippageBps ?? 0,\n sourceChain: props.sourceChain,\n targetChain: props.targetChain,\n toAddress: props.toAddress,\n };\n\n if (!ac.signal.aborted) {\n handler('quote', quote);\n handler('done');\n }\n })().catch((error) => {\n if (!ac.signal.aborted) {\n handler(\n 'error',\n new SdkError(ErrorReason.UNKNOWN, ErrorCode.UNKNOWN, { cause: error, details: 'Failed to stream quotes' }),\n );\n handler('done');\n }\n });\n\n return {\n cancel,\n };\n };\n}\n"],"mappings":"oQAeA,SAAgB,EAAoB,CAAE,UAAuE,CAC3G,IAAM,EAAiBA,EAAAA,sBAAsB,CAAE,SAAQ,CAAC,CAExD,OAAQ,EAAO,IAAY,CACzB,IAAM,EAAK,IAAI,gBACT,MAAe,CACnB,EAAG,OAAO,EAyFZ,MA9EE,CAR8B,EAAe,CAC7C,YAAa,EAAM,YACnB,cAAe,EAAM,YAAY,QACjC,YAAa,EAAM,YACnB,cAAe,EAAM,YAAY,QAClC,CAAC,EAIA,CAACC,EAAAA,aAAa,EAAM,YAAY,EAChC,CAACC,EAAAA,yBAAyB,EAAM,UAAW,EAAO,cAAgBC,EAAAA,gBAAgB,QAAQ,EAErF,EAAG,OAAO,UACb,EACE,QACA,IAAIC,EAAAA,mBAAmBC,EAAAA,YAAY,eAAgB,iDAAiD,CACrG,CACD,EAAQ,OAAO,EAGV,CAAE,SAAQ,IAGlB,SAAY,CACX,IAAM,EAAgB,EAAO,gBAE7B,GAAI,EAAM,OAAS,EAAe,CAC3B,EAAG,OAAO,UACb,EACE,QACA,IAAID,EAAAA,mBACFC,EAAAA,YAAY,eACZ,2DAA2D,EAAc,UAAU,CAAC,GACrF,CACF,CACD,EAAQ,OAAO,EAGjB,OAGF,IAAM,EAAwB,CAC5B,WAAY,CACV,KAAM,UACN,GAAI,sBACL,CACD,SAAU,EAAM,OAChB,UAAW,EAAM,OAAS,EAAO,UACjC,QAAS,EAAM,YACf,SAAU,EAAM,YAGhB,UAAW,KAAK,MAAM,KAAK,KAAK,CAAG,IAAM,CAAG,GAC5C,KAAM,CACJ,CACE,KAAM,SACN,KAAM,aACN,OAAQ,EAAO,UACf,QAAS,EAAM,YAAY,QAC3B,MAAOC,EAAAA,qBAAqB,EAAM,YAAY,CAC/C,CACF,CACD,YAAa,EAAM,YACnB,GAAI,OAAO,YAAY,CACvB,cAAe,KACf,YAAaC,EAAAA,YAAY,oBACzB,YAAa,EAAM,aAAe,EAClC,YAAa,EAAM,YACnB,YAAa,EAAM,YACnB,UAAW,EAAM,UAClB,CAEI,EAAG,OAAO,UACb,EAAQ,QAAS,EAAM,CACvB,EAAQ,OAAO,KAEf,CAAC,MAAO,GAAU,CACf,EAAG,OAAO,UACb,EACE,QACA,IAAIC,EAAAA,SAASH,EAAAA,YAAY,QAASI,EAAAA,UAAU,QAAS,CAAE,MAAO,EAAO,QAAS,0BAA2B,CAAC,CAC3G,CACD,EAAQ,OAAO,GAEjB,CAEK,CACL,SACD"}
1
+ {"version":3,"file":"stream-quotes.cjs","names":["analyzeSupportFactory","isEvmAddress","isBech32AddressInNetwork","BitcoinChainIds","InvalidParamsError","ErrorReason","assetToQuoteFeeToken","ServiceType","SdkError","ErrorCode"],"sources":["../../../../../src/transfer-service/lombard/btcb-to-btc/_handlers/stream-quotes.ts"],"sourcesContent":["import { BitcoinChainIds, ServiceType } from '../../../../constants';\nimport { ErrorCode, ErrorReason, InvalidParamsError, SdkError } from '../../../../errors';\nimport type { Quote } from '../../../../types/quote';\nimport type { TransferService } from '../../../../types/service';\nimport type { Mutable } from '../../../../types/utility-types';\nimport { isBech32AddressInNetwork } from '../../../../utils/bitcoin-address';\nimport { isEvmAddress } from '../../../../utils/evm-address';\nimport { assetToQuoteFeeToken } from '../../../../utils/quote-fees';\nimport type { BtcbToBtcConfig } from '../../types';\nimport { analyzeSupportFactory } from './analyze-support';\n\nexport interface StreamQuotesFactoryOptions {\n config: BtcbToBtcConfig;\n}\n\nexport function streamQuotesFactory({ config }: StreamQuotesFactoryOptions): TransferService['streamQuotes'] {\n const analyzeSupport = analyzeSupportFactory({ config });\n\n return (props, handler) => {\n const ac = new AbortController();\n const cancel = () => {\n ac.abort();\n };\n\n const hasValidAssetsAndChains = analyzeSupport({\n sourceAsset: props.sourceAsset,\n sourceChainId: props.sourceChain.chainId,\n targetAsset: props.targetAsset,\n targetChainId: props.targetChain.chainId,\n });\n\n if (\n !hasValidAssetsAndChains ||\n !isEvmAddress(props.fromAddress) ||\n !isBech32AddressInNetwork(props.toAddress, config.targetChain === BitcoinChainIds.MAINNET)\n ) {\n if (!ac.signal.aborted) {\n handler(\n 'error',\n new InvalidParamsError(ErrorReason.INVALID_PARAMS, 'Invalid addresses, assets, or chains provided.'),\n );\n handler('done');\n }\n\n return { cancel };\n }\n\n (async () => {\n const minimumAmount = config.minRedeemAmount;\n\n if (props.amount < minimumAmount) {\n if (!ac.signal.aborted) {\n handler(\n 'error',\n new InvalidParamsError(\n ErrorReason.INVALID_PARAMS,\n `Transfer amount is below the minimum transfer amount of ${minimumAmount.toString()}.`,\n ),\n );\n handler('done');\n }\n\n return;\n }\n\n const quote: Mutable<Quote> = {\n aggregator: {\n name: 'Lombard',\n id: 'lombard-btcb-to-btc',\n },\n amountIn: props.amount,\n amountOut: props.amount - config.redeemFee,\n assetIn: props.sourceAsset,\n assetOut: props.targetAsset,\n // Set the expiration time further out since the amountOut isn't expected to change,\n // since the fee is fixed in the config at service initialization.\n expiresAt: Math.floor(Date.now() / 1_000) + 60,\n fees: [\n {\n type: 'bridge',\n fundingModel: 'included',\n name: 'Bridge Fee',\n amount: config.redeemFee,\n chainId: props.sourceChain.chainId,\n token: assetToQuoteFeeToken(props.sourceAsset),\n },\n ],\n fromAddress: props.fromAddress,\n id: crypto.randomUUID(),\n partnerFeeBps: null,\n serviceType: ServiceType.LOMBARD_BTCB_TO_BTC,\n slippageBps: props.slippageBps ?? 0,\n sourceChain: props.sourceChain,\n targetChain: props.targetChain,\n toAddress: props.toAddress,\n };\n\n if (!ac.signal.aborted) {\n handler('quote', quote);\n handler('done');\n }\n })().catch((error) => {\n if (!ac.signal.aborted) {\n handler(\n 'error',\n new SdkError(ErrorReason.UNKNOWN, ErrorCode.UNKNOWN, { cause: error, details: 'Failed to stream quotes' }),\n );\n handler('done');\n }\n });\n\n return {\n cancel,\n };\n };\n}\n"],"mappings":"oQAeA,SAAgB,EAAoB,CAAE,UAAuE,CAC3G,IAAM,EAAiBA,EAAAA,sBAAsB,CAAE,SAAQ,CAAC,CAExD,OAAQ,EAAO,IAAY,CACzB,IAAM,EAAK,IAAI,gBACT,MAAe,CACnB,EAAG,OAAO,EA0FZ,MA/EE,CAR8B,EAAe,CAC7C,YAAa,EAAM,YACnB,cAAe,EAAM,YAAY,QACjC,YAAa,EAAM,YACnB,cAAe,EAAM,YAAY,QAClC,CAAC,EAIA,CAACC,EAAAA,aAAa,EAAM,YAAY,EAChC,CAACC,EAAAA,yBAAyB,EAAM,UAAW,EAAO,cAAgBC,EAAAA,gBAAgB,QAAQ,EAErF,EAAG,OAAO,UACb,EACE,QACA,IAAIC,EAAAA,mBAAmBC,EAAAA,YAAY,eAAgB,iDAAiD,CACrG,CACD,EAAQ,OAAO,EAGV,CAAE,SAAQ,IAGlB,SAAY,CACX,IAAM,EAAgB,EAAO,gBAE7B,GAAI,EAAM,OAAS,EAAe,CAC3B,EAAG,OAAO,UACb,EACE,QACA,IAAID,EAAAA,mBACFC,EAAAA,YAAY,eACZ,2DAA2D,EAAc,UAAU,CAAC,GACrF,CACF,CACD,EAAQ,OAAO,EAGjB,OAGF,IAAM,EAAwB,CAC5B,WAAY,CACV,KAAM,UACN,GAAI,sBACL,CACD,SAAU,EAAM,OAChB,UAAW,EAAM,OAAS,EAAO,UACjC,QAAS,EAAM,YACf,SAAU,EAAM,YAGhB,UAAW,KAAK,MAAM,KAAK,KAAK,CAAG,IAAM,CAAG,GAC5C,KAAM,CACJ,CACE,KAAM,SACN,aAAc,WACd,KAAM,aACN,OAAQ,EAAO,UACf,QAAS,EAAM,YAAY,QAC3B,MAAOC,EAAAA,qBAAqB,EAAM,YAAY,CAC/C,CACF,CACD,YAAa,EAAM,YACnB,GAAI,OAAO,YAAY,CACvB,cAAe,KACf,YAAaC,EAAAA,YAAY,oBACzB,YAAa,EAAM,aAAe,EAClC,YAAa,EAAM,YACnB,YAAa,EAAM,YACnB,UAAW,EAAM,UAClB,CAEI,EAAG,OAAO,UACb,EAAQ,QAAS,EAAM,CACvB,EAAQ,OAAO,KAEf,CAAC,MAAO,GAAU,CACf,EAAG,OAAO,UACb,EACE,QACA,IAAIC,EAAAA,SAASH,EAAAA,YAAY,QAASI,EAAAA,UAAU,QAAS,CAAE,MAAO,EAAO,QAAS,0BAA2B,CAAC,CAC3G,CACD,EAAQ,OAAO,GAEjB,CAEK,CACL,SACD"}
@@ -1,2 +1,2 @@
1
- import{BitcoinChainIds as e,ServiceType as t}from"../../../../constants.js";import{ErrorCode as n,ErrorReason as r,InvalidParamsError as i,SdkError as a}from"../../../../errors.js";import{isBech32AddressInNetwork as o}from"../../../../utils/bitcoin-address.js";import{assetToQuoteFeeToken as s}from"../../../../utils/quote-fees.js";import{isEvmAddress as c}from"../../../../utils/evm-address.js";import{analyzeSupportFactory as l}from"./analyze-support.js";function u({config:u}){let d=l({config:u});return(l,f)=>{let p=new AbortController,m=()=>{p.abort()};return!d({sourceAsset:l.sourceAsset,sourceChainId:l.sourceChain.chainId,targetAsset:l.targetAsset,targetChainId:l.targetChain.chainId})||!c(l.fromAddress)||!o(l.toAddress,u.targetChain===e.MAINNET)?(p.signal.aborted||(f(`error`,new i(r.INVALID_PARAMS,`Invalid addresses, assets, or chains provided.`)),f(`done`)),{cancel:m}):((async()=>{let e=u.minRedeemAmount;if(l.amount<e){p.signal.aborted||(f(`error`,new i(r.INVALID_PARAMS,`Transfer amount is below the minimum transfer amount of ${e.toString()}.`)),f(`done`));return}let n={aggregator:{name:`Lombard`,id:`lombard-btcb-to-btc`},amountIn:l.amount,amountOut:l.amount-u.redeemFee,assetIn:l.sourceAsset,assetOut:l.targetAsset,expiresAt:Math.floor(Date.now()/1e3)+60,fees:[{type:`bridge`,name:`Bridge Fee`,amount:u.redeemFee,chainId:l.sourceChain.chainId,token:s(l.sourceAsset)}],fromAddress:l.fromAddress,id:crypto.randomUUID(),partnerFeeBps:null,serviceType:t.LOMBARD_BTCB_TO_BTC,slippageBps:l.slippageBps??0,sourceChain:l.sourceChain,targetChain:l.targetChain,toAddress:l.toAddress};p.signal.aborted||(f(`quote`,n),f(`done`))})().catch(e=>{p.signal.aborted||(f(`error`,new a(r.UNKNOWN,n.UNKNOWN,{cause:e,details:`Failed to stream quotes`})),f(`done`))}),{cancel:m})}}export{u as streamQuotesFactory};
1
+ import{BitcoinChainIds as e,ServiceType as t}from"../../../../constants.js";import{ErrorCode as n,ErrorReason as r,InvalidParamsError as i,SdkError as a}from"../../../../errors.js";import{isBech32AddressInNetwork as o}from"../../../../utils/bitcoin-address.js";import{assetToQuoteFeeToken as s}from"../../../../utils/quote-fees.js";import{isEvmAddress as c}from"../../../../utils/evm-address.js";import{analyzeSupportFactory as l}from"./analyze-support.js";function u({config:u}){let d=l({config:u});return(l,f)=>{let p=new AbortController,m=()=>{p.abort()};return!d({sourceAsset:l.sourceAsset,sourceChainId:l.sourceChain.chainId,targetAsset:l.targetAsset,targetChainId:l.targetChain.chainId})||!c(l.fromAddress)||!o(l.toAddress,u.targetChain===e.MAINNET)?(p.signal.aborted||(f(`error`,new i(r.INVALID_PARAMS,`Invalid addresses, assets, or chains provided.`)),f(`done`)),{cancel:m}):((async()=>{let e=u.minRedeemAmount;if(l.amount<e){p.signal.aborted||(f(`error`,new i(r.INVALID_PARAMS,`Transfer amount is below the minimum transfer amount of ${e.toString()}.`)),f(`done`));return}let n={aggregator:{name:`Lombard`,id:`lombard-btcb-to-btc`},amountIn:l.amount,amountOut:l.amount-u.redeemFee,assetIn:l.sourceAsset,assetOut:l.targetAsset,expiresAt:Math.floor(Date.now()/1e3)+60,fees:[{type:`bridge`,fundingModel:`included`,name:`Bridge Fee`,amount:u.redeemFee,chainId:l.sourceChain.chainId,token:s(l.sourceAsset)}],fromAddress:l.fromAddress,id:crypto.randomUUID(),partnerFeeBps:null,serviceType:t.LOMBARD_BTCB_TO_BTC,slippageBps:l.slippageBps??0,sourceChain:l.sourceChain,targetChain:l.targetChain,toAddress:l.toAddress};p.signal.aborted||(f(`quote`,n),f(`done`))})().catch(e=>{p.signal.aborted||(f(`error`,new a(r.UNKNOWN,n.UNKNOWN,{cause:e,details:`Failed to stream quotes`})),f(`done`))}),{cancel:m})}}export{u as streamQuotesFactory};
2
2
  //# sourceMappingURL=stream-quotes.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"stream-quotes.js","names":[],"sources":["../../../../../src/transfer-service/lombard/btcb-to-btc/_handlers/stream-quotes.ts"],"sourcesContent":["import { BitcoinChainIds, ServiceType } from '../../../../constants';\nimport { ErrorCode, ErrorReason, InvalidParamsError, SdkError } from '../../../../errors';\nimport type { Quote } from '../../../../types/quote';\nimport type { TransferService } from '../../../../types/service';\nimport type { Mutable } from '../../../../types/utility-types';\nimport { isBech32AddressInNetwork } from '../../../../utils/bitcoin-address';\nimport { isEvmAddress } from '../../../../utils/evm-address';\nimport { assetToQuoteFeeToken } from '../../../../utils/quote-fees';\nimport type { BtcbToBtcConfig } from '../../types';\nimport { analyzeSupportFactory } from './analyze-support';\n\nexport interface StreamQuotesFactoryOptions {\n config: BtcbToBtcConfig;\n}\n\nexport function streamQuotesFactory({ config }: StreamQuotesFactoryOptions): TransferService['streamQuotes'] {\n const analyzeSupport = analyzeSupportFactory({ config });\n\n return (props, handler) => {\n const ac = new AbortController();\n const cancel = () => {\n ac.abort();\n };\n\n const hasValidAssetsAndChains = analyzeSupport({\n sourceAsset: props.sourceAsset,\n sourceChainId: props.sourceChain.chainId,\n targetAsset: props.targetAsset,\n targetChainId: props.targetChain.chainId,\n });\n\n if (\n !hasValidAssetsAndChains ||\n !isEvmAddress(props.fromAddress) ||\n !isBech32AddressInNetwork(props.toAddress, config.targetChain === BitcoinChainIds.MAINNET)\n ) {\n if (!ac.signal.aborted) {\n handler(\n 'error',\n new InvalidParamsError(ErrorReason.INVALID_PARAMS, 'Invalid addresses, assets, or chains provided.'),\n );\n handler('done');\n }\n\n return { cancel };\n }\n\n (async () => {\n const minimumAmount = config.minRedeemAmount;\n\n if (props.amount < minimumAmount) {\n if (!ac.signal.aborted) {\n handler(\n 'error',\n new InvalidParamsError(\n ErrorReason.INVALID_PARAMS,\n `Transfer amount is below the minimum transfer amount of ${minimumAmount.toString()}.`,\n ),\n );\n handler('done');\n }\n\n return;\n }\n\n const quote: Mutable<Quote> = {\n aggregator: {\n name: 'Lombard',\n id: 'lombard-btcb-to-btc',\n },\n amountIn: props.amount,\n amountOut: props.amount - config.redeemFee,\n assetIn: props.sourceAsset,\n assetOut: props.targetAsset,\n // Set the expiration time further out since the amountOut isn't expected to change,\n // since the fee is fixed in the config at service initialization.\n expiresAt: Math.floor(Date.now() / 1_000) + 60,\n fees: [\n {\n type: 'bridge',\n name: 'Bridge Fee',\n amount: config.redeemFee,\n chainId: props.sourceChain.chainId,\n token: assetToQuoteFeeToken(props.sourceAsset),\n },\n ],\n fromAddress: props.fromAddress,\n id: crypto.randomUUID(),\n partnerFeeBps: null,\n serviceType: ServiceType.LOMBARD_BTCB_TO_BTC,\n slippageBps: props.slippageBps ?? 0,\n sourceChain: props.sourceChain,\n targetChain: props.targetChain,\n toAddress: props.toAddress,\n };\n\n if (!ac.signal.aborted) {\n handler('quote', quote);\n handler('done');\n }\n })().catch((error) => {\n if (!ac.signal.aborted) {\n handler(\n 'error',\n new SdkError(ErrorReason.UNKNOWN, ErrorCode.UNKNOWN, { cause: error, details: 'Failed to stream quotes' }),\n );\n handler('done');\n }\n });\n\n return {\n cancel,\n };\n };\n}\n"],"mappings":"ycAeA,SAAgB,EAAoB,CAAE,UAAuE,CAC3G,IAAM,EAAiB,EAAsB,CAAE,SAAQ,CAAC,CAExD,OAAQ,EAAO,IAAY,CACzB,IAAM,EAAK,IAAI,gBACT,MAAe,CACnB,EAAG,OAAO,EAyFZ,MA9EE,CAR8B,EAAe,CAC7C,YAAa,EAAM,YACnB,cAAe,EAAM,YAAY,QACjC,YAAa,EAAM,YACnB,cAAe,EAAM,YAAY,QAClC,CAAC,EAIA,CAAC,EAAa,EAAM,YAAY,EAChC,CAAC,EAAyB,EAAM,UAAW,EAAO,cAAgB,EAAgB,QAAQ,EAErF,EAAG,OAAO,UACb,EACE,QACA,IAAI,EAAmB,EAAY,eAAgB,iDAAiD,CACrG,CACD,EAAQ,OAAO,EAGV,CAAE,SAAQ,IAGlB,SAAY,CACX,IAAM,EAAgB,EAAO,gBAE7B,GAAI,EAAM,OAAS,EAAe,CAC3B,EAAG,OAAO,UACb,EACE,QACA,IAAI,EACF,EAAY,eACZ,2DAA2D,EAAc,UAAU,CAAC,GACrF,CACF,CACD,EAAQ,OAAO,EAGjB,OAGF,IAAM,EAAwB,CAC5B,WAAY,CACV,KAAM,UACN,GAAI,sBACL,CACD,SAAU,EAAM,OAChB,UAAW,EAAM,OAAS,EAAO,UACjC,QAAS,EAAM,YACf,SAAU,EAAM,YAGhB,UAAW,KAAK,MAAM,KAAK,KAAK,CAAG,IAAM,CAAG,GAC5C,KAAM,CACJ,CACE,KAAM,SACN,KAAM,aACN,OAAQ,EAAO,UACf,QAAS,EAAM,YAAY,QAC3B,MAAO,EAAqB,EAAM,YAAY,CAC/C,CACF,CACD,YAAa,EAAM,YACnB,GAAI,OAAO,YAAY,CACvB,cAAe,KACf,YAAa,EAAY,oBACzB,YAAa,EAAM,aAAe,EAClC,YAAa,EAAM,YACnB,YAAa,EAAM,YACnB,UAAW,EAAM,UAClB,CAEI,EAAG,OAAO,UACb,EAAQ,QAAS,EAAM,CACvB,EAAQ,OAAO,KAEf,CAAC,MAAO,GAAU,CACf,EAAG,OAAO,UACb,EACE,QACA,IAAI,EAAS,EAAY,QAAS,EAAU,QAAS,CAAE,MAAO,EAAO,QAAS,0BAA2B,CAAC,CAC3G,CACD,EAAQ,OAAO,GAEjB,CAEK,CACL,SACD"}
1
+ {"version":3,"file":"stream-quotes.js","names":[],"sources":["../../../../../src/transfer-service/lombard/btcb-to-btc/_handlers/stream-quotes.ts"],"sourcesContent":["import { BitcoinChainIds, ServiceType } from '../../../../constants';\nimport { ErrorCode, ErrorReason, InvalidParamsError, SdkError } from '../../../../errors';\nimport type { Quote } from '../../../../types/quote';\nimport type { TransferService } from '../../../../types/service';\nimport type { Mutable } from '../../../../types/utility-types';\nimport { isBech32AddressInNetwork } from '../../../../utils/bitcoin-address';\nimport { isEvmAddress } from '../../../../utils/evm-address';\nimport { assetToQuoteFeeToken } from '../../../../utils/quote-fees';\nimport type { BtcbToBtcConfig } from '../../types';\nimport { analyzeSupportFactory } from './analyze-support';\n\nexport interface StreamQuotesFactoryOptions {\n config: BtcbToBtcConfig;\n}\n\nexport function streamQuotesFactory({ config }: StreamQuotesFactoryOptions): TransferService['streamQuotes'] {\n const analyzeSupport = analyzeSupportFactory({ config });\n\n return (props, handler) => {\n const ac = new AbortController();\n const cancel = () => {\n ac.abort();\n };\n\n const hasValidAssetsAndChains = analyzeSupport({\n sourceAsset: props.sourceAsset,\n sourceChainId: props.sourceChain.chainId,\n targetAsset: props.targetAsset,\n targetChainId: props.targetChain.chainId,\n });\n\n if (\n !hasValidAssetsAndChains ||\n !isEvmAddress(props.fromAddress) ||\n !isBech32AddressInNetwork(props.toAddress, config.targetChain === BitcoinChainIds.MAINNET)\n ) {\n if (!ac.signal.aborted) {\n handler(\n 'error',\n new InvalidParamsError(ErrorReason.INVALID_PARAMS, 'Invalid addresses, assets, or chains provided.'),\n );\n handler('done');\n }\n\n return { cancel };\n }\n\n (async () => {\n const minimumAmount = config.minRedeemAmount;\n\n if (props.amount < minimumAmount) {\n if (!ac.signal.aborted) {\n handler(\n 'error',\n new InvalidParamsError(\n ErrorReason.INVALID_PARAMS,\n `Transfer amount is below the minimum transfer amount of ${minimumAmount.toString()}.`,\n ),\n );\n handler('done');\n }\n\n return;\n }\n\n const quote: Mutable<Quote> = {\n aggregator: {\n name: 'Lombard',\n id: 'lombard-btcb-to-btc',\n },\n amountIn: props.amount,\n amountOut: props.amount - config.redeemFee,\n assetIn: props.sourceAsset,\n assetOut: props.targetAsset,\n // Set the expiration time further out since the amountOut isn't expected to change,\n // since the fee is fixed in the config at service initialization.\n expiresAt: Math.floor(Date.now() / 1_000) + 60,\n fees: [\n {\n type: 'bridge',\n fundingModel: 'included',\n name: 'Bridge Fee',\n amount: config.redeemFee,\n chainId: props.sourceChain.chainId,\n token: assetToQuoteFeeToken(props.sourceAsset),\n },\n ],\n fromAddress: props.fromAddress,\n id: crypto.randomUUID(),\n partnerFeeBps: null,\n serviceType: ServiceType.LOMBARD_BTCB_TO_BTC,\n slippageBps: props.slippageBps ?? 0,\n sourceChain: props.sourceChain,\n targetChain: props.targetChain,\n toAddress: props.toAddress,\n };\n\n if (!ac.signal.aborted) {\n handler('quote', quote);\n handler('done');\n }\n })().catch((error) => {\n if (!ac.signal.aborted) {\n handler(\n 'error',\n new SdkError(ErrorReason.UNKNOWN, ErrorCode.UNKNOWN, { cause: error, details: 'Failed to stream quotes' }),\n );\n handler('done');\n }\n });\n\n return {\n cancel,\n };\n };\n}\n"],"mappings":"ycAeA,SAAgB,EAAoB,CAAE,UAAuE,CAC3G,IAAM,EAAiB,EAAsB,CAAE,SAAQ,CAAC,CAExD,OAAQ,EAAO,IAAY,CACzB,IAAM,EAAK,IAAI,gBACT,MAAe,CACnB,EAAG,OAAO,EA0FZ,MA/EE,CAR8B,EAAe,CAC7C,YAAa,EAAM,YACnB,cAAe,EAAM,YAAY,QACjC,YAAa,EAAM,YACnB,cAAe,EAAM,YAAY,QAClC,CAAC,EAIA,CAAC,EAAa,EAAM,YAAY,EAChC,CAAC,EAAyB,EAAM,UAAW,EAAO,cAAgB,EAAgB,QAAQ,EAErF,EAAG,OAAO,UACb,EACE,QACA,IAAI,EAAmB,EAAY,eAAgB,iDAAiD,CACrG,CACD,EAAQ,OAAO,EAGV,CAAE,SAAQ,IAGlB,SAAY,CACX,IAAM,EAAgB,EAAO,gBAE7B,GAAI,EAAM,OAAS,EAAe,CAC3B,EAAG,OAAO,UACb,EACE,QACA,IAAI,EACF,EAAY,eACZ,2DAA2D,EAAc,UAAU,CAAC,GACrF,CACF,CACD,EAAQ,OAAO,EAGjB,OAGF,IAAM,EAAwB,CAC5B,WAAY,CACV,KAAM,UACN,GAAI,sBACL,CACD,SAAU,EAAM,OAChB,UAAW,EAAM,OAAS,EAAO,UACjC,QAAS,EAAM,YACf,SAAU,EAAM,YAGhB,UAAW,KAAK,MAAM,KAAK,KAAK,CAAG,IAAM,CAAG,GAC5C,KAAM,CACJ,CACE,KAAM,SACN,aAAc,WACd,KAAM,aACN,OAAQ,EAAO,UACf,QAAS,EAAM,YAAY,QAC3B,MAAO,EAAqB,EAAM,YAAY,CAC/C,CACF,CACD,YAAa,EAAM,YACnB,GAAI,OAAO,YAAY,CACvB,cAAe,KACf,YAAa,EAAY,oBACzB,YAAa,EAAM,aAAe,EAClC,YAAa,EAAM,YACnB,YAAa,EAAM,YACnB,UAAW,EAAM,UAClB,CAEI,EAAG,OAAO,UACb,EAAQ,QAAS,EAAM,CACvB,EAAQ,OAAO,KAEf,CAAC,MAAO,GAAU,CACf,EAAG,OAAO,UACb,EACE,QACA,IAAI,EAAS,EAAY,QAAS,EAAU,QAAS,CAAE,MAAO,EAAO,QAAS,0BAA2B,CAAC,CAC3G,CACD,EAAQ,OAAO,GAEjB,CAEK,CACL,SACD"}
@@ -1,2 +1,2 @@
1
- require(`../../../_virtual/_rolldown/runtime.cjs`);const e=require(`../../../constants.cjs`),t=require(`../../../errors.cjs`),n=require(`../../../utils/caip.cjs`),r=require(`../../../_utils/chain.cjs`),i=require(`../../_utils.cjs`),a=require(`../_api.cjs`),o=require(`../../../utils/sol-address.cjs`),s=require(`../_utils.cjs`),c=require(`../_type-guards.cjs`),l=require(`../_solana-utils.cjs`),u=require(`./estimate-native-fee.cjs`),d=require(`../constants.cjs`);let f=require(`viem`);function p({apiOptions:n,appId:i,environment:a,evmSigner:o,solanaSigner:s}){return async({quote:c,gasSettings:l,fallbackToDefaultOnBatchFailure:u,onStepChange:d})=>{if(c.serviceType!==e.ServiceType.MARKR)throw new t.SdkError(t.ErrorReason.INCORRECT_PROVIDER_PROVIDED,t.ErrorCode.INVALID_PARAMS);let f=Math.floor(Date.now()/1e3);if(c.expiresAt<=f)throw new t.SdkError(t.ErrorReason.QUOTE_EXPIRED,t.ErrorCode.INVALID_PARAMS);let p=c.sourceChain.chainId;if(r.isSolanaNamespace(p))return h({apiOptions:n,appId:i,environment:a,solanaSigner:s,quote:c,onStepChange:d});if(r.isEvmNamespace(p))return m({apiOptions:n,appId:i,environment:a,evmSigner:o,quote:c,gasSettings:l,fallbackToDefaultOnBatchFailure:u,onStepChange:d});throw new t.SdkError(t.ErrorReason.CHAIN_NOT_SUPPORTED,t.ErrorCode.INVALID_PARAMS,{details:`Unsupported source chain namespace: ${p}`})}}async function m({apiOptions:r,appId:o,environment:l,evmSigner:d,quote:p,gasSettings:m,fallbackToDefaultOnBatchFailure:h,onStepChange:_}){let v=p.fromAddress;if(!(0,f.isAddress)(v))throw new t.SdkError(t.ErrorReason.INVALID_PARAMS,t.ErrorCode.INVALID_PARAMS,{details:`fromAddress is not a valid EVM address.`});let y=s.calculateMarkrMinimumAmountOut({amountOut:p.amountOut,assetOut:p.assetOut,slippageBps:p.slippageBps}),b=i.getEvmClientForChain({chain:p.sourceChain}),x=s.assetToAddressString(p.assetIn,p.sourceChain.chainId),S=s.assetToAddressString(p.assetOut,p.targetChain.chainId);if(!(0,f.isAddress)(x))throw new t.SdkError(t.ErrorReason.INVALID_PARAMS,t.ErrorCode.INVALID_PARAMS,{details:`assetIn address is not a valid EVM address.`});let C=x,w=s.isTokenAddressNative(C),T=p.sourceChain.chainId.toLowerCase()!==p.targetChain.chainId.toLowerCase(),{address:E}=await a.markrGetSpenderAddress(r,{chainId:n.caip2ToEip155ChainId(p.sourceChain.chainId),crossChainSwap:T,quoteId:p.id});if(!w&&!E)throw new t.SdkError(t.ErrorReason.CHAIN_NOT_SUPPORTED,t.ErrorCode.INVALID_PARAMS,{details:`Missing Markr spender address for source chain ${p.sourceChain.chainId}.`});let D=!1,O;if(!w&&E&&await b.readContract({address:C,abi:f.erc20Abi,functionName:`allowance`,args:[v,E]})<p.amountIn){D=!0;let e=(0,f.encodeFunctionData)({abi:f.erc20Abi,functionName:`approve`,args:[E,p.amountIn]}),r;try{r=i.applyFeeUnitsBpsMargin(await b.estimateGas({account:v,to:C,data:e,value:0n}),m?.estimateGasMarginBps)}catch(e){throw new t.SdkError(`Error during gas estimation`,t.ErrorCode.VIEM_ERROR,{cause:e,details:`Failed to estimate gas for ERC20 approval transaction.`})}O={chainId:n.caip2ToEip155HexChainId(p.sourceChain.chainId),data:e,from:v,gas:r,to:C,value:0n,...m?.maxFeePerGas===void 0?null:{maxFeePerGas:m.maxFeePerGas,maxPriorityFeePerGas:m.maxPriorityFeePerGas}}}let k=g({approvalRequest:O,requiresApprovalSignature:D,signBatch:d.signBatch,sourceChainId:p.sourceChain.chainId,targetChainId:p.targetChain.chainId}),A=await a.markrSwap(r,{amountIn:p.amountIn.toString(),appId:o,minAmountOut:y.toString(),tokenIn:x,tokenOut:S,uuid:p.id});if(!c.isEvmSwapResponse(A))throw new t.SdkError(t.ErrorReason.CHAIN_NOT_SUPPORTED,t.ErrorCode.INVALID_PARAMS,{details:`Received non-EVM swap response from Markr, but only EVM swaps are supported for this source chain.`});let j=(t,n=Date.now())=>{let r=p.sourceChain.chainId===p.targetChain.chainId;return{amountIn:p.amountIn,amountOut:p.amountOut,environment:l,fees:p.fees,fromAddress:p.fromAddress,id:p.id,partnerFeeBps:p.partnerFeeBps,sourceAsset:p.assetIn,sourceChain:p.sourceChain,status:`source-pending`,targetAsset:p.assetOut,targetChain:p.targetChain,toAddress:p.toAddress,type:e.ServiceType.MARKR,source:{confirmationCount:0,requiredConfirmationCount:r?1:2,startedAtMs:n,txHash:t}}};if(k&&O){let r={currentSignature:1,currentSignatureReason:e.TransferSignatureReason.TokensTransfer,quote:p,requiredSignatures:1},i=d.signBatch;if(!i)throw new t.SdkError(`One-click batch signer is not available.`,t.ErrorCode.SIGNING_FAILED);let a={chainId:n.caip2ToEip155HexChainId(p.sourceChain.chainId),data:A.data,from:v,gas:void 0,to:A.to,value:A.value,...m?.maxFeePerGas===void 0?null:{maxFeePerGas:m.maxFeePerGas,maxPriorityFeePerGas:m.maxPriorityFeePerGas}};_?.(r);try{let e=(await i([O,a],async e=>b.sendRawTransaction({serializedTransaction:e}),r)).at(-1);if(!e)throw new t.SdkError(`One-click batch signing returned no transaction hashes.`,t.ErrorCode.SIGNING_FAILED);return j(e)}catch(e){if(!h)throw e}}if(D&&O){let n={currentSignature:1,currentSignatureReason:e.TransferSignatureReason.AllowanceApproval,quote:p,requiredSignatures:2};_?.(n);let r=await d.sign(O,async e=>b.sendRawTransaction({serializedTransaction:e}),n);if((await b.waitForTransactionReceipt({hash:r})).status===`reverted`)return i.makeFailedTransferFromQuote(p,{environment:l,errorCode:t.ErrorCode.TRANSACTION_REVERTED,errorReason:`ERC20 approval transaction was reverted`})}let M=await u._estimateGasFromSwapResponse({crossChain:T,fromAddress:v,feeUnitsMarginBps:m?.estimateGasMarginBps,sourceClient:b,swap:A}),N={chainId:n.caip2ToEip155HexChainId(p.sourceChain.chainId),data:A.data,from:v,gas:M,to:A.to,value:A.value,...m?.maxFeePerGas===void 0?null:{maxFeePerGas:m.maxFeePerGas,maxPriorityFeePerGas:m.maxPriorityFeePerGas}},P={currentSignature:D?2:1,currentSignatureReason:e.TransferSignatureReason.TokensTransfer,quote:p,requiredSignatures:D?2:1};_?.(P);let F=Date.now();return j(await d.sign(N,async e=>b.sendRawTransaction({serializedTransaction:e}),P),F)}async function h({apiOptions:n,appId:r,environment:u,solanaSigner:f,quote:p,onStepChange:m}){if(!f)throw new t.SdkError(t.ErrorReason.INVALID_PARAMS,t.ErrorCode.INVALID_PARAMS,{details:`solanaSigner is required for Solana transfers but was not provided.`});if(!o.isSolAddress(p.fromAddress))throw new t.SdkError(t.ErrorReason.INVALID_PARAMS,t.ErrorCode.INVALID_PARAMS,{details:`fromAddress is not a valid Solana address.`});let h=s.calculateMarkrMinimumAmountOut({amountOut:p.amountOut,assetOut:p.assetOut,slippageBps:p.slippageBps}),g=s.assetToAddressString(p.assetIn,p.sourceChain.chainId),_=s.assetToAddressString(p.assetOut,p.targetChain.chainId),v=await a.markrSwap(n,{amountIn:p.amountIn.toString(),appId:r,minAmountOut:h.toString(),tokenIn:g,tokenOut:_,userPublicKey:p.fromAddress,uuid:p.id});if(!c.isSolanaSwapResponse(v))throw new t.SdkError(t.ErrorReason.CHAIN_NOT_SUPPORTED,t.ErrorCode.INVALID_PARAMS,{details:`Received non-SVM swap response from Markr, but only SVM swaps are supported for this source chain.`});let y=await l.refreshSolanaSwapTransactionBlockhash(v.swapTransaction,i.getSolanaRpcForChain({chain:p.sourceChain})),b={currentSignature:1,currentSignatureReason:e.TransferSignatureReason.TokensTransfer,quote:p,requiredSignatures:1};m?.(b);let x=Date.now(),S=await f.signAndSend({account:p.fromAddress,serializedTx:y},b),C=p.sourceChain.chainId.toLowerCase()!==p.targetChain.chainId.toLowerCase();return{amountIn:p.amountIn,amountOut:p.amountOut,environment:u,fees:p.fees,fromAddress:p.fromAddress,id:p.id,partnerFeeBps:p.partnerFeeBps,sourceAsset:p.assetIn,sourceChain:p.sourceChain,status:`source-pending`,targetAsset:p.assetOut,targetChain:p.targetChain,toAddress:p.toAddress,type:e.ServiceType.MARKR,source:{confirmationCount:0,requiredConfirmationCount:C?2:d.SOLANA_REQUIRED_CONFIRMATIONS,startedAtMs:x,txHash:S}}}function g({approvalRequest:e,requiresApprovalSignature:t,signBatch:n,sourceChainId:i,targetChainId:a}){return r.isEvmNamespace(i)&&r.isEvmNamespace(a)&&i===a&&t&&e!==void 0&&typeof n==`function`}exports.transferAssetFactory=p;
1
+ require(`../../../_virtual/_rolldown/runtime.cjs`);const e=require(`../../../constants.cjs`),t=require(`../../../errors.cjs`),n=require(`../../../utils/caip.cjs`),r=require(`../../../_utils/chain.cjs`),i=require(`../../_utils.cjs`),a=require(`../_api.cjs`),o=require(`../../../utils/sol-address.cjs`),s=require(`../_utils.cjs`),c=require(`../_type-guards.cjs`),l=require(`../_solana-utils.cjs`),u=require(`./estimate-native-fee.cjs`),d=require(`../constants.cjs`);let f=require(`viem`);function p({apiOptions:n,appId:i,environment:a,evmSigner:o,solanaSigner:s}){return async({quote:c,gasSettings:l,fallbackToDefaultOnBatchFailure:u,onStepChange:d})=>{if(c.serviceType!==e.ServiceType.MARKR)throw new t.SdkError(t.ErrorReason.INCORRECT_PROVIDER_PROVIDED,t.ErrorCode.INVALID_PARAMS);let f=Math.floor(Date.now()/1e3);if(c.expiresAt<=f)throw new t.SdkError(t.ErrorReason.QUOTE_EXPIRED,t.ErrorCode.INVALID_PARAMS);let p=c.sourceChain.chainId;if(r.isSolanaNamespace(p))return h({apiOptions:n,appId:i,environment:a,solanaSigner:s,quote:c,onStepChange:d});if(r.isEvmNamespace(p))return m({apiOptions:n,appId:i,environment:a,evmSigner:o,quote:c,gasSettings:l,fallbackToDefaultOnBatchFailure:u,onStepChange:d});throw new t.SdkError(t.ErrorReason.CHAIN_NOT_SUPPORTED,t.ErrorCode.INVALID_PARAMS,{details:`Unsupported source chain namespace: ${p}`})}}async function m({apiOptions:r,appId:o,environment:l,evmSigner:d,quote:p,gasSettings:m,fallbackToDefaultOnBatchFailure:h,onStepChange:_}){let v=p.fromAddress;if(!(0,f.isAddress)(v))throw new t.SdkError(t.ErrorReason.INVALID_PARAMS,t.ErrorCode.INVALID_PARAMS,{details:`fromAddress is not a valid EVM address.`});let y=s.calculateMarkrMinimumAmountOut({amountOut:p.amountOut,assetOut:p.assetOut,slippageBps:p.slippageBps}),b=i.getEvmClientForChain({chain:p.sourceChain}),x=s.assetToAddressString(p.assetIn,p.sourceChain.chainId),S=s.assetToAddressString(p.assetOut,p.targetChain.chainId);if(!(0,f.isAddress)(x))throw new t.SdkError(t.ErrorReason.INVALID_PARAMS,t.ErrorCode.INVALID_PARAMS,{details:`assetIn address is not a valid EVM address.`});let C=x,w=s.isTokenAddressNative(C),T=p.sourceChain.chainId.toLowerCase()!==p.targetChain.chainId.toLowerCase(),{address:E}=await a.markrGetSpenderAddress(r,{chainId:n.caip2ToEip155ChainId(p.sourceChain.chainId),crossChainSwap:T,quoteId:p.id});if(!w&&!E)throw new t.SdkError(t.ErrorReason.CHAIN_NOT_SUPPORTED,t.ErrorCode.INVALID_PARAMS,{details:`Missing Markr spender address for source chain ${p.sourceChain.chainId}.`});let D=!1,O;if(!w&&E&&await b.readContract({address:C,abi:f.erc20Abi,functionName:`allowance`,args:[v,E]})<p.amountIn){D=!0;let e=(0,f.encodeFunctionData)({abi:f.erc20Abi,functionName:`approve`,args:[E,p.amountIn]}),r;try{r=i.applyFeeUnitsBpsMargin(await b.estimateGas({account:v,to:C,data:e,value:0n}),m?.estimateGasMarginBps)}catch(e){throw new t.SdkError(`Error during gas estimation`,t.ErrorCode.VIEM_ERROR,{cause:e,details:`Failed to estimate gas for ERC20 approval transaction.`})}O={chainId:n.caip2ToEip155HexChainId(p.sourceChain.chainId),data:e,from:v,gas:r,to:C,value:0n,...m?.maxFeePerGas===void 0?null:{maxFeePerGas:m.maxFeePerGas,maxPriorityFeePerGas:m.maxPriorityFeePerGas}}}let k=g({approvalRequest:O,requiresApprovalSignature:D,signBatch:d.signBatch,sourceChainId:p.sourceChain.chainId,targetChainId:p.targetChain.chainId}),A=await a.markrSwap(r,{amountIn:p.amountIn.toString(),appId:o,minAmountOut:y.toString(),tokenIn:x,tokenOut:S,uuid:p.id});if(!c.isEvmSwapResponse(A))throw new t.SdkError(t.ErrorReason.CHAIN_NOT_SUPPORTED,t.ErrorCode.INVALID_PARAMS,{details:`Received non-EVM swap response from Markr, but only EVM swaps are supported for this source chain.`});let j=(t,n=Date.now())=>{let r=p.sourceChain.chainId===p.targetChain.chainId;return{amountIn:p.amountIn,amountOut:p.amountOut,environment:l,fees:p.fees,fromAddress:p.fromAddress,id:p.id,partnerFeeBps:p.partnerFeeBps,sourceAsset:p.assetIn,sourceChain:p.sourceChain,status:`source-pending`,targetAsset:p.assetOut,targetChain:p.targetChain,toAddress:p.toAddress,type:e.ServiceType.MARKR,source:{confirmationCount:0,requiredConfirmationCount:r?1:2,startedAtMs:n,txHash:t}}};if(k&&O){let r={currentSignature:1,currentSignatureReason:e.TransferSignatureReason.TokensTransfer,quote:p,requiredSignatures:1},i=d.signBatch;if(!i)throw new t.SdkError(`One-click batch signer is not available.`,t.ErrorCode.SIGNING_FAILED);let a={chainId:n.caip2ToEip155HexChainId(p.sourceChain.chainId),data:A.data,from:v,gas:void 0,to:A.to,value:A.value,...m?.maxFeePerGas===void 0?null:{maxFeePerGas:m.maxFeePerGas,maxPriorityFeePerGas:m.maxPriorityFeePerGas}};_?.(r);try{let e=(await i([O,a],async e=>b.sendRawTransaction({serializedTransaction:e}),r)).at(-1);if(!e)throw new t.SdkError(`One-click batch signing returned no transaction hashes.`,t.ErrorCode.SIGNING_FAILED);return j(e)}catch(e){if(!h)throw e}}if(D&&O){let n={currentSignature:1,currentSignatureReason:e.TransferSignatureReason.AllowanceApproval,quote:p,requiredSignatures:2};_?.(n);let r=await d.sign(O,async e=>b.sendRawTransaction({serializedTransaction:e}),n);if((await b.waitForTransactionReceipt({hash:r})).status===`reverted`)return i.makeFailedTransferFromQuote(p,{environment:l,errorCode:t.ErrorCode.TRANSACTION_REVERTED,errorReason:`ERC20 approval transaction was reverted`})}let M=await u._estimateGasFromSwapResponse({crossChain:T,fromAddress:v,feeUnitsMarginBps:m?.estimateGasMarginBps,sourceClient:b,swap:A}),N={chainId:n.caip2ToEip155HexChainId(p.sourceChain.chainId),data:A.data,from:v,gas:M,to:A.to,value:A.value,...m?.maxFeePerGas===void 0?null:{maxFeePerGas:m.maxFeePerGas,maxPriorityFeePerGas:m.maxPriorityFeePerGas}},P={currentSignature:D?2:1,currentSignatureReason:e.TransferSignatureReason.TokensTransfer,quote:p,requiredSignatures:D?2:1};_?.(P);let F=Date.now();return j(await d.sign(N,async e=>b.sendRawTransaction({serializedTransaction:e}),P),F)}async function h({apiOptions:n,appId:r,environment:u,solanaSigner:f,quote:p,onStepChange:m}){if(!f)throw new t.SdkError(t.ErrorReason.INVALID_PARAMS,t.ErrorCode.INVALID_PARAMS,{details:`solanaSigner is required for Solana transfers but was not provided.`});if(!o.isSolAddress(p.fromAddress))throw new t.SdkError(t.ErrorReason.INVALID_PARAMS,t.ErrorCode.INVALID_PARAMS,{details:`fromAddress is not a valid Solana address.`});let h=s.calculateMarkrMinimumAmountOut({amountOut:p.amountOut,assetOut:p.assetOut,slippageBps:p.slippageBps}),g=s.assetToAddressString(p.assetIn,p.sourceChain.chainId),_=s.assetToAddressString(p.assetOut,p.targetChain.chainId),v=await a.markrSwap(n,{amountIn:p.amountIn.toString(),appId:r,minAmountOut:h.toString(),tokenIn:g,tokenOut:_,userPublicKey:p.fromAddress,uuid:p.id});if(!c.isSolanaSwapResponse(v))throw new t.SdkError(t.ErrorReason.CHAIN_NOT_SUPPORTED,t.ErrorCode.INVALID_PARAMS,{details:`Received non-SVM swap response from Markr, but only SVM swaps are supported for this source chain.`});console.debug(`[Fusion SDK] Original swap transaction (base64):`,v.swapTransaction);let y=await l.refreshSolanaSwapTransactionBlockhash(v.swapTransaction,i.getSolanaRpcForChain({chain:p.sourceChain}));console.debug(`[Fusion SDK] Refreshed swap transaction with new blockhash (base64):`,y);let b={currentSignature:1,currentSignatureReason:e.TransferSignatureReason.TokensTransfer,quote:p,requiredSignatures:1};m?.(b);let x=Date.now(),S=await f.signAndSend({account:p.fromAddress,serializedTx:y},b),C=p.sourceChain.chainId.toLowerCase()!==p.targetChain.chainId.toLowerCase();return{amountIn:p.amountIn,amountOut:p.amountOut,environment:u,fees:p.fees,fromAddress:p.fromAddress,id:p.id,partnerFeeBps:p.partnerFeeBps,sourceAsset:p.assetIn,sourceChain:p.sourceChain,status:`source-pending`,targetAsset:p.assetOut,targetChain:p.targetChain,toAddress:p.toAddress,type:e.ServiceType.MARKR,source:{confirmationCount:0,requiredConfirmationCount:C?2:d.SOLANA_REQUIRED_CONFIRMATIONS,startedAtMs:x,txHash:S}}}function g({approvalRequest:e,requiresApprovalSignature:t,signBatch:n,sourceChainId:i,targetChainId:a}){return r.isEvmNamespace(i)&&r.isEvmNamespace(a)&&i===a&&t&&e!==void 0&&typeof n==`function`}exports.transferAssetFactory=p;
2
2
  //# sourceMappingURL=transfer-asset.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"transfer-asset.cjs","names":["ServiceType","SdkError","ErrorReason","ErrorCode","isSolanaNamespace","isEvmNamespace","calculateMarkrMinimumAmountOut","getEvmClientForChain","assetToAddressString","isTokenAddressNative","markrGetSpenderAddress","caip2ToEip155ChainId","erc20Abi","applyFeeUnitsBpsMargin","caip2ToEip155HexChainId","markrSwap","isEvmSwapResponse","TransferSignatureReason","makeFailedTransferFromQuote","_estimateGasFromSwapResponse","isSolAddress","isSolanaSwapResponse","refreshSolanaSwapTransactionBlockhash","getSolanaRpcForChain","SOLANA_REQUIRED_CONFIRMATIONS"],"sources":["../../../../src/transfer-service/markr/_handlers/transfer-asset.ts"],"sourcesContent":["import { encodeFunctionData, erc20Abi, isAddress } from 'viem';\nimport { isEvmNamespace, isSolanaNamespace } from '../../../_utils/chain';\nimport { ServiceType, TransferSignatureReason } from '../../../constants';\nimport type { Environment } from '../../../constants';\nimport { ErrorCode, ErrorReason, SdkError } from '../../../errors';\nimport type { TransferService } from '../../../types/service';\nimport type { EvmSigner, EvmTransactionRequest, SolanaSigner } from '../../../types/signer';\nimport type { Transfer, TransferStepDetails } from '../../../types/transfer';\nimport { caip2ToEip155ChainId, caip2ToEip155HexChainId } from '../../../utils/caip';\nimport { isSolAddress } from '../../../utils/sol-address';\nimport {\n applyFeeUnitsBpsMargin,\n getEvmClientForChain,\n getSolanaRpcForChain,\n makeFailedTransferFromQuote,\n} from '../../_utils';\nimport { markrGetSpenderAddress, markrSwap, type ApiOptions } from '../_api';\nimport { assetToAddressString, calculateMarkrMinimumAmountOut, isTokenAddressNative } from '../_utils';\nimport { isEvmSwapResponse, isSolanaSwapResponse } from '../_type-guards';\nimport { SOLANA_REQUIRED_CONFIRMATIONS } from '../constants';\nimport { _estimateGasFromSwapResponse } from './estimate-native-fee';\nimport type { Caip2ChainId } from '../../../types/caip';\nimport { refreshSolanaSwapTransactionBlockhash } from '../_solana-utils';\n\nexport interface TransferAssetFactoryConfig {\n apiOptions: ApiOptions;\n appId: string;\n environment: Environment;\n evmSigner: EvmSigner;\n solanaSigner?: SolanaSigner;\n}\n\nexport function transferAssetFactory({\n apiOptions,\n appId,\n environment,\n evmSigner,\n solanaSigner,\n}: TransferAssetFactoryConfig): TransferService['transferAsset'] {\n return async ({ quote, gasSettings, fallbackToDefaultOnBatchFailure, onStepChange }) => {\n if (quote.serviceType !== ServiceType.MARKR) {\n throw new SdkError(ErrorReason.INCORRECT_PROVIDER_PROVIDED, ErrorCode.INVALID_PARAMS);\n }\n\n const now = Math.floor(Date.now() / 1_000);\n\n if (quote.expiresAt <= now) {\n throw new SdkError(ErrorReason.QUOTE_EXPIRED, ErrorCode.INVALID_PARAMS);\n }\n\n const sourceChainId = quote.sourceChain.chainId;\n\n if (isSolanaNamespace(sourceChainId)) {\n return _executeSvmTransfer({ apiOptions, appId, environment, solanaSigner, quote, onStepChange });\n }\n\n if (isEvmNamespace(sourceChainId)) {\n return _executeEvmTransfer({\n apiOptions,\n appId,\n environment,\n evmSigner,\n quote,\n gasSettings,\n fallbackToDefaultOnBatchFailure,\n onStepChange,\n });\n }\n\n throw new SdkError(ErrorReason.CHAIN_NOT_SUPPORTED, ErrorCode.INVALID_PARAMS, {\n details: `Unsupported source chain namespace: ${sourceChainId}`,\n });\n };\n}\n\n// ---------------------------------------------------------------------------\n// EVM transfer path\n// ---------------------------------------------------------------------------\n\ninterface EvmTransferParams {\n apiOptions: ApiOptions;\n appId: string;\n environment: Environment;\n evmSigner: EvmSigner;\n quote: Parameters<TransferService['transferAsset']>[0]['quote'];\n gasSettings?: Parameters<TransferService['transferAsset']>[0]['gasSettings'];\n fallbackToDefaultOnBatchFailure?: Parameters<TransferService['transferAsset']>[0]['fallbackToDefaultOnBatchFailure'];\n onStepChange?: Parameters<TransferService['transferAsset']>[0]['onStepChange'];\n}\n\nasync function _executeEvmTransfer({\n apiOptions,\n appId,\n environment,\n evmSigner,\n quote,\n gasSettings,\n fallbackToDefaultOnBatchFailure,\n onStepChange,\n}: EvmTransferParams): Promise<Transfer> {\n const fromAddress = quote.fromAddress;\n\n if (!isAddress(fromAddress)) {\n throw new SdkError(ErrorReason.INVALID_PARAMS, ErrorCode.INVALID_PARAMS, {\n details: 'fromAddress is not a valid EVM address.',\n });\n }\n\n const minAmountOut = calculateMarkrMinimumAmountOut({\n amountOut: quote.amountOut,\n assetOut: quote.assetOut,\n slippageBps: quote.slippageBps,\n });\n\n const sourceClient = getEvmClientForChain({ chain: quote.sourceChain });\n\n const tokenInAddressString = assetToAddressString(quote.assetIn, quote.sourceChain.chainId);\n const tokenOutAddressString = assetToAddressString(quote.assetOut, quote.targetChain.chainId);\n\n if (!isAddress(tokenInAddressString)) {\n throw new SdkError(ErrorReason.INVALID_PARAMS, ErrorCode.INVALID_PARAMS, {\n details: 'assetIn address is not a valid EVM address.',\n });\n }\n\n const tokenInAddress = tokenInAddressString;\n const isTokenInNative = isTokenAddressNative(tokenInAddress);\n const isCrossChainSwap = quote.sourceChain.chainId.toLowerCase() !== quote.targetChain.chainId.toLowerCase();\n\n const { address: spenderAddress } = await markrGetSpenderAddress(apiOptions, {\n chainId: caip2ToEip155ChainId(quote.sourceChain.chainId),\n crossChainSwap: isCrossChainSwap,\n quoteId: quote.id,\n });\n\n if (!isTokenInNative && !spenderAddress) {\n throw new SdkError(ErrorReason.CHAIN_NOT_SUPPORTED, ErrorCode.INVALID_PARAMS, {\n details: `Missing Markr spender address for source chain ${quote.sourceChain.chainId}.`,\n });\n }\n\n let requiresApprovalSignature = false;\n let approvalRequest: EvmTransactionRequest | undefined;\n\n if (!isTokenInNative && spenderAddress) {\n const allowance = await sourceClient.readContract({\n address: tokenInAddress,\n abi: erc20Abi,\n functionName: 'allowance',\n args: [fromAddress, spenderAddress],\n });\n\n if (allowance < quote.amountIn) {\n requiresApprovalSignature = true;\n\n const approvalData = encodeFunctionData({\n abi: erc20Abi,\n functionName: 'approve',\n args: [spenderAddress, quote.amountIn],\n });\n\n let approvalGasWithMargin: bigint | undefined;\n\n try {\n const approvalGasEstimate = await sourceClient.estimateGas({\n account: fromAddress,\n to: tokenInAddress,\n data: approvalData,\n value: 0n,\n });\n\n approvalGasWithMargin = applyFeeUnitsBpsMargin(approvalGasEstimate, gasSettings?.estimateGasMarginBps);\n } catch (err) {\n throw new SdkError('Error during gas estimation', ErrorCode.VIEM_ERROR, {\n cause: err,\n details: 'Failed to estimate gas for ERC20 approval transaction.',\n });\n }\n\n approvalRequest = {\n chainId: caip2ToEip155HexChainId(quote.sourceChain.chainId),\n data: approvalData,\n from: fromAddress,\n gas: approvalGasWithMargin,\n to: tokenInAddress,\n value: 0n,\n ...(gasSettings?.maxFeePerGas !== undefined\n ? {\n maxFeePerGas: gasSettings.maxFeePerGas,\n maxPriorityFeePerGas: gasSettings.maxPriorityFeePerGas,\n }\n : null),\n };\n }\n }\n\n const maybeOneClickBatch = isOneClickBatchEligible({\n approvalRequest,\n requiresApprovalSignature,\n signBatch: evmSigner.signBatch,\n sourceChainId: quote.sourceChain.chainId,\n targetChainId: quote.targetChain.chainId,\n });\n\n const swap = await markrSwap(apiOptions, {\n amountIn: quote.amountIn.toString(),\n appId,\n minAmountOut: minAmountOut.toString(),\n tokenIn: tokenInAddressString,\n tokenOut: tokenOutAddressString,\n uuid: quote.id,\n });\n\n if (!isEvmSwapResponse(swap)) {\n throw new SdkError(ErrorReason.CHAIN_NOT_SUPPORTED, ErrorCode.INVALID_PARAMS, {\n details: 'Received non-EVM swap response from Markr, but only EVM swaps are supported for this source chain.',\n });\n }\n\n const makePendingTransfer = (txHash: `0x${string}`, startedAtMs: number = Date.now()): Transfer => {\n const isSameChainTransfer = quote.sourceChain.chainId === quote.targetChain.chainId;\n\n return {\n amountIn: quote.amountIn,\n amountOut: quote.amountOut,\n environment,\n fees: quote.fees,\n fromAddress: quote.fromAddress,\n id: quote.id,\n partnerFeeBps: quote.partnerFeeBps,\n sourceAsset: quote.assetIn,\n sourceChain: quote.sourceChain,\n status: 'source-pending',\n targetAsset: quote.assetOut,\n targetChain: quote.targetChain,\n toAddress: quote.toAddress,\n type: ServiceType.MARKR,\n source: {\n confirmationCount: 0,\n requiredConfirmationCount: isSameChainTransfer ? 1 : 2,\n startedAtMs,\n txHash,\n },\n };\n };\n\n if (maybeOneClickBatch && approvalRequest) {\n const batchStep: TransferStepDetails = {\n currentSignature: 1,\n currentSignatureReason: TransferSignatureReason.TokensTransfer,\n quote,\n requiredSignatures: 1,\n };\n\n const signBatch = evmSigner.signBatch;\n\n if (!signBatch) {\n throw new SdkError('One-click batch signer is not available.', ErrorCode.SIGNING_FAILED);\n }\n\n const swapRequest: EvmTransactionRequest = {\n chainId: caip2ToEip155HexChainId(quote.sourceChain.chainId),\n data: swap.data,\n from: fromAddress,\n // Gas is purposely left undefined here.\n // We can't estimate the gas because we aren't executing the\n // approval tx. It's up to the wallet to correctly handle gas estimation.\n gas: undefined,\n to: swap.to,\n value: swap.value,\n ...(gasSettings?.maxFeePerGas !== undefined\n ? {\n maxFeePerGas: gasSettings.maxFeePerGas,\n maxPriorityFeePerGas: gasSettings.maxPriorityFeePerGas,\n }\n : null),\n };\n\n onStepChange?.(batchStep);\n\n try {\n const txHashes = await signBatch(\n [approvalRequest, swapRequest],\n async (signedTxHash) => sourceClient.sendRawTransaction({ serializedTransaction: signedTxHash }),\n batchStep,\n );\n\n const swapTxHash = txHashes.at(-1);\n\n if (!swapTxHash) {\n throw new SdkError('One-click batch signing returned no transaction hashes.', ErrorCode.SIGNING_FAILED);\n }\n\n return makePendingTransfer(swapTxHash);\n } catch (error) {\n if (!fallbackToDefaultOnBatchFailure) {\n throw error;\n }\n }\n }\n\n if (requiresApprovalSignature && approvalRequest) {\n const approvalStep: TransferStepDetails = {\n currentSignature: 1,\n currentSignatureReason: TransferSignatureReason.AllowanceApproval,\n quote,\n requiredSignatures: 2,\n };\n\n onStepChange?.(approvalStep);\n\n const approvalTxHash = await evmSigner.sign(\n approvalRequest,\n async (signedTxHash) => sourceClient.sendRawTransaction({ serializedTransaction: signedTxHash }),\n approvalStep,\n );\n\n const approvalReceipt = await sourceClient.waitForTransactionReceipt({ hash: approvalTxHash });\n\n if (approvalReceipt.status === 'reverted') {\n return makeFailedTransferFromQuote(quote, {\n environment,\n errorCode: ErrorCode.TRANSACTION_REVERTED,\n errorReason: 'ERC20 approval transaction was reverted',\n });\n }\n }\n\n const swapGasWithMargin = await _estimateGasFromSwapResponse({\n crossChain: isCrossChainSwap,\n fromAddress,\n feeUnitsMarginBps: gasSettings?.estimateGasMarginBps,\n sourceClient,\n swap,\n });\n\n const swapRequest: EvmTransactionRequest = {\n chainId: caip2ToEip155HexChainId(quote.sourceChain.chainId),\n data: swap.data,\n from: fromAddress,\n gas: swapGasWithMargin,\n to: swap.to,\n value: swap.value,\n ...(gasSettings?.maxFeePerGas !== undefined\n ? {\n maxFeePerGas: gasSettings.maxFeePerGas,\n maxPriorityFeePerGas: gasSettings.maxPriorityFeePerGas,\n }\n : null),\n };\n\n const step: TransferStepDetails = {\n currentSignature: requiresApprovalSignature ? 2 : 1,\n currentSignatureReason: TransferSignatureReason.TokensTransfer,\n quote,\n requiredSignatures: requiresApprovalSignature ? 2 : 1,\n };\n\n onStepChange?.(step);\n\n const startedAtMs = Date.now();\n\n const txHash = await evmSigner.sign(\n swapRequest,\n async (signedTxHash) => sourceClient.sendRawTransaction({ serializedTransaction: signedTxHash }),\n step,\n );\n\n return makePendingTransfer(txHash, startedAtMs);\n}\n\n// ---------------------------------------------------------------------------\n// SVM (Solana) transfer path\n// ---------------------------------------------------------------------------\n\ninterface SvmTransferParams {\n apiOptions: ApiOptions;\n appId: string;\n environment: Environment;\n solanaSigner?: SolanaSigner;\n quote: Parameters<TransferService['transferAsset']>[0]['quote'];\n onStepChange?: Parameters<TransferService['transferAsset']>[0]['onStepChange'];\n}\n\nasync function _executeSvmTransfer({\n apiOptions,\n appId,\n environment,\n solanaSigner,\n quote,\n onStepChange,\n}: SvmTransferParams): Promise<Transfer> {\n if (!solanaSigner) {\n throw new SdkError(ErrorReason.INVALID_PARAMS, ErrorCode.INVALID_PARAMS, {\n details: 'solanaSigner is required for Solana transfers but was not provided.',\n });\n }\n\n if (!isSolAddress(quote.fromAddress)) {\n throw new SdkError(ErrorReason.INVALID_PARAMS, ErrorCode.INVALID_PARAMS, {\n details: 'fromAddress is not a valid Solana address.',\n });\n }\n\n const minAmountOut = calculateMarkrMinimumAmountOut({\n amountOut: quote.amountOut,\n assetOut: quote.assetOut,\n slippageBps: quote.slippageBps,\n });\n\n const tokenInAddressString = assetToAddressString(quote.assetIn, quote.sourceChain.chainId);\n const tokenOutAddressString = assetToAddressString(quote.assetOut, quote.targetChain.chainId);\n\n const swap = await markrSwap(apiOptions, {\n amountIn: quote.amountIn.toString(),\n appId,\n minAmountOut: minAmountOut.toString(),\n tokenIn: tokenInAddressString,\n tokenOut: tokenOutAddressString,\n userPublicKey: quote.fromAddress,\n uuid: quote.id,\n });\n\n if (!isSolanaSwapResponse(swap)) {\n throw new SdkError(ErrorReason.CHAIN_NOT_SUPPORTED, ErrorCode.INVALID_PARAMS, {\n details: 'Received non-SVM swap response from Markr, but only SVM swaps are supported for this source chain.',\n });\n }\n\n const swapTransactionBase64 = await refreshSolanaSwapTransactionBlockhash(\n swap.swapTransaction,\n getSolanaRpcForChain({ chain: quote.sourceChain }),\n );\n\n const step: TransferStepDetails = {\n currentSignature: 1,\n currentSignatureReason: TransferSignatureReason.TokensTransfer,\n quote,\n requiredSignatures: 1,\n };\n\n onStepChange?.(step);\n\n const startedAtMs = Date.now();\n\n const txHash = await solanaSigner.signAndSend(\n {\n account: quote.fromAddress,\n serializedTx: swapTransactionBase64,\n },\n step,\n );\n\n const isCrossChainSwap = quote.sourceChain.chainId.toLowerCase() !== quote.targetChain.chainId.toLowerCase();\n\n return {\n amountIn: quote.amountIn,\n amountOut: quote.amountOut,\n environment,\n fees: quote.fees,\n fromAddress: quote.fromAddress,\n id: quote.id,\n partnerFeeBps: quote.partnerFeeBps,\n sourceAsset: quote.assetIn,\n sourceChain: quote.sourceChain,\n status: 'source-pending',\n targetAsset: quote.assetOut,\n targetChain: quote.targetChain,\n toAddress: quote.toAddress,\n type: ServiceType.MARKR,\n source: {\n confirmationCount: 0,\n requiredConfirmationCount: isCrossChainSwap ? 2 : SOLANA_REQUIRED_CONFIRMATIONS,\n startedAtMs,\n txHash,\n },\n };\n}\n\n/**\n * Determines whether one-click swap eligibility criteria is met.\n *\n * Only same-chain EVM swaps are currently eligible.\n */\nfunction isOneClickBatchEligible({\n approvalRequest,\n requiresApprovalSignature,\n signBatch,\n sourceChainId,\n targetChainId,\n}: {\n approvalRequest?: EvmTransactionRequest;\n requiresApprovalSignature: boolean;\n signBatch?: EvmSigner['signBatch'];\n sourceChainId: Caip2ChainId;\n targetChainId: Caip2ChainId;\n}): boolean {\n return (\n isEvmNamespace(sourceChainId) &&\n isEvmNamespace(targetChainId) &&\n sourceChainId === targetChainId &&\n requiresApprovalSignature &&\n approvalRequest !== undefined &&\n typeof signBatch === 'function'\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"transfer-asset.cjs","names":["ServiceType","SdkError","ErrorReason","ErrorCode","isSolanaNamespace","isEvmNamespace","calculateMarkrMinimumAmountOut","getEvmClientForChain","assetToAddressString","isTokenAddressNative","markrGetSpenderAddress","caip2ToEip155ChainId","erc20Abi","applyFeeUnitsBpsMargin","caip2ToEip155HexChainId","markrSwap","isEvmSwapResponse","TransferSignatureReason","makeFailedTransferFromQuote","_estimateGasFromSwapResponse","isSolAddress","isSolanaSwapResponse","refreshSolanaSwapTransactionBlockhash","getSolanaRpcForChain","SOLANA_REQUIRED_CONFIRMATIONS"],"sources":["../../../../src/transfer-service/markr/_handlers/transfer-asset.ts"],"sourcesContent":["import { encodeFunctionData, erc20Abi, isAddress } from 'viem';\nimport { isEvmNamespace, isSolanaNamespace } from '../../../_utils/chain';\nimport { ServiceType, TransferSignatureReason } from '../../../constants';\nimport type { Environment } from '../../../constants';\nimport { ErrorCode, ErrorReason, SdkError } from '../../../errors';\nimport type { TransferService } from '../../../types/service';\nimport type { EvmSigner, EvmTransactionRequest, SolanaSigner } from '../../../types/signer';\nimport type { Transfer, TransferStepDetails } from '../../../types/transfer';\nimport { caip2ToEip155ChainId, caip2ToEip155HexChainId } from '../../../utils/caip';\nimport { isSolAddress } from '../../../utils/sol-address';\nimport {\n applyFeeUnitsBpsMargin,\n getEvmClientForChain,\n getSolanaRpcForChain,\n makeFailedTransferFromQuote,\n} from '../../_utils';\nimport { markrGetSpenderAddress, markrSwap, type ApiOptions } from '../_api';\nimport { assetToAddressString, calculateMarkrMinimumAmountOut, isTokenAddressNative } from '../_utils';\nimport { isEvmSwapResponse, isSolanaSwapResponse } from '../_type-guards';\nimport { SOLANA_REQUIRED_CONFIRMATIONS } from '../constants';\nimport { _estimateGasFromSwapResponse } from './estimate-native-fee';\nimport type { Caip2ChainId } from '../../../types/caip';\nimport { refreshSolanaSwapTransactionBlockhash } from '../_solana-utils';\n\nexport interface TransferAssetFactoryConfig {\n apiOptions: ApiOptions;\n appId: string;\n environment: Environment;\n evmSigner: EvmSigner;\n solanaSigner?: SolanaSigner;\n}\n\nexport function transferAssetFactory({\n apiOptions,\n appId,\n environment,\n evmSigner,\n solanaSigner,\n}: TransferAssetFactoryConfig): TransferService['transferAsset'] {\n return async ({ quote, gasSettings, fallbackToDefaultOnBatchFailure, onStepChange }) => {\n if (quote.serviceType !== ServiceType.MARKR) {\n throw new SdkError(ErrorReason.INCORRECT_PROVIDER_PROVIDED, ErrorCode.INVALID_PARAMS);\n }\n\n const now = Math.floor(Date.now() / 1_000);\n\n if (quote.expiresAt <= now) {\n throw new SdkError(ErrorReason.QUOTE_EXPIRED, ErrorCode.INVALID_PARAMS);\n }\n\n const sourceChainId = quote.sourceChain.chainId;\n\n if (isSolanaNamespace(sourceChainId)) {\n return _executeSvmTransfer({ apiOptions, appId, environment, solanaSigner, quote, onStepChange });\n }\n\n if (isEvmNamespace(sourceChainId)) {\n return _executeEvmTransfer({\n apiOptions,\n appId,\n environment,\n evmSigner,\n quote,\n gasSettings,\n fallbackToDefaultOnBatchFailure,\n onStepChange,\n });\n }\n\n throw new SdkError(ErrorReason.CHAIN_NOT_SUPPORTED, ErrorCode.INVALID_PARAMS, {\n details: `Unsupported source chain namespace: ${sourceChainId}`,\n });\n };\n}\n\n// ---------------------------------------------------------------------------\n// EVM transfer path\n// ---------------------------------------------------------------------------\n\ninterface EvmTransferParams {\n apiOptions: ApiOptions;\n appId: string;\n environment: Environment;\n evmSigner: EvmSigner;\n quote: Parameters<TransferService['transferAsset']>[0]['quote'];\n gasSettings?: Parameters<TransferService['transferAsset']>[0]['gasSettings'];\n fallbackToDefaultOnBatchFailure?: Parameters<TransferService['transferAsset']>[0]['fallbackToDefaultOnBatchFailure'];\n onStepChange?: Parameters<TransferService['transferAsset']>[0]['onStepChange'];\n}\n\nasync function _executeEvmTransfer({\n apiOptions,\n appId,\n environment,\n evmSigner,\n quote,\n gasSettings,\n fallbackToDefaultOnBatchFailure,\n onStepChange,\n}: EvmTransferParams): Promise<Transfer> {\n const fromAddress = quote.fromAddress;\n\n if (!isAddress(fromAddress)) {\n throw new SdkError(ErrorReason.INVALID_PARAMS, ErrorCode.INVALID_PARAMS, {\n details: 'fromAddress is not a valid EVM address.',\n });\n }\n\n const minAmountOut = calculateMarkrMinimumAmountOut({\n amountOut: quote.amountOut,\n assetOut: quote.assetOut,\n slippageBps: quote.slippageBps,\n });\n\n const sourceClient = getEvmClientForChain({ chain: quote.sourceChain });\n\n const tokenInAddressString = assetToAddressString(quote.assetIn, quote.sourceChain.chainId);\n const tokenOutAddressString = assetToAddressString(quote.assetOut, quote.targetChain.chainId);\n\n if (!isAddress(tokenInAddressString)) {\n throw new SdkError(ErrorReason.INVALID_PARAMS, ErrorCode.INVALID_PARAMS, {\n details: 'assetIn address is not a valid EVM address.',\n });\n }\n\n const tokenInAddress = tokenInAddressString;\n const isTokenInNative = isTokenAddressNative(tokenInAddress);\n const isCrossChainSwap = quote.sourceChain.chainId.toLowerCase() !== quote.targetChain.chainId.toLowerCase();\n\n const { address: spenderAddress } = await markrGetSpenderAddress(apiOptions, {\n chainId: caip2ToEip155ChainId(quote.sourceChain.chainId),\n crossChainSwap: isCrossChainSwap,\n quoteId: quote.id,\n });\n\n if (!isTokenInNative && !spenderAddress) {\n throw new SdkError(ErrorReason.CHAIN_NOT_SUPPORTED, ErrorCode.INVALID_PARAMS, {\n details: `Missing Markr spender address for source chain ${quote.sourceChain.chainId}.`,\n });\n }\n\n let requiresApprovalSignature = false;\n let approvalRequest: EvmTransactionRequest | undefined;\n\n if (!isTokenInNative && spenderAddress) {\n const allowance = await sourceClient.readContract({\n address: tokenInAddress,\n abi: erc20Abi,\n functionName: 'allowance',\n args: [fromAddress, spenderAddress],\n });\n\n if (allowance < quote.amountIn) {\n requiresApprovalSignature = true;\n\n const approvalData = encodeFunctionData({\n abi: erc20Abi,\n functionName: 'approve',\n args: [spenderAddress, quote.amountIn],\n });\n\n let approvalGasWithMargin: bigint | undefined;\n\n try {\n const approvalGasEstimate = await sourceClient.estimateGas({\n account: fromAddress,\n to: tokenInAddress,\n data: approvalData,\n value: 0n,\n });\n\n approvalGasWithMargin = applyFeeUnitsBpsMargin(approvalGasEstimate, gasSettings?.estimateGasMarginBps);\n } catch (err) {\n throw new SdkError('Error during gas estimation', ErrorCode.VIEM_ERROR, {\n cause: err,\n details: 'Failed to estimate gas for ERC20 approval transaction.',\n });\n }\n\n approvalRequest = {\n chainId: caip2ToEip155HexChainId(quote.sourceChain.chainId),\n data: approvalData,\n from: fromAddress,\n gas: approvalGasWithMargin,\n to: tokenInAddress,\n value: 0n,\n ...(gasSettings?.maxFeePerGas !== undefined\n ? {\n maxFeePerGas: gasSettings.maxFeePerGas,\n maxPriorityFeePerGas: gasSettings.maxPriorityFeePerGas,\n }\n : null),\n };\n }\n }\n\n const maybeOneClickBatch = isOneClickBatchEligible({\n approvalRequest,\n requiresApprovalSignature,\n signBatch: evmSigner.signBatch,\n sourceChainId: quote.sourceChain.chainId,\n targetChainId: quote.targetChain.chainId,\n });\n\n const swap = await markrSwap(apiOptions, {\n amountIn: quote.amountIn.toString(),\n appId,\n minAmountOut: minAmountOut.toString(),\n tokenIn: tokenInAddressString,\n tokenOut: tokenOutAddressString,\n uuid: quote.id,\n });\n\n if (!isEvmSwapResponse(swap)) {\n throw new SdkError(ErrorReason.CHAIN_NOT_SUPPORTED, ErrorCode.INVALID_PARAMS, {\n details: 'Received non-EVM swap response from Markr, but only EVM swaps are supported for this source chain.',\n });\n }\n\n const makePendingTransfer = (txHash: `0x${string}`, startedAtMs: number = Date.now()): Transfer => {\n const isSameChainTransfer = quote.sourceChain.chainId === quote.targetChain.chainId;\n\n return {\n amountIn: quote.amountIn,\n amountOut: quote.amountOut,\n environment,\n fees: quote.fees,\n fromAddress: quote.fromAddress,\n id: quote.id,\n partnerFeeBps: quote.partnerFeeBps,\n sourceAsset: quote.assetIn,\n sourceChain: quote.sourceChain,\n status: 'source-pending',\n targetAsset: quote.assetOut,\n targetChain: quote.targetChain,\n toAddress: quote.toAddress,\n type: ServiceType.MARKR,\n source: {\n confirmationCount: 0,\n requiredConfirmationCount: isSameChainTransfer ? 1 : 2,\n startedAtMs,\n txHash,\n },\n };\n };\n\n if (maybeOneClickBatch && approvalRequest) {\n const batchStep: TransferStepDetails = {\n currentSignature: 1,\n currentSignatureReason: TransferSignatureReason.TokensTransfer,\n quote,\n requiredSignatures: 1,\n };\n\n const signBatch = evmSigner.signBatch;\n\n if (!signBatch) {\n throw new SdkError('One-click batch signer is not available.', ErrorCode.SIGNING_FAILED);\n }\n\n const swapRequest: EvmTransactionRequest = {\n chainId: caip2ToEip155HexChainId(quote.sourceChain.chainId),\n data: swap.data,\n from: fromAddress,\n // Gas is purposely left undefined here.\n // We can't estimate the gas because we aren't executing the\n // approval tx. It's up to the wallet to correctly handle gas estimation.\n gas: undefined,\n to: swap.to,\n value: swap.value,\n ...(gasSettings?.maxFeePerGas !== undefined\n ? {\n maxFeePerGas: gasSettings.maxFeePerGas,\n maxPriorityFeePerGas: gasSettings.maxPriorityFeePerGas,\n }\n : null),\n };\n\n onStepChange?.(batchStep);\n\n try {\n const txHashes = await signBatch(\n [approvalRequest, swapRequest],\n async (signedTxHash) => sourceClient.sendRawTransaction({ serializedTransaction: signedTxHash }),\n batchStep,\n );\n\n const swapTxHash = txHashes.at(-1);\n\n if (!swapTxHash) {\n throw new SdkError('One-click batch signing returned no transaction hashes.', ErrorCode.SIGNING_FAILED);\n }\n\n return makePendingTransfer(swapTxHash);\n } catch (error) {\n if (!fallbackToDefaultOnBatchFailure) {\n throw error;\n }\n }\n }\n\n if (requiresApprovalSignature && approvalRequest) {\n const approvalStep: TransferStepDetails = {\n currentSignature: 1,\n currentSignatureReason: TransferSignatureReason.AllowanceApproval,\n quote,\n requiredSignatures: 2,\n };\n\n onStepChange?.(approvalStep);\n\n const approvalTxHash = await evmSigner.sign(\n approvalRequest,\n async (signedTxHash) => sourceClient.sendRawTransaction({ serializedTransaction: signedTxHash }),\n approvalStep,\n );\n\n const approvalReceipt = await sourceClient.waitForTransactionReceipt({ hash: approvalTxHash });\n\n if (approvalReceipt.status === 'reverted') {\n return makeFailedTransferFromQuote(quote, {\n environment,\n errorCode: ErrorCode.TRANSACTION_REVERTED,\n errorReason: 'ERC20 approval transaction was reverted',\n });\n }\n }\n\n const swapGasWithMargin = await _estimateGasFromSwapResponse({\n crossChain: isCrossChainSwap,\n fromAddress,\n feeUnitsMarginBps: gasSettings?.estimateGasMarginBps,\n sourceClient,\n swap,\n });\n\n const swapRequest: EvmTransactionRequest = {\n chainId: caip2ToEip155HexChainId(quote.sourceChain.chainId),\n data: swap.data,\n from: fromAddress,\n gas: swapGasWithMargin,\n to: swap.to,\n value: swap.value,\n ...(gasSettings?.maxFeePerGas !== undefined\n ? {\n maxFeePerGas: gasSettings.maxFeePerGas,\n maxPriorityFeePerGas: gasSettings.maxPriorityFeePerGas,\n }\n : null),\n };\n\n const step: TransferStepDetails = {\n currentSignature: requiresApprovalSignature ? 2 : 1,\n currentSignatureReason: TransferSignatureReason.TokensTransfer,\n quote,\n requiredSignatures: requiresApprovalSignature ? 2 : 1,\n };\n\n onStepChange?.(step);\n\n const startedAtMs = Date.now();\n\n const txHash = await evmSigner.sign(\n swapRequest,\n async (signedTxHash) => sourceClient.sendRawTransaction({ serializedTransaction: signedTxHash }),\n step,\n );\n\n return makePendingTransfer(txHash, startedAtMs);\n}\n\n// ---------------------------------------------------------------------------\n// SVM (Solana) transfer path\n// ---------------------------------------------------------------------------\n\ninterface SvmTransferParams {\n apiOptions: ApiOptions;\n appId: string;\n environment: Environment;\n solanaSigner?: SolanaSigner;\n quote: Parameters<TransferService['transferAsset']>[0]['quote'];\n onStepChange?: Parameters<TransferService['transferAsset']>[0]['onStepChange'];\n}\n\nasync function _executeSvmTransfer({\n apiOptions,\n appId,\n environment,\n solanaSigner,\n quote,\n onStepChange,\n}: SvmTransferParams): Promise<Transfer> {\n if (!solanaSigner) {\n throw new SdkError(ErrorReason.INVALID_PARAMS, ErrorCode.INVALID_PARAMS, {\n details: 'solanaSigner is required for Solana transfers but was not provided.',\n });\n }\n\n if (!isSolAddress(quote.fromAddress)) {\n throw new SdkError(ErrorReason.INVALID_PARAMS, ErrorCode.INVALID_PARAMS, {\n details: 'fromAddress is not a valid Solana address.',\n });\n }\n\n const minAmountOut = calculateMarkrMinimumAmountOut({\n amountOut: quote.amountOut,\n assetOut: quote.assetOut,\n slippageBps: quote.slippageBps,\n });\n\n const tokenInAddressString = assetToAddressString(quote.assetIn, quote.sourceChain.chainId);\n const tokenOutAddressString = assetToAddressString(quote.assetOut, quote.targetChain.chainId);\n\n const swap = await markrSwap(apiOptions, {\n amountIn: quote.amountIn.toString(),\n appId,\n minAmountOut: minAmountOut.toString(),\n tokenIn: tokenInAddressString,\n tokenOut: tokenOutAddressString,\n userPublicKey: quote.fromAddress,\n uuid: quote.id,\n });\n\n if (!isSolanaSwapResponse(swap)) {\n throw new SdkError(ErrorReason.CHAIN_NOT_SUPPORTED, ErrorCode.INVALID_PARAMS, {\n details: 'Received non-SVM swap response from Markr, but only SVM swaps are supported for this source chain.',\n });\n }\n\n // TODO: Cleanup\n console.debug('[Fusion SDK] Original swap transaction (base64):', swap.swapTransaction);\n\n const swapTransactionBase64 = await refreshSolanaSwapTransactionBlockhash(\n swap.swapTransaction,\n getSolanaRpcForChain({ chain: quote.sourceChain }),\n );\n\n // TODO: Cleanup\n console.debug('[Fusion SDK] Refreshed swap transaction with new blockhash (base64):', swapTransactionBase64);\n\n const step: TransferStepDetails = {\n currentSignature: 1,\n currentSignatureReason: TransferSignatureReason.TokensTransfer,\n quote,\n requiredSignatures: 1,\n };\n\n onStepChange?.(step);\n\n const startedAtMs = Date.now();\n\n const txHash = await solanaSigner.signAndSend(\n {\n account: quote.fromAddress,\n serializedTx: swapTransactionBase64,\n },\n step,\n );\n\n const isCrossChainSwap = quote.sourceChain.chainId.toLowerCase() !== quote.targetChain.chainId.toLowerCase();\n\n return {\n amountIn: quote.amountIn,\n amountOut: quote.amountOut,\n environment,\n fees: quote.fees,\n fromAddress: quote.fromAddress,\n id: quote.id,\n partnerFeeBps: quote.partnerFeeBps,\n sourceAsset: quote.assetIn,\n sourceChain: quote.sourceChain,\n status: 'source-pending',\n targetAsset: quote.assetOut,\n targetChain: quote.targetChain,\n toAddress: quote.toAddress,\n type: ServiceType.MARKR,\n source: {\n confirmationCount: 0,\n requiredConfirmationCount: isCrossChainSwap ? 2 : SOLANA_REQUIRED_CONFIRMATIONS,\n startedAtMs,\n txHash,\n },\n };\n}\n\n/**\n * Determines whether one-click swap eligibility criteria is met.\n *\n * Only same-chain EVM swaps are currently eligible.\n */\nfunction isOneClickBatchEligible({\n approvalRequest,\n requiresApprovalSignature,\n signBatch,\n sourceChainId,\n targetChainId,\n}: {\n approvalRequest?: EvmTransactionRequest;\n requiresApprovalSignature: boolean;\n signBatch?: EvmSigner['signBatch'];\n sourceChainId: Caip2ChainId;\n targetChainId: Caip2ChainId;\n}): boolean {\n return (\n isEvmNamespace(sourceChainId) &&\n isEvmNamespace(targetChainId) &&\n sourceChainId === targetChainId &&\n requiresApprovalSignature &&\n approvalRequest !== undefined &&\n typeof signBatch === 'function'\n );\n}\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{ServiceType as e,TransferSignatureReason as t}from"../../../constants.js";import{ErrorCode as n,ErrorReason as r,SdkError as i}from"../../../errors.js";import{caip2ToEip155ChainId as a,caip2ToEip155HexChainId as o}from"../../../utils/caip.js";import{isEvmNamespace as s,isSolanaNamespace as c}from"../../../_utils/chain.js";import{applyFeeUnitsBpsMargin as l,getEvmClientForChain as u,getSolanaRpcForChain as d,makeFailedTransferFromQuote as f}from"../../_utils.js";import{markrGetSpenderAddress as p,markrSwap as m}from"../_api.js";import{isSolAddress as h}from"../../../utils/sol-address.js";import{assetToAddressString as g,calculateMarkrMinimumAmountOut as _,isTokenAddressNative as v}from"../_utils.js";import{isEvmSwapResponse as y,isSolanaSwapResponse as b}from"../_type-guards.js";import{refreshSolanaSwapTransactionBlockhash as x}from"../_solana-utils.js";import{_estimateGasFromSwapResponse as S}from"./estimate-native-fee.js";import{SOLANA_REQUIRED_CONFIRMATIONS as C}from"../constants.js";import{encodeFunctionData as w,erc20Abi as T,isAddress as E}from"viem";function D({apiOptions:t,appId:a,environment:o,evmSigner:l,solanaSigner:u}){return async({quote:d,gasSettings:f,fallbackToDefaultOnBatchFailure:p,onStepChange:m})=>{if(d.serviceType!==e.MARKR)throw new i(r.INCORRECT_PROVIDER_PROVIDED,n.INVALID_PARAMS);let h=Math.floor(Date.now()/1e3);if(d.expiresAt<=h)throw new i(r.QUOTE_EXPIRED,n.INVALID_PARAMS);let g=d.sourceChain.chainId;if(c(g))return k({apiOptions:t,appId:a,environment:o,solanaSigner:u,quote:d,onStepChange:m});if(s(g))return O({apiOptions:t,appId:a,environment:o,evmSigner:l,quote:d,gasSettings:f,fallbackToDefaultOnBatchFailure:p,onStepChange:m});throw new i(r.CHAIN_NOT_SUPPORTED,n.INVALID_PARAMS,{details:`Unsupported source chain namespace: ${g}`})}}async function O({apiOptions:s,appId:c,environment:d,evmSigner:h,quote:b,gasSettings:x,fallbackToDefaultOnBatchFailure:C,onStepChange:D}){let O=b.fromAddress;if(!E(O))throw new i(r.INVALID_PARAMS,n.INVALID_PARAMS,{details:`fromAddress is not a valid EVM address.`});let k=_({amountOut:b.amountOut,assetOut:b.assetOut,slippageBps:b.slippageBps}),j=u({chain:b.sourceChain}),M=g(b.assetIn,b.sourceChain.chainId),N=g(b.assetOut,b.targetChain.chainId);if(!E(M))throw new i(r.INVALID_PARAMS,n.INVALID_PARAMS,{details:`assetIn address is not a valid EVM address.`});let P=M,F=v(P),I=b.sourceChain.chainId.toLowerCase()!==b.targetChain.chainId.toLowerCase(),{address:L}=await p(s,{chainId:a(b.sourceChain.chainId),crossChainSwap:I,quoteId:b.id});if(!F&&!L)throw new i(r.CHAIN_NOT_SUPPORTED,n.INVALID_PARAMS,{details:`Missing Markr spender address for source chain ${b.sourceChain.chainId}.`});let R=!1,z;if(!F&&L&&await j.readContract({address:P,abi:T,functionName:`allowance`,args:[O,L]})<b.amountIn){R=!0;let e=w({abi:T,functionName:`approve`,args:[L,b.amountIn]}),t;try{t=l(await j.estimateGas({account:O,to:P,data:e,value:0n}),x?.estimateGasMarginBps)}catch(e){throw new i(`Error during gas estimation`,n.VIEM_ERROR,{cause:e,details:`Failed to estimate gas for ERC20 approval transaction.`})}z={chainId:o(b.sourceChain.chainId),data:e,from:O,gas:t,to:P,value:0n,...x?.maxFeePerGas===void 0?null:{maxFeePerGas:x.maxFeePerGas,maxPriorityFeePerGas:x.maxPriorityFeePerGas}}}let B=A({approvalRequest:z,requiresApprovalSignature:R,signBatch:h.signBatch,sourceChainId:b.sourceChain.chainId,targetChainId:b.targetChain.chainId}),V=await m(s,{amountIn:b.amountIn.toString(),appId:c,minAmountOut:k.toString(),tokenIn:M,tokenOut:N,uuid:b.id});if(!y(V))throw new i(r.CHAIN_NOT_SUPPORTED,n.INVALID_PARAMS,{details:`Received non-EVM swap response from Markr, but only EVM swaps are supported for this source chain.`});let H=(t,n=Date.now())=>{let r=b.sourceChain.chainId===b.targetChain.chainId;return{amountIn:b.amountIn,amountOut:b.amountOut,environment:d,fees:b.fees,fromAddress:b.fromAddress,id:b.id,partnerFeeBps:b.partnerFeeBps,sourceAsset:b.assetIn,sourceChain:b.sourceChain,status:`source-pending`,targetAsset:b.assetOut,targetChain:b.targetChain,toAddress:b.toAddress,type:e.MARKR,source:{confirmationCount:0,requiredConfirmationCount:r?1:2,startedAtMs:n,txHash:t}}};if(B&&z){let e={currentSignature:1,currentSignatureReason:t.TokensTransfer,quote:b,requiredSignatures:1},r=h.signBatch;if(!r)throw new i(`One-click batch signer is not available.`,n.SIGNING_FAILED);let a={chainId:o(b.sourceChain.chainId),data:V.data,from:O,gas:void 0,to:V.to,value:V.value,...x?.maxFeePerGas===void 0?null:{maxFeePerGas:x.maxFeePerGas,maxPriorityFeePerGas:x.maxPriorityFeePerGas}};D?.(e);try{let t=(await r([z,a],async e=>j.sendRawTransaction({serializedTransaction:e}),e)).at(-1);if(!t)throw new i(`One-click batch signing returned no transaction hashes.`,n.SIGNING_FAILED);return H(t)}catch(e){if(!C)throw e}}if(R&&z){let e={currentSignature:1,currentSignatureReason:t.AllowanceApproval,quote:b,requiredSignatures:2};D?.(e);let r=await h.sign(z,async e=>j.sendRawTransaction({serializedTransaction:e}),e);if((await j.waitForTransactionReceipt({hash:r})).status===`reverted`)return f(b,{environment:d,errorCode:n.TRANSACTION_REVERTED,errorReason:`ERC20 approval transaction was reverted`})}let U=await S({crossChain:I,fromAddress:O,feeUnitsMarginBps:x?.estimateGasMarginBps,sourceClient:j,swap:V}),W={chainId:o(b.sourceChain.chainId),data:V.data,from:O,gas:U,to:V.to,value:V.value,...x?.maxFeePerGas===void 0?null:{maxFeePerGas:x.maxFeePerGas,maxPriorityFeePerGas:x.maxPriorityFeePerGas}},G={currentSignature:R?2:1,currentSignatureReason:t.TokensTransfer,quote:b,requiredSignatures:R?2:1};D?.(G);let K=Date.now();return H(await h.sign(W,async e=>j.sendRawTransaction({serializedTransaction:e}),G),K)}async function k({apiOptions:a,appId:o,environment:s,solanaSigner:c,quote:l,onStepChange:u}){if(!c)throw new i(r.INVALID_PARAMS,n.INVALID_PARAMS,{details:`solanaSigner is required for Solana transfers but was not provided.`});if(!h(l.fromAddress))throw new i(r.INVALID_PARAMS,n.INVALID_PARAMS,{details:`fromAddress is not a valid Solana address.`});let f=_({amountOut:l.amountOut,assetOut:l.assetOut,slippageBps:l.slippageBps}),p=g(l.assetIn,l.sourceChain.chainId),v=g(l.assetOut,l.targetChain.chainId),y=await m(a,{amountIn:l.amountIn.toString(),appId:o,minAmountOut:f.toString(),tokenIn:p,tokenOut:v,userPublicKey:l.fromAddress,uuid:l.id});if(!b(y))throw new i(r.CHAIN_NOT_SUPPORTED,n.INVALID_PARAMS,{details:`Received non-SVM swap response from Markr, but only SVM swaps are supported for this source chain.`});let S=await x(y.swapTransaction,d({chain:l.sourceChain})),w={currentSignature:1,currentSignatureReason:t.TokensTransfer,quote:l,requiredSignatures:1};u?.(w);let T=Date.now(),E=await c.signAndSend({account:l.fromAddress,serializedTx:S},w),D=l.sourceChain.chainId.toLowerCase()!==l.targetChain.chainId.toLowerCase();return{amountIn:l.amountIn,amountOut:l.amountOut,environment:s,fees:l.fees,fromAddress:l.fromAddress,id:l.id,partnerFeeBps:l.partnerFeeBps,sourceAsset:l.assetIn,sourceChain:l.sourceChain,status:`source-pending`,targetAsset:l.assetOut,targetChain:l.targetChain,toAddress:l.toAddress,type:e.MARKR,source:{confirmationCount:0,requiredConfirmationCount:D?2:C,startedAtMs:T,txHash:E}}}function A({approvalRequest:e,requiresApprovalSignature:t,signBatch:n,sourceChainId:r,targetChainId:i}){return s(r)&&s(i)&&r===i&&t&&e!==void 0&&typeof n==`function`}export{D as transferAssetFactory};
1
+ import{ServiceType as e,TransferSignatureReason as t}from"../../../constants.js";import{ErrorCode as n,ErrorReason as r,SdkError as i}from"../../../errors.js";import{caip2ToEip155ChainId as a,caip2ToEip155HexChainId as o}from"../../../utils/caip.js";import{isEvmNamespace as s,isSolanaNamespace as c}from"../../../_utils/chain.js";import{applyFeeUnitsBpsMargin as l,getEvmClientForChain as u,getSolanaRpcForChain as d,makeFailedTransferFromQuote as f}from"../../_utils.js";import{markrGetSpenderAddress as p,markrSwap as m}from"../_api.js";import{isSolAddress as h}from"../../../utils/sol-address.js";import{assetToAddressString as g,calculateMarkrMinimumAmountOut as _,isTokenAddressNative as v}from"../_utils.js";import{isEvmSwapResponse as y,isSolanaSwapResponse as b}from"../_type-guards.js";import{refreshSolanaSwapTransactionBlockhash as x}from"../_solana-utils.js";import{_estimateGasFromSwapResponse as S}from"./estimate-native-fee.js";import{SOLANA_REQUIRED_CONFIRMATIONS as C}from"../constants.js";import{encodeFunctionData as w,erc20Abi as T,isAddress as E}from"viem";function D({apiOptions:t,appId:a,environment:o,evmSigner:l,solanaSigner:u}){return async({quote:d,gasSettings:f,fallbackToDefaultOnBatchFailure:p,onStepChange:m})=>{if(d.serviceType!==e.MARKR)throw new i(r.INCORRECT_PROVIDER_PROVIDED,n.INVALID_PARAMS);let h=Math.floor(Date.now()/1e3);if(d.expiresAt<=h)throw new i(r.QUOTE_EXPIRED,n.INVALID_PARAMS);let g=d.sourceChain.chainId;if(c(g))return k({apiOptions:t,appId:a,environment:o,solanaSigner:u,quote:d,onStepChange:m});if(s(g))return O({apiOptions:t,appId:a,environment:o,evmSigner:l,quote:d,gasSettings:f,fallbackToDefaultOnBatchFailure:p,onStepChange:m});throw new i(r.CHAIN_NOT_SUPPORTED,n.INVALID_PARAMS,{details:`Unsupported source chain namespace: ${g}`})}}async function O({apiOptions:s,appId:c,environment:d,evmSigner:h,quote:b,gasSettings:x,fallbackToDefaultOnBatchFailure:C,onStepChange:D}){let O=b.fromAddress;if(!E(O))throw new i(r.INVALID_PARAMS,n.INVALID_PARAMS,{details:`fromAddress is not a valid EVM address.`});let k=_({amountOut:b.amountOut,assetOut:b.assetOut,slippageBps:b.slippageBps}),j=u({chain:b.sourceChain}),M=g(b.assetIn,b.sourceChain.chainId),N=g(b.assetOut,b.targetChain.chainId);if(!E(M))throw new i(r.INVALID_PARAMS,n.INVALID_PARAMS,{details:`assetIn address is not a valid EVM address.`});let P=M,F=v(P),I=b.sourceChain.chainId.toLowerCase()!==b.targetChain.chainId.toLowerCase(),{address:L}=await p(s,{chainId:a(b.sourceChain.chainId),crossChainSwap:I,quoteId:b.id});if(!F&&!L)throw new i(r.CHAIN_NOT_SUPPORTED,n.INVALID_PARAMS,{details:`Missing Markr spender address for source chain ${b.sourceChain.chainId}.`});let R=!1,z;if(!F&&L&&await j.readContract({address:P,abi:T,functionName:`allowance`,args:[O,L]})<b.amountIn){R=!0;let e=w({abi:T,functionName:`approve`,args:[L,b.amountIn]}),t;try{t=l(await j.estimateGas({account:O,to:P,data:e,value:0n}),x?.estimateGasMarginBps)}catch(e){throw new i(`Error during gas estimation`,n.VIEM_ERROR,{cause:e,details:`Failed to estimate gas for ERC20 approval transaction.`})}z={chainId:o(b.sourceChain.chainId),data:e,from:O,gas:t,to:P,value:0n,...x?.maxFeePerGas===void 0?null:{maxFeePerGas:x.maxFeePerGas,maxPriorityFeePerGas:x.maxPriorityFeePerGas}}}let B=A({approvalRequest:z,requiresApprovalSignature:R,signBatch:h.signBatch,sourceChainId:b.sourceChain.chainId,targetChainId:b.targetChain.chainId}),V=await m(s,{amountIn:b.amountIn.toString(),appId:c,minAmountOut:k.toString(),tokenIn:M,tokenOut:N,uuid:b.id});if(!y(V))throw new i(r.CHAIN_NOT_SUPPORTED,n.INVALID_PARAMS,{details:`Received non-EVM swap response from Markr, but only EVM swaps are supported for this source chain.`});let H=(t,n=Date.now())=>{let r=b.sourceChain.chainId===b.targetChain.chainId;return{amountIn:b.amountIn,amountOut:b.amountOut,environment:d,fees:b.fees,fromAddress:b.fromAddress,id:b.id,partnerFeeBps:b.partnerFeeBps,sourceAsset:b.assetIn,sourceChain:b.sourceChain,status:`source-pending`,targetAsset:b.assetOut,targetChain:b.targetChain,toAddress:b.toAddress,type:e.MARKR,source:{confirmationCount:0,requiredConfirmationCount:r?1:2,startedAtMs:n,txHash:t}}};if(B&&z){let e={currentSignature:1,currentSignatureReason:t.TokensTransfer,quote:b,requiredSignatures:1},r=h.signBatch;if(!r)throw new i(`One-click batch signer is not available.`,n.SIGNING_FAILED);let a={chainId:o(b.sourceChain.chainId),data:V.data,from:O,gas:void 0,to:V.to,value:V.value,...x?.maxFeePerGas===void 0?null:{maxFeePerGas:x.maxFeePerGas,maxPriorityFeePerGas:x.maxPriorityFeePerGas}};D?.(e);try{let t=(await r([z,a],async e=>j.sendRawTransaction({serializedTransaction:e}),e)).at(-1);if(!t)throw new i(`One-click batch signing returned no transaction hashes.`,n.SIGNING_FAILED);return H(t)}catch(e){if(!C)throw e}}if(R&&z){let e={currentSignature:1,currentSignatureReason:t.AllowanceApproval,quote:b,requiredSignatures:2};D?.(e);let r=await h.sign(z,async e=>j.sendRawTransaction({serializedTransaction:e}),e);if((await j.waitForTransactionReceipt({hash:r})).status===`reverted`)return f(b,{environment:d,errorCode:n.TRANSACTION_REVERTED,errorReason:`ERC20 approval transaction was reverted`})}let U=await S({crossChain:I,fromAddress:O,feeUnitsMarginBps:x?.estimateGasMarginBps,sourceClient:j,swap:V}),W={chainId:o(b.sourceChain.chainId),data:V.data,from:O,gas:U,to:V.to,value:V.value,...x?.maxFeePerGas===void 0?null:{maxFeePerGas:x.maxFeePerGas,maxPriorityFeePerGas:x.maxPriorityFeePerGas}},G={currentSignature:R?2:1,currentSignatureReason:t.TokensTransfer,quote:b,requiredSignatures:R?2:1};D?.(G);let K=Date.now();return H(await h.sign(W,async e=>j.sendRawTransaction({serializedTransaction:e}),G),K)}async function k({apiOptions:a,appId:o,environment:s,solanaSigner:c,quote:l,onStepChange:u}){if(!c)throw new i(r.INVALID_PARAMS,n.INVALID_PARAMS,{details:`solanaSigner is required for Solana transfers but was not provided.`});if(!h(l.fromAddress))throw new i(r.INVALID_PARAMS,n.INVALID_PARAMS,{details:`fromAddress is not a valid Solana address.`});let f=_({amountOut:l.amountOut,assetOut:l.assetOut,slippageBps:l.slippageBps}),p=g(l.assetIn,l.sourceChain.chainId),v=g(l.assetOut,l.targetChain.chainId),y=await m(a,{amountIn:l.amountIn.toString(),appId:o,minAmountOut:f.toString(),tokenIn:p,tokenOut:v,userPublicKey:l.fromAddress,uuid:l.id});if(!b(y))throw new i(r.CHAIN_NOT_SUPPORTED,n.INVALID_PARAMS,{details:`Received non-SVM swap response from Markr, but only SVM swaps are supported for this source chain.`});console.debug(`[Fusion SDK] Original swap transaction (base64):`,y.swapTransaction);let S=await x(y.swapTransaction,d({chain:l.sourceChain}));console.debug(`[Fusion SDK] Refreshed swap transaction with new blockhash (base64):`,S);let w={currentSignature:1,currentSignatureReason:t.TokensTransfer,quote:l,requiredSignatures:1};u?.(w);let T=Date.now(),E=await c.signAndSend({account:l.fromAddress,serializedTx:S},w),D=l.sourceChain.chainId.toLowerCase()!==l.targetChain.chainId.toLowerCase();return{amountIn:l.amountIn,amountOut:l.amountOut,environment:s,fees:l.fees,fromAddress:l.fromAddress,id:l.id,partnerFeeBps:l.partnerFeeBps,sourceAsset:l.assetIn,sourceChain:l.sourceChain,status:`source-pending`,targetAsset:l.assetOut,targetChain:l.targetChain,toAddress:l.toAddress,type:e.MARKR,source:{confirmationCount:0,requiredConfirmationCount:D?2:C,startedAtMs:T,txHash:E}}}function A({approvalRequest:e,requiresApprovalSignature:t,signBatch:n,sourceChainId:r,targetChainId:i}){return s(r)&&s(i)&&r===i&&t&&e!==void 0&&typeof n==`function`}export{D as transferAssetFactory};
2
2
  //# sourceMappingURL=transfer-asset.js.map