@avalabs/fusion-sdk 0.17.0 → 0.19.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 (79) hide show
  1. package/dist/constants.cjs +1 -1
  2. package/dist/constants.cjs.map +1 -1
  3. package/dist/constants.d.cts +14 -2
  4. package/dist/constants.d.ts +14 -2
  5. package/dist/constants.js +1 -1
  6. package/dist/constants.js.map +1 -1
  7. package/dist/errors.cjs +1 -1
  8. package/dist/errors.cjs.map +1 -1
  9. package/dist/errors.d.cts +6 -0
  10. package/dist/errors.d.ts +6 -0
  11. package/dist/errors.js +1 -1
  12. package/dist/errors.js.map +1 -1
  13. package/dist/mod.cjs +1 -1
  14. package/dist/mod.d.cts +4 -4
  15. package/dist/mod.d.ts +4 -4
  16. package/dist/mod.js +1 -1
  17. package/dist/transfer-service/avalanche-cct/_handlers/get-minimum-transfer-amount.cjs +1 -1
  18. package/dist/transfer-service/avalanche-cct/_handlers/get-minimum-transfer-amount.cjs.map +1 -1
  19. package/dist/transfer-service/avalanche-cct/_handlers/get-minimum-transfer-amount.js +1 -1
  20. package/dist/transfer-service/avalanche-cct/_handlers/get-minimum-transfer-amount.js.map +1 -1
  21. package/dist/transfer-service/avalanche-cct/_handlers/stream-quotes.cjs +1 -1
  22. package/dist/transfer-service/avalanche-cct/_handlers/stream-quotes.cjs.map +1 -1
  23. package/dist/transfer-service/avalanche-cct/_handlers/stream-quotes.js +1 -1
  24. package/dist/transfer-service/avalanche-cct/_handlers/stream-quotes.js.map +1 -1
  25. package/dist/transfer-service/avalanche-cct/_handlers/transfer-asset.cjs +1 -1
  26. package/dist/transfer-service/avalanche-cct/_handlers/transfer-asset.cjs.map +1 -1
  27. package/dist/transfer-service/avalanche-cct/_handlers/transfer-asset.js +1 -1
  28. package/dist/transfer-service/avalanche-cct/_handlers/transfer-asset.js.map +1 -1
  29. package/dist/transfer-service/avalanche-cct/_utils.cjs +1 -1
  30. package/dist/transfer-service/avalanche-cct/_utils.cjs.map +1 -1
  31. package/dist/transfer-service/avalanche-cct/_utils.js +1 -1
  32. package/dist/transfer-service/avalanche-cct/_utils.js.map +1 -1
  33. package/dist/transfer-service/avalanche-cct/avalanche-cct-service.cjs +1 -1
  34. package/dist/transfer-service/avalanche-cct/avalanche-cct-service.cjs.map +1 -1
  35. package/dist/transfer-service/avalanche-cct/avalanche-cct-service.js +1 -1
  36. package/dist/transfer-service/avalanche-cct/avalanche-cct-service.js.map +1 -1
  37. package/dist/transfer-service/markr/_api.cjs +1 -1
  38. package/dist/transfer-service/markr/_api.cjs.map +1 -1
  39. package/dist/transfer-service/markr/_api.js +1 -1
  40. package/dist/transfer-service/markr/_api.js.map +1 -1
  41. package/dist/transfer-service/markr/_handlers/estimate-native-fee.cjs +1 -1
  42. package/dist/transfer-service/markr/_handlers/estimate-native-fee.cjs.map +1 -1
  43. package/dist/transfer-service/markr/_handlers/estimate-native-fee.js +1 -1
  44. package/dist/transfer-service/markr/_handlers/estimate-native-fee.js.map +1 -1
  45. package/dist/transfer-service/markr/_handlers/transfer-asset-hyperliquid-withdraw.cjs +2 -0
  46. package/dist/transfer-service/markr/_handlers/transfer-asset-hyperliquid-withdraw.cjs.map +1 -0
  47. package/dist/transfer-service/markr/_handlers/transfer-asset-hyperliquid-withdraw.js +2 -0
  48. package/dist/transfer-service/markr/_handlers/transfer-asset-hyperliquid-withdraw.js.map +1 -0
  49. package/dist/transfer-service/markr/_handlers/transfer-asset.cjs +1 -1
  50. package/dist/transfer-service/markr/_handlers/transfer-asset.cjs.map +1 -1
  51. package/dist/transfer-service/markr/_handlers/transfer-asset.js +1 -1
  52. package/dist/transfer-service/markr/_handlers/transfer-asset.js.map +1 -1
  53. package/dist/transfer-service/markr/_hyperliquid-eip712.cjs +2 -0
  54. package/dist/transfer-service/markr/_hyperliquid-eip712.cjs.map +1 -0
  55. package/dist/transfer-service/markr/_hyperliquid-eip712.js +2 -0
  56. package/dist/transfer-service/markr/_hyperliquid-eip712.js.map +1 -0
  57. package/dist/transfer-service/markr/_hyperliquid-schema.cjs +2 -0
  58. package/dist/transfer-service/markr/_hyperliquid-schema.cjs.map +1 -0
  59. package/dist/transfer-service/markr/_hyperliquid-schema.js +2 -0
  60. package/dist/transfer-service/markr/_hyperliquid-schema.js.map +1 -0
  61. package/dist/transfer-service/markr/_hyperliquid.cjs +2 -0
  62. package/dist/transfer-service/markr/_hyperliquid.cjs.map +1 -0
  63. package/dist/transfer-service/markr/_hyperliquid.js +2 -0
  64. package/dist/transfer-service/markr/_hyperliquid.js.map +1 -0
  65. package/dist/transfer-service/markr/_schema.cjs +1 -1
  66. package/dist/transfer-service/markr/_schema.cjs.map +1 -1
  67. package/dist/transfer-service/markr/_schema.js +1 -1
  68. package/dist/transfer-service/markr/_schema.js.map +1 -1
  69. package/dist/transfer-service/markr/_type-guards.cjs +1 -1
  70. package/dist/transfer-service/markr/_type-guards.cjs.map +1 -1
  71. package/dist/transfer-service/markr/_type-guards.js +1 -1
  72. package/dist/transfer-service/markr/_type-guards.js.map +1 -1
  73. package/dist/transfer-service/markr/markr-service.cjs.map +1 -1
  74. package/dist/transfer-service/markr/markr-service.js.map +1 -1
  75. package/dist/types/service.d.cts +13 -2
  76. package/dist/types/service.d.ts +13 -2
  77. package/dist/types/signer.d.cts +37 -1
  78. package/dist/types/signer.d.ts +37 -1
  79. package/package.json +1 -1
package/dist/mod.d.ts CHANGED
@@ -2,7 +2,7 @@ import { Caip10AccountId, Caip2ChainId } from "./types/caip.js";
2
2
  import { BitcoinFeeRateTier, BitcoinFunctions, BitcoinInputUTXO, BitcoinInputUTXOWithOptionalScript, BitcoinOutputUTXO, BitcoinTx } from "./types/bitcoin.js";
3
3
  import { Chain } from "./types/chain.js";
4
4
  import { FeeRateTier } from "./types/fee.js";
5
- import { AVALANCHE_CAIP2_TO_BLOCKCHAIN_ID_BY_NETWORK, AVALANCHE_FUJI_CHAIN, AVALANCHE_FUJI_P_CHAIN, AVALANCHE_FUJI_X_CHAIN, AVALANCHE_MAINNET_CHAIN, AVALANCHE_MAINNET_P_CHAIN, AVALANCHE_MAINNET_X_CHAIN, AvalancheBlockchainAlias, AvalancheChainIds, AvalancheFujiBlockchainChainIds, AvalancheFujiBlockchainIds, AvalancheMainnetBlockchainChainIds, AvalancheMainnetBlockchainIds, 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";
5
+ import { AVALANCHE_CAIP2_TO_BLOCKCHAIN_ID_BY_NETWORK, AVALANCHE_FUJI_CHAIN, AVALANCHE_FUJI_P_CHAIN, AVALANCHE_FUJI_X_CHAIN, AVALANCHE_MAINNET_CHAIN, AVALANCHE_MAINNET_P_CHAIN, AVALANCHE_MAINNET_X_CHAIN, AvalancheBlockchainAlias, AvalancheChainIds, AvalancheFujiBlockchainChainIds, AvalancheFujiBlockchainIds, AvalancheMainnetBlockchainChainIds, AvalancheMainnetBlockchainIds, 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, HyperliquidChainIds, NATIVE_AVAX, NATIVE_ETH, NATIVE_SOL_ADDRESS, SOLANA_DEVNET_CHAIN, SOLANA_MAINNET_CHAIN, ServiceType, SolanaChainIds, TokenType, TransferSignatureReason } from "./constants.js";
6
6
  import { Asset, AssetWithExtras, BridgeableAsset, BridgeableUiAsset, ChainAssetMap, DestinationInfo, Erc20Asset, NativeAsset, SplAsset, TransferableAsset } from "./types/asset.js";
7
7
  import { Quote, QuoteFee, QuoteFeeFundingModel, QuoteFeeToken, QuoteFeeType, QuoteFees, QuoterDonePayload, QuoterDonePayloadNoEligibleServices, QuoterDonePayloadNoQuotes, QuoterDonePayloadUnsubscribed, QuoterDoneReason, QuoterEventArgs, QuoterEventHandler, QuoterInterface, QuoterProps, QuotesTuple, ServiceQuoteEventArgs, ServiceQuoteEventHandler } from "./types/quote.js";
8
8
  import { ArrayElement, Brand, DeepMutable, Fetch, Mutable } from "./types/utility-types.js";
@@ -10,8 +10,8 @@ import { GetAtomicUtxosCallback, GetCoreEthAddressCallback, GetUtxosCallback, Ge
10
10
  import { AbortedError, ErrorCode, ErrorReason, EstimateNativeFeeError, EstimateNativeFeeErrorDetails, HttpError, InsufficientFundsError, InvalidParamsError, ResponseValidationError, SdkError, ServiceInitializationError, ServiceUnavailableError, TimeoutError, isAbortedError, isEstimateNativeFeeError, isHttpError, isInsufficientFundsError, isInvalidParamsError, isResponseValidationError, isSdkError, isServiceInitializationError, isServiceUnavailableError, isTimeoutError } from "./errors.js";
11
11
  import { CompletedTransfer, FailedTransfer, RefundedTransfer, SourceCompletedTransfer, SourcePendingTransfer, TargetPendingTransfer, Transfer, TransferBase, TransferSourceProgress, TransferStatus, TransferStepDetails, TransferTargetProgress } from "./types/transfer.js";
12
12
  import { SolanaSendOptions, SolanaTransactionParams } from "./utils/solana-transaction.js";
13
- import { BtcDispatch, BtcSign, BtcSigner, BtcTransactionRequest, EvmDispatch, EvmSign, EvmSignBatch, EvmSignMessage, EvmSigner, EvmSignerWithMessage, EvmTransactionRequest, Hex, SolanaSign, SolanaSigner } from "./types/signer.js";
14
- import { AssetSearchQuery, AvalancheCctInitializer, AvalancheSendTxFunction, EstimateNativeFeeOptions, EvmServiceInitializer, GasSettings, GetBridgeableAssetsProps, GetBridgeableAssetsResult, GetMinimumTransferAmountProps, GetSupportedChainsResult, LombardServiceInitializer, MarkrServiceInitializer, MutableGetSupportedChainsResult, NativeFeeEstimate, ServiceInitializer, TrackTransferProps, TransferAssetProps, TransferService } from "./types/service.js";
13
+ import { BtcDispatch, BtcSign, BtcSigner, BtcTransactionRequest, EvmDispatch, EvmSign, EvmSignBatch, EvmSignMessage, EvmSignTypedData, EvmSigner, EvmSignerWithMessage, EvmTransactionRequest, EvmTypedData, Hex, SolanaSign, SolanaSigner } from "./types/signer.js";
14
+ import { AssetSearchQuery, AvalancheCctInitializer, AvalancheSendTxFunction, AvalancheSendTxParams, EstimateNativeFeeOptions, EvmServiceInitializer, GasSettings, GetBridgeableAssetsProps, GetBridgeableAssetsResult, GetMinimumTransferAmountProps, GetSupportedChainsResult, LombardServiceInitializer, MarkrServiceInitializer, MutableGetSupportedChainsResult, NativeFeeEstimate, ServiceInitializer, TrackTransferProps, TransferAssetProps, TransferService } from "./types/service.js";
15
15
  import { AssetBridgeMap, CreateTransferManagerOptions, ServiceStatus, ServiceStatusBaseRecord, ServiceStatusErrorRecord, ServiceStatusInitializedRecord, ServiceStatusRecord, ServiceStatusUnsupportedEnvironmentRecord, TransferManager, TransferManagerStatus, TransferManagerStatusServicesRecord } from "./types/transfer-manager.js";
16
16
  import { isEnvironment, isErc20Asset, isEvmBridgeInitializer, isLombardServiceInitializer, isMarkrServiceInitializer, isNativeAsset, isServiceInitializer, isSplAsset } from "./type-guards.js";
17
17
  import { createTransferManager } from "./transfer-manager.js";
@@ -19,4 +19,4 @@ import { caip2ToEip155ChainId, caip2ToEip155HexChainId, eip155ChainIdToCaip2, is
19
19
  import { dedupeBridgeableAssets } from "./utils/bridgeable-assets.js";
20
20
  import { calculatePriceImpactFromQuote } from "./utils/price-impact.js";
21
21
  import { parseTransfer, stringifyTransfer } from "./utils/transfer-utils.js";
22
- export { AVALANCHE_CAIP2_TO_BLOCKCHAIN_ID_BY_NETWORK, AVALANCHE_FUJI_CHAIN, AVALANCHE_FUJI_P_CHAIN, AVALANCHE_FUJI_X_CHAIN, AVALANCHE_MAINNET_CHAIN, AVALANCHE_MAINNET_P_CHAIN, AVALANCHE_MAINNET_X_CHAIN, AbortedError, ArrayElement, Asset, AssetBridgeMap, AssetSearchQuery, AssetWithExtras, AvalancheBlockchainAlias, AvalancheCctInitializer, AvalancheChainIds, AvalancheFujiBlockchainChainIds, AvalancheFujiBlockchainIds, AvalancheMainnetBlockchainChainIds, AvalancheMainnetBlockchainIds, AvalancheSendTxFunction, BITCOIN_MAINNET_CHAIN, BITCOIN_TESTNET_CHAIN, BTC_SERVICE_TYPES, BitcoinChainIds, BitcoinFeeRateTier, BitcoinFunctions, BitcoinInputUTXO, BitcoinInputUTXOWithOptionalScript, BitcoinOutputUTXO, BitcoinTx, Blockchain, Brand, BridgeableAsset, BridgeableUiAsset, BtcDispatch, BtcSign, BtcSigner, BtcTransactionRequest, Caip10AccountId, Caip2ChainId, Chain, ChainAssetMap, CompletedTransfer, CreateTransferManagerOptions, DeepMutable, DestinationInfo, ERC_ZERO_ADDRESS, ETHEREUM_MAINNET_CHAIN, ETHEREUM_SEPOLIA_CHAIN, EVM_SERVICE_TYPES, Environment, Erc20Asset, ErrorCode, ErrorReason, EstimateNativeFeeError, type EstimateNativeFeeErrorDetails, EstimateNativeFeeOptions, EthereumChainIds, EvmChainId, EvmDispatch, EvmServiceInitializer, EvmSign, EvmSignBatch, EvmSignMessage, EvmSigner, EvmSignerWithMessage, EvmTransactionRequest, FEE_RATE_TIER_TO_BITCOIN, FailedTransfer, FeeRateTier, Fetch, GasSettings, type GetAtomicUtxosCallback, GetBridgeableAssetsProps, GetBridgeableAssetsResult, type GetCoreEthAddressCallback, GetMinimumTransferAmountProps, GetSupportedChainsResult, type GetUtxosCallback, type GetWalletAddressesForChainAliasCallback, type GetWalletChangeAddressForChainAliasCallback, Hex, HttpError, InsufficientFundsError, InvalidParamsError, LombardServiceInitializer, MarkrServiceInitializer, Mutable, MutableGetSupportedChainsResult, NATIVE_AVAX, NATIVE_ETH, NATIVE_SOL_ADDRESS, NativeAsset, NativeFeeEstimate, Quote, QuoteFee, QuoteFeeFundingModel, QuoteFeeToken, QuoteFeeType, QuoteFees, QuoterDonePayload, QuoterDonePayloadNoEligibleServices, QuoterDonePayloadNoQuotes, QuoterDonePayloadUnsubscribed, QuoterDoneReason, QuoterEventArgs, QuoterEventHandler, QuoterInterface, QuoterProps, QuotesTuple, RefundedTransfer, ResponseValidationError, SOLANA_DEVNET_CHAIN, SOLANA_MAINNET_CHAIN, SdkError, ServiceInitializationError, ServiceInitializer, ServiceQuoteEventArgs, ServiceQuoteEventHandler, ServiceStatus, ServiceStatusBaseRecord, ServiceStatusErrorRecord, ServiceStatusInitializedRecord, ServiceStatusRecord, ServiceStatusUnsupportedEnvironmentRecord, ServiceType, ServiceUnavailableError, SolanaChainIds, SolanaSendOptions, SolanaSign, SolanaSigner, SolanaTransactionParams, SourceCompletedTransfer, SourcePendingTransfer, SplAsset, TargetPendingTransfer, TimeoutError, TokenType, TrackTransferProps, Transfer, TransferAssetProps, TransferBase, TransferManager, TransferManagerStatus, TransferManagerStatusServicesRecord, TransferService, TransferSignatureReason, TransferSourceProgress, TransferStatus, TransferStepDetails, TransferTargetProgress, TransferableAsset, caip2ToEip155ChainId, caip2ToEip155HexChainId, calculatePriceImpactFromQuote, createTransferManager, dedupeBridgeableAssets, eip155ChainIdToCaip2, isAbortedError, isCaip2ChainId, isEnvironment, isErc20Asset, isEstimateNativeFeeError, isEvmBridgeInitializer, isHttpError, isInsufficientFundsError, isInvalidParamsError, isLombardServiceInitializer, isMarkrServiceInitializer, isNativeAsset, isResponseValidationError, isSdkError, isServiceInitializationError, isServiceInitializer, isServiceUnavailableError, isSplAsset, isTimeoutError, parseTransfer, splitCaip2ChainId, stringifyTransfer };
22
+ export { AVALANCHE_CAIP2_TO_BLOCKCHAIN_ID_BY_NETWORK, AVALANCHE_FUJI_CHAIN, AVALANCHE_FUJI_P_CHAIN, AVALANCHE_FUJI_X_CHAIN, AVALANCHE_MAINNET_CHAIN, AVALANCHE_MAINNET_P_CHAIN, AVALANCHE_MAINNET_X_CHAIN, AbortedError, ArrayElement, Asset, AssetBridgeMap, AssetSearchQuery, AssetWithExtras, AvalancheBlockchainAlias, AvalancheCctInitializer, AvalancheChainIds, AvalancheFujiBlockchainChainIds, AvalancheFujiBlockchainIds, AvalancheMainnetBlockchainChainIds, AvalancheMainnetBlockchainIds, AvalancheSendTxFunction, AvalancheSendTxParams, BITCOIN_MAINNET_CHAIN, BITCOIN_TESTNET_CHAIN, BTC_SERVICE_TYPES, BitcoinChainIds, BitcoinFeeRateTier, BitcoinFunctions, BitcoinInputUTXO, BitcoinInputUTXOWithOptionalScript, BitcoinOutputUTXO, BitcoinTx, Blockchain, Brand, BridgeableAsset, BridgeableUiAsset, BtcDispatch, BtcSign, BtcSigner, BtcTransactionRequest, Caip10AccountId, Caip2ChainId, Chain, ChainAssetMap, CompletedTransfer, CreateTransferManagerOptions, DeepMutable, DestinationInfo, ERC_ZERO_ADDRESS, ETHEREUM_MAINNET_CHAIN, ETHEREUM_SEPOLIA_CHAIN, EVM_SERVICE_TYPES, Environment, Erc20Asset, ErrorCode, ErrorReason, EstimateNativeFeeError, type EstimateNativeFeeErrorDetails, EstimateNativeFeeOptions, EthereumChainIds, EvmChainId, EvmDispatch, EvmServiceInitializer, EvmSign, EvmSignBatch, EvmSignMessage, EvmSignTypedData, EvmSigner, EvmSignerWithMessage, EvmTransactionRequest, EvmTypedData, FEE_RATE_TIER_TO_BITCOIN, FailedTransfer, FeeRateTier, Fetch, GasSettings, type GetAtomicUtxosCallback, GetBridgeableAssetsProps, GetBridgeableAssetsResult, type GetCoreEthAddressCallback, GetMinimumTransferAmountProps, GetSupportedChainsResult, type GetUtxosCallback, type GetWalletAddressesForChainAliasCallback, type GetWalletChangeAddressForChainAliasCallback, Hex, HttpError, HyperliquidChainIds, InsufficientFundsError, InvalidParamsError, LombardServiceInitializer, MarkrServiceInitializer, Mutable, MutableGetSupportedChainsResult, NATIVE_AVAX, NATIVE_ETH, NATIVE_SOL_ADDRESS, NativeAsset, NativeFeeEstimate, Quote, QuoteFee, QuoteFeeFundingModel, QuoteFeeToken, QuoteFeeType, QuoteFees, QuoterDonePayload, QuoterDonePayloadNoEligibleServices, QuoterDonePayloadNoQuotes, QuoterDonePayloadUnsubscribed, QuoterDoneReason, QuoterEventArgs, QuoterEventHandler, QuoterInterface, QuoterProps, QuotesTuple, RefundedTransfer, ResponseValidationError, SOLANA_DEVNET_CHAIN, SOLANA_MAINNET_CHAIN, SdkError, ServiceInitializationError, ServiceInitializer, ServiceQuoteEventArgs, ServiceQuoteEventHandler, ServiceStatus, ServiceStatusBaseRecord, ServiceStatusErrorRecord, ServiceStatusInitializedRecord, ServiceStatusRecord, ServiceStatusUnsupportedEnvironmentRecord, ServiceType, ServiceUnavailableError, SolanaChainIds, SolanaSendOptions, SolanaSign, SolanaSigner, SolanaTransactionParams, SourceCompletedTransfer, SourcePendingTransfer, SplAsset, TargetPendingTransfer, TimeoutError, TokenType, TrackTransferProps, Transfer, TransferAssetProps, TransferBase, TransferManager, TransferManagerStatus, TransferManagerStatusServicesRecord, TransferService, TransferSignatureReason, TransferSourceProgress, TransferStatus, TransferStepDetails, TransferTargetProgress, TransferableAsset, caip2ToEip155ChainId, caip2ToEip155HexChainId, calculatePriceImpactFromQuote, createTransferManager, dedupeBridgeableAssets, eip155ChainIdToCaip2, isAbortedError, isCaip2ChainId, isEnvironment, isErc20Asset, isEstimateNativeFeeError, isEvmBridgeInitializer, isHttpError, isInsufficientFundsError, isInvalidParamsError, isLombardServiceInitializer, isMarkrServiceInitializer, isNativeAsset, isResponseValidationError, isSdkError, isServiceInitializationError, isServiceInitializer, isServiceUnavailableError, isSplAsset, isTimeoutError, parseTransfer, splitCaip2ChainId, stringifyTransfer };
package/dist/mod.js CHANGED
@@ -1 +1 @@
1
- import{AVALANCHE_CAIP2_TO_BLOCKCHAIN_ID_BY_NETWORK as e,AVALANCHE_FUJI_CHAIN as t,AVALANCHE_FUJI_P_CHAIN as n,AVALANCHE_FUJI_X_CHAIN as r,AVALANCHE_MAINNET_CHAIN as i,AVALANCHE_MAINNET_P_CHAIN as a,AVALANCHE_MAINNET_X_CHAIN as o,AvalancheChainIds as s,AvalancheFujiBlockchainChainIds as c,AvalancheFujiBlockchainIds as l,AvalancheMainnetBlockchainChainIds as u,AvalancheMainnetBlockchainIds as d,BITCOIN_MAINNET_CHAIN as f,BITCOIN_TESTNET_CHAIN as p,BTC_SERVICE_TYPES as m,BitcoinChainIds as h,Blockchain as g,ERC_ZERO_ADDRESS as _,ETHEREUM_MAINNET_CHAIN as v,ETHEREUM_SEPOLIA_CHAIN as y,EVM_SERVICE_TYPES as b,Environment as x,EthereumChainIds as S,EvmChainId as C,FEE_RATE_TIER_TO_BITCOIN as w,NATIVE_AVAX as T,NATIVE_ETH as E,NATIVE_SOL_ADDRESS as D,SOLANA_DEVNET_CHAIN as O,SOLANA_MAINNET_CHAIN as k,ServiceType as A,SolanaChainIds as j,TokenType as M,TransferSignatureReason as N}from"./constants.js";import{AbortedError as P,ErrorCode as F,ErrorReason as I,EstimateNativeFeeError as L,HttpError as R,InsufficientFundsError as z,InvalidParamsError as B,ResponseValidationError as V,SdkError as H,ServiceInitializationError as U,ServiceUnavailableError as W,TimeoutError as G,isAbortedError as K,isEstimateNativeFeeError as q,isHttpError as J,isInsufficientFundsError as Y,isInvalidParamsError as X,isResponseValidationError as Z,isSdkError as Q,isServiceInitializationError as $,isServiceUnavailableError as ee,isTimeoutError as te}from"./errors.js";import{isEnvironment as ne,isErc20Asset as re,isEvmBridgeInitializer as ie,isLombardServiceInitializer as ae,isMarkrServiceInitializer as oe,isNativeAsset as se,isServiceInitializer as ce,isSplAsset as le}from"./type-guards.js";import{createTransferManager as ue}from"./transfer-manager.js";import{caip2ToEip155ChainId as de,caip2ToEip155HexChainId as fe,eip155ChainIdToCaip2 as pe,isCaip2ChainId as me,splitCaip2ChainId as he}from"./utils/caip.js";import{dedupeBridgeableAssets as ge}from"./utils/bridgeable-assets.js";import{calculatePriceImpactFromQuote as _e}from"./utils/price-impact.js";import{parseTransfer as ve,stringifyTransfer as ye}from"./utils/transfer-utils.js";export{e as AVALANCHE_CAIP2_TO_BLOCKCHAIN_ID_BY_NETWORK,t as AVALANCHE_FUJI_CHAIN,n as AVALANCHE_FUJI_P_CHAIN,r as AVALANCHE_FUJI_X_CHAIN,i as AVALANCHE_MAINNET_CHAIN,a as AVALANCHE_MAINNET_P_CHAIN,o as AVALANCHE_MAINNET_X_CHAIN,P as AbortedError,s as AvalancheChainIds,c as AvalancheFujiBlockchainChainIds,l as AvalancheFujiBlockchainIds,u as AvalancheMainnetBlockchainChainIds,d as AvalancheMainnetBlockchainIds,f as BITCOIN_MAINNET_CHAIN,p as BITCOIN_TESTNET_CHAIN,m as BTC_SERVICE_TYPES,h as BitcoinChainIds,g as Blockchain,_ as ERC_ZERO_ADDRESS,v as ETHEREUM_MAINNET_CHAIN,y as ETHEREUM_SEPOLIA_CHAIN,b as EVM_SERVICE_TYPES,x as Environment,F as ErrorCode,I as ErrorReason,L as EstimateNativeFeeError,S as EthereumChainIds,C as EvmChainId,w as FEE_RATE_TIER_TO_BITCOIN,R as HttpError,z as InsufficientFundsError,B as InvalidParamsError,T as NATIVE_AVAX,E as NATIVE_ETH,D as NATIVE_SOL_ADDRESS,V as ResponseValidationError,O as SOLANA_DEVNET_CHAIN,k as SOLANA_MAINNET_CHAIN,H as SdkError,U as ServiceInitializationError,A as ServiceType,W as ServiceUnavailableError,j as SolanaChainIds,G as TimeoutError,M as TokenType,N as TransferSignatureReason,de as caip2ToEip155ChainId,fe as caip2ToEip155HexChainId,_e as calculatePriceImpactFromQuote,ue as createTransferManager,ge as dedupeBridgeableAssets,pe as eip155ChainIdToCaip2,K as isAbortedError,me as isCaip2ChainId,ne as isEnvironment,re as isErc20Asset,q as isEstimateNativeFeeError,ie as isEvmBridgeInitializer,J as isHttpError,Y as isInsufficientFundsError,X as isInvalidParamsError,ae as isLombardServiceInitializer,oe as isMarkrServiceInitializer,se as isNativeAsset,Z as isResponseValidationError,Q as isSdkError,$ as isServiceInitializationError,ce as isServiceInitializer,ee as isServiceUnavailableError,le as isSplAsset,te as isTimeoutError,ve as parseTransfer,he as splitCaip2ChainId,ye as stringifyTransfer};
1
+ import{AVALANCHE_CAIP2_TO_BLOCKCHAIN_ID_BY_NETWORK as e,AVALANCHE_FUJI_CHAIN as t,AVALANCHE_FUJI_P_CHAIN as n,AVALANCHE_FUJI_X_CHAIN as r,AVALANCHE_MAINNET_CHAIN as i,AVALANCHE_MAINNET_P_CHAIN as a,AVALANCHE_MAINNET_X_CHAIN as o,AvalancheChainIds as s,AvalancheFujiBlockchainChainIds as c,AvalancheFujiBlockchainIds as l,AvalancheMainnetBlockchainChainIds as u,AvalancheMainnetBlockchainIds as d,BITCOIN_MAINNET_CHAIN as f,BITCOIN_TESTNET_CHAIN as p,BTC_SERVICE_TYPES as m,BitcoinChainIds as h,Blockchain as g,ERC_ZERO_ADDRESS as _,ETHEREUM_MAINNET_CHAIN as v,ETHEREUM_SEPOLIA_CHAIN as y,EVM_SERVICE_TYPES as b,Environment as x,EthereumChainIds as S,EvmChainId as C,FEE_RATE_TIER_TO_BITCOIN as w,HyperliquidChainIds as T,NATIVE_AVAX as E,NATIVE_ETH as D,NATIVE_SOL_ADDRESS as O,SOLANA_DEVNET_CHAIN as k,SOLANA_MAINNET_CHAIN as A,ServiceType as j,SolanaChainIds as M,TokenType as N,TransferSignatureReason as P}from"./constants.js";import{AbortedError as F,ErrorCode as I,ErrorReason as L,EstimateNativeFeeError as R,HttpError as z,InsufficientFundsError as B,InvalidParamsError as V,ResponseValidationError as H,SdkError as U,ServiceInitializationError as W,ServiceUnavailableError as G,TimeoutError as K,isAbortedError as q,isEstimateNativeFeeError as J,isHttpError as Y,isInsufficientFundsError as X,isInvalidParamsError as Z,isResponseValidationError as Q,isSdkError as $,isServiceInitializationError as ee,isServiceUnavailableError as te,isTimeoutError as ne}from"./errors.js";import{isEnvironment as re,isErc20Asset as ie,isEvmBridgeInitializer as ae,isLombardServiceInitializer as oe,isMarkrServiceInitializer as se,isNativeAsset as ce,isServiceInitializer as le,isSplAsset as ue}from"./type-guards.js";import{createTransferManager as de}from"./transfer-manager.js";import{caip2ToEip155ChainId as fe,caip2ToEip155HexChainId as pe,eip155ChainIdToCaip2 as me,isCaip2ChainId as he,splitCaip2ChainId as ge}from"./utils/caip.js";import{dedupeBridgeableAssets as _e}from"./utils/bridgeable-assets.js";import{calculatePriceImpactFromQuote as ve}from"./utils/price-impact.js";import{parseTransfer as ye,stringifyTransfer as be}from"./utils/transfer-utils.js";export{e as AVALANCHE_CAIP2_TO_BLOCKCHAIN_ID_BY_NETWORK,t as AVALANCHE_FUJI_CHAIN,n as AVALANCHE_FUJI_P_CHAIN,r as AVALANCHE_FUJI_X_CHAIN,i as AVALANCHE_MAINNET_CHAIN,a as AVALANCHE_MAINNET_P_CHAIN,o as AVALANCHE_MAINNET_X_CHAIN,F as AbortedError,s as AvalancheChainIds,c as AvalancheFujiBlockchainChainIds,l as AvalancheFujiBlockchainIds,u as AvalancheMainnetBlockchainChainIds,d as AvalancheMainnetBlockchainIds,f as BITCOIN_MAINNET_CHAIN,p as BITCOIN_TESTNET_CHAIN,m as BTC_SERVICE_TYPES,h as BitcoinChainIds,g as Blockchain,_ as ERC_ZERO_ADDRESS,v as ETHEREUM_MAINNET_CHAIN,y as ETHEREUM_SEPOLIA_CHAIN,b as EVM_SERVICE_TYPES,x as Environment,I as ErrorCode,L as ErrorReason,R as EstimateNativeFeeError,S as EthereumChainIds,C as EvmChainId,w as FEE_RATE_TIER_TO_BITCOIN,z as HttpError,T as HyperliquidChainIds,B as InsufficientFundsError,V as InvalidParamsError,E as NATIVE_AVAX,D as NATIVE_ETH,O as NATIVE_SOL_ADDRESS,H as ResponseValidationError,k as SOLANA_DEVNET_CHAIN,A as SOLANA_MAINNET_CHAIN,U as SdkError,W as ServiceInitializationError,j as ServiceType,G as ServiceUnavailableError,M as SolanaChainIds,K as TimeoutError,N as TokenType,P as TransferSignatureReason,fe as caip2ToEip155ChainId,pe as caip2ToEip155HexChainId,ve as calculatePriceImpactFromQuote,de as createTransferManager,_e as dedupeBridgeableAssets,me as eip155ChainIdToCaip2,q as isAbortedError,he as isCaip2ChainId,re as isEnvironment,ie as isErc20Asset,J as isEstimateNativeFeeError,ae as isEvmBridgeInitializer,Y as isHttpError,X as isInsufficientFundsError,Z as isInvalidParamsError,oe as isLombardServiceInitializer,se as isMarkrServiceInitializer,ce as isNativeAsset,Q as isResponseValidationError,$ as isSdkError,ee as isServiceInitializationError,le as isServiceInitializer,te as isServiceUnavailableError,ue as isSplAsset,ne as isTimeoutError,ye as parseTransfer,ge as splitCaip2ChainId,be as stringifyTransfer};
@@ -1,2 +1,2 @@
1
- const e=require(`../../../constants.cjs`);function t(){return async({sourceChainId:t})=>{switch(t){case e.AvalancheChainIds.MAINNET:case e.AvalancheChainIds.FUJI:return 1000000000n;default:return 1n}}}exports.getMinimumTransferAmountFactory=t;
1
+ const e=require(`../../../constants.cjs`),t=require(`../_utils.cjs`);function n({environment:n,getAtomicUtxos:r}){return async({sourceChainId:i,targetChainId:a})=>{let o=n===e.Environment.TEST,s=t.getChainAlias(i,o);if(t.getUtxosTotalAmount((await r(t.getChainAlias(a,o),s)).getUTXOs())>0n)return 0n;switch(i){case e.AvalancheChainIds.MAINNET:case e.AvalancheChainIds.FUJI:return 1000000000n;default:return 1n}}}exports.getMinimumTransferAmountFactory=n;
2
2
  //# sourceMappingURL=get-minimum-transfer-amount.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"get-minimum-transfer-amount.cjs","names":["AvalancheChainIds"],"sources":["../../../../src/transfer-service/avalanche-cct/_handlers/get-minimum-transfer-amount.ts"],"sourcesContent":["import { AvalancheChainIds } from '../../../constants';\nimport type { TransferService } from '../../../types/service';\n\nconst ONE_NANO_AVAX = 1n;\nconst ONE_NANO_AVAX_IN_WEI = 1_000_000_000n;\n\nexport function getMinimumTransferAmountFactory(): TransferService['getMinimumTransferAmount'] {\n return async ({ sourceChainId }) => {\n switch (sourceChainId) {\n case AvalancheChainIds.MAINNET:\n case AvalancheChainIds.FUJI: {\n return ONE_NANO_AVAX_IN_WEI;\n }\n\n default: {\n return ONE_NANO_AVAX;\n }\n }\n };\n}\n"],"mappings":"0CAMA,SAAgB,GAA+E,CAC7F,OAAO,MAAO,CAAE,mBAAoB,CAClC,OAAQ,EAAR,CACE,KAAKA,EAAAA,kBAAkB,QACvB,KAAKA,EAAAA,kBAAkB,KACrB,OAAO,YAGT,QACE,OAAO"}
1
+ {"version":3,"file":"get-minimum-transfer-amount.cjs","names":["Environment","getChainAlias","getUtxosTotalAmount","AvalancheChainIds"],"sources":["../../../../src/transfer-service/avalanche-cct/_handlers/get-minimum-transfer-amount.ts"],"sourcesContent":["import { AvalancheChainIds } from '../../../constants';\nimport { Environment } from '../../../constants';\nimport type { TransferService } from '../../../types/service';\nimport { getChainAlias, getUtxosTotalAmount } from '../_utils';\nimport type { GetAtomicUtxosCallback } from '../types';\n\nconst ONE_NANO_AVAX = 1n;\nconst ONE_NANO_AVAX_IN_WEI = 1_000_000_000n;\n\ninterface GetMinimumTransferAmountFactoryOptions {\n environment: Environment;\n getAtomicUtxos: GetAtomicUtxosCallback;\n}\n\nexport function getMinimumTransferAmountFactory({\n environment,\n getAtomicUtxos,\n}: GetMinimumTransferAmountFactoryOptions): TransferService['getMinimumTransferAmount'] {\n return async ({ sourceChainId, targetChainId }) => {\n const isTestnet = environment === Environment.TEST;\n const sourceChainAlias = getChainAlias(sourceChainId, isTestnet);\n const targetChainAlias = getChainAlias(targetChainId, isTestnet);\n const atomicUtxoSet = await getAtomicUtxos(targetChainAlias, sourceChainAlias);\n const atomicUtxosTotalAmount = getUtxosTotalAmount(atomicUtxoSet.getUTXOs());\n\n if (atomicUtxosTotalAmount > 0n) {\n return 0n;\n }\n\n switch (sourceChainId) {\n case AvalancheChainIds.MAINNET:\n case AvalancheChainIds.FUJI: {\n return ONE_NANO_AVAX_IN_WEI;\n }\n\n default: {\n return ONE_NANO_AVAX;\n }\n }\n };\n}\n"],"mappings":"qEAcA,SAAgB,EAAgC,CAC9C,cACA,kBACsF,CACtF,OAAO,MAAO,CAAE,gBAAe,mBAAoB,CACjD,IAAM,EAAY,IAAgBA,EAAAA,YAAY,KACxC,EAAmBC,EAAAA,cAAc,EAAe,EAAU,CAKhE,GAF+BC,EAAAA,qBADT,MAAM,EADHD,EAAAA,cAAc,EAAe,EAAU,CACH,EAAiB,EACb,UAAU,CAAC,CAE/C,GAC3B,OAAO,GAGT,OAAQ,EAAR,CACE,KAAKE,EAAAA,kBAAkB,QACvB,KAAKA,EAAAA,kBAAkB,KACrB,OAAO,YAGT,QACE,OAAO"}
@@ -1,2 +1,2 @@
1
- import{AvalancheChainIds as e}from"../../../constants.js";function t(){return async({sourceChainId:t})=>{switch(t){case e.MAINNET:case e.FUJI:return 1000000000n;default:return 1n}}}export{t as getMinimumTransferAmountFactory};
1
+ import{AvalancheChainIds as e,Environment as t}from"../../../constants.js";import{getChainAlias as n,getUtxosTotalAmount as r}from"../_utils.js";function i({environment:i,getAtomicUtxos:a}){return async({sourceChainId:o,targetChainId:s})=>{let c=i===t.TEST,l=n(o,c);if(r((await a(n(s,c),l)).getUTXOs())>0n)return 0n;switch(o){case e.MAINNET:case e.FUJI:return 1000000000n;default:return 1n}}}export{i as getMinimumTransferAmountFactory};
2
2
  //# sourceMappingURL=get-minimum-transfer-amount.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"get-minimum-transfer-amount.js","names":[],"sources":["../../../../src/transfer-service/avalanche-cct/_handlers/get-minimum-transfer-amount.ts"],"sourcesContent":["import { AvalancheChainIds } from '../../../constants';\nimport type { TransferService } from '../../../types/service';\n\nconst ONE_NANO_AVAX = 1n;\nconst ONE_NANO_AVAX_IN_WEI = 1_000_000_000n;\n\nexport function getMinimumTransferAmountFactory(): TransferService['getMinimumTransferAmount'] {\n return async ({ sourceChainId }) => {\n switch (sourceChainId) {\n case AvalancheChainIds.MAINNET:\n case AvalancheChainIds.FUJI: {\n return ONE_NANO_AVAX_IN_WEI;\n }\n\n default: {\n return ONE_NANO_AVAX;\n }\n }\n };\n}\n"],"mappings":"0DAMA,SAAgB,GAA+E,CAC7F,OAAO,MAAO,CAAE,mBAAoB,CAClC,OAAQ,EAAR,CACE,KAAK,EAAkB,QACvB,KAAK,EAAkB,KACrB,OAAO,YAGT,QACE,OAAO"}
1
+ {"version":3,"file":"get-minimum-transfer-amount.js","names":[],"sources":["../../../../src/transfer-service/avalanche-cct/_handlers/get-minimum-transfer-amount.ts"],"sourcesContent":["import { AvalancheChainIds } from '../../../constants';\nimport { Environment } from '../../../constants';\nimport type { TransferService } from '../../../types/service';\nimport { getChainAlias, getUtxosTotalAmount } from '../_utils';\nimport type { GetAtomicUtxosCallback } from '../types';\n\nconst ONE_NANO_AVAX = 1n;\nconst ONE_NANO_AVAX_IN_WEI = 1_000_000_000n;\n\ninterface GetMinimumTransferAmountFactoryOptions {\n environment: Environment;\n getAtomicUtxos: GetAtomicUtxosCallback;\n}\n\nexport function getMinimumTransferAmountFactory({\n environment,\n getAtomicUtxos,\n}: GetMinimumTransferAmountFactoryOptions): TransferService['getMinimumTransferAmount'] {\n return async ({ sourceChainId, targetChainId }) => {\n const isTestnet = environment === Environment.TEST;\n const sourceChainAlias = getChainAlias(sourceChainId, isTestnet);\n const targetChainAlias = getChainAlias(targetChainId, isTestnet);\n const atomicUtxoSet = await getAtomicUtxos(targetChainAlias, sourceChainAlias);\n const atomicUtxosTotalAmount = getUtxosTotalAmount(atomicUtxoSet.getUTXOs());\n\n if (atomicUtxosTotalAmount > 0n) {\n return 0n;\n }\n\n switch (sourceChainId) {\n case AvalancheChainIds.MAINNET:\n case AvalancheChainIds.FUJI: {\n return ONE_NANO_AVAX_IN_WEI;\n }\n\n default: {\n return ONE_NANO_AVAX;\n }\n }\n };\n}\n"],"mappings":"iJAcA,SAAgB,EAAgC,CAC9C,cACA,kBACsF,CACtF,OAAO,MAAO,CAAE,gBAAe,mBAAoB,CACjD,IAAM,EAAY,IAAgB,EAAY,KACxC,EAAmB,EAAc,EAAe,EAAU,CAKhE,GAF+B,GADT,MAAM,EADH,EAAc,EAAe,EAAU,CACH,EAAiB,EACb,UAAU,CAAC,CAE/C,GAC3B,OAAO,GAGT,OAAQ,EAAR,CACE,KAAK,EAAkB,QACvB,KAAK,EAAkB,KACrB,OAAO,YAGT,QACE,OAAO"}
@@ -1,2 +1,2 @@
1
- require(`../../../_virtual/_rolldown/runtime.cjs`);const e=require(`../../../constants.cjs`),t=require(`../../../errors.cjs`),n=require(`../_utils.cjs`),r=require(`../_type-guards.cjs`);let i=require(`viem`),a=require(`@avalabs/avalanchejs`);function o({clock:o=()=>Math.floor(Date.now()/1e3),environment:s,getAtomicUtxos:c}){return(l,u)=>{let d=new AbortController,f=()=>d.abort();if(s!==e.Environment.PROD&&s!==e.Environment.TEST)return d.signal.aborted||(u(`error`,new t.InvalidParamsError(`Unsupported environment for Avalanche CCT service.`)),u(`done`)),{cancel:f};let p=s===e.Environment.TEST,m=l.fromAddress,h=l.toAddress,g=p?e.AvalancheFujiBlockchainChainIds.C:e.AvalancheMainnetBlockchainChainIds.C,_=l.sourceChain.chainId===g,v=l.targetChain.chainId===g,y=_?(0,i.isAddress)(m):r.isXpAddressFullyValid(m)&&n.xpAddressMatchesNetwork(m,p),b=v?(0,i.isAddress)(h):r.isXpAddressFullyValid(h)&&n.xpAddressMatchesNetwork(h,p);if(!y||!b)return d.signal.aborted||(u(`error`,new t.InvalidParamsError(`Invalid fromAddress or toAddress for the specified environment.`,`Address types must match chain type: C-Chain uses EVM addresses, P/X chains use XP bech32 addresses for the selected environment.`)),u(`done`)),{cancel:f};let x=_||v;return x&&m===h?(d.signal.aborted||(u(`error`,new t.InvalidParamsError(`fromAddress and toAddress must be different when C-Chain is involved.`)),u(`done`)),{cancel:f}):!x&&m!==h?(d.signal.aborted||(u(`error`,new t.InvalidParamsError(`fromAddress and toAddress must be the same for P↔X transfers.`)),u(`done`)),{cancel:f}):((async()=>{let t=n.getChainAlias(l.sourceChain.chainId,p),r=n.getChainAlias(l.targetChain.chainId,p),i=(await c(r,t)).getUTXOs().reduce((e,t)=>e+a.utils.getUtxoInfo(t).amount,0n);if(t===`C`&&l.amount!==0n&&l.amount<1000000000n){d.signal.aborted||u(`done`);return}if(l.amount===0n&&i===0n){d.signal.aborted||u(`done`);return}let s=n.getNativeTokenForChainAlias(t),f=n.getNativeTokenForChainAlias(r),m=n.getOutputAmountForAvalancheCct({amountIn:l.amount,sourceAsset:s,targetAsset:f});if(m===0n){d.signal.aborted||u(`done`);return}let h=n.getOutputAmountForAvalancheCct({amountIn:i,sourceAsset:n.getNativeTokenForChainAlias(`P`),targetAsset:f}),g={aggregator:{id:`avalanche-cct`,name:`Avalanche CCT`},amountIn:l.amount,amountOut:m+h,assetIn:s,assetOut:f,expiresAt:o()+60,fees:[],fromAddress:l.fromAddress,id:crypto.randomUUID(),partnerFeeBps:null,serviceType:e.ServiceType.AVALANCHE_CCT,slippageBps:0,sourceChain:l.sourceChain,targetChain:l.targetChain,toAddress:l.toAddress};d.signal.aborted||(u(`quote`,g),u(`done`))})().catch(e=>{d.signal.aborted||(u(`error`,new t.SdkError(t.ErrorReason.UNKNOWN,t.ErrorCode.UNKNOWN,{cause:e,details:`Failed to stream quotes`})),u(`done`))}),{cancel:f})}}exports.streamQuotesFactory=o;
1
+ require(`../../../_virtual/_rolldown/runtime.cjs`);const e=require(`../../../constants.cjs`),t=require(`../../../errors.cjs`),n=require(`../_utils.cjs`),r=require(`../_type-guards.cjs`);let i=require(`viem`);function a({clock:a=()=>Math.floor(Date.now()/1e3),environment:o,getAtomicUtxos:s}){return(c,l)=>{let u=new AbortController,d=()=>u.abort();if(o!==e.Environment.PROD&&o!==e.Environment.TEST)return u.signal.aborted||(l(`error`,new t.InvalidParamsError(`Unsupported environment for Avalanche CCT service.`)),l(`done`)),{cancel:d};let f=o===e.Environment.TEST,p=c.fromAddress,m=c.toAddress,h=f?e.AvalancheFujiBlockchainChainIds.C:e.AvalancheMainnetBlockchainChainIds.C,g=c.sourceChain.chainId===h,_=c.targetChain.chainId===h,v=g?(0,i.isAddress)(p):r.isXpAddressFullyValid(p)&&n.xpAddressMatchesNetwork(p,f),y=_?(0,i.isAddress)(m):r.isXpAddressFullyValid(m)&&n.xpAddressMatchesNetwork(m,f);if(!v||!y)return u.signal.aborted||(l(`error`,new t.InvalidParamsError(`Invalid fromAddress or toAddress for the specified environment.`,`Address types must match chain type: C-Chain uses EVM addresses, P/X chains use XP bech32 addresses for the selected environment.`)),l(`done`)),{cancel:d};let b=g||_;return b&&p===m?(u.signal.aborted||(l(`error`,new t.InvalidParamsError(`fromAddress and toAddress must be different when C-Chain is involved.`)),l(`done`)),{cancel:d}):!b&&n.stripAddressPrefix(p)!==n.stripAddressPrefix(m)?(u.signal.aborted||(l(`error`,new t.InvalidParamsError(`fromAddress and toAddress must be the same for P↔X transfers.`)),l(`done`)),{cancel:d}):((async()=>{let t=n.getChainAlias(c.sourceChain.chainId,f),r=n.getChainAlias(c.targetChain.chainId,f),i=n.getUtxosTotalAmount((await s(r,t)).getUTXOs());if(t===`C`&&c.amount!==0n&&c.amount<1000000000n){u.signal.aborted||l(`done`);return}if(c.amount===0n&&i===0n){u.signal.aborted||l(`done`);return}let o=n.getNativeTokenForChainAlias(t),d=n.getNativeTokenForChainAlias(r),p=n.getOutputAmountForAvalancheCct({amountIn:c.amount,sourceAsset:o,targetAsset:d});if(p===0n){u.signal.aborted||l(`done`);return}let m=n.getOutputAmountForAvalancheCct({amountIn:i,sourceAsset:n.getNativeTokenForChainAlias(`P`),targetAsset:d}),h={aggregator:{id:`avalanche-cct`,name:`Avalanche CCT`},amountIn:c.amount,amountOut:p+m,assetIn:o,assetOut:d,expiresAt:a()+60,fees:[],fromAddress:c.fromAddress,id:crypto.randomUUID(),partnerFeeBps:null,serviceType:e.ServiceType.AVALANCHE_CCT,slippageBps:0,sourceChain:c.sourceChain,targetChain:c.targetChain,toAddress:c.toAddress};u.signal.aborted||(l(`quote`,h),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=a;
2
2
  //# sourceMappingURL=stream-quotes.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"stream-quotes.cjs","names":["Environment","InvalidParamsError","AvalancheFujiBlockchainChainIds","AvalancheMainnetBlockchainChainIds","isXpAddressFullyValid","xpAddressMatchesNetwork","getChainAlias","utils","getNativeTokenForChainAlias","getOutputAmountForAvalancheCct","ServiceType","SdkError","ErrorReason","ErrorCode"],"sources":["../../../../src/transfer-service/avalanche-cct/_handlers/stream-quotes.ts"],"sourcesContent":["import { utils } from '@avalabs/avalanchejs';\nimport { isAddress } from 'viem';\nimport {\n AvalancheFujiBlockchainChainIds,\n AvalancheMainnetBlockchainChainIds,\n Environment,\n ServiceType,\n type AvalancheBlockchainAlias,\n} from '../../../constants';\nimport { ErrorCode, ErrorReason, InvalidParamsError, SdkError } from '../../../errors';\nimport type { TransferService } from '../../../types/service';\nimport type { Quote } from '../../../types/quote';\nimport { isXpAddressFullyValid } from '../_type-guards';\nimport {\n getChainAlias,\n getNativeTokenForChainAlias,\n getOutputAmountForAvalancheCct,\n xpAddressMatchesNetwork,\n} from '../_utils';\nimport type { GetAtomicUtxosCallback } from '../types';\n\nexport interface StreamQuotesOptions {\n clock?: () => number;\n environment: Environment;\n getAtomicUtxos: GetAtomicUtxosCallback;\n}\n\nexport function streamQuotesFactory({\n clock = () => Math.floor(Date.now() / 1000),\n environment,\n getAtomicUtxos,\n}: StreamQuotesOptions): TransferService['streamQuotes'] {\n return (props, handler) => {\n const ac = new AbortController();\n const cancel = () => ac.abort();\n\n if (environment !== Environment.PROD && environment !== Environment.TEST) {\n if (!ac.signal.aborted) {\n handler('error', new InvalidParamsError('Unsupported environment for Avalanche CCT service.'));\n handler('done');\n }\n\n return { cancel };\n }\n\n const isTestnet = environment === Environment.TEST;\n\n const fromAddress = props.fromAddress;\n const toAddress = props.toAddress;\n const cChainId = isTestnet ? AvalancheFujiBlockchainChainIds.C : AvalancheMainnetBlockchainChainIds.C;\n const isSourceChainC = props.sourceChain.chainId === cChainId;\n const isTargetChainC = props.targetChain.chainId === cChainId;\n\n const isFromAddressValid = isSourceChainC\n ? isAddress(fromAddress)\n : isXpAddressFullyValid(fromAddress) && xpAddressMatchesNetwork(fromAddress, isTestnet);\n\n const isToAddressValid = isTargetChainC\n ? isAddress(toAddress)\n : isXpAddressFullyValid(toAddress) && xpAddressMatchesNetwork(toAddress, isTestnet);\n\n if (!isFromAddressValid || !isToAddressValid) {\n if (!ac.signal.aborted) {\n handler(\n 'error',\n new InvalidParamsError(\n 'Invalid fromAddress or toAddress for the specified environment.',\n 'Address types must match chain type: C-Chain uses EVM addresses, P/X chains use XP bech32 addresses for the selected environment.',\n ),\n );\n handler('done');\n }\n\n return {\n cancel,\n };\n }\n\n // Validate addresses equal if both chains are P/X and different if either chain is C.\n const isEitherChainC = isSourceChainC || isTargetChainC;\n\n if (isEitherChainC && fromAddress === toAddress) {\n if (!ac.signal.aborted) {\n handler(\n 'error',\n new InvalidParamsError('fromAddress and toAddress must be different when C-Chain is involved.'),\n );\n handler('done');\n }\n\n return { cancel };\n }\n\n if (!isEitherChainC && fromAddress !== toAddress) {\n if (!ac.signal.aborted) {\n handler('error', new InvalidParamsError('fromAddress and toAddress must be the same for P↔X transfers.'));\n handler('done');\n }\n\n return { cancel };\n }\n\n (async () => {\n const sourceChainAlias: AvalancheBlockchainAlias = getChainAlias(props.sourceChain.chainId, isTestnet);\n const destinationChainAlias: AvalancheBlockchainAlias = getChainAlias(props.targetChain.chainId, isTestnet);\n const atomicUtxoSet = await getAtomicUtxos(destinationChainAlias, sourceChainAlias);\n const atomicUtxos = atomicUtxoSet.getUTXOs();\n const atomicUtxosTotalAmount = atomicUtxos.reduce((total, utxo) => {\n const utxoInfo = utils.getUtxoInfo(utxo);\n\n return total + utxoInfo.amount;\n }, 0n);\n\n // If source is C-Chain, the props amount must be either `0n` or _at least_ one nano AVAX.\n // Otherwise, we should just emit a \"done\" event.\n if (sourceChainAlias === 'C' && props.amount !== 0n && props.amount < 1_000_000_000n) {\n if (!ac.signal.aborted) {\n handler('done');\n }\n\n return;\n }\n\n // Special case for 0 amount transfers where user intends to finish stuck atomic imports.\n if (props.amount === 0n && atomicUtxosTotalAmount === 0n) {\n if (!ac.signal.aborted) {\n handler('done');\n }\n\n return;\n }\n\n const assetIn = getNativeTokenForChainAlias(sourceChainAlias);\n const assetOut = getNativeTokenForChainAlias(destinationChainAlias);\n const amountIn = getOutputAmountForAvalancheCct({\n amountIn: props.amount,\n sourceAsset: assetIn,\n targetAsset: assetOut,\n });\n\n // Emit no quotes if `amountIn` is 0\n // This can happen if the user tries to transfer an amount below 1 nano AVAX from the C-Chain.\n if (amountIn === 0n) {\n if (!ac.signal.aborted) {\n handler('done');\n }\n\n return;\n }\n\n // TODO: Do we need to account for subtracting import fees from these UTXOs\n // in order to give an accurate picture of how much the user will receive on the other side?\n const amountOutFromAtomicUtxos = getOutputAmountForAvalancheCct({\n amountIn: atomicUtxosTotalAmount,\n sourceAsset: getNativeTokenForChainAlias('P'),\n targetAsset: assetOut,\n });\n\n const quote: Quote = {\n aggregator: {\n id: 'avalanche-cct',\n name: 'Avalanche CCT',\n },\n amountIn: props.amount,\n amountOut: amountIn + amountOutFromAtomicUtxos,\n assetIn,\n assetOut,\n expiresAt: clock() + 60, // Expire in 1 minute.\n fees: [],\n fromAddress: props.fromAddress,\n id: crypto.randomUUID(),\n partnerFeeBps: null,\n serviceType: ServiceType.AVALANCHE_CCT,\n 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":"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"}
1
+ {"version":3,"file":"stream-quotes.cjs","names":["Environment","InvalidParamsError","AvalancheFujiBlockchainChainIds","AvalancheMainnetBlockchainChainIds","isXpAddressFullyValid","xpAddressMatchesNetwork","stripAddressPrefix","getChainAlias","getUtxosTotalAmount","getNativeTokenForChainAlias","getOutputAmountForAvalancheCct","ServiceType","SdkError","ErrorReason","ErrorCode"],"sources":["../../../../src/transfer-service/avalanche-cct/_handlers/stream-quotes.ts"],"sourcesContent":["import { isAddress } from 'viem';\nimport {\n AvalancheFujiBlockchainChainIds,\n AvalancheMainnetBlockchainChainIds,\n Environment,\n ServiceType,\n type AvalancheBlockchainAlias,\n} from '../../../constants';\nimport { ErrorCode, ErrorReason, InvalidParamsError, SdkError } from '../../../errors';\nimport type { TransferService } from '../../../types/service';\nimport type { Quote } from '../../../types/quote';\nimport { isXpAddressFullyValid } from '../_type-guards';\nimport {\n getChainAlias,\n getNativeTokenForChainAlias,\n getOutputAmountForAvalancheCct,\n getUtxosTotalAmount,\n stripAddressPrefix,\n xpAddressMatchesNetwork,\n} from '../_utils';\nimport type { GetAtomicUtxosCallback } from '../types';\n\nexport interface StreamQuotesOptions {\n clock?: () => number;\n environment: Environment;\n getAtomicUtxos: GetAtomicUtxosCallback;\n}\n\nexport function streamQuotesFactory({\n clock = () => Math.floor(Date.now() / 1000),\n environment,\n getAtomicUtxos,\n}: StreamQuotesOptions): TransferService['streamQuotes'] {\n return (props, handler) => {\n const ac = new AbortController();\n const cancel = () => ac.abort();\n\n if (environment !== Environment.PROD && environment !== Environment.TEST) {\n if (!ac.signal.aborted) {\n handler('error', new InvalidParamsError('Unsupported environment for Avalanche CCT service.'));\n handler('done');\n }\n\n return { cancel };\n }\n\n const isTestnet = environment === Environment.TEST;\n\n const fromAddress = props.fromAddress;\n const toAddress = props.toAddress;\n const cChainId = isTestnet ? AvalancheFujiBlockchainChainIds.C : AvalancheMainnetBlockchainChainIds.C;\n const isSourceChainC = props.sourceChain.chainId === cChainId;\n const isTargetChainC = props.targetChain.chainId === cChainId;\n\n const isFromAddressValid = isSourceChainC\n ? isAddress(fromAddress)\n : isXpAddressFullyValid(fromAddress) && xpAddressMatchesNetwork(fromAddress, isTestnet);\n\n const isToAddressValid = isTargetChainC\n ? isAddress(toAddress)\n : isXpAddressFullyValid(toAddress) && xpAddressMatchesNetwork(toAddress, isTestnet);\n\n if (!isFromAddressValid || !isToAddressValid) {\n if (!ac.signal.aborted) {\n handler(\n 'error',\n new InvalidParamsError(\n 'Invalid fromAddress or toAddress for the specified environment.',\n 'Address types must match chain type: C-Chain uses EVM addresses, P/X chains use XP bech32 addresses for the selected environment.',\n ),\n );\n handler('done');\n }\n\n return {\n cancel,\n };\n }\n\n // Validate addresses equal if both chains are P/X and different if either chain is C.\n const isEitherChainC = isSourceChainC || isTargetChainC;\n\n if (isEitherChainC && fromAddress === toAddress) {\n if (!ac.signal.aborted) {\n handler(\n 'error',\n new InvalidParamsError('fromAddress and toAddress must be different when C-Chain is involved.'),\n );\n handler('done');\n }\n\n return { cancel };\n }\n\n if (!isEitherChainC && stripAddressPrefix(fromAddress) !== stripAddressPrefix(toAddress)) {\n if (!ac.signal.aborted) {\n handler('error', new InvalidParamsError('fromAddress and toAddress must be the same for P↔X transfers.'));\n handler('done');\n }\n\n return { cancel };\n }\n\n (async () => {\n const sourceChainAlias: AvalancheBlockchainAlias = getChainAlias(props.sourceChain.chainId, isTestnet);\n const destinationChainAlias: AvalancheBlockchainAlias = getChainAlias(props.targetChain.chainId, isTestnet);\n const atomicUtxoSet = await getAtomicUtxos(destinationChainAlias, sourceChainAlias);\n const atomicUtxos = atomicUtxoSet.getUTXOs();\n const atomicUtxosTotalAmount = getUtxosTotalAmount(atomicUtxos);\n\n // If source is C-Chain, the props amount must be either `0n` or _at least_ one nano AVAX.\n // Otherwise, we should just emit a \"done\" event.\n if (sourceChainAlias === 'C' && props.amount !== 0n && props.amount < 1_000_000_000n) {\n if (!ac.signal.aborted) {\n handler('done');\n }\n\n return;\n }\n\n // Special case for 0 amount transfers where user intends to finish stuck atomic imports.\n if (props.amount === 0n && atomicUtxosTotalAmount === 0n) {\n if (!ac.signal.aborted) {\n handler('done');\n }\n\n return;\n }\n\n const assetIn = getNativeTokenForChainAlias(sourceChainAlias);\n const assetOut = getNativeTokenForChainAlias(destinationChainAlias);\n const amountIn = getOutputAmountForAvalancheCct({\n amountIn: props.amount,\n sourceAsset: assetIn,\n targetAsset: assetOut,\n });\n\n // Emit no quotes if `amountIn` is 0\n // This can happen if the user tries to transfer an amount below 1 nano AVAX from the C-Chain.\n if (amountIn === 0n) {\n if (!ac.signal.aborted) {\n handler('done');\n }\n\n return;\n }\n\n // TODO: Do we need to account for subtracting import fees from these UTXOs\n // in order to give an accurate picture of how much the user will receive on the other side?\n const amountOutFromAtomicUtxos = getOutputAmountForAvalancheCct({\n amountIn: atomicUtxosTotalAmount,\n sourceAsset: getNativeTokenForChainAlias('P'),\n targetAsset: assetOut,\n });\n\n const quote: Quote = {\n aggregator: {\n id: 'avalanche-cct',\n name: 'Avalanche CCT',\n },\n amountIn: props.amount,\n amountOut: amountIn + amountOutFromAtomicUtxos,\n assetIn,\n assetOut,\n expiresAt: clock() + 60, // Expire in 1 minute.\n fees: [],\n fromAddress: props.fromAddress,\n id: crypto.randomUUID(),\n partnerFeeBps: null,\n serviceType: ServiceType.AVALANCHE_CCT,\n 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":"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"}
@@ -1,2 +1,2 @@
1
- import{AvalancheFujiBlockchainChainIds as e,AvalancheMainnetBlockchainChainIds as t,Environment as n,ServiceType as r}from"../../../constants.js";import{ErrorCode as i,ErrorReason as a,InvalidParamsError as o,SdkError as s}from"../../../errors.js";import{getChainAlias as c,getNativeTokenForChainAlias as l,getOutputAmountForAvalancheCct as u,xpAddressMatchesNetwork as d}from"../_utils.js";import{isXpAddressFullyValid as f}from"../_type-guards.js";import{isAddress as p}from"viem";import{utils as m}from"@avalabs/avalanchejs";function h({clock:h=()=>Math.floor(Date.now()/1e3),environment:g,getAtomicUtxos:_}){return(v,y)=>{let b=new AbortController,x=()=>b.abort();if(g!==n.PROD&&g!==n.TEST)return b.signal.aborted||(y(`error`,new o(`Unsupported environment for Avalanche CCT service.`)),y(`done`)),{cancel:x};let S=g===n.TEST,C=v.fromAddress,w=v.toAddress,T=S?e.C:t.C,E=v.sourceChain.chainId===T,D=v.targetChain.chainId===T,O=E?p(C):f(C)&&d(C,S),k=D?p(w):f(w)&&d(w,S);if(!O||!k)return b.signal.aborted||(y(`error`,new o(`Invalid fromAddress or toAddress for the specified environment.`,`Address types must match chain type: C-Chain uses EVM addresses, P/X chains use XP bech32 addresses for the selected environment.`)),y(`done`)),{cancel:x};let A=E||D;return A&&C===w?(b.signal.aborted||(y(`error`,new o(`fromAddress and toAddress must be different when C-Chain is involved.`)),y(`done`)),{cancel:x}):!A&&C!==w?(b.signal.aborted||(y(`error`,new o(`fromAddress and toAddress must be the same for P↔X transfers.`)),y(`done`)),{cancel:x}):((async()=>{let e=c(v.sourceChain.chainId,S),t=c(v.targetChain.chainId,S),n=(await _(t,e)).getUTXOs().reduce((e,t)=>e+m.getUtxoInfo(t).amount,0n);if(e===`C`&&v.amount!==0n&&v.amount<1000000000n){b.signal.aborted||y(`done`);return}if(v.amount===0n&&n===0n){b.signal.aborted||y(`done`);return}let i=l(e),a=l(t),o=u({amountIn:v.amount,sourceAsset:i,targetAsset:a});if(o===0n){b.signal.aborted||y(`done`);return}let s=u({amountIn:n,sourceAsset:l(`P`),targetAsset:a}),d={aggregator:{id:`avalanche-cct`,name:`Avalanche CCT`},amountIn:v.amount,amountOut:o+s,assetIn:i,assetOut:a,expiresAt:h()+60,fees:[],fromAddress:v.fromAddress,id:crypto.randomUUID(),partnerFeeBps:null,serviceType:r.AVALANCHE_CCT,slippageBps:0,sourceChain:v.sourceChain,targetChain:v.targetChain,toAddress:v.toAddress};b.signal.aborted||(y(`quote`,d),y(`done`))})().catch(e=>{b.signal.aborted||(y(`error`,new s(a.UNKNOWN,i.UNKNOWN,{cause:e,details:`Failed to stream quotes`})),y(`done`))}),{cancel:x})}}export{h as streamQuotesFactory};
1
+ import{AvalancheFujiBlockchainChainIds as e,AvalancheMainnetBlockchainChainIds as t,Environment as n,ServiceType as r}from"../../../constants.js";import{ErrorCode as i,ErrorReason as a,InvalidParamsError as o,SdkError as s}from"../../../errors.js";import{getChainAlias as c,getNativeTokenForChainAlias as l,getOutputAmountForAvalancheCct as u,getUtxosTotalAmount as d,stripAddressPrefix as f,xpAddressMatchesNetwork as p}from"../_utils.js";import{isXpAddressFullyValid as m}from"../_type-guards.js";import{isAddress as h}from"viem";function g({clock:g=()=>Math.floor(Date.now()/1e3),environment:_,getAtomicUtxos:v}){return(y,b)=>{let x=new AbortController,S=()=>x.abort();if(_!==n.PROD&&_!==n.TEST)return x.signal.aborted||(b(`error`,new o(`Unsupported environment for Avalanche CCT service.`)),b(`done`)),{cancel:S};let C=_===n.TEST,w=y.fromAddress,T=y.toAddress,E=C?e.C:t.C,D=y.sourceChain.chainId===E,O=y.targetChain.chainId===E,k=D?h(w):m(w)&&p(w,C),A=O?h(T):m(T)&&p(T,C);if(!k||!A)return x.signal.aborted||(b(`error`,new o(`Invalid fromAddress or toAddress for the specified environment.`,`Address types must match chain type: C-Chain uses EVM addresses, P/X chains use XP bech32 addresses for the selected environment.`)),b(`done`)),{cancel:S};let j=D||O;return j&&w===T?(x.signal.aborted||(b(`error`,new o(`fromAddress and toAddress must be different when C-Chain is involved.`)),b(`done`)),{cancel:S}):!j&&f(w)!==f(T)?(x.signal.aborted||(b(`error`,new o(`fromAddress and toAddress must be the same for P↔X transfers.`)),b(`done`)),{cancel:S}):((async()=>{let e=c(y.sourceChain.chainId,C),t=c(y.targetChain.chainId,C),n=d((await v(t,e)).getUTXOs());if(e===`C`&&y.amount!==0n&&y.amount<1000000000n){x.signal.aborted||b(`done`);return}if(y.amount===0n&&n===0n){x.signal.aborted||b(`done`);return}let i=l(e),a=l(t),o=u({amountIn:y.amount,sourceAsset:i,targetAsset:a});if(o===0n){x.signal.aborted||b(`done`);return}let s=u({amountIn:n,sourceAsset:l(`P`),targetAsset:a}),f={aggregator:{id:`avalanche-cct`,name:`Avalanche CCT`},amountIn:y.amount,amountOut:o+s,assetIn:i,assetOut:a,expiresAt:g()+60,fees:[],fromAddress:y.fromAddress,id:crypto.randomUUID(),partnerFeeBps:null,serviceType:r.AVALANCHE_CCT,slippageBps:0,sourceChain:y.sourceChain,targetChain:y.targetChain,toAddress:y.toAddress};x.signal.aborted||(b(`quote`,f),b(`done`))})().catch(e=>{x.signal.aborted||(b(`error`,new s(a.UNKNOWN,i.UNKNOWN,{cause:e,details:`Failed to stream quotes`})),b(`done`))}),{cancel:S})}}export{g as streamQuotesFactory};
2
2
  //# sourceMappingURL=stream-quotes.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"stream-quotes.js","names":[],"sources":["../../../../src/transfer-service/avalanche-cct/_handlers/stream-quotes.ts"],"sourcesContent":["import { utils } from '@avalabs/avalanchejs';\nimport { isAddress } from 'viem';\nimport {\n AvalancheFujiBlockchainChainIds,\n AvalancheMainnetBlockchainChainIds,\n Environment,\n ServiceType,\n type AvalancheBlockchainAlias,\n} from '../../../constants';\nimport { ErrorCode, ErrorReason, InvalidParamsError, SdkError } from '../../../errors';\nimport type { TransferService } from '../../../types/service';\nimport type { Quote } from '../../../types/quote';\nimport { isXpAddressFullyValid } from '../_type-guards';\nimport {\n getChainAlias,\n getNativeTokenForChainAlias,\n getOutputAmountForAvalancheCct,\n xpAddressMatchesNetwork,\n} from '../_utils';\nimport type { GetAtomicUtxosCallback } from '../types';\n\nexport interface StreamQuotesOptions {\n clock?: () => number;\n environment: Environment;\n getAtomicUtxos: GetAtomicUtxosCallback;\n}\n\nexport function streamQuotesFactory({\n clock = () => Math.floor(Date.now() / 1000),\n environment,\n getAtomicUtxos,\n}: StreamQuotesOptions): TransferService['streamQuotes'] {\n return (props, handler) => {\n const ac = new AbortController();\n const cancel = () => ac.abort();\n\n if (environment !== Environment.PROD && environment !== Environment.TEST) {\n if (!ac.signal.aborted) {\n handler('error', new InvalidParamsError('Unsupported environment for Avalanche CCT service.'));\n handler('done');\n }\n\n return { cancel };\n }\n\n const isTestnet = environment === Environment.TEST;\n\n const fromAddress = props.fromAddress;\n const toAddress = props.toAddress;\n const cChainId = isTestnet ? AvalancheFujiBlockchainChainIds.C : AvalancheMainnetBlockchainChainIds.C;\n const isSourceChainC = props.sourceChain.chainId === cChainId;\n const isTargetChainC = props.targetChain.chainId === cChainId;\n\n const isFromAddressValid = isSourceChainC\n ? isAddress(fromAddress)\n : isXpAddressFullyValid(fromAddress) && xpAddressMatchesNetwork(fromAddress, isTestnet);\n\n const isToAddressValid = isTargetChainC\n ? isAddress(toAddress)\n : isXpAddressFullyValid(toAddress) && xpAddressMatchesNetwork(toAddress, isTestnet);\n\n if (!isFromAddressValid || !isToAddressValid) {\n if (!ac.signal.aborted) {\n handler(\n 'error',\n new InvalidParamsError(\n 'Invalid fromAddress or toAddress for the specified environment.',\n 'Address types must match chain type: C-Chain uses EVM addresses, P/X chains use XP bech32 addresses for the selected environment.',\n ),\n );\n handler('done');\n }\n\n return {\n cancel,\n };\n }\n\n // Validate addresses equal if both chains are P/X and different if either chain is C.\n const isEitherChainC = isSourceChainC || isTargetChainC;\n\n if (isEitherChainC && fromAddress === toAddress) {\n if (!ac.signal.aborted) {\n handler(\n 'error',\n new InvalidParamsError('fromAddress and toAddress must be different when C-Chain is involved.'),\n );\n handler('done');\n }\n\n return { cancel };\n }\n\n if (!isEitherChainC && fromAddress !== toAddress) {\n if (!ac.signal.aborted) {\n handler('error', new InvalidParamsError('fromAddress and toAddress must be the same for P↔X transfers.'));\n handler('done');\n }\n\n return { cancel };\n }\n\n (async () => {\n const sourceChainAlias: AvalancheBlockchainAlias = getChainAlias(props.sourceChain.chainId, isTestnet);\n const destinationChainAlias: AvalancheBlockchainAlias = getChainAlias(props.targetChain.chainId, isTestnet);\n const atomicUtxoSet = await getAtomicUtxos(destinationChainAlias, sourceChainAlias);\n const atomicUtxos = atomicUtxoSet.getUTXOs();\n const atomicUtxosTotalAmount = atomicUtxos.reduce((total, utxo) => {\n const utxoInfo = utils.getUtxoInfo(utxo);\n\n return total + utxoInfo.amount;\n }, 0n);\n\n // If source is C-Chain, the props amount must be either `0n` or _at least_ one nano AVAX.\n // Otherwise, we should just emit a \"done\" event.\n if (sourceChainAlias === 'C' && props.amount !== 0n && props.amount < 1_000_000_000n) {\n if (!ac.signal.aborted) {\n handler('done');\n }\n\n return;\n }\n\n // Special case for 0 amount transfers where user intends to finish stuck atomic imports.\n if (props.amount === 0n && atomicUtxosTotalAmount === 0n) {\n if (!ac.signal.aborted) {\n handler('done');\n }\n\n return;\n }\n\n const assetIn = getNativeTokenForChainAlias(sourceChainAlias);\n const assetOut = getNativeTokenForChainAlias(destinationChainAlias);\n const amountIn = getOutputAmountForAvalancheCct({\n amountIn: props.amount,\n sourceAsset: assetIn,\n targetAsset: assetOut,\n });\n\n // Emit no quotes if `amountIn` is 0\n // This can happen if the user tries to transfer an amount below 1 nano AVAX from the C-Chain.\n if (amountIn === 0n) {\n if (!ac.signal.aborted) {\n handler('done');\n }\n\n return;\n }\n\n // TODO: Do we need to account for subtracting import fees from these UTXOs\n // in order to give an accurate picture of how much the user will receive on the other side?\n const amountOutFromAtomicUtxos = getOutputAmountForAvalancheCct({\n amountIn: atomicUtxosTotalAmount,\n sourceAsset: getNativeTokenForChainAlias('P'),\n targetAsset: assetOut,\n });\n\n const quote: Quote = {\n aggregator: {\n id: 'avalanche-cct',\n name: 'Avalanche CCT',\n },\n amountIn: props.amount,\n amountOut: amountIn + amountOutFromAtomicUtxos,\n assetIn,\n assetOut,\n expiresAt: clock() + 60, // Expire in 1 minute.\n fees: [],\n fromAddress: props.fromAddress,\n id: crypto.randomUUID(),\n partnerFeeBps: null,\n serviceType: ServiceType.AVALANCHE_CCT,\n 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":"ghBA2BA,SAAgB,EAAoB,CAClC,YAAc,KAAK,MAAM,KAAK,KAAK,CAAG,IAAK,CAC3C,cACA,kBACuD,CACvD,OAAQ,EAAO,IAAY,CACzB,IAAM,EAAK,IAAI,gBACT,MAAe,EAAG,OAAO,CAE/B,GAAI,IAAgB,EAAY,MAAQ,IAAgB,EAAY,KAMlE,OALK,EAAG,OAAO,UACb,EAAQ,QAAS,IAAI,EAAmB,qDAAqD,CAAC,CAC9F,EAAQ,OAAO,EAGV,CAAE,SAAQ,CAGnB,IAAM,EAAY,IAAgB,EAAY,KAExC,EAAc,EAAM,YACpB,EAAY,EAAM,UAClB,EAAW,EAAY,EAAgC,EAAI,EAAmC,EAC9F,EAAiB,EAAM,YAAY,UAAY,EAC/C,EAAiB,EAAM,YAAY,UAAY,EAE/C,EAAqB,EACvB,EAAU,EAAY,CACtB,EAAsB,EAAY,EAAI,EAAwB,EAAa,EAAU,CAEnF,EAAmB,EACrB,EAAU,EAAU,CACpB,EAAsB,EAAU,EAAI,EAAwB,EAAW,EAAU,CAErF,GAAI,CAAC,GAAsB,CAAC,EAY1B,OAXK,EAAG,OAAO,UACb,EACE,QACA,IAAI,EACF,kEACA,oIACD,CACF,CACD,EAAQ,OAAO,EAGV,CACL,SACD,CAIH,IAAM,EAAiB,GAAkB,EAkHzC,OAhHI,GAAkB,IAAgB,GAC/B,EAAG,OAAO,UACb,EACE,QACA,IAAI,EAAmB,wEAAwE,CAChG,CACD,EAAQ,OAAO,EAGV,CAAE,SAAQ,EAGf,CAAC,GAAkB,IAAgB,GAChC,EAAG,OAAO,UACb,EAAQ,QAAS,IAAI,EAAmB,gEAAgE,CAAC,CACzG,EAAQ,OAAO,EAGV,CAAE,SAAQ,IAGlB,SAAY,CACX,IAAM,EAA6C,EAAc,EAAM,YAAY,QAAS,EAAU,CAChG,EAAkD,EAAc,EAAM,YAAY,QAAS,EAAU,CAGrG,GAFgB,MAAM,EAAe,EAAuB,EAAiB,EACjD,UAAU,CACD,QAAQ,EAAO,IAGjD,EAFU,EAAM,YAAY,EAAK,CAEhB,OACvB,GAAG,CAIN,GAAI,IAAqB,KAAO,EAAM,SAAW,IAAM,EAAM,OAAS,YAAgB,CAC/E,EAAG,OAAO,SACb,EAAQ,OAAO,CAGjB,OAIF,GAAI,EAAM,SAAW,IAAM,IAA2B,GAAI,CACnD,EAAG,OAAO,SACb,EAAQ,OAAO,CAGjB,OAGF,IAAM,EAAU,EAA4B,EAAiB,CACvD,EAAW,EAA4B,EAAsB,CAC7D,EAAW,EAA+B,CAC9C,SAAU,EAAM,OAChB,YAAa,EACb,YAAa,EACd,CAAC,CAIF,GAAI,IAAa,GAAI,CACd,EAAG,OAAO,SACb,EAAQ,OAAO,CAGjB,OAKF,IAAM,EAA2B,EAA+B,CAC9D,SAAU,EACV,YAAa,EAA4B,IAAI,CAC7C,YAAa,EACd,CAAC,CAEI,EAAe,CACnB,WAAY,CACV,GAAI,gBACJ,KAAM,gBACP,CACD,SAAU,EAAM,OAChB,UAAW,EAAW,EACtB,UACA,WACA,UAAW,GAAO,CAAG,GACrB,KAAM,EAAE,CACR,YAAa,EAAM,YACnB,GAAI,OAAO,YAAY,CACvB,cAAe,KACf,YAAa,EAAY,cACzB,YAAa,EACb,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/avalanche-cct/_handlers/stream-quotes.ts"],"sourcesContent":["import { isAddress } from 'viem';\nimport {\n AvalancheFujiBlockchainChainIds,\n AvalancheMainnetBlockchainChainIds,\n Environment,\n ServiceType,\n type AvalancheBlockchainAlias,\n} from '../../../constants';\nimport { ErrorCode, ErrorReason, InvalidParamsError, SdkError } from '../../../errors';\nimport type { TransferService } from '../../../types/service';\nimport type { Quote } from '../../../types/quote';\nimport { isXpAddressFullyValid } from '../_type-guards';\nimport {\n getChainAlias,\n getNativeTokenForChainAlias,\n getOutputAmountForAvalancheCct,\n getUtxosTotalAmount,\n stripAddressPrefix,\n xpAddressMatchesNetwork,\n} from '../_utils';\nimport type { GetAtomicUtxosCallback } from '../types';\n\nexport interface StreamQuotesOptions {\n clock?: () => number;\n environment: Environment;\n getAtomicUtxos: GetAtomicUtxosCallback;\n}\n\nexport function streamQuotesFactory({\n clock = () => Math.floor(Date.now() / 1000),\n environment,\n getAtomicUtxos,\n}: StreamQuotesOptions): TransferService['streamQuotes'] {\n return (props, handler) => {\n const ac = new AbortController();\n const cancel = () => ac.abort();\n\n if (environment !== Environment.PROD && environment !== Environment.TEST) {\n if (!ac.signal.aborted) {\n handler('error', new InvalidParamsError('Unsupported environment for Avalanche CCT service.'));\n handler('done');\n }\n\n return { cancel };\n }\n\n const isTestnet = environment === Environment.TEST;\n\n const fromAddress = props.fromAddress;\n const toAddress = props.toAddress;\n const cChainId = isTestnet ? AvalancheFujiBlockchainChainIds.C : AvalancheMainnetBlockchainChainIds.C;\n const isSourceChainC = props.sourceChain.chainId === cChainId;\n const isTargetChainC = props.targetChain.chainId === cChainId;\n\n const isFromAddressValid = isSourceChainC\n ? isAddress(fromAddress)\n : isXpAddressFullyValid(fromAddress) && xpAddressMatchesNetwork(fromAddress, isTestnet);\n\n const isToAddressValid = isTargetChainC\n ? isAddress(toAddress)\n : isXpAddressFullyValid(toAddress) && xpAddressMatchesNetwork(toAddress, isTestnet);\n\n if (!isFromAddressValid || !isToAddressValid) {\n if (!ac.signal.aborted) {\n handler(\n 'error',\n new InvalidParamsError(\n 'Invalid fromAddress or toAddress for the specified environment.',\n 'Address types must match chain type: C-Chain uses EVM addresses, P/X chains use XP bech32 addresses for the selected environment.',\n ),\n );\n handler('done');\n }\n\n return {\n cancel,\n };\n }\n\n // Validate addresses equal if both chains are P/X and different if either chain is C.\n const isEitherChainC = isSourceChainC || isTargetChainC;\n\n if (isEitherChainC && fromAddress === toAddress) {\n if (!ac.signal.aborted) {\n handler(\n 'error',\n new InvalidParamsError('fromAddress and toAddress must be different when C-Chain is involved.'),\n );\n handler('done');\n }\n\n return { cancel };\n }\n\n if (!isEitherChainC && stripAddressPrefix(fromAddress) !== stripAddressPrefix(toAddress)) {\n if (!ac.signal.aborted) {\n handler('error', new InvalidParamsError('fromAddress and toAddress must be the same for P↔X transfers.'));\n handler('done');\n }\n\n return { cancel };\n }\n\n (async () => {\n const sourceChainAlias: AvalancheBlockchainAlias = getChainAlias(props.sourceChain.chainId, isTestnet);\n const destinationChainAlias: AvalancheBlockchainAlias = getChainAlias(props.targetChain.chainId, isTestnet);\n const atomicUtxoSet = await getAtomicUtxos(destinationChainAlias, sourceChainAlias);\n const atomicUtxos = atomicUtxoSet.getUTXOs();\n const atomicUtxosTotalAmount = getUtxosTotalAmount(atomicUtxos);\n\n // If source is C-Chain, the props amount must be either `0n` or _at least_ one nano AVAX.\n // Otherwise, we should just emit a \"done\" event.\n if (sourceChainAlias === 'C' && props.amount !== 0n && props.amount < 1_000_000_000n) {\n if (!ac.signal.aborted) {\n handler('done');\n }\n\n return;\n }\n\n // Special case for 0 amount transfers where user intends to finish stuck atomic imports.\n if (props.amount === 0n && atomicUtxosTotalAmount === 0n) {\n if (!ac.signal.aborted) {\n handler('done');\n }\n\n return;\n }\n\n const assetIn = getNativeTokenForChainAlias(sourceChainAlias);\n const assetOut = getNativeTokenForChainAlias(destinationChainAlias);\n const amountIn = getOutputAmountForAvalancheCct({\n amountIn: props.amount,\n sourceAsset: assetIn,\n targetAsset: assetOut,\n });\n\n // Emit no quotes if `amountIn` is 0\n // This can happen if the user tries to transfer an amount below 1 nano AVAX from the C-Chain.\n if (amountIn === 0n) {\n if (!ac.signal.aborted) {\n handler('done');\n }\n\n return;\n }\n\n // TODO: Do we need to account for subtracting import fees from these UTXOs\n // in order to give an accurate picture of how much the user will receive on the other side?\n const amountOutFromAtomicUtxos = getOutputAmountForAvalancheCct({\n amountIn: atomicUtxosTotalAmount,\n sourceAsset: getNativeTokenForChainAlias('P'),\n targetAsset: assetOut,\n });\n\n const quote: Quote = {\n aggregator: {\n id: 'avalanche-cct',\n name: 'Avalanche CCT',\n },\n amountIn: props.amount,\n amountOut: amountIn + amountOutFromAtomicUtxos,\n assetIn,\n assetOut,\n expiresAt: clock() + 60, // Expire in 1 minute.\n fees: [],\n fromAddress: props.fromAddress,\n id: crypto.randomUUID(),\n partnerFeeBps: null,\n serviceType: ServiceType.AVALANCHE_CCT,\n 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":"ohBA4BA,SAAgB,EAAoB,CAClC,YAAc,KAAK,MAAM,KAAK,KAAK,CAAG,IAAK,CAC3C,cACA,kBACuD,CACvD,OAAQ,EAAO,IAAY,CACzB,IAAM,EAAK,IAAI,gBACT,MAAe,EAAG,OAAO,CAE/B,GAAI,IAAgB,EAAY,MAAQ,IAAgB,EAAY,KAMlE,OALK,EAAG,OAAO,UACb,EAAQ,QAAS,IAAI,EAAmB,qDAAqD,CAAC,CAC9F,EAAQ,OAAO,EAGV,CAAE,SAAQ,CAGnB,IAAM,EAAY,IAAgB,EAAY,KAExC,EAAc,EAAM,YACpB,EAAY,EAAM,UAClB,EAAW,EAAY,EAAgC,EAAI,EAAmC,EAC9F,EAAiB,EAAM,YAAY,UAAY,EAC/C,EAAiB,EAAM,YAAY,UAAY,EAE/C,EAAqB,EACvB,EAAU,EAAY,CACtB,EAAsB,EAAY,EAAI,EAAwB,EAAa,EAAU,CAEnF,EAAmB,EACrB,EAAU,EAAU,CACpB,EAAsB,EAAU,EAAI,EAAwB,EAAW,EAAU,CAErF,GAAI,CAAC,GAAsB,CAAC,EAY1B,OAXK,EAAG,OAAO,UACb,EACE,QACA,IAAI,EACF,kEACA,oIACD,CACF,CACD,EAAQ,OAAO,EAGV,CACL,SACD,CAIH,IAAM,EAAiB,GAAkB,EA8GzC,OA5GI,GAAkB,IAAgB,GAC/B,EAAG,OAAO,UACb,EACE,QACA,IAAI,EAAmB,wEAAwE,CAChG,CACD,EAAQ,OAAO,EAGV,CAAE,SAAQ,EAGf,CAAC,GAAkB,EAAmB,EAAY,GAAK,EAAmB,EAAU,EACjF,EAAG,OAAO,UACb,EAAQ,QAAS,IAAI,EAAmB,gEAAgE,CAAC,CACzG,EAAQ,OAAO,EAGV,CAAE,SAAQ,IAGlB,SAAY,CACX,IAAM,EAA6C,EAAc,EAAM,YAAY,QAAS,EAAU,CAChG,EAAkD,EAAc,EAAM,YAAY,QAAS,EAAU,CAGrG,EAAyB,GAFT,MAAM,EAAe,EAAuB,EAAiB,EACjD,UAAU,CACmB,CAI/D,GAAI,IAAqB,KAAO,EAAM,SAAW,IAAM,EAAM,OAAS,YAAgB,CAC/E,EAAG,OAAO,SACb,EAAQ,OAAO,CAGjB,OAIF,GAAI,EAAM,SAAW,IAAM,IAA2B,GAAI,CACnD,EAAG,OAAO,SACb,EAAQ,OAAO,CAGjB,OAGF,IAAM,EAAU,EAA4B,EAAiB,CACvD,EAAW,EAA4B,EAAsB,CAC7D,EAAW,EAA+B,CAC9C,SAAU,EAAM,OAChB,YAAa,EACb,YAAa,EACd,CAAC,CAIF,GAAI,IAAa,GAAI,CACd,EAAG,OAAO,SACb,EAAQ,OAAO,CAGjB,OAKF,IAAM,EAA2B,EAA+B,CAC9D,SAAU,EACV,YAAa,EAA4B,IAAI,CAC7C,YAAa,EACd,CAAC,CAEI,EAAe,CACnB,WAAY,CACV,GAAI,gBACJ,KAAM,gBACP,CACD,SAAU,EAAM,OAChB,UAAW,EAAW,EACtB,UACA,WACA,UAAW,GAAO,CAAG,GACrB,KAAM,EAAE,CACR,YAAa,EAAM,YACnB,GAAI,OAAO,YAAY,CACvB,cAAe,KACf,YAAa,EAAY,cACzB,YAAa,EACb,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.cjs`),r=require(`../../_transfer-utilities.cjs`),i=require(`../../_utils.cjs`),a=require(`../_utils/p-chain.cjs`),o=require(`../_utils/polling.cjs`),s=require(`../_utils/transactions.cjs`),c=require(`../_utils/fees.cjs`),l=require(`../_utils/addresses.cjs`);function u({ajsContext:i,avalancheSendTx:a,environment:s,getCoreEthAddress:c,getAtomicUtxos:u,getUtxos:h,getWalletAddressesForChainAlias:g,getWalletChangeAddressForChainAlias:_}){return async({onStepChange:v,quote:y})=>{if(y.serviceType!==e.ServiceType.AVALANCHE_CCT)throw new t.SdkError(t.ErrorReason.INCORRECT_PROVIDER_PROVIDED,t.ErrorCode.INVALID_PARAMS);let b=n.getEnvironmentIsTestnet(s),x=n.getChainAlias(y.sourceChain.chainId,b),S=n.getChainAlias(y.targetChain.chainId,b),C=l.getExportFromAddressEvm(y.fromAddress,x),w=x===`C`?void 0:l.assertXpAddress(y.fromAddress),T=await l.getExportToAddress({destinationChainAlias:S,getCoreEthAddress:c,quoteToAddress:y.toAddress}),E=l.getImportToAddress(y.toAddress,S),D=S===`C`?T:l.assertXpAddress(y.toAddress),O=y.amountIn>0n,k=O?2:1,A=Date.now(),j=d(y,s),M;if(O){v?.({currentSignature:1,currentSignatureReason:e.TransferSignatureReason.AvalancheCrossChainExport,quote:y,requiredSignatures:k});let c=await n.tryOrThrow(()=>p({ajsContext:i,environment:s,getUtxos:h,getWalletAddressesForChainAlias:g,getWalletChangeAddressForChainAlias:_,quoteAmountIn:y.amountIn,sourceChainAlias:x,destinationChainAlias:S,fromAddress:C,requiredFromAddress:w,toAddress:T}),e=>new t.SdkError(`Failed to build Avalanche export transaction.`,t.ErrorCode.UNKNOWN,{cause:e}));M=await n.tryOrThrow(()=>a(c,`export`,x),e=>new t.SdkError(`Failed to sign/send Avalanche export transaction.`,t.ErrorCode.SIGNING_FAILED,{cause:e}));let l;try{l=await o.pollPrimaryNetworkTxStatus({chainAlias:x,environment:s,txId:M})}catch{return r.sourcePendingTransferFromQuote(y,{environment:s,requiredConfirmationCount:1,startedAtMs:A,txHash:M})}if(!l)return f({errorCode:t.ErrorCode.TRANSACTION_REVERTED,errorReason:`Export transaction was not accepted by Avalanche.`,sourceStartedAtMs:A,sourceTxHash:M,transferBase:j})}let N=await n.tryOrThrow(async()=>(await u(S,x)).getUTXOs(),e=>new t.SdkError(`Failed to fetch Avalanche atomic UTXOs.`,t.ErrorCode.UNKNOWN,{cause:e}));if(N.length===0)return f({errorCode:t.ErrorCode.INVALID_PARAMS,errorReason:`No atomic UTXOs available to import for this route.`,sourceStartedAtMs:A,sourceTxHash:M,transferBase:j});v?.({currentSignature:O?2:1,currentSignatureReason:e.TransferSignatureReason.AvalancheCrossChainImport,quote:y,requiredSignatures:k});let P=await n.tryOrThrow(()=>m({ajsContext:i,atomicUtxos:N,destinationChainAlias:S,environment:s,getWalletAddressesForChainAlias:g,getWalletChangeAddressForChainAlias:_,sourceChainAlias:x,requiredFromAddress:D,toAddress:E}),e=>new t.SdkError(`Failed to build Avalanche import transaction.`,t.ErrorCode.UNKNOWN,{cause:e})),F=await n.tryOrThrow(()=>a(P,`import`,S),e=>new t.SdkError(`Failed to sign/send Avalanche import transaction.`,t.ErrorCode.SIGNING_FAILED,{cause:e}));return{...j,source:{confirmationCount:M?1:0,requiredConfirmationCount:1,startedAtMs:A,txHash:M??F},status:`target-pending`,target:{confirmationCount:0,requiredConfirmationCount:1,startedAtMs:Date.now(),txHash:F}}}}function d(e,t){return{amountIn:e.amountIn,amountOut:e.amountOut,environment:t,fees:e.fees,fromAddress:e.fromAddress,id:e.id,partnerFeeBps:e.partnerFeeBps,sourceAsset:e.assetIn,sourceChain:e.sourceChain,targetAsset:e.assetOut,targetChain:e.targetChain,toAddress:e.toAddress,type:e.serviceType}}function f({errorCode:e,errorReason:t,sourceStartedAtMs:n,sourceTxHash:r,transferBase:i}){return{...i,errorCode:e,errorReason:t,failedAtMs:Date.now(),...r?{source:{confirmationCount:0,requiredConfirmationCount:1,startedAtMs:n,txHash:r}}:{},status:`failed`}}async function p({ajsContext:n,destinationChainAlias:r,environment:o,fromAddress:u,getUtxos:d,getWalletAddressesForChainAlias:f,getWalletChangeAddressForChainAlias:p,quoteAmountIn:m,requiredFromAddress:h,sourceChainAlias:g,toAddress:_}){switch(g){case`C`:{if(r===`C`)throw new t.InvalidParamsError(`Source and destination chain aliases must be different.`);if(!u)throw new t.InvalidParamsError(`fromAddress must be an EVM address when exporting from C-Chain.`);let a=i.getEvmClientForChain({chain:o===e.Environment.TEST?e.AVALANCHE_FUJI_CHAIN:e.AVALANCHE_MAINNET_CHAIN}),[l,d]=await Promise.all([a.getTransactionCount({address:u}),c.getCChainBaseFeeInNanoAvax(o)]);return s.exportTx({amountInNanoAvax:m,baseFeeInNanoAvax:d,context:n,destinationChainAlias:r,fromAddress:u,nonce:BigInt(l),sourceChainAlias:g,toAddress:_})}case`P`:{if(r===`P`)throw new t.InvalidParamsError(`Source and destination chain aliases must be different.`);let[e,i,c,u]=await Promise.all([l.getWalletChangeAddress({chainAlias:g,getWalletChangeAddressForChainAlias:p}),a.getFeeState(o),l.getWalletFromAddresses({chainAlias:g,getWalletAddressesForChainAlias:f,requiredAddress:h}),d(`P`)]);return s.exportTx({amountInNanoAvax:m,changeAddress:e,context:n,destinationChainAlias:r,feeState:i,fromAddresses:c,sourceChainAlias:g,toAddress:_,utxos:u.getUTXOs()})}case`X`:{if(r===`X`)throw new t.InvalidParamsError(`Source and destination chain aliases must be different.`);let[e,i,a]=await Promise.all([l.getWalletChangeAddress({chainAlias:g,getWalletChangeAddressForChainAlias:p}),l.getWalletFromAddresses({chainAlias:g,getWalletAddressesForChainAlias:f,requiredAddress:h}),d(`X`)]);return s.exportTx({amountInNanoAvax:m,changeAddress:e,context:n,destinationChainAlias:r,fromAddresses:i,sourceChainAlias:g,toAddress:_,utxos:a.getUTXOs()})}}}async function m({ajsContext:e,atomicUtxos:n,destinationChainAlias:r,environment:i,getWalletAddressesForChainAlias:o,getWalletChangeAddressForChainAlias:u,requiredFromAddress:d,sourceChainAlias:f,toAddress:p}){switch(r){case`C`:{if(f===`C`)throw new t.InvalidParamsError(`Source and destination chain aliases must be different.`);let[a,u]=await Promise.all([c.getCChainBaseFeeInNanoAvax(i),l.getWalletFromAddresses({chainAlias:r,getWalletAddressesForChainAlias:o,requiredAddress:d})]);return s.importTx({atomicUtxos:n,baseFeeInNanoAvax:a,context:e,destinationChainAlias:r,fromAddresses:u,sourceChainAlias:f,toAddress:l.getImportToAddress(p,`C`)})}case`P`:{if(f===`P`)throw new t.InvalidParamsError(`Source and destination chain aliases must be different.`);let[c,u]=await Promise.all([a.getFeeState(i),l.getWalletFromAddresses({chainAlias:r,getWalletAddressesForChainAlias:o,requiredAddress:d})]);return s.importTx({atomicUtxos:n,context:e,destinationChainAlias:r,feeState:c,fromAddresses:u,sourceChainAlias:f,toAddress:l.getImportToAddress(p,`P`)})}case`X`:{if(f===`X`)throw new t.InvalidParamsError(`Source and destination chain aliases must be different.`);let[i,a]=await Promise.all([l.getWalletChangeAddress({chainAlias:r,getWalletChangeAddressForChainAlias:u}),l.getWalletFromAddresses({chainAlias:r,getWalletAddressesForChainAlias:o,requiredAddress:d})]);return s.importTx({atomicUtxos:n,changeAddress:i,context:e,destinationChainAlias:r,fromAddresses:a,sourceChainAlias:f,toAddress:l.getImportToAddress(p,`X`)})}}}exports.transferAssetFactory=u;
1
+ const e=require(`../../../constants.cjs`),t=require(`../../../errors.cjs`),n=require(`../constants.cjs`),r=require(`../_utils.cjs`),i=require(`../../_transfer-utilities.cjs`),a=require(`../../_utils.cjs`),o=require(`../_utils/p-chain.cjs`),s=require(`../_utils/polling.cjs`),c=require(`../_utils/transactions.cjs`),l=require(`../_utils/fees.cjs`),u=require(`../_utils/addresses.cjs`);function d({ajsContext:n,avalancheSendTx:a,environment:o,getCoreEthAddress:c,getAtomicUtxos:l,getUtxos:d,getWalletAddressesForChainAlias:m,getWalletChangeAddressForChainAlias:_}){return async({onStepChange:v,quote:y})=>{if(y.serviceType!==e.ServiceType.AVALANCHE_CCT)throw new t.SdkError(t.ErrorReason.INCORRECT_PROVIDER_PROVIDED,t.ErrorCode.INVALID_PARAMS);let b=r.getEnvironmentIsTestnet(o),x=r.getChainAlias(y.sourceChain.chainId,b),S=r.getChainAlias(y.targetChain.chainId,b),C=u.getExportFromAddressEvm(y.fromAddress,x),w=x===`C`?void 0:u.assertXpAddress(y.fromAddress),T=await u.getExportToAddress({destinationChainAlias:S,getCoreEthAddress:c,quoteToAddress:y.toAddress}),E=u.getImportToAddress(y.toAddress,S),D=S===`C`?T:u.assertXpAddress(y.toAddress),O=y.amountIn>0n,k=O?2:1,A=Date.now(),j=f(y,o),M;if(O){v?.({currentSignature:1,currentSignatureReason:e.TransferSignatureReason.AvalancheCrossChainExport,quote:y,requiredSignatures:k});let c=await r.tryOrThrow(()=>h({ajsContext:n,environment:o,getUtxos:d,getWalletAddressesForChainAlias:m,getWalletChangeAddressForChainAlias:_,quoteAmountIn:y.amountIn,sourceChainAlias:x,destinationChainAlias:S,fromAddress:C,requiredFromAddress:w,toAddress:T}),e=>new t.SdkError(`Failed to build Avalanche export transaction.`,t.ErrorCode.UNKNOWN,{cause:e}));M=await r.tryOrThrow(()=>a({baseFeeInNanoAvax:c.baseFeeInNanoAvax,chainAlias:x,txType:`export`,unsignedTx:c.unsignedTx}),e=>new t.SdkError(`Failed to sign/send Avalanche export transaction.`,t.ErrorCode.SIGNING_FAILED,{cause:e}));let l;try{l=await s.pollPrimaryNetworkTxStatus({chainAlias:x,environment:o,txId:M})}catch{return i.sourcePendingTransferFromQuote(y,{environment:o,requiredConfirmationCount:1,startedAtMs:A,txHash:M})}if(!l)return p({errorCode:t.ErrorCode.TRANSACTION_REVERTED,errorReason:`Export transaction was not accepted by Avalanche.`,sourceStartedAtMs:A,sourceTxHash:M,transferBase:j})}let N=await r.tryOrThrow(async()=>(await l(S,x)).getUTXOs(),e=>new t.SdkError(`Failed to fetch Avalanche atomic UTXOs.`,t.ErrorCode.UNKNOWN,{cause:e}));if(N.length===0)return p({errorCode:t.ErrorCode.INVALID_PARAMS,errorReason:`No atomic UTXOs available to import for this route.`,sourceStartedAtMs:A,sourceTxHash:M,transferBase:j});v?.({currentSignature:O?2:1,currentSignatureReason:e.TransferSignatureReason.AvalancheCrossChainImport,quote:y,requiredSignatures:k});let P=await r.tryOrThrow(()=>g({ajsContext:n,atomicUtxos:N,destinationChainAlias:S,environment:o,getWalletAddressesForChainAlias:m,getWalletChangeAddressForChainAlias:_,sourceChainAlias:x,requiredFromAddress:D,toAddress:E}),e=>new t.SdkError(`Failed to build Avalanche import transaction.`,t.ErrorCode.UNKNOWN,{cause:e})),F=await r.tryOrThrow(()=>a({baseFeeInNanoAvax:P.baseFeeInNanoAvax,chainAlias:S,txType:`import`,unsignedTx:P.unsignedTx}),e=>new t.SdkError(`Failed to sign/send Avalanche import transaction.`,t.ErrorCode.SIGNING_FAILED,{cause:e}));return{...j,source:{confirmationCount:M?1:0,requiredConfirmationCount:1,startedAtMs:A,txHash:M??F},status:`target-pending`,target:{confirmationCount:0,requiredConfirmationCount:1,startedAtMs:Date.now(),txHash:F}}}}function f(e,t){return{amountIn:e.amountIn,amountOut:e.amountOut,environment:t,fees:e.fees,fromAddress:e.fromAddress,id:e.id,partnerFeeBps:e.partnerFeeBps,sourceAsset:e.assetIn,sourceChain:e.sourceChain,targetAsset:e.assetOut,targetChain:e.targetChain,toAddress:e.toAddress,type:e.serviceType}}function p({errorCode:e,errorReason:t,sourceStartedAtMs:n,sourceTxHash:r,transferBase:i}){return{...i,errorCode:e,errorReason:t,failedAtMs:Date.now(),...r?{source:{confirmationCount:0,requiredConfirmationCount:1,startedAtMs:n,txHash:r}}:{},status:`failed`}}function m(e,t){return e===`C`?t/n.WEI_PER_NANO_AVAX_BIGINT:t}async function h({ajsContext:n,destinationChainAlias:r,environment:i,fromAddress:s,getUtxos:d,getWalletAddressesForChainAlias:f,getWalletChangeAddressForChainAlias:p,quoteAmountIn:h,requiredFromAddress:g,sourceChainAlias:_,toAddress:v}){let y=m(_,h);switch(_){case`C`:{if(r===`C`)throw new t.InvalidParamsError(`Source and destination chain aliases must be different.`);if(!s)throw new t.InvalidParamsError(`fromAddress must be an EVM address when exporting from C-Chain.`);let o=a.getEvmClientForChain({chain:i===e.Environment.TEST?e.AVALANCHE_FUJI_CHAIN:e.AVALANCHE_MAINNET_CHAIN}),[u,d]=await Promise.all([o.getTransactionCount({address:s}),l.getCChainBaseFeeInNanoAvax(i)]);return{baseFeeInNanoAvax:d,unsignedTx:c.exportTx({amountInNanoAvax:y,baseFeeInNanoAvax:d,context:n,destinationChainAlias:r,fromAddress:s,nonce:BigInt(u),sourceChainAlias:_,toAddress:v})}}case`P`:{if(r===`P`)throw new t.InvalidParamsError(`Source and destination chain aliases must be different.`);let[e,a,s,l]=await Promise.all([u.getWalletChangeAddress({chainAlias:_,getWalletChangeAddressForChainAlias:p}),o.getFeeState(i),u.getWalletFromAddresses({chainAlias:_,getWalletAddressesForChainAlias:f,requiredAddress:g}),d(`P`)]);return{baseFeeInNanoAvax:a.price,unsignedTx:c.exportTx({amountInNanoAvax:y,changeAddress:e,context:n,destinationChainAlias:r,feeState:a,fromAddresses:s,sourceChainAlias:_,toAddress:v,utxos:l.getUTXOs()})}}case`X`:{if(r===`X`)throw new t.InvalidParamsError(`Source and destination chain aliases must be different.`);let[e,i,a]=await Promise.all([u.getWalletChangeAddress({chainAlias:_,getWalletChangeAddressForChainAlias:p}),u.getWalletFromAddresses({chainAlias:_,getWalletAddressesForChainAlias:f,requiredAddress:g}),d(`X`)]);return{baseFeeInNanoAvax:n.baseTxFee,unsignedTx:c.exportTx({amountInNanoAvax:y,changeAddress:e,context:n,destinationChainAlias:r,fromAddresses:i,sourceChainAlias:_,toAddress:v,utxos:a.getUTXOs()})}}}}async function g({ajsContext:e,atomicUtxos:n,destinationChainAlias:r,environment:i,getWalletAddressesForChainAlias:a,getWalletChangeAddressForChainAlias:s,requiredFromAddress:d,sourceChainAlias:f,toAddress:p}){switch(r){case`C`:{if(f===`C`)throw new t.InvalidParamsError(`Source and destination chain aliases must be different.`);let[o,s]=await Promise.all([l.getCChainBaseFeeInNanoAvax(i),u.getWalletFromAddresses({chainAlias:r,getWalletAddressesForChainAlias:a,requiredAddress:d})]);return{baseFeeInNanoAvax:o,unsignedTx:c.importTx({atomicUtxos:n,baseFeeInNanoAvax:o,context:e,destinationChainAlias:r,fromAddresses:s,sourceChainAlias:f,toAddress:u.getImportToAddress(p,`C`)})}}case`P`:{if(f===`P`)throw new t.InvalidParamsError(`Source and destination chain aliases must be different.`);let[s,l]=await Promise.all([o.getFeeState(i),u.getWalletFromAddresses({chainAlias:r,getWalletAddressesForChainAlias:a,requiredAddress:d})]);return{baseFeeInNanoAvax:s.price,unsignedTx:c.importTx({atomicUtxos:n,context:e,destinationChainAlias:r,feeState:s,fromAddresses:l,sourceChainAlias:f,toAddress:u.getImportToAddress(p,`P`)})}}case`X`:{if(f===`X`)throw new t.InvalidParamsError(`Source and destination chain aliases must be different.`);let[i,o]=await Promise.all([u.getWalletChangeAddress({chainAlias:r,getWalletChangeAddressForChainAlias:s}),u.getWalletFromAddresses({chainAlias:r,getWalletAddressesForChainAlias:a,requiredAddress:d})]);return{baseFeeInNanoAvax:e.baseTxFee,unsignedTx:c.importTx({atomicUtxos:n,changeAddress:i,context:e,destinationChainAlias:r,fromAddresses:o,sourceChainAlias:f,toAddress:u.getImportToAddress(p,`X`)})}}}}exports.transferAssetFactory=d;
2
2
  //# sourceMappingURL=transfer-asset.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"transfer-asset.cjs","names":["ServiceType","SdkError","ErrorReason","ErrorCode","getEnvironmentIsTestnet","getChainAlias","getExportFromAddressEvm","assertXpAddress","getExportToAddress","getImportToAddress","TransferSignatureReason","tryOrThrow","pollPrimaryNetworkTxStatus","sourcePendingTransferFromQuote","InvalidParamsError","getEvmClientForChain","Environment","AVALANCHE_FUJI_CHAIN","AVALANCHE_MAINNET_CHAIN","getCChainBaseFeeInNanoAvax","exportTx","getWalletChangeAddress","getFeeState","getWalletFromAddresses","importTx"],"sources":["../../../../src/transfer-service/avalanche-cct/_handlers/transfer-asset.ts"],"sourcesContent":["import type { Context, Utxo } from '@avalabs/avalanchejs';\nimport type { Address as EvmAddress } from 'viem';\nimport {\n AVALANCHE_FUJI_CHAIN,\n AVALANCHE_MAINNET_CHAIN,\n Environment,\n ServiceType,\n TransferSignatureReason,\n type AvalancheBlockchainAlias,\n} from '../../../constants';\nimport { ErrorCode, ErrorReason, InvalidParamsError, SdkError } from '../../../errors';\nimport { sourcePendingTransferFromQuote } from '../../_transfer-utilities';\nimport { getEvmClientForChain } from '../../_utils';\nimport type { AvalancheSendTxFunction, TransferService } from '../../../types/service';\nimport type { FailedTransfer, TargetPendingTransfer, TransferBase } from '../../../types/transfer';\nimport { getFeeState } from '../_utils/p-chain';\nimport { pollPrimaryNetworkTxStatus } from '../_utils/polling';\nimport { exportTx, importTx } from '../_utils/transactions';\nimport type {\n GetAtomicUtxosCallback,\n GetCoreEthAddressCallback,\n GetUtxosCallback,\n GetWalletAddressesForChainAliasCallback,\n GetWalletChangeAddressForChainAliasCallback,\n XpAddress,\n} from '../types';\nimport { getChainAlias, getEnvironmentIsTestnet, tryOrThrow } from '../_utils';\nimport { getCChainBaseFeeInNanoAvax } from '../_utils/fees';\nimport {\n assertXpAddress,\n getExportFromAddressEvm,\n getExportToAddress,\n getImportToAddress,\n getWalletChangeAddress,\n getWalletFromAddresses,\n} from '../_utils/addresses';\n\nexport interface TransferAssetFactoryOptions {\n ajsContext: Context.Context;\n avalancheSendTx: AvalancheSendTxFunction;\n environment: Environment;\n getCoreEthAddress: GetCoreEthAddressCallback;\n getAtomicUtxos: GetAtomicUtxosCallback;\n getUtxos: GetUtxosCallback;\n getWalletAddressesForChainAlias: GetWalletAddressesForChainAliasCallback;\n getWalletChangeAddressForChainAlias: GetWalletChangeAddressForChainAliasCallback;\n}\n\nexport function transferAssetFactory({\n ajsContext,\n avalancheSendTx,\n environment,\n getCoreEthAddress,\n getAtomicUtxos,\n getUtxos,\n getWalletAddressesForChainAlias,\n getWalletChangeAddressForChainAlias,\n}: TransferAssetFactoryOptions): TransferService['transferAsset'] {\n return async ({ onStepChange, quote }) => {\n if (quote.serviceType !== ServiceType.AVALANCHE_CCT) {\n throw new SdkError(ErrorReason.INCORRECT_PROVIDER_PROVIDED, ErrorCode.INVALID_PARAMS);\n }\n\n const isTestnet = getEnvironmentIsTestnet(environment);\n const sourceChainAlias: AvalancheBlockchainAlias = getChainAlias(quote.sourceChain.chainId, isTestnet);\n const destinationChainAlias: AvalancheBlockchainAlias = getChainAlias(quote.targetChain.chainId, isTestnet);\n const exportFromAddressEvm = getExportFromAddressEvm(quote.fromAddress, sourceChainAlias);\n const exportRequiredFromAddress = sourceChainAlias === 'C' ? undefined : assertXpAddress(quote.fromAddress);\n const exportToAddress = await getExportToAddress({\n destinationChainAlias,\n getCoreEthAddress,\n quoteToAddress: quote.toAddress,\n });\n const importToAddress = getImportToAddress(quote.toAddress, destinationChainAlias);\n const importRequiredFromAddress =\n destinationChainAlias === 'C' ? exportToAddress : assertXpAddress(quote.toAddress);\n\n const hasExport = quote.amountIn > 0n;\n const requiredSignatures = hasExport ? 2 : 1;\n const startedAtMs = Date.now();\n const transferBase = getTransferBase(quote, environment);\n\n let exportTxId: string | undefined;\n\n if (hasExport) {\n onStepChange?.({\n currentSignature: 1,\n currentSignatureReason: TransferSignatureReason.AvalancheCrossChainExport,\n quote,\n requiredSignatures,\n });\n\n const unsignedExportTx = await tryOrThrow(\n () =>\n buildExportTx({\n ajsContext,\n environment,\n getUtxos,\n getWalletAddressesForChainAlias,\n getWalletChangeAddressForChainAlias,\n quoteAmountIn: quote.amountIn,\n sourceChainAlias,\n destinationChainAlias,\n fromAddress: exportFromAddressEvm,\n requiredFromAddress: exportRequiredFromAddress,\n toAddress: exportToAddress,\n }),\n (error) => new SdkError('Failed to build Avalanche export transaction.', ErrorCode.UNKNOWN, { cause: error }),\n );\n\n exportTxId = await tryOrThrow(\n () => avalancheSendTx(unsignedExportTx, 'export', sourceChainAlias),\n (error) =>\n new SdkError('Failed to sign/send Avalanche export transaction.', ErrorCode.SIGNING_FAILED, {\n cause: error,\n }),\n );\n\n let didExportSucceed: boolean;\n try {\n didExportSucceed = await pollPrimaryNetworkTxStatus({\n chainAlias: sourceChainAlias,\n environment,\n txId: exportTxId,\n });\n } catch {\n return sourcePendingTransferFromQuote(quote, {\n environment,\n requiredConfirmationCount: 1,\n startedAtMs,\n txHash: exportTxId,\n });\n }\n\n if (!didExportSucceed) {\n return buildFailedTransfer({\n errorCode: ErrorCode.TRANSACTION_REVERTED,\n errorReason: 'Export transaction was not accepted by Avalanche.',\n sourceStartedAtMs: startedAtMs,\n sourceTxHash: exportTxId,\n transferBase,\n });\n }\n }\n\n const atomicUtxos = await tryOrThrow(\n async () => (await getAtomicUtxos(destinationChainAlias, sourceChainAlias)).getUTXOs(),\n (error) => new SdkError('Failed to fetch Avalanche atomic UTXOs.', ErrorCode.UNKNOWN, { cause: error }),\n );\n\n if (atomicUtxos.length === 0) {\n return buildFailedTransfer({\n errorCode: ErrorCode.INVALID_PARAMS,\n errorReason: 'No atomic UTXOs available to import for this route.',\n sourceStartedAtMs: startedAtMs,\n sourceTxHash: exportTxId,\n transferBase,\n });\n }\n\n onStepChange?.({\n currentSignature: hasExport ? 2 : 1,\n currentSignatureReason: TransferSignatureReason.AvalancheCrossChainImport,\n quote,\n requiredSignatures,\n });\n\n const unsignedImportTx = await tryOrThrow(\n () =>\n buildImportTx({\n ajsContext,\n atomicUtxos,\n destinationChainAlias,\n environment,\n getWalletAddressesForChainAlias,\n getWalletChangeAddressForChainAlias,\n sourceChainAlias,\n requiredFromAddress: importRequiredFromAddress,\n toAddress: importToAddress,\n }),\n (error) => new SdkError('Failed to build Avalanche import transaction.', ErrorCode.UNKNOWN, { cause: error }),\n );\n\n const importTxId = await tryOrThrow(\n () => avalancheSendTx(unsignedImportTx, 'import', destinationChainAlias),\n (error) =>\n new SdkError('Failed to sign/send Avalanche import transaction.', ErrorCode.SIGNING_FAILED, {\n cause: error,\n }),\n );\n\n return {\n ...transferBase,\n source: {\n confirmationCount: exportTxId ? 1 : 0,\n requiredConfirmationCount: 1,\n startedAtMs,\n txHash: exportTxId ?? importTxId,\n },\n status: 'target-pending',\n target: {\n confirmationCount: 0,\n requiredConfirmationCount: 1,\n startedAtMs: Date.now(),\n txHash: importTxId,\n },\n } satisfies TargetPendingTransfer;\n };\n}\n\nfunction getTransferBase(\n quote: Parameters<TransferService['transferAsset']>[0]['quote'],\n environment: Environment,\n): Omit<TransferBase, 'status'> {\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 targetAsset: quote.assetOut,\n targetChain: quote.targetChain,\n toAddress: quote.toAddress,\n type: quote.serviceType,\n };\n}\n\nfunction buildFailedTransfer({\n errorCode,\n errorReason,\n sourceStartedAtMs,\n sourceTxHash,\n transferBase,\n}: {\n errorCode: ErrorCode;\n errorReason: string;\n sourceStartedAtMs: number;\n sourceTxHash?: string;\n transferBase: Omit<TransferBase, 'status'>;\n}): FailedTransfer {\n return {\n ...transferBase,\n errorCode,\n errorReason,\n failedAtMs: Date.now(),\n ...(sourceTxHash\n ? {\n source: {\n confirmationCount: 0,\n requiredConfirmationCount: 1,\n startedAtMs: sourceStartedAtMs,\n txHash: sourceTxHash,\n },\n }\n : {}),\n status: 'failed',\n };\n}\n\nasync function buildExportTx({\n ajsContext,\n destinationChainAlias,\n environment,\n fromAddress,\n getUtxos,\n getWalletAddressesForChainAlias,\n getWalletChangeAddressForChainAlias,\n quoteAmountIn,\n requiredFromAddress,\n sourceChainAlias,\n toAddress,\n}: {\n ajsContext: Context.Context;\n destinationChainAlias: AvalancheBlockchainAlias;\n environment: Environment;\n fromAddress: EvmAddress | null;\n getUtxos: GetUtxosCallback;\n getWalletAddressesForChainAlias: GetWalletAddressesForChainAliasCallback;\n getWalletChangeAddressForChainAlias: GetWalletChangeAddressForChainAliasCallback;\n quoteAmountIn: bigint;\n requiredFromAddress?: XpAddress;\n sourceChainAlias: AvalancheBlockchainAlias;\n toAddress: XpAddress;\n}) {\n switch (sourceChainAlias) {\n case 'C': {\n if (destinationChainAlias === 'C') {\n throw new InvalidParamsError('Source and destination chain aliases must be different.');\n }\n\n if (!fromAddress) {\n throw new InvalidParamsError('fromAddress must be an EVM address when exporting from C-Chain.');\n }\n\n const cChain = environment === Environment.TEST ? AVALANCHE_FUJI_CHAIN : AVALANCHE_MAINNET_CHAIN;\n const cChainClient = getEvmClientForChain({ chain: cChain });\n const [nonce, baseFeeInNanoAvax] = await Promise.all([\n cChainClient.getTransactionCount({\n address: fromAddress,\n }),\n getCChainBaseFeeInNanoAvax(environment),\n ]);\n\n return exportTx({\n amountInNanoAvax: quoteAmountIn,\n baseFeeInNanoAvax,\n context: ajsContext,\n destinationChainAlias,\n fromAddress,\n nonce: BigInt(nonce),\n sourceChainAlias,\n toAddress,\n });\n }\n\n case 'P': {\n if (destinationChainAlias === 'P') {\n throw new InvalidParamsError('Source and destination chain aliases must be different.');\n }\n\n const [changeAddress, feeState, fromAddresses, pUtxoSet] = await Promise.all([\n getWalletChangeAddress({\n chainAlias: sourceChainAlias,\n getWalletChangeAddressForChainAlias,\n }),\n getFeeState(environment),\n getWalletFromAddresses({\n chainAlias: sourceChainAlias,\n getWalletAddressesForChainAlias,\n requiredAddress: requiredFromAddress,\n }),\n getUtxos('P'),\n ]);\n\n return exportTx({\n amountInNanoAvax: quoteAmountIn,\n changeAddress,\n context: ajsContext,\n destinationChainAlias,\n feeState,\n fromAddresses,\n sourceChainAlias,\n toAddress,\n utxos: pUtxoSet.getUTXOs(),\n });\n }\n\n case 'X': {\n if (destinationChainAlias === 'X') {\n throw new InvalidParamsError('Source and destination chain aliases must be different.');\n }\n\n const [changeAddress, fromAddresses, xUtxoSet] = await Promise.all([\n getWalletChangeAddress({\n chainAlias: sourceChainAlias,\n getWalletChangeAddressForChainAlias,\n }),\n getWalletFromAddresses({\n chainAlias: sourceChainAlias,\n getWalletAddressesForChainAlias,\n requiredAddress: requiredFromAddress,\n }),\n getUtxos('X'),\n ]);\n\n return exportTx({\n amountInNanoAvax: quoteAmountIn,\n changeAddress,\n context: ajsContext,\n destinationChainAlias,\n fromAddresses,\n sourceChainAlias,\n toAddress,\n utxos: xUtxoSet.getUTXOs(),\n });\n }\n }\n}\n\nasync function buildImportTx({\n ajsContext,\n atomicUtxos,\n destinationChainAlias,\n environment,\n getWalletAddressesForChainAlias,\n getWalletChangeAddressForChainAlias,\n requiredFromAddress,\n sourceChainAlias,\n toAddress,\n}: {\n ajsContext: Context.Context;\n atomicUtxos: Utxo[];\n destinationChainAlias: AvalancheBlockchainAlias;\n environment: Environment;\n getWalletAddressesForChainAlias: GetWalletAddressesForChainAliasCallback;\n getWalletChangeAddressForChainAlias: GetWalletChangeAddressForChainAliasCallback;\n requiredFromAddress: XpAddress;\n sourceChainAlias: AvalancheBlockchainAlias;\n toAddress: string;\n}) {\n switch (destinationChainAlias) {\n case 'C': {\n if (sourceChainAlias === 'C') {\n throw new InvalidParamsError('Source and destination chain aliases must be different.');\n }\n\n const [baseFeeInNanoAvax, fromAddresses] = await Promise.all([\n getCChainBaseFeeInNanoAvax(environment),\n getWalletFromAddresses({\n chainAlias: destinationChainAlias,\n getWalletAddressesForChainAlias,\n requiredAddress: requiredFromAddress,\n }),\n ]);\n\n return importTx({\n atomicUtxos,\n baseFeeInNanoAvax,\n context: ajsContext,\n destinationChainAlias,\n fromAddresses,\n sourceChainAlias,\n toAddress: getImportToAddress(toAddress, 'C'),\n });\n }\n\n case 'P': {\n if (sourceChainAlias === 'P') {\n throw new InvalidParamsError('Source and destination chain aliases must be different.');\n }\n\n const [feeState, fromAddresses] = await Promise.all([\n getFeeState(environment),\n getWalletFromAddresses({\n chainAlias: destinationChainAlias,\n getWalletAddressesForChainAlias,\n requiredAddress: requiredFromAddress,\n }),\n ]);\n\n return importTx({\n atomicUtxos,\n context: ajsContext,\n destinationChainAlias,\n feeState,\n fromAddresses,\n sourceChainAlias,\n toAddress: getImportToAddress(toAddress, 'P'),\n });\n }\n\n case 'X': {\n if (sourceChainAlias === 'X') {\n throw new InvalidParamsError('Source and destination chain aliases must be different.');\n }\n\n const [changeAddress, fromAddresses] = await Promise.all([\n getWalletChangeAddress({\n chainAlias: destinationChainAlias,\n getWalletChangeAddressForChainAlias,\n }),\n getWalletFromAddresses({\n chainAlias: destinationChainAlias,\n getWalletAddressesForChainAlias,\n requiredAddress: requiredFromAddress,\n }),\n ]);\n\n return importTx({\n atomicUtxos,\n changeAddress,\n context: ajsContext,\n destinationChainAlias,\n fromAddresses,\n sourceChainAlias,\n toAddress: getImportToAddress(toAddress, 'X'),\n });\n }\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"transfer-asset.cjs","names":["ServiceType","SdkError","ErrorReason","ErrorCode","getEnvironmentIsTestnet","getChainAlias","getExportFromAddressEvm","assertXpAddress","getExportToAddress","getImportToAddress","TransferSignatureReason","tryOrThrow","pollPrimaryNetworkTxStatus","sourcePendingTransferFromQuote","WEI_PER_NANO_AVAX_BIGINT","InvalidParamsError","getEvmClientForChain","Environment","AVALANCHE_FUJI_CHAIN","AVALANCHE_MAINNET_CHAIN","getCChainBaseFeeInNanoAvax","exportTx","getWalletChangeAddress","getFeeState","getWalletFromAddresses","importTx"],"sources":["../../../../src/transfer-service/avalanche-cct/_handlers/transfer-asset.ts"],"sourcesContent":["import type { Context, Utxo } from '@avalabs/avalanchejs';\nimport type { Address as EvmAddress } from 'viem';\nimport {\n AVALANCHE_FUJI_CHAIN,\n AVALANCHE_MAINNET_CHAIN,\n Environment,\n ServiceType,\n TransferSignatureReason,\n type AvalancheBlockchainAlias,\n} from '../../../constants';\nimport { ErrorCode, ErrorReason, InvalidParamsError, SdkError } from '../../../errors';\nimport { sourcePendingTransferFromQuote } from '../../_transfer-utilities';\nimport { getEvmClientForChain } from '../../_utils';\nimport type { AvalancheSendTxFunction, TransferService } from '../../../types/service';\nimport type { FailedTransfer, TargetPendingTransfer, TransferBase } from '../../../types/transfer';\nimport { getFeeState } from '../_utils/p-chain';\nimport { pollPrimaryNetworkTxStatus } from '../_utils/polling';\nimport { exportTx, importTx } from '../_utils/transactions';\nimport type {\n GetAtomicUtxosCallback,\n GetCoreEthAddressCallback,\n GetUtxosCallback,\n GetWalletAddressesForChainAliasCallback,\n GetWalletChangeAddressForChainAliasCallback,\n XpAddress,\n} from '../types';\nimport { getChainAlias, getEnvironmentIsTestnet, tryOrThrow } from '../_utils';\nimport { getCChainBaseFeeInNanoAvax } from '../_utils/fees';\nimport { WEI_PER_NANO_AVAX_BIGINT } from '../constants';\nimport {\n assertXpAddress,\n getExportFromAddressEvm,\n getExportToAddress,\n getImportToAddress,\n getWalletChangeAddress,\n getWalletFromAddresses,\n} from '../_utils/addresses';\n\ntype BuiltTx = {\n baseFeeInNanoAvax: bigint;\n unsignedTx: Parameters<AvalancheSendTxFunction>[0]['unsignedTx'];\n};\n\nexport interface TransferAssetFactoryOptions {\n ajsContext: Context.Context;\n avalancheSendTx: AvalancheSendTxFunction;\n environment: Environment;\n getCoreEthAddress: GetCoreEthAddressCallback;\n getAtomicUtxos: GetAtomicUtxosCallback;\n getUtxos: GetUtxosCallback;\n getWalletAddressesForChainAlias: GetWalletAddressesForChainAliasCallback;\n getWalletChangeAddressForChainAlias: GetWalletChangeAddressForChainAliasCallback;\n}\n\nexport function transferAssetFactory({\n ajsContext,\n avalancheSendTx,\n environment,\n getCoreEthAddress,\n getAtomicUtxos,\n getUtxos,\n getWalletAddressesForChainAlias,\n getWalletChangeAddressForChainAlias,\n}: TransferAssetFactoryOptions): TransferService['transferAsset'] {\n return async ({ onStepChange, quote }) => {\n if (quote.serviceType !== ServiceType.AVALANCHE_CCT) {\n throw new SdkError(ErrorReason.INCORRECT_PROVIDER_PROVIDED, ErrorCode.INVALID_PARAMS);\n }\n\n const isTestnet = getEnvironmentIsTestnet(environment);\n const sourceChainAlias: AvalancheBlockchainAlias = getChainAlias(quote.sourceChain.chainId, isTestnet);\n const destinationChainAlias: AvalancheBlockchainAlias = getChainAlias(quote.targetChain.chainId, isTestnet);\n const exportFromAddressEvm = getExportFromAddressEvm(quote.fromAddress, sourceChainAlias);\n const exportRequiredFromAddress = sourceChainAlias === 'C' ? undefined : assertXpAddress(quote.fromAddress);\n const exportToAddress = await getExportToAddress({\n destinationChainAlias,\n getCoreEthAddress,\n quoteToAddress: quote.toAddress,\n });\n const importToAddress = getImportToAddress(quote.toAddress, destinationChainAlias);\n const importRequiredFromAddress =\n destinationChainAlias === 'C' ? exportToAddress : assertXpAddress(quote.toAddress);\n\n const hasExport = quote.amountIn > 0n;\n const requiredSignatures = hasExport ? 2 : 1;\n const startedAtMs = Date.now();\n const transferBase = getTransferBase(quote, environment);\n\n let exportTxId: string | undefined;\n\n if (hasExport) {\n onStepChange?.({\n currentSignature: 1,\n currentSignatureReason: TransferSignatureReason.AvalancheCrossChainExport,\n quote,\n requiredSignatures,\n });\n\n const builtExportTx = await tryOrThrow(\n () =>\n buildExportTx({\n ajsContext,\n environment,\n getUtxos,\n getWalletAddressesForChainAlias,\n getWalletChangeAddressForChainAlias,\n quoteAmountIn: quote.amountIn,\n sourceChainAlias,\n destinationChainAlias,\n fromAddress: exportFromAddressEvm,\n requiredFromAddress: exportRequiredFromAddress,\n toAddress: exportToAddress,\n }),\n (error) => new SdkError('Failed to build Avalanche export transaction.', ErrorCode.UNKNOWN, { cause: error }),\n );\n\n exportTxId = await tryOrThrow(\n () =>\n avalancheSendTx({\n baseFeeInNanoAvax: builtExportTx.baseFeeInNanoAvax,\n chainAlias: sourceChainAlias,\n txType: 'export',\n unsignedTx: builtExportTx.unsignedTx,\n }),\n (error) =>\n new SdkError('Failed to sign/send Avalanche export transaction.', ErrorCode.SIGNING_FAILED, {\n cause: error,\n }),\n );\n\n let didExportSucceed: boolean;\n try {\n didExportSucceed = await pollPrimaryNetworkTxStatus({\n chainAlias: sourceChainAlias,\n environment,\n txId: exportTxId,\n });\n } catch {\n return sourcePendingTransferFromQuote(quote, {\n environment,\n requiredConfirmationCount: 1,\n startedAtMs,\n txHash: exportTxId,\n });\n }\n\n if (!didExportSucceed) {\n return buildFailedTransfer({\n errorCode: ErrorCode.TRANSACTION_REVERTED,\n errorReason: 'Export transaction was not accepted by Avalanche.',\n sourceStartedAtMs: startedAtMs,\n sourceTxHash: exportTxId,\n transferBase,\n });\n }\n }\n\n const atomicUtxos = await tryOrThrow(\n async () => (await getAtomicUtxos(destinationChainAlias, sourceChainAlias)).getUTXOs(),\n (error) => new SdkError('Failed to fetch Avalanche atomic UTXOs.', ErrorCode.UNKNOWN, { cause: error }),\n );\n\n if (atomicUtxos.length === 0) {\n return buildFailedTransfer({\n errorCode: ErrorCode.INVALID_PARAMS,\n errorReason: 'No atomic UTXOs available to import for this route.',\n sourceStartedAtMs: startedAtMs,\n sourceTxHash: exportTxId,\n transferBase,\n });\n }\n\n onStepChange?.({\n currentSignature: hasExport ? 2 : 1,\n currentSignatureReason: TransferSignatureReason.AvalancheCrossChainImport,\n quote,\n requiredSignatures,\n });\n\n const builtImportTx = await tryOrThrow(\n () =>\n buildImportTx({\n ajsContext,\n atomicUtxos,\n destinationChainAlias,\n environment,\n getWalletAddressesForChainAlias,\n getWalletChangeAddressForChainAlias,\n sourceChainAlias,\n requiredFromAddress: importRequiredFromAddress,\n toAddress: importToAddress,\n }),\n (error) => new SdkError('Failed to build Avalanche import transaction.', ErrorCode.UNKNOWN, { cause: error }),\n );\n\n const importTxId = await tryOrThrow(\n () =>\n avalancheSendTx({\n baseFeeInNanoAvax: builtImportTx.baseFeeInNanoAvax,\n chainAlias: destinationChainAlias,\n txType: 'import',\n unsignedTx: builtImportTx.unsignedTx,\n }),\n (error) =>\n new SdkError('Failed to sign/send Avalanche import transaction.', ErrorCode.SIGNING_FAILED, {\n cause: error,\n }),\n );\n\n return {\n ...transferBase,\n source: {\n confirmationCount: exportTxId ? 1 : 0,\n requiredConfirmationCount: 1,\n startedAtMs,\n txHash: exportTxId ?? importTxId,\n },\n status: 'target-pending',\n target: {\n confirmationCount: 0,\n requiredConfirmationCount: 1,\n startedAtMs: Date.now(),\n txHash: importTxId,\n },\n } satisfies TargetPendingTransfer;\n };\n}\n\nfunction getTransferBase(\n quote: Parameters<TransferService['transferAsset']>[0]['quote'],\n environment: Environment,\n): Omit<TransferBase, 'status'> {\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 targetAsset: quote.assetOut,\n targetChain: quote.targetChain,\n toAddress: quote.toAddress,\n type: quote.serviceType,\n };\n}\n\nfunction buildFailedTransfer({\n errorCode,\n errorReason,\n sourceStartedAtMs,\n sourceTxHash,\n transferBase,\n}: {\n errorCode: ErrorCode;\n errorReason: string;\n sourceStartedAtMs: number;\n sourceTxHash?: string;\n transferBase: Omit<TransferBase, 'status'>;\n}): FailedTransfer {\n return {\n ...transferBase,\n errorCode,\n errorReason,\n failedAtMs: Date.now(),\n ...(sourceTxHash\n ? {\n source: {\n confirmationCount: 0,\n requiredConfirmationCount: 1,\n startedAtMs: sourceStartedAtMs,\n txHash: sourceTxHash,\n },\n }\n : {}),\n status: 'failed',\n };\n}\n\nfunction getExportAmountInNanoAvax(sourceChainAlias: AvalancheBlockchainAlias, quoteAmountIn: bigint): bigint {\n return sourceChainAlias === 'C' ? quoteAmountIn / WEI_PER_NANO_AVAX_BIGINT : quoteAmountIn;\n}\n\nasync function buildExportTx({\n ajsContext,\n destinationChainAlias,\n environment,\n fromAddress,\n getUtxos,\n getWalletAddressesForChainAlias,\n getWalletChangeAddressForChainAlias,\n quoteAmountIn,\n requiredFromAddress,\n sourceChainAlias,\n toAddress,\n}: {\n ajsContext: Context.Context;\n destinationChainAlias: AvalancheBlockchainAlias;\n environment: Environment;\n fromAddress: EvmAddress | null;\n getUtxos: GetUtxosCallback;\n getWalletAddressesForChainAlias: GetWalletAddressesForChainAliasCallback;\n getWalletChangeAddressForChainAlias: GetWalletChangeAddressForChainAliasCallback;\n quoteAmountIn: bigint;\n requiredFromAddress?: XpAddress;\n sourceChainAlias: AvalancheBlockchainAlias;\n toAddress: XpAddress;\n}): Promise<BuiltTx> {\n const amountInNanoAvax = getExportAmountInNanoAvax(sourceChainAlias, quoteAmountIn);\n\n switch (sourceChainAlias) {\n case 'C': {\n if (destinationChainAlias === 'C') {\n throw new InvalidParamsError('Source and destination chain aliases must be different.');\n }\n\n if (!fromAddress) {\n throw new InvalidParamsError('fromAddress must be an EVM address when exporting from C-Chain.');\n }\n\n const cChain = environment === Environment.TEST ? AVALANCHE_FUJI_CHAIN : AVALANCHE_MAINNET_CHAIN;\n const cChainClient = getEvmClientForChain({ chain: cChain });\n const [nonce, baseFeeInNanoAvax] = await Promise.all([\n cChainClient.getTransactionCount({\n address: fromAddress,\n }),\n getCChainBaseFeeInNanoAvax(environment),\n ]);\n\n return {\n baseFeeInNanoAvax,\n unsignedTx: exportTx({\n amountInNanoAvax,\n baseFeeInNanoAvax,\n context: ajsContext,\n destinationChainAlias,\n fromAddress,\n nonce: BigInt(nonce),\n sourceChainAlias,\n toAddress,\n }),\n };\n }\n\n case 'P': {\n if (destinationChainAlias === 'P') {\n throw new InvalidParamsError('Source and destination chain aliases must be different.');\n }\n\n const [changeAddress, feeState, fromAddresses, pUtxoSet] = await Promise.all([\n getWalletChangeAddress({\n chainAlias: sourceChainAlias,\n getWalletChangeAddressForChainAlias,\n }),\n getFeeState(environment),\n getWalletFromAddresses({\n chainAlias: sourceChainAlias,\n getWalletAddressesForChainAlias,\n requiredAddress: requiredFromAddress,\n }),\n getUtxos('P'),\n ]);\n\n return {\n baseFeeInNanoAvax: feeState.price,\n unsignedTx: exportTx({\n amountInNanoAvax,\n changeAddress,\n context: ajsContext,\n destinationChainAlias,\n feeState,\n fromAddresses,\n sourceChainAlias,\n toAddress,\n utxos: pUtxoSet.getUTXOs(),\n }),\n };\n }\n\n case 'X': {\n if (destinationChainAlias === 'X') {\n throw new InvalidParamsError('Source and destination chain aliases must be different.');\n }\n\n const [changeAddress, fromAddresses, xUtxoSet] = await Promise.all([\n getWalletChangeAddress({\n chainAlias: sourceChainAlias,\n getWalletChangeAddressForChainAlias,\n }),\n getWalletFromAddresses({\n chainAlias: sourceChainAlias,\n getWalletAddressesForChainAlias,\n requiredAddress: requiredFromAddress,\n }),\n getUtxos('X'),\n ]);\n\n return {\n baseFeeInNanoAvax: ajsContext.baseTxFee,\n unsignedTx: exportTx({\n amountInNanoAvax,\n changeAddress,\n context: ajsContext,\n destinationChainAlias,\n fromAddresses,\n sourceChainAlias,\n toAddress,\n utxos: xUtxoSet.getUTXOs(),\n }),\n };\n }\n }\n}\n\nasync function buildImportTx({\n ajsContext,\n atomicUtxos,\n destinationChainAlias,\n environment,\n getWalletAddressesForChainAlias,\n getWalletChangeAddressForChainAlias,\n requiredFromAddress,\n sourceChainAlias,\n toAddress,\n}: {\n ajsContext: Context.Context;\n atomicUtxos: Utxo[];\n destinationChainAlias: AvalancheBlockchainAlias;\n environment: Environment;\n getWalletAddressesForChainAlias: GetWalletAddressesForChainAliasCallback;\n getWalletChangeAddressForChainAlias: GetWalletChangeAddressForChainAliasCallback;\n requiredFromAddress: XpAddress;\n sourceChainAlias: AvalancheBlockchainAlias;\n toAddress: string;\n}): Promise<BuiltTx> {\n switch (destinationChainAlias) {\n case 'C': {\n if (sourceChainAlias === 'C') {\n throw new InvalidParamsError('Source and destination chain aliases must be different.');\n }\n\n const [baseFeeInNanoAvax, fromAddresses] = await Promise.all([\n getCChainBaseFeeInNanoAvax(environment),\n getWalletFromAddresses({\n chainAlias: destinationChainAlias,\n getWalletAddressesForChainAlias,\n requiredAddress: requiredFromAddress,\n }),\n ]);\n\n return {\n baseFeeInNanoAvax,\n unsignedTx: importTx({\n atomicUtxos,\n baseFeeInNanoAvax,\n context: ajsContext,\n destinationChainAlias,\n fromAddresses,\n sourceChainAlias,\n toAddress: getImportToAddress(toAddress, 'C'),\n }),\n };\n }\n\n case 'P': {\n if (sourceChainAlias === 'P') {\n throw new InvalidParamsError('Source and destination chain aliases must be different.');\n }\n\n const [feeState, fromAddresses] = await Promise.all([\n getFeeState(environment),\n getWalletFromAddresses({\n chainAlias: destinationChainAlias,\n getWalletAddressesForChainAlias,\n requiredAddress: requiredFromAddress,\n }),\n ]);\n\n return {\n baseFeeInNanoAvax: feeState.price,\n unsignedTx: importTx({\n atomicUtxos,\n context: ajsContext,\n destinationChainAlias,\n feeState,\n fromAddresses,\n sourceChainAlias,\n toAddress: getImportToAddress(toAddress, 'P'),\n }),\n };\n }\n\n case 'X': {\n if (sourceChainAlias === 'X') {\n throw new InvalidParamsError('Source and destination chain aliases must be different.');\n }\n\n const [changeAddress, fromAddresses] = await Promise.all([\n getWalletChangeAddress({\n chainAlias: destinationChainAlias,\n getWalletChangeAddressForChainAlias,\n }),\n getWalletFromAddresses({\n chainAlias: destinationChainAlias,\n getWalletAddressesForChainAlias,\n requiredAddress: requiredFromAddress,\n }),\n ]);\n\n return {\n baseFeeInNanoAvax: ajsContext.baseTxFee,\n unsignedTx: importTx({\n atomicUtxos,\n changeAddress,\n context: ajsContext,\n destinationChainAlias,\n fromAddresses,\n sourceChainAlias,\n toAddress: getImportToAddress(toAddress, 'X'),\n }),\n };\n }\n }\n}\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{AVALANCHE_FUJI_CHAIN as e,AVALANCHE_MAINNET_CHAIN as t,Environment as n,ServiceType as r,TransferSignatureReason as i}from"../../../constants.js";import{ErrorCode as a,ErrorReason as o,InvalidParamsError as s,SdkError as c}from"../../../errors.js";import{getChainAlias as l,getEnvironmentIsTestnet as u,tryOrThrow as d}from"../_utils.js";import{sourcePendingTransferFromQuote as f}from"../../_transfer-utilities.js";import{getEvmClientForChain as p}from"../../_utils.js";import{getFeeState as m}from"../_utils/p-chain.js";import{pollPrimaryNetworkTxStatus as h}from"../_utils/polling.js";import{exportTx as g,importTx as _}from"../_utils/transactions.js";import{getCChainBaseFeeInNanoAvax as v}from"../_utils/fees.js";import{assertXpAddress as y,getExportFromAddressEvm as b,getExportToAddress as x,getImportToAddress as S,getWalletChangeAddress as C,getWalletFromAddresses as w}from"../_utils/addresses.js";function T({ajsContext:e,avalancheSendTx:t,environment:n,getCoreEthAddress:s,getAtomicUtxos:p,getUtxos:m,getWalletAddressesForChainAlias:g,getWalletChangeAddressForChainAlias:_}){return async({onStepChange:v,quote:C})=>{if(C.serviceType!==r.AVALANCHE_CCT)throw new c(o.INCORRECT_PROVIDER_PROVIDED,a.INVALID_PARAMS);let w=u(n),T=l(C.sourceChain.chainId,w),A=l(C.targetChain.chainId,w),j=b(C.fromAddress,T),M=T===`C`?void 0:y(C.fromAddress),N=await x({destinationChainAlias:A,getCoreEthAddress:s,quoteToAddress:C.toAddress}),P=S(C.toAddress,A),F=A===`C`?N:y(C.toAddress),I=C.amountIn>0n,L=I?2:1,R=Date.now(),z=E(C,n),B;if(I){v?.({currentSignature:1,currentSignatureReason:i.AvalancheCrossChainExport,quote:C,requiredSignatures:L});let r=await d(()=>O({ajsContext:e,environment:n,getUtxos:m,getWalletAddressesForChainAlias:g,getWalletChangeAddressForChainAlias:_,quoteAmountIn:C.amountIn,sourceChainAlias:T,destinationChainAlias:A,fromAddress:j,requiredFromAddress:M,toAddress:N}),e=>new c(`Failed to build Avalanche export transaction.`,a.UNKNOWN,{cause:e}));B=await d(()=>t(r,`export`,T),e=>new c(`Failed to sign/send Avalanche export transaction.`,a.SIGNING_FAILED,{cause:e}));let o;try{o=await h({chainAlias:T,environment:n,txId:B})}catch{return f(C,{environment:n,requiredConfirmationCount:1,startedAtMs:R,txHash:B})}if(!o)return D({errorCode:a.TRANSACTION_REVERTED,errorReason:`Export transaction was not accepted by Avalanche.`,sourceStartedAtMs:R,sourceTxHash:B,transferBase:z})}let V=await d(async()=>(await p(A,T)).getUTXOs(),e=>new c(`Failed to fetch Avalanche atomic UTXOs.`,a.UNKNOWN,{cause:e}));if(V.length===0)return D({errorCode:a.INVALID_PARAMS,errorReason:`No atomic UTXOs available to import for this route.`,sourceStartedAtMs:R,sourceTxHash:B,transferBase:z});v?.({currentSignature:I?2:1,currentSignatureReason:i.AvalancheCrossChainImport,quote:C,requiredSignatures:L});let H=await d(()=>k({ajsContext:e,atomicUtxos:V,destinationChainAlias:A,environment:n,getWalletAddressesForChainAlias:g,getWalletChangeAddressForChainAlias:_,sourceChainAlias:T,requiredFromAddress:F,toAddress:P}),e=>new c(`Failed to build Avalanche import transaction.`,a.UNKNOWN,{cause:e})),U=await d(()=>t(H,`import`,A),e=>new c(`Failed to sign/send Avalanche import transaction.`,a.SIGNING_FAILED,{cause:e}));return{...z,source:{confirmationCount:B?1:0,requiredConfirmationCount:1,startedAtMs:R,txHash:B??U},status:`target-pending`,target:{confirmationCount:0,requiredConfirmationCount:1,startedAtMs:Date.now(),txHash:U}}}}function E(e,t){return{amountIn:e.amountIn,amountOut:e.amountOut,environment:t,fees:e.fees,fromAddress:e.fromAddress,id:e.id,partnerFeeBps:e.partnerFeeBps,sourceAsset:e.assetIn,sourceChain:e.sourceChain,targetAsset:e.assetOut,targetChain:e.targetChain,toAddress:e.toAddress,type:e.serviceType}}function D({errorCode:e,errorReason:t,sourceStartedAtMs:n,sourceTxHash:r,transferBase:i}){return{...i,errorCode:e,errorReason:t,failedAtMs:Date.now(),...r?{source:{confirmationCount:0,requiredConfirmationCount:1,startedAtMs:n,txHash:r}}:{},status:`failed`}}async function O({ajsContext:r,destinationChainAlias:i,environment:a,fromAddress:o,getUtxos:c,getWalletAddressesForChainAlias:l,getWalletChangeAddressForChainAlias:u,quoteAmountIn:d,requiredFromAddress:f,sourceChainAlias:h,toAddress:_}){switch(h){case`C`:{if(i===`C`)throw new s(`Source and destination chain aliases must be different.`);if(!o)throw new s(`fromAddress must be an EVM address when exporting from C-Chain.`);let c=p({chain:a===n.TEST?e:t}),[l,u]=await Promise.all([c.getTransactionCount({address:o}),v(a)]);return g({amountInNanoAvax:d,baseFeeInNanoAvax:u,context:r,destinationChainAlias:i,fromAddress:o,nonce:BigInt(l),sourceChainAlias:h,toAddress:_})}case`P`:{if(i===`P`)throw new s(`Source and destination chain aliases must be different.`);let[e,t,n,o]=await Promise.all([C({chainAlias:h,getWalletChangeAddressForChainAlias:u}),m(a),w({chainAlias:h,getWalletAddressesForChainAlias:l,requiredAddress:f}),c(`P`)]);return g({amountInNanoAvax:d,changeAddress:e,context:r,destinationChainAlias:i,feeState:t,fromAddresses:n,sourceChainAlias:h,toAddress:_,utxos:o.getUTXOs()})}case`X`:{if(i===`X`)throw new s(`Source and destination chain aliases must be different.`);let[e,t,n]=await Promise.all([C({chainAlias:h,getWalletChangeAddressForChainAlias:u}),w({chainAlias:h,getWalletAddressesForChainAlias:l,requiredAddress:f}),c(`X`)]);return g({amountInNanoAvax:d,changeAddress:e,context:r,destinationChainAlias:i,fromAddresses:t,sourceChainAlias:h,toAddress:_,utxos:n.getUTXOs()})}}}async function k({ajsContext:e,atomicUtxos:t,destinationChainAlias:n,environment:r,getWalletAddressesForChainAlias:i,getWalletChangeAddressForChainAlias:a,requiredFromAddress:o,sourceChainAlias:c,toAddress:l}){switch(n){case`C`:{if(c===`C`)throw new s(`Source and destination chain aliases must be different.`);let[a,u]=await Promise.all([v(r),w({chainAlias:n,getWalletAddressesForChainAlias:i,requiredAddress:o})]);return _({atomicUtxos:t,baseFeeInNanoAvax:a,context:e,destinationChainAlias:n,fromAddresses:u,sourceChainAlias:c,toAddress:S(l,`C`)})}case`P`:{if(c===`P`)throw new s(`Source and destination chain aliases must be different.`);let[a,u]=await Promise.all([m(r),w({chainAlias:n,getWalletAddressesForChainAlias:i,requiredAddress:o})]);return _({atomicUtxos:t,context:e,destinationChainAlias:n,feeState:a,fromAddresses:u,sourceChainAlias:c,toAddress:S(l,`P`)})}case`X`:{if(c===`X`)throw new s(`Source and destination chain aliases must be different.`);let[r,u]=await Promise.all([C({chainAlias:n,getWalletChangeAddressForChainAlias:a}),w({chainAlias:n,getWalletAddressesForChainAlias:i,requiredAddress:o})]);return _({atomicUtxos:t,changeAddress:r,context:e,destinationChainAlias:n,fromAddresses:u,sourceChainAlias:c,toAddress:S(l,`X`)})}}}export{T as transferAssetFactory};
1
+ import{AVALANCHE_FUJI_CHAIN as e,AVALANCHE_MAINNET_CHAIN as t,Environment as n,ServiceType as r,TransferSignatureReason as i}from"../../../constants.js";import{ErrorCode as a,ErrorReason as o,InvalidParamsError as s,SdkError as c}from"../../../errors.js";import{WEI_PER_NANO_AVAX_BIGINT as l}from"../constants.js";import{getChainAlias as u,getEnvironmentIsTestnet as d,tryOrThrow as f}from"../_utils.js";import{sourcePendingTransferFromQuote as p}from"../../_transfer-utilities.js";import{getEvmClientForChain as m}from"../../_utils.js";import{getFeeState as h}from"../_utils/p-chain.js";import{pollPrimaryNetworkTxStatus as g}from"../_utils/polling.js";import{exportTx as _,importTx as v}from"../_utils/transactions.js";import{getCChainBaseFeeInNanoAvax as y}from"../_utils/fees.js";import{assertXpAddress as b,getExportFromAddressEvm as x,getExportToAddress as S,getImportToAddress as C,getWalletChangeAddress as w,getWalletFromAddresses as T}from"../_utils/addresses.js";function E({ajsContext:e,avalancheSendTx:t,environment:n,getCoreEthAddress:s,getAtomicUtxos:l,getUtxos:m,getWalletAddressesForChainAlias:h,getWalletChangeAddressForChainAlias:_}){return async({onStepChange:v,quote:y})=>{if(y.serviceType!==r.AVALANCHE_CCT)throw new c(o.INCORRECT_PROVIDER_PROVIDED,a.INVALID_PARAMS);let w=d(n),T=u(y.sourceChain.chainId,w),E=u(y.targetChain.chainId,w),k=x(y.fromAddress,T),M=T===`C`?void 0:b(y.fromAddress),N=await S({destinationChainAlias:E,getCoreEthAddress:s,quoteToAddress:y.toAddress}),P=C(y.toAddress,E),F=E===`C`?N:b(y.toAddress),I=y.amountIn>0n,L=I?2:1,R=Date.now(),z=D(y,n),B;if(I){v?.({currentSignature:1,currentSignatureReason:i.AvalancheCrossChainExport,quote:y,requiredSignatures:L});let r=await f(()=>A({ajsContext:e,environment:n,getUtxos:m,getWalletAddressesForChainAlias:h,getWalletChangeAddressForChainAlias:_,quoteAmountIn:y.amountIn,sourceChainAlias:T,destinationChainAlias:E,fromAddress:k,requiredFromAddress:M,toAddress:N}),e=>new c(`Failed to build Avalanche export transaction.`,a.UNKNOWN,{cause:e}));B=await f(()=>t({baseFeeInNanoAvax:r.baseFeeInNanoAvax,chainAlias:T,txType:`export`,unsignedTx:r.unsignedTx}),e=>new c(`Failed to sign/send Avalanche export transaction.`,a.SIGNING_FAILED,{cause:e}));let o;try{o=await g({chainAlias:T,environment:n,txId:B})}catch{return p(y,{environment:n,requiredConfirmationCount:1,startedAtMs:R,txHash:B})}if(!o)return O({errorCode:a.TRANSACTION_REVERTED,errorReason:`Export transaction was not accepted by Avalanche.`,sourceStartedAtMs:R,sourceTxHash:B,transferBase:z})}let V=await f(async()=>(await l(E,T)).getUTXOs(),e=>new c(`Failed to fetch Avalanche atomic UTXOs.`,a.UNKNOWN,{cause:e}));if(V.length===0)return O({errorCode:a.INVALID_PARAMS,errorReason:`No atomic UTXOs available to import for this route.`,sourceStartedAtMs:R,sourceTxHash:B,transferBase:z});v?.({currentSignature:I?2:1,currentSignatureReason:i.AvalancheCrossChainImport,quote:y,requiredSignatures:L});let H=await f(()=>j({ajsContext:e,atomicUtxos:V,destinationChainAlias:E,environment:n,getWalletAddressesForChainAlias:h,getWalletChangeAddressForChainAlias:_,sourceChainAlias:T,requiredFromAddress:F,toAddress:P}),e=>new c(`Failed to build Avalanche import transaction.`,a.UNKNOWN,{cause:e})),U=await f(()=>t({baseFeeInNanoAvax:H.baseFeeInNanoAvax,chainAlias:E,txType:`import`,unsignedTx:H.unsignedTx}),e=>new c(`Failed to sign/send Avalanche import transaction.`,a.SIGNING_FAILED,{cause:e}));return{...z,source:{confirmationCount:B?1:0,requiredConfirmationCount:1,startedAtMs:R,txHash:B??U},status:`target-pending`,target:{confirmationCount:0,requiredConfirmationCount:1,startedAtMs:Date.now(),txHash:U}}}}function D(e,t){return{amountIn:e.amountIn,amountOut:e.amountOut,environment:t,fees:e.fees,fromAddress:e.fromAddress,id:e.id,partnerFeeBps:e.partnerFeeBps,sourceAsset:e.assetIn,sourceChain:e.sourceChain,targetAsset:e.assetOut,targetChain:e.targetChain,toAddress:e.toAddress,type:e.serviceType}}function O({errorCode:e,errorReason:t,sourceStartedAtMs:n,sourceTxHash:r,transferBase:i}){return{...i,errorCode:e,errorReason:t,failedAtMs:Date.now(),...r?{source:{confirmationCount:0,requiredConfirmationCount:1,startedAtMs:n,txHash:r}}:{},status:`failed`}}function k(e,t){return e===`C`?t/l:t}async function A({ajsContext:r,destinationChainAlias:i,environment:a,fromAddress:o,getUtxos:c,getWalletAddressesForChainAlias:l,getWalletChangeAddressForChainAlias:u,quoteAmountIn:d,requiredFromAddress:f,sourceChainAlias:p,toAddress:g}){let v=k(p,d);switch(p){case`C`:{if(i===`C`)throw new s(`Source and destination chain aliases must be different.`);if(!o)throw new s(`fromAddress must be an EVM address when exporting from C-Chain.`);let c=m({chain:a===n.TEST?e:t}),[l,u]=await Promise.all([c.getTransactionCount({address:o}),y(a)]);return{baseFeeInNanoAvax:u,unsignedTx:_({amountInNanoAvax:v,baseFeeInNanoAvax:u,context:r,destinationChainAlias:i,fromAddress:o,nonce:BigInt(l),sourceChainAlias:p,toAddress:g})}}case`P`:{if(i===`P`)throw new s(`Source and destination chain aliases must be different.`);let[e,t,n,o]=await Promise.all([w({chainAlias:p,getWalletChangeAddressForChainAlias:u}),h(a),T({chainAlias:p,getWalletAddressesForChainAlias:l,requiredAddress:f}),c(`P`)]);return{baseFeeInNanoAvax:t.price,unsignedTx:_({amountInNanoAvax:v,changeAddress:e,context:r,destinationChainAlias:i,feeState:t,fromAddresses:n,sourceChainAlias:p,toAddress:g,utxos:o.getUTXOs()})}}case`X`:{if(i===`X`)throw new s(`Source and destination chain aliases must be different.`);let[e,t,n]=await Promise.all([w({chainAlias:p,getWalletChangeAddressForChainAlias:u}),T({chainAlias:p,getWalletAddressesForChainAlias:l,requiredAddress:f}),c(`X`)]);return{baseFeeInNanoAvax:r.baseTxFee,unsignedTx:_({amountInNanoAvax:v,changeAddress:e,context:r,destinationChainAlias:i,fromAddresses:t,sourceChainAlias:p,toAddress:g,utxos:n.getUTXOs()})}}}}async function j({ajsContext:e,atomicUtxos:t,destinationChainAlias:n,environment:r,getWalletAddressesForChainAlias:i,getWalletChangeAddressForChainAlias:a,requiredFromAddress:o,sourceChainAlias:c,toAddress:l}){switch(n){case`C`:{if(c===`C`)throw new s(`Source and destination chain aliases must be different.`);let[a,u]=await Promise.all([y(r),T({chainAlias:n,getWalletAddressesForChainAlias:i,requiredAddress:o})]);return{baseFeeInNanoAvax:a,unsignedTx:v({atomicUtxos:t,baseFeeInNanoAvax:a,context:e,destinationChainAlias:n,fromAddresses:u,sourceChainAlias:c,toAddress:C(l,`C`)})}}case`P`:{if(c===`P`)throw new s(`Source and destination chain aliases must be different.`);let[a,u]=await Promise.all([h(r),T({chainAlias:n,getWalletAddressesForChainAlias:i,requiredAddress:o})]);return{baseFeeInNanoAvax:a.price,unsignedTx:v({atomicUtxos:t,context:e,destinationChainAlias:n,feeState:a,fromAddresses:u,sourceChainAlias:c,toAddress:C(l,`P`)})}}case`X`:{if(c===`X`)throw new s(`Source and destination chain aliases must be different.`);let[r,u]=await Promise.all([w({chainAlias:n,getWalletChangeAddressForChainAlias:a}),T({chainAlias:n,getWalletAddressesForChainAlias:i,requiredAddress:o})]);return{baseFeeInNanoAvax:e.baseTxFee,unsignedTx:v({atomicUtxos:t,changeAddress:r,context:e,destinationChainAlias:n,fromAddresses:u,sourceChainAlias:c,toAddress:C(l,`X`)})}}}}export{E as transferAssetFactory};
2
2
  //# sourceMappingURL=transfer-asset.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"transfer-asset.js","names":[],"sources":["../../../../src/transfer-service/avalanche-cct/_handlers/transfer-asset.ts"],"sourcesContent":["import type { Context, Utxo } from '@avalabs/avalanchejs';\nimport type { Address as EvmAddress } from 'viem';\nimport {\n AVALANCHE_FUJI_CHAIN,\n AVALANCHE_MAINNET_CHAIN,\n Environment,\n ServiceType,\n TransferSignatureReason,\n type AvalancheBlockchainAlias,\n} from '../../../constants';\nimport { ErrorCode, ErrorReason, InvalidParamsError, SdkError } from '../../../errors';\nimport { sourcePendingTransferFromQuote } from '../../_transfer-utilities';\nimport { getEvmClientForChain } from '../../_utils';\nimport type { AvalancheSendTxFunction, TransferService } from '../../../types/service';\nimport type { FailedTransfer, TargetPendingTransfer, TransferBase } from '../../../types/transfer';\nimport { getFeeState } from '../_utils/p-chain';\nimport { pollPrimaryNetworkTxStatus } from '../_utils/polling';\nimport { exportTx, importTx } from '../_utils/transactions';\nimport type {\n GetAtomicUtxosCallback,\n GetCoreEthAddressCallback,\n GetUtxosCallback,\n GetWalletAddressesForChainAliasCallback,\n GetWalletChangeAddressForChainAliasCallback,\n XpAddress,\n} from '../types';\nimport { getChainAlias, getEnvironmentIsTestnet, tryOrThrow } from '../_utils';\nimport { getCChainBaseFeeInNanoAvax } from '../_utils/fees';\nimport {\n assertXpAddress,\n getExportFromAddressEvm,\n getExportToAddress,\n getImportToAddress,\n getWalletChangeAddress,\n getWalletFromAddresses,\n} from '../_utils/addresses';\n\nexport interface TransferAssetFactoryOptions {\n ajsContext: Context.Context;\n avalancheSendTx: AvalancheSendTxFunction;\n environment: Environment;\n getCoreEthAddress: GetCoreEthAddressCallback;\n getAtomicUtxos: GetAtomicUtxosCallback;\n getUtxos: GetUtxosCallback;\n getWalletAddressesForChainAlias: GetWalletAddressesForChainAliasCallback;\n getWalletChangeAddressForChainAlias: GetWalletChangeAddressForChainAliasCallback;\n}\n\nexport function transferAssetFactory({\n ajsContext,\n avalancheSendTx,\n environment,\n getCoreEthAddress,\n getAtomicUtxos,\n getUtxos,\n getWalletAddressesForChainAlias,\n getWalletChangeAddressForChainAlias,\n}: TransferAssetFactoryOptions): TransferService['transferAsset'] {\n return async ({ onStepChange, quote }) => {\n if (quote.serviceType !== ServiceType.AVALANCHE_CCT) {\n throw new SdkError(ErrorReason.INCORRECT_PROVIDER_PROVIDED, ErrorCode.INVALID_PARAMS);\n }\n\n const isTestnet = getEnvironmentIsTestnet(environment);\n const sourceChainAlias: AvalancheBlockchainAlias = getChainAlias(quote.sourceChain.chainId, isTestnet);\n const destinationChainAlias: AvalancheBlockchainAlias = getChainAlias(quote.targetChain.chainId, isTestnet);\n const exportFromAddressEvm = getExportFromAddressEvm(quote.fromAddress, sourceChainAlias);\n const exportRequiredFromAddress = sourceChainAlias === 'C' ? undefined : assertXpAddress(quote.fromAddress);\n const exportToAddress = await getExportToAddress({\n destinationChainAlias,\n getCoreEthAddress,\n quoteToAddress: quote.toAddress,\n });\n const importToAddress = getImportToAddress(quote.toAddress, destinationChainAlias);\n const importRequiredFromAddress =\n destinationChainAlias === 'C' ? exportToAddress : assertXpAddress(quote.toAddress);\n\n const hasExport = quote.amountIn > 0n;\n const requiredSignatures = hasExport ? 2 : 1;\n const startedAtMs = Date.now();\n const transferBase = getTransferBase(quote, environment);\n\n let exportTxId: string | undefined;\n\n if (hasExport) {\n onStepChange?.({\n currentSignature: 1,\n currentSignatureReason: TransferSignatureReason.AvalancheCrossChainExport,\n quote,\n requiredSignatures,\n });\n\n const unsignedExportTx = await tryOrThrow(\n () =>\n buildExportTx({\n ajsContext,\n environment,\n getUtxos,\n getWalletAddressesForChainAlias,\n getWalletChangeAddressForChainAlias,\n quoteAmountIn: quote.amountIn,\n sourceChainAlias,\n destinationChainAlias,\n fromAddress: exportFromAddressEvm,\n requiredFromAddress: exportRequiredFromAddress,\n toAddress: exportToAddress,\n }),\n (error) => new SdkError('Failed to build Avalanche export transaction.', ErrorCode.UNKNOWN, { cause: error }),\n );\n\n exportTxId = await tryOrThrow(\n () => avalancheSendTx(unsignedExportTx, 'export', sourceChainAlias),\n (error) =>\n new SdkError('Failed to sign/send Avalanche export transaction.', ErrorCode.SIGNING_FAILED, {\n cause: error,\n }),\n );\n\n let didExportSucceed: boolean;\n try {\n didExportSucceed = await pollPrimaryNetworkTxStatus({\n chainAlias: sourceChainAlias,\n environment,\n txId: exportTxId,\n });\n } catch {\n return sourcePendingTransferFromQuote(quote, {\n environment,\n requiredConfirmationCount: 1,\n startedAtMs,\n txHash: exportTxId,\n });\n }\n\n if (!didExportSucceed) {\n return buildFailedTransfer({\n errorCode: ErrorCode.TRANSACTION_REVERTED,\n errorReason: 'Export transaction was not accepted by Avalanche.',\n sourceStartedAtMs: startedAtMs,\n sourceTxHash: exportTxId,\n transferBase,\n });\n }\n }\n\n const atomicUtxos = await tryOrThrow(\n async () => (await getAtomicUtxos(destinationChainAlias, sourceChainAlias)).getUTXOs(),\n (error) => new SdkError('Failed to fetch Avalanche atomic UTXOs.', ErrorCode.UNKNOWN, { cause: error }),\n );\n\n if (atomicUtxos.length === 0) {\n return buildFailedTransfer({\n errorCode: ErrorCode.INVALID_PARAMS,\n errorReason: 'No atomic UTXOs available to import for this route.',\n sourceStartedAtMs: startedAtMs,\n sourceTxHash: exportTxId,\n transferBase,\n });\n }\n\n onStepChange?.({\n currentSignature: hasExport ? 2 : 1,\n currentSignatureReason: TransferSignatureReason.AvalancheCrossChainImport,\n quote,\n requiredSignatures,\n });\n\n const unsignedImportTx = await tryOrThrow(\n () =>\n buildImportTx({\n ajsContext,\n atomicUtxos,\n destinationChainAlias,\n environment,\n getWalletAddressesForChainAlias,\n getWalletChangeAddressForChainAlias,\n sourceChainAlias,\n requiredFromAddress: importRequiredFromAddress,\n toAddress: importToAddress,\n }),\n (error) => new SdkError('Failed to build Avalanche import transaction.', ErrorCode.UNKNOWN, { cause: error }),\n );\n\n const importTxId = await tryOrThrow(\n () => avalancheSendTx(unsignedImportTx, 'import', destinationChainAlias),\n (error) =>\n new SdkError('Failed to sign/send Avalanche import transaction.', ErrorCode.SIGNING_FAILED, {\n cause: error,\n }),\n );\n\n return {\n ...transferBase,\n source: {\n confirmationCount: exportTxId ? 1 : 0,\n requiredConfirmationCount: 1,\n startedAtMs,\n txHash: exportTxId ?? importTxId,\n },\n status: 'target-pending',\n target: {\n confirmationCount: 0,\n requiredConfirmationCount: 1,\n startedAtMs: Date.now(),\n txHash: importTxId,\n },\n } satisfies TargetPendingTransfer;\n };\n}\n\nfunction getTransferBase(\n quote: Parameters<TransferService['transferAsset']>[0]['quote'],\n environment: Environment,\n): Omit<TransferBase, 'status'> {\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 targetAsset: quote.assetOut,\n targetChain: quote.targetChain,\n toAddress: quote.toAddress,\n type: quote.serviceType,\n };\n}\n\nfunction buildFailedTransfer({\n errorCode,\n errorReason,\n sourceStartedAtMs,\n sourceTxHash,\n transferBase,\n}: {\n errorCode: ErrorCode;\n errorReason: string;\n sourceStartedAtMs: number;\n sourceTxHash?: string;\n transferBase: Omit<TransferBase, 'status'>;\n}): FailedTransfer {\n return {\n ...transferBase,\n errorCode,\n errorReason,\n failedAtMs: Date.now(),\n ...(sourceTxHash\n ? {\n source: {\n confirmationCount: 0,\n requiredConfirmationCount: 1,\n startedAtMs: sourceStartedAtMs,\n txHash: sourceTxHash,\n },\n }\n : {}),\n status: 'failed',\n };\n}\n\nasync function buildExportTx({\n ajsContext,\n destinationChainAlias,\n environment,\n fromAddress,\n getUtxos,\n getWalletAddressesForChainAlias,\n getWalletChangeAddressForChainAlias,\n quoteAmountIn,\n requiredFromAddress,\n sourceChainAlias,\n toAddress,\n}: {\n ajsContext: Context.Context;\n destinationChainAlias: AvalancheBlockchainAlias;\n environment: Environment;\n fromAddress: EvmAddress | null;\n getUtxos: GetUtxosCallback;\n getWalletAddressesForChainAlias: GetWalletAddressesForChainAliasCallback;\n getWalletChangeAddressForChainAlias: GetWalletChangeAddressForChainAliasCallback;\n quoteAmountIn: bigint;\n requiredFromAddress?: XpAddress;\n sourceChainAlias: AvalancheBlockchainAlias;\n toAddress: XpAddress;\n}) {\n switch (sourceChainAlias) {\n case 'C': {\n if (destinationChainAlias === 'C') {\n throw new InvalidParamsError('Source and destination chain aliases must be different.');\n }\n\n if (!fromAddress) {\n throw new InvalidParamsError('fromAddress must be an EVM address when exporting from C-Chain.');\n }\n\n const cChain = environment === Environment.TEST ? AVALANCHE_FUJI_CHAIN : AVALANCHE_MAINNET_CHAIN;\n const cChainClient = getEvmClientForChain({ chain: cChain });\n const [nonce, baseFeeInNanoAvax] = await Promise.all([\n cChainClient.getTransactionCount({\n address: fromAddress,\n }),\n getCChainBaseFeeInNanoAvax(environment),\n ]);\n\n return exportTx({\n amountInNanoAvax: quoteAmountIn,\n baseFeeInNanoAvax,\n context: ajsContext,\n destinationChainAlias,\n fromAddress,\n nonce: BigInt(nonce),\n sourceChainAlias,\n toAddress,\n });\n }\n\n case 'P': {\n if (destinationChainAlias === 'P') {\n throw new InvalidParamsError('Source and destination chain aliases must be different.');\n }\n\n const [changeAddress, feeState, fromAddresses, pUtxoSet] = await Promise.all([\n getWalletChangeAddress({\n chainAlias: sourceChainAlias,\n getWalletChangeAddressForChainAlias,\n }),\n getFeeState(environment),\n getWalletFromAddresses({\n chainAlias: sourceChainAlias,\n getWalletAddressesForChainAlias,\n requiredAddress: requiredFromAddress,\n }),\n getUtxos('P'),\n ]);\n\n return exportTx({\n amountInNanoAvax: quoteAmountIn,\n changeAddress,\n context: ajsContext,\n destinationChainAlias,\n feeState,\n fromAddresses,\n sourceChainAlias,\n toAddress,\n utxos: pUtxoSet.getUTXOs(),\n });\n }\n\n case 'X': {\n if (destinationChainAlias === 'X') {\n throw new InvalidParamsError('Source and destination chain aliases must be different.');\n }\n\n const [changeAddress, fromAddresses, xUtxoSet] = await Promise.all([\n getWalletChangeAddress({\n chainAlias: sourceChainAlias,\n getWalletChangeAddressForChainAlias,\n }),\n getWalletFromAddresses({\n chainAlias: sourceChainAlias,\n getWalletAddressesForChainAlias,\n requiredAddress: requiredFromAddress,\n }),\n getUtxos('X'),\n ]);\n\n return exportTx({\n amountInNanoAvax: quoteAmountIn,\n changeAddress,\n context: ajsContext,\n destinationChainAlias,\n fromAddresses,\n sourceChainAlias,\n toAddress,\n utxos: xUtxoSet.getUTXOs(),\n });\n }\n }\n}\n\nasync function buildImportTx({\n ajsContext,\n atomicUtxos,\n destinationChainAlias,\n environment,\n getWalletAddressesForChainAlias,\n getWalletChangeAddressForChainAlias,\n requiredFromAddress,\n sourceChainAlias,\n toAddress,\n}: {\n ajsContext: Context.Context;\n atomicUtxos: Utxo[];\n destinationChainAlias: AvalancheBlockchainAlias;\n environment: Environment;\n getWalletAddressesForChainAlias: GetWalletAddressesForChainAliasCallback;\n getWalletChangeAddressForChainAlias: GetWalletChangeAddressForChainAliasCallback;\n requiredFromAddress: XpAddress;\n sourceChainAlias: AvalancheBlockchainAlias;\n toAddress: string;\n}) {\n switch (destinationChainAlias) {\n case 'C': {\n if (sourceChainAlias === 'C') {\n throw new InvalidParamsError('Source and destination chain aliases must be different.');\n }\n\n const [baseFeeInNanoAvax, fromAddresses] = await Promise.all([\n getCChainBaseFeeInNanoAvax(environment),\n getWalletFromAddresses({\n chainAlias: destinationChainAlias,\n getWalletAddressesForChainAlias,\n requiredAddress: requiredFromAddress,\n }),\n ]);\n\n return importTx({\n atomicUtxos,\n baseFeeInNanoAvax,\n context: ajsContext,\n destinationChainAlias,\n fromAddresses,\n sourceChainAlias,\n toAddress: getImportToAddress(toAddress, 'C'),\n });\n }\n\n case 'P': {\n if (sourceChainAlias === 'P') {\n throw new InvalidParamsError('Source and destination chain aliases must be different.');\n }\n\n const [feeState, fromAddresses] = await Promise.all([\n getFeeState(environment),\n getWalletFromAddresses({\n chainAlias: destinationChainAlias,\n getWalletAddressesForChainAlias,\n requiredAddress: requiredFromAddress,\n }),\n ]);\n\n return importTx({\n atomicUtxos,\n context: ajsContext,\n destinationChainAlias,\n feeState,\n fromAddresses,\n sourceChainAlias,\n toAddress: getImportToAddress(toAddress, 'P'),\n });\n }\n\n case 'X': {\n if (sourceChainAlias === 'X') {\n throw new InvalidParamsError('Source and destination chain aliases must be different.');\n }\n\n const [changeAddress, fromAddresses] = await Promise.all([\n getWalletChangeAddress({\n chainAlias: destinationChainAlias,\n getWalletChangeAddressForChainAlias,\n }),\n getWalletFromAddresses({\n chainAlias: destinationChainAlias,\n getWalletAddressesForChainAlias,\n requiredAddress: requiredFromAddress,\n }),\n ]);\n\n return importTx({\n atomicUtxos,\n changeAddress,\n context: ajsContext,\n destinationChainAlias,\n fromAddresses,\n sourceChainAlias,\n toAddress: getImportToAddress(toAddress, 'X'),\n });\n }\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"transfer-asset.js","names":[],"sources":["../../../../src/transfer-service/avalanche-cct/_handlers/transfer-asset.ts"],"sourcesContent":["import type { Context, Utxo } from '@avalabs/avalanchejs';\nimport type { Address as EvmAddress } from 'viem';\nimport {\n AVALANCHE_FUJI_CHAIN,\n AVALANCHE_MAINNET_CHAIN,\n Environment,\n ServiceType,\n TransferSignatureReason,\n type AvalancheBlockchainAlias,\n} from '../../../constants';\nimport { ErrorCode, ErrorReason, InvalidParamsError, SdkError } from '../../../errors';\nimport { sourcePendingTransferFromQuote } from '../../_transfer-utilities';\nimport { getEvmClientForChain } from '../../_utils';\nimport type { AvalancheSendTxFunction, TransferService } from '../../../types/service';\nimport type { FailedTransfer, TargetPendingTransfer, TransferBase } from '../../../types/transfer';\nimport { getFeeState } from '../_utils/p-chain';\nimport { pollPrimaryNetworkTxStatus } from '../_utils/polling';\nimport { exportTx, importTx } from '../_utils/transactions';\nimport type {\n GetAtomicUtxosCallback,\n GetCoreEthAddressCallback,\n GetUtxosCallback,\n GetWalletAddressesForChainAliasCallback,\n GetWalletChangeAddressForChainAliasCallback,\n XpAddress,\n} from '../types';\nimport { getChainAlias, getEnvironmentIsTestnet, tryOrThrow } from '../_utils';\nimport { getCChainBaseFeeInNanoAvax } from '../_utils/fees';\nimport { WEI_PER_NANO_AVAX_BIGINT } from '../constants';\nimport {\n assertXpAddress,\n getExportFromAddressEvm,\n getExportToAddress,\n getImportToAddress,\n getWalletChangeAddress,\n getWalletFromAddresses,\n} from '../_utils/addresses';\n\ntype BuiltTx = {\n baseFeeInNanoAvax: bigint;\n unsignedTx: Parameters<AvalancheSendTxFunction>[0]['unsignedTx'];\n};\n\nexport interface TransferAssetFactoryOptions {\n ajsContext: Context.Context;\n avalancheSendTx: AvalancheSendTxFunction;\n environment: Environment;\n getCoreEthAddress: GetCoreEthAddressCallback;\n getAtomicUtxos: GetAtomicUtxosCallback;\n getUtxos: GetUtxosCallback;\n getWalletAddressesForChainAlias: GetWalletAddressesForChainAliasCallback;\n getWalletChangeAddressForChainAlias: GetWalletChangeAddressForChainAliasCallback;\n}\n\nexport function transferAssetFactory({\n ajsContext,\n avalancheSendTx,\n environment,\n getCoreEthAddress,\n getAtomicUtxos,\n getUtxos,\n getWalletAddressesForChainAlias,\n getWalletChangeAddressForChainAlias,\n}: TransferAssetFactoryOptions): TransferService['transferAsset'] {\n return async ({ onStepChange, quote }) => {\n if (quote.serviceType !== ServiceType.AVALANCHE_CCT) {\n throw new SdkError(ErrorReason.INCORRECT_PROVIDER_PROVIDED, ErrorCode.INVALID_PARAMS);\n }\n\n const isTestnet = getEnvironmentIsTestnet(environment);\n const sourceChainAlias: AvalancheBlockchainAlias = getChainAlias(quote.sourceChain.chainId, isTestnet);\n const destinationChainAlias: AvalancheBlockchainAlias = getChainAlias(quote.targetChain.chainId, isTestnet);\n const exportFromAddressEvm = getExportFromAddressEvm(quote.fromAddress, sourceChainAlias);\n const exportRequiredFromAddress = sourceChainAlias === 'C' ? undefined : assertXpAddress(quote.fromAddress);\n const exportToAddress = await getExportToAddress({\n destinationChainAlias,\n getCoreEthAddress,\n quoteToAddress: quote.toAddress,\n });\n const importToAddress = getImportToAddress(quote.toAddress, destinationChainAlias);\n const importRequiredFromAddress =\n destinationChainAlias === 'C' ? exportToAddress : assertXpAddress(quote.toAddress);\n\n const hasExport = quote.amountIn > 0n;\n const requiredSignatures = hasExport ? 2 : 1;\n const startedAtMs = Date.now();\n const transferBase = getTransferBase(quote, environment);\n\n let exportTxId: string | undefined;\n\n if (hasExport) {\n onStepChange?.({\n currentSignature: 1,\n currentSignatureReason: TransferSignatureReason.AvalancheCrossChainExport,\n quote,\n requiredSignatures,\n });\n\n const builtExportTx = await tryOrThrow(\n () =>\n buildExportTx({\n ajsContext,\n environment,\n getUtxos,\n getWalletAddressesForChainAlias,\n getWalletChangeAddressForChainAlias,\n quoteAmountIn: quote.amountIn,\n sourceChainAlias,\n destinationChainAlias,\n fromAddress: exportFromAddressEvm,\n requiredFromAddress: exportRequiredFromAddress,\n toAddress: exportToAddress,\n }),\n (error) => new SdkError('Failed to build Avalanche export transaction.', ErrorCode.UNKNOWN, { cause: error }),\n );\n\n exportTxId = await tryOrThrow(\n () =>\n avalancheSendTx({\n baseFeeInNanoAvax: builtExportTx.baseFeeInNanoAvax,\n chainAlias: sourceChainAlias,\n txType: 'export',\n unsignedTx: builtExportTx.unsignedTx,\n }),\n (error) =>\n new SdkError('Failed to sign/send Avalanche export transaction.', ErrorCode.SIGNING_FAILED, {\n cause: error,\n }),\n );\n\n let didExportSucceed: boolean;\n try {\n didExportSucceed = await pollPrimaryNetworkTxStatus({\n chainAlias: sourceChainAlias,\n environment,\n txId: exportTxId,\n });\n } catch {\n return sourcePendingTransferFromQuote(quote, {\n environment,\n requiredConfirmationCount: 1,\n startedAtMs,\n txHash: exportTxId,\n });\n }\n\n if (!didExportSucceed) {\n return buildFailedTransfer({\n errorCode: ErrorCode.TRANSACTION_REVERTED,\n errorReason: 'Export transaction was not accepted by Avalanche.',\n sourceStartedAtMs: startedAtMs,\n sourceTxHash: exportTxId,\n transferBase,\n });\n }\n }\n\n const atomicUtxos = await tryOrThrow(\n async () => (await getAtomicUtxos(destinationChainAlias, sourceChainAlias)).getUTXOs(),\n (error) => new SdkError('Failed to fetch Avalanche atomic UTXOs.', ErrorCode.UNKNOWN, { cause: error }),\n );\n\n if (atomicUtxos.length === 0) {\n return buildFailedTransfer({\n errorCode: ErrorCode.INVALID_PARAMS,\n errorReason: 'No atomic UTXOs available to import for this route.',\n sourceStartedAtMs: startedAtMs,\n sourceTxHash: exportTxId,\n transferBase,\n });\n }\n\n onStepChange?.({\n currentSignature: hasExport ? 2 : 1,\n currentSignatureReason: TransferSignatureReason.AvalancheCrossChainImport,\n quote,\n requiredSignatures,\n });\n\n const builtImportTx = await tryOrThrow(\n () =>\n buildImportTx({\n ajsContext,\n atomicUtxos,\n destinationChainAlias,\n environment,\n getWalletAddressesForChainAlias,\n getWalletChangeAddressForChainAlias,\n sourceChainAlias,\n requiredFromAddress: importRequiredFromAddress,\n toAddress: importToAddress,\n }),\n (error) => new SdkError('Failed to build Avalanche import transaction.', ErrorCode.UNKNOWN, { cause: error }),\n );\n\n const importTxId = await tryOrThrow(\n () =>\n avalancheSendTx({\n baseFeeInNanoAvax: builtImportTx.baseFeeInNanoAvax,\n chainAlias: destinationChainAlias,\n txType: 'import',\n unsignedTx: builtImportTx.unsignedTx,\n }),\n (error) =>\n new SdkError('Failed to sign/send Avalanche import transaction.', ErrorCode.SIGNING_FAILED, {\n cause: error,\n }),\n );\n\n return {\n ...transferBase,\n source: {\n confirmationCount: exportTxId ? 1 : 0,\n requiredConfirmationCount: 1,\n startedAtMs,\n txHash: exportTxId ?? importTxId,\n },\n status: 'target-pending',\n target: {\n confirmationCount: 0,\n requiredConfirmationCount: 1,\n startedAtMs: Date.now(),\n txHash: importTxId,\n },\n } satisfies TargetPendingTransfer;\n };\n}\n\nfunction getTransferBase(\n quote: Parameters<TransferService['transferAsset']>[0]['quote'],\n environment: Environment,\n): Omit<TransferBase, 'status'> {\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 targetAsset: quote.assetOut,\n targetChain: quote.targetChain,\n toAddress: quote.toAddress,\n type: quote.serviceType,\n };\n}\n\nfunction buildFailedTransfer({\n errorCode,\n errorReason,\n sourceStartedAtMs,\n sourceTxHash,\n transferBase,\n}: {\n errorCode: ErrorCode;\n errorReason: string;\n sourceStartedAtMs: number;\n sourceTxHash?: string;\n transferBase: Omit<TransferBase, 'status'>;\n}): FailedTransfer {\n return {\n ...transferBase,\n errorCode,\n errorReason,\n failedAtMs: Date.now(),\n ...(sourceTxHash\n ? {\n source: {\n confirmationCount: 0,\n requiredConfirmationCount: 1,\n startedAtMs: sourceStartedAtMs,\n txHash: sourceTxHash,\n },\n }\n : {}),\n status: 'failed',\n };\n}\n\nfunction getExportAmountInNanoAvax(sourceChainAlias: AvalancheBlockchainAlias, quoteAmountIn: bigint): bigint {\n return sourceChainAlias === 'C' ? quoteAmountIn / WEI_PER_NANO_AVAX_BIGINT : quoteAmountIn;\n}\n\nasync function buildExportTx({\n ajsContext,\n destinationChainAlias,\n environment,\n fromAddress,\n getUtxos,\n getWalletAddressesForChainAlias,\n getWalletChangeAddressForChainAlias,\n quoteAmountIn,\n requiredFromAddress,\n sourceChainAlias,\n toAddress,\n}: {\n ajsContext: Context.Context;\n destinationChainAlias: AvalancheBlockchainAlias;\n environment: Environment;\n fromAddress: EvmAddress | null;\n getUtxos: GetUtxosCallback;\n getWalletAddressesForChainAlias: GetWalletAddressesForChainAliasCallback;\n getWalletChangeAddressForChainAlias: GetWalletChangeAddressForChainAliasCallback;\n quoteAmountIn: bigint;\n requiredFromAddress?: XpAddress;\n sourceChainAlias: AvalancheBlockchainAlias;\n toAddress: XpAddress;\n}): Promise<BuiltTx> {\n const amountInNanoAvax = getExportAmountInNanoAvax(sourceChainAlias, quoteAmountIn);\n\n switch (sourceChainAlias) {\n case 'C': {\n if (destinationChainAlias === 'C') {\n throw new InvalidParamsError('Source and destination chain aliases must be different.');\n }\n\n if (!fromAddress) {\n throw new InvalidParamsError('fromAddress must be an EVM address when exporting from C-Chain.');\n }\n\n const cChain = environment === Environment.TEST ? AVALANCHE_FUJI_CHAIN : AVALANCHE_MAINNET_CHAIN;\n const cChainClient = getEvmClientForChain({ chain: cChain });\n const [nonce, baseFeeInNanoAvax] = await Promise.all([\n cChainClient.getTransactionCount({\n address: fromAddress,\n }),\n getCChainBaseFeeInNanoAvax(environment),\n ]);\n\n return {\n baseFeeInNanoAvax,\n unsignedTx: exportTx({\n amountInNanoAvax,\n baseFeeInNanoAvax,\n context: ajsContext,\n destinationChainAlias,\n fromAddress,\n nonce: BigInt(nonce),\n sourceChainAlias,\n toAddress,\n }),\n };\n }\n\n case 'P': {\n if (destinationChainAlias === 'P') {\n throw new InvalidParamsError('Source and destination chain aliases must be different.');\n }\n\n const [changeAddress, feeState, fromAddresses, pUtxoSet] = await Promise.all([\n getWalletChangeAddress({\n chainAlias: sourceChainAlias,\n getWalletChangeAddressForChainAlias,\n }),\n getFeeState(environment),\n getWalletFromAddresses({\n chainAlias: sourceChainAlias,\n getWalletAddressesForChainAlias,\n requiredAddress: requiredFromAddress,\n }),\n getUtxos('P'),\n ]);\n\n return {\n baseFeeInNanoAvax: feeState.price,\n unsignedTx: exportTx({\n amountInNanoAvax,\n changeAddress,\n context: ajsContext,\n destinationChainAlias,\n feeState,\n fromAddresses,\n sourceChainAlias,\n toAddress,\n utxos: pUtxoSet.getUTXOs(),\n }),\n };\n }\n\n case 'X': {\n if (destinationChainAlias === 'X') {\n throw new InvalidParamsError('Source and destination chain aliases must be different.');\n }\n\n const [changeAddress, fromAddresses, xUtxoSet] = await Promise.all([\n getWalletChangeAddress({\n chainAlias: sourceChainAlias,\n getWalletChangeAddressForChainAlias,\n }),\n getWalletFromAddresses({\n chainAlias: sourceChainAlias,\n getWalletAddressesForChainAlias,\n requiredAddress: requiredFromAddress,\n }),\n getUtxos('X'),\n ]);\n\n return {\n baseFeeInNanoAvax: ajsContext.baseTxFee,\n unsignedTx: exportTx({\n amountInNanoAvax,\n changeAddress,\n context: ajsContext,\n destinationChainAlias,\n fromAddresses,\n sourceChainAlias,\n toAddress,\n utxos: xUtxoSet.getUTXOs(),\n }),\n };\n }\n }\n}\n\nasync function buildImportTx({\n ajsContext,\n atomicUtxos,\n destinationChainAlias,\n environment,\n getWalletAddressesForChainAlias,\n getWalletChangeAddressForChainAlias,\n requiredFromAddress,\n sourceChainAlias,\n toAddress,\n}: {\n ajsContext: Context.Context;\n atomicUtxos: Utxo[];\n destinationChainAlias: AvalancheBlockchainAlias;\n environment: Environment;\n getWalletAddressesForChainAlias: GetWalletAddressesForChainAliasCallback;\n getWalletChangeAddressForChainAlias: GetWalletChangeAddressForChainAliasCallback;\n requiredFromAddress: XpAddress;\n sourceChainAlias: AvalancheBlockchainAlias;\n toAddress: string;\n}): Promise<BuiltTx> {\n switch (destinationChainAlias) {\n case 'C': {\n if (sourceChainAlias === 'C') {\n throw new InvalidParamsError('Source and destination chain aliases must be different.');\n }\n\n const [baseFeeInNanoAvax, fromAddresses] = await Promise.all([\n getCChainBaseFeeInNanoAvax(environment),\n getWalletFromAddresses({\n chainAlias: destinationChainAlias,\n getWalletAddressesForChainAlias,\n requiredAddress: requiredFromAddress,\n }),\n ]);\n\n return {\n baseFeeInNanoAvax,\n unsignedTx: importTx({\n atomicUtxos,\n baseFeeInNanoAvax,\n context: ajsContext,\n destinationChainAlias,\n fromAddresses,\n sourceChainAlias,\n toAddress: getImportToAddress(toAddress, 'C'),\n }),\n };\n }\n\n case 'P': {\n if (sourceChainAlias === 'P') {\n throw new InvalidParamsError('Source and destination chain aliases must be different.');\n }\n\n const [feeState, fromAddresses] = await Promise.all([\n getFeeState(environment),\n getWalletFromAddresses({\n chainAlias: destinationChainAlias,\n getWalletAddressesForChainAlias,\n requiredAddress: requiredFromAddress,\n }),\n ]);\n\n return {\n baseFeeInNanoAvax: feeState.price,\n unsignedTx: importTx({\n atomicUtxos,\n context: ajsContext,\n destinationChainAlias,\n feeState,\n fromAddresses,\n sourceChainAlias,\n toAddress: getImportToAddress(toAddress, 'P'),\n }),\n };\n }\n\n case 'X': {\n if (sourceChainAlias === 'X') {\n throw new InvalidParamsError('Source and destination chain aliases must be different.');\n }\n\n const [changeAddress, fromAddresses] = await Promise.all([\n getWalletChangeAddress({\n chainAlias: destinationChainAlias,\n getWalletChangeAddressForChainAlias,\n }),\n getWalletFromAddresses({\n chainAlias: destinationChainAlias,\n getWalletAddressesForChainAlias,\n requiredAddress: requiredFromAddress,\n }),\n ]);\n\n return {\n baseFeeInNanoAvax: ajsContext.baseTxFee,\n unsignedTx: importTx({\n atomicUtxos,\n changeAddress,\n context: ajsContext,\n destinationChainAlias,\n fromAddresses,\n sourceChainAlias,\n toAddress: getImportToAddress(toAddress, 'X'),\n }),\n };\n }\n }\n}\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- require(`../../_virtual/_rolldown/runtime.cjs`);const e=require(`../../constants.cjs`),t=require(`../../errors.cjs`),n=require(`./constants.cjs`);let r=require(`@avalabs/avalanchejs`),i=require(`es-toolkit`);function a(e,t){try{return e()}catch(e){throw t(e)}}function o({amountIn:e,sourceAsset:{decimals:t},targetAsset:{decimals:n}}){return t<n?e*10n**BigInt(n-t):t>n?e/10n**BigInt(t-n):e}function s(e){return e&&e.replace(n.CHAIN_PREFIXES_REGEX,``)}function c(e,t){let n=t?`fuji`:`avax`;return s(e).startsWith(n)}function l(n,r){let i=r?e.AvalancheFujiBlockchainChainIds:e.AvalancheMainnetBlockchainChainIds;if(n===i.C)return`C`;if(n===i.P)return`P`;if(n===i.X)return`X`;throw new t.InvalidParamsError(`Unsupported Avalanche chainId for ${r?`testnet`:`mainnet`}: ${n}`,`Chain ID ${n} is not supported for ${r?`Fuji`:`Mainnet`}. Supported chain IDs are: ${Object.values(i).join(`, `)}.`)}function u(e){return e===`C`?n.AVALANCHE_C_CHAIN_NATIVE_ASSET:n.AVALANCHE_PX_CHAIN_NATIVE_ASSET}function d(r){switch(r){case e.Environment.TEST:return n.AVALANCHE_API_URIS.fuji;case e.Environment.PROD:return n.AVALANCHE_API_URIS.mainnet;default:throw new t.SdkError(`Unsupported environment for Avalanche CCT service.`,t.ErrorCode.INVALID_PARAMS)}}function f(e){return e*n.WEI_PER_NANO_AVAX_BIGINT}function p(e,n){switch(e){case`C`:return n.cBlockchainID;case`P`:return n.pBlockchainID;case`X`:return n.xBlockchainID;default:throw new t.InvalidParamsError(`Unsupported chain alias: ${e}`)}}function m(e,t){return(0,i.orderBy)(e.map(e=>({utxo:e,...r.utils.getUtxoInfo(e)})),[`amount`],[t?`desc`:`asc`]).map(({utxo:e})=>e)}function h(e){return e.map(e=>r.utils.parse(e)[2])}function g(n){switch(n){case e.Environment.TEST:return!0;case e.Environment.PROD:return!1;default:throw new t.SdkError(`Unsupported environment for Avalanche CCT service.`,t.ErrorCode.INVALID_PARAMS)}}function _(e,n){let i=d(e);switch(n){case`C`:return new r.evm.EVMApi(i);case`P`:return new r.pvm.PVMApi(i);case`X`:return new r.avm.AVMApi(i);default:throw new t.InvalidParamsError(`Unsupported chain alias: ${n}`,`Can not get Avalanche provider for unsupported chain alias.`)}}exports.convertNanoAvaxToWei=f,exports.getAddressesAsBuffers=h,exports.getAvalancheApiUrl=d,exports.getAvalancheProvider=_,exports.getChainAlias=l,exports.getChainIdFromContext=p,exports.getEnvironmentIsTestnet=g,exports.getNativeTokenForChainAlias=u,exports.getOutputAmountForAvalancheCct=o,exports.sortUTXOsByAmount=m,exports.stripAddressPrefix=s,exports.tryOrThrow=a,exports.xpAddressMatchesNetwork=c;
1
+ require(`../../_virtual/_rolldown/runtime.cjs`);const e=require(`../../constants.cjs`),t=require(`../../errors.cjs`),n=require(`./constants.cjs`);let r=require(`@avalabs/avalanchejs`),i=require(`es-toolkit`);function a(e,t){try{return e()}catch(e){throw t(e)}}function o({amountIn:e,sourceAsset:{decimals:t},targetAsset:{decimals:n}}){return t<n?e*10n**BigInt(n-t):t>n?e/10n**BigInt(t-n):e}function s(e){return e&&e.replace(n.CHAIN_PREFIXES_REGEX,``)}function c(e,t){let n=t?`fuji`:`avax`;return s(e).startsWith(n)}function l(n,r){let i=r?e.AvalancheFujiBlockchainChainIds:e.AvalancheMainnetBlockchainChainIds;if(n===i.C)return`C`;if(n===i.P)return`P`;if(n===i.X)return`X`;throw new t.InvalidParamsError(`Unsupported Avalanche chainId for ${r?`testnet`:`mainnet`}: ${n}`,`Chain ID ${n} is not supported for ${r?`Fuji`:`Mainnet`}. Supported chain IDs are: ${Object.values(i).join(`, `)}.`)}function u(e){return e===`C`?n.AVALANCHE_C_CHAIN_NATIVE_ASSET:n.AVALANCHE_PX_CHAIN_NATIVE_ASSET}function d(r){switch(r){case e.Environment.TEST:return n.AVALANCHE_API_URIS.fuji;case e.Environment.PROD:return n.AVALANCHE_API_URIS.mainnet;default:throw new t.SdkError(`Unsupported environment for Avalanche CCT service.`,t.ErrorCode.INVALID_PARAMS)}}function f(e){return e*n.WEI_PER_NANO_AVAX_BIGINT}function p(e,n){switch(e){case`C`:return n.cBlockchainID;case`P`:return n.pBlockchainID;case`X`:return n.xBlockchainID;default:throw new t.InvalidParamsError(`Unsupported chain alias: ${e}`)}}function m(e,t){return(0,i.orderBy)(e.map(e=>({utxo:e,...r.utils.getUtxoInfo(e)})),[`amount`],[t?`desc`:`asc`]).map(({utxo:e})=>e)}function h(e){return e.reduce((e,t)=>e+r.utils.getUtxoInfo(t).amount,0n)}function g(e){return e.map(e=>r.utils.parse(e)[2])}function _(n){switch(n){case e.Environment.TEST:return!0;case e.Environment.PROD:return!1;default:throw new t.SdkError(`Unsupported environment for Avalanche CCT service.`,t.ErrorCode.INVALID_PARAMS)}}function v(e,n){let i=d(e);switch(n){case`C`:return new r.evm.EVMApi(i);case`P`:return new r.pvm.PVMApi(i);case`X`:return new r.avm.AVMApi(i);default:throw new t.InvalidParamsError(`Unsupported chain alias: ${n}`,`Can not get Avalanche provider for unsupported chain alias.`)}}exports.convertNanoAvaxToWei=f,exports.getAddressesAsBuffers=g,exports.getAvalancheApiUrl=d,exports.getAvalancheProvider=v,exports.getChainAlias=l,exports.getChainIdFromContext=p,exports.getEnvironmentIsTestnet=_,exports.getNativeTokenForChainAlias=u,exports.getOutputAmountForAvalancheCct=o,exports.getUtxosTotalAmount=h,exports.sortUTXOsByAmount=m,exports.stripAddressPrefix=s,exports.tryOrThrow=a,exports.xpAddressMatchesNetwork=c;
2
2
  //# sourceMappingURL=_utils.cjs.map