@paraspell/sdk-core 14.3.3 → 14.3.5

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,13 +1,15 @@
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
+ import { keccak_256 } from '@noble/hashes/sha3.js';
12
+ import { bytesToHex, hexToBytes } from '@noble/hashes/utils.js';
11
13
 
12
14
  function _arrayLikeToArray(r, a) {
13
15
  (null == a || a > r.length) && (a = r.length);
@@ -2038,7 +2040,12 @@ var createBuyExecution = function createBuyExecution(asset, weight) {
2038
2040
  return [{
2039
2041
  BuyExecution: {
2040
2042
  fees: asset,
2041
- weight_limit: 'Unlimited'
2043
+ weight_limit: weight ? {
2044
+ Limited: {
2045
+ ref_time: weight.refTime,
2046
+ proof_size: weight.proofSize
2047
+ }
2048
+ } : 'Unlimited'
2042
2049
  }
2043
2050
  }];
2044
2051
  };
@@ -2140,65 +2147,6 @@ var createTransactInstructions = /*#__PURE__*/function () {
2140
2147
  };
2141
2148
  }();
2142
2149
 
2143
- var handleTransactUsingSend = /*#__PURE__*/function () {
2144
- var _ref2 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee(_ref) {
2145
- var api, version, chain, destination, destChain, recipient, paraIdTo, asset, transactOptions, dest, transactInstructions, message;
2146
- return _regenerator().w(function (_context) {
2147
- while (1) switch (_context.n) {
2148
- case 0:
2149
- 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;
2150
- dest = createDestination(api, version, chain, destination, paraIdTo);
2151
- if (transactOptions !== null && transactOptions !== void 0 && transactOptions.call) {
2152
- _context.n = 1;
2153
- break;
2154
- }
2155
- throw new UnsupportedOperationError('Cannot use handleTransactUsingSend without transactOptions.call defined');
2156
- case 1:
2157
- if (destChain) {
2158
- _context.n = 2;
2159
- break;
2160
- }
2161
- throw new UnsupportedOperationError('destChain must be provided when using handleTransactUsingSend');
2162
- case 2:
2163
- assertAddressIsString(recipient);
2164
- _context.n = 3;
2165
- return createTransactInstructions(api, transactOptions, version, destChain, recipient);
2166
- case 3:
2167
- transactInstructions = _context.v;
2168
- message = [{
2169
- WithdrawAsset: [asset]
2170
- }].concat(_toConsumableArray(createBuyExecution(asset)), _toConsumableArray(transactInstructions), [{
2171
- RefundSurplus: undefined
2172
- }, {
2173
- DepositAsset: {
2174
- assets: {
2175
- Wild: {
2176
- AllCounted: 1
2177
- }
2178
- },
2179
- beneficiary: createBeneficiaryLocation({
2180
- api: api,
2181
- address: recipient,
2182
- version: version
2183
- })
2184
- }
2185
- }]);
2186
- return _context.a(2, {
2187
- module: getXcmPallet(chain),
2188
- method: 'send',
2189
- params: {
2190
- dest: addXcmVersionHeader(dest, version),
2191
- message: addXcmVersionHeader(message, version)
2192
- }
2193
- });
2194
- }
2195
- }, _callee);
2196
- }));
2197
- return function handleTransactUsingSend(_x) {
2198
- return _ref2.apply(this, arguments);
2199
- };
2200
- }();
2201
-
2202
2150
  var BaseAssetsPallet = /*#__PURE__*/_createClass(function BaseAssetsPallet(palletName) {
2203
2151
  _classCallCheck(this, BaseAssetsPallet);
2204
2152
  this.palletName = palletName;
@@ -2427,9 +2375,30 @@ var CurrenciesPallet = /*#__PURE__*/function (_BaseAssetsPallet) {
2427
2375
  }
2428
2376
  }, {
2429
2377
  key: "getBalance",
2430
- value: function getBalance() {
2431
- throw new UnsupportedOperationError('No balance support.');
2432
- }
2378
+ value: function () {
2379
+ var _getBalance = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee(api, address, asset) {
2380
+ var account;
2381
+ return _regenerator().w(function (_context) {
2382
+ while (1) switch (_context.n) {
2383
+ case 0:
2384
+ assertHasId(asset);
2385
+ _context.n = 1;
2386
+ return api.queryRuntimeApi({
2387
+ module: 'CurrenciesApi',
2388
+ method: 'account',
2389
+ params: [Number(asset.assetId), address]
2390
+ });
2391
+ case 1:
2392
+ account = _context.v;
2393
+ return _context.a(2, (account === null || account === void 0 ? void 0 : account.free) !== undefined ? BigInt(account.free) : 0n);
2394
+ }
2395
+ }, _callee);
2396
+ }));
2397
+ function getBalance(_x, _x2, _x3) {
2398
+ return _getBalance.apply(this, arguments);
2399
+ }
2400
+ return getBalance;
2401
+ }()
2433
2402
  }]);
2434
2403
  }(BaseAssetsPallet);
2435
2404
 
@@ -2682,6 +2651,14 @@ var resolveParaId = function resolveParaId(paraId, destination, api) {
2682
2651
  return paraId !== undefined ? paraId : api.getParaId(destination);
2683
2652
  };
2684
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
+
2685
2662
  var resolveScenario = function resolveScenario(origin, destination) {
2686
2663
  if (isRelayChain(origin)) return 'RelayToPara';
2687
2664
  var isRelayDestination = !isTLocation(destination) && isRelayChain(destination);
@@ -2739,7 +2716,7 @@ var SubstrateChain = /*#__PURE__*/function (_Chain) {
2739
2716
  key: "transfer",
2740
2717
  value: function () {
2741
2718
  var _transfer = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee(transferOptions) {
2742
- 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;
2743
2720
  return _regenerator().w(function (_context) {
2744
2721
  while (1) switch (_context.n) {
2745
2722
  case 0:
@@ -2780,9 +2757,9 @@ var SubstrateChain = /*#__PURE__*/function (_Chain) {
2780
2757
  }
2781
2758
  throw new TypeAndThenUnavailableError('Relaychain assets require the type-and-then method which is not supported by this chain.');
2782
2759
  case 4:
2783
- 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;
2784
2761
  if (!(supportsPolkadotXCM(this) || useTypeAndThen)) {
2785
- _context.n = 13;
2762
+ _context.n = 14;
2786
2763
  break;
2787
2764
  }
2788
2765
  options = {
@@ -2833,44 +2810,52 @@ var SubstrateChain = /*#__PURE__*/function (_Chain) {
2833
2810
  isAHDest = !isTLocation(destination) && destination.includes('AssetHub'); // Handle common cases
2834
2811
  isExternalAsset = asset.location.parents === Parents.TWO;
2835
2812
  isEthDest = _typeof(destination) !== 'object' && isExternalChain(destination); // External asset - Any origin to any dest via AH - DestinationReserve - multiple instructions
2836
- isExternalAssetViaAh = isExternalAsset && !isAHOrigin && !isAHDest && !isEthDest && !feeAsset; // External asset - Any origin to AHP - DestinationReserve - one DepositAsset instruction
2837
- 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;
2838
2815
  if (!(isExternalAssetViaAh || isExternalAssetToAh || useTypeAndThen)) {
2839
- _context.n = 10;
2816
+ _context.n = 11;
2840
2817
  break;
2841
2818
  }
2842
2819
  if (!(useTypeAndThen && supportsPolkadotXCM(this) && !isSubBridge)) {
2843
- _context.n = 8;
2820
+ _context.n = 9;
2844
2821
  break;
2845
2822
  }
2846
2823
  _context.n = 8;
2847
2824
  return this.transferPolkadotXCM(options);
2848
2825
  case 8:
2849
- _context.n = 9;
2850
- 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);
2851
2832
  case 9:
2833
+ _context.n = 10;
2834
+ return createTypeAndThenCall(options);
2835
+ case 10:
2852
2836
  call = _context.v;
2853
2837
  return _context.a(2, api.deserializeExtrinsics(call));
2854
- case 10:
2838
+ case 11:
2855
2839
  if (!supportsPolkadotXCM(this)) {
2856
- _context.n = 12;
2840
+ _context.n = 13;
2857
2841
  break;
2858
2842
  }
2859
- if (!(this.shouldUseNativeAssetTeleport(transferOptions) && !this.shouldUseExecuteTransfer(options))) {
2860
- _context.n = 11;
2843
+ if (!(this.shouldUseNativeAssetTeleport(transferOptions) && !getFeeAssetInfo(asset, feeAsset) && !this.shouldUseExecuteTransfer(options))) {
2844
+ _context.n = 12;
2861
2845
  break;
2862
2846
  }
2863
2847
  return _context.a(2, transferPolkadotXcm(options, 'limited_teleport_assets', 'Unlimited'));
2864
- case 11:
2865
- return _context.a(2, this.transferPolkadotXCM(options));
2866
2848
  case 12:
2867
- _context.n = 14;
2868
- break;
2849
+ return _context.a(2, this.transferPolkadotXCM(options));
2869
2850
  case 13:
2851
+ _context.n = 15;
2852
+ break;
2853
+ case 14:
2870
2854
  if (!supportsXTokens(this)) {
2871
- _context.n = 14;
2855
+ _context.n = 15;
2872
2856
  break;
2873
2857
  }
2858
+ validateFeeAssetSupport(asset, feeAsset, overriddenAsset, 'XTokens');
2874
2859
  input = {
2875
2860
  api: api,
2876
2861
  asset: asset,
@@ -2885,9 +2870,9 @@ var SubstrateChain = /*#__PURE__*/function (_Chain) {
2885
2870
  method: method
2886
2871
  };
2887
2872
  return _context.a(2, this.transferXTokens(input));
2888
- case 14:
2889
- throw new NoXCMSupportImplementedError(this.chain);
2890
2873
  case 15:
2874
+ throw new NoXCMSupportImplementedError(this.chain);
2875
+ case 16:
2891
2876
  return _context.a(2);
2892
2877
  }
2893
2878
  }, _callee, this);
@@ -3287,15 +3272,19 @@ var resolveCurrency = function resolveCurrency(api, currency, resolvedFeeAsset,
3287
3272
  };
3288
3273
 
3289
3274
  var resolveFeeAsset = function resolveFeeAsset(api, feeAsset, origin, destination, currency) {
3290
- if (!Array.isArray(currency) && !origin.startsWith('Hydration') && origin !== 'AssetHubPolkadot') {
3291
- throw new ScenarioNotSupportedError("Fee asset is not supported on ".concat(origin));
3292
- }
3293
3275
  var dest = !isTLocation(destination) ? destination : null;
3294
3276
  var asset = api.findAssetInfo(origin, feeAsset, dest);
3295
3277
  if (!asset) {
3296
3278
  return throwUnsupportedCurrency(feeAsset, origin);
3297
3279
  }
3298
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
+ }
3299
3288
  return asset;
3300
3289
  }
3301
3290
  var feeElement = currency.find(function (item) {
@@ -3305,13 +3294,16 @@ var resolveFeeAsset = function resolveFeeAsset(api, feeAsset, origin, destinatio
3305
3294
  if (!feeElement) {
3306
3295
  throw new InvalidCurrencyError('Fee asset must be one of the provided assets');
3307
3296
  }
3297
+ if (currency.length > 2) {
3298
+ throw new UnsupportedOperationError('Sending more than one non-fee asset is not yet supported');
3299
+ }
3308
3300
  return _objectSpread2(_objectSpread2({}, asset), {}, {
3309
3301
  amount: abstractDecimals(feeElement.amount, asset.decimals, api)
3310
3302
  });
3311
3303
  };
3312
3304
 
3313
3305
  var resolveHopAsset = function resolveHopAsset(_ref) {
3314
- var _api$findAssetInfoOnD;
3306
+ var _api$findAssetInfoOnD2;
3315
3307
  var api = _ref.api,
3316
3308
  tx = _ref.tx,
3317
3309
  originChain = _ref.originChain,
@@ -3321,16 +3313,27 @@ var resolveHopAsset = function resolveHopAsset(_ref) {
3321
3313
  asset = _ref.asset,
3322
3314
  currentAsset = _ref.currentAsset,
3323
3315
  hasPassedExchange = _ref.hasPassedExchange,
3324
- currency = _ref.currency;
3325
- 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;
3326
3320
  var useRelayAssetAsFee = typeof destination === 'string' && isExternalChain(destination) || isRelayAssetIncluded;
3327
3321
  if (useRelayAssetAsFee) {
3328
- 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;
3329
3332
  }
3330
3333
  if (hasPassedExchange && swapConfig && currentChain !== swapConfig.exchangeChain) {
3331
3334
  return api.findAssetOnDestOrThrow(swapConfig.exchangeChain, currentChain, swapConfig.currencyTo);
3332
3335
  }
3333
- 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;
3334
3337
  };
3335
3338
 
3336
3339
  var getEthereumJunction = function getEthereumJunction(api, chain) {
@@ -3443,6 +3446,13 @@ var resolveOverriddenAsset = function resolveOverriddenAsset(options, isBridge,
3443
3446
  return undefined;
3444
3447
  };
3445
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
+
3446
3456
  var validateCurrency = function validateCurrency(currency, feeAsset) {
3447
3457
  if (Array.isArray(currency)) {
3448
3458
  if (currency.length === 0) {
@@ -3456,6 +3466,11 @@ var validateCurrency = function validateCurrency(currency, feeAsset) {
3456
3466
  }
3457
3467
  }
3458
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
+ };
3459
3474
  var validateDestination = function validateDestination(origin, destination, api) {
3460
3475
  if (isRelayChain(origin) && !isTLocation(destination) && isRelayChain(destination) && origin !== destination) {
3461
3476
  throw new ScenarioNotSupportedError('Direct relay chain to relay chain transfers are not supported. Please use Polkadot <-> Kusama bridge through AssetHub.');
@@ -3687,354 +3702,34 @@ var getMythosOriginFee = /*#__PURE__*/function () {
3687
3702
  };
3688
3703
  }();
3689
3704
 
3690
- var createX1Payload = function createX1Payload(version, junction) {
3691
- return version === Version.V3 ? {
3692
- X1: junction
3693
- } : {
3694
- X1: [junction]
3695
- };
3705
+ var evmExtension;
3706
+ var registerEvmExtension = function registerEvmExtension(extension) {
3707
+ evmExtension = extension;
3696
3708
  };
3697
-
3698
- var createAccountPayload = function createAccountPayload(api, address) {
3699
- return isAddress(address) ? {
3700
- AccountKey20: {
3701
- key: address
3702
- }
3703
- } : {
3704
- AccountId32: {
3705
- id: api.accountToHex(address)
3706
- }
3707
- };
3709
+ var getEvmExtensionOrThrow = function getEvmExtensionOrThrow() {
3710
+ assertExtensionInstalled(evmExtension, 'EVM', '@paraspell/evm', 'using an EVM origin');
3711
+ return evmExtension;
3708
3712
  };
3709
- var createBeneficiaryLocXTokens = function createBeneficiaryLocXTokens(_ref) {
3710
- var api = _ref.api,
3711
- recipient = _ref.recipient,
3712
- origin = _ref.origin,
3713
- destination = _ref.destination,
3714
- version = _ref.version,
3715
- paraId = _ref.paraId;
3716
- if (isTLocation(recipient)) {
3717
- return recipient;
3718
- }
3719
- var scenario = resolveScenario(origin, destination);
3720
- var accountPayload = createAccountPayload(api, recipient);
3721
- if (scenario === 'ParaToRelay') {
3722
- return {
3723
- parents: Parents.ONE,
3724
- interior: createX1Payload(version, {
3725
- AccountId32: {
3726
- id: api.accountToHex(recipient)
3727
- }
3728
- })
3729
- };
3730
- } else if (scenario === 'ParaToPara') {
3731
- return {
3732
- parents: Parents.ONE,
3733
- interior: {
3734
- X2: [{
3735
- Parachain: paraId
3736
- }, accountPayload]
3737
- }
3738
- };
3739
- }
3740
- return {
3741
- parents: Parents.ZERO,
3742
- interior: createX1Payload(version, accountPayload)
3743
- };
3713
+
3714
+ var evmSnowbridgeExtension;
3715
+ var registerEvmSnowbridgeExtension = function registerEvmSnowbridgeExtension(extension) {
3716
+ evmSnowbridgeExtension = extension;
3744
3717
  };
3745
- var createBeneficiaryLocation = function createBeneficiaryLocation(_ref2) {
3746
- var api = _ref2.api,
3747
- address = _ref2.address,
3748
- version = _ref2.version;
3749
- if (isTLocation(address)) return address;
3750
- var accountPayload = createAccountPayload(api, address);
3751
- return {
3752
- parents: Parents.ZERO,
3753
- interior: createX1Payload(version, accountPayload)
3754
- };
3718
+ var getEvmSnowbridgeExtensionOrThrow = function getEvmSnowbridgeExtensionOrThrow() {
3719
+ assertExtensionInstalled(evmSnowbridgeExtension, 'EVM Snowbridge', '@paraspell/evm-snowbridge', 'using Ethereum as an origin');
3720
+ return evmSnowbridgeExtension;
3755
3721
  };
3756
3722
 
3757
- var createDestination = function createDestination(api, version, origin, destination, chainId, junction, parents) {
3758
- var isLocDestination = isTLocation(destination);
3759
- var isSubBridge = !isLocDestination && !isExternalChain(destination) && isSubstrateBridge(origin, destination);
3760
- if (isSubBridge) {
3761
- return {
3762
- parents: Parents.TWO,
3763
- interior: {
3764
- X2: [{
3765
- GlobalConsensus: api.getRelayChainOf(destination)
3766
- }, {
3767
- Parachain: chainId
3768
- }]
3769
- }
3770
- };
3771
- }
3772
- var isExternalDestination = !isLocDestination && isExternalChain(destination);
3773
- if (isExternalDestination) {
3774
- return {
3775
- parents: Parents.TWO,
3776
- interior: {
3777
- X1: [getEthereumJunction(api, origin)]
3778
- }
3779
- };
3780
- }
3781
- var scenario = resolveScenario(origin, destination);
3782
- var parentsResolved = parents !== null && parents !== void 0 ? parents : scenario === 'RelayToPara' ? Parents.ZERO : Parents.ONE;
3783
- var interior = scenario === 'ParaToRelay' ? 'Here' : createX1Payload(version, junction !== null && junction !== void 0 ? junction : {
3784
- Parachain: chainId
3785
- });
3786
- return isLocDestination ? destination : {
3787
- parents: parentsResolved,
3788
- interior: interior
3789
- };
3723
+ var swapExtension;
3724
+ var registerSwapExtension = function registerSwapExtension(extension) {
3725
+ swapExtension = extension;
3790
3726
  };
3791
- var createVersionedDestination = function createVersionedDestination(api, version, origin, destination, chainId, junction, parents) {
3792
- var plainDestination = createDestination(api, version, origin, destination, chainId, junction, parents);
3793
- return addXcmVersionHeader(plainDestination, version);
3727
+ var getSwapExtensionOrThrow = function getSwapExtensionOrThrow() {
3728
+ assertExtensionInstalled(swapExtension, 'swap', '@paraspell/swap', 'using swap features');
3729
+ return swapExtension;
3794
3730
  };
3795
3731
 
3796
- var getChainLocation = function getChainLocation(chain, destChain, customCtx) {
3797
- var fromRelay = isRelayChain(chain);
3798
- var toRelay = isRelayChain(destChain);
3799
- var parents = fromRelay ? Parents.ZERO : Parents.ONE;
3800
- var interior = toRelay ? 'Here' : {
3801
- X1: [{
3802
- Parachain: getParaIdImpl(destChain, customCtx)
3803
- }]
3804
- };
3805
- return {
3806
- parents: parents,
3807
- interior: interior
3808
- };
3809
- };
3810
-
3811
- /**
3812
- * This function localizes a location by removing the `Parachain` junction
3813
- * if it exists. The `parents` field is set to `0` either if a `Parachain` was removed
3814
- * or if the resulting interior is `'Here'` and the chain is a relay chain.
3815
- *
3816
- * @param chain - The current chain
3817
- * @param location - The location to localize
3818
- * @returns The localized location
3819
- */
3820
- var localizeLocationInner = function localizeLocationInner(chain, location, origin, resolveRelay, resolveParaId) {
3821
- var _Object$keys$;
3822
- var targetRelay = isExternalChain(chain) ? undefined : resolveRelay(chain).toLowerCase();
3823
- var originRelay = origin && !isExternalChain(origin) ? resolveRelay(origin).toLowerCase() : undefined;
3824
- var locationConsensus = getJunctionValue(location, 'GlobalConsensus');
3825
- var locationRelay = locationConsensus ? (_Object$keys$ = Object.keys(locationConsensus)[0]) === null || _Object$keys$ === void 0 ? void 0 : _Object$keys$.toLowerCase() : undefined;
3826
- var ecosystemDiffers = targetRelay && originRelay && originRelay !== targetRelay;
3827
- var junctions = location.interior === 'Here' ? [] : flattenJunctions(location.interior);
3828
- var junctionCount = junctions.length;
3829
- var isLocationOnTargetRelay = targetRelay !== undefined && locationRelay === targetRelay;
3830
- // Check if target is an external chain and location's GlobalConsensus matches it
3831
- var isLocationOnTargetExternal = isExternalChain(chain) && locationRelay === chain.toLowerCase();
3832
- var isConsensusAnchored = junctions.findIndex(function (junction) {
3833
- return 'GlobalConsensus' in junction;
3834
- }) === 0;
3835
- if (locationRelay && targetRelay && locationRelay !== targetRelay && (!origin || !ecosystemDiffers && isConsensusAnchored)) {
3836
- return location;
3837
- }
3838
- if (origin && ecosystemDiffers && location.parents === Parents.TWO && originRelay !== undefined && targetRelay !== undefined && deepEqual(getJunctionValue(location, 'GlobalConsensus'), _defineProperty({}, targetRelay, null)) && junctionCount === 1) {
3839
- return RELAY_LOCATION;
3840
- }
3841
- var newInterior = location.interior;
3842
- var parachainRemoved = false;
3843
- if (location.interior !== 'Here') {
3844
- var paraId = resolveParaId(chain);
3845
- var filteredJunctions = junctions.filter(function (junction) {
3846
- if ('GlobalConsensus' in junction && (isLocationOnTargetRelay || isLocationOnTargetExternal)) {
3847
- return false;
3848
- }
3849
- if ('Parachain' in junction && (!ecosystemDiffers || isLocationOnTargetRelay)) {
3850
- var paraJunctionId = getJunctionValue(location, 'Parachain');
3851
- if (paraJunctionId === paraId) {
3852
- parachainRemoved = true;
3853
- return false;
3854
- }
3855
- }
3856
- return true;
3857
- });
3858
- if (filteredJunctions.length === 0) {
3859
- newInterior = 'Here';
3860
- } else {
3861
- newInterior = _defineProperty({}, "X".concat(filteredJunctions.length), filteredJunctions);
3862
- }
3863
- }
3864
- var isOriginRelayHere = deepEqual(location, RELAY_LOCATION);
3865
- var hasGlobalConsensus = hasJunction(location, 'GlobalConsensus');
3866
- if (origin && isExternalChain(chain) && originRelay !== undefined && isOriginRelayHere && !hasGlobalConsensus) {
3867
- return {
3868
- parents: Parents.ONE,
3869
- interior: {
3870
- X1: [{
3871
- GlobalConsensus: _defineProperty({}, originRelay, null)
3872
- }]
3873
- }
3874
- };
3875
- }
3876
- if (isExternalChain(chain) && location.parents === Parents.TWO && RELAYCHAINS.some(function (relay) {
3877
- return deepEqual(getJunctionValue(location, 'GlobalConsensus'), _defineProperty({}, relay.toLowerCase(), null));
3878
- })) {
3879
- return _objectSpread2(_objectSpread2({}, location), {}, {
3880
- parents: Parents.ONE
3881
- });
3882
- }
3883
- if (origin && ecosystemDiffers && isOriginRelayHere && !hasGlobalConsensus && originRelay !== undefined) {
3884
- return {
3885
- parents: Parents.TWO,
3886
- interior: {
3887
- X2: [{
3888
- GlobalConsensus: _defineProperty({}, originRelay, null)
3889
- }, {
3890
- Parachain: resolveParaId(origin)
3891
- }]
3892
- }
3893
- };
3894
- }
3895
- if (origin && ecosystemDiffers && newInterior !== 'Here' && !hasGlobalConsensus && originRelay !== undefined) {
3896
- var _junctions = flattenJunctions(newInterior);
3897
- var updatedJunctions = [{
3898
- GlobalConsensus: _defineProperty({}, originRelay, null)
3899
- }].concat(_toConsumableArray(_junctions));
3900
- return {
3901
- parents: Parents.TWO,
3902
- interior: _defineProperty({}, "X".concat(updatedJunctions.length), updatedJunctions)
3903
- };
3904
- }
3905
- var shouldSetParentsToZero = parachainRemoved || newInterior === 'Here' && isRelayChain(chain) || isLocationOnTargetExternal;
3906
- return {
3907
- parents: shouldSetParentsToZero ? Parents.ZERO : location.parents,
3908
- interior: newInterior
3909
- };
3910
- };
3911
- var localizeLocation = function localizeLocation(chain, location, origin) {
3912
- return localizeLocationInner(chain, location, origin, function (c) {
3913
- return getRelayChainOf(c);
3914
- }, function (c) {
3915
- return getParaId(c);
3916
- });
3917
- };
3918
- var localizeLocationImpl = function localizeLocationImpl(api, chain, location, origin) {
3919
- return localizeLocationInner(chain, location, origin, function (c) {
3920
- return getRelayChainOfImpl(api, c);
3921
- }, function (c) {
3922
- return getParaIdImpl(c, api._customCtx);
3923
- });
3924
- };
3925
-
3926
- var reverseTransformLocation = function reverseTransformLocation(location) {
3927
- var parachainJunction = {
3928
- Parachain: 1000
3929
- };
3930
- var alreadyHasP1000 = location.interior !== 'Here' && Object.values(location.interior).flat().some(function (j) {
3931
- return _typeof(j) === 'object' && j !== null && 'Parachain' in j && j.Parachain === 1000;
3932
- });
3933
- if (alreadyHasP1000) {
3934
- return _objectSpread2(_objectSpread2({}, location), {}, {
3935
- parents: Parents.ONE
3936
- });
3937
- }
3938
- var existingJunctions = location.interior === 'Here' ? [] // no other junctions
3939
- : Object.values(location.interior).flat();
3940
- var allJunctions = [parachainJunction].concat(_toConsumableArray(existingJunctions));
3941
- return _objectSpread2(_objectSpread2({}, location), {}, {
3942
- parents: Parents.ONE,
3943
- interior: _defineProperty({}, "X".concat(allJunctions.length), allJunctions)
3944
- });
3945
- };
3946
-
3947
- var EMPTY_TOPIC = "0x".concat('00'.repeat(32));
3948
- var getBridgeDestFee = /*#__PURE__*/function () {
3949
- var _ref = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee(api, destApi, origin, destination, assetInfo, feeAssetInfo, hasSystemFeeAsset, recipient, version) {
3950
- var systemAsset, transferredAsset, assets, destIsReserve, feeAssetLocation, buyExecution, depositAsset, feesSplitFromAssets, prologue, xcm;
3951
- return _regenerator().w(function (_context) {
3952
- while (1) switch (_context.n) {
3953
- case 0:
3954
- systemAsset = createAsset(version, MIN_AMOUNT, RELAY_LOCATION);
3955
- transferredAsset = createAsset(version, assetInfo.amount, normalizeLocation(api.localizeLocation(origin, assetInfo.location), version));
3956
- assets = hasSystemFeeAsset ? sortAssets([systemAsset, transferredAsset]) : [transferredAsset];
3957
- destIsReserve = hasSystemFeeAsset ? destination === 'AssetHubPolkadot' : deepEqual(getJunctionValue(assetInfo.location, 'GlobalConsensus'), _defineProperty({}, getRelayChainOf(destination).toLowerCase(), null));
3958
- feeAssetLocation = hasSystemFeeAsset ? RELAY_LOCATION : assetInfo.location;
3959
- buyExecution = {
3960
- BuyExecution: {
3961
- fees: createAsset(version, MIN_AMOUNT, api.localizeLocation(destination, feeAssetLocation, origin)),
3962
- weight_limit: 'Unlimited'
3963
- }
3964
- };
3965
- depositAsset = {
3966
- DepositAsset: {
3967
- assets: {
3968
- Wild: hasSystemFeeAsset ? {
3969
- AllOf: {
3970
- id: api.localizeLocation(destination, assetInfo.location, origin),
3971
- fun: 'Fungible'
3972
- }
3973
- } : {
3974
- AllCounted: 1
3975
- }
3976
- },
3977
- beneficiary: createBeneficiaryLocation({
3978
- api: destApi,
3979
- address: recipient,
3980
- version: version
3981
- })
3982
- }
3983
- };
3984
- feesSplitFromAssets = destIsReserve && hasSystemFeeAsset;
3985
- prologue = feesSplitFromAssets ? [{
3986
- ReserveAssetDeposited: [systemAsset]
3987
- }, buyExecution, {
3988
- WithdrawAsset: [transferredAsset]
3989
- }, {
3990
- ClearOrigin: null
3991
- }] : [destIsReserve ? {
3992
- WithdrawAsset: assets
3993
- } : {
3994
- ReserveAssetDeposited: assets
3995
- }, {
3996
- ClearOrigin: null
3997
- }, buyExecution];
3998
- xcm = [].concat(prologue, [buyExecution, depositAsset, {
3999
- SetTopic: EMPTY_TOPIC
4000
- }]);
4001
- return _context.a(2, destApi.getXcmPaymentApiFee(destination, addXcmVersionHeader(xcm, version), [], feeAssetInfo, version, true));
4002
- }
4003
- }, _callee);
4004
- }));
4005
- return function getBridgeDestFee(_x, _x2, _x3, _x4, _x5, _x6, _x7, _x8, _x9) {
4006
- return _ref.apply(this, arguments);
4007
- };
4008
- }();
4009
-
4010
- var evmExtension;
4011
- var registerEvmExtension = function registerEvmExtension(extension) {
4012
- evmExtension = extension;
4013
- };
4014
- var getEvmExtensionOrThrow = function getEvmExtensionOrThrow() {
4015
- assertExtensionInstalled(evmExtension, 'EVM', '@paraspell/evm', 'using an EVM origin');
4016
- return evmExtension;
4017
- };
4018
-
4019
- var evmSnowbridgeExtension;
4020
- var registerEvmSnowbridgeExtension = function registerEvmSnowbridgeExtension(extension) {
4021
- evmSnowbridgeExtension = extension;
4022
- };
4023
- var getEvmSnowbridgeExtensionOrThrow = function getEvmSnowbridgeExtensionOrThrow() {
4024
- assertExtensionInstalled(evmSnowbridgeExtension, 'EVM Snowbridge', '@paraspell/evm-snowbridge', 'using Ethereum as an origin');
4025
- return evmSnowbridgeExtension;
4026
- };
4027
-
4028
- var swapExtension;
4029
- var registerSwapExtension = function registerSwapExtension(extension) {
4030
- swapExtension = extension;
4031
- };
4032
- var getSwapExtensionOrThrow = function getSwapExtensionOrThrow() {
4033
- assertExtensionInstalled(swapExtension, 'swap', '@paraspell/swap', 'using swap features');
4034
- return swapExtension;
4035
- };
4036
-
4037
- var API_TYPES = ['PAPI', 'PJS', 'DEDOT'];
3732
+ var API_TYPES = ['PAPI', 'PJS', 'DEDOT'];
4038
3733
 
4039
3734
  /**
4040
3735
  * The options for the batch builder.
@@ -6000,9 +5695,34 @@ var getParaEthTransferFees = /*#__PURE__*/function () {
6000
5695
  };
6001
5696
  }();
6002
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
+ };
6003
5723
  var traverseXcmHops = /*#__PURE__*/function () {
6004
5724
  var _ref = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee(config) {
6005
- 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;
6006
5726
  return _regenerator().w(function (_context) {
6007
5727
  while (1) switch (_context.p = _context.n) {
6008
5728
  case 0:
@@ -6018,7 +5738,7 @@ var traverseXcmHops = /*#__PURE__*/function () {
6018
5738
  _context.n = 10;
6019
5739
  break;
6020
5740
  }
6021
- nextChain = getTSubstrateChain(nextParaId, api.getRelayChainOf(origin));
5741
+ nextChain = getTSubstrateChain(nextParaId, api.getRelayChainOf(currentOrigin));
6022
5742
  if (nextChain) {
6023
5743
  _context.n = 2;
6024
5744
  break;
@@ -6066,10 +5786,12 @@ var traverseXcmHops = /*#__PURE__*/function () {
6066
5786
  hasPassedExchange = true;
6067
5787
  currentAsset = api.findAssetOnDestOrThrow(swapConfig.exchangeChain, nextChain, swapConfig.currencyTo);
6068
5788
  }
6069
- _extractNextHopData = extractNextHopData(hopResult), newXcms = _extractNextHopData.forwardedXcms, destParaId = _extractNextHopData.destParaId;
6070
- forwardedXcms = newXcms;
6071
- nextParaId = destParaId;
6072
- 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;
6073
5795
  case 7:
6074
5796
  _context.p = 7;
6075
5797
  _context.n = 8;
@@ -6128,18 +5850,17 @@ var addEthereumBridgeFees = /*#__PURE__*/function () {
6128
5850
  }();
6129
5851
 
6130
5852
  var dryRunInternal = /*#__PURE__*/function () {
6131
- var _ref = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee3(options) {
6132
- var _traversalResult$dest;
6133
- 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;
6134
- return _regenerator().w(function (_context3) {
6135
- 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) {
6136
5857
  case 0:
6137
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;
6138
5859
  resolvedFeeAsset = feeAsset ? resolveFeeAsset(api, feeAsset, origin, destination, currency) : undefined;
6139
5860
  _resolveCurrency = resolveCurrency(api, currency, resolvedFeeAsset, origin, destination), assets = _resolveCurrency.assets, asset = _resolveCurrency.asset;
6140
5861
  amount = asset.amount;
6141
5862
  resolvedVersion = pickCompatibleXcmVersion(api, origin, destination, version);
6142
- _context3.n = 1;
5863
+ _context2.n = 1;
6143
5864
  return api.getDryRunCall({
6144
5865
  tx: tx,
6145
5866
  chain: origin,
@@ -6156,12 +5877,12 @@ var dryRunInternal = /*#__PURE__*/function () {
6156
5877
  useRootOrigin: useRootOrigin || !!bypassOptions
6157
5878
  });
6158
5879
  case 1:
6159
- originDryRun = _context3.v;
5880
+ originDryRun = _context2.v;
6160
5881
  if (originDryRun.success) {
6161
- _context3.n = 2;
5882
+ _context2.n = 2;
6162
5883
  break;
6163
5884
  }
6164
- return _context3.a(2, {
5885
+ return _context2.a(2, {
6165
5886
  success: false,
6166
5887
  dryRunError: _objectSpread2({
6167
5888
  chainKind: 'origin',
@@ -6173,27 +5894,27 @@ var dryRunInternal = /*#__PURE__*/function () {
6173
5894
  case 2:
6174
5895
  isMythosToEthereum = origin === 'Mythos' && destination === 'Ethereum';
6175
5896
  if (!isMythosToEthereum) {
6176
- _context3.n = 4;
5897
+ _context2.n = 4;
6177
5898
  break;
6178
5899
  }
6179
- _t5 = _objectSpread2;
6180
- _t6 = _objectSpread2({}, originDryRun);
6181
- _t7 = {};
6182
- _t8 = originDryRun.fee;
6183
- _context3.n = 3;
5900
+ _t2 = _objectSpread2;
5901
+ _t3 = _objectSpread2({}, originDryRun);
5902
+ _t4 = {};
5903
+ _t5 = originDryRun.fee;
5904
+ _context2.n = 3;
6184
5905
  return getMythosOriginFee(api);
6185
5906
  case 3:
6186
- _t9 = _context3.v;
6187
- _t0 = _t8 + _t9;
6188
- _t4 = _t5(_t6, _t7, {
6189
- fee: _t0
5907
+ _t6 = _context2.v;
5908
+ _t7 = _t5 + _t6;
5909
+ _t = _t2(_t3, _t4, {
5910
+ fee: _t7
6190
5911
  });
6191
- _context3.n = 5;
5912
+ _context2.n = 5;
6192
5913
  break;
6193
5914
  case 4:
6194
- _t4 = originDryRun;
5915
+ _t = originDryRun;
6195
5916
  case 5:
6196
- originDryModified = _t4;
5917
+ originDryModified = _t;
6197
5918
  initialForwardedXcms = originDryModified.forwardedXcms, initialDestParaId = originDryModified.destParaId;
6198
5919
  processHop = /*#__PURE__*/function () {
6199
5920
  var _ref2 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee(params) {
@@ -6211,6 +5932,7 @@ var dryRunInternal = /*#__PURE__*/function () {
6211
5932
  asset: asset,
6212
5933
  currentAsset: currentAsset,
6213
5934
  currency: currency,
5935
+ feeAsset: resolvedFeeAsset,
6214
5936
  swapConfig: swapConfig,
6215
5937
  hasPassedExchange: hasPassedExchange
6216
5938
  });
@@ -6251,7 +5973,7 @@ var dryRunInternal = /*#__PURE__*/function () {
6251
5973
  return _ref2.apply(this, arguments);
6252
5974
  };
6253
5975
  }();
6254
- _context3.n = 6;
5976
+ _context2.n = 6;
6255
5977
  return traverseXcmHops({
6256
5978
  api: api,
6257
5979
  origin: origin,
@@ -6272,7 +5994,7 @@ var dryRunInternal = /*#__PURE__*/function () {
6272
5994
  }
6273
5995
  });
6274
5996
  case 6:
6275
- traversalResult = _context3.v;
5997
+ traversalResult = _context2.v;
6276
5998
  // Process Ethereum bridge fees
6277
5999
  relayChain = api.getRelayChainOf(origin);
6278
6000
  bridgeHubChain = relayChain === 'Paseo' ? undefined : "BridgeHub".concat(relayChain);
@@ -6281,29 +6003,29 @@ var dryRunInternal = /*#__PURE__*/function () {
6281
6003
  return hop.chain === bridgeHubChain;
6282
6004
  }); // For Mythos → Ethereum, we skip additional Ethereum bridge fees (aligns with getXcmFeeInternal)
6283
6005
  if (!isMythosToEthereum) {
6284
- _context3.n = 7;
6006
+ _context2.n = 7;
6285
6007
  break;
6286
6008
  }
6287
- _t1 = bridgeHubHop === null || bridgeHubHop === void 0 ? void 0 : bridgeHubHop.result;
6288
- _context3.n = 11;
6009
+ _t8 = bridgeHubHop === null || bridgeHubHop === void 0 ? void 0 : bridgeHubHop.result;
6010
+ _context2.n = 11;
6289
6011
  break;
6290
6012
  case 7:
6291
6013
  if (!(bridgeHubHop !== null && bridgeHubHop !== void 0 && bridgeHubHop.result.success)) {
6292
- _context3.n = 9;
6014
+ _context2.n = 9;
6293
6015
  break;
6294
6016
  }
6295
- _context3.n = 8;
6017
+ _context2.n = 8;
6296
6018
  return addEthereumBridgeFees(api, bridgeHubHop === null || bridgeHubHop === void 0 ? void 0 : bridgeHubHop.result, destination, assetHubChain);
6297
6019
  case 8:
6298
- _t10 = _context3.v;
6299
- _context3.n = 10;
6020
+ _t9 = _context2.v;
6021
+ _context2.n = 10;
6300
6022
  break;
6301
6023
  case 9:
6302
- _t10 = bridgeHubHop === null || bridgeHubHop === void 0 ? void 0 : bridgeHubHop.result;
6024
+ _t9 = bridgeHubHop === null || bridgeHubHop === void 0 ? void 0 : bridgeHubHop.result;
6303
6025
  case 10:
6304
- _t1 = _t10;
6026
+ _t8 = _t9;
6305
6027
  case 11:
6306
- processedBridgeHub = _t1;
6028
+ processedBridgeHub = _t8;
6307
6029
  // Update bridge hub in hops if needed
6308
6030
  if (processedBridgeHub && processedBridgeHub.success && bridgeHubHop && bridgeHubHop.result.success && processedBridgeHub.fee !== bridgeHubHop.result.fee) {
6309
6031
  bridgeHubHopIndex = traversalResult.hops.findIndex(function (hop) {
@@ -6315,67 +6037,10 @@ var dryRunInternal = /*#__PURE__*/function () {
6315
6037
  });
6316
6038
  }
6317
6039
  }
6318
- resolveBridgeDestination = /*#__PURE__*/function () {
6319
- var _ref3 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee2() {
6320
- var _api$findAssetInfoOnD;
6321
- var destApi, systemAsset, hasSystemFeeAsset, destAsset, _t, _t2, _t3;
6322
- return _regenerator().w(function (_context2) {
6323
- while (1) switch (_context2.n) {
6324
- case 0:
6325
- if (!(isExternalChain(destination) || !isSubstrateBridge(origin, destination))) {
6326
- _context2.n = 1;
6327
- break;
6328
- }
6329
- return _context2.a(2, undefined);
6330
- case 1:
6331
- destApi = api.clone();
6332
- _context2.n = 2;
6333
- return destApi.init(destination);
6334
- case 2:
6335
- systemAsset = api.findNativeAssetInfoOrThrow(api.getRelayChainOf(origin));
6336
- hasSystemFeeAsset = deepEqual(getJunctionValue(asset.location, 'GlobalConsensus'), getEthereumJunction(api, origin, false).GlobalConsensus);
6337
- destAsset = hasSystemFeeAsset ? api.findAssetInfoOrThrow(destination, {
6338
- symbol: systemAsset.symbol
6339
- }) : (_api$findAssetInfoOnD = api.findAssetInfoOnDest(origin, destination, currency, asset)) !== null && _api$findAssetInfoOnD !== void 0 ? _api$findAssetInfoOnD : asset;
6340
- _context2.n = 3;
6341
- return getBridgeDestFee(api, destApi, origin, destination, asset, destAsset, hasSystemFeeAsset, sender, resolvedVersion);
6342
- case 3:
6343
- _t = _context2.v;
6344
- _t2 = destAsset;
6345
- _t3 = [];
6346
- return _context2.a(2, {
6347
- success: true,
6348
- fee: _t,
6349
- asset: _t2,
6350
- forwardedXcms: _t3
6351
- });
6352
- }
6353
- }, _callee2);
6354
- }));
6355
- return function resolveBridgeDestination() {
6356
- return _ref3.apply(this, arguments);
6357
- };
6358
- }();
6359
- _t11 = originDryModified;
6360
- if (!((_traversalResult$dest = traversalResult.destination) !== null && _traversalResult$dest !== void 0)) {
6361
- _context3.n = 12;
6362
- break;
6363
- }
6364
- _t12 = _traversalResult$dest;
6365
- _context3.n = 14;
6366
- break;
6367
- case 12:
6368
- _context3.n = 13;
6369
- return resolveBridgeDestination();
6370
- case 13:
6371
- _t12 = _context3.v;
6372
- case 14:
6373
- _t13 = _t12;
6374
- _t14 = traversalResult.hops;
6375
6040
  result = {
6376
- origin: _t11,
6377
- destination: _t13,
6378
- hops: _t14
6041
+ origin: originDryModified,
6042
+ destination: traversalResult.destination,
6043
+ hops: traversalResult.hops
6379
6044
  };
6380
6045
  dryRunError = getDryRunError({
6381
6046
  origin: {
@@ -6388,12 +6053,12 @@ var dryRunInternal = /*#__PURE__*/function () {
6388
6053
  } : undefined,
6389
6054
  hops: result.hops
6390
6055
  });
6391
- return _context3.a(2, _objectSpread2({
6056
+ return _context2.a(2, _objectSpread2({
6392
6057
  success: !dryRunError,
6393
6058
  dryRunError: dryRunError
6394
6059
  }, result));
6395
6060
  }
6396
- }, _callee3);
6061
+ }, _callee2);
6397
6062
  }));
6398
6063
  return function dryRunInternal(_x) {
6399
6064
  return _ref.apply(this, arguments);
@@ -6879,12 +6544,13 @@ var getBypassResultWithRetries = /*#__PURE__*/function () {
6879
6544
 
6880
6545
  var getOriginXcmFeeInternal = /*#__PURE__*/function () {
6881
6546
  var _ref2 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee(_ref) {
6882
- 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;
6883
6548
  return _regenerator().w(function (_context) {
6884
6549
  while (1) switch (_context.n) {
6885
6550
  case 0:
6886
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;
6887
6552
  resolvedFeeAsset = feeAsset ? resolveFeeAsset(api, feeAsset, origin, destination, currency) : undefined;
6553
+ originFeeAsset = supportsFeeAssetPayment(origin) ? resolvedFeeAsset : undefined;
6888
6554
  _resolveCurrency = resolveCurrency(api, currency, resolvedFeeAsset, origin, destination), assets = _resolveCurrency.assets, asset = _resolveCurrency.asset;
6889
6555
  _context.n = 1;
6890
6556
  return api.init(origin, DRY_RUN_CLIENT_TIMEOUT_MS);
@@ -6900,12 +6566,12 @@ var getOriginXcmFeeInternal = /*#__PURE__*/function () {
6900
6566
  rawFee = _yield$api$getPayment.partialFee;
6901
6567
  paddedFee = padFee(rawFee, origin, destination, 'origin');
6902
6568
  _context.n = 3;
6903
- return isSufficientOrigin(api, origin, destination, sender, paddedFee, asset, resolvedFeeAsset);
6569
+ return isSufficientOrigin(api, origin, destination, sender, paddedFee, asset, originFeeAsset);
6904
6570
  case 3:
6905
6571
  sufficient = _context.v;
6906
6572
  return _context.a(2, {
6907
6573
  fee: paddedFee,
6908
- asset: resolvedFeeAsset !== null && resolvedFeeAsset !== void 0 ? resolvedFeeAsset : api.findNativeAssetInfoOrThrow(origin),
6574
+ asset: originFeeAsset !== null && originFeeAsset !== void 0 ? originFeeAsset : api.findNativeAssetInfoOrThrow(origin),
6909
6575
  feeType: 'paymentInfo',
6910
6576
  sufficient: sufficient
6911
6577
  });
@@ -7023,7 +6689,7 @@ var getOriginXcmFee = /*#__PURE__*/function () {
7023
6689
 
7024
6690
  var getXcmFeeOnce = /*#__PURE__*/function () {
7025
6691
  var _ref2 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee2(_ref) {
7026
- 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;
7027
6693
  return _regenerator().w(function (_context2) {
7028
6694
  while (1) switch (_context2.p = _context2.n) {
7029
6695
  case 0:
@@ -7167,6 +6833,7 @@ var getXcmFeeOnce = /*#__PURE__*/function () {
7167
6833
  asset: asset,
7168
6834
  currentAsset: currentAsset,
7169
6835
  currency: currency,
6836
+ feeAsset: resolvedFeeAsset,
7170
6837
  swapConfig: swapConfig,
7171
6838
  hasPassedExchange: hasPassedExchange
7172
6839
  });
@@ -7235,7 +6902,7 @@ var getXcmFeeOnce = /*#__PURE__*/function () {
7235
6902
  destDryRunError = destResult.dryRunError;
7236
6903
  destSufficient = destResult.sufficient;
7237
6904
  destAsset = destResult.asset;
7238
- _context2.n = 19;
6905
+ _context2.n = 16;
7239
6906
  break;
7240
6907
  case 12:
7241
6908
  if (!(traversalResult.hops.length > 0 && traversalResult.hops[traversalResult.hops.length - 1].result.dryRunError)) {
@@ -7274,36 +6941,14 @@ var getXcmFeeOnce = /*#__PURE__*/function () {
7274
6941
  destFeeType = destFallback.feeType;
7275
6942
  destSufficient = destFallback.sufficient;
7276
6943
  destAsset = api.findNativeAssetInfoOrThrow(destination);
7277
- _context2.n = 19;
7278
- break;
7279
- case 15:
7280
- if (!(!isExternalChain(destination) && isSubstrateBridge(origin, destination))) {
7281
- _context2.n = 18;
7282
- break;
7283
- }
7284
- _destApi2 = api.clone();
7285
6944
  _context2.n = 16;
7286
- return _destApi2.init(destination, DRY_RUN_CLIENT_TIMEOUT_MS);
7287
- case 16:
7288
- systemAsset = api.findNativeAssetInfoOrThrow(api.getRelayChainOf(origin));
7289
- hasSystemFeeAsset = deepEqual(getJunctionValue(asset.location, 'GlobalConsensus'), getEthereumJunction(api, origin, false).GlobalConsensus);
7290
- destAsset = hasSystemFeeAsset ? api.findAssetInfoOrThrow(destination, {
7291
- symbol: systemAsset.symbol
7292
- }) : (_api$findAssetInfoOnD = api.findAssetInfoOnDest(origin, destination, currency, asset)) !== null && _api$findAssetInfoOnD !== void 0 ? _api$findAssetInfoOnD : asset;
7293
- _context2.n = 17;
7294
- return getBridgeDestFee(api, _destApi2, origin, destination, asset, destAsset, hasSystemFeeAsset, recipient, resolvedVersion);
7295
- case 17:
7296
- destFee = _context2.v;
7297
- destFeeType = 'dryRun';
7298
- destSufficient = true;
7299
- _context2.n = 19;
7300
6945
  break;
7301
- case 18:
6946
+ case 15:
7302
6947
  destFee = 0n;
7303
6948
  destFeeType = 'noFeeRequired';
7304
6949
  destSufficient = true;
7305
6950
  destAsset = api.findNativeAssetInfoOrThrow(destination);
7306
- case 19:
6951
+ case 16:
7307
6952
  // Process Ethereum bridge fees
7308
6953
  relayChain = api.getRelayChainOf(origin);
7309
6954
  bridgeHubChain = relayChain === 'Paseo' ? undefined : "BridgeHub".concat(relayChain);
@@ -7312,18 +6957,18 @@ var getXcmFeeOnce = /*#__PURE__*/function () {
7312
6957
  return hop.chain === bridgeHubChain;
7313
6958
  });
7314
6959
  if (!isMythosToEthereum) {
7315
- _context2.n = 20;
6960
+ _context2.n = 17;
7316
6961
  break;
7317
6962
  }
7318
6963
  _t4 = bridgeHubHop === null || bridgeHubHop === void 0 ? void 0 : bridgeHubHop.result;
7319
- _context2.n = 22;
6964
+ _context2.n = 19;
7320
6965
  break;
7321
- case 20:
7322
- _context2.n = 21;
6966
+ case 17:
6967
+ _context2.n = 18;
7323
6968
  return addEthereumBridgeFees(api, bridgeHubHop === null || bridgeHubHop === void 0 ? void 0 : bridgeHubHop.result, destination, assetHubChain);
7324
- case 21:
6969
+ case 18:
7325
6970
  _t4 = _context2.v;
7326
- case 22:
6971
+ case 19:
7327
6972
  processedBridgeHub = _t4;
7328
6973
  // Update bridge hub fee in hops if needed
7329
6974
  if (processedBridgeHub && bridgeHubHop && processedBridgeHub.fee !== bridgeHubHop.result.fee) {
@@ -7941,11 +7586,13 @@ var getTransferInfo = /*#__PURE__*/function () {
7941
7586
  var FEE_PADDING = 30;
7942
7587
  var sumHopFees = function sumHopFees(result, _ref) {
7943
7588
  var assetInfo = _ref.assetInfo,
7589
+ feeAssetInfo = _ref.feeAssetInfo,
7944
7590
  isRelayAsset = _ref.isRelayAsset,
7945
7591
  systemAsset = _ref.systemAsset;
7592
+ var feeAsset = isRelayAsset ? assetInfo : feeAssetInfo !== null && feeAssetInfo !== void 0 ? feeAssetInfo : systemAsset;
7946
7593
  return result.hops.reduce(function (acc, hop) {
7947
7594
  // only add if asset is equal
7948
- 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;
7949
7596
  }, 0n);
7950
7597
  };
7951
7598
  var computeAllFees = /*#__PURE__*/function () {
@@ -8357,57 +8004,259 @@ var getTransferableAmount = /*#__PURE__*/function () {
8357
8004
  };
8358
8005
  }();
8359
8006
 
8360
- var resolveTransferType = function resolveTransferType(_ref) {
8361
- var origin = _ref.origin,
8362
- reserve = _ref.reserve,
8363
- dest = _ref.dest,
8364
- isSubBridge = _ref.isSubBridge,
8365
- assetInfo = _ref.assetInfo;
8366
- // Direct A → C: when origin is reserve OR dest is reserve, check origin <-> dest trust
8367
- // Hop A → B → C: when reserve differs from both, check origin <-> reserve trust
8368
- var isDirect = origin.chain === reserve.chain || dest.chain === reserve.chain;
8369
- var chainToCheck = isDirect ? dest.chain : reserve.chain;
8370
- var canTeleport = isTrustedChain(origin.chain) && isTrustedChain(chainToCheck) || isNativeAssetTeleport(origin.api, origin.chain, chainToCheck, assetInfo);
8371
- if (canTeleport && !isSubBridge) return 'Teleport';
8372
- if (origin.chain === reserve.chain) return 'LocalReserve';
8373
- return 'DestinationReserve';
8007
+ var createX1Payload = function createX1Payload(version, junction) {
8008
+ return version === Version.V3 ? {
8009
+ X1: junction
8010
+ } : {
8011
+ X1: [junction]
8012
+ };
8374
8013
  };
8375
- var buildTypeAndThenCall = function buildTypeAndThenCall(context, isDotAsset, customXcm, assets) {
8376
- var origin = context.origin,
8377
- reserve = context.reserve,
8378
- dest = context.dest,
8379
- assetInfo = context.assetInfo,
8380
- bridgeHopChain = context.bridgeHopChain,
8381
- isSubBridge = context.isSubBridge,
8382
- _context$options = context.options,
8383
- version = _context$options.version,
8384
- pallet = _context$options.pallet,
8385
- method = _context$options.method,
8386
- overriddenAsset = _context$options.overriddenAsset;
8387
- var feeAssetLocation = !isDotAsset ? RELAY_LOCATION : assetInfo.location;
8388
- var finalDest = bridgeHopChain !== null && bridgeHopChain !== void 0 ? bridgeHopChain : origin.chain === reserve.chain ? dest.chain : reserve.chain;
8389
- var destLocation = createDestination(origin.api, version, origin.chain, finalDest, origin.api.getParaId(finalDest));
8390
- var transferType = bridgeHopChain ? 'DestinationReserve' : resolveTransferType(context);
8391
- var feesTransferType = isSubBridge && !isDotAsset ? 'LocalReserve' : transferType;
8392
- var feeAsset = Array.isArray(overriddenAsset) ? overriddenAsset.find(function (a) {
8393
- return a.isFeeAsset;
8394
- }) : null;
8395
- var feeMultiAsset = feeAsset !== null && feeAsset !== void 0 ? feeAsset : createAsset(version, assetInfo.amount, normalizeLocation(origin.api.localizeLocation(origin.chain, feeAssetLocation), version));
8396
- var module = pallet !== null && pallet !== void 0 ? pallet : origin.api.getXcmPallet(origin.chain);
8397
- 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
+ }
8398
8057
  return {
8399
- module: module,
8400
- method: methodName,
8401
- params: {
8402
- dest: addXcmVersionHeader(destLocation, version),
8403
- assets: addXcmVersionHeader(assets, version),
8404
- assets_transfer_type: transferType,
8405
- remote_fees_id: addXcmVersionHeader(feeMultiAsset.id, version),
8406
- fees_transfer_type: feesTransferType,
8407
- custom_xcm_on_dest: addXcmVersionHeader(customXcm, version),
8408
- 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);
8409
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
8224
+ };
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
8410
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
+ });
8411
8260
  };
8412
8261
 
8413
8262
  var PINK_LOCATION = {
@@ -8430,6 +8279,13 @@ var requiresSystemAssetByLocation = function requiresSystemAssetByLocation(api,
8430
8279
  return deepEqual(assetLocation, location);
8431
8280
  });
8432
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
+ };
8433
8289
  var getBridgeReserve = function getBridgeReserve(api, chain, destination, location) {
8434
8290
  var assetConsensus = getJunctionValue(location, 'GlobalConsensus');
8435
8291
  var ethereumConsensus = getEthereumJunction(api, chain, false).GlobalConsensus;
@@ -8449,17 +8305,23 @@ var resolveReserveChain = function resolveReserveChain(api, chain, destination,
8449
8305
  return api.getAssetReserveChain(chain, assetLocation, isExternalChain(destination));
8450
8306
  };
8451
8307
  var createTypeAndThenCallContext = /*#__PURE__*/function () {
8452
- var _ref2 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee(options, overrides) {
8308
+ var _ref3 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee(options, overrides) {
8453
8309
  var _overrides$noFeeAsset;
8454
- 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;
8455
8311
  return _regenerator().w(function (_context) {
8456
8312
  while (1) switch (_context.n) {
8457
8313
  case 0:
8458
- 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;
8459
8315
  assertToIsString(destination);
8460
8316
  isSubBridge = isSubstrateBridge(chain, destination);
8461
- isSb = isSnowbridge(chain, destination);
8462
- 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);
8463
8325
  NO_FEE_ASSET_LOCS = [RELAY_LOCATION, {
8464
8326
  parents: 2,
8465
8327
  interior: {
@@ -8496,19 +8358,26 @@ var createTypeAndThenCallContext = /*#__PURE__*/function () {
8496
8358
  isForeignRelayToExternal = isExternalDestination && !chain.startsWith('AssetHub') && assetInfo.location.parents === 2 && RELAYCHAINS.some(function (relay) {
8497
8359
  return relay !== originRelayChain && deepEqual(assetGlobalConsensus, _defineProperty({}, relay.toLowerCase(), null));
8498
8360
  });
8499
- isRelayAsset = !requiresSystemAsset && !isForeignRelayToExternal && (isAssetHubToExternal || NO_FEE_ASSET_LOCS.some(function (loc) {
8361
+ isRelayAsset = !feeAssetInfo && !requiresSystemAsset && !isForeignRelayToExternal && (isAssetHubToExternal || NO_FEE_ASSET_LOCS.some(function (loc) {
8500
8362
  return deepEqual(assetInfo.location, loc);
8501
8363
  }) || isSubBridge || ((_overrides$noFeeAsset = overrides.noFeeAsset) !== null && _overrides$noFeeAsset !== void 0 ? _overrides$noFeeAsset : false));
8502
8364
  assetHubChain = "AssetHub".concat(originRelayChain);
8503
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:
8504
8373
  destApi = api.clone();
8505
- _context.n = 1;
8374
+ _context.n = 2;
8506
8375
  return destApi.init(destination);
8507
- case 1:
8376
+ case 2:
8508
8377
  reserveApi = reserveChain === chain ? api : reserveChain === destination ? destApi : api.clone();
8509
- _context.n = 2;
8378
+ _context.n = 3;
8510
8379
  return reserveApi.init(reserveChain);
8511
- case 2:
8380
+ case 3:
8512
8381
  return _context.a(2, {
8513
8382
  origin: {
8514
8383
  api: api,
@@ -8526,6 +8395,8 @@ var createTypeAndThenCallContext = /*#__PURE__*/function () {
8526
8395
  isSnowbridge: isSb,
8527
8396
  isRelayAsset: isRelayAsset,
8528
8397
  assetInfo: assetInfo,
8398
+ feeAssetInfo: feeAssetInfo,
8399
+ feeReserveChain: feeReserveChain,
8529
8400
  options: options,
8530
8401
  systemAsset: systemAsset,
8531
8402
  bridgeHopChain: bridgeHopChain
@@ -8534,9 +8405,69 @@ var createTypeAndThenCallContext = /*#__PURE__*/function () {
8534
8405
  }, _callee);
8535
8406
  }));
8536
8407
  return function createTypeAndThenCallContext(_x, _x2) {
8537
- return _ref2.apply(this, arguments);
8408
+ return _ref3.apply(this, arguments);
8409
+ };
8410
+ }();
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;
8538
8449
  };
8539
- }();
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
+ };
8540
8471
 
8541
8472
  var generateMessageId = /*#__PURE__*/function () {
8542
8473
  var _ref = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee(api, senderAddress, sourceParaId, tokenAddress, recipient, amount) {
@@ -8666,7 +8597,7 @@ var createCustomXcm = /*#__PURE__*/function () {
8666
8597
  setTopic = messageId ? [{
8667
8598
  SetTopic: messageId
8668
8599
  }] : [];
8669
- feeAssetLocation = !isRelayAsset ? RELAY_LOCATION : assetInfo.location;
8600
+ feeAssetLocation = getFeeAssetLocation(context);
8670
8601
  feeLocLocalized = origin.api.localizeLocation(dest.chain, feeAssetLocation, origin.chain);
8671
8602
  assetLocLocalized = origin.api.localizeLocation(dest.chain, assetInfo.location, origin.chain);
8672
8603
  asset = createAsset(version, assetInfo.amount, assetLocLocalized);
@@ -8699,7 +8630,7 @@ var createCustomXcm = /*#__PURE__*/function () {
8699
8630
  return localizeFilterAsset(asset.fun.Fungible, extractAssetLocation(asset));
8700
8631
  })));
8701
8632
  } else {
8702
- 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)));
8703
8634
  assetsFilter.push(localizeFilterAsset(assetInfo.amount, assetInfo.location));
8704
8635
  }
8705
8636
  isAssetEthereumNative = deepEqual(getJunctionValue(assetInfo.location, 'GlobalConsensus'), getEthereumJunction(origin.api, origin.chain, false).GlobalConsensus);
@@ -8719,7 +8650,7 @@ var createCustomXcm = /*#__PURE__*/function () {
8719
8650
  AllCounted: assetCount
8720
8651
  }
8721
8652
  } : {
8722
- Definite: assetsFilter
8653
+ Definite: sortAssets(assetsFilter)
8723
8654
  };
8724
8655
  buyExecutionAsset = isExternalChain(dest.chain) ? createAsset(version, buyExecutionAmount, assetLocLocalized) : createAsset(version, normalizeAmount(buyExecutionAmount), feeLocLocalized);
8725
8656
  buyExecution = {
@@ -8793,17 +8724,25 @@ var createCustomXcm = /*#__PURE__*/function () {
8793
8724
  };
8794
8725
  }();
8795
8726
 
8796
- var buildAssets = function buildAssets(api, chain, asset, feeAmount, isRelayAsset, _ref) {
8797
- var version = _ref.version,
8798
- 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
+ };
8799
8739
  if (overriddenAsset) {
8800
- return overriddenAsset;
8801
- }
8802
- var assets = [];
8803
- if (!isRelayAsset) {
8804
- assets.push(createAsset(version, feeAmount, RELAY_LOCATION));
8740
+ return sortAssets(overriddenAsset.map(function (asset) {
8741
+ return localize(asset.fun.Fungible, extractAssetLocation(asset));
8742
+ }));
8805
8743
  }
8806
- 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));
8807
8746
  return sortAssets(assets);
8808
8747
  };
8809
8748
  var resolveAssetCount = function resolveAssetCount(overriddenAsset, isRelayAsset) {
@@ -8814,22 +8753,20 @@ var resolveAssetCount = function resolveAssetCount(overriddenAsset, isRelayAsset
8814
8753
  };
8815
8754
  var DEFAULT_SYSTEM_ASSET_AMOUNT = '1';
8816
8755
  var DEFAULT_SYSTEM_ASSET_AMOUNT_EXTERNAL = '10';
8817
- var resolveSystemAssetAmount = function resolveSystemAssetAmount(_ref2, isForFeeCalc, fees) {
8818
- var systemAsset = _ref2.systemAsset,
8819
- dest = _ref2.dest;
8756
+ var resolveSystemAssetAmount = function resolveSystemAssetAmount(_ref, isForFeeCalc, fees) {
8757
+ var systemAsset = _ref.systemAsset,
8758
+ feeAssetInfo = _ref.feeAssetInfo,
8759
+ dest = _ref.dest;
8820
8760
  if (isForFeeCalc) {
8821
8761
  var defaultAmount = isExternalChain(dest.chain) ? DEFAULT_SYSTEM_ASSET_AMOUNT_EXTERNAL : DEFAULT_SYSTEM_ASSET_AMOUNT;
8822
- return parseUnits(defaultAmount, systemAsset.decimals);
8762
+ return parseUnits(defaultAmount, (feeAssetInfo !== null && feeAssetInfo !== void 0 ? feeAssetInfo : systemAsset).decimals);
8823
8763
  }
8824
8764
  return normalizeAmount(fees.destFee + fees.hopFees);
8825
8765
  };
8826
8766
  var constructTypeAndThenCall = /*#__PURE__*/function () {
8827
- var _ref3 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee(context) {
8767
+ var _ref2 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee(context) {
8828
8768
  var fees,
8829
- origin,
8830
- assetInfo,
8831
8769
  isRelayAsset,
8832
- options,
8833
8770
  overriddenAsset,
8834
8771
  assetCount,
8835
8772
  resolvedFees,
@@ -8842,8 +8779,7 @@ var constructTypeAndThenCall = /*#__PURE__*/function () {
8842
8779
  while (1) switch (_context.n) {
8843
8780
  case 0:
8844
8781
  fees = _args.length > 1 && _args[1] !== undefined ? _args[1] : null;
8845
- origin = context.origin, assetInfo = context.assetInfo, isRelayAsset = context.isRelayAsset, options = context.options;
8846
- overriddenAsset = options.overriddenAsset;
8782
+ isRelayAsset = context.isRelayAsset, overriddenAsset = context.options.overriddenAsset;
8847
8783
  assetCount = resolveAssetCount(overriddenAsset, isRelayAsset);
8848
8784
  resolvedFees = fees !== null && fees !== void 0 ? fees : {
8849
8785
  hopFees: 0n,
@@ -8855,20 +8791,20 @@ var constructTypeAndThenCall = /*#__PURE__*/function () {
8855
8791
  return createCustomXcm(context, assetCount, isForFeeCalc, systemAssetAmount, resolvedFees);
8856
8792
  case 1:
8857
8793
  customXcm = _context.v;
8858
- assets = buildAssets(origin.api, origin.chain, assetInfo, systemAssetAmount, isRelayAsset, options);
8794
+ assets = buildAssets(context, systemAssetAmount);
8859
8795
  return _context.a(2, buildTypeAndThenCall(context, isRelayAsset, customXcm, assets));
8860
8796
  }
8861
8797
  }, _callee);
8862
8798
  }));
8863
8799
  return function constructTypeAndThenCall(_x) {
8864
- return _ref3.apply(this, arguments);
8800
+ return _ref2.apply(this, arguments);
8865
8801
  };
8866
8802
  }();
8867
8803
  /**
8868
8804
  * Creates a type and then call for transferring assets using XCM. Works only for DOT and snowbridge assets so far.
8869
8805
  */
8870
8806
  var createTypeAndThenCall = /*#__PURE__*/function () {
8871
- var _ref4 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee3(options) {
8807
+ var _ref3 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee3(options) {
8872
8808
  var overrides,
8873
8809
  context,
8874
8810
  origin,
@@ -8905,7 +8841,7 @@ var createTypeAndThenCall = /*#__PURE__*/function () {
8905
8841
  case 3:
8906
8842
  _context3.n = 4;
8907
8843
  return computeAllFees(context, /*#__PURE__*/function () {
8908
- var _ref5 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee2(amount, relative) {
8844
+ var _ref4 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee2(amount, relative) {
8909
8845
  var overridenAmount, _t, _t2;
8910
8846
  return _regenerator().w(function (_context2) {
8911
8847
  while (1) switch (_context2.n) {
@@ -8925,7 +8861,7 @@ var createTypeAndThenCall = /*#__PURE__*/function () {
8925
8861
  }, _callee2);
8926
8862
  }));
8927
8863
  return function (_x3, _x4) {
8928
- return _ref5.apply(this, arguments);
8864
+ return _ref4.apply(this, arguments);
8929
8865
  };
8930
8866
  }());
8931
8867
  case 4:
@@ -8935,7 +8871,7 @@ var createTypeAndThenCall = /*#__PURE__*/function () {
8935
8871
  }, _callee3);
8936
8872
  }));
8937
8873
  return function createTypeAndThenCall(_x2) {
8938
- return _ref4.apply(this, arguments);
8874
+ return _ref3.apply(this, arguments);
8939
8875
  };
8940
8876
  }();
8941
8877
 
@@ -9219,6 +9155,66 @@ var verifyEdOnDestination = /*#__PURE__*/function () {
9219
9155
  };
9220
9156
  }();
9221
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
+
9222
9218
  var transferPolkadotXcm = /*#__PURE__*/function () {
9223
9219
  var _ref = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee(options) {
9224
9220
  var method,
@@ -9230,6 +9226,7 @@ var transferPolkadotXcm = /*#__PURE__*/function () {
9230
9226
  beneficiaryLocation,
9231
9227
  multiAsset,
9232
9228
  overriddenAsset,
9229
+ feeAssetInfo,
9233
9230
  pallet,
9234
9231
  version,
9235
9232
  methodOverride,
@@ -9246,7 +9243,7 @@ var transferPolkadotXcm = /*#__PURE__*/function () {
9246
9243
  case 0:
9247
9244
  method = _args.length > 1 && _args[1] !== undefined ? _args[1] : 'transfer_assets_using_type_and_then';
9248
9245
  fees = _args.length > 2 && _args[2] !== undefined ? _args[2] : undefined;
9249
- 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;
9250
9247
  if (!(method === 'transfer_assets_using_type_and_then')) {
9251
9248
  _context.n = 2;
9252
9249
  break;
@@ -9260,6 +9257,7 @@ var transferPolkadotXcm = /*#__PURE__*/function () {
9260
9257
  case 1:
9261
9258
  return _context.a(2, _t.deserializeExtrinsics.call(_t, _context.v));
9262
9259
  case 2:
9260
+ validateFeeAssetSupport(asset, feeAssetInfo, overriddenAsset, methodOverride !== null && methodOverride !== void 0 ? methodOverride : method);
9263
9261
  resolvedMultiAssets = maybeOverrideAssets(version, asset.amount, [multiAsset], overriddenAsset);
9264
9262
  destLocation = createDestination(api, version, chain, destination, paraIdTo);
9265
9263
  feeAssetIndex = overriddenAsset === undefined ? DEFAULT_FEE_ASSET : overriddenAsset.findIndex(function (asset) {
@@ -9314,6 +9312,13 @@ var applyDecimalAbstraction = function applyDecimalAbstraction(amount, decimals,
9314
9312
  return parseUnits(amount.toString(), decimals);
9315
9313
  };
9316
9314
 
9315
+ var createAllCountedFilter = function createAllCountedFilter(count) {
9316
+ return {
9317
+ Wild: {
9318
+ AllCounted: count
9319
+ }
9320
+ };
9321
+ };
9317
9322
  var createAssetsFilter = function createAssetsFilter(asset, version) {
9318
9323
  var location = extractAssetLocation(asset);
9319
9324
  var id = createAssetId(version, location);
@@ -9344,7 +9349,10 @@ var prepareExecuteContext = function prepareExecuteContext(_ref) {
9344
9349
  destChain = _ref.destChain,
9345
9350
  assetInfo = _ref.assetInfo,
9346
9351
  feeAssetInfo = _ref.feeAssetInfo,
9347
- originFee = _ref.fees.originFee,
9352
+ _ref$fees = _ref.fees,
9353
+ originFee = _ref$fees.originFee,
9354
+ reserveFee = _ref$fees.reserveFee,
9355
+ destFee = _ref$fees.destFee,
9348
9356
  version = _ref.version;
9349
9357
  var amount = assetInfo.amount;
9350
9358
  var reserveChain = api.getAssetReserveChain(chain, assetInfo.location);
@@ -9352,10 +9360,13 @@ var prepareExecuteContext = function prepareExecuteContext(_ref) {
9352
9360
  var assetLocalized = createAsset(version, amount, api.localizeLocation(chain, assetInfo.location));
9353
9361
  var assetLocalizedToDest = createAsset(version, amount, localizeLocation(destChain, assetInfo.location));
9354
9362
  var assetLocalizedToReserve = createAsset(version, amount, api.localizeLocation(reserveChain !== null && reserveChain !== void 0 ? reserveChain : chain, assetInfo.location));
9355
- var feeAsset = feeAssetInfo && !isAssetEqual(assetInfo, feeAssetInfo) ? createAsset(version, originFee, feeAssetInfo.location) : undefined;
9356
- var feeAssetLocalized = feeAssetInfo && !isAssetEqual(assetInfo, feeAssetInfo) ? createAsset(version, originFee, api.localizeLocation(chain, feeAssetInfo.location)) : undefined;
9357
- var feeAssetLocalizedToDest = feeAssetInfo && !isAssetEqual(assetInfo, feeAssetInfo) ? createAsset(version, originFee, localizeLocation(destChain, feeAssetInfo.location)) : undefined;
9358
- 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);
9359
9370
  return {
9360
9371
  amount: amount,
9361
9372
  asset: asset,
@@ -9366,6 +9377,7 @@ var prepareExecuteContext = function prepareExecuteContext(_ref) {
9366
9377
  feeAssetLocalized: feeAssetLocalized,
9367
9378
  feeAssetLocalizedToDest: feeAssetLocalizedToDest,
9368
9379
  feeAssetLocalizedToReserve: feeAssetLocalizedToReserve,
9380
+ feeReserveChain: feeReserveChain,
9369
9381
  reserveChain: reserveChain
9370
9382
  };
9371
9383
  };
@@ -9377,6 +9389,12 @@ var updateAsset = function updateAsset(asset, amount) {
9377
9389
  }
9378
9390
  });
9379
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
+ };
9380
9398
  var getInstructionType = function getInstructionType(api, version, origin, destination, assetInfo, reserveChain, transactOptions) {
9381
9399
  if (version >= Version.V5 && transactOptions !== null && transactOptions !== void 0 && transactOptions.call) {
9382
9400
  return 'InitiateTransfer';
@@ -9385,7 +9403,7 @@ var getInstructionType = function getInstructionType(api, version, origin, desti
9385
9403
  return 'InitiateTeleportToReserve';
9386
9404
  }
9387
9405
  // Trusted chains (or native-asset teleports to/from AssetHub) can teleport
9388
- if (isTrustedChain(origin) && isTrustedChain(destination) || isNativeAssetTeleport(api, origin, destination, assetInfo)) {
9406
+ if (isTeleportLeg(api, origin, destination, assetInfo)) {
9389
9407
  return 'InitiateTeleport';
9390
9408
  }
9391
9409
  // If we need intermediary reserve (not on reserve chain)
@@ -9396,7 +9414,7 @@ var getInstructionType = function getInstructionType(api, version, origin, desti
9396
9414
  return 'DepositAsset';
9397
9415
  };
9398
9416
  var getInitiateTransferType = function getInitiateTransferType(api, origin, destination, assetInfo, reserveChain) {
9399
- if (isTrustedChain(origin) && isTrustedChain(destination) || isNativeAssetTeleport(api, origin, destination, assetInfo)) {
9417
+ if (isTeleportLeg(api, origin, destination, assetInfo)) {
9400
9418
  return 'Teleport';
9401
9419
  }
9402
9420
  if (origin === reserveChain) return 'ReserveDeposit';
@@ -9407,13 +9425,13 @@ var createBaseExecuteXcm = function createBaseExecuteXcm(options) {
9407
9425
  chain = options.chain,
9408
9426
  destChain = options.destChain,
9409
9427
  assetInfo = options.assetInfo,
9428
+ feeAssetInfo = options.feeAssetInfo,
9410
9429
  _options$fees = options.fees,
9411
9430
  originFee = _options$fees.originFee,
9412
9431
  reserveFee = _options$fees.reserveFee,
9413
9432
  version = options.version,
9414
9433
  paraIdTo = options.paraIdTo,
9415
9434
  transactOptions = options.transactOptions,
9416
- useFeeAssetOnHops = options.useFeeAssetOnHops,
9417
9435
  _options$suffixXcm = options.suffixXcm,
9418
9436
  suffixXcm = _options$suffixXcm === void 0 ? [] : _options$suffixXcm;
9419
9437
  var _prepareExecuteContex = prepareExecuteContext(options),
@@ -9422,11 +9440,13 @@ var createBaseExecuteXcm = function createBaseExecuteXcm(options) {
9422
9440
  assetLocalizedToReserve = _prepareExecuteContex.assetLocalizedToReserve,
9423
9441
  assetLocalizedToDest = _prepareExecuteContex.assetLocalizedToDest,
9424
9442
  feeAsset = _prepareExecuteContex.feeAsset,
9443
+ feeAssetLocalized = _prepareExecuteContex.feeAssetLocalized,
9425
9444
  feeAssetLocalizedToReserve = _prepareExecuteContex.feeAssetLocalizedToReserve,
9426
9445
  feeAssetLocalizedToDest = _prepareExecuteContex.feeAssetLocalizedToDest,
9446
+ feeReserveChain = _prepareExecuteContex.feeReserveChain,
9427
9447
  reserveChain = _prepareExecuteContex.reserveChain;
9428
- var hopFeeAssetToReserve = useFeeAssetOnHops ? feeAssetLocalizedToReserve : undefined;
9429
- var hopFeeAssetToDest = useFeeAssetOnHops ? feeAssetLocalizedToDest : undefined;
9448
+ var isReserveDest = reserveChain === destChain;
9449
+ var hopFeeAssetToReserve = isReserveDest ? feeAssetLocalizedToDest : feeAssetLocalizedToReserve;
9430
9450
  // When fees are paid in a separate asset, originFee is denominated in that asset's
9431
9451
  // currency and must not be subtracted from the transfer amount.
9432
9452
  var originFeeDeduction = feeAsset ? 0n : originFee;
@@ -9434,29 +9454,41 @@ var createBaseExecuteXcm = function createBaseExecuteXcm(options) {
9434
9454
  if (chain !== 'AssetHubPolkadot' && reserveChain === undefined) {
9435
9455
  throw new UnsupportedOperationError('Sending local reserve assets with custom fee asset is not yet supported for this chain.');
9436
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
+ }
9437
9460
  var transferType = getInstructionType(api, version, chain, destChain, assetInfo, reserveChain, transactOptions);
9438
- var routingAssetsFilter = feeAsset ? {
9439
- Wild: {
9440
- 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."));
9441
9468
  }
9442
- } : createAssetsFilter(assetLocalized, version);
9443
- var isReserveDest = reserveChain === destChain;
9444
- var resolvedDepositInstruction = isReserveDest ? suffixXcm : [{
9445
- DepositReserveAsset: {
9446
- assets: createAssetsFilter(assetLocalizedToReserve, version),
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);
9475
+ }
9476
+ return [_defineProperty({}, reserveToDestInstruction, {
9477
+ assets: createRoutingFilter(assetLocalizedToReserve),
9447
9478
  dest: createDestination(api, version, reserveChain !== null && reserveChain !== void 0 ? reserveChain : chain, destChain, paraIdTo),
9448
- xcm: [].concat(_toConsumableArray(createBuyExecution(hopFeeAssetToDest !== null && hopFeeAssetToDest !== void 0 ? hopFeeAssetToDest : updateAsset(assetLocalizedToDest, reserveFee === 1000n ? amount / 2n : amount - originFeeDeduction - reserveFee))), _toConsumableArray(suffixXcm))
9449
- }
9450
- }];
9479
+ xcm: [].concat(_toConsumableArray(createBuyExecution(feeAssetLocalizedToDest !== null && feeAssetLocalizedToDest !== void 0 ? feeAssetLocalizedToDest : updateAsset(assetLocalizedToDest, reserveFee === 1000n ? amount / 2n : amount - originFeeDeduction - reserveFee))), _toConsumableArray(suffixXcm))
9480
+ })];
9481
+ };
9451
9482
  var mainInstructions;
9452
9483
  switch (transferType) {
9453
9484
  case 'InitiateTransfer':
9454
9485
  {
9455
9486
  var transferFilter = getInitiateTransferType(api, chain, destChain, assetInfo, reserveChain);
9487
+ if (transferFilter === 'Teleport') assertFeeAssetTeleportable(chain, destChain);
9456
9488
  mainInstructions = [{
9457
9489
  InitiateTransfer: {
9458
9490
  destination: destLocation,
9459
- remote_fees: _defineProperty({}, transferFilter, routingAssetsFilter),
9491
+ remote_fees: _defineProperty({}, transferFilter, createAssetsFilter(feeAssetLocalized !== null && feeAssetLocalized !== void 0 ? feeAssetLocalized : assetLocalized, version)),
9460
9492
  preserve_origin: true,
9461
9493
  assets: [_defineProperty({}, transferFilter, routingAssetsFilter)],
9462
9494
  remote_xcm: [{
@@ -9468,21 +9500,23 @@ var createBaseExecuteXcm = function createBaseExecuteXcm(options) {
9468
9500
  }
9469
9501
  case 'InitiateTeleport':
9470
9502
  // Use teleport for trusted chains
9503
+ assertFeeAssetTeleportable(chain, destChain);
9471
9504
  mainInstructions = [{
9472
9505
  InitiateTeleport: {
9473
9506
  assets: routingAssetsFilter,
9474
9507
  dest: destLocation,
9475
- 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))
9476
9509
  }
9477
9510
  }];
9478
9511
  break;
9479
9512
  case 'InitiateTeleportToReserve':
9480
9513
  // Teleport to reserve chain first
9514
+ assertFeeAssetTeleportable(chain, reserveChain);
9481
9515
  mainInstructions = [{
9482
9516
  InitiateTeleport: {
9483
9517
  assets: routingAssetsFilter,
9484
9518
  dest: getChainLocation(chain, reserveChain, api._customCtx),
9485
- 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()))
9486
9520
  }
9487
9521
  }];
9488
9522
  break;
@@ -9494,12 +9528,12 @@ var createBaseExecuteXcm = function createBaseExecuteXcm(options) {
9494
9528
  reserve: getChainLocation(chain, reserveChain, api._customCtx),
9495
9529
  xcm: [].concat(_toConsumableArray(createBuyExecution(// Decrease amount by 2 units because for some reason polkadot withdraws 2 units less
9496
9530
  // than requested, so we need to account for that
9497
- 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()))
9498
9532
  }
9499
9533
  }];
9500
9534
  break;
9501
9535
  case 'DepositAsset':
9502
- mainInstructions = resolvedDepositInstruction;
9536
+ mainInstructions = createReserveToDestXcm();
9503
9537
  }
9504
9538
  return mainInstructions;
9505
9539
  };
@@ -9624,7 +9658,7 @@ var prepareCommonExecuteXcm = function prepareCommonExecuteXcm(options, assetToD
9624
9658
  WithdrawAsset: withdrawAssets
9625
9659
  });
9626
9660
  if (feeAssetLocalized && !useJitWithdraw) {
9627
- prefix.push.apply(prefix, _toConsumableArray(createBuyExecution(feeAssetLocalized)));
9661
+ prefix.push.apply(prefix, _toConsumableArray(createBuyExecution(feeAssetLocalized, MIN_WEIGHT)));
9628
9662
  } else {
9629
9663
  prefix.push({
9630
9664
  SetFeesMode: {
@@ -9684,32 +9718,36 @@ var createDirectExecuteXcm = /*#__PURE__*/function () {
9684
9718
  };
9685
9719
  }();
9686
9720
 
9687
- var getReserveFeeFromHops = function getReserveFeeFromHops(hops) {
9688
- if (!hops || hops.length === 0 || !hops[0].result.success) {
9689
- return MIN_FEE;
9690
- }
9691
- return hops[0].result.fee;
9721
+ var getFeeFromResult = function getFeeFromResult(result) {
9722
+ return result !== null && result !== void 0 && result.success ? result.fee : MIN_FEE;
9692
9723
  };
9693
9724
  var FEE_PADDING_PERCENTAGE$1 = 40;
9694
9725
  var handleExecuteTransfer = /*#__PURE__*/function () {
9695
9726
  var _ref = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee(options) {
9696
- 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;
9697
9729
  return _regenerator().w(function (_context) {
9698
9730
  while (1) switch (_context.n) {
9699
9731
  case 0:
9700
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;
9701
9733
  assertSender(sender);
9702
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:
9703
9741
  checkAmount = function checkAmount(fee) {
9704
9742
  if (assetInfo.amount <= fee) throw new AmountTooLowError();
9705
9743
  };
9706
9744
  checkAmount(MIN_FEE);
9707
9745
  if (!(destChain === undefined)) {
9708
- _context.n = 1;
9746
+ _context.n = 2;
9709
9747
  break;
9710
9748
  }
9711
9749
  throw new RoutingResolutionError('Could not determine destination chain for execute transfer');
9712
- case 1:
9750
+ case 2:
9713
9751
  internalOptions = {
9714
9752
  api: api,
9715
9753
  chain: chain,
@@ -9726,18 +9764,21 @@ var handleExecuteTransfer = /*#__PURE__*/function () {
9726
9764
  }; // We mint 1000 units of feeAsset and use 100
9727
9765
  FEE_ASSET_AMOUNT = 100;
9728
9766
  feeAssetAmount = feeAssetInfo ? parseUnits(FEE_ASSET_AMOUNT.toString(), feeAssetInfo.decimals) : MIN_FEE;
9767
+ resolvedFeeAssetInfo = getFeeAssetInfo(assetInfo, feeAssetInfo);
9768
+ hopFeeAmount = resolvedFeeAssetInfo ? feeAssetAmount : MIN_FEE;
9729
9769
  _t = createExecuteCall;
9730
9770
  _t2 = chain;
9731
- _context.n = 2;
9771
+ _context.n = 3;
9732
9772
  return createDirectExecuteXcm(_objectSpread2(_objectSpread2({}, internalOptions), {}, {
9733
9773
  fees: {
9734
9774
  originFee: feeAssetAmount,
9735
- reserveFee: MIN_FEE
9775
+ reserveFee: hopFeeAmount,
9776
+ destFee: hopFeeAmount
9736
9777
  }
9737
9778
  }));
9738
- case 2:
9779
+ case 3:
9739
9780
  call = _t(_t2, _context.v, MAX_WEIGHT);
9740
- _context.n = 3;
9781
+ _context.n = 4;
9741
9782
  return dryRunInternal({
9742
9783
  api: api,
9743
9784
  tx: api.deserializeExtrinsics(call),
@@ -9749,34 +9790,34 @@ var handleExecuteTransfer = /*#__PURE__*/function () {
9749
9790
  feeAsset: feeCurrency,
9750
9791
  useRootOrigin: true
9751
9792
  });
9752
- case 3:
9793
+ case 4:
9753
9794
  dryRunResult = _context.v;
9754
9795
  if (dryRunResult.origin.success) {
9755
- _context.n = 4;
9796
+ _context.n = 5;
9756
9797
  break;
9757
9798
  }
9758
9799
  throw new DryRunFailedError(_objectSpread2(_objectSpread2({}, dryRunResult.origin.dryRunError), {}, {
9759
9800
  chainKind: 'origin',
9760
9801
  chain: chain
9761
9802
  }));
9762
- case 4:
9763
- originFeeEstimate = dryRunResult.origin.fee;
9764
- originFee = padValueBy(originFeeEstimate, FEE_PADDING_PERCENTAGE$1);
9765
- reserveFeeEstimate = getReserveFeeFromHops(dryRunResult.hops);
9766
- reserveFee = padValueBy(reserveFeeEstimate, FEE_PADDING_PERCENTAGE$1);
9767
- checkAmount(reserveFee);
9768
- _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;
9769
9809
  return createDirectExecuteXcm(_objectSpread2(_objectSpread2({}, internalOptions), {}, {
9770
9810
  fees: {
9771
9811
  originFee: originFee,
9772
- reserveFee: reserveFee
9812
+ reserveFee: reserveFee,
9813
+ destFee: destFee
9773
9814
  }
9774
9815
  }));
9775
- case 5:
9816
+ case 6:
9776
9817
  xcm = _context.v;
9777
- _context.n = 6;
9818
+ _context.n = 7;
9778
9819
  return api.getXcmWeight(xcm);
9779
- case 6:
9820
+ case 7:
9780
9821
  weight = _context.v;
9781
9822
  return _context.a(2, createExecuteCall(chain, xcm, weight));
9782
9823
  }
@@ -9956,12 +9997,13 @@ var isMultiHopSwap = function isMultiHopSwap(exchangeChain, assetFrom, assetTo)
9956
9997
  };
9957
9998
 
9958
9999
  var createExchangeInstructions = /*#__PURE__*/function () {
9959
- var _ref = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee(options, assetFrom, assetTo, hasSeparateFeeAsset) {
9960
- 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;
9961
10002
  return _regenerator().w(function (_context) {
9962
10003
  while (1) switch (_context.n) {
9963
10004
  case 0:
9964
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;
9965
10007
  nativeSymbol = getNativeAssetSymbol(exchangeChain);
9966
10008
  needsMultiHop = isMultiHopSwap(exchangeChain, assetInfoFrom, assetInfoTo);
9967
10009
  nativeAsset = api.findAssetInfoOrThrow(exchangeChain, {
@@ -9980,7 +10022,7 @@ var createExchangeInstructions = /*#__PURE__*/function () {
9980
10022
  }]);
9981
10023
  case 1:
9982
10024
  _context.n = 2;
9983
- return calculateMinAmountOut(BigInt(assetInfoFrom.amount) - (chain ? originReserveFee + exchangeFee : 0n), nativeAsset);
10025
+ return calculateMinAmountOut(BigInt(assetInfoFrom.amount) - (chain && !hasSeparateFeeAsset ? originReserveFee + exchangeFee : 0n), nativeAsset);
9984
10026
  case 2:
9985
10027
  nativeAmountOut = _context.v;
9986
10028
  assetNative = createAsset(version, exchangeFee === 0n ? (nativeAmountOut + 1n) / 2n : nativeAmountOut, localizeLocation(exchangeChain, nativeAsset.location));
@@ -9988,11 +10030,13 @@ var createExchangeInstructions = /*#__PURE__*/function () {
9988
10030
  ExchangeAsset: {
9989
10031
  give: createAssetsFilter(assetFrom, version),
9990
10032
  want: [assetNative],
9991
- maximal: false
10033
+ maximal: hasSeparateFeeAsset
9992
10034
  }
9993
10035
  }, {
9994
10036
  ExchangeAsset: {
9995
- give: createAssetsFilter(assetNative, version),
10037
+ give: separateFeeAssetInfo && isAssetEqual(separateFeeAssetInfo, nativeAsset) ? {
10038
+ Definite: [assetNative]
10039
+ } : createAssetsFilter(assetNative, version),
9996
10040
  want: [assetTo],
9997
10041
  maximal: true
9998
10042
  }
@@ -10007,19 +10051,18 @@ var createExchangeInstructions = /*#__PURE__*/function () {
10007
10051
  var createSwapExecuteXcm = /*#__PURE__*/function () {
10008
10052
  var _ref2 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee2(options) {
10009
10053
  var _ref3, _ref4;
10010
- 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;
10011
10055
  return _regenerator().w(function (_context2) {
10012
10056
  while (1) switch (_context2.n) {
10013
10057
  case 0:
10014
- 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;
10015
10059
  isEthereumDest = destChain !== undefined && isExternalChain(destChain); // For Ethereum destination, the actual hop target is AssetHub (bridge hub)
10016
10060
  resolvedDestChain = isEthereumDest ? "AssetHub".concat(getRelayChainOf(chain !== null && chain !== void 0 ? chain : exchangeChain)) : undefined;
10017
10061
  assetFrom = createAsset(version, assetInfoFrom.amount, localizeLocation(exchangeChain, assetInfoFrom.location));
10018
10062
  amountOut = assetInfoTo.amount;
10019
10063
  assetTo = createAsset(version, amountOut, localizeLocation(exchangeChain, assetInfoTo.location)); // For Ethereum, localize to AssetHub since that's where instructions execute
10020
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
10021
- ethBridgeFee = 0n; // Whether main asset IS DOT — no separate fee asset needed
10022
- isMainAssetDot = false;
10065
+ ethBridgeFee = 0n;
10023
10066
  if (!isEthereumDest) {
10024
10067
  _context2.n = 3;
10025
10068
  break;
@@ -10037,14 +10080,21 @@ var createSwapExecuteXcm = /*#__PURE__*/function () {
10037
10080
  bridgeFee = _yield$getParaEthTran2[0];
10038
10081
  executionFee = _yield$getParaEthTran2[1];
10039
10082
  ethBridgeFee = bridgeFee + executionFee;
10040
- isMainAssetDot = isAssetEqual(assetInfoFrom, nativeFeeAssetInfo);
10041
- if (!isMainAssetDot) {
10083
+ if (!isAssetEqual(assetInfoFrom, nativeFeeAssetInfo)) {
10042
10084
  ethFeeAssetInfo = nativeFeeAssetInfo;
10043
10085
  }
10044
10086
  case 3:
10045
10087
  // Ethereum fee asset takes precedence over user-provided feeAssetInfo
10046
- resolvedFeeAssetInfo = ethFeeAssetInfo !== null && ethFeeAssetInfo !== void 0 ? ethFeeAssetInfo : feeAssetInfo;
10047
- 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;
10048
10098
  _prepareCommonExecute = prepareCommonExecuteXcm({
10049
10099
  api: api,
10050
10100
  chain: chain !== null && chain !== void 0 ? chain : exchangeChain,
@@ -10054,13 +10104,14 @@ var createSwapExecuteXcm = /*#__PURE__*/function () {
10054
10104
  useJitWithdraw: isEthereumDest,
10055
10105
  recipient: recipient,
10056
10106
  fees: {
10057
- originFee: hasSeparateFeeAsset ? ethBridgeFee || originFee : originFee,
10058
- reserveFee: originReserveFee
10107
+ originFee: hasSeparateFeeAsset ? feeAssetBudget : originFee,
10108
+ reserveFee: 0n,
10109
+ destFee: 0n
10059
10110
  },
10060
10111
  version: version
10061
10112
  }, assetToLocalizedToDest), prefix = _prepareCommonExecute.prefix, depositInstruction = _prepareCommonExecute.depositInstruction;
10062
10113
  _context2.n = 4;
10063
- return createExchangeInstructions(options, assetFrom, assetTo, isEthereumDest && hasSeparateFeeAsset);
10114
+ return createExchangeInstructions(options, assetFrom, assetTo, resolvedFeeAssetInfo);
10064
10115
  case 4:
10065
10116
  exchangeInstructions = _context2.v;
10066
10117
  if (!isEthereumDest) {
@@ -10088,13 +10139,9 @@ var createSwapExecuteXcm = /*#__PURE__*/function () {
10088
10139
  destChain: resolvedDestChain,
10089
10140
  assetInfo: assetInfoTo,
10090
10141
  feeAssetInfo: ethFeeAssetInfo,
10091
- useFeeAssetOnHops: hasSeparateFeeAsset,
10092
10142
  paraIdTo: getParaId(resolvedDestChain),
10093
10143
  version: version,
10094
- fees: {
10095
- originFee: hasSeparateFeeAsset ? ethBridgeFee : 0n,
10096
- reserveFee: destReserveFee
10097
- },
10144
+ fees: createLegFees(destReserveFee, destFee),
10098
10145
  suffixXcm: snowbridgeInstructions
10099
10146
  });
10100
10147
  _context2.n = 7;
@@ -10106,13 +10153,10 @@ var createSwapExecuteXcm = /*#__PURE__*/function () {
10106
10153
  chain: exchangeChain,
10107
10154
  destChain: destChain,
10108
10155
  assetInfo: assetInfoTo,
10156
+ feeAssetInfo: resolvedFeeAssetInfo,
10109
10157
  paraIdTo: paraIdTo,
10110
10158
  version: version,
10111
- // Deal with this after feeAsset is supported
10112
- fees: {
10113
- originFee: 0n,
10114
- reserveFee: destReserveFee
10115
- },
10159
+ fees: createLegFees(destReserveFee, destFee),
10116
10160
  suffixXcm: [depositInstruction]
10117
10161
  });
10118
10162
  } else {
@@ -10124,14 +10168,10 @@ var createSwapExecuteXcm = /*#__PURE__*/function () {
10124
10168
  chain: chain,
10125
10169
  destChain: exchangeChain,
10126
10170
  assetInfo: assetInfoFrom,
10127
- feeAssetInfo: ethFeeAssetInfo,
10128
- useFeeAssetOnHops: hasSeparateFeeAsset,
10171
+ feeAssetInfo: resolvedFeeAssetInfo,
10129
10172
  paraIdTo: getParaId(exchangeChain),
10130
10173
  version: version,
10131
- fees: {
10132
- originFee: hasSeparateFeeAsset ? ethBridgeFee : 0n,
10133
- reserveFee: originReserveFee
10134
- },
10174
+ fees: createLegFees(originReserveFee, exchangeFee),
10135
10175
  suffixXcm: [].concat(_toConsumableArray(exchangeInstructions), _toConsumableArray(exchangeToDestXcm))
10136
10176
  }) : [].concat(_toConsumableArray(exchangeInstructions), _toConsumableArray(exchangeToDestXcm));
10137
10177
  fullXcm = [].concat(_toConsumableArray(prefix), _toConsumableArray(finalXcm));
@@ -10197,12 +10237,14 @@ var findExchangeHopIndex = function findExchangeHopIndex(chain, dryRunResult, ex
10197
10237
  return index;
10198
10238
  };
10199
10239
  var extractFeesFromDryRun = function extractFeesFromDryRun(chain, exchangeChain, dryRunResult, exchangeHopIndex, destChain) {
10240
+ var _dryRunResult$destina;
10200
10241
  var requireHopsSuccess = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : false;
10201
10242
  var fees = {
10202
10243
  originFee: 0n,
10203
10244
  originReserveFee: 0n,
10204
10245
  exchangeFee: 0n,
10205
- destReserveFee: 0n
10246
+ destReserveFee: 0n,
10247
+ destFee: 0n
10206
10248
  };
10207
10249
  var hops = dryRunResult.hops;
10208
10250
  // Handle exchange fee
@@ -10282,6 +10324,9 @@ var extractFeesFromDryRun = function extractFeesFromDryRun(chain, exchangeChain,
10282
10324
  fees.destReserveFee = padValueBy(hopAfterExchange.result.fee, FEE_PADDING_PERCENTAGE);
10283
10325
  }
10284
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
+ }
10285
10330
  return fees;
10286
10331
  };
10287
10332
  var createXcmAndCall = /*#__PURE__*/function () {
@@ -10325,8 +10370,8 @@ var createXcmAndCall = /*#__PURE__*/function () {
10325
10370
  }();
10326
10371
  var handleSwapExecuteTransfer = /*#__PURE__*/function () {
10327
10372
  var _ref3 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee3(options) {
10328
- var _firstDryRunResult$dr;
10329
- 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;
10330
10375
  return _regenerator().w(function (_context3) {
10331
10376
  while (1) switch (_context3.n) {
10332
10377
  case 0:
@@ -10337,9 +10382,10 @@ var handleSwapExecuteTransfer = /*#__PURE__*/function () {
10337
10382
  case 1:
10338
10383
  validateAmount(assetFrom.amount, MIN_FEE);
10339
10384
  version = pickRouterCompatibleXcmVersion(api, chain, exchangeChain, destChain);
10340
- 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
10341
10387
  // (no separate fee asset needed). Only skip fee validation when currencies differ.
10342
- 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)));
10343
10389
  internalOptions = _objectSpread2(_objectSpread2({}, options), {}, {
10344
10390
  version: version,
10345
10391
  paraIdTo: getParaId(destChain !== null && destChain !== void 0 ? destChain : exchangeChain)
@@ -10366,12 +10412,14 @@ var handleSwapExecuteTransfer = /*#__PURE__*/function () {
10366
10412
  useRootOrigin: true
10367
10413
  };
10368
10414
  FEE_ASSET_AMOUNT = 100;
10369
- 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;
10370
10417
  fees = {
10371
- originFee: dummyOriginFee,
10372
- originReserveFee: MIN_FEE,
10373
- exchangeFee: 0n,
10374
- 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
10375
10423
  };
10376
10424
  totalFeesPre = calculateTotalFees(chain, fees);
10377
10425
  if (!hasSeparateFeeAsset) {
@@ -10396,14 +10444,20 @@ var handleSwapExecuteTransfer = /*#__PURE__*/function () {
10396
10444
  case 3:
10397
10445
  firstDryRunResult = _context3.v;
10398
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) {
10399
10451
  _context3.n = 4;
10400
10452
  break;
10401
10453
  }
10402
- throw new AmountTooLowError("Asset amount is too low to cover the fees, please increase the amount.");
10454
+ throw new DryRunFailedError(firstDryRunResult.dryRunError);
10403
10455
  case 4:
10456
+ throw new AmountTooLowError("Asset amount is too low to cover the fees, please increase the amount.");
10457
+ case 5:
10404
10458
  exchangeHopIndex = findExchangeHopIndex(chain, firstDryRunResult, exchangeChain, destChain);
10405
10459
  extractedFees = extractFeesFromDryRun(chain, exchangeChain, firstDryRunResult, exchangeHopIndex, destChain, false); // Set originFee from dry run origin fee (padded), same as handleExecuteTransfer
10406
- 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;
10407
10461
  if (extractedFees.exchangeFee === 0n) {
10408
10462
  // We set the exchange fee to non-zero value to prevent creating dummy tx
10409
10463
  extractedFees.exchangeFee = MIN_FEE;
@@ -10414,26 +10468,26 @@ var handleSwapExecuteTransfer = /*#__PURE__*/function () {
10414
10468
  }
10415
10469
  updatedAssetTo = assetTo;
10416
10470
  if (!chain) {
10417
- _context3.n = 6;
10471
+ _context3.n = 7;
10418
10472
  break;
10419
10473
  }
10420
10474
  // When fees are paid from a separate asset (e.g. DOT for Ethereum),
10421
10475
  // the full main asset amount is available for the swap
10422
10476
  amountAvailableForSwap = hasSeparateFeeAsset ? assetFrom.amount : assetFrom.amount - totalFees;
10423
- _context3.n = 5;
10477
+ _context3.n = 6;
10424
10478
  return calculateMinAmountOut(amountAvailableForSwap);
10425
- case 5:
10479
+ case 6:
10426
10480
  recalculatedMinAmountOut = _context3.v;
10427
10481
  updatedAssetTo = _objectSpread2(_objectSpread2({}, assetTo), {}, {
10428
10482
  amount: recalculatedMinAmountOut
10429
10483
  });
10430
- case 6:
10431
- _context3.n = 7;
10484
+ case 7:
10485
+ _context3.n = 8;
10432
10486
  return createXcmAndCall(_objectSpread2(_objectSpread2({}, internalOptions), {}, {
10433
10487
  assetInfoTo: updatedAssetTo,
10434
10488
  fees: extractedFees
10435
10489
  }), firstDryRunResult.origin.success ? firstDryRunResult.origin.weight : undefined);
10436
- case 7:
10490
+ case 8:
10437
10491
  _yield$createXcmAndCa2 = _context3.v;
10438
10492
  finalCall = _yield$createXcmAndCa2.call;
10439
10493
  return _context3.a(2, api.deserializeExtrinsics(finalCall));
@@ -10763,7 +10817,7 @@ var AssetHubPolkadot = /*#__PURE__*/function (_SubstrateChain) {
10763
10817
  var nativeAsset = api.findNativeAssetInfoOrThrow(this.chain);
10764
10818
  var isNativeAsset = isAssetEqual(nativeAsset, assetInfo);
10765
10819
  var isNativeFeeAsset = isAssetEqual(nativeAsset, feeAssetInfo);
10766
- return !isNativeAsset || !isNativeFeeAsset;
10820
+ return (!isNativeAsset || !isNativeFeeAsset) && hasMatchingFeeAssetReserve(api, this.chain, assetInfo, feeAssetInfo);
10767
10821
  }
10768
10822
  }, {
10769
10823
  key: "transferPolkadotXCM",
@@ -10974,6 +11028,14 @@ var Hydration = /*#__PURE__*/function (_SubstrateChain) {
10974
11028
  useIdPrefix: false
10975
11029
  };
10976
11030
  }
11031
+ }, {
11032
+ key: "mint",
11033
+ value: function mint(api, address, assetInfo, balance) {
11034
+ if (assetInfo.erc20) {
11035
+ return Promise.resolve(buildErc20StorageMint(api, address, assetInfo, assetInfo.erc20, balance + assetInfo.amount));
11036
+ }
11037
+ return _superPropGet(Hydration, "mint", this, 3)([api, address, assetInfo, balance]);
11038
+ }
10977
11039
  }, {
10978
11040
  key: "shouldUseExecuteTransfer",
10979
11041
  value: function shouldUseExecuteTransfer(input) {
@@ -10985,7 +11047,7 @@ var Hydration = /*#__PURE__*/function (_SubstrateChain) {
10985
11047
  var nativeAsset = api.findNativeAssetInfoOrThrow(this.chain);
10986
11048
  var isNativeAsset = isAssetEqual(nativeAsset, asset);
10987
11049
  var isNativeFeeAsset = isAssetEqual(nativeAsset, feeAsset);
10988
- return !isNativeAsset || !isNativeFeeAsset;
11050
+ return (!isNativeAsset || !isNativeFeeAsset) && hasMatchingFeeAssetReserve(api, this.chain, asset, feeAsset);
10989
11051
  }
10990
11052
  }, {
10991
11053
  key: "transferPolkadotXCM",
@@ -11041,6 +11103,12 @@ var Hydration = /*#__PURE__*/function (_SubstrateChain) {
11041
11103
  }
11042
11104
  }));
11043
11105
  }
11106
+ }, {
11107
+ key: "getBalanceForeign",
11108
+ value: function getBalanceForeign(api, address, asset) {
11109
+ if (!asset.erc20) return _superPropGet(Hydration, "getBalanceForeign", this, 3)([api, address, asset]);
11110
+ return getPalletInstance('Currencies').getBalance(api, address, asset);
11111
+ }
11044
11112
  }, {
11045
11113
  key: "transferLocalNonNativeAsset",
11046
11114
  value: function transferLocalNonNativeAsset(options) {
@@ -11048,9 +11116,22 @@ var Hydration = /*#__PURE__*/function (_SubstrateChain) {
11048
11116
  asset = options.assetInfo,
11049
11117
  recipient = options.recipient,
11050
11118
  isAmountAll = options.isAmountAll,
11051
- keepAlive = options.keepAlive;
11119
+ keepAlive = options.keepAlive,
11120
+ balance = options.balance;
11052
11121
  assertHasId(asset);
11053
11122
  var currencyId = Number(asset.assetId);
11123
+ if (asset.erc20) {
11124
+ var amount = isAmountAll ? balance - (keepAlive ? getEdFromAssetOrThrow(asset) : 0n) : asset.amount;
11125
+ return api.deserializeExtrinsics({
11126
+ module: 'Currencies',
11127
+ method: 'transfer',
11128
+ params: {
11129
+ dest: recipient,
11130
+ currency_id: currencyId,
11131
+ amount: amount
11132
+ }
11133
+ });
11134
+ }
11054
11135
  if (isAmountAll) {
11055
11136
  return api.deserializeExtrinsics({
11056
11137
  module: 'Tokens',
@@ -11725,7 +11806,9 @@ var EnergyWebX = /*#__PURE__*/function (_SubstrateChain) {
11725
11806
  scenario: scenario
11726
11807
  });
11727
11808
  }
11728
- return transferPolkadotXcm(input, 'limited_reserve_transfer_assets', 'Unlimited');
11809
+ // EnergyWebX has to stay on reserve_transfer_assets for now.
11810
+ // limited_reserve_transfer_assets causes 'Extrinsic is now allowed error'
11811
+ return transferPolkadotXcm(input, 'reserve_transfer_assets');
11729
11812
  }
11730
11813
  }, {
11731
11814
  key: "isRelayToParaEnabled",
@@ -12575,6 +12658,10 @@ var DEFAULT_TTL_MS = 60000; // 1 minute
12575
12658
  var MAX_CLIENTS = 100;
12576
12659
  var EXTENSION_MS = 5 * 60000; // 5 minutes
12577
12660
  var MAX_U64 = (1n << 64n) - 1n;
12661
+ var MIN_WEIGHT = {
12662
+ proofSize: 1n,
12663
+ refTime: 1n
12664
+ };
12578
12665
  var MAX_WEIGHT = {
12579
12666
  proofSize: MAX_U64,
12580
12667
  refTime: MAX_U64
@@ -12767,6 +12854,39 @@ var formatAssetIdToERC20 = function formatAssetIdToERC20(id) {
12767
12854
  return "0xffffffff".concat(BigInt(id).toString(16).padStart(32, '0'));
12768
12855
  };
12769
12856
 
12857
+ // twox128("EVM") ++ twox128("AccountStorages") — the pallet_evm::AccountStorages storage prefix.
12858
+ var ACCOUNT_STORAGES_PREFIX = '1da53b775b270400e7e61ed5cbc5a146ab1160471b1418779239ba8e2b847e42';
12859
+ // "ETH\0" — prefix of account ids that Hydration derives from an EVM address
12860
+ var EVM_ACCOUNT_PREFIX = '45544800';
12861
+ var word = function word(hex) {
12862
+ return hex.padStart(64, '0');
12863
+ };
12864
+ var blake2128Concat = function blake2128Concat(hex) {
12865
+ return bytesToHex(blake2b(hexToBytes(hex), {
12866
+ dkLen: 16
12867
+ })) + hex;
12868
+ };
12869
+ // Mirrors pallet_evm_accounts::evm_address
12870
+ var toEvmAddress = function toEvmAddress(accountId) {
12871
+ return accountId.startsWith(EVM_ACCOUNT_PREFIX) && accountId.endsWith('0'.repeat(16)) ? accountId.slice(8, 48) : accountId.slice(0, 40);
12872
+ };
12873
+ var buildErc20StorageMint = function buildErc20StorageMint(api, address, asset, erc20, balance) {
12874
+ var _erc20$contract, _getJunctionValue;
12875
+ var contract = (_erc20$contract = erc20.contract) !== null && _erc20$contract !== void 0 ? _erc20$contract : (_getJunctionValue = getJunctionValue(asset.location, 'AccountKey20')) === null || _getJunctionValue === void 0 ? void 0 : _getJunctionValue.key;
12876
+ if (!contract) throw new InvalidCurrencyError("Missing ERC20 contract for asset ".concat(asset.symbol));
12877
+ var evmAddress = toEvmAddress(bytesToHex(api.accountToUint8a(address)));
12878
+ var slotKey = bytesToHex(keccak_256(hexToBytes(word(evmAddress) + word(erc20.balanceSlot.toString(16)))));
12879
+ return {
12880
+ balanceTx: {
12881
+ module: 'System',
12882
+ method: 'set_storage',
12883
+ params: {
12884
+ items: [['0x' + ACCOUNT_STORAGES_PREFIX + blake2128Concat(contract.slice(2)) + blake2128Concat(slotKey), '0x' + word(balance.toString(16))]]
12885
+ }
12886
+ }
12887
+ };
12888
+ };
12889
+
12770
12890
  var maybeOverrideAssets = function maybeOverrideAssets(version, amount, assets, overriddenCurrency) {
12771
12891
  if (!overriddenCurrency) {
12772
12892
  return assets;
@@ -12797,39 +12917,98 @@ var pickOtherMintPallet = function pickOtherMintPallet(asset, pallets) {
12797
12917
  return pallets[0];
12798
12918
  };
12799
12919
 
12800
- var isHere = function isHere(loc) {
12801
- var _loc$interior;
12802
- 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;
12803
13008
  };
12804
13009
  var sortAssets = function sortAssets(assets) {
12805
13010
  return assets.sort(function (a, b) {
12806
- var aLoc = extractAssetLocation(a);
12807
- var bLoc = extractAssetLocation(b);
12808
- // 1. Sort by parents first
12809
- if (aLoc.parents !== bLoc.parents) {
12810
- return Number(aLoc.parents) - Number(bLoc.parents);
12811
- }
12812
- // 2. If parents are equal, use priority function
12813
- var aIsHere = isHere(aLoc);
12814
- var bIsHere = isHere(bLoc);
12815
- var aHasGlobal = hasJunction(aLoc, 'GlobalConsensus');
12816
- var bHasGlobal = hasJunction(bLoc, 'GlobalConsensus');
12817
- var aGeneralIndex = getJunctionValue(aLoc, 'GeneralIndex');
12818
- var bGeneralIndex = getJunctionValue(bLoc, 'GeneralIndex');
12819
- var getPriority = function getPriority(isHere, hasGlobal) {
12820
- if (isHere) return 0;
12821
- if (hasGlobal) return 2;
12822
- return 1;
12823
- };
12824
- var aPriority = getPriority(aIsHere, aHasGlobal);
12825
- var bPriority = getPriority(bIsHere, bHasGlobal);
12826
- if (aPriority !== bPriority) return aPriority - bPriority;
12827
- if (aGeneralIndex === undefined && bGeneralIndex === undefined) return 0;
12828
- if (aGeneralIndex === undefined) return 1;
12829
- if (bGeneralIndex === undefined) return -1;
12830
- var aIndex = BigInt(aGeneralIndex);
12831
- var bIndex = BigInt(bGeneralIndex);
12832
- return aIndex < bIndex ? -1 : aIndex > bIndex ? 1 : 0;
13011
+ return compareLocationOrder(extractAssetLocation(a), extractAssetLocation(b));
12833
13012
  });
12834
13013
  };
12835
13014
 
@@ -12886,6 +13065,7 @@ var createSwapBuilder = function createSwapBuilder(options) {
12886
13065
  var from = options.from,
12887
13066
  to = options.to,
12888
13067
  currency = options.currency,
13068
+ feeAsset = options.feeAsset,
12889
13069
  _options$swapOptions = options.swapOptions,
12890
13070
  currencyTo = _options$swapOptions.currencyTo,
12891
13071
  evmSenderAddress = _options$swapOptions.evmSenderAddress,
@@ -12900,7 +13080,7 @@ var createSwapBuilder = function createSwapBuilder(options) {
12900
13080
  if (Array.isArray(currency)) {
12901
13081
  throw new UnsupportedOperationError('Swaps with multiple currencies are not supported.');
12902
13082
  }
12903
- 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());
12904
13084
  if (onStatusChange) {
12905
13085
  builder = builder.onStatusChange(onStatusChange);
12906
13086
  }
@@ -13079,6 +13259,25 @@ var createChainClient = /*#__PURE__*/function () {
13079
13259
  };
13080
13260
  }();
13081
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
+
13082
13281
  var getErrorInstruction = function getErrorInstruction(message, index) {
13083
13282
  if (index === undefined || _typeof(message) !== 'object' || message === null) {
13084
13283
  return undefined;
@@ -13589,30 +13788,37 @@ var PolkadotApi = /*#__PURE__*/function () {
13589
13788
  case 0:
13590
13789
  clientTtlMs = _args.length > 1 && _args[1] !== undefined ? _args[1] : DEFAULT_TTL_MS;
13591
13790
  destination = _args.length > 2 ? _args[2] : undefined;
13592
- if (!(this._chain !== undefined || isExternalChain(chain))) {
13791
+ if (!(this._chain === chain || isExternalChain(chain))) {
13593
13792
  _context.n = 1;
13594
13793
  break;
13595
13794
  }
13596
13795
  return _context.a(2);
13597
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:
13598
13804
  this._ttlMs = clientTtlMs;
13599
13805
  this._chain = chain;
13600
- _context.n = 2;
13806
+ _context.n = 3;
13601
13807
  return resolveChainApi(this._config, chain, function (wsUrl) {
13602
13808
  return _this.leaseClient(wsUrl, _this._ttlMs);
13603
13809
  }, this._customCtx);
13604
- case 2:
13810
+ case 3:
13605
13811
  this._api = _context.v;
13606
- _context.n = 3;
13812
+ _context.n = 4;
13607
13813
  return this.maybeHydrateCustomChain(chain);
13608
- case 3:
13814
+ case 4:
13609
13815
  if (!(typeof destination === 'string' && isCustomChain(destination))) {
13610
- _context.n = 4;
13816
+ _context.n = 5;
13611
13817
  break;
13612
13818
  }
13613
- _context.n = 4;
13819
+ _context.n = 5;
13614
13820
  return this.hydrateCustomChain(destination);
13615
- case 4:
13821
+ case 5:
13616
13822
  return _context.a(2);
13617
13823
  }
13618
13824
  }, _callee, this);
@@ -13627,6 +13833,11 @@ var PolkadotApi = /*#__PURE__*/function () {
13627
13833
  value: function setCustomCtx(ctx) {
13628
13834
  this._customCtx = ctx;
13629
13835
  }
13836
+ }, {
13837
+ key: "resetChain",
13838
+ value: function resetChain() {
13839
+ this._chain = undefined;
13840
+ }
13630
13841
  }, {
13631
13842
  key: "hydrateCustomChain",
13632
13843
  value: function () {
@@ -13941,4 +14152,4 @@ var createClientCache = function createClientCache(maxSize, pingClient, onEvicti
13941
14152
  };
13942
14153
  };
13943
14154
 
13944
- 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, 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 };