@paraspell/sdk-core 14.3.4 → 14.3.6

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/index.mjs CHANGED
@@ -1,11 +1,11 @@
1
1
  import { blake2b } from '@noble/hashes/blake2.js';
2
- import { isChainEvm, getAssetsObject, InvalidCurrencyError, isSymbolMatch, isAssetEqual, isStableCoinAsset, isAdditionalSubstrateBridgeAsset, isBridgedSystemAsset, STABLECOIN_IDS, isSymbolSpecifier, normalizeLocation, getNativeAssetSymbol, getEdFromAssetOrThrow, extractAssetLocation, hasDryRunSupport, normalizeSymbol, Native, getOtherAssets, canonicalizeLocation, getAssetsObjectImpl, getAssetsImpl, getNativeAssetsImpl, getOtherAssetsImpl, findAssetInfoImpl, findAssetInfoOrThrowImpl, findAssetInfoOnDestImpl, findAssetOnDestOrThrowImpl, findNativeAssetInfoImpl, findNativeAssetInfoOrThrowImpl, isChainEvmImpl, getNativeAssetSymbolImpl, getRelayChainSymbolImpl, hasDryRunSupportImpl, hasXcmPaymentApiSupportImpl, getExistentialDepositOrThrowImpl, normalizeCustomAssets } from '@paraspell/assets';
2
+ import { isChainEvm, getAssetsObject, InvalidCurrencyError, isAssetEqual, isSymbolMatch, isStableCoinAsset, isAdditionalSubstrateBridgeAsset, isBridgedSystemAsset, STABLECOIN_IDS, isSymbolSpecifier, normalizeLocation, getNativeAssetSymbol, getEdFromAssetOrThrow, extractAssetLocation, hasDryRunSupport, normalizeSymbol, Native, getOtherAssets, canonicalizeLocation, getAssetsObjectImpl, getAssetsImpl, getNativeAssetsImpl, getOtherAssetsImpl, findAssetInfoImpl, findAssetInfoOrThrowImpl, findAssetInfoOnDestImpl, findAssetOnDestOrThrowImpl, findNativeAssetInfoImpl, findNativeAssetInfoOrThrowImpl, isChainEvmImpl, getNativeAssetSymbolImpl, getRelayChainSymbolImpl, hasDryRunSupportImpl, hasXcmPaymentApiSupportImpl, getExistentialDepositOrThrowImpl, normalizeCustomAssets } from '@paraspell/assets';
3
3
  export * from '@paraspell/assets';
4
4
  import { base58 } from '@scure/base';
5
5
  import { isAddress, isHex, createPublicClient, http, formatUnits as formatUnits$1, parseUnits as parseUnits$1 } from 'viem';
6
- import { ParaSpellError, isTLocation, replaceBigInt, isExternalChain, CHAINS, Version, isRelayChain, isSubstrateBridge, Parents, deepEqual, isTrustedChain, isCustomChain, isSnowbridge, getJunctionValue, hasJunction, ETHEREUM_BRIDGE_ORIGINS, isBridge, flattenJunctions, RELAYCHAINS, DEFAULT_SS58_PREFIX } from '@paraspell/sdk-common';
6
+ import { ParaSpellError, isTLocation, replaceBigInt, isExternalChain, CHAINS, Version, isRelayChain, isSubstrateBridge, Parents, deepEqual, isTrustedChain, isCustomChain, isSnowbridge, getJunctionValue, hasJunction, ETHEREUM_BRIDGE_ORIGINS, isBridge, isSubstrateChain, flattenJunctions, RELAYCHAINS, DEFAULT_SS58_PREFIX } from '@paraspell/sdk-common';
7
7
  export * from '@paraspell/sdk-common';
8
- import { getXcmPallet, getOtherAssetsPallets, getNativeAssetsPallet, getSupportedPalletsDetails, ASSETS_PALLETS, NATIVE_ASSETS_PALLET_PRIORITY, OTHER_ASSETS_PALLET_PRIORITY, hasPalletImpl, getXcmPalletImpl } from '@paraspell/pallets';
8
+ import { getOtherAssetsPallets, getNativeAssetsPallet, BRIDGE_PALLETS, getPalletIndex, getXcmPallet, getSupportedPalletsDetails, ASSETS_PALLETS, NATIVE_ASSETS_PALLET_PRIORITY, OTHER_ASSETS_PALLET_PRIORITY, hasPalletImpl, getXcmPalletImpl } from '@paraspell/pallets';
9
9
  export * from '@paraspell/pallets';
10
10
  import { mainnet, sepolia } from 'viem/chains';
11
11
  import { keccak_256 } from '@noble/hashes/sha3.js';
@@ -2040,7 +2040,12 @@ var createBuyExecution = function createBuyExecution(asset, weight) {
2040
2040
  return [{
2041
2041
  BuyExecution: {
2042
2042
  fees: asset,
2043
- weight_limit: 'Unlimited'
2043
+ weight_limit: weight ? {
2044
+ Limited: {
2045
+ ref_time: weight.refTime,
2046
+ proof_size: weight.proofSize
2047
+ }
2048
+ } : 'Unlimited'
2044
2049
  }
2045
2050
  }];
2046
2051
  };
@@ -2142,65 +2147,6 @@ var createTransactInstructions = /*#__PURE__*/function () {
2142
2147
  };
2143
2148
  }();
2144
2149
 
2145
- var handleTransactUsingSend = /*#__PURE__*/function () {
2146
- var _ref2 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee(_ref) {
2147
- var api, version, chain, destination, destChain, recipient, paraIdTo, asset, transactOptions, dest, transactInstructions, message;
2148
- return _regenerator().w(function (_context) {
2149
- while (1) switch (_context.n) {
2150
- case 0:
2151
- api = _ref.api, version = _ref.version, chain = _ref.chain, destination = _ref.destination, destChain = _ref.destChain, recipient = _ref.recipient, paraIdTo = _ref.paraIdTo, asset = _ref.asset, transactOptions = _ref.transactOptions;
2152
- dest = createDestination(api, version, chain, destination, paraIdTo);
2153
- if (transactOptions !== null && transactOptions !== void 0 && transactOptions.call) {
2154
- _context.n = 1;
2155
- break;
2156
- }
2157
- throw new UnsupportedOperationError('Cannot use handleTransactUsingSend without transactOptions.call defined');
2158
- case 1:
2159
- if (destChain) {
2160
- _context.n = 2;
2161
- break;
2162
- }
2163
- throw new UnsupportedOperationError('destChain must be provided when using handleTransactUsingSend');
2164
- case 2:
2165
- assertAddressIsString(recipient);
2166
- _context.n = 3;
2167
- return createTransactInstructions(api, transactOptions, version, destChain, recipient);
2168
- case 3:
2169
- transactInstructions = _context.v;
2170
- message = [{
2171
- WithdrawAsset: [asset]
2172
- }].concat(_toConsumableArray(createBuyExecution(asset)), _toConsumableArray(transactInstructions), [{
2173
- RefundSurplus: undefined
2174
- }, {
2175
- DepositAsset: {
2176
- assets: {
2177
- Wild: {
2178
- AllCounted: 1
2179
- }
2180
- },
2181
- beneficiary: createBeneficiaryLocation({
2182
- api: api,
2183
- address: recipient,
2184
- version: version
2185
- })
2186
- }
2187
- }]);
2188
- return _context.a(2, {
2189
- module: getXcmPallet(chain),
2190
- method: 'send',
2191
- params: {
2192
- dest: addXcmVersionHeader(dest, version),
2193
- message: addXcmVersionHeader(message, version)
2194
- }
2195
- });
2196
- }
2197
- }, _callee);
2198
- }));
2199
- return function handleTransactUsingSend(_x) {
2200
- return _ref2.apply(this, arguments);
2201
- };
2202
- }();
2203
-
2204
2150
  var BaseAssetsPallet = /*#__PURE__*/_createClass(function BaseAssetsPallet(palletName) {
2205
2151
  _classCallCheck(this, BaseAssetsPallet);
2206
2152
  this.palletName = palletName;
@@ -2705,6 +2651,14 @@ var resolveParaId = function resolveParaId(paraId, destination, api) {
2705
2651
  return paraId !== undefined ? paraId : api.getParaId(destination);
2706
2652
  };
2707
2653
 
2654
+ var getFeeAssetInfo = function getFeeAssetInfo(assetInfo, feeAssetInfo) {
2655
+ return feeAssetInfo && !isAssetEqual(assetInfo, feeAssetInfo) ? feeAssetInfo : undefined;
2656
+ };
2657
+ var hasMatchingFeeAssetReserve = function hasMatchingFeeAssetReserve(api, chain, assetInfo, feeAssetInfo) {
2658
+ var resolvedFeeAssetInfo = getFeeAssetInfo(assetInfo, feeAssetInfo);
2659
+ return !resolvedFeeAssetInfo || api.getAssetReserveChain(chain, resolvedFeeAssetInfo.location) === api.getAssetReserveChain(chain, assetInfo.location);
2660
+ };
2661
+
2708
2662
  var resolveScenario = function resolveScenario(origin, destination) {
2709
2663
  if (isRelayChain(origin)) return 'RelayToPara';
2710
2664
  var isRelayDestination = !isTLocation(destination) && isRelayChain(destination);
@@ -2762,7 +2716,7 @@ var SubstrateChain = /*#__PURE__*/function (_Chain) {
2762
2716
  key: "transfer",
2763
2717
  value: function () {
2764
2718
  var _transfer = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee(transferOptions) {
2765
- var api, asset, currency, feeAsset, feeCurrency, recipient, destination, paraIdTo, overriddenAsset, version, sender, ahAddress, pallet, method, keepAlive, transactOptions, scenario, paraId, destChain, isLocalTransfer, isRelayAsset, mythAsset, isMythAsset, assetNeedsTypeThen, shouldUseReserveTransfer, supportsTypeThen, isSubBridge, useTypeAndThen, options, promise, isAHOrigin, isAHDest, isExternalAsset, isEthDest, isExternalAssetViaAh, isExternalAssetToAh, call, input, _t;
2719
+ var api, asset, currency, feeAsset, feeCurrency, recipient, destination, paraIdTo, overriddenAsset, version, sender, ahAddress, pallet, method, keepAlive, transactOptions, scenario, paraId, destChain, isLocalTransfer, isRelayAsset, mythAsset, isMythAsset, assetNeedsTypeThen, shouldUseReserveTransfer, supportsTypeThen, isSubBridge, useTypeAndThen, options, promise, isAHOrigin, isAHDest, isExternalAsset, isEthDest, isExternalAssetViaAh, isExternalAssetToAh, tx, call, input, _t;
2766
2720
  return _regenerator().w(function (_context) {
2767
2721
  while (1) switch (_context.n) {
2768
2722
  case 0:
@@ -2803,9 +2757,9 @@ var SubstrateChain = /*#__PURE__*/function (_Chain) {
2803
2757
  }
2804
2758
  throw new TypeAndThenUnavailableError('Relaychain assets require the type-and-then method which is not supported by this chain.');
2805
2759
  case 4:
2806
- useTypeAndThen = !shouldUseReserveTransfer && assetNeedsTypeThen && supportsTypeThen && destChain && !isExternalChain(destChain) && !feeAsset && (!isTrustedChain(this.chain) || !isTrustedChain(destChain)) || isSubBridge;
2760
+ useTypeAndThen = !shouldUseReserveTransfer && assetNeedsTypeThen && supportsTypeThen && destChain && !isExternalChain(destChain) && (!isTrustedChain(this.chain) || !isTrustedChain(destChain)) || isSubBridge;
2807
2761
  if (!(supportsPolkadotXCM(this) || useTypeAndThen)) {
2808
- _context.n = 13;
2762
+ _context.n = 14;
2809
2763
  break;
2810
2764
  }
2811
2765
  options = {
@@ -2856,44 +2810,52 @@ var SubstrateChain = /*#__PURE__*/function (_Chain) {
2856
2810
  isAHDest = !isTLocation(destination) && destination.includes('AssetHub'); // Handle common cases
2857
2811
  isExternalAsset = asset.location.parents === Parents.TWO;
2858
2812
  isEthDest = _typeof(destination) !== 'object' && isExternalChain(destination); // External asset - Any origin to any dest via AH - DestinationReserve - multiple instructions
2859
- isExternalAssetViaAh = isExternalAsset && !isAHOrigin && !isAHDest && !isEthDest && !feeAsset; // External asset - Any origin to AHP - DestinationReserve - one DepositAsset instruction
2860
- isExternalAssetToAh = isExternalAsset && isAHDest && !isAHOrigin && !isEthDest && !feeAsset;
2813
+ isExternalAssetViaAh = isExternalAsset && !isAHOrigin && !isAHDest && !isEthDest; // External asset - Any origin to AHP - DestinationReserve - one DepositAsset instruction
2814
+ isExternalAssetToAh = isExternalAsset && isAHDest && !isAHOrigin && !isEthDest;
2861
2815
  if (!(isExternalAssetViaAh || isExternalAssetToAh || useTypeAndThen)) {
2862
- _context.n = 10;
2816
+ _context.n = 11;
2863
2817
  break;
2864
2818
  }
2865
2819
  if (!(useTypeAndThen && supportsPolkadotXCM(this) && !isSubBridge)) {
2866
- _context.n = 8;
2820
+ _context.n = 9;
2867
2821
  break;
2868
2822
  }
2869
2823
  _context.n = 8;
2870
2824
  return this.transferPolkadotXCM(options);
2871
2825
  case 8:
2872
- _context.n = 9;
2873
- return createTypeAndThenCall(options);
2826
+ tx = _context.v;
2827
+ if (!this.shouldUseExecuteTransfer(options)) {
2828
+ _context.n = 9;
2829
+ break;
2830
+ }
2831
+ return _context.a(2, tx);
2874
2832
  case 9:
2833
+ _context.n = 10;
2834
+ return createTypeAndThenCall(options);
2835
+ case 10:
2875
2836
  call = _context.v;
2876
2837
  return _context.a(2, api.deserializeExtrinsics(call));
2877
- case 10:
2838
+ case 11:
2878
2839
  if (!supportsPolkadotXCM(this)) {
2879
- _context.n = 12;
2840
+ _context.n = 13;
2880
2841
  break;
2881
2842
  }
2882
- if (!(this.shouldUseNativeAssetTeleport(transferOptions) && !this.shouldUseExecuteTransfer(options))) {
2883
- _context.n = 11;
2843
+ if (!(this.shouldUseNativeAssetTeleport(transferOptions) && !getFeeAssetInfo(asset, feeAsset) && !this.shouldUseExecuteTransfer(options))) {
2844
+ _context.n = 12;
2884
2845
  break;
2885
2846
  }
2886
2847
  return _context.a(2, transferPolkadotXcm(options, 'limited_teleport_assets', 'Unlimited'));
2887
- case 11:
2888
- return _context.a(2, this.transferPolkadotXCM(options));
2889
2848
  case 12:
2890
- _context.n = 14;
2891
- break;
2849
+ return _context.a(2, this.transferPolkadotXCM(options));
2892
2850
  case 13:
2851
+ _context.n = 15;
2852
+ break;
2853
+ case 14:
2893
2854
  if (!supportsXTokens(this)) {
2894
- _context.n = 14;
2855
+ _context.n = 15;
2895
2856
  break;
2896
2857
  }
2858
+ validateFeeAssetSupport(asset, feeAsset, overriddenAsset, 'XTokens');
2897
2859
  input = {
2898
2860
  api: api,
2899
2861
  asset: asset,
@@ -2908,9 +2870,9 @@ var SubstrateChain = /*#__PURE__*/function (_Chain) {
2908
2870
  method: method
2909
2871
  };
2910
2872
  return _context.a(2, this.transferXTokens(input));
2911
- case 14:
2912
- throw new NoXCMSupportImplementedError(this.chain);
2913
2873
  case 15:
2874
+ throw new NoXCMSupportImplementedError(this.chain);
2875
+ case 16:
2914
2876
  return _context.a(2);
2915
2877
  }
2916
2878
  }, _callee, this);
@@ -3310,15 +3272,19 @@ var resolveCurrency = function resolveCurrency(api, currency, resolvedFeeAsset,
3310
3272
  };
3311
3273
 
3312
3274
  var resolveFeeAsset = function resolveFeeAsset(api, feeAsset, origin, destination, currency) {
3313
- if (!Array.isArray(currency) && !origin.startsWith('Hydration') && origin !== 'AssetHubPolkadot') {
3314
- throw new ScenarioNotSupportedError("Fee asset is not supported on ".concat(origin));
3315
- }
3316
3275
  var dest = !isTLocation(destination) ? destination : null;
3317
3276
  var asset = api.findAssetInfo(origin, feeAsset, dest);
3318
3277
  if (!asset) {
3319
3278
  return throwUnsupportedCurrency(feeAsset, origin);
3320
3279
  }
3321
3280
  if (!Array.isArray(currency)) {
3281
+ if (dest && isExternalChain(dest)) {
3282
+ var transferredAsset = api.findAssetInfo(origin, currency, dest);
3283
+ var relayAsset = api.findNativeAssetInfoOrThrow(api.getRelayChainOf(origin));
3284
+ if (!isAssetEqual(asset, relayAsset) && !(transferredAsset && isAssetEqual(asset, transferredAsset))) {
3285
+ throw new ScenarioNotSupportedError('Only the relay chain native asset can be used as fee asset for Snowbridge transfers');
3286
+ }
3287
+ }
3322
3288
  return asset;
3323
3289
  }
3324
3290
  var feeElement = currency.find(function (item) {
@@ -3328,13 +3294,16 @@ var resolveFeeAsset = function resolveFeeAsset(api, feeAsset, origin, destinatio
3328
3294
  if (!feeElement) {
3329
3295
  throw new InvalidCurrencyError('Fee asset must be one of the provided assets');
3330
3296
  }
3297
+ if (currency.length > 2) {
3298
+ throw new UnsupportedOperationError('Sending more than one non-fee asset is not yet supported');
3299
+ }
3331
3300
  return _objectSpread2(_objectSpread2({}, asset), {}, {
3332
3301
  amount: abstractDecimals(feeElement.amount, asset.decimals, api)
3333
3302
  });
3334
3303
  };
3335
3304
 
3336
3305
  var resolveHopAsset = function resolveHopAsset(_ref) {
3337
- var _api$findAssetInfoOnD;
3306
+ var _api$findAssetInfoOnD2;
3338
3307
  var api = _ref.api,
3339
3308
  tx = _ref.tx,
3340
3309
  originChain = _ref.originChain,
@@ -3344,16 +3313,27 @@ var resolveHopAsset = function resolveHopAsset(_ref) {
3344
3313
  asset = _ref.asset,
3345
3314
  currentAsset = _ref.currentAsset,
3346
3315
  hasPassedExchange = _ref.hasPassedExchange,
3347
- currency = _ref.currency;
3348
- var isRelayAssetIncluded = !Array.isArray(currency) && api.getTypeThenAssetCount(tx) === 2;
3316
+ currency = _ref.currency,
3317
+ feeAsset = _ref.feeAsset;
3318
+ var feeAssetInfo = feeAsset && getFeeAssetInfo(asset, feeAsset);
3319
+ var isRelayAssetIncluded = !Array.isArray(currency) && !feeAssetInfo && api.getTypeThenAssetCount(tx) === 2;
3349
3320
  var useRelayAssetAsFee = typeof destination === 'string' && isExternalChain(destination) || isRelayAssetIncluded;
3350
3321
  if (useRelayAssetAsFee) {
3351
- return api.findNativeAssetInfoOrThrow(getRelayChainOf(currentChain));
3322
+ var originRelay = api.getRelayChainOf(originChain);
3323
+ return getRelayChainOf(currentChain) === originRelay ? api.findNativeAssetInfoOrThrow(originRelay) : api.findAssetInfoOrThrow(currentChain, {
3324
+ location: api.localizeLocation(currentChain, RELAY_LOCATION, originChain)
3325
+ });
3326
+ }
3327
+ if (feeAssetInfo) {
3328
+ var _api$findAssetInfoOnD;
3329
+ return (_api$findAssetInfoOnD = api.findAssetInfoOnDest(originChain, currentChain, {
3330
+ location: feeAssetInfo.location
3331
+ }, feeAssetInfo)) !== null && _api$findAssetInfoOnD !== void 0 ? _api$findAssetInfoOnD : feeAssetInfo;
3352
3332
  }
3353
3333
  if (hasPassedExchange && swapConfig && currentChain !== swapConfig.exchangeChain) {
3354
3334
  return api.findAssetOnDestOrThrow(swapConfig.exchangeChain, currentChain, swapConfig.currencyTo);
3355
3335
  }
3356
- return (_api$findAssetInfoOnD = api.findAssetInfoOnDest(originChain, currentChain, currency, asset)) !== null && _api$findAssetInfoOnD !== void 0 ? _api$findAssetInfoOnD : currentAsset;
3336
+ return (_api$findAssetInfoOnD2 = api.findAssetInfoOnDest(originChain, currentChain, currency, asset)) !== null && _api$findAssetInfoOnD2 !== void 0 ? _api$findAssetInfoOnD2 : currentAsset;
3357
3337
  };
3358
3338
 
3359
3339
  var getEthereumJunction = function getEthereumJunction(api, chain) {
@@ -3466,6 +3446,13 @@ var resolveOverriddenAsset = function resolveOverriddenAsset(options, isBridge,
3466
3446
  return undefined;
3467
3447
  };
3468
3448
 
3449
+ /**
3450
+ * Whether the chain can charge the origin transaction fee in a user-selected fee asset.
3451
+ */
3452
+ var supportsFeeAssetPayment = function supportsFeeAssetPayment(chain) {
3453
+ return chain === 'AssetHubPolkadot' || chain.startsWith('Hydration');
3454
+ };
3455
+
3469
3456
  var validateCurrency = function validateCurrency(currency, feeAsset) {
3470
3457
  if (Array.isArray(currency)) {
3471
3458
  if (currency.length === 0) {
@@ -3479,6 +3466,11 @@ var validateCurrency = function validateCurrency(currency, feeAsset) {
3479
3466
  }
3480
3467
  }
3481
3468
  };
3469
+ var validateFeeAssetSupport = function validateFeeAssetSupport(assetInfo, feeAsset, overriddenAsset, method) {
3470
+ if (getFeeAssetInfo(assetInfo, feeAsset) && !overriddenAsset) {
3471
+ throw new ScenarioNotSupportedError("Fee asset cannot be used with ".concat(method));
3472
+ }
3473
+ };
3482
3474
  var validateDestination = function validateDestination(origin, destination, api) {
3483
3475
  if (isRelayChain(origin) && !isTLocation(destination) && isRelayChain(destination) && origin !== destination) {
3484
3476
  throw new ScenarioNotSupportedError('Direct relay chain to relay chain transfers are not supported. Please use Polkadot <-> Kusama bridge through AssetHub.');
@@ -3710,357 +3702,37 @@ var getMythosOriginFee = /*#__PURE__*/function () {
3710
3702
  };
3711
3703
  }();
3712
3704
 
3713
- var createX1Payload = function createX1Payload(version, junction) {
3714
- return version === Version.V3 ? {
3715
- X1: junction
3716
- } : {
3717
- X1: [junction]
3718
- };
3705
+ var evmExtension;
3706
+ var registerEvmExtension = function registerEvmExtension(extension) {
3707
+ evmExtension = extension;
3719
3708
  };
3720
-
3721
- var createAccountPayload = function createAccountPayload(api, address) {
3722
- return isAddress(address) ? {
3723
- AccountKey20: {
3724
- key: address
3725
- }
3726
- } : {
3727
- AccountId32: {
3728
- id: api.accountToHex(address)
3729
- }
3730
- };
3709
+ var getEvmExtensionOrThrow = function getEvmExtensionOrThrow() {
3710
+ assertExtensionInstalled(evmExtension, 'EVM', '@paraspell/evm', 'using an EVM origin');
3711
+ return evmExtension;
3731
3712
  };
3732
- var createBeneficiaryLocXTokens = function createBeneficiaryLocXTokens(_ref) {
3733
- var api = _ref.api,
3734
- recipient = _ref.recipient,
3735
- origin = _ref.origin,
3736
- destination = _ref.destination,
3737
- version = _ref.version,
3738
- paraId = _ref.paraId;
3739
- if (isTLocation(recipient)) {
3740
- return recipient;
3741
- }
3742
- var scenario = resolveScenario(origin, destination);
3743
- var accountPayload = createAccountPayload(api, recipient);
3744
- if (scenario === 'ParaToRelay') {
3745
- return {
3746
- parents: Parents.ONE,
3747
- interior: createX1Payload(version, {
3748
- AccountId32: {
3749
- id: api.accountToHex(recipient)
3750
- }
3751
- })
3752
- };
3753
- } else if (scenario === 'ParaToPara') {
3754
- return {
3755
- parents: Parents.ONE,
3756
- interior: {
3757
- X2: [{
3758
- Parachain: paraId
3759
- }, accountPayload]
3760
- }
3761
- };
3762
- }
3763
- return {
3764
- parents: Parents.ZERO,
3765
- interior: createX1Payload(version, accountPayload)
3766
- };
3713
+
3714
+ var evmSnowbridgeExtension;
3715
+ var registerEvmSnowbridgeExtension = function registerEvmSnowbridgeExtension(extension) {
3716
+ evmSnowbridgeExtension = extension;
3767
3717
  };
3768
- var createBeneficiaryLocation = function createBeneficiaryLocation(_ref2) {
3769
- var api = _ref2.api,
3770
- address = _ref2.address,
3771
- version = _ref2.version;
3772
- if (isTLocation(address)) return address;
3773
- var accountPayload = createAccountPayload(api, address);
3774
- return {
3775
- parents: Parents.ZERO,
3776
- interior: createX1Payload(version, accountPayload)
3777
- };
3718
+ var getEvmSnowbridgeExtensionOrThrow = function getEvmSnowbridgeExtensionOrThrow() {
3719
+ assertExtensionInstalled(evmSnowbridgeExtension, 'EVM Snowbridge', '@paraspell/evm-snowbridge', 'using Ethereum as an origin');
3720
+ return evmSnowbridgeExtension;
3778
3721
  };
3779
3722
 
3780
- var createDestination = function createDestination(api, version, origin, destination, chainId, junction, parents) {
3781
- var isLocDestination = isTLocation(destination);
3782
- var isSubBridge = !isLocDestination && !isExternalChain(destination) && isSubstrateBridge(origin, destination);
3783
- if (isSubBridge) {
3784
- return {
3785
- parents: Parents.TWO,
3786
- interior: {
3787
- X2: [{
3788
- GlobalConsensus: api.getRelayChainOf(destination)
3789
- }, {
3790
- Parachain: chainId
3791
- }]
3792
- }
3793
- };
3794
- }
3795
- var isExternalDestination = !isLocDestination && isExternalChain(destination);
3796
- if (isExternalDestination) {
3797
- return {
3798
- parents: Parents.TWO,
3799
- interior: {
3800
- X1: [getEthereumJunction(api, origin)]
3801
- }
3802
- };
3803
- }
3804
- var scenario = resolveScenario(origin, destination);
3805
- var parentsResolved = parents !== null && parents !== void 0 ? parents : scenario === 'RelayToPara' ? Parents.ZERO : Parents.ONE;
3806
- var interior = scenario === 'ParaToRelay' ? 'Here' : createX1Payload(version, junction !== null && junction !== void 0 ? junction : {
3807
- Parachain: chainId
3808
- });
3809
- return isLocDestination ? destination : {
3810
- parents: parentsResolved,
3811
- interior: interior
3812
- };
3723
+ var swapExtension;
3724
+ var registerSwapExtension = function registerSwapExtension(extension) {
3725
+ swapExtension = extension;
3813
3726
  };
3814
- var createVersionedDestination = function createVersionedDestination(api, version, origin, destination, chainId, junction, parents) {
3815
- var plainDestination = createDestination(api, version, origin, destination, chainId, junction, parents);
3816
- return addXcmVersionHeader(plainDestination, version);
3727
+ var getSwapExtensionOrThrow = function getSwapExtensionOrThrow() {
3728
+ assertExtensionInstalled(swapExtension, 'swap', '@paraspell/swap', 'using swap features');
3729
+ return swapExtension;
3817
3730
  };
3818
3731
 
3819
- var getChainLocation = function getChainLocation(chain, destChain, customCtx) {
3820
- var fromRelay = isRelayChain(chain);
3821
- var toRelay = isRelayChain(destChain);
3822
- var parents = fromRelay ? Parents.ZERO : Parents.ONE;
3823
- var interior = toRelay ? 'Here' : {
3824
- X1: [{
3825
- Parachain: getParaIdImpl(destChain, customCtx)
3826
- }]
3827
- };
3828
- return {
3829
- parents: parents,
3830
- interior: interior
3831
- };
3832
- };
3732
+ var API_TYPES = ['PAPI', 'PJS', 'DEDOT'];
3833
3733
 
3834
3734
  /**
3835
- * This function localizes a location by removing the `Parachain` junction
3836
- * if it exists. The `parents` field is set to `0` either if a `Parachain` was removed
3837
- * or if the resulting interior is `'Here'` and the chain is a relay chain.
3838
- *
3839
- * @param chain - The current chain
3840
- * @param location - The location to localize
3841
- * @returns The localized location
3842
- */
3843
- var localizeLocationInner = function localizeLocationInner(chain, location, origin, resolveRelay, resolveParaId) {
3844
- var _Object$keys$;
3845
- var targetRelay = isExternalChain(chain) ? undefined : resolveRelay(chain).toLowerCase();
3846
- var originRelay = origin && !isExternalChain(origin) ? resolveRelay(origin).toLowerCase() : undefined;
3847
- var locationConsensus = getJunctionValue(location, 'GlobalConsensus');
3848
- var locationRelay = locationConsensus ? (_Object$keys$ = Object.keys(locationConsensus)[0]) === null || _Object$keys$ === void 0 ? void 0 : _Object$keys$.toLowerCase() : undefined;
3849
- var ecosystemDiffers = targetRelay && originRelay && originRelay !== targetRelay;
3850
- var junctions = location.interior === 'Here' ? [] : flattenJunctions(location.interior);
3851
- var junctionCount = junctions.length;
3852
- var isLocationOnTargetRelay = targetRelay !== undefined && locationRelay === targetRelay;
3853
- // Check if target is an external chain and location's GlobalConsensus matches it
3854
- var isLocationOnTargetExternal = isExternalChain(chain) && locationRelay === chain.toLowerCase();
3855
- var isConsensusAnchored = junctions.findIndex(function (junction) {
3856
- return 'GlobalConsensus' in junction;
3857
- }) === 0;
3858
- if (locationRelay && targetRelay && locationRelay !== targetRelay && (!origin || !ecosystemDiffers && isConsensusAnchored)) {
3859
- return location;
3860
- }
3861
- if (origin && ecosystemDiffers && location.parents === Parents.TWO && originRelay !== undefined && targetRelay !== undefined && deepEqual(getJunctionValue(location, 'GlobalConsensus'), _defineProperty({}, targetRelay, null)) && junctionCount === 1) {
3862
- return RELAY_LOCATION;
3863
- }
3864
- var newInterior = location.interior;
3865
- var parachainRemoved = false;
3866
- if (location.interior !== 'Here') {
3867
- var paraId = resolveParaId(chain);
3868
- var filteredJunctions = junctions.filter(function (junction) {
3869
- if ('GlobalConsensus' in junction && (isLocationOnTargetRelay || isLocationOnTargetExternal)) {
3870
- return false;
3871
- }
3872
- if ('Parachain' in junction && (!ecosystemDiffers || isLocationOnTargetRelay)) {
3873
- var paraJunctionId = getJunctionValue(location, 'Parachain');
3874
- if (paraJunctionId === paraId) {
3875
- parachainRemoved = true;
3876
- return false;
3877
- }
3878
- }
3879
- return true;
3880
- });
3881
- if (filteredJunctions.length === 0) {
3882
- newInterior = 'Here';
3883
- } else {
3884
- newInterior = _defineProperty({}, "X".concat(filteredJunctions.length), filteredJunctions);
3885
- }
3886
- }
3887
- var isOriginRelayHere = deepEqual(location, RELAY_LOCATION);
3888
- var hasGlobalConsensus = hasJunction(location, 'GlobalConsensus');
3889
- if (origin && isExternalChain(chain) && originRelay !== undefined && isOriginRelayHere && !hasGlobalConsensus) {
3890
- return {
3891
- parents: Parents.ONE,
3892
- interior: {
3893
- X1: [{
3894
- GlobalConsensus: _defineProperty({}, originRelay, null)
3895
- }]
3896
- }
3897
- };
3898
- }
3899
- if (isExternalChain(chain) && location.parents === Parents.TWO && RELAYCHAINS.some(function (relay) {
3900
- return deepEqual(getJunctionValue(location, 'GlobalConsensus'), _defineProperty({}, relay.toLowerCase(), null));
3901
- })) {
3902
- return _objectSpread2(_objectSpread2({}, location), {}, {
3903
- parents: Parents.ONE
3904
- });
3905
- }
3906
- if (origin && ecosystemDiffers && isOriginRelayHere && !hasGlobalConsensus && originRelay !== undefined) {
3907
- return {
3908
- parents: Parents.TWO,
3909
- interior: {
3910
- X2: [{
3911
- GlobalConsensus: _defineProperty({}, originRelay, null)
3912
- }, {
3913
- Parachain: resolveParaId(origin)
3914
- }]
3915
- }
3916
- };
3917
- }
3918
- if (origin && ecosystemDiffers && newInterior !== 'Here' && !hasGlobalConsensus && originRelay !== undefined) {
3919
- var _junctions = flattenJunctions(newInterior);
3920
- var updatedJunctions = [{
3921
- GlobalConsensus: _defineProperty({}, originRelay, null)
3922
- }].concat(_toConsumableArray(_junctions));
3923
- return {
3924
- parents: Parents.TWO,
3925
- interior: _defineProperty({}, "X".concat(updatedJunctions.length), updatedJunctions)
3926
- };
3927
- }
3928
- var shouldSetParentsToZero = parachainRemoved || newInterior === 'Here' && isRelayChain(chain) || isLocationOnTargetExternal;
3929
- return {
3930
- parents: shouldSetParentsToZero ? Parents.ZERO : location.parents,
3931
- interior: newInterior
3932
- };
3933
- };
3934
- var localizeLocation = function localizeLocation(chain, location, origin) {
3935
- return localizeLocationInner(chain, location, origin, function (c) {
3936
- return getRelayChainOf(c);
3937
- }, function (c) {
3938
- return getParaId(c);
3939
- });
3940
- };
3941
- var localizeLocationImpl = function localizeLocationImpl(api, chain, location, origin) {
3942
- return localizeLocationInner(chain, location, origin, function (c) {
3943
- return getRelayChainOfImpl(api, c);
3944
- }, function (c) {
3945
- return getParaIdImpl(c, api._customCtx);
3946
- });
3947
- };
3948
-
3949
- var reverseTransformLocation = function reverseTransformLocation(location) {
3950
- var parachainJunction = {
3951
- Parachain: 1000
3952
- };
3953
- var alreadyHasP1000 = location.interior !== 'Here' && Object.values(location.interior).flat().some(function (j) {
3954
- return _typeof(j) === 'object' && j !== null && 'Parachain' in j && j.Parachain === 1000;
3955
- });
3956
- if (alreadyHasP1000) {
3957
- return _objectSpread2(_objectSpread2({}, location), {}, {
3958
- parents: Parents.ONE
3959
- });
3960
- }
3961
- var existingJunctions = location.interior === 'Here' ? [] // no other junctions
3962
- : Object.values(location.interior).flat();
3963
- var allJunctions = [parachainJunction].concat(_toConsumableArray(existingJunctions));
3964
- return _objectSpread2(_objectSpread2({}, location), {}, {
3965
- parents: Parents.ONE,
3966
- interior: _defineProperty({}, "X".concat(allJunctions.length), allJunctions)
3967
- });
3968
- };
3969
-
3970
- var EMPTY_TOPIC = "0x".concat('00'.repeat(32));
3971
- var getBridgeDestFee = /*#__PURE__*/function () {
3972
- var _ref = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee(api, destApi, origin, destination, assetInfo, feeAssetInfo, hasSystemFeeAsset, recipient, version) {
3973
- var systemAsset, transferredAsset, assets, destIsReserve, feeAssetLocation, buyExecution, depositAsset, feesSplitFromAssets, prologue, xcm;
3974
- return _regenerator().w(function (_context) {
3975
- while (1) switch (_context.n) {
3976
- case 0:
3977
- systemAsset = createAsset(version, MIN_AMOUNT, RELAY_LOCATION);
3978
- transferredAsset = createAsset(version, assetInfo.amount, normalizeLocation(api.localizeLocation(origin, assetInfo.location), version));
3979
- assets = hasSystemFeeAsset ? sortAssets([systemAsset, transferredAsset]) : [transferredAsset];
3980
- destIsReserve = hasSystemFeeAsset ? destination === 'AssetHubPolkadot' : deepEqual(getJunctionValue(assetInfo.location, 'GlobalConsensus'), _defineProperty({}, getRelayChainOf(destination).toLowerCase(), null));
3981
- feeAssetLocation = hasSystemFeeAsset ? RELAY_LOCATION : assetInfo.location;
3982
- buyExecution = {
3983
- BuyExecution: {
3984
- fees: createAsset(version, MIN_AMOUNT, api.localizeLocation(destination, feeAssetLocation, origin)),
3985
- weight_limit: 'Unlimited'
3986
- }
3987
- };
3988
- depositAsset = {
3989
- DepositAsset: {
3990
- assets: {
3991
- Wild: hasSystemFeeAsset ? {
3992
- AllOf: {
3993
- id: api.localizeLocation(destination, assetInfo.location, origin),
3994
- fun: 'Fungible'
3995
- }
3996
- } : {
3997
- AllCounted: 1
3998
- }
3999
- },
4000
- beneficiary: createBeneficiaryLocation({
4001
- api: destApi,
4002
- address: recipient,
4003
- version: version
4004
- })
4005
- }
4006
- };
4007
- feesSplitFromAssets = destIsReserve && hasSystemFeeAsset;
4008
- prologue = feesSplitFromAssets ? [{
4009
- ReserveAssetDeposited: [systemAsset]
4010
- }, buyExecution, {
4011
- WithdrawAsset: [transferredAsset]
4012
- }, {
4013
- ClearOrigin: null
4014
- }] : [destIsReserve ? {
4015
- WithdrawAsset: assets
4016
- } : {
4017
- ReserveAssetDeposited: assets
4018
- }, {
4019
- ClearOrigin: null
4020
- }, buyExecution];
4021
- xcm = [].concat(prologue, [buyExecution, depositAsset, {
4022
- SetTopic: EMPTY_TOPIC
4023
- }]);
4024
- return _context.a(2, destApi.getXcmPaymentApiFee(destination, addXcmVersionHeader(xcm, version), [], feeAssetInfo, version, true));
4025
- }
4026
- }, _callee);
4027
- }));
4028
- return function getBridgeDestFee(_x, _x2, _x3, _x4, _x5, _x6, _x7, _x8, _x9) {
4029
- return _ref.apply(this, arguments);
4030
- };
4031
- }();
4032
-
4033
- var evmExtension;
4034
- var registerEvmExtension = function registerEvmExtension(extension) {
4035
- evmExtension = extension;
4036
- };
4037
- var getEvmExtensionOrThrow = function getEvmExtensionOrThrow() {
4038
- assertExtensionInstalled(evmExtension, 'EVM', '@paraspell/evm', 'using an EVM origin');
4039
- return evmExtension;
4040
- };
4041
-
4042
- var evmSnowbridgeExtension;
4043
- var registerEvmSnowbridgeExtension = function registerEvmSnowbridgeExtension(extension) {
4044
- evmSnowbridgeExtension = extension;
4045
- };
4046
- var getEvmSnowbridgeExtensionOrThrow = function getEvmSnowbridgeExtensionOrThrow() {
4047
- assertExtensionInstalled(evmSnowbridgeExtension, 'EVM Snowbridge', '@paraspell/evm-snowbridge', 'using Ethereum as an origin');
4048
- return evmSnowbridgeExtension;
4049
- };
4050
-
4051
- var swapExtension;
4052
- var registerSwapExtension = function registerSwapExtension(extension) {
4053
- swapExtension = extension;
4054
- };
4055
- var getSwapExtensionOrThrow = function getSwapExtensionOrThrow() {
4056
- assertExtensionInstalled(swapExtension, 'swap', '@paraspell/swap', 'using swap features');
4057
- return swapExtension;
4058
- };
4059
-
4060
- var API_TYPES = ['PAPI', 'PJS', 'DEDOT'];
4061
-
4062
- /**
4063
- * The options for the batch builder.
3735
+ * The options for the batch builder.
4064
3736
  */
4065
3737
  var BatchMode;
4066
3738
  (function (BatchMode) {
@@ -6023,9 +5695,34 @@ var getParaEthTransferFees = /*#__PURE__*/function () {
6023
5695
  };
6024
5696
  }();
6025
5697
 
5698
+ var resolveBridgedHop = function resolveBridgedHop(api, origin, destination, currentChain,
5699
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
5700
+ forwardedXcms) {
5701
+ if (isExternalChain(destination) || !isSubstrateBridge(origin, destination)) return undefined;
5702
+ var originRelay = api.getRelayChainOf(origin);
5703
+ var destBridgeHub = "BridgeHub".concat(api.getRelayChainOf(destination));
5704
+ var messagesPallet = BRIDGE_PALLETS.find(function (pallet) {
5705
+ return pallet === "Bridge".concat(originRelay, "Messages");
5706
+ });
5707
+ if (!messagesPallet || !isSubstrateChain(destBridgeHub) || currentChain !== "BridgeHub".concat(originRelay)) return undefined;
5708
+ var palletIndex = getPalletIndex(destBridgeHub, messagesPallet);
5709
+ if (palletIndex === undefined) {
5710
+ throw new RoutingResolutionError("Unable to find ".concat(messagesPallet, " pallet index on ").concat(destBridgeHub));
5711
+ }
5712
+ return {
5713
+ forwardedXcms: api.createBridgedForwardedXcms(forwardedXcms[1][0], {
5714
+ palletIndex: palletIndex,
5715
+ relay: originRelay,
5716
+ paraId: api.getParaId(origin),
5717
+ destination: getChainLocation(destBridgeHub, destination, api._customCtx)
5718
+ }),
5719
+ destParaId: api.getParaId(destination),
5720
+ currentOrigin: destBridgeHub
5721
+ };
5722
+ };
6026
5723
  var traverseXcmHops = /*#__PURE__*/function () {
6027
5724
  var _ref = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee(config) {
6028
- var api, origin, destination, asset, initialForwardedXcms, initialDestParaId, swapConfig, processHop, shouldContinue, extractNextHopData, currentOrigin, forwardedXcms, nextParaId, currentAsset, hasPassedExchange, hops, destinationResult, nextChain, hopApi, isDestination, hopResult, _extractNextHopData, newXcms, destParaId;
5725
+ var api, origin, destination, asset, initialForwardedXcms, initialDestParaId, swapConfig, processHop, shouldContinue, extractNextHopData, currentOrigin, forwardedXcms, nextParaId, currentAsset, hasPassedExchange, hops, destinationResult, nextChain, hopApi, _resolveBridgedHop, isDestination, hopResult, next;
6029
5726
  return _regenerator().w(function (_context) {
6030
5727
  while (1) switch (_context.p = _context.n) {
6031
5728
  case 0:
@@ -6041,7 +5738,7 @@ var traverseXcmHops = /*#__PURE__*/function () {
6041
5738
  _context.n = 10;
6042
5739
  break;
6043
5740
  }
6044
- nextChain = getTSubstrateChain(nextParaId, api.getRelayChainOf(origin));
5741
+ nextChain = getTSubstrateChain(nextParaId, api.getRelayChainOf(currentOrigin));
6045
5742
  if (nextChain) {
6046
5743
  _context.n = 2;
6047
5744
  break;
@@ -6089,10 +5786,12 @@ var traverseXcmHops = /*#__PURE__*/function () {
6089
5786
  hasPassedExchange = true;
6090
5787
  currentAsset = api.findAssetOnDestOrThrow(swapConfig.exchangeChain, nextChain, swapConfig.currencyTo);
6091
5788
  }
6092
- _extractNextHopData = extractNextHopData(hopResult), newXcms = _extractNextHopData.forwardedXcms, destParaId = _extractNextHopData.destParaId;
6093
- forwardedXcms = newXcms;
6094
- nextParaId = destParaId;
6095
- currentOrigin = nextChain;
5789
+ next = (_resolveBridgedHop = resolveBridgedHop(api, origin, destination, nextChain, forwardedXcms)) !== null && _resolveBridgedHop !== void 0 ? _resolveBridgedHop : _objectSpread2(_objectSpread2({}, extractNextHopData(hopResult)), {}, {
5790
+ currentOrigin: nextChain
5791
+ });
5792
+ forwardedXcms = next.forwardedXcms;
5793
+ nextParaId = next.destParaId;
5794
+ currentOrigin = next.currentOrigin;
6096
5795
  case 7:
6097
5796
  _context.p = 7;
6098
5797
  _context.n = 8;
@@ -6151,18 +5850,17 @@ var addEthereumBridgeFees = /*#__PURE__*/function () {
6151
5850
  }();
6152
5851
 
6153
5852
  var dryRunInternal = /*#__PURE__*/function () {
6154
- var _ref = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee3(options) {
6155
- var _traversalResult$dest;
6156
- var api, origin, destination, currency, tx, sender, feeAsset, swapConfig, version, bypassOptions, keepAlive, _options$useRootOrigi, useRootOrigin, resolvedFeeAsset, _resolveCurrency, assets, asset, amount, resolvedVersion, originDryRun, isMythosToEthereum, originDryModified, initialForwardedXcms, initialDestParaId, processHop, traversalResult, relayChain, bridgeHubChain, assetHubChain, bridgeHubHop, processedBridgeHub, bridgeHubHopIndex, resolveBridgeDestination, result, dryRunError, _t4, _t5, _t6, _t7, _t8, _t9, _t0, _t1, _t10, _t11, _t12, _t13, _t14;
6157
- return _regenerator().w(function (_context3) {
6158
- while (1) switch (_context3.n) {
5853
+ var _ref = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee2(options) {
5854
+ var api, origin, destination, currency, tx, sender, feeAsset, swapConfig, version, bypassOptions, keepAlive, _options$useRootOrigi, useRootOrigin, resolvedFeeAsset, _resolveCurrency, assets, asset, amount, resolvedVersion, originDryRun, isMythosToEthereum, originDryModified, initialForwardedXcms, initialDestParaId, processHop, traversalResult, relayChain, bridgeHubChain, assetHubChain, bridgeHubHop, processedBridgeHub, bridgeHubHopIndex, result, dryRunError, _t, _t2, _t3, _t4, _t5, _t6, _t7, _t8, _t9;
5855
+ return _regenerator().w(function (_context2) {
5856
+ while (1) switch (_context2.n) {
6159
5857
  case 0:
6160
5858
  api = options.api, origin = options.origin, destination = options.destination, currency = options.currency, tx = options.tx, sender = options.sender, feeAsset = options.feeAsset, swapConfig = options.swapConfig, version = options.version, bypassOptions = options.bypassOptions, keepAlive = options.keepAlive, _options$useRootOrigi = options.useRootOrigin, useRootOrigin = _options$useRootOrigi === void 0 ? false : _options$useRootOrigi;
6161
5859
  resolvedFeeAsset = feeAsset ? resolveFeeAsset(api, feeAsset, origin, destination, currency) : undefined;
6162
5860
  _resolveCurrency = resolveCurrency(api, currency, resolvedFeeAsset, origin, destination), assets = _resolveCurrency.assets, asset = _resolveCurrency.asset;
6163
5861
  amount = asset.amount;
6164
5862
  resolvedVersion = pickCompatibleXcmVersion(api, origin, destination, version);
6165
- _context3.n = 1;
5863
+ _context2.n = 1;
6166
5864
  return api.getDryRunCall({
6167
5865
  tx: tx,
6168
5866
  chain: origin,
@@ -6179,12 +5877,12 @@ var dryRunInternal = /*#__PURE__*/function () {
6179
5877
  useRootOrigin: useRootOrigin || !!bypassOptions
6180
5878
  });
6181
5879
  case 1:
6182
- originDryRun = _context3.v;
5880
+ originDryRun = _context2.v;
6183
5881
  if (originDryRun.success) {
6184
- _context3.n = 2;
5882
+ _context2.n = 2;
6185
5883
  break;
6186
5884
  }
6187
- return _context3.a(2, {
5885
+ return _context2.a(2, {
6188
5886
  success: false,
6189
5887
  dryRunError: _objectSpread2({
6190
5888
  chainKind: 'origin',
@@ -6196,27 +5894,27 @@ var dryRunInternal = /*#__PURE__*/function () {
6196
5894
  case 2:
6197
5895
  isMythosToEthereum = origin === 'Mythos' && destination === 'Ethereum';
6198
5896
  if (!isMythosToEthereum) {
6199
- _context3.n = 4;
5897
+ _context2.n = 4;
6200
5898
  break;
6201
5899
  }
6202
- _t5 = _objectSpread2;
6203
- _t6 = _objectSpread2({}, originDryRun);
6204
- _t7 = {};
6205
- _t8 = originDryRun.fee;
6206
- _context3.n = 3;
5900
+ _t2 = _objectSpread2;
5901
+ _t3 = _objectSpread2({}, originDryRun);
5902
+ _t4 = {};
5903
+ _t5 = originDryRun.fee;
5904
+ _context2.n = 3;
6207
5905
  return getMythosOriginFee(api);
6208
5906
  case 3:
6209
- _t9 = _context3.v;
6210
- _t0 = _t8 + _t9;
6211
- _t4 = _t5(_t6, _t7, {
6212
- fee: _t0
5907
+ _t6 = _context2.v;
5908
+ _t7 = _t5 + _t6;
5909
+ _t = _t2(_t3, _t4, {
5910
+ fee: _t7
6213
5911
  });
6214
- _context3.n = 5;
5912
+ _context2.n = 5;
6215
5913
  break;
6216
5914
  case 4:
6217
- _t4 = originDryRun;
5915
+ _t = originDryRun;
6218
5916
  case 5:
6219
- originDryModified = _t4;
5917
+ originDryModified = _t;
6220
5918
  initialForwardedXcms = originDryModified.forwardedXcms, initialDestParaId = originDryModified.destParaId;
6221
5919
  processHop = /*#__PURE__*/function () {
6222
5920
  var _ref2 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee(params) {
@@ -6234,6 +5932,7 @@ var dryRunInternal = /*#__PURE__*/function () {
6234
5932
  asset: asset,
6235
5933
  currentAsset: currentAsset,
6236
5934
  currency: currency,
5935
+ feeAsset: resolvedFeeAsset,
6237
5936
  swapConfig: swapConfig,
6238
5937
  hasPassedExchange: hasPassedExchange
6239
5938
  });
@@ -6274,7 +5973,7 @@ var dryRunInternal = /*#__PURE__*/function () {
6274
5973
  return _ref2.apply(this, arguments);
6275
5974
  };
6276
5975
  }();
6277
- _context3.n = 6;
5976
+ _context2.n = 6;
6278
5977
  return traverseXcmHops({
6279
5978
  api: api,
6280
5979
  origin: origin,
@@ -6295,7 +5994,7 @@ var dryRunInternal = /*#__PURE__*/function () {
6295
5994
  }
6296
5995
  });
6297
5996
  case 6:
6298
- traversalResult = _context3.v;
5997
+ traversalResult = _context2.v;
6299
5998
  // Process Ethereum bridge fees
6300
5999
  relayChain = api.getRelayChainOf(origin);
6301
6000
  bridgeHubChain = relayChain === 'Paseo' ? undefined : "BridgeHub".concat(relayChain);
@@ -6304,29 +6003,29 @@ var dryRunInternal = /*#__PURE__*/function () {
6304
6003
  return hop.chain === bridgeHubChain;
6305
6004
  }); // For Mythos → Ethereum, we skip additional Ethereum bridge fees (aligns with getXcmFeeInternal)
6306
6005
  if (!isMythosToEthereum) {
6307
- _context3.n = 7;
6006
+ _context2.n = 7;
6308
6007
  break;
6309
6008
  }
6310
- _t1 = bridgeHubHop === null || bridgeHubHop === void 0 ? void 0 : bridgeHubHop.result;
6311
- _context3.n = 11;
6009
+ _t8 = bridgeHubHop === null || bridgeHubHop === void 0 ? void 0 : bridgeHubHop.result;
6010
+ _context2.n = 11;
6312
6011
  break;
6313
6012
  case 7:
6314
6013
  if (!(bridgeHubHop !== null && bridgeHubHop !== void 0 && bridgeHubHop.result.success)) {
6315
- _context3.n = 9;
6014
+ _context2.n = 9;
6316
6015
  break;
6317
6016
  }
6318
- _context3.n = 8;
6017
+ _context2.n = 8;
6319
6018
  return addEthereumBridgeFees(api, bridgeHubHop === null || bridgeHubHop === void 0 ? void 0 : bridgeHubHop.result, destination, assetHubChain);
6320
6019
  case 8:
6321
- _t10 = _context3.v;
6322
- _context3.n = 10;
6020
+ _t9 = _context2.v;
6021
+ _context2.n = 10;
6323
6022
  break;
6324
6023
  case 9:
6325
- _t10 = bridgeHubHop === null || bridgeHubHop === void 0 ? void 0 : bridgeHubHop.result;
6024
+ _t9 = bridgeHubHop === null || bridgeHubHop === void 0 ? void 0 : bridgeHubHop.result;
6326
6025
  case 10:
6327
- _t1 = _t10;
6026
+ _t8 = _t9;
6328
6027
  case 11:
6329
- processedBridgeHub = _t1;
6028
+ processedBridgeHub = _t8;
6330
6029
  // Update bridge hub in hops if needed
6331
6030
  if (processedBridgeHub && processedBridgeHub.success && bridgeHubHop && bridgeHubHop.result.success && processedBridgeHub.fee !== bridgeHubHop.result.fee) {
6332
6031
  bridgeHubHopIndex = traversalResult.hops.findIndex(function (hop) {
@@ -6338,67 +6037,10 @@ var dryRunInternal = /*#__PURE__*/function () {
6338
6037
  });
6339
6038
  }
6340
6039
  }
6341
- resolveBridgeDestination = /*#__PURE__*/function () {
6342
- var _ref3 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee2() {
6343
- var _api$findAssetInfoOnD;
6344
- var destApi, systemAsset, hasSystemFeeAsset, destAsset, _t, _t2, _t3;
6345
- return _regenerator().w(function (_context2) {
6346
- while (1) switch (_context2.n) {
6347
- case 0:
6348
- if (!(isExternalChain(destination) || !isSubstrateBridge(origin, destination))) {
6349
- _context2.n = 1;
6350
- break;
6351
- }
6352
- return _context2.a(2, undefined);
6353
- case 1:
6354
- destApi = api.clone();
6355
- _context2.n = 2;
6356
- return destApi.init(destination);
6357
- case 2:
6358
- systemAsset = api.findNativeAssetInfoOrThrow(api.getRelayChainOf(origin));
6359
- hasSystemFeeAsset = deepEqual(getJunctionValue(asset.location, 'GlobalConsensus'), getEthereumJunction(api, origin, false).GlobalConsensus);
6360
- destAsset = hasSystemFeeAsset ? api.findAssetInfoOrThrow(destination, {
6361
- symbol: systemAsset.symbol
6362
- }) : (_api$findAssetInfoOnD = api.findAssetInfoOnDest(origin, destination, currency, asset)) !== null && _api$findAssetInfoOnD !== void 0 ? _api$findAssetInfoOnD : asset;
6363
- _context2.n = 3;
6364
- return getBridgeDestFee(api, destApi, origin, destination, asset, destAsset, hasSystemFeeAsset, sender, resolvedVersion);
6365
- case 3:
6366
- _t = _context2.v;
6367
- _t2 = destAsset;
6368
- _t3 = [];
6369
- return _context2.a(2, {
6370
- success: true,
6371
- fee: _t,
6372
- asset: _t2,
6373
- forwardedXcms: _t3
6374
- });
6375
- }
6376
- }, _callee2);
6377
- }));
6378
- return function resolveBridgeDestination() {
6379
- return _ref3.apply(this, arguments);
6380
- };
6381
- }();
6382
- _t11 = originDryModified;
6383
- if (!((_traversalResult$dest = traversalResult.destination) !== null && _traversalResult$dest !== void 0)) {
6384
- _context3.n = 12;
6385
- break;
6386
- }
6387
- _t12 = _traversalResult$dest;
6388
- _context3.n = 14;
6389
- break;
6390
- case 12:
6391
- _context3.n = 13;
6392
- return resolveBridgeDestination();
6393
- case 13:
6394
- _t12 = _context3.v;
6395
- case 14:
6396
- _t13 = _t12;
6397
- _t14 = traversalResult.hops;
6398
6040
  result = {
6399
- origin: _t11,
6400
- destination: _t13,
6401
- hops: _t14
6041
+ origin: originDryModified,
6042
+ destination: traversalResult.destination,
6043
+ hops: traversalResult.hops
6402
6044
  };
6403
6045
  dryRunError = getDryRunError({
6404
6046
  origin: {
@@ -6411,12 +6053,12 @@ var dryRunInternal = /*#__PURE__*/function () {
6411
6053
  } : undefined,
6412
6054
  hops: result.hops
6413
6055
  });
6414
- return _context3.a(2, _objectSpread2({
6056
+ return _context2.a(2, _objectSpread2({
6415
6057
  success: !dryRunError,
6416
6058
  dryRunError: dryRunError
6417
6059
  }, result));
6418
6060
  }
6419
- }, _callee3);
6061
+ }, _callee2);
6420
6062
  }));
6421
6063
  return function dryRunInternal(_x) {
6422
6064
  return _ref.apply(this, arguments);
@@ -6902,12 +6544,13 @@ var getBypassResultWithRetries = /*#__PURE__*/function () {
6902
6544
 
6903
6545
  var getOriginXcmFeeInternal = /*#__PURE__*/function () {
6904
6546
  var _ref2 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee(_ref) {
6905
- var api, tx, origin, destination, sender, disableFallback, feeAsset, currency, version, _ref$useRootOrigin, useRootOrigin, resolvedFeeAsset, _resolveCurrency, assets, asset, _yield$api$getPayment, rawFee, paddedFee, sufficient, resolvedVersion, dryRunResult, _yield$api$getPayment2, _rawFee, _paddedFee, fee, forwardedXcms, destParaId, weight;
6547
+ var api, tx, origin, destination, sender, disableFallback, feeAsset, currency, version, _ref$useRootOrigin, useRootOrigin, resolvedFeeAsset, originFeeAsset, _resolveCurrency, assets, asset, _yield$api$getPayment, rawFee, paddedFee, sufficient, resolvedVersion, dryRunResult, _yield$api$getPayment2, _rawFee, _paddedFee, fee, forwardedXcms, destParaId, weight;
6906
6548
  return _regenerator().w(function (_context) {
6907
6549
  while (1) switch (_context.n) {
6908
6550
  case 0:
6909
6551
  api = _ref.api, tx = _ref.tx, origin = _ref.origin, destination = _ref.destination, sender = _ref.sender, disableFallback = _ref.disableFallback, feeAsset = _ref.feeAsset, currency = _ref.currency, version = _ref.version, _ref$useRootOrigin = _ref.useRootOrigin, useRootOrigin = _ref$useRootOrigin === void 0 ? false : _ref$useRootOrigin;
6910
6552
  resolvedFeeAsset = feeAsset ? resolveFeeAsset(api, feeAsset, origin, destination, currency) : undefined;
6553
+ originFeeAsset = supportsFeeAssetPayment(origin) ? resolvedFeeAsset : undefined;
6911
6554
  _resolveCurrency = resolveCurrency(api, currency, resolvedFeeAsset, origin, destination), assets = _resolveCurrency.assets, asset = _resolveCurrency.asset;
6912
6555
  _context.n = 1;
6913
6556
  return api.init(origin, DRY_RUN_CLIENT_TIMEOUT_MS);
@@ -6923,12 +6566,12 @@ var getOriginXcmFeeInternal = /*#__PURE__*/function () {
6923
6566
  rawFee = _yield$api$getPayment.partialFee;
6924
6567
  paddedFee = padFee(rawFee, origin, destination, 'origin');
6925
6568
  _context.n = 3;
6926
- return isSufficientOrigin(api, origin, destination, sender, paddedFee, asset, resolvedFeeAsset);
6569
+ return isSufficientOrigin(api, origin, destination, sender, paddedFee, asset, originFeeAsset);
6927
6570
  case 3:
6928
6571
  sufficient = _context.v;
6929
6572
  return _context.a(2, {
6930
6573
  fee: paddedFee,
6931
- asset: resolvedFeeAsset !== null && resolvedFeeAsset !== void 0 ? resolvedFeeAsset : api.findNativeAssetInfoOrThrow(origin),
6574
+ asset: originFeeAsset !== null && originFeeAsset !== void 0 ? originFeeAsset : api.findNativeAssetInfoOrThrow(origin),
6932
6575
  feeType: 'paymentInfo',
6933
6576
  sufficient: sufficient
6934
6577
  });
@@ -7046,7 +6689,7 @@ var getOriginXcmFee = /*#__PURE__*/function () {
7046
6689
 
7047
6690
  var getXcmFeeOnce = /*#__PURE__*/function () {
7048
6691
  var _ref2 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee2(_ref) {
7049
- var api, tx, origin, destination, sender, recipient, currency, feeAsset, version, disableFallback, swapConfig, useRootOrigin, skipReverseFeeCalculation, resolvedFeeAsset, _resolveCurrency, asset, resolvedVersion, _yield$getOriginXcmFe, originFeeRaw, originAsset, originFeeType, originDryRunError, initialForwardedXcm, initialDestParaId, originWeight, sufficientOriginFee, isMythosToEthereum, originFee, destApi, destFeeRes, _result, _dryRunError, processHop, traversalResult, destFee, destAsset, destFeeType, destDryRunError, destSufficient, destResult, _destApi, destFallback, _api$findAssetInfoOnD, _destApi2, systemAsset, hasSystemFeeAsset, relayChain, bridgeHubChain, assetHubChain, bridgeHubHop, processedBridgeHub, bridgeHubHopIndex, convertToFeeDetail, result, dryRunError, _t, _t2, _t3, _t4;
6692
+ var api, tx, origin, destination, sender, recipient, currency, feeAsset, version, disableFallback, swapConfig, useRootOrigin, skipReverseFeeCalculation, resolvedFeeAsset, _resolveCurrency, asset, resolvedVersion, _yield$getOriginXcmFe, originFeeRaw, originAsset, originFeeType, originDryRunError, initialForwardedXcm, initialDestParaId, originWeight, sufficientOriginFee, isMythosToEthereum, originFee, destApi, destFeeRes, _result, _dryRunError, processHop, traversalResult, destFee, destAsset, destFeeType, destDryRunError, destSufficient, destResult, _destApi, destFallback, relayChain, bridgeHubChain, assetHubChain, bridgeHubHop, processedBridgeHub, bridgeHubHopIndex, convertToFeeDetail, result, dryRunError, _t, _t2, _t3, _t4;
7050
6693
  return _regenerator().w(function (_context2) {
7051
6694
  while (1) switch (_context2.p = _context2.n) {
7052
6695
  case 0:
@@ -7190,6 +6833,7 @@ var getXcmFeeOnce = /*#__PURE__*/function () {
7190
6833
  asset: asset,
7191
6834
  currentAsset: currentAsset,
7192
6835
  currency: currency,
6836
+ feeAsset: resolvedFeeAsset,
7193
6837
  swapConfig: swapConfig,
7194
6838
  hasPassedExchange: hasPassedExchange
7195
6839
  });
@@ -7258,7 +6902,7 @@ var getXcmFeeOnce = /*#__PURE__*/function () {
7258
6902
  destDryRunError = destResult.dryRunError;
7259
6903
  destSufficient = destResult.sufficient;
7260
6904
  destAsset = destResult.asset;
7261
- _context2.n = 19;
6905
+ _context2.n = 16;
7262
6906
  break;
7263
6907
  case 12:
7264
6908
  if (!(traversalResult.hops.length > 0 && traversalResult.hops[traversalResult.hops.length - 1].result.dryRunError)) {
@@ -7297,36 +6941,14 @@ var getXcmFeeOnce = /*#__PURE__*/function () {
7297
6941
  destFeeType = destFallback.feeType;
7298
6942
  destSufficient = destFallback.sufficient;
7299
6943
  destAsset = api.findNativeAssetInfoOrThrow(destination);
7300
- _context2.n = 19;
6944
+ _context2.n = 16;
7301
6945
  break;
7302
6946
  case 15:
7303
- if (!(!isExternalChain(destination) && isSubstrateBridge(origin, destination))) {
7304
- _context2.n = 18;
7305
- break;
7306
- }
7307
- _destApi2 = api.clone();
7308
- _context2.n = 16;
7309
- return _destApi2.init(destination, DRY_RUN_CLIENT_TIMEOUT_MS);
7310
- case 16:
7311
- systemAsset = api.findNativeAssetInfoOrThrow(api.getRelayChainOf(origin));
7312
- hasSystemFeeAsset = deepEqual(getJunctionValue(asset.location, 'GlobalConsensus'), getEthereumJunction(api, origin, false).GlobalConsensus);
7313
- destAsset = hasSystemFeeAsset ? api.findAssetInfoOrThrow(destination, {
7314
- symbol: systemAsset.symbol
7315
- }) : (_api$findAssetInfoOnD = api.findAssetInfoOnDest(origin, destination, currency, asset)) !== null && _api$findAssetInfoOnD !== void 0 ? _api$findAssetInfoOnD : asset;
7316
- _context2.n = 17;
7317
- return getBridgeDestFee(api, _destApi2, origin, destination, asset, destAsset, hasSystemFeeAsset, recipient, resolvedVersion);
7318
- case 17:
7319
- destFee = _context2.v;
7320
- destFeeType = 'dryRun';
7321
- destSufficient = true;
7322
- _context2.n = 19;
7323
- break;
7324
- case 18:
7325
- destFee = 0n;
7326
- destFeeType = 'noFeeRequired';
6947
+ destFee = 0n;
6948
+ destFeeType = 'noFeeRequired';
7327
6949
  destSufficient = true;
7328
6950
  destAsset = api.findNativeAssetInfoOrThrow(destination);
7329
- case 19:
6951
+ case 16:
7330
6952
  // Process Ethereum bridge fees
7331
6953
  relayChain = api.getRelayChainOf(origin);
7332
6954
  bridgeHubChain = relayChain === 'Paseo' ? undefined : "BridgeHub".concat(relayChain);
@@ -7335,18 +6957,18 @@ var getXcmFeeOnce = /*#__PURE__*/function () {
7335
6957
  return hop.chain === bridgeHubChain;
7336
6958
  });
7337
6959
  if (!isMythosToEthereum) {
7338
- _context2.n = 20;
6960
+ _context2.n = 17;
7339
6961
  break;
7340
6962
  }
7341
6963
  _t4 = bridgeHubHop === null || bridgeHubHop === void 0 ? void 0 : bridgeHubHop.result;
7342
- _context2.n = 22;
6964
+ _context2.n = 19;
7343
6965
  break;
7344
- case 20:
7345
- _context2.n = 21;
6966
+ case 17:
6967
+ _context2.n = 18;
7346
6968
  return addEthereumBridgeFees(api, bridgeHubHop === null || bridgeHubHop === void 0 ? void 0 : bridgeHubHop.result, destination, assetHubChain);
7347
- case 21:
6969
+ case 18:
7348
6970
  _t4 = _context2.v;
7349
- case 22:
6971
+ case 19:
7350
6972
  processedBridgeHub = _t4;
7351
6973
  // Update bridge hub fee in hops if needed
7352
6974
  if (processedBridgeHub && bridgeHubHop && processedBridgeHub.fee !== bridgeHubHop.result.fee) {
@@ -7964,11 +7586,13 @@ var getTransferInfo = /*#__PURE__*/function () {
7964
7586
  var FEE_PADDING = 30;
7965
7587
  var sumHopFees = function sumHopFees(result, _ref) {
7966
7588
  var assetInfo = _ref.assetInfo,
7589
+ feeAssetInfo = _ref.feeAssetInfo,
7967
7590
  isRelayAsset = _ref.isRelayAsset,
7968
7591
  systemAsset = _ref.systemAsset;
7592
+ var feeAsset = isRelayAsset ? assetInfo : feeAssetInfo !== null && feeAssetInfo !== void 0 ? feeAssetInfo : systemAsset;
7969
7593
  return result.hops.reduce(function (acc, hop) {
7970
7594
  // only add if asset is equal
7971
- return isAssetEqual(hop.result.asset, isRelayAsset ? assetInfo : systemAsset) ? acc + hop.result.fee : acc;
7595
+ return isAssetEqual(hop.result.asset, feeAsset) ? acc + hop.result.fee : acc;
7972
7596
  }, 0n);
7973
7597
  };
7974
7598
  var computeAllFees = /*#__PURE__*/function () {
@@ -8213,7 +7837,7 @@ var getMinTransferableAmount = /*#__PURE__*/function () {
8213
7837
 
8214
7838
  var getOriginFeeOrThrow = /*#__PURE__*/function () {
8215
7839
  var _ref2 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee(_ref, feeCurrency) {
8216
- var api, buildTx, chain, sender, feeAsset, version, currency, _yield$getOriginXcmFe, fee;
7840
+ var api, buildTx, chain, sender, feeAsset, version, currency, result;
8217
7841
  return _regenerator().w(function (_context) {
8218
7842
  while (1) switch (_context.n) {
8219
7843
  case 0:
@@ -8231,15 +7855,14 @@ var getOriginFeeOrThrow = /*#__PURE__*/function () {
8231
7855
  disableFallback: false
8232
7856
  });
8233
7857
  case 1:
8234
- _yield$getOriginXcmFe = _context.v;
8235
- fee = _yield$getOriginXcmFe.fee;
8236
- if (!(fee === undefined)) {
7858
+ result = _context.v;
7859
+ if (!(result.fee === undefined)) {
8237
7860
  _context.n = 2;
8238
7861
  break;
8239
7862
  }
8240
7863
  throw new UnableToComputeError("Cannot get origin xcm fee for currency ".concat(JSON.stringify(currency, replaceBigInt), " on chain ").concat(chain, "."));
8241
7864
  case 2:
8242
- return _context.a(2, fee);
7865
+ return _context.a(2, result);
8243
7866
  }
8244
7867
  }, _callee);
8245
7868
  }));
@@ -8273,7 +7896,7 @@ var computeTransferableAmount = /*#__PURE__*/function () {
8273
7896
  }();
8274
7897
  var getTransferableAmountForAsset = /*#__PURE__*/function () {
8275
7898
  var _ref4 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee3(options, resolvedFeeAsset) {
8276
- var api, sender, chain, currency, asset, amount, nativeAssetInfo, isNativeAsset, paysOriginInSendingAsset, fee, _t;
7899
+ var api, sender, chain, currency, asset, amount, nativeAssetInfo, isNativeAsset, mayPayOriginInSendingAsset, originFee, fee, _t;
8277
7900
  return _regenerator().w(function (_context3) {
8278
7901
  while (1) switch (_context3.n) {
8279
7902
  case 0:
@@ -8282,8 +7905,8 @@ var getTransferableAmountForAsset = /*#__PURE__*/function () {
8282
7905
  amount = abstractDecimals(currency.amount, asset.decimals, api);
8283
7906
  nativeAssetInfo = api.findNativeAssetInfoOrThrow(chain);
8284
7907
  isNativeAsset = isAssetEqual(nativeAssetInfo, asset);
8285
- paysOriginInSendingAsset = !resolvedFeeAsset && isNativeAsset || resolvedFeeAsset && isAssetEqual(resolvedFeeAsset, asset);
8286
- if (!paysOriginInSendingAsset) {
7908
+ mayPayOriginInSendingAsset = isNativeAsset || resolvedFeeAsset && isAssetEqual(resolvedFeeAsset, asset);
7909
+ if (!mayPayOriginInSendingAsset) {
8287
7910
  _context3.n = 2;
8288
7911
  break;
8289
7912
  }
@@ -8296,9 +7919,10 @@ var getTransferableAmountForAsset = /*#__PURE__*/function () {
8296
7919
  _context3.n = 3;
8297
7920
  break;
8298
7921
  case 2:
8299
- _t = 0n;
7922
+ _t = undefined;
8300
7923
  case 3:
8301
- fee = _t;
7924
+ originFee = _t;
7925
+ fee = originFee && isAssetEqual(originFee.asset, asset) ? originFee.fee : 0n;
8302
7926
  return _context3.a(2, computeTransferableAmount(api, sender, chain, asset, fee));
8303
7927
  }
8304
7928
  }, _callee3);
@@ -8309,7 +7933,7 @@ var getTransferableAmountForAsset = /*#__PURE__*/function () {
8309
7933
  }();
8310
7934
  var getTransferableAmountForAssets = /*#__PURE__*/function () {
8311
7935
  var _ref5 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee4(options, resolvedFeeAsset) {
8312
- var api, sender, chain, destination, currency, _resolveCurrency, assets, fee;
7936
+ var api, sender, chain, destination, currency, _resolveCurrency, assets, originFee;
8313
7937
  return _regenerator().w(function (_context4) {
8314
7938
  while (1) switch (_context4.n) {
8315
7939
  case 0:
@@ -8318,9 +7942,9 @@ var getTransferableAmountForAssets = /*#__PURE__*/function () {
8318
7942
  _context4.n = 1;
8319
7943
  return getOriginFeeOrThrow(options, currency);
8320
7944
  case 1:
8321
- fee = _context4.v;
7945
+ originFee = _context4.v;
8322
7946
  return _context4.a(2, Promise.all(assets.map(function (asset) {
8323
- return computeTransferableAmount(api, sender, chain, asset, asset.isFeeAsset ? fee : 0n);
7947
+ return computeTransferableAmount(api, sender, chain, asset, isAssetEqual(originFee.asset, asset) ? originFee.fee : 0n);
8324
7948
  })));
8325
7949
  }
8326
7950
  }, _callee4);
@@ -8380,58 +8004,260 @@ var getTransferableAmount = /*#__PURE__*/function () {
8380
8004
  };
8381
8005
  }();
8382
8006
 
8383
- var resolveTransferType = function resolveTransferType(_ref) {
8384
- var origin = _ref.origin,
8385
- reserve = _ref.reserve,
8386
- dest = _ref.dest,
8387
- isSubBridge = _ref.isSubBridge,
8388
- assetInfo = _ref.assetInfo;
8389
- // Direct A → C: when origin is reserve OR dest is reserve, check origin <-> dest trust
8390
- // Hop A → B → C: when reserve differs from both, check origin <-> reserve trust
8391
- var isDirect = origin.chain === reserve.chain || dest.chain === reserve.chain;
8392
- var chainToCheck = isDirect ? dest.chain : reserve.chain;
8393
- var canTeleport = isTrustedChain(origin.chain) && isTrustedChain(chainToCheck) || isNativeAssetTeleport(origin.api, origin.chain, chainToCheck, assetInfo);
8394
- if (canTeleport && !isSubBridge) return 'Teleport';
8395
- if (origin.chain === reserve.chain) return 'LocalReserve';
8396
- return 'DestinationReserve';
8007
+ var createX1Payload = function createX1Payload(version, junction) {
8008
+ return version === Version.V3 ? {
8009
+ X1: junction
8010
+ } : {
8011
+ X1: [junction]
8012
+ };
8397
8013
  };
8398
- var buildTypeAndThenCall = function buildTypeAndThenCall(context, isDotAsset, customXcm, assets) {
8399
- var origin = context.origin,
8400
- reserve = context.reserve,
8401
- dest = context.dest,
8402
- assetInfo = context.assetInfo,
8403
- bridgeHopChain = context.bridgeHopChain,
8404
- isSubBridge = context.isSubBridge,
8405
- _context$options = context.options,
8406
- version = _context$options.version,
8407
- pallet = _context$options.pallet,
8408
- method = _context$options.method,
8409
- overriddenAsset = _context$options.overriddenAsset;
8410
- var feeAssetLocation = !isDotAsset ? RELAY_LOCATION : assetInfo.location;
8411
- var finalDest = bridgeHopChain !== null && bridgeHopChain !== void 0 ? bridgeHopChain : origin.chain === reserve.chain ? dest.chain : reserve.chain;
8412
- var destLocation = createDestination(origin.api, version, origin.chain, finalDest, origin.api.getParaId(finalDest));
8413
- var transferType = bridgeHopChain ? 'DestinationReserve' : resolveTransferType(context);
8414
- var feesTransferType = isSubBridge && !isDotAsset ? 'LocalReserve' : transferType;
8415
- var feeAsset = Array.isArray(overriddenAsset) ? overriddenAsset.find(function (a) {
8416
- return a.isFeeAsset;
8417
- }) : null;
8418
- var feeMultiAsset = feeAsset !== null && feeAsset !== void 0 ? feeAsset : createAsset(version, assetInfo.amount, normalizeLocation(origin.api.localizeLocation(origin.chain, feeAssetLocation), version));
8419
- var module = pallet !== null && pallet !== void 0 ? pallet : origin.api.getXcmPallet(origin.chain);
8420
- var methodName = method !== null && method !== void 0 ? method : 'transfer_assets_using_type_and_then';
8014
+
8015
+ var createAccountPayload = function createAccountPayload(api, address) {
8016
+ return isAddress(address) ? {
8017
+ AccountKey20: {
8018
+ key: address
8019
+ }
8020
+ } : {
8021
+ AccountId32: {
8022
+ id: api.accountToHex(address)
8023
+ }
8024
+ };
8025
+ };
8026
+ var createBeneficiaryLocXTokens = function createBeneficiaryLocXTokens(_ref) {
8027
+ var api = _ref.api,
8028
+ recipient = _ref.recipient,
8029
+ origin = _ref.origin,
8030
+ destination = _ref.destination,
8031
+ version = _ref.version,
8032
+ paraId = _ref.paraId;
8033
+ if (isTLocation(recipient)) {
8034
+ return recipient;
8035
+ }
8036
+ var scenario = resolveScenario(origin, destination);
8037
+ var accountPayload = createAccountPayload(api, recipient);
8038
+ if (scenario === 'ParaToRelay') {
8039
+ return {
8040
+ parents: Parents.ONE,
8041
+ interior: createX1Payload(version, {
8042
+ AccountId32: {
8043
+ id: api.accountToHex(recipient)
8044
+ }
8045
+ })
8046
+ };
8047
+ } else if (scenario === 'ParaToPara') {
8048
+ return {
8049
+ parents: Parents.ONE,
8050
+ interior: {
8051
+ X2: [{
8052
+ Parachain: paraId
8053
+ }, accountPayload]
8054
+ }
8055
+ };
8056
+ }
8421
8057
  return {
8422
- module: module,
8423
- method: methodName,
8424
- params: {
8425
- dest: addXcmVersionHeader(destLocation, version),
8426
- assets: addXcmVersionHeader(assets, version),
8427
- assets_transfer_type: transferType,
8428
- remote_fees_id: addXcmVersionHeader(feeMultiAsset.id, version),
8429
- fees_transfer_type: feesTransferType,
8430
- custom_xcm_on_dest: addXcmVersionHeader(customXcm, version),
8431
- weight_limit: 'Unlimited'
8058
+ parents: Parents.ZERO,
8059
+ interior: createX1Payload(version, accountPayload)
8060
+ };
8061
+ };
8062
+ var createBeneficiaryLocation = function createBeneficiaryLocation(_ref2) {
8063
+ var api = _ref2.api,
8064
+ address = _ref2.address,
8065
+ version = _ref2.version;
8066
+ if (isTLocation(address)) return address;
8067
+ var accountPayload = createAccountPayload(api, address);
8068
+ return {
8069
+ parents: Parents.ZERO,
8070
+ interior: createX1Payload(version, accountPayload)
8071
+ };
8072
+ };
8073
+
8074
+ var createDestination = function createDestination(api, version, origin, destination, chainId, junction, parents) {
8075
+ var isLocDestination = isTLocation(destination);
8076
+ var isSubBridge = !isLocDestination && !isExternalChain(destination) && isSubstrateBridge(origin, destination);
8077
+ if (isSubBridge) {
8078
+ return {
8079
+ parents: Parents.TWO,
8080
+ interior: {
8081
+ X2: [{
8082
+ GlobalConsensus: api.getRelayChainOf(destination)
8083
+ }, {
8084
+ Parachain: chainId
8085
+ }]
8086
+ }
8087
+ };
8088
+ }
8089
+ var isExternalDestination = !isLocDestination && isExternalChain(destination);
8090
+ if (isExternalDestination) {
8091
+ return {
8092
+ parents: Parents.TWO,
8093
+ interior: {
8094
+ X1: [getEthereumJunction(api, origin)]
8095
+ }
8096
+ };
8097
+ }
8098
+ var scenario = resolveScenario(origin, destination);
8099
+ var parentsResolved = parents !== null && parents !== void 0 ? parents : scenario === 'RelayToPara' ? Parents.ZERO : Parents.ONE;
8100
+ var interior = scenario === 'ParaToRelay' ? 'Here' : createX1Payload(version, junction !== null && junction !== void 0 ? junction : {
8101
+ Parachain: chainId
8102
+ });
8103
+ return isLocDestination ? destination : {
8104
+ parents: parentsResolved,
8105
+ interior: interior
8106
+ };
8107
+ };
8108
+ var createVersionedDestination = function createVersionedDestination(api, version, origin, destination, chainId, junction, parents) {
8109
+ var plainDestination = createDestination(api, version, origin, destination, chainId, junction, parents);
8110
+ return addXcmVersionHeader(plainDestination, version);
8111
+ };
8112
+
8113
+ var getChainLocation = function getChainLocation(chain, destChain, customCtx) {
8114
+ var fromRelay = isRelayChain(chain);
8115
+ var toRelay = isRelayChain(destChain);
8116
+ var parents = fromRelay ? Parents.ZERO : Parents.ONE;
8117
+ var interior = toRelay ? 'Here' : {
8118
+ X1: [{
8119
+ Parachain: getParaIdImpl(destChain, customCtx)
8120
+ }]
8121
+ };
8122
+ return {
8123
+ parents: parents,
8124
+ interior: interior
8125
+ };
8126
+ };
8127
+
8128
+ /**
8129
+ * This function localizes a location by removing the `Parachain` junction
8130
+ * if it exists. The `parents` field is set to `0` either if a `Parachain` was removed
8131
+ * or if the resulting interior is `'Here'` and the chain is a relay chain.
8132
+ *
8133
+ * @param chain - The current chain
8134
+ * @param location - The location to localize
8135
+ * @returns The localized location
8136
+ */
8137
+ var localizeLocationInner = function localizeLocationInner(chain, location, origin, resolveRelay, resolveParaId) {
8138
+ var _Object$keys$;
8139
+ var targetRelay = isExternalChain(chain) ? undefined : resolveRelay(chain).toLowerCase();
8140
+ var originRelay = origin && !isExternalChain(origin) ? resolveRelay(origin).toLowerCase() : undefined;
8141
+ var locationConsensus = getJunctionValue(location, 'GlobalConsensus');
8142
+ var locationRelay = locationConsensus ? (_Object$keys$ = Object.keys(locationConsensus)[0]) === null || _Object$keys$ === void 0 ? void 0 : _Object$keys$.toLowerCase() : undefined;
8143
+ var ecosystemDiffers = targetRelay && originRelay && originRelay !== targetRelay;
8144
+ var junctions = location.interior === 'Here' ? [] : flattenJunctions(location.interior);
8145
+ var junctionCount = junctions.length;
8146
+ var isLocationOnTargetRelay = targetRelay !== undefined && locationRelay === targetRelay;
8147
+ // Check if target is an external chain and location's GlobalConsensus matches it
8148
+ var isLocationOnTargetExternal = isExternalChain(chain) && locationRelay === chain.toLowerCase();
8149
+ var isConsensusAnchored = junctions.findIndex(function (junction) {
8150
+ return 'GlobalConsensus' in junction;
8151
+ }) === 0;
8152
+ if (locationRelay && targetRelay && locationRelay !== targetRelay && (!origin || !ecosystemDiffers && isConsensusAnchored)) {
8153
+ return location;
8154
+ }
8155
+ if (origin && ecosystemDiffers && location.parents === Parents.TWO && originRelay !== undefined && targetRelay !== undefined && deepEqual(getJunctionValue(location, 'GlobalConsensus'), _defineProperty({}, targetRelay, null)) && junctionCount === 1) {
8156
+ return RELAY_LOCATION;
8157
+ }
8158
+ var newInterior = location.interior;
8159
+ var parachainRemoved = false;
8160
+ if (location.interior !== 'Here') {
8161
+ var paraId = resolveParaId(chain);
8162
+ var filteredJunctions = junctions.filter(function (junction) {
8163
+ if ('GlobalConsensus' in junction && (isLocationOnTargetRelay || isLocationOnTargetExternal)) {
8164
+ return false;
8165
+ }
8166
+ if ('Parachain' in junction && (!ecosystemDiffers || isLocationOnTargetRelay)) {
8167
+ var paraJunctionId = getJunctionValue(location, 'Parachain');
8168
+ if (paraJunctionId === paraId) {
8169
+ parachainRemoved = true;
8170
+ return false;
8171
+ }
8172
+ }
8173
+ return true;
8174
+ });
8175
+ if (filteredJunctions.length === 0) {
8176
+ newInterior = 'Here';
8177
+ } else {
8178
+ newInterior = _defineProperty({}, "X".concat(filteredJunctions.length), filteredJunctions);
8432
8179
  }
8180
+ }
8181
+ var isOriginRelayHere = deepEqual(location, RELAY_LOCATION);
8182
+ var hasGlobalConsensus = hasJunction(location, 'GlobalConsensus');
8183
+ if (origin && isExternalChain(chain) && originRelay !== undefined && isOriginRelayHere && !hasGlobalConsensus) {
8184
+ return {
8185
+ parents: Parents.ONE,
8186
+ interior: {
8187
+ X1: [{
8188
+ GlobalConsensus: _defineProperty({}, originRelay, null)
8189
+ }]
8190
+ }
8191
+ };
8192
+ }
8193
+ if (isExternalChain(chain) && location.parents === Parents.TWO && RELAYCHAINS.some(function (relay) {
8194
+ return deepEqual(getJunctionValue(location, 'GlobalConsensus'), _defineProperty({}, relay.toLowerCase(), null));
8195
+ })) {
8196
+ return _objectSpread2(_objectSpread2({}, location), {}, {
8197
+ parents: Parents.ONE
8198
+ });
8199
+ }
8200
+ if (origin && ecosystemDiffers && isOriginRelayHere && !hasGlobalConsensus && originRelay !== undefined) {
8201
+ return {
8202
+ parents: Parents.TWO,
8203
+ interior: {
8204
+ X1: [{
8205
+ GlobalConsensus: _defineProperty({}, originRelay, null)
8206
+ }]
8207
+ }
8208
+ };
8209
+ }
8210
+ if (origin && ecosystemDiffers && newInterior !== 'Here' && !hasGlobalConsensus && originRelay !== undefined) {
8211
+ var _junctions = flattenJunctions(newInterior);
8212
+ var updatedJunctions = [{
8213
+ GlobalConsensus: _defineProperty({}, originRelay, null)
8214
+ }].concat(_toConsumableArray(_junctions));
8215
+ return {
8216
+ parents: Parents.TWO,
8217
+ interior: _defineProperty({}, "X".concat(updatedJunctions.length), updatedJunctions)
8218
+ };
8219
+ }
8220
+ var shouldSetParentsToZero = parachainRemoved || newInterior === 'Here' && isRelayChain(chain) || isLocationOnTargetExternal;
8221
+ return {
8222
+ parents: shouldSetParentsToZero ? Parents.ZERO : location.parents,
8223
+ interior: newInterior
8433
8224
  };
8434
8225
  };
8226
+ var localizeLocation = function localizeLocation(chain, location, origin) {
8227
+ return localizeLocationInner(chain, location, origin, function (c) {
8228
+ return getRelayChainOf(c);
8229
+ }, function (c) {
8230
+ return getParaId(c);
8231
+ });
8232
+ };
8233
+ var localizeLocationImpl = function localizeLocationImpl(api, chain, location, origin) {
8234
+ return localizeLocationInner(chain, location, origin, function (c) {
8235
+ return getRelayChainOfImpl(api, c);
8236
+ }, function (c) {
8237
+ return getParaIdImpl(c, api._customCtx);
8238
+ });
8239
+ };
8240
+
8241
+ var reverseTransformLocation = function reverseTransformLocation(location) {
8242
+ var parachainJunction = {
8243
+ Parachain: 1000
8244
+ };
8245
+ var alreadyHasP1000 = location.interior !== 'Here' && Object.values(location.interior).flat().some(function (j) {
8246
+ return _typeof(j) === 'object' && j !== null && 'Parachain' in j && j.Parachain === 1000;
8247
+ });
8248
+ if (alreadyHasP1000) {
8249
+ return _objectSpread2(_objectSpread2({}, location), {}, {
8250
+ parents: Parents.ONE
8251
+ });
8252
+ }
8253
+ var existingJunctions = location.interior === 'Here' ? [] // no other junctions
8254
+ : Object.values(location.interior).flat();
8255
+ var allJunctions = [parachainJunction].concat(_toConsumableArray(existingJunctions));
8256
+ return _objectSpread2(_objectSpread2({}, location), {}, {
8257
+ parents: Parents.ONE,
8258
+ interior: _defineProperty({}, "X".concat(allJunctions.length), allJunctions)
8259
+ });
8260
+ };
8435
8261
 
8436
8262
  var PINK_LOCATION = {
8437
8263
  parents: 1,
@@ -8453,6 +8279,13 @@ var requiresSystemAssetByLocation = function requiresSystemAssetByLocation(api,
8453
8279
  return deepEqual(assetLocation, location);
8454
8280
  });
8455
8281
  };
8282
+ var getFeeAssetLocation = function getFeeAssetLocation(_ref) {
8283
+ var _feeAssetInfo$locatio;
8284
+ var feeAssetInfo = _ref.feeAssetInfo,
8285
+ isRelayAsset = _ref.isRelayAsset,
8286
+ assetInfo = _ref.assetInfo;
8287
+ return (_feeAssetInfo$locatio = feeAssetInfo === null || feeAssetInfo === void 0 ? void 0 : feeAssetInfo.location) !== null && _feeAssetInfo$locatio !== void 0 ? _feeAssetInfo$locatio : isRelayAsset ? assetInfo.location : RELAY_LOCATION;
8288
+ };
8456
8289
  var getBridgeReserve = function getBridgeReserve(api, chain, destination, location) {
8457
8290
  var assetConsensus = getJunctionValue(location, 'GlobalConsensus');
8458
8291
  var ethereumConsensus = getEthereumJunction(api, chain, false).GlobalConsensus;
@@ -8472,17 +8305,23 @@ var resolveReserveChain = function resolveReserveChain(api, chain, destination,
8472
8305
  return api.getAssetReserveChain(chain, assetLocation, isExternalChain(destination));
8473
8306
  };
8474
8307
  var createTypeAndThenCallContext = /*#__PURE__*/function () {
8475
- var _ref2 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee(options, overrides) {
8308
+ var _ref3 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee(options, overrides) {
8476
8309
  var _overrides$noFeeAsset;
8477
- var api, chain, destination, assetInfo, isSubBridge, isSb, reserveChain, NO_FEE_ASSET_LOCS, systemAsset, assetGlobalConsensus, originRelayChain, isExternalDestination, isSnowbridgeAsset, requiresSystemAsset, isAssetHubToExternal, isForeignRelayToExternal, isRelayAsset, assetHubChain, bridgeHopChain, destApi, reserveApi;
8310
+ var api, chain, destination, assetInfo, overriddenAsset, isSubBridge, isSb, transferredAsset, reserveChain, feeAssetInfo, feeAssetLocation, feeReserveChain, NO_FEE_ASSET_LOCS, systemAsset, assetGlobalConsensus, originRelayChain, isExternalDestination, isSnowbridgeAsset, requiresSystemAsset, isAssetHubToExternal, isForeignRelayToExternal, isRelayAsset, assetHubChain, bridgeHopChain, routedChain, destApi, reserveApi;
8478
8311
  return _regenerator().w(function (_context) {
8479
8312
  while (1) switch (_context.n) {
8480
8313
  case 0:
8481
- api = options.api, chain = options.chain, destination = options.destination, assetInfo = options.assetInfo;
8314
+ api = options.api, chain = options.chain, destination = options.destination, assetInfo = options.assetInfo, overriddenAsset = options.overriddenAsset;
8482
8315
  assertToIsString(destination);
8483
8316
  isSubBridge = isSubstrateBridge(chain, destination);
8484
- isSb = isSnowbridge(chain, destination);
8485
- reserveChain = resolveReserveChain(api, chain, destination, assetInfo.location, isSubBridge, overrides.reserveChain);
8317
+ isSb = isSnowbridge(chain, destination); // For multi-asset transfers `assetInfo` is the fee asset, so the reserve is taken from the transferred asset
8318
+ transferredAsset = overriddenAsset === null || overriddenAsset === void 0 ? void 0 : overriddenAsset.find(function (asset) {
8319
+ return !asset.isFeeAsset;
8320
+ });
8321
+ reserveChain = resolveReserveChain(api, chain, destination, transferredAsset ? extractAssetLocation(transferredAsset) : assetInfo.location, isSubBridge, overrides.reserveChain);
8322
+ feeAssetInfo = getFeeAssetInfo(assetInfo, options.feeAssetInfo);
8323
+ feeAssetLocation = transferredAsset ? assetInfo.location : feeAssetInfo === null || feeAssetInfo === void 0 ? void 0 : feeAssetInfo.location;
8324
+ feeReserveChain = feeAssetLocation && resolveReserveChain(api, chain, destination, feeAssetLocation, isSubBridge);
8486
8325
  NO_FEE_ASSET_LOCS = [RELAY_LOCATION, {
8487
8326
  parents: 2,
8488
8327
  interior: {
@@ -8519,19 +8358,26 @@ var createTypeAndThenCallContext = /*#__PURE__*/function () {
8519
8358
  isForeignRelayToExternal = isExternalDestination && !chain.startsWith('AssetHub') && assetInfo.location.parents === 2 && RELAYCHAINS.some(function (relay) {
8520
8359
  return relay !== originRelayChain && deepEqual(assetGlobalConsensus, _defineProperty({}, relay.toLowerCase(), null));
8521
8360
  });
8522
- isRelayAsset = !requiresSystemAsset && !isForeignRelayToExternal && (isAssetHubToExternal || NO_FEE_ASSET_LOCS.some(function (loc) {
8361
+ isRelayAsset = !feeAssetInfo && !requiresSystemAsset && !isForeignRelayToExternal && (isAssetHubToExternal || NO_FEE_ASSET_LOCS.some(function (loc) {
8523
8362
  return deepEqual(assetInfo.location, loc);
8524
8363
  }) || isSubBridge || ((_overrides$noFeeAsset = overrides.noFeeAsset) !== null && _overrides$noFeeAsset !== void 0 ? _overrides$noFeeAsset : false));
8525
8364
  assetHubChain = "AssetHub".concat(originRelayChain);
8526
8365
  bridgeHopChain = !chain.startsWith('AssetHub') && destination !== assetHubChain && assetGlobalConsensus !== undefined ? assetHubChain : undefined;
8366
+ routedChain = bridgeHopChain !== null && bridgeHopChain !== void 0 ? bridgeHopChain : reserveChain === chain ? destination : reserveChain;
8367
+ if (!(feeReserveChain !== undefined && feeReserveChain !== chain && feeReserveChain !== routedChain)) {
8368
+ _context.n = 1;
8369
+ break;
8370
+ }
8371
+ throw new ScenarioNotSupportedError("Fee asset cannot pay fees on ".concat(routedChain, " because its reserve chain (").concat(feeReserveChain, ") is neither the origin nor ").concat(routedChain));
8372
+ case 1:
8527
8373
  destApi = api.clone();
8528
- _context.n = 1;
8374
+ _context.n = 2;
8529
8375
  return destApi.init(destination);
8530
- case 1:
8376
+ case 2:
8531
8377
  reserveApi = reserveChain === chain ? api : reserveChain === destination ? destApi : api.clone();
8532
- _context.n = 2;
8378
+ _context.n = 3;
8533
8379
  return reserveApi.init(reserveChain);
8534
- case 2:
8380
+ case 3:
8535
8381
  return _context.a(2, {
8536
8382
  origin: {
8537
8383
  api: api,
@@ -8549,6 +8395,8 @@ var createTypeAndThenCallContext = /*#__PURE__*/function () {
8549
8395
  isSnowbridge: isSb,
8550
8396
  isRelayAsset: isRelayAsset,
8551
8397
  assetInfo: assetInfo,
8398
+ feeAssetInfo: feeAssetInfo,
8399
+ feeReserveChain: feeReserveChain,
8552
8400
  options: options,
8553
8401
  systemAsset: systemAsset,
8554
8402
  bridgeHopChain: bridgeHopChain
@@ -8557,10 +8405,70 @@ var createTypeAndThenCallContext = /*#__PURE__*/function () {
8557
8405
  }, _callee);
8558
8406
  }));
8559
8407
  return function createTypeAndThenCallContext(_x, _x2) {
8560
- return _ref2.apply(this, arguments);
8408
+ return _ref3.apply(this, arguments);
8561
8409
  };
8562
8410
  }();
8563
8411
 
8412
+ var resolveTransferType = function resolveTransferType(_ref, assetInfo, assetReserveChain) {
8413
+ var origin = _ref.origin,
8414
+ reserve = _ref.reserve,
8415
+ dest = _ref.dest,
8416
+ isSubBridge = _ref.isSubBridge;
8417
+ // Direct A → C: when origin is reserve OR dest is reserve, check origin <-> dest trust
8418
+ // Hop A → B → C: when reserve differs from both, check origin <-> reserve trust
8419
+ var isDirect = origin.chain === reserve.chain || dest.chain === reserve.chain;
8420
+ var chainToCheck = isDirect ? dest.chain : reserve.chain;
8421
+ var canTeleport = isTrustedChain(origin.chain) && isTrustedChain(chainToCheck) || isNativeAssetTeleport(origin.api, origin.chain, chainToCheck, assetInfo);
8422
+ if (canTeleport && !isSubBridge) return 'Teleport';
8423
+ if (origin.chain === assetReserveChain) return 'LocalReserve';
8424
+ return 'DestinationReserve';
8425
+ };
8426
+ var buildTypeAndThenCall = function buildTypeAndThenCall(context, isDotAsset, customXcm, assets) {
8427
+ var origin = context.origin,
8428
+ reserve = context.reserve,
8429
+ dest = context.dest,
8430
+ assetInfo = context.assetInfo,
8431
+ feeAssetInfo = context.feeAssetInfo,
8432
+ feeReserveChain = context.feeReserveChain,
8433
+ bridgeHopChain = context.bridgeHopChain,
8434
+ isSubBridge = context.isSubBridge,
8435
+ _context$options = context.options,
8436
+ version = _context$options.version,
8437
+ pallet = _context$options.pallet,
8438
+ method = _context$options.method,
8439
+ overriddenAsset = _context$options.overriddenAsset;
8440
+ var feeAssetLocation = getFeeAssetLocation(context);
8441
+ var finalDest = bridgeHopChain !== null && bridgeHopChain !== void 0 ? bridgeHopChain : origin.chain === reserve.chain ? dest.chain : reserve.chain;
8442
+ var destLocation = createDestination(origin.api, version, origin.chain, finalDest, origin.api.getParaId(finalDest));
8443
+ var transferType = bridgeHopChain ? 'DestinationReserve' : resolveTransferType(context, assetInfo, reserve.chain);
8444
+ var resolveFeesTransferType = function resolveFeesTransferType() {
8445
+ if (feeReserveChain !== undefined) {
8446
+ return resolveTransferType(context, feeAssetInfo !== null && feeAssetInfo !== void 0 ? feeAssetInfo : assetInfo, feeReserveChain);
8447
+ }
8448
+ return isSubBridge && !isDotAsset ? 'LocalReserve' : transferType;
8449
+ };
8450
+ var feesTransferType = resolveFeesTransferType();
8451
+ var overriddenFeeAsset = overriddenAsset === null || overriddenAsset === void 0 ? void 0 : overriddenAsset.find(function (asset) {
8452
+ return asset.isFeeAsset;
8453
+ });
8454
+ var feeMultiAsset = createAsset(version, assetInfo.amount, normalizeLocation(origin.api.localizeLocation(origin.chain, overriddenFeeAsset ? extractAssetLocation(overriddenFeeAsset) : feeAssetLocation), version));
8455
+ var module = pallet !== null && pallet !== void 0 ? pallet : origin.api.getXcmPallet(origin.chain);
8456
+ var methodName = method !== null && method !== void 0 ? method : 'transfer_assets_using_type_and_then';
8457
+ return {
8458
+ module: module,
8459
+ method: methodName,
8460
+ params: {
8461
+ dest: addXcmVersionHeader(destLocation, version),
8462
+ assets: addXcmVersionHeader(assets, version),
8463
+ assets_transfer_type: transferType,
8464
+ remote_fees_id: addXcmVersionHeader(feeMultiAsset.id, version),
8465
+ fees_transfer_type: feesTransferType,
8466
+ custom_xcm_on_dest: addXcmVersionHeader(customXcm, version),
8467
+ weight_limit: 'Unlimited'
8468
+ }
8469
+ };
8470
+ };
8471
+
8564
8472
  var generateMessageId = /*#__PURE__*/function () {
8565
8473
  var _ref = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee(api, senderAddress, sourceParaId, tokenAddress, recipient, amount) {
8566
8474
  var accountNextId, sourceAccountHex, entropy;
@@ -8689,7 +8597,7 @@ var createCustomXcm = /*#__PURE__*/function () {
8689
8597
  setTopic = messageId ? [{
8690
8598
  SetTopic: messageId
8691
8599
  }] : [];
8692
- feeAssetLocation = !isRelayAsset ? RELAY_LOCATION : assetInfo.location;
8600
+ feeAssetLocation = getFeeAssetLocation(context);
8693
8601
  feeLocLocalized = origin.api.localizeLocation(dest.chain, feeAssetLocation, origin.chain);
8694
8602
  assetLocLocalized = origin.api.localizeLocation(dest.chain, assetInfo.location, origin.chain);
8695
8603
  asset = createAsset(version, assetInfo.amount, assetLocLocalized);
@@ -8722,7 +8630,7 @@ var createCustomXcm = /*#__PURE__*/function () {
8722
8630
  return localizeFilterAsset(asset.fun.Fungible, extractAssetLocation(asset));
8723
8631
  })));
8724
8632
  } else {
8725
- if (!isRelayAsset && !isExternalChain(dest.chain)) assetsFilter.push(createAsset(version, hopFees + destFee, origin.api.localizeLocation(reserve.chain, RELAY_LOCATION)));
8633
+ if (!isRelayAsset && !isExternalChain(dest.chain)) assetsFilter.push(createAsset(version, normalizeAmount(hopFees + destFee), origin.api.localizeLocation(reserve.chain, feeAssetLocation)));
8726
8634
  assetsFilter.push(localizeFilterAsset(assetInfo.amount, assetInfo.location));
8727
8635
  }
8728
8636
  isAssetEthereumNative = deepEqual(getJunctionValue(assetInfo.location, 'GlobalConsensus'), getEthereumJunction(origin.api, origin.chain, false).GlobalConsensus);
@@ -8742,7 +8650,7 @@ var createCustomXcm = /*#__PURE__*/function () {
8742
8650
  AllCounted: assetCount
8743
8651
  }
8744
8652
  } : {
8745
- Definite: assetsFilter
8653
+ Definite: sortAssets(assetsFilter)
8746
8654
  };
8747
8655
  buyExecutionAsset = isExternalChain(dest.chain) ? createAsset(version, buyExecutionAmount, assetLocLocalized) : createAsset(version, normalizeAmount(buyExecutionAmount), feeLocLocalized);
8748
8656
  buyExecution = {
@@ -8816,17 +8724,25 @@ var createCustomXcm = /*#__PURE__*/function () {
8816
8724
  };
8817
8725
  }();
8818
8726
 
8819
- var buildAssets = function buildAssets(api, chain, asset, feeAmount, isRelayAsset, _ref) {
8820
- var version = _ref.version,
8821
- overriddenAsset = _ref.overriddenAsset;
8727
+ var buildAssets = function buildAssets(context, feeAmount) {
8728
+ var _context$origin = context.origin,
8729
+ api = _context$origin.api,
8730
+ chain = _context$origin.chain,
8731
+ assetInfo = context.assetInfo,
8732
+ isRelayAsset = context.isRelayAsset,
8733
+ _context$options = context.options,
8734
+ version = _context$options.version,
8735
+ overriddenAsset = _context$options.overriddenAsset;
8736
+ var localize = function localize(amount, location) {
8737
+ return createAsset(version, amount, normalizeLocation(api.localizeLocation(chain, location), version));
8738
+ };
8822
8739
  if (overriddenAsset) {
8823
- return overriddenAsset;
8824
- }
8825
- var assets = [];
8826
- if (!isRelayAsset) {
8827
- assets.push(createAsset(version, feeAmount, RELAY_LOCATION));
8740
+ return sortAssets(overriddenAsset.map(function (asset) {
8741
+ return localize(asset.fun.Fungible, extractAssetLocation(asset));
8742
+ }));
8828
8743
  }
8829
- assets.push(createAsset(version, asset.amount, normalizeLocation(api.localizeLocation(chain, asset.location), version)));
8744
+ var assets = isRelayAsset ? [] : [localize(feeAmount, getFeeAssetLocation(context))];
8745
+ assets.push(localize(assetInfo.amount, assetInfo.location));
8830
8746
  return sortAssets(assets);
8831
8747
  };
8832
8748
  var resolveAssetCount = function resolveAssetCount(overriddenAsset, isRelayAsset) {
@@ -8837,22 +8753,20 @@ var resolveAssetCount = function resolveAssetCount(overriddenAsset, isRelayAsset
8837
8753
  };
8838
8754
  var DEFAULT_SYSTEM_ASSET_AMOUNT = '1';
8839
8755
  var DEFAULT_SYSTEM_ASSET_AMOUNT_EXTERNAL = '10';
8840
- var resolveSystemAssetAmount = function resolveSystemAssetAmount(_ref2, isForFeeCalc, fees) {
8841
- var systemAsset = _ref2.systemAsset,
8842
- dest = _ref2.dest;
8756
+ var resolveSystemAssetAmount = function resolveSystemAssetAmount(_ref, isForFeeCalc, fees) {
8757
+ var systemAsset = _ref.systemAsset,
8758
+ feeAssetInfo = _ref.feeAssetInfo,
8759
+ dest = _ref.dest;
8843
8760
  if (isForFeeCalc) {
8844
8761
  var defaultAmount = isExternalChain(dest.chain) ? DEFAULT_SYSTEM_ASSET_AMOUNT_EXTERNAL : DEFAULT_SYSTEM_ASSET_AMOUNT;
8845
- return parseUnits(defaultAmount, systemAsset.decimals);
8762
+ return parseUnits(defaultAmount, (feeAssetInfo !== null && feeAssetInfo !== void 0 ? feeAssetInfo : systemAsset).decimals);
8846
8763
  }
8847
8764
  return normalizeAmount(fees.destFee + fees.hopFees);
8848
8765
  };
8849
8766
  var constructTypeAndThenCall = /*#__PURE__*/function () {
8850
- var _ref3 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee(context) {
8767
+ var _ref2 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee(context) {
8851
8768
  var fees,
8852
- origin,
8853
- assetInfo,
8854
8769
  isRelayAsset,
8855
- options,
8856
8770
  overriddenAsset,
8857
8771
  assetCount,
8858
8772
  resolvedFees,
@@ -8865,8 +8779,7 @@ var constructTypeAndThenCall = /*#__PURE__*/function () {
8865
8779
  while (1) switch (_context.n) {
8866
8780
  case 0:
8867
8781
  fees = _args.length > 1 && _args[1] !== undefined ? _args[1] : null;
8868
- origin = context.origin, assetInfo = context.assetInfo, isRelayAsset = context.isRelayAsset, options = context.options;
8869
- overriddenAsset = options.overriddenAsset;
8782
+ isRelayAsset = context.isRelayAsset, overriddenAsset = context.options.overriddenAsset;
8870
8783
  assetCount = resolveAssetCount(overriddenAsset, isRelayAsset);
8871
8784
  resolvedFees = fees !== null && fees !== void 0 ? fees : {
8872
8785
  hopFees: 0n,
@@ -8878,20 +8791,20 @@ var constructTypeAndThenCall = /*#__PURE__*/function () {
8878
8791
  return createCustomXcm(context, assetCount, isForFeeCalc, systemAssetAmount, resolvedFees);
8879
8792
  case 1:
8880
8793
  customXcm = _context.v;
8881
- assets = buildAssets(origin.api, origin.chain, assetInfo, systemAssetAmount, isRelayAsset, options);
8794
+ assets = buildAssets(context, systemAssetAmount);
8882
8795
  return _context.a(2, buildTypeAndThenCall(context, isRelayAsset, customXcm, assets));
8883
8796
  }
8884
8797
  }, _callee);
8885
8798
  }));
8886
8799
  return function constructTypeAndThenCall(_x) {
8887
- return _ref3.apply(this, arguments);
8800
+ return _ref2.apply(this, arguments);
8888
8801
  };
8889
8802
  }();
8890
8803
  /**
8891
8804
  * Creates a type and then call for transferring assets using XCM. Works only for DOT and snowbridge assets so far.
8892
8805
  */
8893
8806
  var createTypeAndThenCall = /*#__PURE__*/function () {
8894
- var _ref4 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee3(options) {
8807
+ var _ref3 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee3(options) {
8895
8808
  var overrides,
8896
8809
  context,
8897
8810
  origin,
@@ -8928,7 +8841,7 @@ var createTypeAndThenCall = /*#__PURE__*/function () {
8928
8841
  case 3:
8929
8842
  _context3.n = 4;
8930
8843
  return computeAllFees(context, /*#__PURE__*/function () {
8931
- var _ref5 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee2(amount, relative) {
8844
+ var _ref4 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee2(amount, relative) {
8932
8845
  var overridenAmount, _t, _t2;
8933
8846
  return _regenerator().w(function (_context2) {
8934
8847
  while (1) switch (_context2.n) {
@@ -8948,7 +8861,7 @@ var createTypeAndThenCall = /*#__PURE__*/function () {
8948
8861
  }, _callee2);
8949
8862
  }));
8950
8863
  return function (_x3, _x4) {
8951
- return _ref5.apply(this, arguments);
8864
+ return _ref4.apply(this, arguments);
8952
8865
  };
8953
8866
  }());
8954
8867
  case 4:
@@ -8958,7 +8871,7 @@ var createTypeAndThenCall = /*#__PURE__*/function () {
8958
8871
  }, _callee3);
8959
8872
  }));
8960
8873
  return function createTypeAndThenCall(_x2) {
8961
- return _ref4.apply(this, arguments);
8874
+ return _ref3.apply(this, arguments);
8962
8875
  };
8963
8876
  }();
8964
8877
 
@@ -9242,6 +9155,66 @@ var verifyEdOnDestination = /*#__PURE__*/function () {
9242
9155
  };
9243
9156
  }();
9244
9157
 
9158
+ var handleTransactUsingSend = /*#__PURE__*/function () {
9159
+ var _ref2 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee(_ref) {
9160
+ var api, version, chain, destination, destChain, recipient, paraIdTo, asset, assetInfo, feeAssetInfo, overriddenAsset, transactOptions, dest, transactInstructions, message;
9161
+ return _regenerator().w(function (_context) {
9162
+ while (1) switch (_context.n) {
9163
+ case 0:
9164
+ api = _ref.api, version = _ref.version, chain = _ref.chain, destination = _ref.destination, destChain = _ref.destChain, recipient = _ref.recipient, paraIdTo = _ref.paraIdTo, asset = _ref.asset, assetInfo = _ref.assetInfo, feeAssetInfo = _ref.feeAssetInfo, overriddenAsset = _ref.overriddenAsset, transactOptions = _ref.transactOptions;
9165
+ validateFeeAssetSupport(assetInfo, feeAssetInfo, overriddenAsset, 'send');
9166
+ dest = createDestination(api, version, chain, destination, paraIdTo);
9167
+ if (transactOptions !== null && transactOptions !== void 0 && transactOptions.call) {
9168
+ _context.n = 1;
9169
+ break;
9170
+ }
9171
+ throw new UnsupportedOperationError('Cannot use handleTransactUsingSend without transactOptions.call defined');
9172
+ case 1:
9173
+ if (destChain) {
9174
+ _context.n = 2;
9175
+ break;
9176
+ }
9177
+ throw new UnsupportedOperationError('destChain must be provided when using handleTransactUsingSend');
9178
+ case 2:
9179
+ assertAddressIsString(recipient);
9180
+ _context.n = 3;
9181
+ return createTransactInstructions(api, transactOptions, version, destChain, recipient);
9182
+ case 3:
9183
+ transactInstructions = _context.v;
9184
+ message = [{
9185
+ WithdrawAsset: [asset]
9186
+ }].concat(_toConsumableArray(createBuyExecution(asset)), _toConsumableArray(transactInstructions), [{
9187
+ RefundSurplus: undefined
9188
+ }, {
9189
+ DepositAsset: {
9190
+ assets: {
9191
+ Wild: {
9192
+ AllCounted: 1
9193
+ }
9194
+ },
9195
+ beneficiary: createBeneficiaryLocation({
9196
+ api: api,
9197
+ address: recipient,
9198
+ version: version
9199
+ })
9200
+ }
9201
+ }]);
9202
+ return _context.a(2, {
9203
+ module: getXcmPallet(chain),
9204
+ method: 'send',
9205
+ params: {
9206
+ dest: addXcmVersionHeader(dest, version),
9207
+ message: addXcmVersionHeader(message, version)
9208
+ }
9209
+ });
9210
+ }
9211
+ }, _callee);
9212
+ }));
9213
+ return function handleTransactUsingSend(_x) {
9214
+ return _ref2.apply(this, arguments);
9215
+ };
9216
+ }();
9217
+
9245
9218
  var transferPolkadotXcm = /*#__PURE__*/function () {
9246
9219
  var _ref = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee(options) {
9247
9220
  var method,
@@ -9253,6 +9226,7 @@ var transferPolkadotXcm = /*#__PURE__*/function () {
9253
9226
  beneficiaryLocation,
9254
9227
  multiAsset,
9255
9228
  overriddenAsset,
9229
+ feeAssetInfo,
9256
9230
  pallet,
9257
9231
  version,
9258
9232
  methodOverride,
@@ -9269,7 +9243,7 @@ var transferPolkadotXcm = /*#__PURE__*/function () {
9269
9243
  case 0:
9270
9244
  method = _args.length > 1 && _args[1] !== undefined ? _args[1] : 'transfer_assets_using_type_and_then';
9271
9245
  fees = _args.length > 2 && _args[2] !== undefined ? _args[2] : undefined;
9272
- api = options.api, chain = options.chain, destination = options.destination, asset = options.assetInfo, beneficiaryLocation = options.beneficiaryLocation, multiAsset = options.asset, overriddenAsset = options.overriddenAsset, pallet = options.pallet, version = options.version, methodOverride = options.method, paraIdTo = options.paraIdTo;
9246
+ api = options.api, chain = options.chain, destination = options.destination, asset = options.assetInfo, beneficiaryLocation = options.beneficiaryLocation, multiAsset = options.asset, overriddenAsset = options.overriddenAsset, feeAssetInfo = options.feeAssetInfo, pallet = options.pallet, version = options.version, methodOverride = options.method, paraIdTo = options.paraIdTo;
9273
9247
  if (!(method === 'transfer_assets_using_type_and_then')) {
9274
9248
  _context.n = 2;
9275
9249
  break;
@@ -9283,6 +9257,7 @@ var transferPolkadotXcm = /*#__PURE__*/function () {
9283
9257
  case 1:
9284
9258
  return _context.a(2, _t.deserializeExtrinsics.call(_t, _context.v));
9285
9259
  case 2:
9260
+ validateFeeAssetSupport(asset, feeAssetInfo, overriddenAsset, methodOverride !== null && methodOverride !== void 0 ? methodOverride : method);
9286
9261
  resolvedMultiAssets = maybeOverrideAssets(version, asset.amount, [multiAsset], overriddenAsset);
9287
9262
  destLocation = createDestination(api, version, chain, destination, paraIdTo);
9288
9263
  feeAssetIndex = overriddenAsset === undefined ? DEFAULT_FEE_ASSET : overriddenAsset.findIndex(function (asset) {
@@ -9337,6 +9312,13 @@ var applyDecimalAbstraction = function applyDecimalAbstraction(amount, decimals,
9337
9312
  return parseUnits(amount.toString(), decimals);
9338
9313
  };
9339
9314
 
9315
+ var createAllCountedFilter = function createAllCountedFilter(count) {
9316
+ return {
9317
+ Wild: {
9318
+ AllCounted: count
9319
+ }
9320
+ };
9321
+ };
9340
9322
  var createAssetsFilter = function createAssetsFilter(asset, version) {
9341
9323
  var location = extractAssetLocation(asset);
9342
9324
  var id = createAssetId(version, location);
@@ -9367,7 +9349,10 @@ var prepareExecuteContext = function prepareExecuteContext(_ref) {
9367
9349
  destChain = _ref.destChain,
9368
9350
  assetInfo = _ref.assetInfo,
9369
9351
  feeAssetInfo = _ref.feeAssetInfo,
9370
- originFee = _ref.fees.originFee,
9352
+ _ref$fees = _ref.fees,
9353
+ originFee = _ref$fees.originFee,
9354
+ reserveFee = _ref$fees.reserveFee,
9355
+ destFee = _ref$fees.destFee,
9371
9356
  version = _ref.version;
9372
9357
  var amount = assetInfo.amount;
9373
9358
  var reserveChain = api.getAssetReserveChain(chain, assetInfo.location);
@@ -9375,10 +9360,13 @@ var prepareExecuteContext = function prepareExecuteContext(_ref) {
9375
9360
  var assetLocalized = createAsset(version, amount, api.localizeLocation(chain, assetInfo.location));
9376
9361
  var assetLocalizedToDest = createAsset(version, amount, localizeLocation(destChain, assetInfo.location));
9377
9362
  var assetLocalizedToReserve = createAsset(version, amount, api.localizeLocation(reserveChain !== null && reserveChain !== void 0 ? reserveChain : chain, assetInfo.location));
9378
- var feeAsset = feeAssetInfo && !isAssetEqual(assetInfo, feeAssetInfo) ? createAsset(version, originFee, feeAssetInfo.location) : undefined;
9379
- var feeAssetLocalized = feeAssetInfo && !isAssetEqual(assetInfo, feeAssetInfo) ? createAsset(version, originFee, api.localizeLocation(chain, feeAssetInfo.location)) : undefined;
9380
- var feeAssetLocalizedToDest = feeAssetInfo && !isAssetEqual(assetInfo, feeAssetInfo) ? createAsset(version, originFee, localizeLocation(destChain, feeAssetInfo.location)) : undefined;
9381
- var feeAssetLocalizedToReserve = feeAssetInfo && !isAssetEqual(assetInfo, feeAssetInfo) ? createAsset(version, originFee, api.localizeLocation(reserveChain !== null && reserveChain !== void 0 ? reserveChain : chain, feeAssetInfo.location)) : undefined;
9363
+ var resolvedFeeAssetInfo = getFeeAssetInfo(assetInfo, feeAssetInfo);
9364
+ var feeAssetTotal = originFee + reserveFee + destFee;
9365
+ var feeAsset = resolvedFeeAssetInfo && createAsset(version, feeAssetTotal, resolvedFeeAssetInfo.location);
9366
+ var feeAssetLocalized = resolvedFeeAssetInfo && createAsset(version, feeAssetTotal, api.localizeLocation(chain, resolvedFeeAssetInfo.location));
9367
+ var feeAssetLocalizedToDest = resolvedFeeAssetInfo && createAsset(version, destFee, localizeLocation(destChain, resolvedFeeAssetInfo.location));
9368
+ var feeAssetLocalizedToReserve = resolvedFeeAssetInfo && createAsset(version, reserveFee, api.localizeLocation(reserveChain !== null && reserveChain !== void 0 ? reserveChain : chain, resolvedFeeAssetInfo.location));
9369
+ var feeReserveChain = resolvedFeeAssetInfo && api.getAssetReserveChain(chain, resolvedFeeAssetInfo.location);
9382
9370
  return {
9383
9371
  amount: amount,
9384
9372
  asset: asset,
@@ -9389,6 +9377,7 @@ var prepareExecuteContext = function prepareExecuteContext(_ref) {
9389
9377
  feeAssetLocalized: feeAssetLocalized,
9390
9378
  feeAssetLocalizedToDest: feeAssetLocalizedToDest,
9391
9379
  feeAssetLocalizedToReserve: feeAssetLocalizedToReserve,
9380
+ feeReserveChain: feeReserveChain,
9392
9381
  reserveChain: reserveChain
9393
9382
  };
9394
9383
  };
@@ -9400,6 +9389,12 @@ var updateAsset = function updateAsset(asset, amount) {
9400
9389
  }
9401
9390
  });
9402
9391
  };
9392
+ var isTeleportLeg = function isTeleportLeg(api, from, to, assetInfo) {
9393
+ return isTrustedChain(from) && isTrustedChain(to) || isNativeAssetTeleport(api, from, to, assetInfo);
9394
+ };
9395
+ var isTeleportableAsset = function isTeleportableAsset(api, from, to, assetInfo) {
9396
+ return deepEqual(assetInfo.location, RELAY_LOCATION) || isNativeAssetTeleport(api, from, to, assetInfo);
9397
+ };
9403
9398
  var getInstructionType = function getInstructionType(api, version, origin, destination, assetInfo, reserveChain, transactOptions) {
9404
9399
  if (version >= Version.V5 && transactOptions !== null && transactOptions !== void 0 && transactOptions.call) {
9405
9400
  return 'InitiateTransfer';
@@ -9408,7 +9403,7 @@ var getInstructionType = function getInstructionType(api, version, origin, desti
9408
9403
  return 'InitiateTeleportToReserve';
9409
9404
  }
9410
9405
  // Trusted chains (or native-asset teleports to/from AssetHub) can teleport
9411
- if (isTrustedChain(origin) && isTrustedChain(destination) || isNativeAssetTeleport(api, origin, destination, assetInfo)) {
9406
+ if (isTeleportLeg(api, origin, destination, assetInfo)) {
9412
9407
  return 'InitiateTeleport';
9413
9408
  }
9414
9409
  // If we need intermediary reserve (not on reserve chain)
@@ -9419,7 +9414,7 @@ var getInstructionType = function getInstructionType(api, version, origin, desti
9419
9414
  return 'DepositAsset';
9420
9415
  };
9421
9416
  var getInitiateTransferType = function getInitiateTransferType(api, origin, destination, assetInfo, reserveChain) {
9422
- if (isTrustedChain(origin) && isTrustedChain(destination) || isNativeAssetTeleport(api, origin, destination, assetInfo)) {
9417
+ if (isTeleportLeg(api, origin, destination, assetInfo)) {
9423
9418
  return 'Teleport';
9424
9419
  }
9425
9420
  if (origin === reserveChain) return 'ReserveDeposit';
@@ -9430,13 +9425,13 @@ var createBaseExecuteXcm = function createBaseExecuteXcm(options) {
9430
9425
  chain = options.chain,
9431
9426
  destChain = options.destChain,
9432
9427
  assetInfo = options.assetInfo,
9428
+ feeAssetInfo = options.feeAssetInfo,
9433
9429
  _options$fees = options.fees,
9434
9430
  originFee = _options$fees.originFee,
9435
9431
  reserveFee = _options$fees.reserveFee,
9436
9432
  version = options.version,
9437
9433
  paraIdTo = options.paraIdTo,
9438
9434
  transactOptions = options.transactOptions,
9439
- useFeeAssetOnHops = options.useFeeAssetOnHops,
9440
9435
  _options$suffixXcm = options.suffixXcm,
9441
9436
  suffixXcm = _options$suffixXcm === void 0 ? [] : _options$suffixXcm;
9442
9437
  var _prepareExecuteContex = prepareExecuteContext(options),
@@ -9445,11 +9440,13 @@ var createBaseExecuteXcm = function createBaseExecuteXcm(options) {
9445
9440
  assetLocalizedToReserve = _prepareExecuteContex.assetLocalizedToReserve,
9446
9441
  assetLocalizedToDest = _prepareExecuteContex.assetLocalizedToDest,
9447
9442
  feeAsset = _prepareExecuteContex.feeAsset,
9443
+ feeAssetLocalized = _prepareExecuteContex.feeAssetLocalized,
9448
9444
  feeAssetLocalizedToReserve = _prepareExecuteContex.feeAssetLocalizedToReserve,
9449
9445
  feeAssetLocalizedToDest = _prepareExecuteContex.feeAssetLocalizedToDest,
9446
+ feeReserveChain = _prepareExecuteContex.feeReserveChain,
9450
9447
  reserveChain = _prepareExecuteContex.reserveChain;
9451
- var hopFeeAssetToReserve = useFeeAssetOnHops ? feeAssetLocalizedToReserve : undefined;
9452
- var hopFeeAssetToDest = useFeeAssetOnHops ? feeAssetLocalizedToDest : undefined;
9448
+ var isReserveDest = reserveChain === destChain;
9449
+ var hopFeeAssetToReserve = isReserveDest ? feeAssetLocalizedToDest : feeAssetLocalizedToReserve;
9453
9450
  // When fees are paid in a separate asset, originFee is denominated in that asset's
9454
9451
  // currency and must not be subtracted from the transfer amount.
9455
9452
  var originFeeDeduction = feeAsset ? 0n : originFee;
@@ -9457,29 +9454,41 @@ var createBaseExecuteXcm = function createBaseExecuteXcm(options) {
9457
9454
  if (chain !== 'AssetHubPolkadot' && reserveChain === undefined) {
9458
9455
  throw new UnsupportedOperationError('Sending local reserve assets with custom fee asset is not yet supported for this chain.');
9459
9456
  }
9457
+ if (feeReserveChain !== undefined && feeReserveChain !== reserveChain) {
9458
+ throw new ScenarioNotSupportedError("Fee asset cannot pay fees on hops and destination because its reserve chain (".concat(feeReserveChain, ") differs from the reserve chain of the transferred asset (").concat(reserveChain, ")."));
9459
+ }
9460
9460
  var transferType = getInstructionType(api, version, chain, destChain, assetInfo, reserveChain, transactOptions);
9461
- var routingAssetsFilter = feeAsset ? {
9462
- Wild: {
9463
- AllCounted: 2
9461
+ var createRoutingFilter = function createRoutingFilter(asset) {
9462
+ return feeAsset ? createAllCountedFilter(2) : createAssetsFilter(asset, version);
9463
+ };
9464
+ var routingAssetsFilter = createRoutingFilter(assetLocalized);
9465
+ var assertFeeAssetTeleportable = function assertFeeAssetTeleportable(from, to) {
9466
+ if (feeAsset && feeAssetInfo && !isTeleportableAsset(api, from, to, feeAssetInfo)) {
9467
+ throw new ScenarioNotSupportedError("Fee asset ".concat(feeAssetInfo.symbol, " cannot be teleported from ").concat(from, " to ").concat(to, ", so it cannot pay fees there."));
9464
9468
  }
9465
- } : createAssetsFilter(assetLocalized, version);
9466
- var isReserveDest = reserveChain === destChain;
9467
- var resolvedDepositInstruction = isReserveDest ? suffixXcm : [{
9468
- DepositReserveAsset: {
9469
- assets: createAssetsFilter(assetLocalizedToReserve, version),
9470
- dest: createDestination(api, version, reserveChain !== null && reserveChain !== void 0 ? reserveChain : chain, destChain, paraIdTo),
9471
- xcm: [].concat(_toConsumableArray(createBuyExecution(hopFeeAssetToDest !== null && hopFeeAssetToDest !== void 0 ? hopFeeAssetToDest : updateAsset(assetLocalizedToDest, reserveFee === 1000n ? amount / 2n : amount - originFeeDeduction - reserveFee))), _toConsumableArray(suffixXcm))
9469
+ };
9470
+ var reserveToDestInstruction = isTeleportLeg(api, reserveChain !== null && reserveChain !== void 0 ? reserveChain : chain, destChain, assetInfo) ? 'InitiateTeleport' : 'DepositReserveAsset';
9471
+ var createReserveToDestXcm = function createReserveToDestXcm() {
9472
+ if (isReserveDest) return suffixXcm;
9473
+ if (reserveToDestInstruction === 'InitiateTeleport') {
9474
+ assertFeeAssetTeleportable(reserveChain !== null && reserveChain !== void 0 ? reserveChain : chain, destChain);
9472
9475
  }
9473
- }];
9476
+ return [_defineProperty({}, reserveToDestInstruction, {
9477
+ assets: createRoutingFilter(assetLocalizedToReserve),
9478
+ dest: createDestination(api, version, reserveChain !== null && reserveChain !== void 0 ? reserveChain : chain, destChain, paraIdTo),
9479
+ xcm: [].concat(_toConsumableArray(createBuyExecution(feeAssetLocalizedToDest !== null && feeAssetLocalizedToDest !== void 0 ? feeAssetLocalizedToDest : updateAsset(assetLocalizedToDest, reserveFee === 1000n ? amount / 2n : amount - originFeeDeduction - reserveFee))), _toConsumableArray(suffixXcm))
9480
+ })];
9481
+ };
9474
9482
  var mainInstructions;
9475
9483
  switch (transferType) {
9476
9484
  case 'InitiateTransfer':
9477
9485
  {
9478
9486
  var transferFilter = getInitiateTransferType(api, chain, destChain, assetInfo, reserveChain);
9487
+ if (transferFilter === 'Teleport') assertFeeAssetTeleportable(chain, destChain);
9479
9488
  mainInstructions = [{
9480
9489
  InitiateTransfer: {
9481
9490
  destination: destLocation,
9482
- remote_fees: _defineProperty({}, transferFilter, routingAssetsFilter),
9491
+ remote_fees: _defineProperty({}, transferFilter, createAssetsFilter(feeAssetLocalized !== null && feeAssetLocalized !== void 0 ? feeAssetLocalized : assetLocalized, version)),
9483
9492
  preserve_origin: true,
9484
9493
  assets: [_defineProperty({}, transferFilter, routingAssetsFilter)],
9485
9494
  remote_xcm: [{
@@ -9491,21 +9500,23 @@ var createBaseExecuteXcm = function createBaseExecuteXcm(options) {
9491
9500
  }
9492
9501
  case 'InitiateTeleport':
9493
9502
  // Use teleport for trusted chains
9503
+ assertFeeAssetTeleportable(chain, destChain);
9494
9504
  mainInstructions = [{
9495
9505
  InitiateTeleport: {
9496
9506
  assets: routingAssetsFilter,
9497
9507
  dest: destLocation,
9498
- xcm: [].concat(_toConsumableArray(createBuyExecution(hopFeeAssetToDest !== null && hopFeeAssetToDest !== void 0 ? hopFeeAssetToDest : updateAsset(assetLocalizedToDest, amount - originFeeDeduction))), _toConsumableArray(suffixXcm))
9508
+ xcm: [].concat(_toConsumableArray(createBuyExecution(feeAssetLocalizedToDest !== null && feeAssetLocalizedToDest !== void 0 ? feeAssetLocalizedToDest : updateAsset(assetLocalizedToDest, amount - originFeeDeduction))), _toConsumableArray(suffixXcm))
9499
9509
  }
9500
9510
  }];
9501
9511
  break;
9502
9512
  case 'InitiateTeleportToReserve':
9503
9513
  // Teleport to reserve chain first
9514
+ assertFeeAssetTeleportable(chain, reserveChain);
9504
9515
  mainInstructions = [{
9505
9516
  InitiateTeleport: {
9506
9517
  assets: routingAssetsFilter,
9507
9518
  dest: getChainLocation(chain, reserveChain, api._customCtx),
9508
- xcm: [].concat(_toConsumableArray(createBuyExecution(hopFeeAssetToReserve !== null && hopFeeAssetToReserve !== void 0 ? hopFeeAssetToReserve : updateAsset(assetLocalizedToReserve, amount - originFeeDeduction))), _toConsumableArray(resolvedDepositInstruction))
9519
+ xcm: [].concat(_toConsumableArray(createBuyExecution(hopFeeAssetToReserve !== null && hopFeeAssetToReserve !== void 0 ? hopFeeAssetToReserve : updateAsset(assetLocalizedToReserve, amount - originFeeDeduction))), _toConsumableArray(createReserveToDestXcm()))
9509
9520
  }
9510
9521
  }];
9511
9522
  break;
@@ -9517,12 +9528,12 @@ var createBaseExecuteXcm = function createBaseExecuteXcm(options) {
9517
9528
  reserve: getChainLocation(chain, reserveChain, api._customCtx),
9518
9529
  xcm: [].concat(_toConsumableArray(createBuyExecution(// Decrease amount by 2 units because for some reason polkadot withdraws 2 units less
9519
9530
  // than requested, so we need to account for that
9520
- hopFeeAssetToReserve !== null && hopFeeAssetToReserve !== void 0 ? hopFeeAssetToReserve : updateAsset(assetLocalizedToReserve, amount - 2n))), _toConsumableArray(resolvedDepositInstruction))
9531
+ hopFeeAssetToReserve !== null && hopFeeAssetToReserve !== void 0 ? hopFeeAssetToReserve : updateAsset(assetLocalizedToReserve, amount - 2n))), _toConsumableArray(createReserveToDestXcm()))
9521
9532
  }
9522
9533
  }];
9523
9534
  break;
9524
9535
  case 'DepositAsset':
9525
- mainInstructions = resolvedDepositInstruction;
9536
+ mainInstructions = createReserveToDestXcm();
9526
9537
  }
9527
9538
  return mainInstructions;
9528
9539
  };
@@ -9647,7 +9658,7 @@ var prepareCommonExecuteXcm = function prepareCommonExecuteXcm(options, assetToD
9647
9658
  WithdrawAsset: withdrawAssets
9648
9659
  });
9649
9660
  if (feeAssetLocalized && !useJitWithdraw) {
9650
- prefix.push.apply(prefix, _toConsumableArray(createBuyExecution(feeAssetLocalized)));
9661
+ prefix.push.apply(prefix, _toConsumableArray(createBuyExecution(feeAssetLocalized, MIN_WEIGHT)));
9651
9662
  } else {
9652
9663
  prefix.push({
9653
9664
  SetFeesMode: {
@@ -9707,32 +9718,36 @@ var createDirectExecuteXcm = /*#__PURE__*/function () {
9707
9718
  };
9708
9719
  }();
9709
9720
 
9710
- var getReserveFeeFromHops = function getReserveFeeFromHops(hops) {
9711
- if (!hops || hops.length === 0 || !hops[0].result.success) {
9712
- return MIN_FEE;
9713
- }
9714
- return hops[0].result.fee;
9721
+ var getFeeFromResult = function getFeeFromResult(result) {
9722
+ return result !== null && result !== void 0 && result.success ? result.fee : MIN_FEE;
9715
9723
  };
9716
9724
  var FEE_PADDING_PERCENTAGE$1 = 40;
9717
9725
  var handleExecuteTransfer = /*#__PURE__*/function () {
9718
9726
  var _ref = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee(options) {
9719
- var api, chain, sender, paraIdTo, destChain, assetInfo, currency, feeCurrency, recipient, feeAssetInfo, version, transactOptions, checkAmount, internalOptions, FEE_ASSET_AMOUNT, feeAssetAmount, call, dryRunResult, originFeeEstimate, originFee, reserveFeeEstimate, reserveFee, xcm, weight, _t, _t2;
9727
+ var _dryRunResult$hops$at;
9728
+ var api, chain, sender, paraIdTo, destChain, assetInfo, currency, feeCurrency, recipient, feeAssetInfo, version, transactOptions, checkAmount, internalOptions, FEE_ASSET_AMOUNT, feeAssetAmount, resolvedFeeAssetInfo, hopFeeAmount, call, dryRunResult, originFee, reserveFee, destFee, xcm, weight, _t, _t2;
9720
9729
  return _regenerator().w(function (_context) {
9721
9730
  while (1) switch (_context.n) {
9722
9731
  case 0:
9723
9732
  api = options.api, chain = options.chain, sender = options.sender, paraIdTo = options.paraIdTo, destChain = options.destChain, assetInfo = options.assetInfo, currency = options.currency, feeCurrency = options.feeCurrency, recipient = options.recipient, feeAssetInfo = options.feeAssetInfo, version = options.version, transactOptions = options.transactOptions;
9724
9733
  assertSender(sender);
9725
9734
  assertAddressIsString(recipient);
9735
+ if (!(feeAssetInfo && !supportsFeeAssetPayment(chain))) {
9736
+ _context.n = 1;
9737
+ break;
9738
+ }
9739
+ throw new ScenarioNotSupportedError("Fee asset is not supported on ".concat(chain));
9740
+ case 1:
9726
9741
  checkAmount = function checkAmount(fee) {
9727
9742
  if (assetInfo.amount <= fee) throw new AmountTooLowError();
9728
9743
  };
9729
9744
  checkAmount(MIN_FEE);
9730
9745
  if (!(destChain === undefined)) {
9731
- _context.n = 1;
9746
+ _context.n = 2;
9732
9747
  break;
9733
9748
  }
9734
9749
  throw new RoutingResolutionError('Could not determine destination chain for execute transfer');
9735
- case 1:
9750
+ case 2:
9736
9751
  internalOptions = {
9737
9752
  api: api,
9738
9753
  chain: chain,
@@ -9749,18 +9764,21 @@ var handleExecuteTransfer = /*#__PURE__*/function () {
9749
9764
  }; // We mint 1000 units of feeAsset and use 100
9750
9765
  FEE_ASSET_AMOUNT = 100;
9751
9766
  feeAssetAmount = feeAssetInfo ? parseUnits(FEE_ASSET_AMOUNT.toString(), feeAssetInfo.decimals) : MIN_FEE;
9767
+ resolvedFeeAssetInfo = getFeeAssetInfo(assetInfo, feeAssetInfo);
9768
+ hopFeeAmount = resolvedFeeAssetInfo ? feeAssetAmount : MIN_FEE;
9752
9769
  _t = createExecuteCall;
9753
9770
  _t2 = chain;
9754
- _context.n = 2;
9771
+ _context.n = 3;
9755
9772
  return createDirectExecuteXcm(_objectSpread2(_objectSpread2({}, internalOptions), {}, {
9756
9773
  fees: {
9757
9774
  originFee: feeAssetAmount,
9758
- reserveFee: MIN_FEE
9775
+ reserveFee: hopFeeAmount,
9776
+ destFee: hopFeeAmount
9759
9777
  }
9760
9778
  }));
9761
- case 2:
9779
+ case 3:
9762
9780
  call = _t(_t2, _context.v, MAX_WEIGHT);
9763
- _context.n = 3;
9781
+ _context.n = 4;
9764
9782
  return dryRunInternal({
9765
9783
  api: api,
9766
9784
  tx: api.deserializeExtrinsics(call),
@@ -9772,34 +9790,34 @@ var handleExecuteTransfer = /*#__PURE__*/function () {
9772
9790
  feeAsset: feeCurrency,
9773
9791
  useRootOrigin: true
9774
9792
  });
9775
- case 3:
9793
+ case 4:
9776
9794
  dryRunResult = _context.v;
9777
9795
  if (dryRunResult.origin.success) {
9778
- _context.n = 4;
9796
+ _context.n = 5;
9779
9797
  break;
9780
9798
  }
9781
9799
  throw new DryRunFailedError(_objectSpread2(_objectSpread2({}, dryRunResult.origin.dryRunError), {}, {
9782
9800
  chainKind: 'origin',
9783
9801
  chain: chain
9784
9802
  }));
9785
- case 4:
9786
- originFeeEstimate = dryRunResult.origin.fee;
9787
- originFee = padValueBy(originFeeEstimate, FEE_PADDING_PERCENTAGE$1);
9788
- reserveFeeEstimate = getReserveFeeFromHops(dryRunResult.hops);
9789
- reserveFee = padValueBy(reserveFeeEstimate, FEE_PADDING_PERCENTAGE$1);
9790
- checkAmount(reserveFee);
9791
- _context.n = 5;
9803
+ case 5:
9804
+ originFee = padValueBy(dryRunResult.origin.fee, FEE_PADDING_PERCENTAGE$1);
9805
+ reserveFee = padValueBy(getFeeFromResult((_dryRunResult$hops$at = dryRunResult.hops.at(0)) === null || _dryRunResult$hops$at === void 0 ? void 0 : _dryRunResult$hops$at.result), FEE_PADDING_PERCENTAGE$1);
9806
+ destFee = padValueBy(getFeeFromResult(dryRunResult.destination), FEE_PADDING_PERCENTAGE$1);
9807
+ if (!resolvedFeeAssetInfo) checkAmount(reserveFee);
9808
+ _context.n = 6;
9792
9809
  return createDirectExecuteXcm(_objectSpread2(_objectSpread2({}, internalOptions), {}, {
9793
9810
  fees: {
9794
9811
  originFee: originFee,
9795
- reserveFee: reserveFee
9812
+ reserveFee: reserveFee,
9813
+ destFee: destFee
9796
9814
  }
9797
9815
  }));
9798
- case 5:
9816
+ case 6:
9799
9817
  xcm = _context.v;
9800
- _context.n = 6;
9818
+ _context.n = 7;
9801
9819
  return api.getXcmWeight(xcm);
9802
- case 6:
9820
+ case 7:
9803
9821
  weight = _context.v;
9804
9822
  return _context.a(2, createExecuteCall(chain, xcm, weight));
9805
9823
  }
@@ -9979,12 +9997,13 @@ var isMultiHopSwap = function isMultiHopSwap(exchangeChain, assetFrom, assetTo)
9979
9997
  };
9980
9998
 
9981
9999
  var createExchangeInstructions = /*#__PURE__*/function () {
9982
- var _ref = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee(options, assetFrom, assetTo, hasSeparateFeeAsset) {
9983
- var api, chain, exchangeChain, assetInfoFrom, assetInfoTo, version, calculateMinAmountOut, _options$fees, originReserveFee, exchangeFee, nativeSymbol, needsMultiHop, nativeAsset, nativeAmountOut, assetNative;
10000
+ var _ref = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee(options, assetFrom, assetTo, separateFeeAssetInfo) {
10001
+ var api, chain, exchangeChain, assetInfoFrom, assetInfoTo, version, calculateMinAmountOut, _options$fees, originReserveFee, exchangeFee, hasSeparateFeeAsset, nativeSymbol, needsMultiHop, nativeAsset, nativeAmountOut, assetNative;
9984
10002
  return _regenerator().w(function (_context) {
9985
10003
  while (1) switch (_context.n) {
9986
10004
  case 0:
9987
10005
  api = options.api, chain = options.chain, exchangeChain = options.exchangeChain, assetInfoFrom = options.assetInfoFrom, assetInfoTo = options.assetInfoTo, version = options.version, calculateMinAmountOut = options.calculateMinAmountOut, _options$fees = options.fees, originReserveFee = _options$fees.originReserveFee, exchangeFee = _options$fees.exchangeFee;
10006
+ hasSeparateFeeAsset = separateFeeAssetInfo !== undefined;
9988
10007
  nativeSymbol = getNativeAssetSymbol(exchangeChain);
9989
10008
  needsMultiHop = isMultiHopSwap(exchangeChain, assetInfoFrom, assetInfoTo);
9990
10009
  nativeAsset = api.findAssetInfoOrThrow(exchangeChain, {
@@ -10003,7 +10022,7 @@ var createExchangeInstructions = /*#__PURE__*/function () {
10003
10022
  }]);
10004
10023
  case 1:
10005
10024
  _context.n = 2;
10006
- return calculateMinAmountOut(BigInt(assetInfoFrom.amount) - (chain ? originReserveFee + exchangeFee : 0n), nativeAsset);
10025
+ return calculateMinAmountOut(BigInt(assetInfoFrom.amount) - (chain && !hasSeparateFeeAsset ? originReserveFee + exchangeFee : 0n), nativeAsset);
10007
10026
  case 2:
10008
10027
  nativeAmountOut = _context.v;
10009
10028
  assetNative = createAsset(version, exchangeFee === 0n ? (nativeAmountOut + 1n) / 2n : nativeAmountOut, localizeLocation(exchangeChain, nativeAsset.location));
@@ -10011,11 +10030,13 @@ var createExchangeInstructions = /*#__PURE__*/function () {
10011
10030
  ExchangeAsset: {
10012
10031
  give: createAssetsFilter(assetFrom, version),
10013
10032
  want: [assetNative],
10014
- maximal: false
10033
+ maximal: hasSeparateFeeAsset
10015
10034
  }
10016
10035
  }, {
10017
10036
  ExchangeAsset: {
10018
- give: createAssetsFilter(assetNative, version),
10037
+ give: separateFeeAssetInfo && isAssetEqual(separateFeeAssetInfo, nativeAsset) ? {
10038
+ Definite: [assetNative]
10039
+ } : createAssetsFilter(assetNative, version),
10019
10040
  want: [assetTo],
10020
10041
  maximal: true
10021
10042
  }
@@ -10030,19 +10051,18 @@ var createExchangeInstructions = /*#__PURE__*/function () {
10030
10051
  var createSwapExecuteXcm = /*#__PURE__*/function () {
10031
10052
  var _ref2 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee2(options) {
10032
10053
  var _ref3, _ref4;
10033
- var api, chain, exchangeChain, destChain, assetInfoFrom, assetInfoTo, feeAssetInfo, _options$fees2, originFee, originReserveFee, destReserveFee, sender, recipient, version, paraIdTo, isEthereumDest, resolvedDestChain, assetFrom, amountOut, assetTo, assetToLocalizedToDest, ethFeeAssetInfo, ethBridgeFee, isMainAssetDot, nativeFeeAssetInfo, ahApi, _yield$getParaEthTran, _yield$getParaEthTran2, bridgeFee, executionFee, resolvedFeeAssetInfo, hasSeparateFeeAsset, _prepareCommonExecute, prefix, depositInstruction, exchangeInstructions, exchangeToDestXcm, ethAsset, messageId, snowbridgeInstructions, finalXcm, fullXcm;
10054
+ var api, chain, exchangeChain, destChain, assetInfoFrom, assetInfoTo, feeAssetInfo, _options$fees2, originFee, originReserveFee, exchangeFee, destReserveFee, destFee, sender, recipient, version, paraIdTo, isEthereumDest, resolvedDestChain, assetFrom, amountOut, assetTo, assetToLocalizedToDest, ethFeeAssetInfo, ethBridgeFee, nativeFeeAssetInfo, ahApi, _yield$getParaEthTran, _yield$getParaEthTran2, bridgeFee, executionFee, resolvedFeeAssetInfo, hasSeparateFeeAsset, createLegFees, feeAssetBudget, _prepareCommonExecute, prefix, depositInstruction, exchangeInstructions, exchangeToDestXcm, ethAsset, messageId, snowbridgeInstructions, finalXcm, fullXcm;
10034
10055
  return _regenerator().w(function (_context2) {
10035
10056
  while (1) switch (_context2.n) {
10036
10057
  case 0:
10037
- api = options.api, chain = options.chain, exchangeChain = options.exchangeChain, destChain = options.destChain, assetInfoFrom = options.assetInfoFrom, assetInfoTo = options.assetInfoTo, feeAssetInfo = options.feeAssetInfo, _options$fees2 = options.fees, originFee = _options$fees2.originFee, originReserveFee = _options$fees2.originReserveFee, destReserveFee = _options$fees2.destReserveFee, sender = options.sender, recipient = options.recipient, version = options.version, paraIdTo = options.paraIdTo;
10058
+ api = options.api, chain = options.chain, exchangeChain = options.exchangeChain, destChain = options.destChain, assetInfoFrom = options.assetInfoFrom, assetInfoTo = options.assetInfoTo, feeAssetInfo = options.feeAssetInfo, _options$fees2 = options.fees, originFee = _options$fees2.originFee, originReserveFee = _options$fees2.originReserveFee, exchangeFee = _options$fees2.exchangeFee, destReserveFee = _options$fees2.destReserveFee, destFee = _options$fees2.destFee, sender = options.sender, recipient = options.recipient, version = options.version, paraIdTo = options.paraIdTo;
10038
10059
  isEthereumDest = destChain !== undefined && isExternalChain(destChain); // For Ethereum destination, the actual hop target is AssetHub (bridge hub)
10039
10060
  resolvedDestChain = isEthereumDest ? "AssetHub".concat(getRelayChainOf(chain !== null && chain !== void 0 ? chain : exchangeChain)) : undefined;
10040
10061
  assetFrom = createAsset(version, assetInfoFrom.amount, localizeLocation(exchangeChain, assetInfoFrom.location));
10041
10062
  amountOut = assetInfoTo.amount;
10042
10063
  assetTo = createAsset(version, amountOut, localizeLocation(exchangeChain, assetInfoTo.location)); // For Ethereum, localize to AssetHub since that's where instructions execute
10043
10064
  assetToLocalizedToDest = createAsset(version, amountOut, localizeLocation((_ref3 = resolvedDestChain !== null && resolvedDestChain !== void 0 ? resolvedDestChain : destChain) !== null && _ref3 !== void 0 ? _ref3 : exchangeChain, assetInfoTo.location)); // For Ethereum destination, use DOT as feeAsset for bridge fees
10044
- ethBridgeFee = 0n; // Whether main asset IS DOT — no separate fee asset needed
10045
- isMainAssetDot = false;
10065
+ ethBridgeFee = 0n;
10046
10066
  if (!isEthereumDest) {
10047
10067
  _context2.n = 3;
10048
10068
  break;
@@ -10060,14 +10080,21 @@ var createSwapExecuteXcm = /*#__PURE__*/function () {
10060
10080
  bridgeFee = _yield$getParaEthTran2[0];
10061
10081
  executionFee = _yield$getParaEthTran2[1];
10062
10082
  ethBridgeFee = bridgeFee + executionFee;
10063
- isMainAssetDot = isAssetEqual(assetInfoFrom, nativeFeeAssetInfo);
10064
- if (!isMainAssetDot) {
10083
+ if (!isAssetEqual(assetInfoFrom, nativeFeeAssetInfo)) {
10065
10084
  ethFeeAssetInfo = nativeFeeAssetInfo;
10066
10085
  }
10067
10086
  case 3:
10068
10087
  // Ethereum fee asset takes precedence over user-provided feeAssetInfo
10069
- resolvedFeeAssetInfo = ethFeeAssetInfo !== null && ethFeeAssetInfo !== void 0 ? ethFeeAssetInfo : feeAssetInfo;
10070
- hasSeparateFeeAsset = isEthereumDest && !isMainAssetDot || !!feeAssetInfo;
10088
+ resolvedFeeAssetInfo = isEthereumDest ? ethFeeAssetInfo : getFeeAssetInfo(assetInfoFrom, feeAssetInfo);
10089
+ hasSeparateFeeAsset = resolvedFeeAssetInfo !== undefined;
10090
+ createLegFees = function createLegFees(reserveFee, destFee) {
10091
+ return {
10092
+ originFee: hasSeparateFeeAsset ? ethBridgeFee : 0n,
10093
+ reserveFee: ethFeeAssetInfo ? ethBridgeFee : reserveFee,
10094
+ destFee: isEthereumDest ? ethBridgeFee : destFee
10095
+ };
10096
+ };
10097
+ feeAssetBudget = ethFeeAssetInfo ? ethBridgeFee : originFee + originReserveFee + exchangeFee + destReserveFee + destFee;
10071
10098
  _prepareCommonExecute = prepareCommonExecuteXcm({
10072
10099
  api: api,
10073
10100
  chain: chain !== null && chain !== void 0 ? chain : exchangeChain,
@@ -10077,13 +10104,14 @@ var createSwapExecuteXcm = /*#__PURE__*/function () {
10077
10104
  useJitWithdraw: isEthereumDest,
10078
10105
  recipient: recipient,
10079
10106
  fees: {
10080
- originFee: hasSeparateFeeAsset ? ethBridgeFee || originFee : originFee,
10081
- reserveFee: originReserveFee
10107
+ originFee: hasSeparateFeeAsset ? feeAssetBudget : originFee,
10108
+ reserveFee: 0n,
10109
+ destFee: 0n
10082
10110
  },
10083
10111
  version: version
10084
10112
  }, assetToLocalizedToDest), prefix = _prepareCommonExecute.prefix, depositInstruction = _prepareCommonExecute.depositInstruction;
10085
10113
  _context2.n = 4;
10086
- return createExchangeInstructions(options, assetFrom, assetTo, isEthereumDest && hasSeparateFeeAsset);
10114
+ return createExchangeInstructions(options, assetFrom, assetTo, resolvedFeeAssetInfo);
10087
10115
  case 4:
10088
10116
  exchangeInstructions = _context2.v;
10089
10117
  if (!isEthereumDest) {
@@ -10111,13 +10139,9 @@ var createSwapExecuteXcm = /*#__PURE__*/function () {
10111
10139
  destChain: resolvedDestChain,
10112
10140
  assetInfo: assetInfoTo,
10113
10141
  feeAssetInfo: ethFeeAssetInfo,
10114
- useFeeAssetOnHops: hasSeparateFeeAsset,
10115
10142
  paraIdTo: getParaId(resolvedDestChain),
10116
10143
  version: version,
10117
- fees: {
10118
- originFee: hasSeparateFeeAsset ? ethBridgeFee : 0n,
10119
- reserveFee: destReserveFee
10120
- },
10144
+ fees: createLegFees(destReserveFee, destFee),
10121
10145
  suffixXcm: snowbridgeInstructions
10122
10146
  });
10123
10147
  _context2.n = 7;
@@ -10129,13 +10153,10 @@ var createSwapExecuteXcm = /*#__PURE__*/function () {
10129
10153
  chain: exchangeChain,
10130
10154
  destChain: destChain,
10131
10155
  assetInfo: assetInfoTo,
10156
+ feeAssetInfo: resolvedFeeAssetInfo,
10132
10157
  paraIdTo: paraIdTo,
10133
10158
  version: version,
10134
- // Deal with this after feeAsset is supported
10135
- fees: {
10136
- originFee: 0n,
10137
- reserveFee: destReserveFee
10138
- },
10159
+ fees: createLegFees(destReserveFee, destFee),
10139
10160
  suffixXcm: [depositInstruction]
10140
10161
  });
10141
10162
  } else {
@@ -10147,14 +10168,10 @@ var createSwapExecuteXcm = /*#__PURE__*/function () {
10147
10168
  chain: chain,
10148
10169
  destChain: exchangeChain,
10149
10170
  assetInfo: assetInfoFrom,
10150
- feeAssetInfo: ethFeeAssetInfo,
10151
- useFeeAssetOnHops: hasSeparateFeeAsset,
10171
+ feeAssetInfo: resolvedFeeAssetInfo,
10152
10172
  paraIdTo: getParaId(exchangeChain),
10153
10173
  version: version,
10154
- fees: {
10155
- originFee: hasSeparateFeeAsset ? ethBridgeFee : 0n,
10156
- reserveFee: originReserveFee
10157
- },
10174
+ fees: createLegFees(originReserveFee, exchangeFee),
10158
10175
  suffixXcm: [].concat(_toConsumableArray(exchangeInstructions), _toConsumableArray(exchangeToDestXcm))
10159
10176
  }) : [].concat(_toConsumableArray(exchangeInstructions), _toConsumableArray(exchangeToDestXcm));
10160
10177
  fullXcm = [].concat(_toConsumableArray(prefix), _toConsumableArray(finalXcm));
@@ -10220,12 +10237,14 @@ var findExchangeHopIndex = function findExchangeHopIndex(chain, dryRunResult, ex
10220
10237
  return index;
10221
10238
  };
10222
10239
  var extractFeesFromDryRun = function extractFeesFromDryRun(chain, exchangeChain, dryRunResult, exchangeHopIndex, destChain) {
10240
+ var _dryRunResult$destina;
10223
10241
  var requireHopsSuccess = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : false;
10224
10242
  var fees = {
10225
10243
  originFee: 0n,
10226
10244
  originReserveFee: 0n,
10227
10245
  exchangeFee: 0n,
10228
- destReserveFee: 0n
10246
+ destReserveFee: 0n,
10247
+ destFee: 0n
10229
10248
  };
10230
10249
  var hops = dryRunResult.hops;
10231
10250
  // Handle exchange fee
@@ -10305,6 +10324,9 @@ var extractFeesFromDryRun = function extractFeesFromDryRun(chain, exchangeChain,
10305
10324
  fees.destReserveFee = padValueBy(hopAfterExchange.result.fee, FEE_PADDING_PERCENTAGE);
10306
10325
  }
10307
10326
  }
10327
+ if (destChain && (_dryRunResult$destina = dryRunResult.destination) !== null && _dryRunResult$destina !== void 0 && _dryRunResult$destina.success) {
10328
+ fees.destFee = padValueBy(dryRunResult.destination.fee, FEE_PADDING_PERCENTAGE);
10329
+ }
10308
10330
  return fees;
10309
10331
  };
10310
10332
  var createXcmAndCall = /*#__PURE__*/function () {
@@ -10348,8 +10370,8 @@ var createXcmAndCall = /*#__PURE__*/function () {
10348
10370
  }();
10349
10371
  var handleSwapExecuteTransfer = /*#__PURE__*/function () {
10350
10372
  var _ref3 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee3(options) {
10351
- var _firstDryRunResult$dr;
10352
- var api, chain, exchangeChain, destChain, assetFrom, assetTo, currencyTo, feeAssetInfo, sender, recipient, calculateMinAmountOut, version, isEthereumDest, hasSeparateFeeAsset, internalOptions, dryRunParams, FEE_ASSET_AMOUNT, dummyOriginFee, fees, totalFeesPre, _yield$createXcmAndCa, initialCall, firstDryRunResult, exchangeHopIndex, extractedFees, totalFees, updatedAssetTo, amountAvailableForSwap, recalculatedMinAmountOut, _yield$createXcmAndCa2, finalCall;
10373
+ var _ref4, _firstDryRunResult$dr;
10374
+ var api, chain, exchangeChain, destChain, assetFrom, assetTo, currencyTo, feeAssetInfo, sender, recipient, calculateMinAmountOut, version, isEthereumDest, separateFeeAssetInfo, hasSeparateFeeAsset, internalOptions, dryRunParams, FEE_ASSET_AMOUNT, dummyFeeAssetAmount, dummyDestFee, fees, totalFeesPre, _yield$createXcmAndCa, initialCall, firstDryRunResult, exchangeHopIndex, extractedFees, totalFees, updatedAssetTo, amountAvailableForSwap, recalculatedMinAmountOut, _yield$createXcmAndCa2, finalCall;
10353
10375
  return _regenerator().w(function (_context3) {
10354
10376
  while (1) switch (_context3.n) {
10355
10377
  case 0:
@@ -10360,9 +10382,10 @@ var handleSwapExecuteTransfer = /*#__PURE__*/function () {
10360
10382
  case 1:
10361
10383
  validateAmount(assetFrom.amount, MIN_FEE);
10362
10384
  version = pickRouterCompatibleXcmVersion(api, chain, exchangeChain, destChain);
10363
- isEthereumDest = destChain !== undefined && isExternalChain(destChain); // When main asset is DOT and dest is Ethereum, fees come from the same asset
10385
+ isEthereumDest = destChain !== undefined && isExternalChain(destChain);
10386
+ separateFeeAssetInfo = isEthereumDest ? undefined : getFeeAssetInfo(assetFrom, feeAssetInfo); // When main asset is DOT and dest is Ethereum, fees come from the same asset
10364
10387
  // (no separate fee asset needed). Only skip fee validation when currencies differ.
10365
- hasSeparateFeeAsset = isEthereumDest && !isAssetEqual(assetFrom, api.findNativeAssetInfoOrThrow(getRelayChainOf(chain !== null && chain !== void 0 ? chain : exchangeChain)));
10388
+ hasSeparateFeeAsset = separateFeeAssetInfo !== undefined || isEthereumDest && !isAssetEqual(assetFrom, api.findNativeAssetInfoOrThrow(getRelayChainOf(chain !== null && chain !== void 0 ? chain : exchangeChain)));
10366
10389
  internalOptions = _objectSpread2(_objectSpread2({}, options), {}, {
10367
10390
  version: version,
10368
10391
  paraIdTo: getParaId(destChain !== null && destChain !== void 0 ? destChain : exchangeChain)
@@ -10389,12 +10412,14 @@ var handleSwapExecuteTransfer = /*#__PURE__*/function () {
10389
10412
  useRootOrigin: true
10390
10413
  };
10391
10414
  FEE_ASSET_AMOUNT = 100;
10392
- dummyOriginFee = feeAssetInfo ? parseUnits(FEE_ASSET_AMOUNT.toString(), feeAssetInfo.decimals) : 0n;
10415
+ dummyFeeAssetAmount = separateFeeAssetInfo ? parseUnits(FEE_ASSET_AMOUNT.toString(), separateFeeAssetInfo.decimals) : undefined;
10416
+ dummyDestFee = (_ref4 = separateFeeAssetInfo && getFeeAssetInfo(assetTo, separateFeeAssetInfo) && dummyFeeAssetAmount) !== null && _ref4 !== void 0 ? _ref4 : MIN_FEE;
10393
10417
  fees = {
10394
- originFee: dummyOriginFee,
10395
- originReserveFee: MIN_FEE,
10396
- exchangeFee: 0n,
10397
- destReserveFee: MIN_FEE
10418
+ originFee: dummyFeeAssetAmount !== null && dummyFeeAssetAmount !== void 0 ? dummyFeeAssetAmount : 0n,
10419
+ originReserveFee: dummyFeeAssetAmount !== null && dummyFeeAssetAmount !== void 0 ? dummyFeeAssetAmount : MIN_FEE,
10420
+ exchangeFee: dummyFeeAssetAmount !== null && dummyFeeAssetAmount !== void 0 ? dummyFeeAssetAmount : 0n,
10421
+ destReserveFee: dummyDestFee,
10422
+ destFee: dummyDestFee
10398
10423
  };
10399
10424
  totalFeesPre = calculateTotalFees(chain, fees);
10400
10425
  if (!hasSeparateFeeAsset) {
@@ -10419,14 +10444,20 @@ var handleSwapExecuteTransfer = /*#__PURE__*/function () {
10419
10444
  case 3:
10420
10445
  firstDryRunResult = _context3.v;
10421
10446
  if (!(((_firstDryRunResult$dr = firstDryRunResult.dryRunError) === null || _firstDryRunResult$dr === void 0 ? void 0 : _firstDryRunResult$dr.reason) === 'NotHoldingFees')) {
10447
+ _context3.n = 5;
10448
+ break;
10449
+ }
10450
+ if (!separateFeeAssetInfo) {
10422
10451
  _context3.n = 4;
10423
10452
  break;
10424
10453
  }
10425
- throw new AmountTooLowError("Asset amount is too low to cover the fees, please increase the amount.");
10454
+ throw new DryRunFailedError(firstDryRunResult.dryRunError);
10426
10455
  case 4:
10456
+ throw new AmountTooLowError("Asset amount is too low to cover the fees, please increase the amount.");
10457
+ case 5:
10427
10458
  exchangeHopIndex = findExchangeHopIndex(chain, firstDryRunResult, exchangeChain, destChain);
10428
10459
  extractedFees = extractFeesFromDryRun(chain, exchangeChain, firstDryRunResult, exchangeHopIndex, destChain, false); // Set originFee from dry run origin fee (padded), same as handleExecuteTransfer
10429
- extractedFees.originFee = feeAssetInfo && firstDryRunResult.origin.success ? padValueBy(firstDryRunResult.origin.fee, FEE_PADDING_PERCENTAGE) : 0n;
10460
+ extractedFees.originFee = separateFeeAssetInfo && firstDryRunResult.origin.success ? padValueBy(firstDryRunResult.origin.fee, FEE_PADDING_PERCENTAGE) : 0n;
10430
10461
  if (extractedFees.exchangeFee === 0n) {
10431
10462
  // We set the exchange fee to non-zero value to prevent creating dummy tx
10432
10463
  extractedFees.exchangeFee = MIN_FEE;
@@ -10437,26 +10468,26 @@ var handleSwapExecuteTransfer = /*#__PURE__*/function () {
10437
10468
  }
10438
10469
  updatedAssetTo = assetTo;
10439
10470
  if (!chain) {
10440
- _context3.n = 6;
10471
+ _context3.n = 7;
10441
10472
  break;
10442
10473
  }
10443
10474
  // When fees are paid from a separate asset (e.g. DOT for Ethereum),
10444
10475
  // the full main asset amount is available for the swap
10445
10476
  amountAvailableForSwap = hasSeparateFeeAsset ? assetFrom.amount : assetFrom.amount - totalFees;
10446
- _context3.n = 5;
10477
+ _context3.n = 6;
10447
10478
  return calculateMinAmountOut(amountAvailableForSwap);
10448
- case 5:
10479
+ case 6:
10449
10480
  recalculatedMinAmountOut = _context3.v;
10450
10481
  updatedAssetTo = _objectSpread2(_objectSpread2({}, assetTo), {}, {
10451
10482
  amount: recalculatedMinAmountOut
10452
10483
  });
10453
- case 6:
10454
- _context3.n = 7;
10484
+ case 7:
10485
+ _context3.n = 8;
10455
10486
  return createXcmAndCall(_objectSpread2(_objectSpread2({}, internalOptions), {}, {
10456
10487
  assetInfoTo: updatedAssetTo,
10457
10488
  fees: extractedFees
10458
10489
  }), firstDryRunResult.origin.success ? firstDryRunResult.origin.weight : undefined);
10459
- case 7:
10490
+ case 8:
10460
10491
  _yield$createXcmAndCa2 = _context3.v;
10461
10492
  finalCall = _yield$createXcmAndCa2.call;
10462
10493
  return _context3.a(2, api.deserializeExtrinsics(finalCall));
@@ -10786,7 +10817,7 @@ var AssetHubPolkadot = /*#__PURE__*/function (_SubstrateChain) {
10786
10817
  var nativeAsset = api.findNativeAssetInfoOrThrow(this.chain);
10787
10818
  var isNativeAsset = isAssetEqual(nativeAsset, assetInfo);
10788
10819
  var isNativeFeeAsset = isAssetEqual(nativeAsset, feeAssetInfo);
10789
- return !isNativeAsset || !isNativeFeeAsset;
10820
+ return (!isNativeAsset || !isNativeFeeAsset) && hasMatchingFeeAssetReserve(api, this.chain, assetInfo, feeAssetInfo);
10790
10821
  }
10791
10822
  }, {
10792
10823
  key: "transferPolkadotXCM",
@@ -11016,7 +11047,7 @@ var Hydration = /*#__PURE__*/function (_SubstrateChain) {
11016
11047
  var nativeAsset = api.findNativeAssetInfoOrThrow(this.chain);
11017
11048
  var isNativeAsset = isAssetEqual(nativeAsset, asset);
11018
11049
  var isNativeFeeAsset = isAssetEqual(nativeAsset, feeAsset);
11019
- return !isNativeAsset || !isNativeFeeAsset;
11050
+ return (!isNativeAsset || !isNativeFeeAsset) && hasMatchingFeeAssetReserve(api, this.chain, asset, feeAsset);
11020
11051
  }
11021
11052
  }, {
11022
11053
  key: "transferPolkadotXCM",
@@ -12627,6 +12658,10 @@ var DEFAULT_TTL_MS = 60000; // 1 minute
12627
12658
  var MAX_CLIENTS = 100;
12628
12659
  var EXTENSION_MS = 5 * 60000; // 5 minutes
12629
12660
  var MAX_U64 = (1n << 64n) - 1n;
12661
+ var MIN_WEIGHT = {
12662
+ proofSize: 1n,
12663
+ refTime: 1n
12664
+ };
12630
12665
  var MAX_WEIGHT = {
12631
12666
  proofSize: MAX_U64,
12632
12667
  refTime: MAX_U64
@@ -12882,39 +12917,98 @@ var pickOtherMintPallet = function pickOtherMintPallet(asset, pallets) {
12882
12917
  return pallets[0];
12883
12918
  };
12884
12919
 
12885
- var isHere = function isHere(loc) {
12886
- var _loc$interior;
12887
- return loc.interior === 'Here' || ((_loc$interior = loc.interior) === null || _loc$interior === void 0 ? void 0 : _loc$interior.Here) !== undefined;
12920
+ // Mirrors the runtime `Ord` of `Location` so that encoded `Assets` decode on chain
12921
+ var JUNCTION_ORDER = ['Parachain', 'AccountId32', 'AccountIndex64', 'AccountKey20', 'PalletInstance', 'GeneralIndex', 'GeneralKey', 'OnlyChild', 'Plurality', 'GlobalConsensus'];
12922
+ var NETWORK_ORDER = ['bygenesis', 'byfork', 'polkadot', 'kusama', 'westend', 'rococo', 'wococo', 'ethereum', 'bitcoincore', 'bitcoincash', 'polkadotbulletin'];
12923
+ var isRecord = function isRecord(value) {
12924
+ return _typeof(value) === 'object' && value !== null;
12925
+ };
12926
+ var toBigInt = function toBigInt(value) {
12927
+ if (typeof value === 'bigint') return value;
12928
+ if (typeof value === 'number') return BigInt(value);
12929
+ if (typeof value === 'string' && /^\d+$/.test(value)) return BigInt(value);
12930
+ return undefined;
12931
+ };
12932
+ var _compareValues = function compareValues(a, b) {
12933
+ if (a === b) return 0;
12934
+ if (a === null || a === undefined) return -1;
12935
+ if (b === null || b === undefined) return 1;
12936
+ var aNumber = toBigInt(a);
12937
+ var bNumber = toBigInt(b);
12938
+ if (aNumber !== undefined && bNumber !== undefined) {
12939
+ return aNumber < bNumber ? -1 : aNumber > bNumber ? 1 : 0;
12940
+ }
12941
+ if (typeof a === 'string' && typeof b === 'string') return a < b ? -1 : a > b ? 1 : 0;
12942
+ if (isRecord(a) && isRecord(b)) {
12943
+ for (var _i = 0, _Object$keys = Object.keys(a); _i < _Object$keys.length; _i++) {
12944
+ var key = _Object$keys[_i];
12945
+ var result = _compareValues(a[key], b[key]);
12946
+ if (result !== 0) return result;
12947
+ }
12948
+ }
12949
+ return 0;
12950
+ };
12951
+ var compareNetworks = function compareNetworks(a, b) {
12952
+ var variant = function variant(value) {
12953
+ return typeof value === 'string' ? [value, null] : isRecord(value) ? Object.entries(value)[0] : [];
12954
+ };
12955
+ var _variant = variant(a),
12956
+ _variant2 = _slicedToArray(_variant, 2),
12957
+ aName = _variant2[0],
12958
+ aValue = _variant2[1];
12959
+ var _variant3 = variant(b),
12960
+ _variant4 = _slicedToArray(_variant3, 2),
12961
+ bName = _variant4[0],
12962
+ bValue = _variant4[1];
12963
+ var order = NETWORK_ORDER.indexOf(String(aName).toLowerCase()) - NETWORK_ORDER.indexOf(String(bName).toLowerCase());
12964
+ return order !== 0 ? order : _compareValues(aValue, bValue);
12965
+ };
12966
+ var compareJunctions = function compareJunctions(a, b) {
12967
+ var _Object$entries$ = _slicedToArray(Object.entries(a)[0], 2),
12968
+ aType = _Object$entries$[0],
12969
+ aValue = _Object$entries$[1];
12970
+ var _Object$entries$2 = _slicedToArray(Object.entries(b)[0], 2),
12971
+ bType = _Object$entries$2[0],
12972
+ bValue = _Object$entries$2[1];
12973
+ var order = JUNCTION_ORDER.indexOf(aType) - JUNCTION_ORDER.indexOf(bType);
12974
+ if (order !== 0) return order;
12975
+ return aType === 'GlobalConsensus' ? compareNetworks(aValue, bValue) : _compareValues(aValue, bValue);
12976
+ };
12977
+ var getJunctions = function getJunctions(_ref) {
12978
+ var interior = _ref.interior;
12979
+ if (interior === 'Here') return [];
12980
+ var junctions = Object.values(interior).find(function (value) {
12981
+ return value !== null && value !== undefined;
12982
+ });
12983
+ if (junctions === undefined) return [];
12984
+ return Array.isArray(junctions) ? junctions : [junctions];
12985
+ };
12986
+ var compareLocationOrder = function compareLocationOrder(a, b) {
12987
+ var parents = Number(a.parents) - Number(b.parents);
12988
+ if (parents !== 0) return parents;
12989
+ var aJunctions = getJunctions(a);
12990
+ var bJunctions = getJunctions(b);
12991
+ if (aJunctions.length !== bJunctions.length) return aJunctions.length - bJunctions.length;
12992
+ var _iterator = _createForOfIteratorHelper(aJunctions.entries()),
12993
+ _step;
12994
+ try {
12995
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
12996
+ var _step$value = _slicedToArray(_step.value, 2),
12997
+ index = _step$value[0],
12998
+ junction = _step$value[1];
12999
+ var result = compareJunctions(junction, bJunctions[index]);
13000
+ if (result !== 0) return result;
13001
+ }
13002
+ } catch (err) {
13003
+ _iterator.e(err);
13004
+ } finally {
13005
+ _iterator.f();
13006
+ }
13007
+ return 0;
12888
13008
  };
12889
13009
  var sortAssets = function sortAssets(assets) {
12890
13010
  return assets.sort(function (a, b) {
12891
- var aLoc = extractAssetLocation(a);
12892
- var bLoc = extractAssetLocation(b);
12893
- // 1. Sort by parents first
12894
- if (aLoc.parents !== bLoc.parents) {
12895
- return Number(aLoc.parents) - Number(bLoc.parents);
12896
- }
12897
- // 2. If parents are equal, use priority function
12898
- var aIsHere = isHere(aLoc);
12899
- var bIsHere = isHere(bLoc);
12900
- var aHasGlobal = hasJunction(aLoc, 'GlobalConsensus');
12901
- var bHasGlobal = hasJunction(bLoc, 'GlobalConsensus');
12902
- var aGeneralIndex = getJunctionValue(aLoc, 'GeneralIndex');
12903
- var bGeneralIndex = getJunctionValue(bLoc, 'GeneralIndex');
12904
- var getPriority = function getPriority(isHere, hasGlobal) {
12905
- if (isHere) return 0;
12906
- if (hasGlobal) return 2;
12907
- return 1;
12908
- };
12909
- var aPriority = getPriority(aIsHere, aHasGlobal);
12910
- var bPriority = getPriority(bIsHere, bHasGlobal);
12911
- if (aPriority !== bPriority) return aPriority - bPriority;
12912
- if (aGeneralIndex === undefined && bGeneralIndex === undefined) return 0;
12913
- if (aGeneralIndex === undefined) return 1;
12914
- if (bGeneralIndex === undefined) return -1;
12915
- var aIndex = BigInt(aGeneralIndex);
12916
- var bIndex = BigInt(bGeneralIndex);
12917
- return aIndex < bIndex ? -1 : aIndex > bIndex ? 1 : 0;
13011
+ return compareLocationOrder(extractAssetLocation(a), extractAssetLocation(b));
12918
13012
  });
12919
13013
  };
12920
13014
 
@@ -12971,6 +13065,7 @@ var createSwapBuilder = function createSwapBuilder(options) {
12971
13065
  var from = options.from,
12972
13066
  to = options.to,
12973
13067
  currency = options.currency,
13068
+ feeAsset = options.feeAsset,
12974
13069
  _options$swapOptions = options.swapOptions,
12975
13070
  currencyTo = _options$swapOptions.currencyTo,
12976
13071
  evmSenderAddress = _options$swapOptions.evmSenderAddress,
@@ -12985,7 +13080,7 @@ var createSwapBuilder = function createSwapBuilder(options) {
12985
13080
  if (Array.isArray(currency)) {
12986
13081
  throw new UnsupportedOperationError('Swaps with multiple currencies are not supported.');
12987
13082
  }
12988
- var builder = SwapBuilder(api).from(from).exchange(exchange).to(to).currencyFrom(currency).currencyTo(currencyTo).amount(currency.amount).sender(sender).evmSenderAddress(evmSenderAddress).recipient(address).slippagePct((_slippage$toString = slippage === null || slippage === void 0 ? void 0 : slippage.toString()) !== null && _slippage$toString !== void 0 ? _slippage$toString : DEFAULT_SWAP_SLIPPAGE.toString());
13083
+ var builder = SwapBuilder(api).from(from).exchange(exchange).to(to).currencyFrom(currency).currencyTo(currencyTo).feeAsset(feeAsset).amount(currency.amount).sender(sender).evmSenderAddress(evmSenderAddress).recipient(address).slippagePct((_slippage$toString = slippage === null || slippage === void 0 ? void 0 : slippage.toString()) !== null && _slippage$toString !== void 0 ? _slippage$toString : DEFAULT_SWAP_SLIPPAGE.toString());
12989
13084
  if (onStatusChange) {
12990
13085
  builder = builder.onStatusChange(onStatusChange);
12991
13086
  }
@@ -13164,6 +13259,25 @@ var createChainClient = /*#__PURE__*/function () {
13164
13259
  };
13165
13260
  }();
13166
13261
 
13262
+ var createBridgedXcmPrefix = function createBridgedXcmPrefix(version, _ref) {
13263
+ var palletIndex = _ref.palletIndex,
13264
+ relay = _ref.relay,
13265
+ paraId = _ref.paraId;
13266
+ return [{
13267
+ DescendOrigin: createX1Payload(version, {
13268
+ PalletInstance: palletIndex
13269
+ })
13270
+ }, {
13271
+ UniversalOrigin: {
13272
+ GlobalConsensus: _defineProperty({}, relay.toLowerCase(), null)
13273
+ }
13274
+ }, {
13275
+ DescendOrigin: createX1Payload(version, {
13276
+ Parachain: paraId
13277
+ })
13278
+ }];
13279
+ };
13280
+
13167
13281
  var getErrorInstruction = function getErrorInstruction(message, index) {
13168
13282
  if (index === undefined || _typeof(message) !== 'object' || message === null) {
13169
13283
  return undefined;
@@ -13674,30 +13788,37 @@ var PolkadotApi = /*#__PURE__*/function () {
13674
13788
  case 0:
13675
13789
  clientTtlMs = _args.length > 1 && _args[1] !== undefined ? _args[1] : DEFAULT_TTL_MS;
13676
13790
  destination = _args.length > 2 ? _args[2] : undefined;
13677
- if (!(this._chain !== undefined || isExternalChain(chain))) {
13791
+ if (!(this._chain === chain || isExternalChain(chain))) {
13678
13792
  _context.n = 1;
13679
13793
  break;
13680
13794
  }
13681
13795
  return _context.a(2);
13682
13796
  case 1:
13797
+ if (!(this._chain !== undefined)) {
13798
+ _context.n = 2;
13799
+ break;
13800
+ }
13801
+ _context.n = 2;
13802
+ return this.disconnect();
13803
+ case 2:
13683
13804
  this._ttlMs = clientTtlMs;
13684
13805
  this._chain = chain;
13685
- _context.n = 2;
13806
+ _context.n = 3;
13686
13807
  return resolveChainApi(this._config, chain, function (wsUrl) {
13687
13808
  return _this.leaseClient(wsUrl, _this._ttlMs);
13688
13809
  }, this._customCtx);
13689
- case 2:
13810
+ case 3:
13690
13811
  this._api = _context.v;
13691
- _context.n = 3;
13812
+ _context.n = 4;
13692
13813
  return this.maybeHydrateCustomChain(chain);
13693
- case 3:
13814
+ case 4:
13694
13815
  if (!(typeof destination === 'string' && isCustomChain(destination))) {
13695
- _context.n = 4;
13816
+ _context.n = 5;
13696
13817
  break;
13697
13818
  }
13698
- _context.n = 4;
13819
+ _context.n = 5;
13699
13820
  return this.hydrateCustomChain(destination);
13700
- case 4:
13821
+ case 5:
13701
13822
  return _context.a(2);
13702
13823
  }
13703
13824
  }, _callee, this);
@@ -13712,6 +13833,11 @@ var PolkadotApi = /*#__PURE__*/function () {
13712
13833
  value: function setCustomCtx(ctx) {
13713
13834
  this._customCtx = ctx;
13714
13835
  }
13836
+ }, {
13837
+ key: "resetChain",
13838
+ value: function resetChain() {
13839
+ this._chain = undefined;
13840
+ }
13715
13841
  }, {
13716
13842
  key: "hydrateCustomChain",
13717
13843
  value: function () {
@@ -14026,4 +14152,4 @@ var createClientCache = function createClientCache(maxSize, pingClient, onEvicti
14026
14152
  };
14027
14153
  };
14028
14154
 
14029
- export { API_TYPES, AmountTooLowError, ApiNotInitializedError, BaseAssetsPallet, BatchMode, BatchValidationError, BridgeHaltedError, Builder, CustomChainConflictError, CustomChainInvalidError, DEFAULT_TTL_MS, DRY_RUN_CLIENT_TIMEOUT_MS, DryRunFailedError, ETH_MAINNET_CHAIN_ID, ETH_TESTNET_CHAIN_ID, EXCHANGE_CHAINS, EXTENSION_MS, ExtensionNotInstalledError, FeatureTemporarilyDisabledError, GeneralBuilder, InvalidAddressError, MAX_CLIENTS, MissingChainApiError, MissingParameterError, NoXCMSupportImplementedError, NumberFormatError, OverrideConflictError, PolkadotApi, PolkadotXcmError, PolkadotXcmExecutionError, ProviderUnavailableError, RELAY_LOCATION, RoutingResolutionError, RuntimeApiError, RuntimeApiUnavailableError, ScenarioNotSupportedError, SubmitTransactionError, TRANSACT_ORIGINS, TX_CLIENT_TIMEOUT_MS, TypeAndThenUnavailableError, UnableToComputeError, UnsupportedOperationError, ValidationError, XTokensError, abstractDecimals, addEthereumBridgeFees, addXcmVersionHeader, aggregateHopFees, applyDecimalAbstraction, assertAddressIsString, assertCurrencyCore, assertEvmAddress, assertExtensionInstalled, assertHasId, assertNotEvmTransfer, assertSender, assertSenderSource, assertSubstrateOrigin, assertSwapSupport, assertToIsString, blake2b256, blake2b512, buildCustomChainAssetsInfo, buildCustomChainConfig, buildDestInfo, buildDryRunError, buildErc20StorageMint, buildHopInfo, buildOriginInfo, calcPreviewMintAmount, compareAddresses, computeOverridenAmount, constructTypeAndThenCall, convertBuilderConfig, convertSs58, createAsset, createAssetId, createAssetsFilter, createBaseExecuteXcm, createBeneficiaryLocXTokens, createBeneficiaryLocation, createChainClient, createClientCache, createClientPoolHelpers, createCustomXcmOnDest, createDestination, createDirectExecuteXcm, createEthereumBridgeInstructions, createExecuteCall, createExecuteExchangeXcm, createSwapBuilder, createTransfer, createTransferOrSwap, createTransferOrSwapAll, createTxOverrideAmount, createTypeAndThenCall, createTypeThenAutoReserve, createVersionedAssets, createVersionedDestination, createX1Payload, deriveAccountId, dryRun, dryRunInternal, dryRunOrigin, encodeSs58, executeWithSwap, formatAssetIdToERC20, formatUnits, generateMessageId, getAssetBalanceInternal, getAssetReserveChain, getAssetReserveChainImpl, getBalance, getBalanceInternal, getBridgeStatus, getChain, getChainConfig, getChainConfigImpl, getChainLocation, getChainProviders, getChainProvidersImpl, getChainVersion, getDryRunError, getErrorInstruction, getEthErc20Balance, getEvmExtensionOrThrow, getEvmPrivateKeyHex, getEvmSnowbridgeExtensionOrThrow, getLocalTransferAmount, getMinTransferableAmount, getMinTransferableAmountInternal, getOriginXcmFee, getOriginXcmFeeInternal, getParaEthTransferFees, getParaId, getParaIdImpl, getRelayChainOf, getRelayChainOfImpl, getRelayChainSymbolOf, getSwapExtensionOrThrow, getTChain, getTSubstrateChain, getTransferInfo, getTransferableAmount, getTransferableAmountInternal, getXcmFee, getXcmFeeInternal, getXcmFeeOnce, handleExecuteTransfer, handleSwapExecuteTransfer, handleToAhTeleport, isConfig, isExchange, isNativeAssetTeleport, isSenderSigner, isViemSigner, keyFromWs, localizeLocation, localizeLocationImpl, maybeOverrideAsset, maybeOverrideAssets, normalizeAmount, normalizeCustomChains, normalizeExchange, overrideTxAmount, padFee, padValueBy, parseUnits, pickCompatibleXcmVersion, pickOtherMintPallet, pickRouterCompatibleXcmVersion, registerEvmExtension, registerEvmSnowbridgeExtension, registerSwapExtension, resolveAssetCount, resolveDestChain, resolveModuleError, resolveParaId, resolveTransferParams, reverseTransformLocation, selectXcmVersion, sortAssets, throwUnsupportedCurrency, traverseXcmHops, validateAddress, validateAssetSpecifiers, validateCurrency, validateDestination, validateDestinationAddress, validateTransact, verifyEdOnDestination, wrapTxBypass };
14155
+ export { API_TYPES, AmountTooLowError, ApiNotInitializedError, BaseAssetsPallet, BatchMode, BatchValidationError, BridgeHaltedError, Builder, CustomChainConflictError, CustomChainInvalidError, DEFAULT_TTL_MS, DRY_RUN_CLIENT_TIMEOUT_MS, DryRunFailedError, ETH_MAINNET_CHAIN_ID, ETH_TESTNET_CHAIN_ID, EXCHANGE_CHAINS, EXTENSION_MS, ExtensionNotInstalledError, FeatureTemporarilyDisabledError, GeneralBuilder, InvalidAddressError, MAX_CLIENTS, MissingChainApiError, MissingParameterError, NoXCMSupportImplementedError, NumberFormatError, OverrideConflictError, PolkadotApi, PolkadotXcmError, PolkadotXcmExecutionError, ProviderUnavailableError, RELAY_LOCATION, RoutingResolutionError, RuntimeApiError, RuntimeApiUnavailableError, ScenarioNotSupportedError, SubmitTransactionError, TRANSACT_ORIGINS, TX_CLIENT_TIMEOUT_MS, TypeAndThenUnavailableError, UnableToComputeError, UnsupportedOperationError, ValidationError, XTokensError, abstractDecimals, addEthereumBridgeFees, addXcmVersionHeader, aggregateHopFees, applyDecimalAbstraction, assertAddressIsString, assertCurrencyCore, assertEvmAddress, assertExtensionInstalled, assertHasId, assertNotEvmTransfer, assertSender, assertSenderSource, assertSubstrateOrigin, assertSwapSupport, assertToIsString, blake2b256, blake2b512, buildCustomChainAssetsInfo, buildCustomChainConfig, buildDestInfo, buildDryRunError, buildErc20StorageMint, buildHopInfo, buildOriginInfo, calcPreviewMintAmount, compareAddresses, compareLocationOrder, computeOverridenAmount, constructTypeAndThenCall, convertBuilderConfig, convertSs58, createAllCountedFilter, createAsset, createAssetId, createAssetsFilter, createBaseExecuteXcm, createBeneficiaryLocXTokens, createBeneficiaryLocation, createBridgedXcmPrefix, createChainClient, createClientCache, createClientPoolHelpers, createCustomXcmOnDest, createDestination, createDirectExecuteXcm, createEthereumBridgeInstructions, createExecuteCall, createExecuteExchangeXcm, createSwapBuilder, createTransfer, createTransferOrSwap, createTransferOrSwapAll, createTxOverrideAmount, createTypeAndThenCall, createTypeThenAutoReserve, createVersionedAssets, createVersionedDestination, createX1Payload, deriveAccountId, dryRun, dryRunInternal, dryRunOrigin, encodeSs58, executeWithSwap, formatAssetIdToERC20, formatUnits, generateMessageId, getAssetBalanceInternal, getAssetReserveChain, getAssetReserveChainImpl, getBalance, getBalanceInternal, getBridgeStatus, getChain, getChainConfig, getChainConfigImpl, getChainLocation, getChainProviders, getChainProvidersImpl, getChainVersion, getDryRunError, getErrorInstruction, getEthErc20Balance, getEvmExtensionOrThrow, getEvmPrivateKeyHex, getEvmSnowbridgeExtensionOrThrow, getLocalTransferAmount, getMinTransferableAmount, getMinTransferableAmountInternal, getOriginXcmFee, getOriginXcmFeeInternal, getParaEthTransferFees, getParaId, getParaIdImpl, getRelayChainOf, getRelayChainOfImpl, getRelayChainSymbolOf, getSwapExtensionOrThrow, getTChain, getTSubstrateChain, getTransferInfo, getTransferableAmount, getTransferableAmountInternal, getXcmFee, getXcmFeeInternal, getXcmFeeOnce, handleExecuteTransfer, handleSwapExecuteTransfer, handleToAhTeleport, isConfig, isExchange, isNativeAssetTeleport, isSenderSigner, isViemSigner, keyFromWs, localizeLocation, localizeLocationImpl, maybeOverrideAsset, maybeOverrideAssets, normalizeAmount, normalizeCustomChains, normalizeExchange, overrideTxAmount, padFee, padValueBy, parseUnits, pickCompatibleXcmVersion, pickOtherMintPallet, pickRouterCompatibleXcmVersion, registerEvmExtension, registerEvmSnowbridgeExtension, registerSwapExtension, resolveAssetCount, resolveDestChain, resolveModuleError, resolveParaId, resolveTransferParams, reverseTransformLocation, selectXcmVersion, sortAssets, throwUnsupportedCurrency, traverseXcmHops, validateAddress, validateAssetSpecifiers, validateCurrency, validateDestination, validateDestinationAddress, validateFeeAssetSupport, validateTransact, verifyEdOnDestination, wrapTxBypass };