@avalabs/fusion-sdk 0.16.0 → 0.17.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/constants.cjs +1 -1
- package/dist/constants.cjs.map +1 -1
- package/dist/constants.d.cts +21 -1
- package/dist/constants.d.ts +21 -1
- package/dist/constants.js +1 -1
- package/dist/constants.js.map +1 -1
- package/dist/errors.cjs +1 -1
- package/dist/errors.cjs.map +1 -1
- package/dist/errors.js +1 -1
- package/dist/errors.js.map +1 -1
- package/dist/mod.cjs +1 -1
- package/dist/mod.d.cts +7 -5
- package/dist/mod.d.ts +7 -5
- package/dist/mod.js +1 -1
- package/dist/transfer-manager.cjs +1 -1
- package/dist/transfer-manager.cjs.map +1 -1
- package/dist/transfer-manager.js +1 -1
- package/dist/transfer-manager.js.map +1 -1
- package/dist/transfer-service/_evm-gas.cjs +1 -1
- package/dist/transfer-service/_evm-gas.js +1 -1
- package/dist/transfer-service/_utils.cjs +1 -1
- package/dist/transfer-service/_utils.cjs.map +1 -1
- package/dist/transfer-service/_utils.js +1 -1
- package/dist/transfer-service/_utils.js.map +1 -1
- package/dist/transfer-service/avalanche-cct/_handlers/analyze-support.cjs +2 -0
- package/dist/transfer-service/avalanche-cct/_handlers/analyze-support.cjs.map +1 -0
- package/dist/transfer-service/avalanche-cct/_handlers/analyze-support.js +2 -0
- package/dist/transfer-service/avalanche-cct/_handlers/analyze-support.js.map +1 -0
- package/dist/transfer-service/avalanche-cct/_handlers/estimate-native-fee.cjs +2 -0
- package/dist/transfer-service/avalanche-cct/_handlers/estimate-native-fee.cjs.map +1 -0
- package/dist/transfer-service/avalanche-cct/_handlers/estimate-native-fee.js +2 -0
- package/dist/transfer-service/avalanche-cct/_handlers/estimate-native-fee.js.map +1 -0
- package/dist/transfer-service/avalanche-cct/_handlers/get-bridgeable-assets.cjs +2 -0
- package/dist/transfer-service/avalanche-cct/_handlers/get-bridgeable-assets.cjs.map +1 -0
- package/dist/transfer-service/avalanche-cct/_handlers/get-bridgeable-assets.js +2 -0
- package/dist/transfer-service/avalanche-cct/_handlers/get-bridgeable-assets.js.map +1 -0
- package/dist/transfer-service/avalanche-cct/_handlers/get-minimum-transfer-amount.cjs +2 -0
- package/dist/transfer-service/avalanche-cct/_handlers/get-minimum-transfer-amount.cjs.map +1 -0
- package/dist/transfer-service/avalanche-cct/_handlers/get-minimum-transfer-amount.js +2 -0
- package/dist/transfer-service/avalanche-cct/_handlers/get-minimum-transfer-amount.js.map +1 -0
- package/dist/transfer-service/avalanche-cct/_handlers/get-supported-chains.cjs +2 -0
- package/dist/transfer-service/avalanche-cct/_handlers/get-supported-chains.cjs.map +1 -0
- package/dist/transfer-service/avalanche-cct/_handlers/get-supported-chains.js +2 -0
- package/dist/transfer-service/avalanche-cct/_handlers/get-supported-chains.js.map +1 -0
- package/dist/transfer-service/avalanche-cct/_handlers/stream-quotes.cjs +2 -0
- package/dist/transfer-service/avalanche-cct/_handlers/stream-quotes.cjs.map +1 -0
- package/dist/transfer-service/avalanche-cct/_handlers/stream-quotes.js +2 -0
- package/dist/transfer-service/avalanche-cct/_handlers/stream-quotes.js.map +1 -0
- package/dist/transfer-service/avalanche-cct/_handlers/track-transfer.cjs +2 -0
- package/dist/transfer-service/avalanche-cct/_handlers/track-transfer.cjs.map +1 -0
- package/dist/transfer-service/avalanche-cct/_handlers/track-transfer.js +2 -0
- package/dist/transfer-service/avalanche-cct/_handlers/track-transfer.js.map +1 -0
- package/dist/transfer-service/avalanche-cct/_handlers/transfer-asset.cjs +2 -0
- package/dist/transfer-service/avalanche-cct/_handlers/transfer-asset.cjs.map +1 -0
- package/dist/transfer-service/avalanche-cct/_handlers/transfer-asset.js +2 -0
- package/dist/transfer-service/avalanche-cct/_handlers/transfer-asset.js.map +1 -0
- package/dist/transfer-service/avalanche-cct/_type-guards.cjs +2 -0
- package/dist/transfer-service/avalanche-cct/_type-guards.cjs.map +1 -0
- package/dist/transfer-service/avalanche-cct/_type-guards.js +2 -0
- package/dist/transfer-service/avalanche-cct/_type-guards.js.map +1 -0
- package/dist/transfer-service/avalanche-cct/_utils/addresses.cjs +2 -0
- package/dist/transfer-service/avalanche-cct/_utils/addresses.cjs.map +1 -0
- package/dist/transfer-service/avalanche-cct/_utils/addresses.js +2 -0
- package/dist/transfer-service/avalanche-cct/_utils/addresses.js.map +1 -0
- package/dist/transfer-service/avalanche-cct/_utils/fees.cjs +2 -0
- package/dist/transfer-service/avalanche-cct/_utils/fees.cjs.map +1 -0
- package/dist/transfer-service/avalanche-cct/_utils/fees.js +2 -0
- package/dist/transfer-service/avalanche-cct/_utils/fees.js.map +1 -0
- package/dist/transfer-service/avalanche-cct/_utils/p-chain.cjs +2 -0
- package/dist/transfer-service/avalanche-cct/_utils/p-chain.cjs.map +1 -0
- package/dist/transfer-service/avalanche-cct/_utils/p-chain.js +2 -0
- package/dist/transfer-service/avalanche-cct/_utils/p-chain.js.map +1 -0
- package/dist/transfer-service/avalanche-cct/_utils/polling.cjs +2 -0
- package/dist/transfer-service/avalanche-cct/_utils/polling.cjs.map +1 -0
- package/dist/transfer-service/avalanche-cct/_utils/polling.js +2 -0
- package/dist/transfer-service/avalanche-cct/_utils/polling.js.map +1 -0
- package/dist/transfer-service/avalanche-cct/_utils/transactions.cjs +2 -0
- package/dist/transfer-service/avalanche-cct/_utils/transactions.cjs.map +1 -0
- package/dist/transfer-service/avalanche-cct/_utils/transactions.js +2 -0
- package/dist/transfer-service/avalanche-cct/_utils/transactions.js.map +1 -0
- package/dist/transfer-service/avalanche-cct/_utils.cjs +2 -0
- package/dist/transfer-service/avalanche-cct/_utils.cjs.map +1 -0
- package/dist/transfer-service/avalanche-cct/_utils.js +2 -0
- package/dist/transfer-service/avalanche-cct/_utils.js.map +1 -0
- package/dist/transfer-service/avalanche-cct/avalanche-cct-service.cjs +2 -0
- package/dist/transfer-service/avalanche-cct/avalanche-cct-service.cjs.map +1 -0
- package/dist/transfer-service/avalanche-cct/avalanche-cct-service.js +2 -0
- package/dist/transfer-service/avalanche-cct/avalanche-cct-service.js.map +1 -0
- package/dist/transfer-service/avalanche-cct/constants.cjs +2 -0
- package/dist/transfer-service/avalanche-cct/constants.cjs.map +1 -0
- package/dist/transfer-service/avalanche-cct/constants.js +2 -0
- package/dist/transfer-service/avalanche-cct/constants.js.map +1 -0
- package/dist/transfer-service/avalanche-cct/types.d.cts +33 -0
- package/dist/transfer-service/avalanche-cct/types.d.ts +33 -0
- package/dist/transfer-service/avalanche-evm/_handlers/get-bridgeable-assets.cjs +1 -1
- package/dist/transfer-service/avalanche-evm/_handlers/get-bridgeable-assets.cjs.map +1 -1
- package/dist/transfer-service/avalanche-evm/_handlers/get-bridgeable-assets.js +1 -1
- package/dist/transfer-service/avalanche-evm/_handlers/get-bridgeable-assets.js.map +1 -1
- package/dist/transfer-service/avalanche-evm/_handlers/transfer-asset.cjs +1 -1
- package/dist/transfer-service/avalanche-evm/_handlers/transfer-asset.js +1 -1
- package/dist/transfer-service/avalanche-evm/_utils/wrap.cjs +1 -1
- package/dist/transfer-service/avalanche-evm/_utils/wrap.js +1 -1
- package/dist/transfer-service/fetch-utilities.cjs +1 -1
- package/dist/transfer-service/fetch-utilities.cjs.map +1 -1
- package/dist/transfer-service/fetch-utilities.js +1 -1
- package/dist/transfer-service/fetch-utilities.js.map +1 -1
- package/dist/transfer-service/lombard/btc-to-btcb/_handlers/get-bridgeable-assets.cjs +1 -1
- package/dist/transfer-service/lombard/btc-to-btcb/_handlers/get-bridgeable-assets.cjs.map +1 -1
- package/dist/transfer-service/lombard/btc-to-btcb/_handlers/get-bridgeable-assets.js +1 -1
- package/dist/transfer-service/lombard/btc-to-btcb/_handlers/get-bridgeable-assets.js.map +1 -1
- package/dist/transfer-service/lombard/btcb-to-btc/_handlers/get-bridgeable-assets.cjs +1 -1
- package/dist/transfer-service/lombard/btcb-to-btc/_handlers/get-bridgeable-assets.cjs.map +1 -1
- package/dist/transfer-service/lombard/btcb-to-btc/_handlers/get-bridgeable-assets.js +1 -1
- package/dist/transfer-service/lombard/btcb-to-btc/_handlers/get-bridgeable-assets.js.map +1 -1
- package/dist/transfer-service/markr/_handlers/estimate-native-fee.cjs +1 -1
- package/dist/transfer-service/markr/_handlers/estimate-native-fee.js +1 -1
- package/dist/transfer-service/markr/_handlers/get-bridgeable-assets.cjs +1 -1
- package/dist/transfer-service/markr/_handlers/get-bridgeable-assets.cjs.map +1 -1
- package/dist/transfer-service/markr/_handlers/get-bridgeable-assets.js +1 -1
- package/dist/transfer-service/markr/_handlers/get-bridgeable-assets.js.map +1 -1
- package/dist/transfer-service/markr/_handlers/track-transfer.cjs +1 -1
- package/dist/transfer-service/markr/_handlers/track-transfer.js +1 -1
- package/dist/transfer-service/markr/_handlers/transfer-asset.cjs +1 -1
- package/dist/transfer-service/markr/_handlers/transfer-asset.js +1 -1
- package/dist/transfer-service/markr/markr-service.cjs.map +1 -1
- package/dist/transfer-service/markr/markr-service.js.map +1 -1
- package/dist/transfer-service/wrap-unwrap/_handlers/get-bridgeable-assets.cjs +1 -1
- package/dist/transfer-service/wrap-unwrap/_handlers/get-bridgeable-assets.cjs.map +1 -1
- package/dist/transfer-service/wrap-unwrap/_handlers/get-bridgeable-assets.js +1 -1
- package/dist/transfer-service/wrap-unwrap/_handlers/get-bridgeable-assets.js.map +1 -1
- package/dist/transfer-service/wrap-unwrap/_handlers/transfer-asset.cjs +1 -1
- package/dist/transfer-service/wrap-unwrap/_handlers/transfer-asset.js +1 -1
- package/dist/types/asset.d.cts +18 -2
- package/dist/types/asset.d.ts +18 -2
- package/dist/types/service.d.cts +95 -7
- package/dist/types/service.d.ts +95 -7
- package/dist/types/transfer-manager.d.cts +19 -10
- package/dist/types/transfer-manager.d.ts +19 -10
- package/dist/types/utility-types.d.cts +8 -1
- package/dist/types/utility-types.d.ts +8 -1
- package/dist/utils/asset-id.cjs +1 -1
- package/dist/utils/asset-id.cjs.map +1 -1
- package/dist/utils/asset-id.js +1 -1
- package/dist/utils/asset-id.js.map +1 -1
- package/dist/utils/bridgeable-assets.cjs +2 -0
- package/dist/utils/bridgeable-assets.cjs.map +1 -0
- package/dist/utils/bridgeable-assets.d.cts +16 -0
- package/dist/utils/bridgeable-assets.d.ts +16 -0
- package/dist/utils/bridgeable-assets.js +2 -0
- package/dist/utils/bridgeable-assets.js.map +1 -0
- package/package.json +5 -3
|
@@ -0,0 +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"}
|
|
@@ -0,0 +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};
|
|
2
|
+
//# sourceMappingURL=get-minimum-transfer-amount.js.map
|
|
@@ -0,0 +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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const e=require(`../../../constants.cjs`);function t({environment:t}){return async()=>{if(!(t===e.Environment.PROD||t===e.Environment.TEST))return new Map;let n=t===e.Environment.PROD?Object.values(e.AvalancheMainnetBlockchainChainIds):Object.values(e.AvalancheFujiBlockchainChainIds),r=new Map;return n.forEach(e=>{let t=n.filter(t=>t!==e);r.set(e,new Set(t))}),r}}exports.getSupportedChainsFactory=t;
|
|
2
|
+
//# sourceMappingURL=get-supported-chains.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-supported-chains.cjs","names":["Environment","AvalancheMainnetBlockchainChainIds","AvalancheFujiBlockchainChainIds"],"sources":["../../../../src/transfer-service/avalanche-cct/_handlers/get-supported-chains.ts"],"sourcesContent":["import { AvalancheFujiBlockchainChainIds, AvalancheMainnetBlockchainChainIds, Environment } from '../../../constants';\nimport type { Caip2ChainId } from '../../../types/caip';\nimport type { TransferService } from '../../../types/service';\n\nexport interface GetSupportedChainsOptions {\n environment: Environment;\n}\n\nexport function getSupportedChainsFactory({\n environment,\n}: GetSupportedChainsOptions): TransferService['getSupportedChains'] {\n return async () => {\n if (!(environment === Environment.PROD || environment === Environment.TEST)) {\n return new Map();\n }\n\n const chainIds =\n environment === Environment.PROD\n ? Object.values(AvalancheMainnetBlockchainChainIds)\n : Object.values(AvalancheFujiBlockchainChainIds);\n\n const supportedChainsMap = new Map<Caip2ChainId, Set<Caip2ChainId>>();\n\n chainIds.forEach((chainId) => {\n const otherChainIds = chainIds.filter((id) => id !== chainId);\n supportedChainsMap.set(chainId, new Set(otherChainIds));\n });\n\n return supportedChainsMap;\n };\n}\n"],"mappings":"0CAQA,SAAgB,EAA0B,CACxC,eACmE,CACnE,OAAO,SAAY,CACjB,GAAI,EAAE,IAAgBA,EAAAA,YAAY,MAAQ,IAAgBA,EAAAA,YAAY,MACpE,OAAO,IAAI,IAGb,IAAM,EACJ,IAAgBA,EAAAA,YAAY,KACxB,OAAO,OAAOC,EAAAA,mCAAmC,CACjD,OAAO,OAAOC,EAAAA,gCAAgC,CAE9C,EAAqB,IAAI,IAO/B,OALA,EAAS,QAAS,GAAY,CAC5B,IAAM,EAAgB,EAAS,OAAQ,GAAO,IAAO,EAAQ,CAC7D,EAAmB,IAAI,EAAS,IAAI,IAAI,EAAc,CAAC,EACvD,CAEK"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{AvalancheFujiBlockchainChainIds as e,AvalancheMainnetBlockchainChainIds as t,Environment as n}from"../../../constants.js";function r({environment:r}){return async()=>{if(!(r===n.PROD||r===n.TEST))return new Map;let i=r===n.PROD?Object.values(t):Object.values(e),a=new Map;return i.forEach(e=>{let t=i.filter(t=>t!==e);a.set(e,new Set(t))}),a}}export{r as getSupportedChainsFactory};
|
|
2
|
+
//# sourceMappingURL=get-supported-chains.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-supported-chains.js","names":[],"sources":["../../../../src/transfer-service/avalanche-cct/_handlers/get-supported-chains.ts"],"sourcesContent":["import { AvalancheFujiBlockchainChainIds, AvalancheMainnetBlockchainChainIds, Environment } from '../../../constants';\nimport type { Caip2ChainId } from '../../../types/caip';\nimport type { TransferService } from '../../../types/service';\n\nexport interface GetSupportedChainsOptions {\n environment: Environment;\n}\n\nexport function getSupportedChainsFactory({\n environment,\n}: GetSupportedChainsOptions): TransferService['getSupportedChains'] {\n return async () => {\n if (!(environment === Environment.PROD || environment === Environment.TEST)) {\n return new Map();\n }\n\n const chainIds =\n environment === Environment.PROD\n ? Object.values(AvalancheMainnetBlockchainChainIds)\n : Object.values(AvalancheFujiBlockchainChainIds);\n\n const supportedChainsMap = new Map<Caip2ChainId, Set<Caip2ChainId>>();\n\n chainIds.forEach((chainId) => {\n const otherChainIds = chainIds.filter((id) => id !== chainId);\n supportedChainsMap.set(chainId, new Set(otherChainIds));\n });\n\n return supportedChainsMap;\n };\n}\n"],"mappings":"iIAQA,SAAgB,EAA0B,CACxC,eACmE,CACnE,OAAO,SAAY,CACjB,GAAI,EAAE,IAAgB,EAAY,MAAQ,IAAgB,EAAY,MACpE,OAAO,IAAI,IAGb,IAAM,EACJ,IAAgB,EAAY,KACxB,OAAO,OAAO,EAAmC,CACjD,OAAO,OAAO,EAAgC,CAE9C,EAAqB,IAAI,IAO/B,OALA,EAAS,QAAS,GAAY,CAC5B,IAAM,EAAgB,EAAS,OAAQ,GAAO,IAAO,EAAQ,CAC7D,EAAmB,IAAI,EAAS,IAAI,IAAI,EAAc,CAAC,EACvD,CAEK"}
|
|
@@ -0,0 +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;
|
|
2
|
+
//# sourceMappingURL=stream-quotes.cjs.map
|
|
@@ -0,0 +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":"kPA2BA,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,IAAgBA,EAAAA,YAAY,MAAQ,IAAgBA,EAAAA,YAAY,KAMlE,OALK,EAAG,OAAO,UACb,EAAQ,QAAS,IAAIC,EAAAA,mBAAmB,qDAAqD,CAAC,CAC9F,EAAQ,OAAO,EAGV,CAAE,SAAQ,CAGnB,IAAM,EAAY,IAAgBD,EAAAA,YAAY,KAExC,EAAc,EAAM,YACpB,EAAY,EAAM,UAClB,EAAW,EAAYE,EAAAA,gCAAgC,EAAIC,EAAAA,mCAAmC,EAC9F,EAAiB,EAAM,YAAY,UAAY,EAC/C,EAAiB,EAAM,YAAY,UAAY,EAE/C,EAAqB,GAAA,EAAA,EAAA,WACb,EAAY,CACtBC,EAAAA,sBAAsB,EAAY,EAAIC,EAAAA,wBAAwB,EAAa,EAAU,CAEnF,EAAmB,GAAA,EAAA,EAAA,WACX,EAAU,CACpBD,EAAAA,sBAAsB,EAAU,EAAIC,EAAAA,wBAAwB,EAAW,EAAU,CAErF,GAAI,CAAC,GAAsB,CAAC,EAY1B,OAXK,EAAG,OAAO,UACb,EACE,QACA,IAAIJ,EAAAA,mBACF,kEACA,oIACD,CACF,CACD,EAAQ,OAAO,EAGV,CACL,SACD,CAIH,IAAM,EAAiB,GAAkB,EAkHzC,OAhHI,GAAkB,IAAgB,GAC/B,EAAG,OAAO,UACb,EACE,QACA,IAAIA,EAAAA,mBAAmB,wEAAwE,CAChG,CACD,EAAQ,OAAO,EAGV,CAAE,SAAQ,EAGf,CAAC,GAAkB,IAAgB,GAChC,EAAG,OAAO,UACb,EAAQ,QAAS,IAAIA,EAAAA,mBAAmB,gEAAgE,CAAC,CACzG,EAAQ,OAAO,EAGV,CAAE,SAAQ,IAGlB,SAAY,CACX,IAAM,EAA6CK,EAAAA,cAAc,EAAM,YAAY,QAAS,EAAU,CAChG,EAAkDA,EAAAA,cAAc,EAAM,YAAY,QAAS,EAAU,CAGrG,GAFgB,MAAM,EAAe,EAAuB,EAAiB,EACjD,UAAU,CACD,QAAQ,EAAO,IAGjD,EAFUC,EAAAA,MAAM,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,EAAUC,EAAAA,4BAA4B,EAAiB,CACvD,EAAWA,EAAAA,4BAA4B,EAAsB,CAC7D,EAAWC,EAAAA,+BAA+B,CAC9C,SAAU,EAAM,OAChB,YAAa,EACb,YAAa,EACd,CAAC,CAIF,GAAI,IAAa,GAAI,CACd,EAAG,OAAO,SACb,EAAQ,OAAO,CAGjB,OAKF,IAAM,EAA2BA,EAAAA,+BAA+B,CAC9D,SAAU,EACV,YAAaD,EAAAA,4BAA4B,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,YAAaE,EAAAA,YAAY,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,IAAIC,EAAAA,SAASC,EAAAA,YAAY,QAASC,EAAAA,UAAU,QAAS,CAAE,MAAO,EAAO,QAAS,0BAA2B,CAAC,CAC3G,CACD,EAAQ,OAAO,GAEjB,CAEK,CACL,SACD"}
|
|
@@ -0,0 +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};
|
|
2
|
+
//# sourceMappingURL=stream-quotes.js.map
|
|
@@ -0,0 +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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const e=require(`../../../errors.cjs`),t=require(`../_utils.cjs`),n=require(`../../_utils.cjs`),r=require(`../_utils/polling.cjs`);function i({environment:e}){return({transfer:t,updateListener:r})=>{let i=new AbortController,s=()=>{i.abort()};return t.status===`completed`||t.status===`failed`?{cancel:s,result:Promise.resolve(t)}:{cancel:s,result:(async()=>{let s=structuredClone(t);for(;!i.signal.aborted;){let t=s.status;switch(s.status){case`source-pending`:s=await a({currentTransfer:s,environment:e}),i.signal.aborted||r(s);break;case`target-pending`:s=await o({currentTransfer:s,environment:e}),i.signal.aborted||r(s);break;default:return s}s.status===t&&await n.waitForTimeoutOrAbort({timeoutMs:1500,signal:i.signal})}return s})()}}}async function a({currentTransfer:n,environment:i}){let a=t.getEnvironmentIsTestnet(i),o=t.getChainAlias(n.sourceChain.chainId,a);try{return await r.pollPrimaryNetworkTxStatus({chainAlias:o,environment:i,txId:n.source.txHash})?{...n,source:{...n.source,confirmationCount:n.source.requiredConfirmationCount},status:`source-completed`}:{...n,errorCode:e.ErrorCode.TRANSACTION_REVERTED,errorReason:`Source transaction was rejected by Avalanche.`,failedAtMs:Date.now(),status:`failed`}}catch{return n}}async function o({currentTransfer:n,environment:i}){if(!n.target?.txHash)return{...n,errorCode:e.ErrorCode.INVALID_PARAMS,errorReason:`Missing target transaction hash.`,failedAtMs:Date.now(),status:`failed`};let a=t.getEnvironmentIsTestnet(i),o=t.getChainAlias(n.targetChain.chainId,a);try{if(!await r.pollPrimaryNetworkTxStatus({chainAlias:o,environment:i,txId:n.target.txHash}))return{...n,errorCode:e.ErrorCode.TRANSACTION_REVERTED,errorReason:`Target transaction was rejected by Avalanche.`,failedAtMs:Date.now(),status:`failed`};let t=n.source.txHash===n.target.txHash;return{...n,completedAtMs:Date.now(),source:{...n.source,confirmationCount:t?n.source.requiredConfirmationCount:n.source.confirmationCount},status:`completed`,target:{...n.target,confirmationCount:n.target.requiredConfirmationCount}}}catch{return n}}exports.trackTransferFactory=i;
|
|
2
|
+
//# sourceMappingURL=track-transfer.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"track-transfer.cjs","names":["waitForTimeoutOrAbort","getEnvironmentIsTestnet","getChainAlias","pollPrimaryNetworkTxStatus","ErrorCode"],"sources":["../../../../src/transfer-service/avalanche-cct/_handlers/track-transfer.ts"],"sourcesContent":["import { ErrorCode } from '../../../errors';\nimport type { TransferService } from '../../../types/service';\nimport type {\n CompletedTransfer,\n FailedTransfer,\n SourceCompletedTransfer,\n SourcePendingTransfer,\n TargetPendingTransfer,\n Transfer,\n} from '../../../types/transfer';\nimport { waitForTimeoutOrAbort } from '../../_utils';\nimport { getChainAlias, getEnvironmentIsTestnet } from '../_utils';\nimport { pollPrimaryNetworkTxStatus } from '../_utils/polling';\n\nconst TRACKING_POLL_INTERVAL_MS = 1_500;\n\nexport interface TrackTransferFactoryOptions {\n environment: Parameters<typeof pollPrimaryNetworkTxStatus>[0]['environment'];\n}\n\nexport function trackTransferFactory({ environment }: TrackTransferFactoryOptions): TransferService['trackTransfer'] {\n return ({ transfer, updateListener }) => {\n const ac = new AbortController();\n const cancel = () => {\n ac.abort();\n };\n\n if (transfer.status === 'completed' || transfer.status === 'failed') {\n return {\n cancel,\n result: Promise.resolve(transfer),\n };\n }\n\n const executeTracking = async (): Promise<Transfer> => {\n let currentTransfer: Transfer = structuredClone(transfer);\n\n while (!ac.signal.aborted) {\n const statusBeforeTracking = currentTransfer.status;\n\n switch (currentTransfer.status) {\n case 'source-pending': {\n currentTransfer = await _trackSourceTx({ currentTransfer, environment });\n\n if (!ac.signal.aborted) {\n updateListener(currentTransfer);\n }\n\n break;\n }\n case 'target-pending': {\n currentTransfer = await _trackTargetTx({ currentTransfer, environment });\n\n if (!ac.signal.aborted) {\n updateListener(currentTransfer);\n }\n\n break;\n }\n default: {\n return currentTransfer;\n }\n }\n\n const hasStatusChanged = currentTransfer.status !== statusBeforeTracking;\n\n if (!hasStatusChanged) {\n await waitForTimeoutOrAbort({ timeoutMs: TRACKING_POLL_INTERVAL_MS, signal: ac.signal });\n }\n }\n\n return currentTransfer;\n };\n\n return {\n cancel,\n result: executeTracking(),\n };\n };\n}\n\nexport async function _trackSourceTx({\n currentTransfer,\n environment,\n}: {\n currentTransfer: SourcePendingTransfer;\n environment: Parameters<typeof pollPrimaryNetworkTxStatus>[0]['environment'];\n}): Promise<SourcePendingTransfer | SourceCompletedTransfer | FailedTransfer> {\n const isTestnet = getEnvironmentIsTestnet(environment);\n const sourceChainAlias = getChainAlias(currentTransfer.sourceChain.chainId, isTestnet);\n\n try {\n const didSucceed = await pollPrimaryNetworkTxStatus({\n chainAlias: sourceChainAlias,\n environment,\n txId: currentTransfer.source.txHash,\n });\n\n if (!didSucceed) {\n return {\n ...currentTransfer,\n errorCode: ErrorCode.TRANSACTION_REVERTED,\n errorReason: 'Source transaction was rejected by Avalanche.',\n failedAtMs: Date.now(),\n status: 'failed',\n } satisfies FailedTransfer;\n }\n\n return {\n ...currentTransfer,\n source: {\n ...currentTransfer.source,\n confirmationCount: currentTransfer.source.requiredConfirmationCount,\n },\n status: 'source-completed',\n } satisfies SourceCompletedTransfer;\n } catch {\n return currentTransfer;\n }\n}\n\nexport async function _trackTargetTx({\n currentTransfer,\n environment,\n}: {\n currentTransfer: TargetPendingTransfer;\n environment: Parameters<typeof pollPrimaryNetworkTxStatus>[0]['environment'];\n}): Promise<TargetPendingTransfer | CompletedTransfer | FailedTransfer> {\n if (!currentTransfer.target?.txHash) {\n return {\n ...currentTransfer,\n errorCode: ErrorCode.INVALID_PARAMS,\n errorReason: 'Missing target transaction hash.',\n failedAtMs: Date.now(),\n status: 'failed',\n } satisfies FailedTransfer;\n }\n\n const isTestnet = getEnvironmentIsTestnet(environment);\n const destinationChainAlias = getChainAlias(currentTransfer.targetChain.chainId, isTestnet);\n\n try {\n const didSucceed = await pollPrimaryNetworkTxStatus({\n chainAlias: destinationChainAlias,\n environment,\n txId: currentTransfer.target.txHash,\n });\n\n if (!didSucceed) {\n return {\n ...currentTransfer,\n errorCode: ErrorCode.TRANSACTION_REVERTED,\n errorReason: 'Target transaction was rejected by Avalanche.',\n failedAtMs: Date.now(),\n status: 'failed',\n } satisfies FailedTransfer;\n }\n\n const isImportOnlyFlow = currentTransfer.source.txHash === currentTransfer.target.txHash;\n\n return {\n ...currentTransfer,\n completedAtMs: Date.now(),\n source: {\n ...currentTransfer.source,\n confirmationCount: isImportOnlyFlow\n ? currentTransfer.source.requiredConfirmationCount\n : currentTransfer.source.confirmationCount,\n },\n status: 'completed',\n target: {\n ...currentTransfer.target,\n confirmationCount: currentTransfer.target.requiredConfirmationCount,\n },\n } satisfies CompletedTransfer;\n } catch {\n return currentTransfer;\n }\n}\n"],"mappings":"mIAoBA,SAAgB,EAAqB,CAAE,eAA8E,CACnH,OAAQ,CAAE,WAAU,oBAAqB,CACvC,IAAM,EAAK,IAAI,gBACT,MAAe,CACnB,EAAG,OAAO,EAkDZ,OA/CI,EAAS,SAAW,aAAe,EAAS,SAAW,SAClD,CACL,SACA,OAAQ,QAAQ,QAAQ,EAAS,CAClC,CA2CI,CACL,SACA,QA1CsB,SAA+B,CACrD,IAAI,EAA4B,gBAAgB,EAAS,CAEzD,KAAO,CAAC,EAAG,OAAO,SAAS,CACzB,IAAM,EAAuB,EAAgB,OAE7C,OAAQ,EAAgB,OAAxB,CACE,IAAK,iBACH,EAAkB,MAAM,EAAe,CAAE,kBAAiB,cAAa,CAAC,CAEnE,EAAG,OAAO,SACb,EAAe,EAAgB,CAGjC,MAEF,IAAK,iBACH,EAAkB,MAAM,EAAe,CAAE,kBAAiB,cAAa,CAAC,CAEnE,EAAG,OAAO,SACb,EAAe,EAAgB,CAGjC,MAEF,QACE,OAAO,EAIc,EAAgB,SAAW,GAGlD,MAAMA,EAAAA,sBAAsB,CAAE,UAAW,KAA2B,OAAQ,EAAG,OAAQ,CAAC,CAI5F,OAAO,KAKkB,CAC1B,EAIL,eAAsB,EAAe,CACnC,kBACA,eAI4E,CAC5E,IAAM,EAAYC,EAAAA,wBAAwB,EAAY,CAChD,EAAmBC,EAAAA,cAAc,EAAgB,YAAY,QAAS,EAAU,CAEtF,GAAI,CAiBF,OAhBmB,MAAMC,EAAAA,2BAA2B,CAClD,WAAY,EACZ,cACA,KAAM,EAAgB,OAAO,OAC9B,CAAC,CAYK,CACL,GAAG,EACH,OAAQ,CACN,GAAG,EAAgB,OACnB,kBAAmB,EAAgB,OAAO,0BAC3C,CACD,OAAQ,mBACT,CAhBQ,CACL,GAAG,EACH,UAAWC,EAAAA,UAAU,qBACrB,YAAa,gDACb,WAAY,KAAK,KAAK,CACtB,OAAQ,SACT,MAWG,CACN,OAAO,GAIX,eAAsB,EAAe,CACnC,kBACA,eAIsE,CACtE,GAAI,CAAC,EAAgB,QAAQ,OAC3B,MAAO,CACL,GAAG,EACH,UAAWA,EAAAA,UAAU,eACrB,YAAa,mCACb,WAAY,KAAK,KAAK,CACtB,OAAQ,SACT,CAGH,IAAM,EAAYH,EAAAA,wBAAwB,EAAY,CAChD,EAAwBC,EAAAA,cAAc,EAAgB,YAAY,QAAS,EAAU,CAE3F,GAAI,CAOF,GAAI,CANe,MAAMC,EAAAA,2BAA2B,CAClD,WAAY,EACZ,cACA,KAAM,EAAgB,OAAO,OAC9B,CAAC,CAGA,MAAO,CACL,GAAG,EACH,UAAWC,EAAAA,UAAU,qBACrB,YAAa,gDACb,WAAY,KAAK,KAAK,CACtB,OAAQ,SACT,CAGH,IAAM,EAAmB,EAAgB,OAAO,SAAW,EAAgB,OAAO,OAElF,MAAO,CACL,GAAG,EACH,cAAe,KAAK,KAAK,CACzB,OAAQ,CACN,GAAG,EAAgB,OACnB,kBAAmB,EACf,EAAgB,OAAO,0BACvB,EAAgB,OAAO,kBAC5B,CACD,OAAQ,YACR,OAAQ,CACN,GAAG,EAAgB,OACnB,kBAAmB,EAAgB,OAAO,0BAC3C,CACF,MACK,CACN,OAAO"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{ErrorCode as e}from"../../../errors.js";import{getChainAlias as t,getEnvironmentIsTestnet as n}from"../_utils.js";import{waitForTimeoutOrAbort as r}from"../../_utils.js";import{pollPrimaryNetworkTxStatus as i}from"../_utils/polling.js";function a({environment:e}){return({transfer:t,updateListener:n})=>{let i=new AbortController,a=()=>{i.abort()};return t.status===`completed`||t.status===`failed`?{cancel:a,result:Promise.resolve(t)}:{cancel:a,result:(async()=>{let a=structuredClone(t);for(;!i.signal.aborted;){let t=a.status;switch(a.status){case`source-pending`:a=await o({currentTransfer:a,environment:e}),i.signal.aborted||n(a);break;case`target-pending`:a=await s({currentTransfer:a,environment:e}),i.signal.aborted||n(a);break;default:return a}a.status===t&&await r({timeoutMs:1500,signal:i.signal})}return a})()}}}async function o({currentTransfer:r,environment:a}){let o=n(a),s=t(r.sourceChain.chainId,o);try{return await i({chainAlias:s,environment:a,txId:r.source.txHash})?{...r,source:{...r.source,confirmationCount:r.source.requiredConfirmationCount},status:`source-completed`}:{...r,errorCode:e.TRANSACTION_REVERTED,errorReason:`Source transaction was rejected by Avalanche.`,failedAtMs:Date.now(),status:`failed`}}catch{return r}}async function s({currentTransfer:r,environment:a}){if(!r.target?.txHash)return{...r,errorCode:e.INVALID_PARAMS,errorReason:`Missing target transaction hash.`,failedAtMs:Date.now(),status:`failed`};let o=n(a),s=t(r.targetChain.chainId,o);try{if(!await i({chainAlias:s,environment:a,txId:r.target.txHash}))return{...r,errorCode:e.TRANSACTION_REVERTED,errorReason:`Target transaction was rejected by Avalanche.`,failedAtMs:Date.now(),status:`failed`};let t=r.source.txHash===r.target.txHash;return{...r,completedAtMs:Date.now(),source:{...r.source,confirmationCount:t?r.source.requiredConfirmationCount:r.source.confirmationCount},status:`completed`,target:{...r.target,confirmationCount:r.target.requiredConfirmationCount}}}catch{return r}}export{a as trackTransferFactory};
|
|
2
|
+
//# sourceMappingURL=track-transfer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"track-transfer.js","names":[],"sources":["../../../../src/transfer-service/avalanche-cct/_handlers/track-transfer.ts"],"sourcesContent":["import { ErrorCode } from '../../../errors';\nimport type { TransferService } from '../../../types/service';\nimport type {\n CompletedTransfer,\n FailedTransfer,\n SourceCompletedTransfer,\n SourcePendingTransfer,\n TargetPendingTransfer,\n Transfer,\n} from '../../../types/transfer';\nimport { waitForTimeoutOrAbort } from '../../_utils';\nimport { getChainAlias, getEnvironmentIsTestnet } from '../_utils';\nimport { pollPrimaryNetworkTxStatus } from '../_utils/polling';\n\nconst TRACKING_POLL_INTERVAL_MS = 1_500;\n\nexport interface TrackTransferFactoryOptions {\n environment: Parameters<typeof pollPrimaryNetworkTxStatus>[0]['environment'];\n}\n\nexport function trackTransferFactory({ environment }: TrackTransferFactoryOptions): TransferService['trackTransfer'] {\n return ({ transfer, updateListener }) => {\n const ac = new AbortController();\n const cancel = () => {\n ac.abort();\n };\n\n if (transfer.status === 'completed' || transfer.status === 'failed') {\n return {\n cancel,\n result: Promise.resolve(transfer),\n };\n }\n\n const executeTracking = async (): Promise<Transfer> => {\n let currentTransfer: Transfer = structuredClone(transfer);\n\n while (!ac.signal.aborted) {\n const statusBeforeTracking = currentTransfer.status;\n\n switch (currentTransfer.status) {\n case 'source-pending': {\n currentTransfer = await _trackSourceTx({ currentTransfer, environment });\n\n if (!ac.signal.aborted) {\n updateListener(currentTransfer);\n }\n\n break;\n }\n case 'target-pending': {\n currentTransfer = await _trackTargetTx({ currentTransfer, environment });\n\n if (!ac.signal.aborted) {\n updateListener(currentTransfer);\n }\n\n break;\n }\n default: {\n return currentTransfer;\n }\n }\n\n const hasStatusChanged = currentTransfer.status !== statusBeforeTracking;\n\n if (!hasStatusChanged) {\n await waitForTimeoutOrAbort({ timeoutMs: TRACKING_POLL_INTERVAL_MS, signal: ac.signal });\n }\n }\n\n return currentTransfer;\n };\n\n return {\n cancel,\n result: executeTracking(),\n };\n };\n}\n\nexport async function _trackSourceTx({\n currentTransfer,\n environment,\n}: {\n currentTransfer: SourcePendingTransfer;\n environment: Parameters<typeof pollPrimaryNetworkTxStatus>[0]['environment'];\n}): Promise<SourcePendingTransfer | SourceCompletedTransfer | FailedTransfer> {\n const isTestnet = getEnvironmentIsTestnet(environment);\n const sourceChainAlias = getChainAlias(currentTransfer.sourceChain.chainId, isTestnet);\n\n try {\n const didSucceed = await pollPrimaryNetworkTxStatus({\n chainAlias: sourceChainAlias,\n environment,\n txId: currentTransfer.source.txHash,\n });\n\n if (!didSucceed) {\n return {\n ...currentTransfer,\n errorCode: ErrorCode.TRANSACTION_REVERTED,\n errorReason: 'Source transaction was rejected by Avalanche.',\n failedAtMs: Date.now(),\n status: 'failed',\n } satisfies FailedTransfer;\n }\n\n return {\n ...currentTransfer,\n source: {\n ...currentTransfer.source,\n confirmationCount: currentTransfer.source.requiredConfirmationCount,\n },\n status: 'source-completed',\n } satisfies SourceCompletedTransfer;\n } catch {\n return currentTransfer;\n }\n}\n\nexport async function _trackTargetTx({\n currentTransfer,\n environment,\n}: {\n currentTransfer: TargetPendingTransfer;\n environment: Parameters<typeof pollPrimaryNetworkTxStatus>[0]['environment'];\n}): Promise<TargetPendingTransfer | CompletedTransfer | FailedTransfer> {\n if (!currentTransfer.target?.txHash) {\n return {\n ...currentTransfer,\n errorCode: ErrorCode.INVALID_PARAMS,\n errorReason: 'Missing target transaction hash.',\n failedAtMs: Date.now(),\n status: 'failed',\n } satisfies FailedTransfer;\n }\n\n const isTestnet = getEnvironmentIsTestnet(environment);\n const destinationChainAlias = getChainAlias(currentTransfer.targetChain.chainId, isTestnet);\n\n try {\n const didSucceed = await pollPrimaryNetworkTxStatus({\n chainAlias: destinationChainAlias,\n environment,\n txId: currentTransfer.target.txHash,\n });\n\n if (!didSucceed) {\n return {\n ...currentTransfer,\n errorCode: ErrorCode.TRANSACTION_REVERTED,\n errorReason: 'Target transaction was rejected by Avalanche.',\n failedAtMs: Date.now(),\n status: 'failed',\n } satisfies FailedTransfer;\n }\n\n const isImportOnlyFlow = currentTransfer.source.txHash === currentTransfer.target.txHash;\n\n return {\n ...currentTransfer,\n completedAtMs: Date.now(),\n source: {\n ...currentTransfer.source,\n confirmationCount: isImportOnlyFlow\n ? currentTransfer.source.requiredConfirmationCount\n : currentTransfer.source.confirmationCount,\n },\n status: 'completed',\n target: {\n ...currentTransfer.target,\n confirmationCount: currentTransfer.target.requiredConfirmationCount,\n },\n } satisfies CompletedTransfer;\n } catch {\n return currentTransfer;\n }\n}\n"],"mappings":"mPAoBA,SAAgB,EAAqB,CAAE,eAA8E,CACnH,OAAQ,CAAE,WAAU,oBAAqB,CACvC,IAAM,EAAK,IAAI,gBACT,MAAe,CACnB,EAAG,OAAO,EAkDZ,OA/CI,EAAS,SAAW,aAAe,EAAS,SAAW,SAClD,CACL,SACA,OAAQ,QAAQ,QAAQ,EAAS,CAClC,CA2CI,CACL,SACA,QA1CsB,SAA+B,CACrD,IAAI,EAA4B,gBAAgB,EAAS,CAEzD,KAAO,CAAC,EAAG,OAAO,SAAS,CACzB,IAAM,EAAuB,EAAgB,OAE7C,OAAQ,EAAgB,OAAxB,CACE,IAAK,iBACH,EAAkB,MAAM,EAAe,CAAE,kBAAiB,cAAa,CAAC,CAEnE,EAAG,OAAO,SACb,EAAe,EAAgB,CAGjC,MAEF,IAAK,iBACH,EAAkB,MAAM,EAAe,CAAE,kBAAiB,cAAa,CAAC,CAEnE,EAAG,OAAO,SACb,EAAe,EAAgB,CAGjC,MAEF,QACE,OAAO,EAIc,EAAgB,SAAW,GAGlD,MAAM,EAAsB,CAAE,UAAW,KAA2B,OAAQ,EAAG,OAAQ,CAAC,CAI5F,OAAO,KAKkB,CAC1B,EAIL,eAAsB,EAAe,CACnC,kBACA,eAI4E,CAC5E,IAAM,EAAY,EAAwB,EAAY,CAChD,EAAmB,EAAc,EAAgB,YAAY,QAAS,EAAU,CAEtF,GAAI,CAiBF,OAhBmB,MAAM,EAA2B,CAClD,WAAY,EACZ,cACA,KAAM,EAAgB,OAAO,OAC9B,CAAC,CAYK,CACL,GAAG,EACH,OAAQ,CACN,GAAG,EAAgB,OACnB,kBAAmB,EAAgB,OAAO,0BAC3C,CACD,OAAQ,mBACT,CAhBQ,CACL,GAAG,EACH,UAAW,EAAU,qBACrB,YAAa,gDACb,WAAY,KAAK,KAAK,CACtB,OAAQ,SACT,MAWG,CACN,OAAO,GAIX,eAAsB,EAAe,CACnC,kBACA,eAIsE,CACtE,GAAI,CAAC,EAAgB,QAAQ,OAC3B,MAAO,CACL,GAAG,EACH,UAAW,EAAU,eACrB,YAAa,mCACb,WAAY,KAAK,KAAK,CACtB,OAAQ,SACT,CAGH,IAAM,EAAY,EAAwB,EAAY,CAChD,EAAwB,EAAc,EAAgB,YAAY,QAAS,EAAU,CAE3F,GAAI,CAOF,GAAI,CANe,MAAM,EAA2B,CAClD,WAAY,EACZ,cACA,KAAM,EAAgB,OAAO,OAC9B,CAAC,CAGA,MAAO,CACL,GAAG,EACH,UAAW,EAAU,qBACrB,YAAa,gDACb,WAAY,KAAK,KAAK,CACtB,OAAQ,SACT,CAGH,IAAM,EAAmB,EAAgB,OAAO,SAAW,EAAgB,OAAO,OAElF,MAAO,CACL,GAAG,EACH,cAAe,KAAK,KAAK,CACzB,OAAQ,CACN,GAAG,EAAgB,OACnB,kBAAmB,EACf,EAAgB,OAAO,0BACvB,EAAgB,OAAO,kBAC5B,CACD,OAAQ,YACR,OAAQ,CACN,GAAG,EAAgB,OACnB,kBAAmB,EAAgB,OAAO,0BAC3C,CACF,MACK,CACN,OAAO"}
|
|
@@ -0,0 +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;
|
|
2
|
+
//# sourceMappingURL=transfer-asset.cjs.map
|
|
@@ -0,0 +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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"}
|
|
@@ -0,0 +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};
|
|
2
|
+
//# sourceMappingURL=transfer-asset.js.map
|
|
@@ -0,0 +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":"m5BAgDA,SAAgB,EAAqB,CACnC,aACA,kBACA,cACA,oBACA,iBACA,WACA,kCACA,uCACgE,CAChE,OAAO,MAAO,CAAE,eAAc,WAAY,CACxC,GAAI,EAAM,cAAgB,EAAY,cACpC,MAAM,IAAI,EAAS,EAAY,4BAA6B,EAAU,eAAe,CAGvF,IAAM,EAAY,EAAwB,EAAY,CAChD,EAA6C,EAAc,EAAM,YAAY,QAAS,EAAU,CAChG,EAAkD,EAAc,EAAM,YAAY,QAAS,EAAU,CACrG,EAAuB,EAAwB,EAAM,YAAa,EAAiB,CACnF,EAA4B,IAAqB,IAAM,IAAA,GAAY,EAAgB,EAAM,YAAY,CACrG,EAAkB,MAAM,EAAmB,CAC/C,wBACA,oBACA,eAAgB,EAAM,UACvB,CAAC,CACI,EAAkB,EAAmB,EAAM,UAAW,EAAsB,CAC5E,EACJ,IAA0B,IAAM,EAAkB,EAAgB,EAAM,UAAU,CAE9E,EAAY,EAAM,SAAW,GAC7B,EAAqB,EAAY,EAAI,EACrC,EAAc,KAAK,KAAK,CACxB,EAAe,EAAgB,EAAO,EAAY,CAEpD,EAEJ,GAAI,EAAW,CACb,IAAe,CACb,iBAAkB,EAClB,uBAAwB,EAAwB,0BAChD,QACA,qBACD,CAAC,CAEF,IAAM,EAAmB,MAAM,MAE3B,EAAc,CACZ,aACA,cACA,WACA,kCACA,sCACA,cAAe,EAAM,SACrB,mBACA,wBACA,YAAa,EACb,oBAAqB,EACrB,UAAW,EACZ,CAAC,CACH,GAAU,IAAI,EAAS,gDAAiD,EAAU,QAAS,CAAE,MAAO,EAAO,CAAC,CAC9G,CAED,EAAa,MAAM,MACX,EAAgB,EAAkB,SAAU,EAAiB,CAClE,GACC,IAAI,EAAS,oDAAqD,EAAU,eAAgB,CAC1F,MAAO,EACR,CAAC,CACL,CAED,IAAI,EACJ,GAAI,CACF,EAAmB,MAAM,EAA2B,CAClD,WAAY,EACZ,cACA,KAAM,EACP,CAAC,MACI,CACN,OAAO,EAA+B,EAAO,CAC3C,cACA,0BAA2B,EAC3B,cACA,OAAQ,EACT,CAAC,CAGJ,GAAI,CAAC,EACH,OAAO,EAAoB,CACzB,UAAW,EAAU,qBACrB,YAAa,oDACb,kBAAmB,EACnB,aAAc,EACd,eACD,CAAC,CAIN,IAAM,EAAc,MAAM,EACxB,UAAa,MAAM,EAAe,EAAuB,EAAiB,EAAE,UAAU,CACrF,GAAU,IAAI,EAAS,0CAA2C,EAAU,QAAS,CAAE,MAAO,EAAO,CAAC,CACxG,CAED,GAAI,EAAY,SAAW,EACzB,OAAO,EAAoB,CACzB,UAAW,EAAU,eACrB,YAAa,sDACb,kBAAmB,EACnB,aAAc,EACd,eACD,CAAC,CAGJ,IAAe,CACb,iBAAkB,EAAY,EAAI,EAClC,uBAAwB,EAAwB,0BAChD,QACA,qBACD,CAAC,CAEF,IAAM,EAAmB,MAAM,MAE3B,EAAc,CACZ,aACA,cACA,wBACA,cACA,kCACA,sCACA,mBACA,oBAAqB,EACrB,UAAW,EACZ,CAAC,CACH,GAAU,IAAI,EAAS,gDAAiD,EAAU,QAAS,CAAE,MAAO,EAAO,CAAC,CAC9G,CAEK,EAAa,MAAM,MACjB,EAAgB,EAAkB,SAAU,EAAsB,CACvE,GACC,IAAI,EAAS,oDAAqD,EAAU,eAAgB,CAC1F,MAAO,EACR,CAAC,CACL,CAED,MAAO,CACL,GAAG,EACH,OAAQ,CACN,kBAAmB,EAAa,EAAI,EACpC,0BAA2B,EAC3B,cACA,OAAQ,GAAc,EACvB,CACD,OAAQ,iBACR,OAAQ,CACN,kBAAmB,EACnB,0BAA2B,EAC3B,YAAa,KAAK,KAAK,CACvB,OAAQ,EACT,CACF,EAIL,SAAS,EACP,EACA,EAC8B,CAC9B,MAAO,CACL,SAAU,EAAM,SAChB,UAAW,EAAM,UACjB,cACA,KAAM,EAAM,KACZ,YAAa,EAAM,YACnB,GAAI,EAAM,GACV,cAAe,EAAM,cACrB,YAAa,EAAM,QACnB,YAAa,EAAM,YACnB,YAAa,EAAM,SACnB,YAAa,EAAM,YACnB,UAAW,EAAM,UACjB,KAAM,EAAM,YACb,CAGH,SAAS,EAAoB,CAC3B,YACA,cACA,oBACA,eACA,gBAOiB,CACjB,MAAO,CACL,GAAG,EACH,YACA,cACA,WAAY,KAAK,KAAK,CACtB,GAAI,EACA,CACE,OAAQ,CACN,kBAAmB,EACnB,0BAA2B,EAC3B,YAAa,EACb,OAAQ,EACT,CACF,CACD,EAAE,CACN,OAAQ,SACT,CAGH,eAAe,EAAc,CAC3B,aACA,wBACA,cACA,cACA,WACA,kCACA,sCACA,gBACA,sBACA,mBACA,aAaC,CACD,OAAQ,EAAR,CACE,IAAK,IAAK,CACR,GAAI,IAA0B,IAC5B,MAAM,IAAI,EAAmB,0DAA0D,CAGzF,GAAI,CAAC,EACH,MAAM,IAAI,EAAmB,kEAAkE,CAIjG,IAAM,EAAe,EAAqB,CAAE,MAD7B,IAAgB,EAAY,KAAO,EAAuB,EACd,CAAC,CACtD,CAAC,EAAO,GAAqB,MAAM,QAAQ,IAAI,CACnD,EAAa,oBAAoB,CAC/B,QAAS,EACV,CAAC,CACF,EAA2B,EAAY,CACxC,CAAC,CAEF,OAAO,EAAS,CACd,iBAAkB,EAClB,oBACA,QAAS,EACT,wBACA,cACA,MAAO,OAAO,EAAM,CACpB,mBACA,YACD,CAAC,CAGJ,IAAK,IAAK,CACR,GAAI,IAA0B,IAC5B,MAAM,IAAI,EAAmB,0DAA0D,CAGzF,GAAM,CAAC,EAAe,EAAU,EAAe,GAAY,MAAM,QAAQ,IAAI,CAC3E,EAAuB,CACrB,WAAY,EACZ,sCACD,CAAC,CACF,EAAY,EAAY,CACxB,EAAuB,CACrB,WAAY,EACZ,kCACA,gBAAiB,EAClB,CAAC,CACF,EAAS,IAAI,CACd,CAAC,CAEF,OAAO,EAAS,CACd,iBAAkB,EAClB,gBACA,QAAS,EACT,wBACA,WACA,gBACA,mBACA,YACA,MAAO,EAAS,UAAU,CAC3B,CAAC,CAGJ,IAAK,IAAK,CACR,GAAI,IAA0B,IAC5B,MAAM,IAAI,EAAmB,0DAA0D,CAGzF,GAAM,CAAC,EAAe,EAAe,GAAY,MAAM,QAAQ,IAAI,CACjE,EAAuB,CACrB,WAAY,EACZ,sCACD,CAAC,CACF,EAAuB,CACrB,WAAY,EACZ,kCACA,gBAAiB,EAClB,CAAC,CACF,EAAS,IAAI,CACd,CAAC,CAEF,OAAO,EAAS,CACd,iBAAkB,EAClB,gBACA,QAAS,EACT,wBACA,gBACA,mBACA,YACA,MAAO,EAAS,UAAU,CAC3B,CAAC,GAKR,eAAe,EAAc,CAC3B,aACA,cACA,wBACA,cACA,kCACA,sCACA,sBACA,mBACA,aAWC,CACD,OAAQ,EAAR,CACE,IAAK,IAAK,CACR,GAAI,IAAqB,IACvB,MAAM,IAAI,EAAmB,0DAA0D,CAGzF,GAAM,CAAC,EAAmB,GAAiB,MAAM,QAAQ,IAAI,CAC3D,EAA2B,EAAY,CACvC,EAAuB,CACrB,WAAY,EACZ,kCACA,gBAAiB,EAClB,CAAC,CACH,CAAC,CAEF,OAAO,EAAS,CACd,cACA,oBACA,QAAS,EACT,wBACA,gBACA,mBACA,UAAW,EAAmB,EAAW,IAAI,CAC9C,CAAC,CAGJ,IAAK,IAAK,CACR,GAAI,IAAqB,IACvB,MAAM,IAAI,EAAmB,0DAA0D,CAGzF,GAAM,CAAC,EAAU,GAAiB,MAAM,QAAQ,IAAI,CAClD,EAAY,EAAY,CACxB,EAAuB,CACrB,WAAY,EACZ,kCACA,gBAAiB,EAClB,CAAC,CACH,CAAC,CAEF,OAAO,EAAS,CACd,cACA,QAAS,EACT,wBACA,WACA,gBACA,mBACA,UAAW,EAAmB,EAAW,IAAI,CAC9C,CAAC,CAGJ,IAAK,IAAK,CACR,GAAI,IAAqB,IACvB,MAAM,IAAI,EAAmB,0DAA0D,CAGzF,GAAM,CAAC,EAAe,GAAiB,MAAM,QAAQ,IAAI,CACvD,EAAuB,CACrB,WAAY,EACZ,sCACD,CAAC,CACF,EAAuB,CACrB,WAAY,EACZ,kCACA,gBAAiB,EAClB,CAAC,CACH,CAAC,CAEF,OAAO,EAAS,CACd,cACA,gBACA,QAAS,EACT,wBACA,gBACA,mBACA,UAAW,EAAmB,EAAW,IAAI,CAC9C,CAAC"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
require(`../../_virtual/_rolldown/runtime.cjs`);const e=require(`./_utils.cjs`);let t=require(`@avalabs/avalanchejs`);function n(n){let r=e.stripAddressPrefix(n);try{return t.utils.parseBech32(r),!0}catch{return!1}}exports.isXpAddressFullyValid=n;
|
|
2
|
+
//# sourceMappingURL=_type-guards.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"_type-guards.cjs","names":["stripAddressPrefix"],"sources":["../../../src/transfer-service/avalanche-cct/_type-guards.ts"],"sourcesContent":["import { utils } from '@avalabs/avalanchejs';\nimport type { XpAddress } from './types';\nimport { stripAddressPrefix } from './_utils';\n\nexport function isXpAddressFullyValid(address: string): address is XpAddress {\n const addressBody = stripAddressPrefix(address);\n try {\n utils.parseBech32(addressBody);\n\n return true;\n } catch {\n return false;\n }\n}\n"],"mappings":"sHAIA,SAAgB,EAAsB,EAAuC,CAC3E,IAAM,EAAcA,EAAAA,mBAAmB,EAAQ,CAC/C,GAAI,CAGF,OAFA,EAAA,MAAM,YAAY,EAAY,CAEvB,QACD,CACN,MAAO"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"_type-guards.js","names":[],"sources":["../../../src/transfer-service/avalanche-cct/_type-guards.ts"],"sourcesContent":["import { utils } from '@avalabs/avalanchejs';\nimport type { XpAddress } from './types';\nimport { stripAddressPrefix } from './_utils';\n\nexport function isXpAddressFullyValid(address: string): address is XpAddress {\n const addressBody = stripAddressPrefix(address);\n try {\n utils.parseBech32(addressBody);\n\n return true;\n } catch {\n return false;\n }\n}\n"],"mappings":"8FAIA,SAAgB,EAAsB,EAAuC,CAC3E,IAAM,EAAc,EAAmB,EAAQ,CAC/C,GAAI,CAGF,OAFA,EAAM,YAAY,EAAY,CAEvB,QACD,CACN,MAAO"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
require(`../../../_virtual/_rolldown/runtime.cjs`);const e=require(`../../../errors.cjs`),t=require(`../_type-guards.cjs`);let n=require(`viem`);function r(r,i){if(i!==`C`){if(!t.isXpAddressFullyValid(r))throw new e.InvalidParamsError(`fromAddress must be a valid XpAddress when source chain is P or X.`);return null}if(!(0,n.isAddress)(r))throw new e.InvalidParamsError(`fromAddress must be a valid EVM address when exporting from C-Chain.`);return(0,n.getAddress)(r)}async function i({destinationChainAlias:r,getCoreEthAddress:i,quoteToAddress:a}){if(r!==`C`){if(!t.isXpAddressFullyValid(a))throw new e.InvalidParamsError(`toAddress must be a valid XpAddress when destination chain is P or X.`);return a}if(!(0,n.isAddress)(a))throw new e.InvalidParamsError(`toAddress must be a valid EVM address when importing to C-Chain.`);let o=await i(a);if(!t.isXpAddressFullyValid(o))throw new e.InvalidParamsError(`getCoreEthAddress callback returned an invalid Coreth bech32 address.`);return o}function a(r,i){if(i===`C`){if(!(0,n.isAddress)(r))throw new e.InvalidParamsError(`toAddress must be a valid EVM address when importing to C-Chain.`);return(0,n.getAddress)(r)}if(!t.isXpAddressFullyValid(r))throw new e.InvalidParamsError(`toAddress must be a valid XpAddress when importing to P or X chain.`);return r}function o(n){if(!t.isXpAddressFullyValid(n))throw new e.InvalidParamsError(`Address must be a valid XpAddress.`);return n}async function s({chainAlias:n,getWalletAddressesForChainAlias:r,requiredAddress:i}){let a=(await r(n)).filter(t.isXpAddressFullyValid);if(a.length===0)throw new e.InvalidParamsError(`No wallet addresses available for chain alias ${n}.`);if(i&&!a.includes(i))throw new e.InvalidParamsError(`Required address is not controlled by the wallet for chain alias ${n}.`,`Expected ${i} to be present in getWalletAddressesForChainAlias(${n}) result.`);return a}async function c({chainAlias:n,getWalletChangeAddressForChainAlias:r}){let i=await r(n);if(!t.isXpAddressFullyValid(i))throw new e.InvalidParamsError(`Change address for chain alias ${n} must be a valid XpAddress.`);return i}exports.assertXpAddress=o,exports.getExportFromAddressEvm=r,exports.getExportToAddress=i,exports.getImportToAddress=a,exports.getWalletChangeAddress=c,exports.getWalletFromAddresses=s;
|
|
2
|
+
//# sourceMappingURL=addresses.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"addresses.cjs","names":["isXpAddressFullyValid","InvalidParamsError"],"sources":["../../../../src/transfer-service/avalanche-cct/_utils/addresses.ts"],"sourcesContent":["import { getAddress, isAddress, type Address as EvmAddress } from 'viem';\nimport type { AvalancheBlockchainAlias } from '../../../constants';\nimport { InvalidParamsError } from '../../../errors';\nimport { isXpAddressFullyValid } from '../_type-guards';\nimport type {\n GetCoreEthAddressCallback,\n GetWalletAddressesForChainAliasCallback,\n GetWalletChangeAddressForChainAliasCallback,\n XpAddress,\n} from '../types';\n\n/**\n * Validates the source quote address for export and normalizes C-Chain addresses.\n *\n * For C-Chain exports, returns a checksummed EVM address.\n * For P/X exports, validates that the address is a fully valid XP address and returns null,\n * because P/X exports do not use an EVM sender.\n *\n * @param fromAddress - Quote source address.\n * @param sourceChainAlias - Avalanche chain alias used as the export source.\n * @returns A normalized EVM address for C-Chain exports, otherwise null.\n * @throws InvalidParamsError If the address format is invalid for the selected source chain.\n */\nexport function getExportFromAddressEvm(\n fromAddress: string,\n sourceChainAlias: AvalancheBlockchainAlias,\n): EvmAddress | null {\n if (sourceChainAlias !== 'C') {\n if (!isXpAddressFullyValid(fromAddress)) {\n throw new InvalidParamsError('fromAddress must be a valid XpAddress when source chain is P or X.');\n }\n\n return null;\n }\n\n if (!isAddress(fromAddress)) {\n throw new InvalidParamsError('fromAddress must be a valid EVM address when exporting from C-Chain.');\n }\n\n return getAddress(fromAddress);\n}\n\n/**\n * Resolves the export destination as an XP address.\n *\n * For P/X destinations, the quote destination must already be a valid XP address.\n * For C-Chain destinations, the quote destination must be an EVM address and is converted\n * to a Coreth bech32 address through the provided callback.\n *\n * @param options - Address resolution inputs.\n * @param options.destinationChainAlias - Avalanche chain alias used as the export destination.\n * @param options.getCoreEthAddress - Callback that maps an EVM address to a Coreth bech32 address.\n * @param options.quoteToAddress - Quote destination address.\n * @returns A validated XP address used as export destination.\n * @throws InvalidParamsError If input addresses or callback output are invalid.\n */\nexport async function getExportToAddress({\n destinationChainAlias,\n getCoreEthAddress,\n quoteToAddress,\n}: {\n destinationChainAlias: AvalancheBlockchainAlias;\n getCoreEthAddress: GetCoreEthAddressCallback;\n quoteToAddress: string;\n}): Promise<XpAddress> {\n if (destinationChainAlias !== 'C') {\n if (!isXpAddressFullyValid(quoteToAddress)) {\n throw new InvalidParamsError('toAddress must be a valid XpAddress when destination chain is P or X.');\n }\n\n return quoteToAddress;\n }\n\n if (!isAddress(quoteToAddress)) {\n throw new InvalidParamsError('toAddress must be a valid EVM address when importing to C-Chain.');\n }\n\n const corethAddress = await getCoreEthAddress(quoteToAddress);\n\n if (!isXpAddressFullyValid(corethAddress)) {\n throw new InvalidParamsError('getCoreEthAddress callback returned an invalid Coreth bech32 address.');\n }\n\n return corethAddress;\n}\n\n/**\n * Validates and normalizes the import destination address for the destination chain.\n *\n * C-Chain imports require an EVM address and return a checksummed EVM address.\n * P/X imports require a valid XP address and return it unchanged.\n *\n * @param toAddress - Quote destination address.\n * @param destinationChainAlias - Avalanche chain alias used as the import destination.\n * @returns An EVM address for C-Chain imports or an XP address for P/X imports.\n * @throws InvalidParamsError If the address format does not match the destination chain.\n */\nexport function getImportToAddress(toAddress: string, destinationChainAlias: 'C'): EvmAddress;\nexport function getImportToAddress(toAddress: string, destinationChainAlias: 'P' | 'X'): XpAddress;\nexport function getImportToAddress(\n toAddress: string,\n destinationChainAlias: AvalancheBlockchainAlias,\n): EvmAddress | XpAddress;\nexport function getImportToAddress(\n toAddress: string,\n destinationChainAlias: AvalancheBlockchainAlias,\n): EvmAddress | XpAddress {\n if (destinationChainAlias === 'C') {\n if (!isAddress(toAddress)) {\n throw new InvalidParamsError('toAddress must be a valid EVM address when importing to C-Chain.');\n }\n\n return getAddress(toAddress);\n }\n\n if (!isXpAddressFullyValid(toAddress)) {\n throw new InvalidParamsError('toAddress must be a valid XpAddress when importing to P or X chain.');\n }\n\n return toAddress;\n}\n\n/**\n * Asserts that an address is a fully valid XP address.\n *\n * @param address - Address to validate.\n * @returns The same address, narrowed to XpAddress.\n * @throws InvalidParamsError If the address is not a valid XP address.\n */\nexport function assertXpAddress(address: string): XpAddress {\n if (!isXpAddressFullyValid(address)) {\n throw new InvalidParamsError('Address must be a valid XpAddress.');\n }\n\n return address;\n}\n\n/**\n * Retrieves wallet addresses for a chain and filters them to valid XP addresses.\n *\n * When requiredAddress is provided, this also verifies wallet ownership by ensuring\n * the required address is present in the wallet address list.\n *\n * @param options - Wallet address query inputs.\n * @param options.chainAlias - Chain alias to query wallet addresses for.\n * @param options.getWalletAddressesForChainAlias - Callback that returns wallet-controlled addresses.\n * @param options.requiredAddress - Optional XP address that must be wallet-controlled.\n * @returns The subset of wallet addresses that are valid XP addresses.\n * @throws InvalidParamsError If no valid XP wallet addresses exist or requiredAddress is not owned.\n */\nexport async function getWalletFromAddresses({\n chainAlias,\n getWalletAddressesForChainAlias,\n requiredAddress,\n}: {\n chainAlias: AvalancheBlockchainAlias;\n getWalletAddressesForChainAlias: GetWalletAddressesForChainAliasCallback;\n requiredAddress?: XpAddress;\n}): Promise<XpAddress[]> {\n const walletAddresses = await getWalletAddressesForChainAlias(chainAlias);\n const xpWalletAddresses = walletAddresses.filter(isXpAddressFullyValid);\n\n if (xpWalletAddresses.length === 0) {\n throw new InvalidParamsError(`No wallet addresses available for chain alias ${chainAlias}.`);\n }\n\n if (requiredAddress && !xpWalletAddresses.includes(requiredAddress)) {\n throw new InvalidParamsError(\n `Required address is not controlled by the wallet for chain alias ${chainAlias}.`,\n `Expected ${requiredAddress} to be present in getWalletAddressesForChainAlias(${chainAlias}) result.`,\n );\n }\n\n return xpWalletAddresses;\n}\n\n/**\n * Retrieves and validates the wallet change address for a chain.\n *\n * @param options - Change address query inputs.\n * @param options.chainAlias - Chain alias to query change address for.\n * @param options.getWalletChangeAddressForChainAlias - Callback that returns wallet change address.\n * @returns A validated XP change address.\n * @throws InvalidParamsError If the returned change address is not a valid XP address.\n */\nexport async function getWalletChangeAddress({\n chainAlias,\n getWalletChangeAddressForChainAlias,\n}: {\n chainAlias: AvalancheBlockchainAlias;\n getWalletChangeAddressForChainAlias: GetWalletChangeAddressForChainAliasCallback;\n}): Promise<XpAddress> {\n const changeAddress = await getWalletChangeAddressForChainAlias(chainAlias);\n\n if (!isXpAddressFullyValid(changeAddress)) {\n throw new InvalidParamsError(`Change address for chain alias ${chainAlias} must be a valid XpAddress.`);\n }\n\n return changeAddress;\n}\n"],"mappings":"iJAuBA,SAAgB,EACd,EACA,EACmB,CACnB,GAAI,IAAqB,IAAK,CAC5B,GAAI,CAACA,EAAAA,sBAAsB,EAAY,CACrC,MAAM,IAAIC,EAAAA,mBAAmB,qEAAqE,CAGpG,OAAO,KAGT,GAAI,EAAA,EAAA,EAAA,WAAW,EAAY,CACzB,MAAM,IAAIA,EAAAA,mBAAmB,uEAAuE,CAGtG,OAAA,EAAA,EAAA,YAAkB,EAAY,CAiBhC,eAAsB,EAAmB,CACvC,wBACA,oBACA,kBAKqB,CACrB,GAAI,IAA0B,IAAK,CACjC,GAAI,CAACD,EAAAA,sBAAsB,EAAe,CACxC,MAAM,IAAIC,EAAAA,mBAAmB,wEAAwE,CAGvG,OAAO,EAGT,GAAI,EAAA,EAAA,EAAA,WAAW,EAAe,CAC5B,MAAM,IAAIA,EAAAA,mBAAmB,mEAAmE,CAGlG,IAAM,EAAgB,MAAM,EAAkB,EAAe,CAE7D,GAAI,CAACD,EAAAA,sBAAsB,EAAc,CACvC,MAAM,IAAIC,EAAAA,mBAAmB,wEAAwE,CAGvG,OAAO,EAoBT,SAAgB,EACd,EACA,EACwB,CACxB,GAAI,IAA0B,IAAK,CACjC,GAAI,EAAA,EAAA,EAAA,WAAW,EAAU,CACvB,MAAM,IAAIA,EAAAA,mBAAmB,mEAAmE,CAGlG,OAAA,EAAA,EAAA,YAAkB,EAAU,CAG9B,GAAI,CAACD,EAAAA,sBAAsB,EAAU,CACnC,MAAM,IAAIC,EAAAA,mBAAmB,sEAAsE,CAGrG,OAAO,EAUT,SAAgB,EAAgB,EAA4B,CAC1D,GAAI,CAACD,EAAAA,sBAAsB,EAAQ,CACjC,MAAM,IAAIC,EAAAA,mBAAmB,qCAAqC,CAGpE,OAAO,EAgBT,eAAsB,EAAuB,CAC3C,aACA,kCACA,mBAKuB,CAEvB,IAAM,GADkB,MAAM,EAAgC,EAAW,EAC/B,OAAOD,EAAAA,sBAAsB,CAEvE,GAAI,EAAkB,SAAW,EAC/B,MAAM,IAAIC,EAAAA,mBAAmB,iDAAiD,EAAW,GAAG,CAG9F,GAAI,GAAmB,CAAC,EAAkB,SAAS,EAAgB,CACjE,MAAM,IAAIA,EAAAA,mBACR,oEAAoE,EAAW,GAC/E,YAAY,EAAgB,oDAAoD,EAAW,WAC5F,CAGH,OAAO,EAYT,eAAsB,EAAuB,CAC3C,aACA,uCAIqB,CACrB,IAAM,EAAgB,MAAM,EAAoC,EAAW,CAE3E,GAAI,CAACD,EAAAA,sBAAsB,EAAc,CACvC,MAAM,IAAIC,EAAAA,mBAAmB,kCAAkC,EAAW,6BAA6B,CAGzG,OAAO"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{InvalidParamsError as e}from"../../../errors.js";import{isXpAddressFullyValid as t}from"../_type-guards.js";import{getAddress as n,isAddress as r}from"viem";function i(i,a){if(a!==`C`){if(!t(i))throw new e(`fromAddress must be a valid XpAddress when source chain is P or X.`);return null}if(!r(i))throw new e(`fromAddress must be a valid EVM address when exporting from C-Chain.`);return n(i)}async function a({destinationChainAlias:n,getCoreEthAddress:i,quoteToAddress:a}){if(n!==`C`){if(!t(a))throw new e(`toAddress must be a valid XpAddress when destination chain is P or X.`);return a}if(!r(a))throw new e(`toAddress must be a valid EVM address when importing to C-Chain.`);let o=await i(a);if(!t(o))throw new e(`getCoreEthAddress callback returned an invalid Coreth bech32 address.`);return o}function o(i,a){if(a===`C`){if(!r(i))throw new e(`toAddress must be a valid EVM address when importing to C-Chain.`);return n(i)}if(!t(i))throw new e(`toAddress must be a valid XpAddress when importing to P or X chain.`);return i}function s(n){if(!t(n))throw new e(`Address must be a valid XpAddress.`);return n}async function c({chainAlias:n,getWalletAddressesForChainAlias:r,requiredAddress:i}){let a=(await r(n)).filter(t);if(a.length===0)throw new e(`No wallet addresses available for chain alias ${n}.`);if(i&&!a.includes(i))throw new e(`Required address is not controlled by the wallet for chain alias ${n}.`,`Expected ${i} to be present in getWalletAddressesForChainAlias(${n}) result.`);return a}async function l({chainAlias:n,getWalletChangeAddressForChainAlias:r}){let i=await r(n);if(!t(i))throw new e(`Change address for chain alias ${n} must be a valid XpAddress.`);return i}export{s as assertXpAddress,i as getExportFromAddressEvm,a as getExportToAddress,o as getImportToAddress,l as getWalletChangeAddress,c as getWalletFromAddresses};
|
|
2
|
+
//# sourceMappingURL=addresses.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"addresses.js","names":[],"sources":["../../../../src/transfer-service/avalanche-cct/_utils/addresses.ts"],"sourcesContent":["import { getAddress, isAddress, type Address as EvmAddress } from 'viem';\nimport type { AvalancheBlockchainAlias } from '../../../constants';\nimport { InvalidParamsError } from '../../../errors';\nimport { isXpAddressFullyValid } from '../_type-guards';\nimport type {\n GetCoreEthAddressCallback,\n GetWalletAddressesForChainAliasCallback,\n GetWalletChangeAddressForChainAliasCallback,\n XpAddress,\n} from '../types';\n\n/**\n * Validates the source quote address for export and normalizes C-Chain addresses.\n *\n * For C-Chain exports, returns a checksummed EVM address.\n * For P/X exports, validates that the address is a fully valid XP address and returns null,\n * because P/X exports do not use an EVM sender.\n *\n * @param fromAddress - Quote source address.\n * @param sourceChainAlias - Avalanche chain alias used as the export source.\n * @returns A normalized EVM address for C-Chain exports, otherwise null.\n * @throws InvalidParamsError If the address format is invalid for the selected source chain.\n */\nexport function getExportFromAddressEvm(\n fromAddress: string,\n sourceChainAlias: AvalancheBlockchainAlias,\n): EvmAddress | null {\n if (sourceChainAlias !== 'C') {\n if (!isXpAddressFullyValid(fromAddress)) {\n throw new InvalidParamsError('fromAddress must be a valid XpAddress when source chain is P or X.');\n }\n\n return null;\n }\n\n if (!isAddress(fromAddress)) {\n throw new InvalidParamsError('fromAddress must be a valid EVM address when exporting from C-Chain.');\n }\n\n return getAddress(fromAddress);\n}\n\n/**\n * Resolves the export destination as an XP address.\n *\n * For P/X destinations, the quote destination must already be a valid XP address.\n * For C-Chain destinations, the quote destination must be an EVM address and is converted\n * to a Coreth bech32 address through the provided callback.\n *\n * @param options - Address resolution inputs.\n * @param options.destinationChainAlias - Avalanche chain alias used as the export destination.\n * @param options.getCoreEthAddress - Callback that maps an EVM address to a Coreth bech32 address.\n * @param options.quoteToAddress - Quote destination address.\n * @returns A validated XP address used as export destination.\n * @throws InvalidParamsError If input addresses or callback output are invalid.\n */\nexport async function getExportToAddress({\n destinationChainAlias,\n getCoreEthAddress,\n quoteToAddress,\n}: {\n destinationChainAlias: AvalancheBlockchainAlias;\n getCoreEthAddress: GetCoreEthAddressCallback;\n quoteToAddress: string;\n}): Promise<XpAddress> {\n if (destinationChainAlias !== 'C') {\n if (!isXpAddressFullyValid(quoteToAddress)) {\n throw new InvalidParamsError('toAddress must be a valid XpAddress when destination chain is P or X.');\n }\n\n return quoteToAddress;\n }\n\n if (!isAddress(quoteToAddress)) {\n throw new InvalidParamsError('toAddress must be a valid EVM address when importing to C-Chain.');\n }\n\n const corethAddress = await getCoreEthAddress(quoteToAddress);\n\n if (!isXpAddressFullyValid(corethAddress)) {\n throw new InvalidParamsError('getCoreEthAddress callback returned an invalid Coreth bech32 address.');\n }\n\n return corethAddress;\n}\n\n/**\n * Validates and normalizes the import destination address for the destination chain.\n *\n * C-Chain imports require an EVM address and return a checksummed EVM address.\n * P/X imports require a valid XP address and return it unchanged.\n *\n * @param toAddress - Quote destination address.\n * @param destinationChainAlias - Avalanche chain alias used as the import destination.\n * @returns An EVM address for C-Chain imports or an XP address for P/X imports.\n * @throws InvalidParamsError If the address format does not match the destination chain.\n */\nexport function getImportToAddress(toAddress: string, destinationChainAlias: 'C'): EvmAddress;\nexport function getImportToAddress(toAddress: string, destinationChainAlias: 'P' | 'X'): XpAddress;\nexport function getImportToAddress(\n toAddress: string,\n destinationChainAlias: AvalancheBlockchainAlias,\n): EvmAddress | XpAddress;\nexport function getImportToAddress(\n toAddress: string,\n destinationChainAlias: AvalancheBlockchainAlias,\n): EvmAddress | XpAddress {\n if (destinationChainAlias === 'C') {\n if (!isAddress(toAddress)) {\n throw new InvalidParamsError('toAddress must be a valid EVM address when importing to C-Chain.');\n }\n\n return getAddress(toAddress);\n }\n\n if (!isXpAddressFullyValid(toAddress)) {\n throw new InvalidParamsError('toAddress must be a valid XpAddress when importing to P or X chain.');\n }\n\n return toAddress;\n}\n\n/**\n * Asserts that an address is a fully valid XP address.\n *\n * @param address - Address to validate.\n * @returns The same address, narrowed to XpAddress.\n * @throws InvalidParamsError If the address is not a valid XP address.\n */\nexport function assertXpAddress(address: string): XpAddress {\n if (!isXpAddressFullyValid(address)) {\n throw new InvalidParamsError('Address must be a valid XpAddress.');\n }\n\n return address;\n}\n\n/**\n * Retrieves wallet addresses for a chain and filters them to valid XP addresses.\n *\n * When requiredAddress is provided, this also verifies wallet ownership by ensuring\n * the required address is present in the wallet address list.\n *\n * @param options - Wallet address query inputs.\n * @param options.chainAlias - Chain alias to query wallet addresses for.\n * @param options.getWalletAddressesForChainAlias - Callback that returns wallet-controlled addresses.\n * @param options.requiredAddress - Optional XP address that must be wallet-controlled.\n * @returns The subset of wallet addresses that are valid XP addresses.\n * @throws InvalidParamsError If no valid XP wallet addresses exist or requiredAddress is not owned.\n */\nexport async function getWalletFromAddresses({\n chainAlias,\n getWalletAddressesForChainAlias,\n requiredAddress,\n}: {\n chainAlias: AvalancheBlockchainAlias;\n getWalletAddressesForChainAlias: GetWalletAddressesForChainAliasCallback;\n requiredAddress?: XpAddress;\n}): Promise<XpAddress[]> {\n const walletAddresses = await getWalletAddressesForChainAlias(chainAlias);\n const xpWalletAddresses = walletAddresses.filter(isXpAddressFullyValid);\n\n if (xpWalletAddresses.length === 0) {\n throw new InvalidParamsError(`No wallet addresses available for chain alias ${chainAlias}.`);\n }\n\n if (requiredAddress && !xpWalletAddresses.includes(requiredAddress)) {\n throw new InvalidParamsError(\n `Required address is not controlled by the wallet for chain alias ${chainAlias}.`,\n `Expected ${requiredAddress} to be present in getWalletAddressesForChainAlias(${chainAlias}) result.`,\n );\n }\n\n return xpWalletAddresses;\n}\n\n/**\n * Retrieves and validates the wallet change address for a chain.\n *\n * @param options - Change address query inputs.\n * @param options.chainAlias - Chain alias to query change address for.\n * @param options.getWalletChangeAddressForChainAlias - Callback that returns wallet change address.\n * @returns A validated XP change address.\n * @throws InvalidParamsError If the returned change address is not a valid XP address.\n */\nexport async function getWalletChangeAddress({\n chainAlias,\n getWalletChangeAddressForChainAlias,\n}: {\n chainAlias: AvalancheBlockchainAlias;\n getWalletChangeAddressForChainAlias: GetWalletChangeAddressForChainAliasCallback;\n}): Promise<XpAddress> {\n const changeAddress = await getWalletChangeAddressForChainAlias(chainAlias);\n\n if (!isXpAddressFullyValid(changeAddress)) {\n throw new InvalidParamsError(`Change address for chain alias ${chainAlias} must be a valid XpAddress.`);\n }\n\n return changeAddress;\n}\n"],"mappings":"oKAuBA,SAAgB,EACd,EACA,EACmB,CACnB,GAAI,IAAqB,IAAK,CAC5B,GAAI,CAAC,EAAsB,EAAY,CACrC,MAAM,IAAI,EAAmB,qEAAqE,CAGpG,OAAO,KAGT,GAAI,CAAC,EAAU,EAAY,CACzB,MAAM,IAAI,EAAmB,uEAAuE,CAGtG,OAAO,EAAW,EAAY,CAiBhC,eAAsB,EAAmB,CACvC,wBACA,oBACA,kBAKqB,CACrB,GAAI,IAA0B,IAAK,CACjC,GAAI,CAAC,EAAsB,EAAe,CACxC,MAAM,IAAI,EAAmB,wEAAwE,CAGvG,OAAO,EAGT,GAAI,CAAC,EAAU,EAAe,CAC5B,MAAM,IAAI,EAAmB,mEAAmE,CAGlG,IAAM,EAAgB,MAAM,EAAkB,EAAe,CAE7D,GAAI,CAAC,EAAsB,EAAc,CACvC,MAAM,IAAI,EAAmB,wEAAwE,CAGvG,OAAO,EAoBT,SAAgB,EACd,EACA,EACwB,CACxB,GAAI,IAA0B,IAAK,CACjC,GAAI,CAAC,EAAU,EAAU,CACvB,MAAM,IAAI,EAAmB,mEAAmE,CAGlG,OAAO,EAAW,EAAU,CAG9B,GAAI,CAAC,EAAsB,EAAU,CACnC,MAAM,IAAI,EAAmB,sEAAsE,CAGrG,OAAO,EAUT,SAAgB,EAAgB,EAA4B,CAC1D,GAAI,CAAC,EAAsB,EAAQ,CACjC,MAAM,IAAI,EAAmB,qCAAqC,CAGpE,OAAO,EAgBT,eAAsB,EAAuB,CAC3C,aACA,kCACA,mBAKuB,CAEvB,IAAM,GADkB,MAAM,EAAgC,EAAW,EAC/B,OAAO,EAAsB,CAEvE,GAAI,EAAkB,SAAW,EAC/B,MAAM,IAAI,EAAmB,iDAAiD,EAAW,GAAG,CAG9F,GAAI,GAAmB,CAAC,EAAkB,SAAS,EAAgB,CACjE,MAAM,IAAI,EACR,oEAAoE,EAAW,GAC/E,YAAY,EAAgB,oDAAoD,EAAW,WAC5F,CAGH,OAAO,EAYT,eAAsB,EAAuB,CAC3C,aACA,uCAIqB,CACrB,IAAM,EAAgB,MAAM,EAAoC,EAAW,CAE3E,GAAI,CAAC,EAAsB,EAAc,CACvC,MAAM,IAAI,EAAmB,kCAAkC,EAAW,6BAA6B,CAGzG,OAAO"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
require(`../../../_virtual/_rolldown/runtime.cjs`);const e=require(`../../../constants.cjs`),t=require(`../../../errors.cjs`),n=require(`../constants.cjs`),r=require(`../../_utils.cjs`),i=require(`./p-chain.cjs`),a=require(`../../_evm-gas.cjs`);let o=require(`@avalabs/avalanchejs`);function s(e,n){if(!Number.isInteger(e)||e<=0)throw new t.InvalidParamsError(`Expected a positive integer greater than 0 for ${n}, but received: ${e}`)}function c(e=1,t=1){return s(e,`numberInputs`),s(t,`numberSignatures`),78n+BigInt(e)*90n+1n*60n+BigInt(t)*1000n+10000n}function l(e,t){return s(e,`numberInputs`),o.Common.dimensionsToGas(o.Common.createDimensions({bandwidth:161*e+254,dbRead:e,dbWrite:2+e,compute:200*e}),t)}function u(e,t){return s(e,`numberInputs`),o.Common.dimensionsToGas(o.Common.createDimensions({bandwidth:161*e+174,dbRead:e,dbWrite:1+e,compute:200*e}),t)}function d(e,t){let i=(r.applyFeeUnitsBpsMargin(e,t)+n.WEI_PER_NANO_AVAX_BIGINT-1n)/n.WEI_PER_NANO_AVAX_BIGINT;return i<=0n?1n:i}async function f(t){let n=(await a.fetchSuggestedGasPrices(r.getEvmClientForChain({chain:t===e.Environment.TEST?e.AVALANCHE_FUJI_CHAIN:e.AVALANCHE_MAINNET_CHAIN}))).fast.maxFeePerGas;return d(n,void 0)}function p({feeUnitsMarginBps:e,maxFeePerGas:t}){return d(t,e)*11230n}function m({feeUnitsMarginBps:e,maxFeePerGas:t,numberInputs:n,numberSignatures:r}){return d(t,e)*c(n,r)}async function h({context:e,environment:t,numberInputs:n}){let{price:r}=await i.getFeeState(t);return r*l(n,e.platformFeeConfig.weights)}async function g({context:e,environment:t,numberInputs:n}){let{price:r}=await i.getFeeState(t);return r*u(n,e.platformFeeConfig.weights)}function _({context:e}){return e.baseTxFee}function v({context:e}){return e.baseTxFee}async function y(e,n){let{context:r,environment:i,feeUnitsMarginBps:a,maxFeePerGas:o,numberInputs:s}=n;switch(e){case`C`:return p({feeUnitsMarginBps:a,maxFeePerGas:o});case`P`:return await h({context:r,environment:i,numberInputs:s});case`X`:return _({context:r});default:throw new t.InvalidParamsError(`Unsupported chain alias: ${e}`)}}async function b(e,n){let{context:r,environment:i,feeUnitsMarginBps:a,maxFeePerGas:o,numberInputs:s,numberSignatures:c}=n;switch(e){case`C`:return m({feeUnitsMarginBps:a,maxFeePerGas:o,numberInputs:s,numberSignatures:c});case`P`:return await g({context:r,environment:i,numberInputs:s});case`X`:return v({context:r});default:throw new t.InvalidParamsError(`Unsupported chain alias: ${e}`)}}exports.getCChainBaseFeeInNanoAvax=f,exports.getExportFeeInNanoAvax=y,exports.getImportFeeInNanoAvax=b;
|
|
2
|
+
//# sourceMappingURL=fees.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fees.cjs","names":["InvalidParamsError","Common","applyFeeUnitsBpsMargin","WEI_PER_NANO_AVAX_BIGINT","fetchSuggestedGasPrices","getEvmClientForChain","Environment","AVALANCHE_FUJI_CHAIN","AVALANCHE_MAINNET_CHAIN","getFeeState"],"sources":["../../../../src/transfer-service/avalanche-cct/_utils/fees.ts"],"sourcesContent":["import { Common, type Context } from '@avalabs/avalanchejs';\nimport {\n AVALANCHE_FUJI_CHAIN,\n AVALANCHE_MAINNET_CHAIN,\n Environment,\n type AvalancheBlockchainAlias,\n} from '../../../constants';\nimport { InvalidParamsError } from '../../../errors';\nimport { fetchSuggestedGasPrices } from '../../_evm-gas';\nimport { applyFeeUnitsBpsMargin } from '../../_utils';\nimport { getEvmClientForChain } from '../../_utils';\nimport { WEI_PER_NANO_AVAX_BIGINT } from '../constants';\nimport { getFeeState } from './p-chain';\n\n/**\n * C-chain atomic export txs always have exactly 1 EVM input + 1 transferable output\n * with fixed-width serialized fields, so the gas cost is constant.\n *\n * Verified empirically against avalanchejs costCorethTx() across varying amounts,\n * nonces, base fees, destination chains, and addresses.\n *\n * The hardcoded byte-size estimate (estimateCChainImportGas) gives 11228 — 2 gas\n * less than the real serialized size. We keep it for import estimation (where input\n * count can vary) but use the exact constant for exports.\n */\nconst C_CHAIN_EXPORT_GAS = 11230n;\n\nconst C_CHAIN_ATOMIC_TX_COST = 10_000n; // in gas\nconst C_CHAIN_SIGNATURE_COST = 1000n; // in gas\nconst C_CHAIN_BASE_TX_SIZE = 78n; // in bytes\nconst C_CHAIN_SINGLE_OWNER_INPUT_SIZE = 90n; // in bytes\nconst C_CHAIN_OUTPUT_SIZE = 60n; // in bytes\nconst C_CHAIN_NUMBER_OUTPUTS = 1n; // C chain imports consolidate inputs to one output\n\nfunction assertPositiveInteger(value: number, name: string): asserts value is number {\n if (!Number.isInteger(value) || value <= 0) {\n throw new InvalidParamsError(`Expected a positive integer greater than 0 for ${name}, but received: ${value}`);\n }\n}\n\n/**\n * Estimates gas for C-chain atomic import txs where the number of inputs can vary.\n * For exports, use the exact C_CHAIN_EXPORT_GAS constant instead.\n */\nexport function estimateCChainImportGas(numberInputs = 1, numberSignatures = 1): bigint {\n assertPositiveInteger(numberInputs, 'numberInputs');\n assertPositiveInteger(numberSignatures, 'numberSignatures');\n\n const baseSize =\n C_CHAIN_BASE_TX_SIZE +\n BigInt(numberInputs) * C_CHAIN_SINGLE_OWNER_INPUT_SIZE +\n C_CHAIN_NUMBER_OUTPUTS * C_CHAIN_OUTPUT_SIZE;\n return baseSize + BigInt(numberSignatures) * C_CHAIN_SIGNATURE_COST + C_CHAIN_ATOMIC_TX_COST;\n}\n\nexport function estimatePChainExportGas(numberInputs: number, weights: Common.Dimensions): bigint {\n assertPositiveInteger(numberInputs, 'numberInputs');\n\n return Common.dimensionsToGas(\n Common.createDimensions({\n bandwidth: 161 * numberInputs + 254,\n dbRead: numberInputs,\n dbWrite: 2 + numberInputs,\n compute: 200 * numberInputs,\n }),\n weights,\n );\n}\n\nexport function estimatePChainImportGas(numberInputs: number, weights: Common.Dimensions): bigint {\n assertPositiveInteger(numberInputs, 'numberInputs');\n\n return Common.dimensionsToGas(\n Common.createDimensions({\n bandwidth: 161 * numberInputs + 174,\n dbRead: numberInputs,\n dbWrite: 1 + numberInputs,\n compute: 200 * numberInputs,\n }),\n weights,\n );\n}\n\n/**\n * Derives CChainBaseFee from a maxFeePerGas value (in wei).\n *\n * Applies a fee units margin in basis points to buffer against base fee increases between\n * estimation and submission, then truncates to a nAVAX boundary so the fee estimation and the\n * transaction builder operate on the same integer.\n *\n * Minimum is 1 nAVAX.\n */\nexport function toCChainBaseFee(maxFeePerGas: bigint, feeUnitsMarginBps: number | undefined): bigint {\n const bufferedWei = applyFeeUnitsBpsMargin(maxFeePerGas, feeUnitsMarginBps);\n\n // Ceil to nAVAX so the fee is never underestimated\n const bufferedBaseFeeNAvax = (bufferedWei + WEI_PER_NANO_AVAX_BIGINT - 1n) / WEI_PER_NANO_AVAX_BIGINT;\n\n if (bufferedBaseFeeNAvax <= 0n) {\n return 1n;\n }\n\n return bufferedBaseFeeNAvax;\n}\n\nexport async function getCChainBaseFeeInNanoAvax(environment: Environment): Promise<bigint> {\n const cChain = environment === Environment.TEST ? AVALANCHE_FUJI_CHAIN : AVALANCHE_MAINNET_CHAIN;\n const cChainClient = getEvmClientForChain({ chain: cChain });\n const maxFeePerGas = (await fetchSuggestedGasPrices(cChainClient)).fast.maxFeePerGas;\n\n return toCChainBaseFee(maxFeePerGas, undefined);\n}\n\nexport function getCChainExportFeeInNanoAvax({\n feeUnitsMarginBps,\n maxFeePerGas,\n}: {\n feeUnitsMarginBps: number | undefined;\n maxFeePerGas: bigint;\n}): bigint {\n const baseFee = toCChainBaseFee(maxFeePerGas, feeUnitsMarginBps);\n\n return baseFee * C_CHAIN_EXPORT_GAS;\n}\n\nexport function getCChainImportFeeInNanoAvax({\n feeUnitsMarginBps,\n maxFeePerGas,\n numberInputs,\n numberSignatures,\n}: {\n feeUnitsMarginBps: number | undefined;\n maxFeePerGas: bigint;\n numberInputs: number;\n numberSignatures: number;\n}): bigint {\n const baseFee = toCChainBaseFee(maxFeePerGas, feeUnitsMarginBps);\n\n return baseFee * estimateCChainImportGas(numberInputs, numberSignatures);\n}\n\nexport async function getPChainExportFeeInNanoAvax({\n context,\n environment,\n numberInputs,\n}: {\n context: Context.Context;\n environment: Environment;\n numberInputs: number;\n}): Promise<bigint> {\n const feeState = await getFeeState(environment);\n const { price } = feeState;\n\n return price * estimatePChainExportGas(numberInputs, context.platformFeeConfig.weights);\n}\n\nexport async function getPChainImportFeeInNanoAvax({\n context,\n environment,\n numberInputs,\n}: {\n context: Context.Context;\n environment: Environment;\n numberInputs: number;\n}): Promise<bigint> {\n const feeState = await getFeeState(environment);\n const { price } = feeState;\n\n return price * estimatePChainImportGas(numberInputs, context.platformFeeConfig.weights);\n}\n\nexport function getXChainExportFeeInNanoAvax({ context }: { context: Context.Context }): bigint {\n return context.baseTxFee;\n}\n\nexport function getXChainImportFeeInNanoAvax({ context }: { context: Context.Context }): bigint {\n return context.baseTxFee;\n}\n\nexport async function getExportFeeInNanoAvax(\n chainAlias: AvalancheBlockchainAlias,\n params: {\n context: Context.Context;\n environment: Environment;\n feeUnitsMarginBps: number | undefined;\n maxFeePerGas: bigint;\n numberInputs: number;\n },\n): Promise<bigint> {\n const { context, environment, feeUnitsMarginBps, maxFeePerGas, numberInputs } = params;\n\n switch (chainAlias) {\n case 'C': {\n return getCChainExportFeeInNanoAvax({ feeUnitsMarginBps, maxFeePerGas });\n }\n\n case 'P': {\n return await getPChainExportFeeInNanoAvax({ context, environment, numberInputs });\n }\n\n case 'X': {\n return getXChainExportFeeInNanoAvax({ context });\n }\n\n default:\n throw new InvalidParamsError(`Unsupported chain alias: ${chainAlias}`);\n }\n}\n\nexport async function getImportFeeInNanoAvax(\n chainAlias: AvalancheBlockchainAlias,\n params: {\n context: Context.Context;\n environment: Environment;\n feeUnitsMarginBps: number | undefined;\n maxFeePerGas: bigint;\n numberInputs: number;\n numberSignatures: number;\n },\n): Promise<bigint> {\n const { context, environment, feeUnitsMarginBps, maxFeePerGas, numberInputs, numberSignatures } = params;\n\n switch (chainAlias) {\n case 'C': {\n return getCChainImportFeeInNanoAvax({ feeUnitsMarginBps, maxFeePerGas, numberInputs, numberSignatures });\n }\n\n case 'P': {\n return await getPChainImportFeeInNanoAvax({ context, environment, numberInputs });\n }\n\n case 'X': {\n return getXChainImportFeeInNanoAvax({ context });\n }\n\n default:\n throw new InvalidParamsError(`Unsupported chain alias: ${chainAlias}`);\n }\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{AVALANCHE_FUJI_CHAIN as e,AVALANCHE_MAINNET_CHAIN as t,Environment as n}from"../../../constants.js";import{InvalidParamsError as r}from"../../../errors.js";import{WEI_PER_NANO_AVAX_BIGINT as i}from"../constants.js";import{applyFeeUnitsBpsMargin as a,getEvmClientForChain as o}from"../../_utils.js";import{getFeeState as s}from"./p-chain.js";import{fetchSuggestedGasPrices as c}from"../../_evm-gas.js";import{Common as l}from"@avalabs/avalanchejs";function u(e,t){if(!Number.isInteger(e)||e<=0)throw new r(`Expected a positive integer greater than 0 for ${t}, but received: ${e}`)}function d(e=1,t=1){return u(e,`numberInputs`),u(t,`numberSignatures`),78n+BigInt(e)*90n+1n*60n+BigInt(t)*1000n+10000n}function f(e,t){return u(e,`numberInputs`),l.dimensionsToGas(l.createDimensions({bandwidth:161*e+254,dbRead:e,dbWrite:2+e,compute:200*e}),t)}function p(e,t){return u(e,`numberInputs`),l.dimensionsToGas(l.createDimensions({bandwidth:161*e+174,dbRead:e,dbWrite:1+e,compute:200*e}),t)}function m(e,t){let n=(a(e,t)+i-1n)/i;return n<=0n?1n:n}async function h(r){let i=(await c(o({chain:r===n.TEST?e:t}))).fast.maxFeePerGas;return m(i,void 0)}function g({feeUnitsMarginBps:e,maxFeePerGas:t}){return m(t,e)*11230n}function _({feeUnitsMarginBps:e,maxFeePerGas:t,numberInputs:n,numberSignatures:r}){return m(t,e)*d(n,r)}async function v({context:e,environment:t,numberInputs:n}){let{price:r}=await s(t);return r*f(n,e.platformFeeConfig.weights)}async function y({context:e,environment:t,numberInputs:n}){let{price:r}=await s(t);return r*p(n,e.platformFeeConfig.weights)}function b({context:e}){return e.baseTxFee}function x({context:e}){return e.baseTxFee}async function S(e,t){let{context:n,environment:i,feeUnitsMarginBps:a,maxFeePerGas:o,numberInputs:s}=t;switch(e){case`C`:return g({feeUnitsMarginBps:a,maxFeePerGas:o});case`P`:return await v({context:n,environment:i,numberInputs:s});case`X`:return b({context:n});default:throw new r(`Unsupported chain alias: ${e}`)}}async function C(e,t){let{context:n,environment:i,feeUnitsMarginBps:a,maxFeePerGas:o,numberInputs:s,numberSignatures:c}=t;switch(e){case`C`:return _({feeUnitsMarginBps:a,maxFeePerGas:o,numberInputs:s,numberSignatures:c});case`P`:return await y({context:n,environment:i,numberInputs:s});case`X`:return x({context:n});default:throw new r(`Unsupported chain alias: ${e}`)}}export{h as getCChainBaseFeeInNanoAvax,S as getExportFeeInNanoAvax,C as getImportFeeInNanoAvax};
|
|
2
|
+
//# sourceMappingURL=fees.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fees.js","names":[],"sources":["../../../../src/transfer-service/avalanche-cct/_utils/fees.ts"],"sourcesContent":["import { Common, type Context } from '@avalabs/avalanchejs';\nimport {\n AVALANCHE_FUJI_CHAIN,\n AVALANCHE_MAINNET_CHAIN,\n Environment,\n type AvalancheBlockchainAlias,\n} from '../../../constants';\nimport { InvalidParamsError } from '../../../errors';\nimport { fetchSuggestedGasPrices } from '../../_evm-gas';\nimport { applyFeeUnitsBpsMargin } from '../../_utils';\nimport { getEvmClientForChain } from '../../_utils';\nimport { WEI_PER_NANO_AVAX_BIGINT } from '../constants';\nimport { getFeeState } from './p-chain';\n\n/**\n * C-chain atomic export txs always have exactly 1 EVM input + 1 transferable output\n * with fixed-width serialized fields, so the gas cost is constant.\n *\n * Verified empirically against avalanchejs costCorethTx() across varying amounts,\n * nonces, base fees, destination chains, and addresses.\n *\n * The hardcoded byte-size estimate (estimateCChainImportGas) gives 11228 — 2 gas\n * less than the real serialized size. We keep it for import estimation (where input\n * count can vary) but use the exact constant for exports.\n */\nconst C_CHAIN_EXPORT_GAS = 11230n;\n\nconst C_CHAIN_ATOMIC_TX_COST = 10_000n; // in gas\nconst C_CHAIN_SIGNATURE_COST = 1000n; // in gas\nconst C_CHAIN_BASE_TX_SIZE = 78n; // in bytes\nconst C_CHAIN_SINGLE_OWNER_INPUT_SIZE = 90n; // in bytes\nconst C_CHAIN_OUTPUT_SIZE = 60n; // in bytes\nconst C_CHAIN_NUMBER_OUTPUTS = 1n; // C chain imports consolidate inputs to one output\n\nfunction assertPositiveInteger(value: number, name: string): asserts value is number {\n if (!Number.isInteger(value) || value <= 0) {\n throw new InvalidParamsError(`Expected a positive integer greater than 0 for ${name}, but received: ${value}`);\n }\n}\n\n/**\n * Estimates gas for C-chain atomic import txs where the number of inputs can vary.\n * For exports, use the exact C_CHAIN_EXPORT_GAS constant instead.\n */\nexport function estimateCChainImportGas(numberInputs = 1, numberSignatures = 1): bigint {\n assertPositiveInteger(numberInputs, 'numberInputs');\n assertPositiveInteger(numberSignatures, 'numberSignatures');\n\n const baseSize =\n C_CHAIN_BASE_TX_SIZE +\n BigInt(numberInputs) * C_CHAIN_SINGLE_OWNER_INPUT_SIZE +\n C_CHAIN_NUMBER_OUTPUTS * C_CHAIN_OUTPUT_SIZE;\n return baseSize + BigInt(numberSignatures) * C_CHAIN_SIGNATURE_COST + C_CHAIN_ATOMIC_TX_COST;\n}\n\nexport function estimatePChainExportGas(numberInputs: number, weights: Common.Dimensions): bigint {\n assertPositiveInteger(numberInputs, 'numberInputs');\n\n return Common.dimensionsToGas(\n Common.createDimensions({\n bandwidth: 161 * numberInputs + 254,\n dbRead: numberInputs,\n dbWrite: 2 + numberInputs,\n compute: 200 * numberInputs,\n }),\n weights,\n );\n}\n\nexport function estimatePChainImportGas(numberInputs: number, weights: Common.Dimensions): bigint {\n assertPositiveInteger(numberInputs, 'numberInputs');\n\n return Common.dimensionsToGas(\n Common.createDimensions({\n bandwidth: 161 * numberInputs + 174,\n dbRead: numberInputs,\n dbWrite: 1 + numberInputs,\n compute: 200 * numberInputs,\n }),\n weights,\n );\n}\n\n/**\n * Derives CChainBaseFee from a maxFeePerGas value (in wei).\n *\n * Applies a fee units margin in basis points to buffer against base fee increases between\n * estimation and submission, then truncates to a nAVAX boundary so the fee estimation and the\n * transaction builder operate on the same integer.\n *\n * Minimum is 1 nAVAX.\n */\nexport function toCChainBaseFee(maxFeePerGas: bigint, feeUnitsMarginBps: number | undefined): bigint {\n const bufferedWei = applyFeeUnitsBpsMargin(maxFeePerGas, feeUnitsMarginBps);\n\n // Ceil to nAVAX so the fee is never underestimated\n const bufferedBaseFeeNAvax = (bufferedWei + WEI_PER_NANO_AVAX_BIGINT - 1n) / WEI_PER_NANO_AVAX_BIGINT;\n\n if (bufferedBaseFeeNAvax <= 0n) {\n return 1n;\n }\n\n return bufferedBaseFeeNAvax;\n}\n\nexport async function getCChainBaseFeeInNanoAvax(environment: Environment): Promise<bigint> {\n const cChain = environment === Environment.TEST ? AVALANCHE_FUJI_CHAIN : AVALANCHE_MAINNET_CHAIN;\n const cChainClient = getEvmClientForChain({ chain: cChain });\n const maxFeePerGas = (await fetchSuggestedGasPrices(cChainClient)).fast.maxFeePerGas;\n\n return toCChainBaseFee(maxFeePerGas, undefined);\n}\n\nexport function getCChainExportFeeInNanoAvax({\n feeUnitsMarginBps,\n maxFeePerGas,\n}: {\n feeUnitsMarginBps: number | undefined;\n maxFeePerGas: bigint;\n}): bigint {\n const baseFee = toCChainBaseFee(maxFeePerGas, feeUnitsMarginBps);\n\n return baseFee * C_CHAIN_EXPORT_GAS;\n}\n\nexport function getCChainImportFeeInNanoAvax({\n feeUnitsMarginBps,\n maxFeePerGas,\n numberInputs,\n numberSignatures,\n}: {\n feeUnitsMarginBps: number | undefined;\n maxFeePerGas: bigint;\n numberInputs: number;\n numberSignatures: number;\n}): bigint {\n const baseFee = toCChainBaseFee(maxFeePerGas, feeUnitsMarginBps);\n\n return baseFee * estimateCChainImportGas(numberInputs, numberSignatures);\n}\n\nexport async function getPChainExportFeeInNanoAvax({\n context,\n environment,\n numberInputs,\n}: {\n context: Context.Context;\n environment: Environment;\n numberInputs: number;\n}): Promise<bigint> {\n const feeState = await getFeeState(environment);\n const { price } = feeState;\n\n return price * estimatePChainExportGas(numberInputs, context.platformFeeConfig.weights);\n}\n\nexport async function getPChainImportFeeInNanoAvax({\n context,\n environment,\n numberInputs,\n}: {\n context: Context.Context;\n environment: Environment;\n numberInputs: number;\n}): Promise<bigint> {\n const feeState = await getFeeState(environment);\n const { price } = feeState;\n\n return price * estimatePChainImportGas(numberInputs, context.platformFeeConfig.weights);\n}\n\nexport function getXChainExportFeeInNanoAvax({ context }: { context: Context.Context }): bigint {\n return context.baseTxFee;\n}\n\nexport function getXChainImportFeeInNanoAvax({ context }: { context: Context.Context }): bigint {\n return context.baseTxFee;\n}\n\nexport async function getExportFeeInNanoAvax(\n chainAlias: AvalancheBlockchainAlias,\n params: {\n context: Context.Context;\n environment: Environment;\n feeUnitsMarginBps: number | undefined;\n maxFeePerGas: bigint;\n numberInputs: number;\n },\n): Promise<bigint> {\n const { context, environment, feeUnitsMarginBps, maxFeePerGas, numberInputs } = params;\n\n switch (chainAlias) {\n case 'C': {\n return getCChainExportFeeInNanoAvax({ feeUnitsMarginBps, maxFeePerGas });\n }\n\n case 'P': {\n return await getPChainExportFeeInNanoAvax({ context, environment, numberInputs });\n }\n\n case 'X': {\n return getXChainExportFeeInNanoAvax({ context });\n }\n\n default:\n throw new InvalidParamsError(`Unsupported chain alias: ${chainAlias}`);\n }\n}\n\nexport async function getImportFeeInNanoAvax(\n chainAlias: AvalancheBlockchainAlias,\n params: {\n context: Context.Context;\n environment: Environment;\n feeUnitsMarginBps: number | undefined;\n maxFeePerGas: bigint;\n numberInputs: number;\n numberSignatures: number;\n },\n): Promise<bigint> {\n const { context, environment, feeUnitsMarginBps, maxFeePerGas, numberInputs, numberSignatures } = params;\n\n switch (chainAlias) {\n case 'C': {\n return getCChainImportFeeInNanoAvax({ feeUnitsMarginBps, maxFeePerGas, numberInputs, numberSignatures });\n }\n\n case 'P': {\n return await getPChainImportFeeInNanoAvax({ context, environment, numberInputs });\n }\n\n case 'X': {\n return getXChainImportFeeInNanoAvax({ context });\n }\n\n default:\n throw new InvalidParamsError(`Unsupported chain alias: ${chainAlias}`);\n }\n}\n"],"mappings":"scAkCA,SAAS,EAAsB,EAAe,EAAuC,CACnF,GAAI,CAAC,OAAO,UAAU,EAAM,EAAI,GAAS,EACvC,MAAM,IAAI,EAAmB,kDAAkD,EAAK,kBAAkB,IAAQ,CAQlH,SAAgB,EAAwB,EAAe,EAAG,EAAmB,EAAW,CAQtF,OAPA,EAAsB,EAAc,eAAe,CACnD,EAAsB,EAAkB,mBAAmB,CAGzD,IACA,OAAO,EAAa,CAAG,IACvB,GAAyB,IACT,OAAO,EAAiB,CAAG,MAAyB,OAGxE,SAAgB,EAAwB,EAAsB,EAAoC,CAGhG,OAFA,EAAsB,EAAc,eAAe,CAE5C,EAAO,gBACZ,EAAO,iBAAiB,CACtB,UAAW,IAAM,EAAe,IAChC,OAAQ,EACR,QAAS,EAAI,EACb,QAAS,IAAM,EAChB,CAAC,CACF,EACD,CAGH,SAAgB,EAAwB,EAAsB,EAAoC,CAGhG,OAFA,EAAsB,EAAc,eAAe,CAE5C,EAAO,gBACZ,EAAO,iBAAiB,CACtB,UAAW,IAAM,EAAe,IAChC,OAAQ,EACR,QAAS,EAAI,EACb,QAAS,IAAM,EAChB,CAAC,CACF,EACD,CAYH,SAAgB,EAAgB,EAAsB,EAA+C,CAInG,IAAM,GAHc,EAAuB,EAAc,EAAkB,CAG/B,EAA2B,IAAM,EAM7E,OAJI,GAAwB,GACnB,GAGF,EAGT,eAAsB,EAA2B,EAA2C,CAG1F,IAAM,GAAgB,MAAM,EADP,EAAqB,CAAE,MAD7B,IAAgB,EAAY,KAAO,EAAuB,EACd,CAAC,CACK,EAAE,KAAK,aAExE,OAAO,EAAgB,EAAc,IAAA,GAAU,CAGjD,SAAgB,EAA6B,CAC3C,oBACA,gBAIS,CAGT,OAFgB,EAAgB,EAAc,EAAkB,CAE/C,OAGnB,SAAgB,EAA6B,CAC3C,oBACA,eACA,eACA,oBAMS,CAGT,OAFgB,EAAgB,EAAc,EAAkB,CAE/C,EAAwB,EAAc,EAAiB,CAG1E,eAAsB,EAA6B,CACjD,UACA,cACA,gBAKkB,CAElB,GAAM,CAAE,SADS,MAAM,EAAY,EAAY,CAG/C,OAAO,EAAQ,EAAwB,EAAc,EAAQ,kBAAkB,QAAQ,CAGzF,eAAsB,EAA6B,CACjD,UACA,cACA,gBAKkB,CAElB,GAAM,CAAE,SADS,MAAM,EAAY,EAAY,CAG/C,OAAO,EAAQ,EAAwB,EAAc,EAAQ,kBAAkB,QAAQ,CAGzF,SAAgB,EAA6B,CAAE,WAAiD,CAC9F,OAAO,EAAQ,UAGjB,SAAgB,EAA6B,CAAE,WAAiD,CAC9F,OAAO,EAAQ,UAGjB,eAAsB,EACpB,EACA,EAOiB,CACjB,GAAM,CAAE,UAAS,cAAa,oBAAmB,eAAc,gBAAiB,EAEhF,OAAQ,EAAR,CACE,IAAK,IACH,OAAO,EAA6B,CAAE,oBAAmB,eAAc,CAAC,CAG1E,IAAK,IACH,OAAO,MAAM,EAA6B,CAAE,UAAS,cAAa,eAAc,CAAC,CAGnF,IAAK,IACH,OAAO,EAA6B,CAAE,UAAS,CAAC,CAGlD,QACE,MAAM,IAAI,EAAmB,4BAA4B,IAAa,EAI5E,eAAsB,EACpB,EACA,EAQiB,CACjB,GAAM,CAAE,UAAS,cAAa,oBAAmB,eAAc,eAAc,oBAAqB,EAElG,OAAQ,EAAR,CACE,IAAK,IACH,OAAO,EAA6B,CAAE,oBAAmB,eAAc,eAAc,mBAAkB,CAAC,CAG1G,IAAK,IACH,OAAO,MAAM,EAA6B,CAAE,UAAS,cAAa,eAAc,CAAC,CAGnF,IAAK,IACH,OAAO,EAA6B,CAAE,UAAS,CAAC,CAGlD,QACE,MAAM,IAAI,EAAmB,4BAA4B,IAAa"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"p-chain.cjs","names":["pvm","getAvalancheApiUrl"],"sources":["../../../../src/transfer-service/avalanche-cct/_utils/p-chain.ts"],"sourcesContent":["import { pvm, utils } from '@avalabs/avalanchejs';\nimport { Environment } from '../../../constants';\nimport type { XpAddress } from '../types';\nimport { getAvalancheApiUrl } from '../_utils';\n\nexport async function getFeeState(environment: Environment): Promise<pvm.FeeState> {\n const pvmApi = new pvm.PVMApi(getAvalancheApiUrl(environment));\n\n const feeState = await pvmApi.getFeeState();\n\n return feeState;\n}\n\nexport function getXpAddressBytes(address: XpAddress): Uint8Array {\n const [, addressBytes] = utils.parseBech32(address);\n\n return addressBytes;\n}\n"],"mappings":"0HAKA,eAAsB,EAAY,EAAiD,CAKjF,OAFiB,MAFF,IAAIA,EAAAA,IAAI,OAAOC,EAAAA,mBAAmB,EAAY,CAAC,CAEhC,aAAa"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"p-chain.js","names":[],"sources":["../../../../src/transfer-service/avalanche-cct/_utils/p-chain.ts"],"sourcesContent":["import { pvm, utils } from '@avalabs/avalanchejs';\nimport { Environment } from '../../../constants';\nimport type { XpAddress } from '../types';\nimport { getAvalancheApiUrl } from '../_utils';\n\nexport async function getFeeState(environment: Environment): Promise<pvm.FeeState> {\n const pvmApi = new pvm.PVMApi(getAvalancheApiUrl(environment));\n\n const feeState = await pvmApi.getFeeState();\n\n return feeState;\n}\n\nexport function getXpAddressBytes(address: XpAddress): Uint8Array {\n const [, addressBytes] = utils.parseBech32(address);\n\n return addressBytes;\n}\n"],"mappings":"6FAKA,eAAsB,EAAY,EAAiD,CAKjF,OAFiB,MAFF,IAAI,EAAI,OAAO,EAAmB,EAAY,CAAC,CAEhC,aAAa"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const e=require(`../../../errors.cjs`),t=require(`../_utils.cjs`),n=require(`../../_utils.cjs`);function r(n,r){switch(r){case`C`:return e=>t.getAvalancheProvider(n,r).getAtomicTxStatus(e);case`P`:return e=>t.getAvalancheProvider(n,r).getTxStatus({txID:e});case`X`:return e=>t.getAvalancheProvider(n,r).getTxStatus({txID:e});default:throw new e.InvalidParamsError(`Unsupported chain alias: ${r}`,`Can not get transaction status function for unsupported chain alias.`)}}async function i({chainAlias:t,count:a=13,environment:o,signal:s,txId:c}){if(a<0)return!1;try{let{status:e}=await r(o,t)(c);switch(e){case`Accepted`:case`Committed`:return!0;case`Dropped`:case`Rejected`:return!1;default:break}return await n.wait(1500*1.2**(13-a),s),await i({chainAlias:t,count:a-1,environment:o,signal:s,txId:c})}catch(t){throw new e.SdkError(`Failed to poll transaction status from Avalanche.`,e.ErrorCode.UNKNOWN,{cause:t})}}exports.pollPrimaryNetworkTxStatus=i;
|
|
2
|
+
//# sourceMappingURL=polling.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"polling.cjs","names":["getAvalancheProvider","InvalidParamsError","wait","SdkError","ErrorCode"],"sources":["../../../../src/transfer-service/avalanche-cct/_utils/polling.ts"],"sourcesContent":["import type { evm, pvm } from '@avalabs/avalanchejs';\nimport type { AvalancheBlockchainAlias, Environment } from '../../../constants';\nimport { ErrorCode, InvalidParamsError, SdkError } from '../../../errors';\nimport { wait } from '../../_utils';\nimport { getAvalancheProvider } from '../_utils';\n\nconst POLL_START_COUNT = 13;\nconst BASE_WAIT_PERIOD_MS = 1500;\nconst MULTIPLIER = 1.2;\n\nexport type GetTxStatusFunction<T extends evm.GetAtomicTxStatusResponse | pvm.GetTxStatusResponse> = (\n txId: string,\n) => Promise<T>;\n\nexport function getChainAliasTxStatusFunction(\n environment: Environment,\n chainAlias: 'C',\n): GetTxStatusFunction<evm.GetAtomicTxStatusResponse>;\nexport function getChainAliasTxStatusFunction(\n environment: Environment,\n chainAlias: 'P',\n): GetTxStatusFunction<pvm.GetTxStatusResponse>;\nexport function getChainAliasTxStatusFunction(\n environment: Environment,\n chainAlias: 'X',\n): GetTxStatusFunction<pvm.GetTxStatusResponse>;\nexport function getChainAliasTxStatusFunction(\n environment: Environment,\n chainAlias: AvalancheBlockchainAlias,\n): GetTxStatusFunction<evm.GetAtomicTxStatusResponse | pvm.GetTxStatusResponse>;\nexport function getChainAliasTxStatusFunction(\n environment: Environment,\n chainAlias: AvalancheBlockchainAlias,\n): GetTxStatusFunction<evm.GetAtomicTxStatusResponse | pvm.GetTxStatusResponse> {\n switch (chainAlias) {\n case 'C': {\n return (txId: string) => getAvalancheProvider(environment, chainAlias).getAtomicTxStatus(txId);\n }\n case 'P': {\n return (txId: string) => getAvalancheProvider(environment, chainAlias).getTxStatus({ txID: txId });\n }\n case 'X': {\n return (txId: string) => getAvalancheProvider(environment, chainAlias).getTxStatus({ txID: txId });\n }\n default: {\n throw new InvalidParamsError(\n `Unsupported chain alias: ${chainAlias}`,\n 'Can not get transaction status function for unsupported chain alias.',\n );\n }\n }\n}\n\nexport async function pollPrimaryNetworkTxStatus({\n chainAlias,\n count = POLL_START_COUNT,\n environment,\n signal,\n txId,\n}: {\n chainAlias: AvalancheBlockchainAlias;\n count?: number;\n environment: Environment;\n signal?: AbortSignal;\n txId: string;\n}): Promise<boolean> {\n if (count < 0) {\n return false;\n }\n\n try {\n const pollFunction = getChainAliasTxStatusFunction(environment, chainAlias);\n\n const { status } = await pollFunction(txId);\n\n switch (status) {\n case 'Accepted':\n case 'Committed': {\n return true;\n }\n\n case 'Dropped':\n case 'Rejected': {\n return false;\n }\n\n default: {\n // Fall through to retry logic.\n break;\n }\n }\n\n const failures = POLL_START_COUNT - count;\n\n const waitPeriod = BASE_WAIT_PERIOD_MS * MULTIPLIER ** failures;\n\n await wait(waitPeriod, signal);\n\n return await pollPrimaryNetworkTxStatus({ chainAlias, count: count - 1, environment, signal, txId });\n } catch (error) {\n throw new SdkError('Failed to poll transaction status from Avalanche.', ErrorCode.UNKNOWN, { cause: error });\n }\n}\n"],"mappings":"gGA8BA,SAAgB,EACd,EACA,EAC8E,CAC9E,OAAQ,EAAR,CACE,IAAK,IACH,MAAQ,IAAiBA,EAAAA,qBAAqB,EAAa,EAAW,CAAC,kBAAkB,EAAK,CAEhG,IAAK,IACH,MAAQ,IAAiBA,EAAAA,qBAAqB,EAAa,EAAW,CAAC,YAAY,CAAE,KAAM,EAAM,CAAC,CAEpG,IAAK,IACH,MAAQ,IAAiBA,EAAAA,qBAAqB,EAAa,EAAW,CAAC,YAAY,CAAE,KAAM,EAAM,CAAC,CAEpG,QACE,MAAM,IAAIC,EAAAA,mBACR,4BAA4B,IAC5B,uEACD,EAKP,eAAsB,EAA2B,CAC/C,aACA,QAAQ,GACR,cACA,SACA,QAOmB,CACnB,GAAI,EAAQ,EACV,MAAO,GAGT,GAAI,CAGF,GAAM,CAAE,UAAW,MAFE,EAA8B,EAAa,EAAW,CAErC,EAAK,CAE3C,OAAQ,EAAR,CACE,IAAK,WACL,IAAK,YACH,MAAO,GAGT,IAAK,UACL,IAAK,WACH,MAAO,GAGT,QAEE,MAUJ,OAFA,MAAMC,EAAAA,KAFa,KAAsB,MAFxB,GAAmB,GAIb,EAAO,CAEvB,MAAM,EAA2B,CAAE,aAAY,MAAO,EAAQ,EAAG,cAAa,SAAQ,OAAM,CAAC,OAC7F,EAAO,CACd,MAAM,IAAIC,EAAAA,SAAS,oDAAqDC,EAAAA,UAAU,QAAS,CAAE,MAAO,EAAO,CAAC"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{ErrorCode as e,InvalidParamsError as t,SdkError as n}from"../../../errors.js";import{getAvalancheProvider as r}from"../_utils.js";import{wait as i}from"../../_utils.js";function a(e,n){switch(n){case`C`:return t=>r(e,n).getAtomicTxStatus(t);case`P`:return t=>r(e,n).getTxStatus({txID:t});case`X`:return t=>r(e,n).getTxStatus({txID:t});default:throw new t(`Unsupported chain alias: ${n}`,`Can not get transaction status function for unsupported chain alias.`)}}async function o({chainAlias:t,count:r=13,environment:s,signal:c,txId:l}){if(r<0)return!1;try{let{status:e}=await a(s,t)(l);switch(e){case`Accepted`:case`Committed`:return!0;case`Dropped`:case`Rejected`:return!1;default:break}return await i(1500*1.2**(13-r),c),await o({chainAlias:t,count:r-1,environment:s,signal:c,txId:l})}catch(t){throw new n(`Failed to poll transaction status from Avalanche.`,e.UNKNOWN,{cause:t})}}export{o as pollPrimaryNetworkTxStatus};
|
|
2
|
+
//# sourceMappingURL=polling.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"polling.js","names":[],"sources":["../../../../src/transfer-service/avalanche-cct/_utils/polling.ts"],"sourcesContent":["import type { evm, pvm } from '@avalabs/avalanchejs';\nimport type { AvalancheBlockchainAlias, Environment } from '../../../constants';\nimport { ErrorCode, InvalidParamsError, SdkError } from '../../../errors';\nimport { wait } from '../../_utils';\nimport { getAvalancheProvider } from '../_utils';\n\nconst POLL_START_COUNT = 13;\nconst BASE_WAIT_PERIOD_MS = 1500;\nconst MULTIPLIER = 1.2;\n\nexport type GetTxStatusFunction<T extends evm.GetAtomicTxStatusResponse | pvm.GetTxStatusResponse> = (\n txId: string,\n) => Promise<T>;\n\nexport function getChainAliasTxStatusFunction(\n environment: Environment,\n chainAlias: 'C',\n): GetTxStatusFunction<evm.GetAtomicTxStatusResponse>;\nexport function getChainAliasTxStatusFunction(\n environment: Environment,\n chainAlias: 'P',\n): GetTxStatusFunction<pvm.GetTxStatusResponse>;\nexport function getChainAliasTxStatusFunction(\n environment: Environment,\n chainAlias: 'X',\n): GetTxStatusFunction<pvm.GetTxStatusResponse>;\nexport function getChainAliasTxStatusFunction(\n environment: Environment,\n chainAlias: AvalancheBlockchainAlias,\n): GetTxStatusFunction<evm.GetAtomicTxStatusResponse | pvm.GetTxStatusResponse>;\nexport function getChainAliasTxStatusFunction(\n environment: Environment,\n chainAlias: AvalancheBlockchainAlias,\n): GetTxStatusFunction<evm.GetAtomicTxStatusResponse | pvm.GetTxStatusResponse> {\n switch (chainAlias) {\n case 'C': {\n return (txId: string) => getAvalancheProvider(environment, chainAlias).getAtomicTxStatus(txId);\n }\n case 'P': {\n return (txId: string) => getAvalancheProvider(environment, chainAlias).getTxStatus({ txID: txId });\n }\n case 'X': {\n return (txId: string) => getAvalancheProvider(environment, chainAlias).getTxStatus({ txID: txId });\n }\n default: {\n throw new InvalidParamsError(\n `Unsupported chain alias: ${chainAlias}`,\n 'Can not get transaction status function for unsupported chain alias.',\n );\n }\n }\n}\n\nexport async function pollPrimaryNetworkTxStatus({\n chainAlias,\n count = POLL_START_COUNT,\n environment,\n signal,\n txId,\n}: {\n chainAlias: AvalancheBlockchainAlias;\n count?: number;\n environment: Environment;\n signal?: AbortSignal;\n txId: string;\n}): Promise<boolean> {\n if (count < 0) {\n return false;\n }\n\n try {\n const pollFunction = getChainAliasTxStatusFunction(environment, chainAlias);\n\n const { status } = await pollFunction(txId);\n\n switch (status) {\n case 'Accepted':\n case 'Committed': {\n return true;\n }\n\n case 'Dropped':\n case 'Rejected': {\n return false;\n }\n\n default: {\n // Fall through to retry logic.\n break;\n }\n }\n\n const failures = POLL_START_COUNT - count;\n\n const waitPeriod = BASE_WAIT_PERIOD_MS * MULTIPLIER ** failures;\n\n await wait(waitPeriod, signal);\n\n return await pollPrimaryNetworkTxStatus({ chainAlias, count: count - 1, environment, signal, txId });\n } catch (error) {\n throw new SdkError('Failed to poll transaction status from Avalanche.', ErrorCode.UNKNOWN, { cause: error });\n }\n}\n"],"mappings":"gLA8BA,SAAgB,EACd,EACA,EAC8E,CAC9E,OAAQ,EAAR,CACE,IAAK,IACH,MAAQ,IAAiB,EAAqB,EAAa,EAAW,CAAC,kBAAkB,EAAK,CAEhG,IAAK,IACH,MAAQ,IAAiB,EAAqB,EAAa,EAAW,CAAC,YAAY,CAAE,KAAM,EAAM,CAAC,CAEpG,IAAK,IACH,MAAQ,IAAiB,EAAqB,EAAa,EAAW,CAAC,YAAY,CAAE,KAAM,EAAM,CAAC,CAEpG,QACE,MAAM,IAAI,EACR,4BAA4B,IAC5B,uEACD,EAKP,eAAsB,EAA2B,CAC/C,aACA,QAAQ,GACR,cACA,SACA,QAOmB,CACnB,GAAI,EAAQ,EACV,MAAO,GAGT,GAAI,CAGF,GAAM,CAAE,UAAW,MAFE,EAA8B,EAAa,EAAW,CAErC,EAAK,CAE3C,OAAQ,EAAR,CACE,IAAK,WACL,IAAK,YACH,MAAO,GAGT,IAAK,UACL,IAAK,WACH,MAAO,GAGT,QAEE,MAUJ,OAFA,MAAM,EAFa,KAAsB,MAFxB,GAAmB,GAIb,EAAO,CAEvB,MAAM,EAA2B,CAAE,aAAY,MAAO,EAAQ,EAAG,cAAa,SAAQ,OAAM,CAAC,OAC7F,EAAO,CACd,MAAM,IAAI,EAAS,oDAAqD,EAAU,QAAS,CAAE,MAAO,EAAO,CAAC"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
require(`../../../_virtual/_rolldown/runtime.cjs`);const e=require(`../_utils.cjs`);let t=require(`@avalabs/avalanchejs`);function n({amountInNanoAvax:n,baseFeeInNanoAvax:r,context:i,destinationChainAlias:a,fromAddress:o,nonce:s,toAddress:c}){let l=e.getChainIdFromContext(a,i),u=t.utils.hexToBuffer(o),[,,d]=t.utils.parse(c);return t.evm.newExportTxFromBaseFee(i,r,n,l,u,[d],s)}function r({amountInNanoAvax:n,changeAddress:r,context:i,destinationChainAlias:a,feeState:o,fromAddresses:s,toAddress:c,utxos:l}){let u=e.getChainIdFromContext(a,i),[,,d]=t.utils.parse(c),[,,f]=t.utils.parse(r),p=e.getAddressesAsBuffers(s),m=t.TransferableOutput.fromNative(i.avaxAssetID,n,[d]),h=e.sortUTXOsByAmount(l,!0);return t.pvm.newExportTx({changeAddressesBytes:[f],destinationChainId:u,feeState:o,fromAddressesBytes:p,outputs:[m],utxos:h},i)}function i({amountInNanoAvax:n,changeAddress:r,context:i,destinationChainAlias:a,fromAddresses:o,toAddress:s,utxos:c}){let l=e.getChainIdFromContext(a,i),[,,u]=t.utils.parse(s),[,,d]=t.utils.parse(r),f=e.getAddressesAsBuffers(o),p=t.TransferableOutput.fromNative(i.avaxAssetID,n,[u]),m=e.sortUTXOsByAmount(c,!0);return t.avm.newExportTx(i,l,f,m,[p],{threshold:1,changeAddresses:[d]})}function a(e){switch(e.sourceChainAlias){case`C`:return n(e);case`P`:return r(e);case`X`:return i(e)}}function o({atomicUtxos:n,baseFeeInNanoAvax:r,context:i,fromAddresses:a,sourceChainAlias:o,toAddress:s}){let c=e.getChainIdFromContext(o,i),l=e.getAddressesAsBuffers(a),u=t.utils.hexToBuffer(s);return t.evm.newImportTxFromBaseFee(i,u,l,n,c,r)}function s({atomicUtxos:n,context:r,feeState:i,fromAddresses:a,sourceChainAlias:o,toAddress:s}){let c=e.getChainIdFromContext(o,r),l=e.getAddressesAsBuffers(a),[,,u]=t.utils.parse(s);return t.pvm.newImportTx({fromAddressesBytes:l,feeState:i,sourceChainId:c,toAddressesBytes:[u],utxos:n},r)}function c({atomicUtxos:n,changeAddress:r,context:i,fromAddresses:a,sourceChainAlias:o,toAddress:s}){let c=e.getChainIdFromContext(o,i),l=e.getAddressesAsBuffers(a),[,,u]=t.utils.parse(r),[,,d]=t.utils.parse(s);return t.avm.newImportTx(i,c,n,[d],l,{changeAddresses:[u]})}function l(e){switch(e.destinationChainAlias){case`C`:return o(e);case`P`:return s(e);case`X`:return c(e)}}exports.exportTx=a,exports.importTx=l;
|
|
2
|
+
//# sourceMappingURL=transactions.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transactions.cjs","names":["getChainIdFromContext","utils","evm","getAddressesAsBuffers","TransferableOutput","sortUTXOsByAmount","pvm","avm"],"sources":["../../../../src/transfer-service/avalanche-cct/_utils/transactions.ts"],"sourcesContent":["import {\n avm,\n evm,\n pvm,\n TransferableOutput,\n utils,\n type Context,\n type UnsignedTx,\n type Utxo,\n} from '@avalabs/avalanchejs';\nimport type { Address as EvmAddress } from 'viem';\nimport type { AvalancheBlockchainAlias } from '../../../constants';\nimport type { XpAddress } from '../types';\nimport { getAddressesAsBuffers, getChainIdFromContext, sortUTXOsByAmount } from '../_utils';\n\ninterface BaseExportTxParams<Alias extends AvalancheBlockchainAlias> {\n amountInNanoAvax: bigint;\n context: Context.Context;\n sourceChainAlias: Alias;\n destinationChainAlias: Exclude<AvalancheBlockchainAlias, Alias>;\n /**\n * The bech32 formatted address of the recipient on the destination chain.\n *\n * Do not use the EVM hex formatted address here for C-Chain. Use the Coreth bech32 formatted address.\n */\n toAddress: XpAddress;\n}\n\nexport interface ExportCChainTxParams extends BaseExportTxParams<'C'> {\n baseFeeInNanoAvax: bigint;\n fromAddress: EvmAddress;\n nonce: bigint;\n}\n\nfunction exportCChainTx({\n amountInNanoAvax,\n baseFeeInNanoAvax,\n context,\n destinationChainAlias,\n fromAddress,\n nonce,\n toAddress,\n}: ExportCChainTxParams): UnsignedTx {\n const destinationChainId = getChainIdFromContext(destinationChainAlias, context);\n const fromAddressBuffer = utils.hexToBuffer(fromAddress);\n const [, , toAddressBytes] = utils.parse(toAddress);\n\n return evm.newExportTxFromBaseFee(\n context,\n baseFeeInNanoAvax,\n amountInNanoAvax,\n destinationChainId,\n fromAddressBuffer,\n [toAddressBytes],\n nonce,\n );\n}\n\nexport interface ExportPChainTxParams extends BaseExportTxParams<'P'> {\n /** P-Chain change address. */\n changeAddress: XpAddress;\n feeState: pvm.FeeState;\n /** List of P-Chain bech32 addresses from user's wallet. */\n fromAddresses: XpAddress[];\n utxos: Utxo[];\n}\n\nfunction exportPChainTx({\n amountInNanoAvax,\n changeAddress,\n context,\n destinationChainAlias,\n feeState,\n fromAddresses,\n toAddress,\n utxos,\n}: ExportPChainTxParams): UnsignedTx {\n const destinationChainId = getChainIdFromContext(destinationChainAlias, context);\n const [, , toAddressBytes] = utils.parse(toAddress);\n\n const [, , changeAddressBytes] = utils.parse(changeAddress);\n const fromAddressesBytes = getAddressesAsBuffers(fromAddresses);\n const output = TransferableOutput.fromNative(context.avaxAssetID, amountInNanoAvax, [toAddressBytes]);\n const sortedUtxos = sortUTXOsByAmount(utxos, true);\n\n return pvm.newExportTx(\n {\n changeAddressesBytes: [changeAddressBytes],\n destinationChainId,\n feeState,\n fromAddressesBytes,\n outputs: [output],\n utxos: sortedUtxos,\n },\n context,\n );\n}\n\nexport interface ExportXChainTxParams extends BaseExportTxParams<'X'> {\n /** X-Chain change address. */\n changeAddress: XpAddress;\n /** List of X-Chain bech32 addresses from user's wallet. */\n fromAddresses: XpAddress[];\n utxos: Utxo[];\n}\n\nfunction exportXChainTx({\n amountInNanoAvax,\n changeAddress,\n context,\n destinationChainAlias,\n fromAddresses,\n toAddress,\n utxos,\n}: ExportXChainTxParams): UnsignedTx {\n const destinationChainId = getChainIdFromContext(destinationChainAlias, context);\n const [, , toAddressBytes] = utils.parse(toAddress);\n\n const [, , changeAddressBytes] = utils.parse(changeAddress);\n const fromAddressesBytes = getAddressesAsBuffers(fromAddresses);\n const output = TransferableOutput.fromNative(context.avaxAssetID, amountInNanoAvax, [toAddressBytes]);\n const sortedUtxos = sortUTXOsByAmount(utxos, true);\n\n return avm.newExportTx(context, destinationChainId, fromAddressesBytes, sortedUtxos, [output], {\n threshold: 1,\n changeAddresses: [changeAddressBytes],\n });\n}\n\nexport type ExportTxParams = ExportCChainTxParams | ExportPChainTxParams | ExportXChainTxParams;\n\nexport function exportTx(params: ExportTxParams): UnsignedTx {\n switch (params.sourceChainAlias) {\n case 'C': {\n return exportCChainTx(params);\n }\n\n case 'P': {\n return exportPChainTx(params);\n }\n\n case 'X': {\n return exportXChainTx(params);\n }\n }\n}\n\ninterface BaseImportTxParams<Alias extends AvalancheBlockchainAlias> {\n atomicUtxos: Utxo[];\n context: Context.Context;\n destinationChainAlias: Alias;\n fromAddresses: XpAddress[];\n sourceChainAlias: Exclude<AvalancheBlockchainAlias, Alias>;\n}\n\nexport interface ImportCChainTxParams extends BaseImportTxParams<'C'> {\n baseFeeInNanoAvax: bigint;\n toAddress: EvmAddress;\n}\n\nfunction importCChainTx({\n atomicUtxos,\n baseFeeInNanoAvax,\n context,\n fromAddresses,\n sourceChainAlias,\n toAddress,\n}: ImportCChainTxParams): UnsignedTx {\n const sourceChainId = getChainIdFromContext(sourceChainAlias, context);\n const fromAddressesBytes = getAddressesAsBuffers(fromAddresses);\n const toAddressBytes = utils.hexToBuffer(toAddress);\n\n return evm.newImportTxFromBaseFee(\n context,\n toAddressBytes,\n fromAddressesBytes,\n atomicUtxos,\n sourceChainId,\n baseFeeInNanoAvax,\n );\n}\n\nexport interface ImportPChainTxParams extends BaseImportTxParams<'P'> {\n feeState: pvm.FeeState;\n toAddress: XpAddress;\n}\n\nfunction importPChainTx({\n atomicUtxos,\n context,\n feeState,\n fromAddresses,\n sourceChainAlias,\n toAddress,\n}: ImportPChainTxParams): UnsignedTx {\n const sourceChainId = getChainIdFromContext(sourceChainAlias, context);\n const fromAddressesBytes = getAddressesAsBuffers(fromAddresses);\n const [, , toAddressBytes] = utils.parse(toAddress);\n\n return pvm.newImportTx(\n {\n fromAddressesBytes,\n feeState,\n sourceChainId,\n toAddressesBytes: [toAddressBytes],\n utxos: atomicUtxos,\n },\n context,\n );\n}\n\nexport interface ImportXChainTxParams extends BaseImportTxParams<'X'> {\n changeAddress: XpAddress;\n toAddress: XpAddress;\n}\n\nfunction importXChainTx({\n atomicUtxos,\n changeAddress,\n context,\n fromAddresses,\n sourceChainAlias,\n toAddress,\n}: ImportXChainTxParams): UnsignedTx {\n const sourceChainId = getChainIdFromContext(sourceChainAlias, context);\n const fromAddressesBytes = getAddressesAsBuffers(fromAddresses);\n const [, , changeAddressBytes] = utils.parse(changeAddress);\n const [, , toAddressBytes] = utils.parse(toAddress);\n\n return avm.newImportTx(context, sourceChainId, atomicUtxos, [toAddressBytes], fromAddressesBytes, {\n changeAddresses: [changeAddressBytes],\n });\n}\n\nexport type ImportTxParams = ImportCChainTxParams | ImportPChainTxParams | ImportXChainTxParams;\n\nexport function importTx(params: ImportTxParams): UnsignedTx {\n switch (params.destinationChainAlias) {\n case 'C': {\n return importCChainTx(params);\n }\n\n case 'P': {\n return importPChainTx(params);\n }\n\n case 'X': {\n return importXChainTx(params);\n }\n }\n}\n"],"mappings":"0HAkCA,SAAS,EAAe,CACtB,mBACA,oBACA,UACA,wBACA,cACA,QACA,aACmC,CACnC,IAAM,EAAqBA,EAAAA,sBAAsB,EAAuB,EAAQ,CAC1E,EAAoBC,EAAAA,MAAM,YAAY,EAAY,CAClD,GAAK,GAAkBA,EAAAA,MAAM,MAAM,EAAU,CAEnD,OAAOC,EAAAA,IAAI,uBACT,EACA,EACA,EACA,EACA,EACA,CAAC,EAAe,CAChB,EACD,CAYH,SAAS,EAAe,CACtB,mBACA,gBACA,UACA,wBACA,WACA,gBACA,YACA,SACmC,CACnC,IAAM,EAAqBF,EAAAA,sBAAsB,EAAuB,EAAQ,CAC1E,GAAK,GAAkBC,EAAAA,MAAM,MAAM,EAAU,CAE7C,GAAK,GAAsBA,EAAAA,MAAM,MAAM,EAAc,CACrD,EAAqBE,EAAAA,sBAAsB,EAAc,CACzD,EAASC,EAAAA,mBAAmB,WAAW,EAAQ,YAAa,EAAkB,CAAC,EAAe,CAAC,CAC/F,EAAcC,EAAAA,kBAAkB,EAAO,GAAK,CAElD,OAAOC,EAAAA,IAAI,YACT,CACE,qBAAsB,CAAC,EAAmB,CAC1C,qBACA,WACA,qBACA,QAAS,CAAC,EAAO,CACjB,MAAO,EACR,CACD,EACD,CAWH,SAAS,EAAe,CACtB,mBACA,gBACA,UACA,wBACA,gBACA,YACA,SACmC,CACnC,IAAM,EAAqBN,EAAAA,sBAAsB,EAAuB,EAAQ,CAC1E,GAAK,GAAkBC,EAAAA,MAAM,MAAM,EAAU,CAE7C,GAAK,GAAsBA,EAAAA,MAAM,MAAM,EAAc,CACrD,EAAqBE,EAAAA,sBAAsB,EAAc,CACzD,EAASC,EAAAA,mBAAmB,WAAW,EAAQ,YAAa,EAAkB,CAAC,EAAe,CAAC,CAC/F,EAAcC,EAAAA,kBAAkB,EAAO,GAAK,CAElD,OAAOE,EAAAA,IAAI,YAAY,EAAS,EAAoB,EAAoB,EAAa,CAAC,EAAO,CAAE,CAC7F,UAAW,EACX,gBAAiB,CAAC,EAAmB,CACtC,CAAC,CAKJ,SAAgB,EAAS,EAAoC,CAC3D,OAAQ,EAAO,iBAAf,CACE,IAAK,IACH,OAAO,EAAe,EAAO,CAG/B,IAAK,IACH,OAAO,EAAe,EAAO,CAG/B,IAAK,IACH,OAAO,EAAe,EAAO,EAkBnC,SAAS,EAAe,CACtB,cACA,oBACA,UACA,gBACA,mBACA,aACmC,CACnC,IAAM,EAAgBP,EAAAA,sBAAsB,EAAkB,EAAQ,CAChE,EAAqBG,EAAAA,sBAAsB,EAAc,CACzD,EAAiBF,EAAAA,MAAM,YAAY,EAAU,CAEnD,OAAOC,EAAAA,IAAI,uBACT,EACA,EACA,EACA,EACA,EACA,EACD,CAQH,SAAS,EAAe,CACtB,cACA,UACA,WACA,gBACA,mBACA,aACmC,CACnC,IAAM,EAAgBF,EAAAA,sBAAsB,EAAkB,EAAQ,CAChE,EAAqBG,EAAAA,sBAAsB,EAAc,CACzD,GAAK,GAAkBF,EAAAA,MAAM,MAAM,EAAU,CAEnD,OAAOK,EAAAA,IAAI,YACT,CACE,qBACA,WACA,gBACA,iBAAkB,CAAC,EAAe,CAClC,MAAO,EACR,CACD,EACD,CAQH,SAAS,EAAe,CACtB,cACA,gBACA,UACA,gBACA,mBACA,aACmC,CACnC,IAAM,EAAgBN,EAAAA,sBAAsB,EAAkB,EAAQ,CAChE,EAAqBG,EAAAA,sBAAsB,EAAc,CACzD,GAAK,GAAsBF,EAAAA,MAAM,MAAM,EAAc,CACrD,GAAK,GAAkBA,EAAAA,MAAM,MAAM,EAAU,CAEnD,OAAOM,EAAAA,IAAI,YAAY,EAAS,EAAe,EAAa,CAAC,EAAe,CAAE,EAAoB,CAChG,gBAAiB,CAAC,EAAmB,CACtC,CAAC,CAKJ,SAAgB,EAAS,EAAoC,CAC3D,OAAQ,EAAO,sBAAf,CACE,IAAK,IACH,OAAO,EAAe,EAAO,CAG/B,IAAK,IACH,OAAO,EAAe,EAAO,CAG/B,IAAK,IACH,OAAO,EAAe,EAAO"}
|