@paraspell/sdk-core 8.6.1 → 8.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.mjs CHANGED
@@ -714,6 +714,8 @@ var NODES_WITH_RELAY_CHAINS_DOT_KSM = [].concat(NODE_NAMES_DOT_KSM, ['Polkadot',
714
714
  * Supported XCM pallets.
715
715
  */
716
716
  var SUPPORTED_PALLETS = ['XTokens', 'OrmlXTokens', 'PolkadotXcm', 'RelayerXcm', 'XTransfer', 'XcmPallet'];
717
+ var SYSTEM_NODES_POLKADOT = ['PeoplePolkadot', 'CoretimePolkadot', 'Collectives'];
718
+ var SYSTEM_NODES_KUSAMA = ['PeopleKusama', 'CoretimeKusama'];
717
719
 
718
720
  /**
719
721
  * Error thrown when multiple assets with the same symbol are found.
@@ -2360,7 +2362,10 @@ var constructRelayToParaParameters = function constructRelayToParaParameters(_re
2360
2362
  return _objectSpread2({
2361
2363
  dest: createPolkadotXcmHeader('RelayToPara', version, destination, paraId),
2362
2364
  beneficiary: generateAddressPayload(api, 'RelayToPara', null, address, version, paraId),
2363
- assets: createCurrencySpec(asset.amount, version, Parents.ZERO),
2365
+ assets: createVersionedMultiAssets(version, asset.amount, {
2366
+ parents: Parents.ZERO,
2367
+ interior: 'Here'
2368
+ }),
2364
2369
  fee_asset_item: DEFAULT_FEE_ASSET
2365
2370
  }, includeFee && {
2366
2371
  weight_limit: 'Unlimited'
@@ -2373,21 +2378,6 @@ var isTMultiLocation = function isTMultiLocation(value) {
2373
2378
  var isTMultiAsset = function isTMultiAsset(value) {
2374
2379
  return _typeof(value) === 'object' && value !== null && 'id' in value && 'fun' in value;
2375
2380
  };
2376
- var createBridgeCurrencySpec = function createBridgeCurrencySpec(amount, ecosystem) {
2377
- return _defineProperty({}, Version.V4, [{
2378
- id: {
2379
- parents: Parents.TWO,
2380
- interior: {
2381
- X1: [{
2382
- GlobalConsensus: ecosystem
2383
- }]
2384
- }
2385
- },
2386
- fun: {
2387
- Fungible: amount.toString()
2388
- }
2389
- }]);
2390
- };
2391
2381
  var createMultiAsset = function createMultiAsset(version, amount, multiLocation) {
2392
2382
  if (version === Version.V4) {
2393
2383
  return {
@@ -2409,22 +2399,27 @@ var createMultiAsset = function createMultiAsset(version, amount, multiLocation)
2409
2399
  var addXcmVersionHeader = function addXcmVersionHeader(obj, version) {
2410
2400
  return _defineProperty({}, version, obj);
2411
2401
  };
2412
- var getCurrency = function getCurrency(amount, version, parents, overriddenCurrency) {
2413
- var interior = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 'Here';
2402
+ var extractVersionFromHeader = function extractVersionFromHeader(versionHeader) {
2403
+ var keys = Object.keys(versionHeader);
2404
+ if (keys.length !== 1) {
2405
+ throw new Error('Invalid version header: expected exactly one key.');
2406
+ }
2407
+ var version = keys[0];
2408
+ var value = versionHeader[version];
2409
+ if (value === undefined) {
2410
+ throw new Error('Invalid version header: value is undefined.');
2411
+ }
2412
+ return [version, value];
2413
+ };
2414
+ var maybeOverrideMultiAssets = function maybeOverrideMultiAssets(version, amount, multiAssets, overriddenCurrency) {
2414
2415
  if (!overriddenCurrency) {
2415
- return [createMultiAsset(version, amount, {
2416
- parents: parents,
2417
- interior: interior
2418
- })];
2416
+ return multiAssets;
2419
2417
  }
2420
- return isTMultiLocation(overriddenCurrency) ? [createMultiAsset(version, amount, overriddenCurrency)] :
2421
- // It must be TMultiAsset if not TMultiLocation
2422
- overriddenCurrency;
2418
+ return isTMultiLocation(overriddenCurrency) ? [createMultiAsset(version, amount, overriddenCurrency)] : overriddenCurrency;
2423
2419
  };
2424
- var createCurrencySpec = function createCurrencySpec(amount, version, parents, overriddenCurrency) {
2425
- var interior = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 'Here';
2426
- var currency = getCurrency(amount, version, parents, overriddenCurrency, interior);
2427
- return addXcmVersionHeader(currency, version);
2420
+ var createVersionedMultiAssets = function createVersionedMultiAssets(version, amount, multiLocation) {
2421
+ var multiAssets = createMultiAsset(version, amount, multiLocation);
2422
+ return addXcmVersionHeader([multiAssets], version);
2428
2423
  };
2429
2424
  var createPolkadotXcmHeader = function createPolkadotXcmHeader(scenario, version, destination, nodeId, junction, parents) {
2430
2425
  var parentsResolved = parents !== null && parents !== void 0 ? parents : scenario === 'RelayToPara' ? Parents.ZERO : Parents.ONE;
@@ -2466,20 +2461,81 @@ var resolveTNodeFromMultiLocation = function resolveTNodeFromMultiLocation(relay
2466
2461
  return node;
2467
2462
  };
2468
2463
  var throwUnsupportedCurrency = function throwUnsupportedCurrency(currency, node) {
2469
- var _ref4 = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {
2464
+ var _ref3 = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {
2470
2465
  isDestination: false
2471
2466
  },
2472
- isDestination = _ref4.isDestination;
2467
+ isDestination = _ref3.isDestination;
2473
2468
  if ('multilocation' in currency) {
2474
2469
  throw new InvalidCurrencyError("\n Selected chain doesn't support multilocation you provided. Maybe you meant custom multilocation. If so, you need to use override option. Your selection should look like this: {multilocation: Override(".concat(JSON.stringify(currency.multilocation), ")}."));
2475
2470
  }
2476
2471
  throw new InvalidCurrencyError("".concat(isDestination ? 'Destination' : 'Origin', " node ").concat(node, " does not support currency ").concat(JSON.stringify(currency), "."));
2477
2472
  };
2478
2473
 
2474
+ var isPrimitive = function isPrimitive(obj) {
2475
+ return obj !== Object(obj);
2476
+ };
2477
+ var _deepEqual = function deepEqual(obj1, obj2) {
2478
+ if (obj1 === obj2) return true;
2479
+ if (isPrimitive(obj1) && isPrimitive(obj2)) return obj1 === obj2;
2480
+ if (_typeof(obj1) !== 'object' || obj1 === null || _typeof(obj2) !== 'object' || obj2 === null) {
2481
+ return false;
2482
+ }
2483
+ if (Array.isArray(obj1) !== Array.isArray(obj2)) {
2484
+ return false;
2485
+ }
2486
+ var obj1Keys = Object.keys(obj1).map(function (key) {
2487
+ return key.toLowerCase();
2488
+ });
2489
+ var obj2Keys = Object.keys(obj2).map(function (key) {
2490
+ return key.toLowerCase();
2491
+ });
2492
+ if (obj1Keys.length !== obj2Keys.length) return false;
2493
+ var _iterator = _createForOfIteratorHelper(obj1Keys),
2494
+ _step;
2495
+ try {
2496
+ var _loop = function _loop() {
2497
+ var key = _step.value;
2498
+ var keyInObj2 = obj2Keys.find(function (k) {
2499
+ return k === key;
2500
+ });
2501
+ if (!keyInObj2) return {
2502
+ v: false
2503
+ };
2504
+ var obj1Value = obj1[Object.keys(obj1).find(function (k) {
2505
+ return k.toLowerCase() === key;
2506
+ })];
2507
+ var obj2Value = obj2[Object.keys(obj2).find(function (k) {
2508
+ return k.toLowerCase() === key;
2509
+ })];
2510
+ if (!_deepEqual(obj1Value, obj2Value)) return {
2511
+ v: false
2512
+ };
2513
+ },
2514
+ _ret;
2515
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
2516
+ _ret = _loop();
2517
+ if (_ret) return _ret.v;
2518
+ }
2519
+ } catch (err) {
2520
+ _iterator.e(err);
2521
+ } finally {
2522
+ _iterator.f();
2523
+ }
2524
+ return true;
2525
+ };
2526
+
2479
2527
  var isForeignAsset = function isForeignAsset(asset) {
2480
2528
  return _typeof(asset) === 'object' && asset !== null && ('assetId' in asset || 'multiLocation' in asset) && !('isNative' in asset);
2481
2529
  };
2482
2530
 
2531
+ var isAssetEqual = function isAssetEqual(asset1, asset2) {
2532
+ var ml1 = asset1.multiLocation;
2533
+ var ml2 = asset2.multiLocation;
2534
+ if (ml1 && ml2 && _deepEqual(ml1, ml2)) return true;
2535
+ if (isForeignAsset(asset1) && isForeignAsset(asset2) && asset1.assetId === asset2.assetId) return true;
2536
+ return asset1.symbol.toLowerCase() === asset2.symbol.toLowerCase();
2537
+ };
2538
+
2483
2539
  var isSymbolSpecifier = function isSymbolSpecifier(currencySymbolValue) {
2484
2540
  return _typeof(currencySymbolValue) === 'object' && 'type' in currencySymbolValue && 'value' in currencySymbolValue;
2485
2541
  };
@@ -2535,19 +2591,21 @@ var buildMultiLocation = function buildMultiLocation(_ref) {
2535
2591
  }
2536
2592
  };
2537
2593
  var getModifiedCurrencySelection = function getModifiedCurrencySelection(version, input) {
2538
- var amount = input.asset.amount;
2594
+ var amount = input.asset.amount,
2595
+ overriddenAsset = input.overriddenAsset;
2596
+ if (overriddenAsset) {
2597
+ return addXcmVersionHeader(maybeOverrideMultiAssets(version, amount, [], overriddenAsset), version);
2598
+ }
2539
2599
  var multiLocation = buildMultiLocation(input);
2540
2600
  var multiAsset = createMultiAsset(version, amount, multiLocation);
2541
2601
  return addXcmVersionHeader(multiAsset, version);
2542
2602
  };
2543
2603
 
2544
- var getCurrencySelection = function getCurrencySelection(input, isAssetHub, currencySelection) {
2545
- var origin = input.origin,
2546
- overriddenAsset = input.overriddenAsset;
2604
+ var getCurrencySelection = function getCurrencySelection(input, useMultiAssets, currencySelection) {
2605
+ var origin = input.origin;
2547
2606
  var _getNode = getNode(origin),
2548
2607
  version = _getNode.version;
2549
- if (overriddenAsset !== undefined) return addXcmVersionHeader(overriddenAsset, version);
2550
- if (isAssetHub) {
2608
+ if (useMultiAssets) {
2551
2609
  return getModifiedCurrencySelection(version, input);
2552
2610
  }
2553
2611
  return currencySelection;
@@ -2555,11 +2613,11 @@ var getCurrencySelection = function getCurrencySelection(input, isAssetHub, curr
2555
2613
 
2556
2614
  var getXTokensParameters = function getXTokensParameters(isMultiAssetTransfer, currencySelection, addressSelection, amount, fees, overriddenAsset) {
2557
2615
  if (isMultiAssetTransfer) {
2558
- var isMultiAsset = overriddenAsset && !isTMultiLocation(overriddenAsset);
2559
- var feeAssetIndex = isMultiAsset ? overriddenAsset.findIndex(function (asset) {
2616
+ var isOverridenMultiAssets = overriddenAsset && !isTMultiLocation(overriddenAsset);
2617
+ var feeAssetIndex = isOverridenMultiAssets ? overriddenAsset.findIndex(function (asset) {
2560
2618
  return asset.isFeeAsset;
2561
2619
  }) : undefined;
2562
- return _objectSpread2(_objectSpread2(_defineProperty({}, isMultiAsset ? 'assets' : 'asset', currencySelection), isMultiAsset && {
2620
+ return _objectSpread2(_objectSpread2(_defineProperty({}, isOverridenMultiAssets ? 'assets' : 'asset', currencySelection), isOverridenMultiAssets && {
2563
2621
  fee_item: feeAssetIndex
2564
2622
  }), {}, {
2565
2623
  dest: addressSelection,
@@ -2599,10 +2657,10 @@ var XTokensTransferImpl = /*#__PURE__*/function () {
2599
2657
  var isAssetHubDest = destination === 'AssetHubPolkadot' || destination === 'AssetHubKusama';
2600
2658
  var isAstarOrShidenToRelay = scenario === 'ParaToRelay' && (origin === 'Astar' || origin === 'Shiden');
2601
2659
  var isTuring = origin === 'Turing';
2602
- var isMultiAsset = overriddenAsset && !isTMultiLocation(overriddenAsset);
2603
- var shouldUseMultiasset = isTuring || isAstarOrShidenToRelay || isAssetHubDest && !isBifrostOrigin || !!isMultiAsset;
2660
+ var isOverridenMultiAssets = overriddenAsset && !isTMultiLocation(overriddenAsset);
2661
+ var shouldUseMultiasset = isTuring || isAstarOrShidenToRelay || isAssetHubDest && !isBifrostOrigin || !!isOverridenMultiAssets;
2604
2662
  var modifiedCurrencySelection = getCurrencySelection(input, shouldUseMultiasset, currencySelection);
2605
- var section = shouldUseMultiasset ? isMultiAsset ? 'transfer_multiassets' : 'transfer_multiasset' : 'transfer';
2663
+ var section = shouldUseMultiasset ? isOverridenMultiAssets ? 'transfer_multiassets' : 'transfer_multiasset' : 'transfer';
2606
2664
  var parameters = getXTokensParameters(shouldUseMultiasset, modifiedCurrencySelection, addressSelection, asset.amount, fees, overriddenAsset);
2607
2665
  var call = {
2608
2666
  module: pallet !== null && pallet !== void 0 ? pallet : 'XTokens',
@@ -3669,6 +3727,14 @@ var resolveAsset = function resolveAsset(currency, origin, destination, assetChe
3669
3727
  return assetCheckEnabled ? getAssetBySymbolOrId(origin, currency, !isTMultiLocation(destination) ? destination : null) : null;
3670
3728
  };
3671
3729
 
3730
+ var resolveFeeAsset = function resolveFeeAsset(feeAsset, origin, destination) {
3731
+ var asset = getAssetBySymbolOrId(origin, feeAsset, !isTMultiLocation(destination) ? destination : null);
3732
+ if (!asset) {
3733
+ throwUnsupportedCurrency(feeAsset, origin);
3734
+ }
3735
+ return asset !== null && asset !== void 0 ? asset : undefined;
3736
+ };
3737
+
3672
3738
  var AssetHubPolkadot$2 = {
3673
3739
  defaultPallet: "PolkadotXcm",
3674
3740
  supportedPallets: [
@@ -4477,7 +4543,7 @@ var getSupportedPalletsDetails = function getSupportedPalletsDetails(node) {
4477
4543
  return palletsMap[node].supportedPallets;
4478
4544
  };
4479
4545
 
4480
- var validateCurrency = function validateCurrency(currency) {
4546
+ var validateCurrency = function validateCurrency(currency, feeAsset) {
4481
4547
  if ('multiasset' in currency) {
4482
4548
  if (currency.multiasset.length === 0) {
4483
4549
  throw new InvalidCurrencyError('Overridden multi assets cannot be empty');
@@ -4485,16 +4551,9 @@ var validateCurrency = function validateCurrency(currency) {
4485
4551
  if (currency.multiasset.length === 1) {
4486
4552
  throw new InvalidCurrencyError('Please provide more than one multi asset');
4487
4553
  }
4488
- if (currency.multiasset.length > 1 && !currency.multiasset.some(function (asset) {
4489
- return asset.isFeeAsset;
4490
- })) {
4554
+ if (currency.multiasset.length > 1 && !feeAsset) {
4491
4555
  throw new InvalidCurrencyError('Overridden multi assets cannot be used without specifying fee asset');
4492
4556
  }
4493
- if (currency.multiasset.length > 1 && currency.multiasset.filter(function (asset) {
4494
- return asset.isFeeAsset;
4495
- }).length > 1) {
4496
- throw new InvalidCurrencyError('Overridden multi assets cannot have more than one fee asset');
4497
- }
4498
4557
  }
4499
4558
  };
4500
4559
  var validateDestination = function validateDestination(origin, destination) {
@@ -4554,7 +4613,7 @@ var validateAssetSupport = function validateAssetSupport(_ref, assetCheckEnabled
4554
4613
  }
4555
4614
  };
4556
4615
 
4557
- var resolveOverriddenAsset = function resolveOverriddenAsset(options, isBridge, assetCheckEnabled) {
4616
+ var resolveOverriddenAsset = function resolveOverriddenAsset(options, isBridge, assetCheckEnabled, feeAsset) {
4558
4617
  var currency = options.currency,
4559
4618
  origin = options.from,
4560
4619
  destination = options.to;
@@ -4562,6 +4621,9 @@ var resolveOverriddenAsset = function resolveOverriddenAsset(options, isBridge,
4562
4621
  return currency.multilocation.value;
4563
4622
  }
4564
4623
  if ('multiasset' in currency) {
4624
+ if (!feeAsset) {
4625
+ throw new InvalidCurrencyError('Overridden multi assets cannot be used without specifying fee asset');
4626
+ }
4565
4627
  if (currency.multiasset.every(function (asset) {
4566
4628
  return isTMultiAsset(asset);
4567
4629
  })) {
@@ -4569,18 +4631,30 @@ var resolveOverriddenAsset = function resolveOverriddenAsset(options, isBridge,
4569
4631
  }
4570
4632
  // MultiAsset is an array of TCurrencyCore, search for assets
4571
4633
  var assets = currency.multiasset.map(function (currency) {
4572
- var _currency$isFeeAsset;
4573
4634
  var asset = getAssetBySymbolOrId(origin, currency, !isTMultiLocation(destination) ? destination : null);
4574
4635
  if (asset && (!isForeignAsset(asset) || !asset.multiLocation)) {
4575
4636
  throw new InvalidCurrencyError("Asset ".concat(JSON.stringify(currency), " does not have a multiLocation"));
4576
4637
  }
4638
+ if (!asset) {
4639
+ throw new InvalidCurrencyError("Origin node ".concat(origin, " does not support currency ").concat(JSON.stringify(currency)));
4640
+ }
4577
4641
  validateAssetSupport(options, assetCheckEnabled, isBridge, asset);
4578
4642
  var originTyped = origin;
4579
4643
  var originNode = getNode(originTyped);
4580
4644
  return _objectSpread2({
4581
- isFeeAsset: (_currency$isFeeAsset = currency.isFeeAsset) !== null && _currency$isFeeAsset !== void 0 ? _currency$isFeeAsset : false
4582
- }, createMultiAsset(originNode.version, currency.amount, asset === null || asset === void 0 ? void 0 : asset.multiLocation));
4645
+ isFeeAsset: isAssetEqual(feeAsset, asset)
4646
+ }, createMultiAsset(originNode.version, currency.amount, asset.multiLocation));
4583
4647
  });
4648
+ if (assets.filter(function (asset) {
4649
+ return asset.isFeeAsset;
4650
+ }).length > 1) {
4651
+ throw new InvalidCurrencyError("Fee asset matches multiple assets in multiassets");
4652
+ }
4653
+ if (assets.filter(function (asset) {
4654
+ return asset.isFeeAsset;
4655
+ }).length === 0) {
4656
+ throw new InvalidCurrencyError("Fee asset not found in multiassets");
4657
+ }
4584
4658
  return assets;
4585
4659
  }
4586
4660
  return undefined;
@@ -4609,12 +4683,12 @@ var validateDestinationAddress = function validateDestinationAddress(address, de
4609
4683
 
4610
4684
  var send = /*#__PURE__*/function () {
4611
4685
  var _ref = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee(options) {
4612
- var api, origin, currency, address, destination, paraIdTo, version, senderAddress, pallet, method, isBridge, assetCheckEnabled, asset, overriddenAsset, resolvedAsset, originNode;
4686
+ var api, origin, currency, feeAsset, address, destination, paraIdTo, version, senderAddress, pallet, method, isBridge, assetCheckEnabled, asset, resolvedFeeAsset, overriddenAsset, resolvedAsset, originNode;
4613
4687
  return _regeneratorRuntime().wrap(function _callee$(_context) {
4614
4688
  while (1) switch (_context.prev = _context.next) {
4615
4689
  case 0:
4616
- api = options.api, origin = options.from, currency = options.currency, address = options.address, destination = options.to, paraIdTo = options.paraIdTo, version = options.version, senderAddress = options.senderAddress, pallet = options.pallet, method = options.method;
4617
- validateCurrency(currency);
4690
+ api = options.api, origin = options.from, currency = options.currency, feeAsset = options.feeAsset, address = options.address, destination = options.to, paraIdTo = options.paraIdTo, version = options.version, senderAddress = options.senderAddress, pallet = options.pallet, method = options.method;
4691
+ validateCurrency(currency, feeAsset);
4618
4692
  validateDestination(origin, destination);
4619
4693
  validateDestinationAddress(address, destination);
4620
4694
  if (senderAddress) validateAddress(senderAddress, origin, false);
@@ -4628,23 +4702,24 @@ var send = /*#__PURE__*/function () {
4628
4702
  assetCheckEnabled = determineAssetCheckEnabled(origin, currency, isBridge);
4629
4703
  validateAssetSpecifiers(assetCheckEnabled, currency);
4630
4704
  asset = resolveAsset(currency, origin, destination, assetCheckEnabled);
4705
+ resolvedFeeAsset = feeAsset ? resolveFeeAsset(feeAsset, origin, destination) : undefined;
4631
4706
  validateAssetSupport(options, assetCheckEnabled, isBridge, asset);
4632
4707
  if (!isRelayChain(origin)) {
4633
- _context.next = 18;
4708
+ _context.next = 19;
4634
4709
  break;
4635
4710
  }
4636
4711
  if (!(destination === 'Ethereum')) {
4637
- _context.next = 15;
4712
+ _context.next = 16;
4638
4713
  break;
4639
4714
  }
4640
4715
  throw new Error('Transfers from relay chain to Ethereum are not supported.');
4641
- case 15:
4716
+ case 16:
4642
4717
  if (asset) {
4643
- _context.next = 17;
4718
+ _context.next = 18;
4644
4719
  break;
4645
4720
  }
4646
4721
  throw new Error('Asset is required for relay chain to relay chain transfers.');
4647
- case 17:
4722
+ case 18:
4648
4723
  return _context.abrupt("return", transferRelayToPara({
4649
4724
  api: api,
4650
4725
  origin: origin,
@@ -4658,11 +4733,11 @@ var send = /*#__PURE__*/function () {
4658
4733
  pallet: pallet,
4659
4734
  method: method
4660
4735
  }));
4661
- case 18:
4662
- overriddenAsset = resolveOverriddenAsset(options, isBridge, assetCheckEnabled);
4663
- _context.next = 21;
4736
+ case 19:
4737
+ overriddenAsset = resolveOverriddenAsset(options, isBridge, assetCheckEnabled, resolvedFeeAsset);
4738
+ _context.next = 22;
4664
4739
  return api.init(origin);
4665
- case 21:
4740
+ case 22:
4666
4741
  // In case asset check is disabled, we create asset object from currency symbol
4667
4742
  resolvedAsset = asset !== null && asset !== void 0 ? asset : {
4668
4743
  symbol: 'symbol' in currency ? currency.symbol : undefined
@@ -4673,6 +4748,7 @@ var send = /*#__PURE__*/function () {
4673
4748
  asset: _objectSpread2(_objectSpread2({}, resolvedAsset), {}, {
4674
4749
  amount: 'multiasset' in currency ? 0 : currency.amount
4675
4750
  }),
4751
+ feeAsset: resolvedFeeAsset,
4676
4752
  address: address,
4677
4753
  to: destination,
4678
4754
  paraIdTo: paraIdTo,
@@ -4682,7 +4758,7 @@ var send = /*#__PURE__*/function () {
4682
4758
  pallet: pallet,
4683
4759
  method: method
4684
4760
  }));
4685
- case 24:
4761
+ case 25:
4686
4762
  case "end":
4687
4763
  return _context.stop();
4688
4764
  }
@@ -4752,11 +4828,11 @@ var ParachainNode = /*#__PURE__*/function () {
4752
4828
  key: "transfer",
4753
4829
  value: function () {
4754
4830
  var _transfer = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee(options) {
4755
- var api, asset, address, destination, paraIdTo, overriddenAsset, version, senderAddress, pallet, method, isRelayDestination, scenario, paraId, versionOrDefault, isBifrostOrigin, isAssetHubDest, shouldUseMultiasset, input;
4831
+ var api, asset, feeAsset, address, destination, paraIdTo, overriddenAsset, version, senderAddress, pallet, method, isRelayDestination, scenario, paraId, versionOrDefault, isBifrostOrigin, isAssetHubDest, shouldUseMultiasset, input;
4756
4832
  return _regeneratorRuntime().wrap(function _callee$(_context) {
4757
4833
  while (1) switch (_context.prev = _context.next) {
4758
4834
  case 0:
4759
- api = options.api, asset = options.asset, address = options.address, destination = options.to, paraIdTo = options.paraIdTo, overriddenAsset = options.overriddenAsset, version = options.version, senderAddress = options.senderAddress, pallet = options.pallet, method = options.method;
4835
+ api = options.api, asset = options.asset, feeAsset = options.feeAsset, address = options.address, destination = options.to, paraIdTo = options.paraIdTo, overriddenAsset = options.overriddenAsset, version = options.version, senderAddress = options.senderAddress, pallet = options.pallet, method = options.method;
4760
4836
  isRelayDestination = !isTMultiLocation(destination) && isRelayChain(destination);
4761
4837
  scenario = isRelayDestination ? 'ParaToRelay' : 'ParaToPara';
4762
4838
  paraId = resolveParaId(paraIdTo, destination);
@@ -4820,12 +4896,13 @@ var ParachainNode = /*#__PURE__*/function () {
4820
4896
  header: this.createPolkadotXcmHeader(scenario, versionOrDefault, destination, paraId),
4821
4897
  addressSelection: generateAddressPayload(api, scenario, 'PolkadotXcm', address, versionOrDefault, paraId),
4822
4898
  address: address,
4823
- currencySelection: this.createCurrencySpec(asset.amount, scenario, versionOrDefault, asset, overriddenAsset),
4899
+ currencySelection: this.createCurrencySpec(asset.amount, scenario, versionOrDefault, asset),
4900
+ overriddenAsset: overriddenAsset,
4824
4901
  asset: asset,
4902
+ feeAsset: feeAsset,
4825
4903
  scenario: scenario,
4826
4904
  destination: destination,
4827
4905
  paraIdTo: paraId,
4828
- overriddenAsset: overriddenAsset,
4829
4906
  version: version,
4830
4907
  senderAddress: senderAddress,
4831
4908
  pallet: pallet,
@@ -4872,8 +4949,11 @@ var ParachainNode = /*#__PURE__*/function () {
4872
4949
  }
4873
4950
  }, {
4874
4951
  key: "createCurrencySpec",
4875
- value: function createCurrencySpec$1(amount, scenario, version, _asset, overridedMultiLocation) {
4876
- return createCurrencySpec(amount, version, scenario === 'ParaToRelay' ? Parents.ONE : Parents.ZERO, overridedMultiLocation);
4952
+ value: function createCurrencySpec(amount, scenario, version, _asset) {
4953
+ return createVersionedMultiAssets(version, amount, {
4954
+ parents: scenario === 'ParaToRelay' ? Parents.ONE : Parents.ZERO,
4955
+ interior: 'Here'
4956
+ });
4877
4957
  }
4878
4958
  }, {
4879
4959
  key: "createPolkadotXcmHeader",
@@ -5045,12 +5125,18 @@ var PolkadotXCMTransferImpl = /*#__PURE__*/function () {
5045
5125
  value: function transferPolkadotXCM(_ref, section) {
5046
5126
  var api = _ref.api,
5047
5127
  header = _ref.header,
5128
+ asset = _ref.asset,
5048
5129
  addressSelection = _ref.addressSelection,
5049
5130
  currencySelection = _ref.currencySelection,
5050
5131
  overriddenAsset = _ref.overriddenAsset,
5051
5132
  pallet = _ref.pallet,
5052
5133
  method = _ref.method;
5053
5134
  var fees = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : undefined;
5135
+ var _extractVersionFromHe = extractVersionFromHeader(currencySelection),
5136
+ _extractVersionFromHe2 = _slicedToArray(_extractVersionFromHe, 2),
5137
+ version = _extractVersionFromHe2[0],
5138
+ multiAssets = _extractVersionFromHe2[1];
5139
+ var resolvedMultiAssets = addXcmVersionHeader(maybeOverrideMultiAssets(version, asset.amount, multiAssets, overriddenAsset), version);
5054
5140
  var feeAssetIndex = overriddenAsset === undefined || isTMultiLocation(overriddenAsset) ? DEFAULT_FEE_ASSET : overriddenAsset.findIndex(function (asset) {
5055
5141
  return asset.isFeeAsset;
5056
5142
  });
@@ -5060,7 +5146,7 @@ var PolkadotXCMTransferImpl = /*#__PURE__*/function () {
5060
5146
  parameters: _objectSpread2({
5061
5147
  dest: header,
5062
5148
  beneficiary: addressSelection,
5063
- assets: currencySelection,
5149
+ assets: resolvedMultiAssets,
5064
5150
  fee_asset_item: feeAssetIndex
5065
5151
  }, fees !== undefined ? {
5066
5152
  weight_limit: fees
@@ -5088,13 +5174,14 @@ var AssetHubKusama$1 = /*#__PURE__*/function (_ParachainNode) {
5088
5174
  if (destination === 'AssetHubPolkadot') {
5089
5175
  return Promise.resolve(getNode('AssetHubPolkadot').handleBridgeTransfer(input, 'Polkadot'));
5090
5176
  }
5091
- if (scenario === 'ParaToPara' && asset.symbol === 'KSM' && !isForeignAsset(asset)) {
5177
+ var isSystemNode = !isTMultiLocation(destination) && SYSTEM_NODES_KUSAMA.includes(destination);
5178
+ if (scenario === 'ParaToPara' && asset.symbol === 'KSM' && !isForeignAsset(asset) && !isSystemNode) {
5092
5179
  throw new ScenarioNotSupportedError(this.node, scenario, 'Para to Para scenarios for KSM transfer from AssetHub are not supported, you have to transfer KSM to Relay chain and transfer to destination chain from Relay chain.');
5093
5180
  }
5094
5181
  if (scenario === 'ParaToPara' && asset.symbol === 'DOT' && !isForeignAsset(asset)) {
5095
5182
  throw new ScenarioNotSupportedError(this.node, scenario, 'Bridged DOT cannot currently be transfered from AssetHubKusama, if you are sending different DOT asset, please specify {id: <DOTID>}.');
5096
5183
  }
5097
- var section = scenario === 'ParaToPara' ? 'limited_reserve_transfer_assets' : 'limited_teleport_assets';
5184
+ var section = scenario === 'ParaToPara' && !isSystemNode ? 'limited_reserve_transfer_assets' : 'limited_teleport_assets';
5098
5185
  return Promise.resolve(PolkadotXCMTransferImpl.transferPolkadotXCM(input, section, 'Unlimited'));
5099
5186
  }
5100
5187
  }, {
@@ -5107,12 +5194,124 @@ var AssetHubKusama$1 = /*#__PURE__*/function (_ParachainNode) {
5107
5194
  }
5108
5195
  }, {
5109
5196
  key: "createCurrencySpec",
5110
- value: function createCurrencySpec(amount, scenario, version, asset, overridedMultiLocation) {
5111
- return getNode('AssetHubPolkadot').createCurrencySpec(amount, scenario, version, asset, overridedMultiLocation);
5197
+ value: function createCurrencySpec(amount, scenario, version, asset) {
5198
+ return getNode('AssetHubPolkadot').createCurrencySpec(amount, scenario, version, asset);
5112
5199
  }
5113
5200
  }]);
5114
5201
  }(ParachainNode);
5115
5202
 
5203
+ var transformMultiLocation = function transformMultiLocation(multiLocation) {
5204
+ var newInterior;
5205
+ if (multiLocation.interior === 'Here') {
5206
+ newInterior = 'Here';
5207
+ } else {
5208
+ var junctions = Object.values(multiLocation.interior).flat().filter(function (junction) {
5209
+ return _typeof(junction) === 'object' && junction !== null;
5210
+ });
5211
+ var filteredJunctions = junctions.filter(function (junction) {
5212
+ return !('Parachain' in junction);
5213
+ });
5214
+ if (filteredJunctions.length === 0) {
5215
+ newInterior = 'Here';
5216
+ } else {
5217
+ newInterior = _defineProperty({}, "X".concat(filteredJunctions.length), filteredJunctions);
5218
+ }
5219
+ }
5220
+ return _objectSpread2(_objectSpread2({}, multiLocation), {}, {
5221
+ parents: Parents.ZERO,
5222
+ interior: newInterior
5223
+ });
5224
+ };
5225
+
5226
+ var createExecuteXcm = function createExecuteXcm(input, weight, executionFee) {
5227
+ var api = input.api,
5228
+ _input$version = input.version,
5229
+ version = _input$version === void 0 ? Version.V4 : _input$version,
5230
+ asset = input.asset,
5231
+ scenario = input.scenario,
5232
+ destination = input.destination,
5233
+ paraIdTo = input.paraIdTo,
5234
+ address = input.address;
5235
+ var destWithHeader = createPolkadotXcmHeader(scenario, version, destination, paraIdTo);
5236
+ var _extractVersionFromHe = extractVersionFromHeader(destWithHeader),
5237
+ _extractVersionFromHe2 = _slicedToArray(_extractVersionFromHe, 2);
5238
+ _extractVersionFromHe2[0];
5239
+ var dest = _extractVersionFromHe2[1];
5240
+ var beneficiaryWithHeader = generateAddressPayload(api, scenario, 'PolkadotXcm', address, version, paraIdTo);
5241
+ var _extractVersionFromHe3 = extractVersionFromHeader(beneficiaryWithHeader),
5242
+ _extractVersionFromHe4 = _slicedToArray(_extractVersionFromHe3, 2);
5243
+ _extractVersionFromHe4[0];
5244
+ var beneficiary = _extractVersionFromHe4[1];
5245
+ var transformedMultiLocation = transformMultiLocation(asset.multiLocation);
5246
+ var amountWithoutFee = BigInt(asset.amount) - executionFee;
5247
+ var call = {
5248
+ module: 'PolkadotXcm',
5249
+ section: 'execute',
5250
+ parameters: {
5251
+ message: _defineProperty({}, version, [{
5252
+ WithdrawAsset: [{
5253
+ id: transformedMultiLocation,
5254
+ fun: {
5255
+ Fungible: asset.amount
5256
+ }
5257
+ }]
5258
+ }, {
5259
+ BuyExecution: {
5260
+ fees: {
5261
+ id: transformedMultiLocation,
5262
+ fun: {
5263
+ Fungible: executionFee
5264
+ }
5265
+ },
5266
+ weight_limit: {
5267
+ Limited: {
5268
+ ref_time: 100n,
5269
+ proof_size: 0n
5270
+ }
5271
+ }
5272
+ }
5273
+ }, {
5274
+ DepositReserveAsset: {
5275
+ assets: {
5276
+ Definite: [{
5277
+ id: transformedMultiLocation,
5278
+ fun: {
5279
+ Fungible: amountWithoutFee
5280
+ }
5281
+ }]
5282
+ },
5283
+ dest: dest,
5284
+ xcm: [{
5285
+ BuyExecution: {
5286
+ fees: {
5287
+ id: asset.multiLocation,
5288
+ fun: {
5289
+ Fungible: amountWithoutFee
5290
+ }
5291
+ },
5292
+ weight_limit: 'Unlimited'
5293
+ }
5294
+ }, {
5295
+ DepositAsset: {
5296
+ assets: {
5297
+ Wild: {
5298
+ AllCounted: 1
5299
+ }
5300
+ },
5301
+ beneficiary: beneficiary
5302
+ }
5303
+ }]
5304
+ }
5305
+ }]),
5306
+ max_weight: {
5307
+ ref_time: weight.refTime,
5308
+ proof_size: weight.proofSize
5309
+ }
5310
+ }
5311
+ };
5312
+ return api.callTxMethod(call);
5313
+ };
5314
+
5116
5315
  var generateAddressMultiLocationV4 = function generateAddressMultiLocationV4(api, address) {
5117
5316
  var isMultiLocation = _typeof(address) === 'object';
5118
5317
  if (isMultiLocation) {
@@ -5157,7 +5356,8 @@ var AssetHubPolkadot$1 = /*#__PURE__*/function (_ParachainNode) {
5157
5356
  _this.handleBifrostEthTransfer = function (input) {
5158
5357
  var api = input.api,
5159
5358
  scenario = input.scenario,
5160
- version = input.version,
5359
+ _input$version = input.version,
5360
+ version = _input$version === void 0 ? _this.version : _input$version,
5161
5361
  destination = input.destination,
5162
5362
  asset = input.asset;
5163
5363
  if (!isForeignAsset(asset)) {
@@ -5166,19 +5366,18 @@ var AssetHubPolkadot$1 = /*#__PURE__*/function (_ParachainNode) {
5166
5366
  if (!asset.multiLocation) {
5167
5367
  throw new InvalidCurrencyError("Asset ".concat(JSON.stringify(asset), " has no multiLocation"));
5168
5368
  }
5169
- var versionOrDefault = version !== null && version !== void 0 ? version : _this.version;
5170
5369
  var call = {
5171
5370
  module: 'PolkadotXcm',
5172
5371
  section: 'transfer_assets_using_type_and_then',
5173
5372
  parameters: {
5174
- dest: _this.createPolkadotXcmHeader(scenario, versionOrDefault, destination, getParaId('BifrostPolkadot')),
5175
- assets: _defineProperty({}, versionOrDefault, [createMultiAsset(versionOrDefault, asset.amount, asset.multiLocation)]),
5373
+ dest: _this.createPolkadotXcmHeader(scenario, version, destination, getParaId('BifrostPolkadot')),
5374
+ assets: _defineProperty({}, version, [createMultiAsset(version, asset.amount, asset.multiLocation)]),
5176
5375
  assets_transfer_type: 'LocalReserve',
5177
- remote_fees_id: _defineProperty({}, versionOrDefault, {
5376
+ remote_fees_id: _defineProperty({}, version, {
5178
5377
  Concrete: asset.multiLocation
5179
5378
  }),
5180
5379
  fees_transfer_type: 'LocalReserve',
5181
- custom_xcm_on_dest: createCustomXcmToBifrost(input, versionOrDefault),
5380
+ custom_xcm_on_dest: createCustomXcmToBifrost(input, version),
5182
5381
  weight_limit: 'Unlimited'
5183
5382
  }
5184
5383
  };
@@ -5192,16 +5391,26 @@ var AssetHubPolkadot$1 = /*#__PURE__*/function (_ParachainNode) {
5192
5391
  value: function handleBridgeTransfer(input, targetChain) {
5193
5392
  var _input$asset$symbol, _input$asset$symbol2, _input$asset$symbol3, _input$asset$symbol4;
5194
5393
  if (targetChain === 'Kusama' && ((_input$asset$symbol = input.asset.symbol) === null || _input$asset$symbol === void 0 ? void 0 : _input$asset$symbol.toUpperCase()) === 'KSM' || targetChain === 'Polkadot' && ((_input$asset$symbol2 = input.asset.symbol) === null || _input$asset$symbol2 === void 0 ? void 0 : _input$asset$symbol2.toUpperCase()) === 'DOT') {
5394
+ var overriddenVersion = Version.V4;
5395
+ var customMultiLocation = {
5396
+ parents: Parents.TWO,
5397
+ interior: {
5398
+ X1: [{
5399
+ GlobalConsensus: targetChain
5400
+ }]
5401
+ }
5402
+ };
5195
5403
  var modifiedInput = _objectSpread2(_objectSpread2({}, input), {}, {
5196
- header: createBridgePolkadotXcmDest(Version.V4, targetChain, input.destination, input.paraIdTo),
5404
+ header: createBridgePolkadotXcmDest(overriddenVersion, targetChain, input.destination, input.paraIdTo),
5197
5405
  addressSelection: generateAddressMultiLocationV4(input.api, input.address),
5198
- currencySelection: createBridgeCurrencySpec(input.asset.amount, targetChain)
5406
+ currencySelection: createVersionedMultiAssets(overriddenVersion, input.asset.amount, customMultiLocation)
5199
5407
  });
5200
5408
  return PolkadotXCMTransferImpl.transferPolkadotXCM(modifiedInput, 'transfer_assets', 'Unlimited');
5201
5409
  } else if (targetChain === 'Polkadot' && ((_input$asset$symbol3 = input.asset.symbol) === null || _input$asset$symbol3 === void 0 ? void 0 : _input$asset$symbol3.toUpperCase()) === 'KSM' || targetChain === 'Kusama' && ((_input$asset$symbol4 = input.asset.symbol) === null || _input$asset$symbol4 === void 0 ? void 0 : _input$asset$symbol4.toUpperCase()) === 'DOT') {
5410
+ var _overriddenVersion = Version.V3;
5202
5411
  var _modifiedInput = _objectSpread2(_objectSpread2({}, input), {}, {
5203
- header: createBridgePolkadotXcmDest(Version.V3, targetChain, input.destination, input.paraIdTo),
5204
- currencySelection: createCurrencySpec(input.asset.amount, Version.V3, Parents.ONE, input.overriddenAsset)
5412
+ header: createBridgePolkadotXcmDest(_overriddenVersion, targetChain, input.destination, input.paraIdTo),
5413
+ currencySelection: createVersionedMultiAssets(_overriddenVersion, input.asset.amount, DOT_MULTILOCATION)
5205
5414
  });
5206
5415
  return PolkadotXCMTransferImpl.transferPolkadotXCM(_modifiedInput, 'limited_reserve_transfer_assets', 'Unlimited');
5207
5416
  }
@@ -5228,7 +5437,7 @@ var AssetHubPolkadot$1 = /*#__PURE__*/function (_ParachainNode) {
5228
5437
  var modifiedInput = _objectSpread2(_objectSpread2({}, input), {}, {
5229
5438
  header: createPolkadotXcmHeader(scenario, this.version, destination, paraIdTo, ETHEREUM_JUNCTION, Parents.TWO),
5230
5439
  addressSelection: generateAddressPayload(api, scenario, 'PolkadotXcm', address, this.version, paraIdTo),
5231
- currencySelection: createCurrencySpec(input.asset.amount, Version.V3, Parents.TWO, asset.multiLocation)
5440
+ currencySelection: createVersionedMultiAssets(Version.V3, asset.amount, asset.multiLocation)
5232
5441
  });
5233
5442
  return PolkadotXCMTransferImpl.transferPolkadotXCM(modifiedInput, 'transfer_assets', 'Unlimited');
5234
5443
  }
@@ -5238,7 +5447,6 @@ var AssetHubPolkadot$1 = /*#__PURE__*/function (_ParachainNode) {
5238
5447
  var api = input.api,
5239
5448
  address = input.address,
5240
5449
  asset = input.asset,
5241
- overriddenAsset = input.overriddenAsset,
5242
5450
  scenario = input.scenario,
5243
5451
  destination = input.destination,
5244
5452
  paraIdTo = input.paraIdTo;
@@ -5255,7 +5463,7 @@ var AssetHubPolkadot$1 = /*#__PURE__*/function (_ParachainNode) {
5255
5463
  var modifiedInput = _objectSpread2(_objectSpread2({}, input), {}, {
5256
5464
  header: this.createPolkadotXcmHeader(scenario, version, destination, paraId),
5257
5465
  addressSelection: generateAddressPayload(api, scenario, 'PolkadotXcm', address, version, paraId),
5258
- currencySelection: this.createCurrencySpec(asset.amount, scenario, version, asset, overriddenAsset !== null && overriddenAsset !== void 0 ? overriddenAsset : customMultiLocation)
5466
+ currencySelection: createVersionedMultiAssets(version, asset.amount, customMultiLocation)
5259
5467
  });
5260
5468
  return PolkadotXCMTransferImpl.transferPolkadotXCM(modifiedInput, 'limited_teleport_assets', 'Unlimited');
5261
5469
  }
@@ -5266,24 +5474,23 @@ var AssetHubPolkadot$1 = /*#__PURE__*/function (_ParachainNode) {
5266
5474
  var asset = input.asset,
5267
5475
  destination = input.destination,
5268
5476
  paraIdTo = input.paraIdTo,
5269
- overriddenAsset = input.overriddenAsset,
5270
5477
  scenario = input.scenario,
5271
5478
  api = input.api,
5272
- version = input.version,
5479
+ _input$version2 = input.version,
5480
+ version = _input$version2 === void 0 ? this.version : _input$version2,
5273
5481
  address = input.address;
5274
5482
  if ((((_asset$symbol = asset.symbol) === null || _asset$symbol === void 0 ? void 0 : _asset$symbol.toUpperCase()) === 'USDT' || ((_asset$symbol2 = asset.symbol) === null || _asset$symbol2 === void 0 ? void 0 : _asset$symbol2.toUpperCase()) === 'USDC') && destination === 'BifrostPolkadot') {
5275
- var _input$version;
5276
- var versionOrDefault = (_input$version = input.version) !== null && _input$version !== void 0 ? _input$version : Version.V2;
5483
+ var _input$version3;
5484
+ var versionOrDefault = (_input$version3 = input.version) !== null && _input$version3 !== void 0 ? _input$version3 : Version.V2;
5277
5485
  return _objectSpread2(_objectSpread2({}, input), {}, {
5278
5486
  header: this.createPolkadotXcmHeader(scenario, versionOrDefault, destination, paraIdTo),
5279
5487
  addressSelection: generateAddressPayload(api, scenario, 'PolkadotXcm', address, versionOrDefault, paraIdTo),
5280
- currencySelection: this.createCurrencySpec(asset.amount, scenario, versionOrDefault, asset, overriddenAsset)
5488
+ currencySelection: this.createCurrencySpec(asset.amount, scenario, versionOrDefault, asset)
5281
5489
  });
5282
5490
  }
5283
5491
  if ((destination === 'Hydration' || destination === 'Polimec' || destination === 'Moonbeam' || destination === 'BifrostPolkadot') && asset.symbol === 'DOT') {
5284
- var _versionOrDefault = version !== null && version !== void 0 ? version : this.version;
5285
5492
  return _objectSpread2(_objectSpread2({}, input), {}, {
5286
- currencySelection: _superPropGet(AssetHubPolkadot, "createCurrencySpec", this, 3)([asset.amount, 'ParaToRelay', _versionOrDefault, asset, overriddenAsset])
5493
+ currencySelection: createVersionedMultiAssets(version, asset.amount, DOT_MULTILOCATION)
5287
5494
  });
5288
5495
  }
5289
5496
  return input;
@@ -5291,15 +5498,96 @@ var AssetHubPolkadot$1 = /*#__PURE__*/function (_ParachainNode) {
5291
5498
  }, {
5292
5499
  key: "getSection",
5293
5500
  value: function getSection(scenario, destination) {
5501
+ var isSystemNode = !isTMultiLocation(destination) && SYSTEM_NODES_POLKADOT.includes(destination);
5294
5502
  if (destination === 'Polimec' || destination === 'Moonbeam') return 'transfer_assets';
5295
- return scenario === 'ParaToPara' ? 'limited_reserve_transfer_assets' : 'limited_teleport_assets';
5503
+ return scenario === 'ParaToPara' && !isSystemNode ? 'limited_reserve_transfer_assets' : 'limited_teleport_assets';
5296
5504
  }
5505
+ }, {
5506
+ key: "handleExecuteTransfer",
5507
+ value: function () {
5508
+ var _handleExecuteTransfer = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee(input) {
5509
+ var api, senderAddress, asset, MIN_FEE, maxU64, dummyTx, dryRunResult, feeDotShifted, toMl, feeConverted, feeConvertedPadded;
5510
+ return _regeneratorRuntime().wrap(function _callee$(_context) {
5511
+ while (1) switch (_context.prev = _context.next) {
5512
+ case 0:
5513
+ api = input.api, senderAddress = input.senderAddress, asset = input.asset;
5514
+ if (senderAddress) {
5515
+ _context.next = 3;
5516
+ break;
5517
+ }
5518
+ throw new Error('Please provide senderAddress');
5519
+ case 3:
5520
+ validateAddress(senderAddress, this.node, false);
5521
+ MIN_FEE = 150000n;
5522
+ maxU64 = (1n << 64n) - 1n;
5523
+ dummyTx = createExecuteXcm(input, {
5524
+ refTime: maxU64,
5525
+ proofSize: maxU64
5526
+ }, MIN_FEE);
5527
+ _context.next = 9;
5528
+ return api.getDryRun({
5529
+ node: this.node,
5530
+ tx: dummyTx,
5531
+ address: senderAddress
5532
+ });
5533
+ case 9:
5534
+ dryRunResult = _context.sent;
5535
+ if (dryRunResult.success) {
5536
+ _context.next = 12;
5537
+ break;
5538
+ }
5539
+ throw new Error("Dry run failed: ".concat(dryRunResult.failureReason));
5540
+ case 12:
5541
+ if (dryRunResult.weight) {
5542
+ _context.next = 14;
5543
+ break;
5544
+ }
5545
+ throw new Error('Dry run failed: weight not found');
5546
+ case 14:
5547
+ feeDotShifted = dryRunResult.fee / 10n;
5548
+ toMl = transformMultiLocation(asset.multiLocation);
5549
+ _context.next = 18;
5550
+ return api.quoteAhPrice(DOT_MULTILOCATION, toMl, feeDotShifted);
5551
+ case 18:
5552
+ feeConverted = _context.sent;
5553
+ if (feeConverted) {
5554
+ _context.next = 21;
5555
+ break;
5556
+ }
5557
+ throw new Error("Pool DOT -> ".concat(asset.symbol, " not found."));
5558
+ case 21:
5559
+ if (!(BigInt(asset.amount) - feeConverted < 0)) {
5560
+ _context.next = 23;
5561
+ break;
5562
+ }
5563
+ throw new Error("Insufficient balance. Fee: ".concat(feeConverted, ", Amount: ").concat(asset.amount));
5564
+ case 23:
5565
+ feeConvertedPadded = feeConverted * 3n / 2n; // increases fee by 50%
5566
+ return _context.abrupt("return", createExecuteXcm(input, dryRunResult.weight, feeConvertedPadded));
5567
+ case 25:
5568
+ case "end":
5569
+ return _context.stop();
5570
+ }
5571
+ }, _callee, this);
5572
+ }));
5573
+ function handleExecuteTransfer(_x) {
5574
+ return _handleExecuteTransfer.apply(this, arguments);
5575
+ }
5576
+ return handleExecuteTransfer;
5577
+ }()
5297
5578
  }, {
5298
5579
  key: "transferPolkadotXCM",
5299
5580
  value: function transferPolkadotXCM(input) {
5300
5581
  var scenario = input.scenario,
5301
5582
  asset = input.asset,
5302
- destination = input.destination;
5583
+ destination = input.destination,
5584
+ feeAsset = input.feeAsset;
5585
+ if (feeAsset) {
5586
+ if (!isAssetEqual(feeAsset, asset)) {
5587
+ throw new InvalidCurrencyError("Fee asset does not match transfer asset.");
5588
+ }
5589
+ return Promise.resolve(this.handleExecuteTransfer(input));
5590
+ }
5303
5591
  if (destination === 'AssetHubKusama') {
5304
5592
  return Promise.resolve(this.handleBridgeTransfer(input, 'Kusama'));
5305
5593
  }
@@ -5318,7 +5606,8 @@ var AssetHubPolkadot$1 = /*#__PURE__*/function (_ParachainNode) {
5318
5606
  if (destination === 'BifrostPolkadot' && isEthereumAsset) {
5319
5607
  return Promise.resolve(this.handleBifrostEthTransfer(input));
5320
5608
  }
5321
- if (scenario === 'ParaToPara' && asset.symbol === 'DOT' && !isForeignAsset(asset) && destination !== 'Hydration' && destination !== 'Polimec' && destination !== 'Moonbeam' && destination !== 'BifrostPolkadot') {
5609
+ var isSystemNode = !isTMultiLocation(destination) && SYSTEM_NODES_POLKADOT.includes(destination);
5610
+ if (scenario === 'ParaToPara' && asset.symbol === 'DOT' && !isForeignAsset(asset) && destination !== 'Hydration' && destination !== 'Polimec' && destination !== 'Moonbeam' && destination !== 'BifrostPolkadot' && destination !== 'PeoplePolkadot' && !isSystemNode) {
5322
5611
  throw new ScenarioNotSupportedError(this.node, scenario, 'Para to Para scenarios for DOT transfer from AssetHub are not supported, you have to transfer DOT to Relay chain and transfer to destination chain from Relay chain.');
5323
5612
  }
5324
5613
  if (scenario === 'ParaToPara' && asset.symbol === 'KSM' && !isForeignAsset(asset)) {
@@ -5338,18 +5627,20 @@ var AssetHubPolkadot$1 = /*#__PURE__*/function (_ParachainNode) {
5338
5627
  }
5339
5628
  }, {
5340
5629
  key: "createCurrencySpec",
5341
- value: function createCurrencySpec$1(amount, scenario, version, asset, overridedMultiLocation) {
5630
+ value: function createCurrencySpec(amount, scenario, version, asset) {
5342
5631
  if (scenario === 'ParaToPara') {
5343
- var interior = {
5344
- X2: [{
5345
- PalletInstance: 50
5346
- }, {
5347
- // TODO: Handle missing assedId
5348
- GeneralIndex: asset && isForeignAsset(asset) && asset.assetId ? asset.assetId : 0
5349
- }]
5350
- };
5351
- var multiLocation = overridedMultiLocation !== undefined ? overridedMultiLocation : asset && isForeignAsset(asset) ? asset.multiLocation : undefined;
5352
- return createCurrencySpec(amount, version, Parents.ZERO, multiLocation, interior);
5632
+ var multiLocation = asset ? asset.multiLocation : undefined;
5633
+ return createVersionedMultiAssets(version, amount, multiLocation !== null && multiLocation !== void 0 ? multiLocation : {
5634
+ parents: Parents.ZERO,
5635
+ interior: {
5636
+ X2: [{
5637
+ PalletInstance: 50
5638
+ }, {
5639
+ // TODO: Handle missing assedId
5640
+ GeneralIndex: asset && isForeignAsset(asset) && asset.assetId ? asset.assetId : 0
5641
+ }]
5642
+ }
5643
+ });
5353
5644
  } else {
5354
5645
  return _superPropGet(AssetHubPolkadot, "createCurrencySpec", this, 3)([amount, scenario, version, asset]);
5355
5646
  }
@@ -5495,16 +5786,18 @@ var BifrostPolkadot$1 = /*#__PURE__*/function (_ParachainNode) {
5495
5786
  key: "transferToAssetHub",
5496
5787
  value: function transferToAssetHub(input) {
5497
5788
  var _getAssetId;
5498
- var overriddenAsset = input.overriddenAsset,
5499
- asset = input.asset;
5789
+ var asset = input.asset;
5500
5790
  return Promise.resolve(PolkadotXCMTransferImpl.transferPolkadotXCM(_objectSpread2(_objectSpread2({}, input), {}, {
5501
- currencySelection: createCurrencySpec(asset.amount, this.version, asset.symbol === 'DOT' ? Parents.ONE : Parents.TWO, overriddenAsset, asset.symbol === 'WETH' ? {
5502
- X2: [ETHEREUM_JUNCTION, {
5503
- AccountKey20: {
5504
- key: (_getAssetId = getAssetId('Ethereum', 'WETH')) !== null && _getAssetId !== void 0 ? _getAssetId : ''
5505
- }
5506
- }]
5507
- } : undefined)
5791
+ currencySelection: createVersionedMultiAssets(this.version, asset.amount, {
5792
+ parents: asset.symbol === 'DOT' ? Parents.ONE : Parents.TWO,
5793
+ interior: asset.symbol === 'WETH' ? {
5794
+ X2: [ETHEREUM_JUNCTION, {
5795
+ AccountKey20: {
5796
+ key: (_getAssetId = getAssetId('Ethereum', 'WETH')) !== null && _getAssetId !== void 0 ? _getAssetId : ''
5797
+ }
5798
+ }]
5799
+ } : 'Here'
5800
+ })
5508
5801
  }), 'transfer_assets', 'Unlimited'));
5509
5802
  }
5510
5803
  }, {
@@ -5771,16 +6064,18 @@ var Crab$1 = /*#__PURE__*/function (_ParachainNode) {
5771
6064
  }
5772
6065
  }, {
5773
6066
  key: "createCurrencySpec",
5774
- value: function createCurrencySpec$1(amount, scenario, version, _asset, overridedMultiLocation) {
6067
+ value: function createCurrencySpec(amount, scenario, version, _asset) {
5775
6068
  if (scenario === 'ParaToPara') {
5776
- var interior = {
5777
- X1: {
5778
- PalletInstance: 5
6069
+ return createVersionedMultiAssets(version, amount, {
6070
+ parents: Parents.ZERO,
6071
+ interior: {
6072
+ X1: {
6073
+ PalletInstance: 5
6074
+ }
5779
6075
  }
5780
- };
5781
- return createCurrencySpec(amount, version, Parents.ZERO, overridedMultiLocation, interior);
6076
+ });
5782
6077
  } else {
5783
- return _superPropGet(Crab, "createCurrencySpec", this, 3)([amount, scenario, version, undefined, overridedMultiLocation]);
6078
+ return _superPropGet(Crab, "createCurrencySpec", this, 3)([amount, scenario, version]);
5784
6079
  }
5785
6080
  }
5786
6081
  }]);
@@ -6165,8 +6460,8 @@ var Moonbeam$1 = /*#__PURE__*/function (_ParachainNode) {
6165
6460
  }
6166
6461
  _inherits(Moonbeam, _ParachainNode);
6167
6462
  return _createClass(Moonbeam, [{
6168
- key: "getJunctions",
6169
- value: function getJunctions(asset, scenario) {
6463
+ key: "getMultiLocation",
6464
+ value: function getMultiLocation(asset, scenario) {
6170
6465
  if (scenario === 'ParaToRelay') return DOT_MULTILOCATION;
6171
6466
  if (asset.symbol === this.getNativeAssetSymbol()) return {
6172
6467
  parents: Parents.ZERO,
@@ -6187,11 +6482,10 @@ var Moonbeam$1 = /*#__PURE__*/function (_ParachainNode) {
6187
6482
  var asset = input.asset,
6188
6483
  scenario = input.scenario,
6189
6484
  _input$version = input.version,
6190
- version = _input$version === void 0 ? this.version : _input$version,
6191
- overriddenAsset = input.overriddenAsset;
6192
- var multiLocation = this.getJunctions(asset, scenario);
6485
+ version = _input$version === void 0 ? this.version : _input$version;
6486
+ var multiLocation = this.getMultiLocation(asset, scenario);
6193
6487
  return Promise.resolve(PolkadotXCMTransferImpl.transferPolkadotXCM(_objectSpread2(_objectSpread2({}, input), {}, {
6194
- currencySelection: createCurrencySpec(asset.amount, version, multiLocation.parents, overriddenAsset, multiLocation.interior)
6488
+ currencySelection: createVersionedMultiAssets(version, asset.amount, multiLocation)
6195
6489
  }), 'transfer_assets', 'Unlimited'));
6196
6490
  }
6197
6491
  }, {
@@ -6212,8 +6506,8 @@ var Moonriver$1 = /*#__PURE__*/function (_ParachainNode) {
6212
6506
  }
6213
6507
  _inherits(Moonriver, _ParachainNode);
6214
6508
  return _createClass(Moonriver, [{
6215
- key: "getJunctions",
6216
- value: function getJunctions(asset, scenario) {
6509
+ key: "getMultiLocation",
6510
+ value: function getMultiLocation(asset, scenario) {
6217
6511
  if (scenario === 'ParaToRelay') return DOT_MULTILOCATION;
6218
6512
  if (asset.symbol === this.getNativeAssetSymbol()) return {
6219
6513
  parents: Parents.ZERO,
@@ -6234,11 +6528,10 @@ var Moonriver$1 = /*#__PURE__*/function (_ParachainNode) {
6234
6528
  var asset = input.asset,
6235
6529
  scenario = input.scenario,
6236
6530
  _input$version = input.version,
6237
- version = _input$version === void 0 ? this.version : _input$version,
6238
- overriddenAsset = input.overriddenAsset;
6239
- var multiLocation = this.getJunctions(asset, scenario);
6531
+ version = _input$version === void 0 ? this.version : _input$version;
6532
+ var multiLocation = this.getMultiLocation(asset, scenario);
6240
6533
  return Promise.resolve(PolkadotXCMTransferImpl.transferPolkadotXCM(_objectSpread2(_objectSpread2({}, input), {}, {
6241
- currencySelection: createCurrencySpec(asset.amount, version, multiLocation.parents, overriddenAsset, multiLocation.interior)
6534
+ currencySelection: createVersionedMultiAssets(version, asset.amount, multiLocation)
6242
6535
  }), 'transfer_assets', 'Unlimited'));
6243
6536
  }
6244
6537
  }, {
@@ -6529,7 +6822,12 @@ var XTransferTransferImpl = /*#__PURE__*/function () {
6529
6822
  if (isMultiLocationDestination) {
6530
6823
  throw new Error('Multilocation destinations are not supported for specific transfer you are trying to create. In special cases such as xTokens or xTransfer pallet try using address multilocation instead (for both destination and address in same multilocation set (eg. X2 - Parachain, Address). For further assistance please open issue in our repository.');
6531
6824
  }
6532
- var currencySpec = getCurrency(asset.amount, Version.V1, Parents.ZERO, overriddenAsset)[0];
6825
+ var version = Version.V1;
6826
+ var multiAssets = [createMultiAsset(version, asset.amount, {
6827
+ parents: Parents.ZERO,
6828
+ interior: 'Here'
6829
+ })];
6830
+ var resolvedMultiAssets = maybeOverrideMultiAssets(version, asset.amount, multiAssets, overriddenAsset);
6533
6831
  var dest = getDestination(input);
6534
6832
  var section = 'transfer';
6535
6833
  var destWeight = determineDestWeight(destination);
@@ -6537,7 +6835,7 @@ var XTransferTransferImpl = /*#__PURE__*/function () {
6537
6835
  module: pallet !== null && pallet !== void 0 ? pallet : 'XTransfer',
6538
6836
  section: method !== null && method !== void 0 ? method : section,
6539
6837
  parameters: {
6540
- asset: currencySpec,
6838
+ asset: resolvedMultiAssets[0],
6541
6839
  dest: dest,
6542
6840
  dest_weight: destWeight
6543
6841
  }
@@ -7001,14 +7299,7 @@ var Polimec = {
7001
7299
  ],
7002
7300
  otherAssets: [
7003
7301
  {
7004
- assetId: "10",
7005
- symbol: "DOT",
7006
- decimals: 10,
7007
- existentialDeposit: "100000000"
7008
- },
7009
- {
7010
- assetId: "1984",
7011
- symbol: "USDt",
7302
+ symbol: "USDC",
7012
7303
  decimals: 6,
7013
7304
  multiLocation: {
7014
7305
  parents: 1,
@@ -7021,7 +7312,7 @@ var Polimec = {
7021
7312
  PalletInstance: 50
7022
7313
  },
7023
7314
  {
7024
- GeneralIndex: 1984
7315
+ GeneralIndex: 1337
7025
7316
  }
7026
7317
  ]
7027
7318
  }
@@ -7029,8 +7320,7 @@ var Polimec = {
7029
7320
  existentialDeposit: "70000"
7030
7321
  },
7031
7322
  {
7032
- assetId: "1337",
7033
- symbol: "USDC",
7323
+ symbol: "USDt",
7034
7324
  decimals: 6,
7035
7325
  multiLocation: {
7036
7326
  parents: 1,
@@ -7043,12 +7333,23 @@ var Polimec = {
7043
7333
  PalletInstance: 50
7044
7334
  },
7045
7335
  {
7046
- GeneralIndex: 1337
7336
+ GeneralIndex: 1984
7047
7337
  }
7048
7338
  ]
7049
7339
  }
7050
7340
  },
7051
7341
  existentialDeposit: "70000"
7342
+ },
7343
+ {
7344
+ symbol: "DOT",
7345
+ decimals: 10,
7346
+ multiLocation: {
7347
+ parents: 1,
7348
+ interior: {
7349
+ Here: null
7350
+ }
7351
+ },
7352
+ existentialDeposit: "100000000"
7052
7353
  }
7053
7354
  ]
7054
7355
  };
@@ -19001,13 +19302,13 @@ var getBalanceForeignPolkadotXcm = /*#__PURE__*/function () {
19001
19302
  _context.next = 12;
19002
19303
  break;
19003
19304
  }
19004
- if (!(asset.assetId === undefined)) {
19305
+ if (!(asset.multiLocation === undefined)) {
19005
19306
  _context.next = 11;
19006
19307
  break;
19007
19308
  }
19008
- throw new InvalidCurrencyError("Asset ".concat(JSON.stringify(asset), " has no assetId"));
19309
+ throw new InvalidCurrencyError("Asset ".concat(JSON.stringify(asset), " has no multi-location"));
19009
19310
  case 11:
19010
- return _context.abrupt("return", api.getForeignAssetsByIdBalance(address, asset.assetId));
19311
+ return _context.abrupt("return", api.getAssetHubForeignBalance(address, asset.multiLocation));
19011
19312
  case 12:
19012
19313
  if (!(node === 'AssetHubPolkadot')) {
19013
19314
  _context.next = 18;
@@ -19817,59 +20118,6 @@ var createApiInstanceForNode = /*#__PURE__*/function () {
19817
20118
  };
19818
20119
  }();
19819
20120
 
19820
- var isPrimitive = function isPrimitive(obj) {
19821
- return obj !== Object(obj);
19822
- };
19823
- var _deepEqual = function deepEqual(obj1, obj2) {
19824
- if (obj1 === obj2) return true;
19825
- if (isPrimitive(obj1) && isPrimitive(obj2)) return obj1 === obj2;
19826
- if (_typeof(obj1) !== 'object' || obj1 === null || _typeof(obj2) !== 'object' || obj2 === null) {
19827
- return false;
19828
- }
19829
- if (Array.isArray(obj1) !== Array.isArray(obj2)) {
19830
- return false;
19831
- }
19832
- var obj1Keys = Object.keys(obj1).map(function (key) {
19833
- return key.toLowerCase();
19834
- });
19835
- var obj2Keys = Object.keys(obj2).map(function (key) {
19836
- return key.toLowerCase();
19837
- });
19838
- if (obj1Keys.length !== obj2Keys.length) return false;
19839
- var _iterator = _createForOfIteratorHelper(obj1Keys),
19840
- _step;
19841
- try {
19842
- var _loop = function _loop() {
19843
- var key = _step.value;
19844
- var keyInObj2 = obj2Keys.find(function (k) {
19845
- return k === key;
19846
- });
19847
- if (!keyInObj2) return {
19848
- v: false
19849
- };
19850
- var obj1Value = obj1[Object.keys(obj1).find(function (k) {
19851
- return k.toLowerCase() === key;
19852
- })];
19853
- var obj2Value = obj2[Object.keys(obj2).find(function (k) {
19854
- return k.toLowerCase() === key;
19855
- })];
19856
- if (!_deepEqual(obj1Value, obj2Value)) return {
19857
- v: false
19858
- };
19859
- },
19860
- _ret;
19861
- for (_iterator.s(); !(_step = _iterator.n()).done;) {
19862
- _ret = _loop();
19863
- if (_ret) return _ret.v;
19864
- }
19865
- } catch (err) {
19866
- _iterator.e(err);
19867
- } finally {
19868
- _iterator.f();
19869
- }
19870
- return true;
19871
- };
19872
-
19873
20121
  /* eslint-disable @typescript-eslint/no-explicit-any */
19874
20122
  /* eslint-disable @typescript-eslint/no-unsafe-member-access */
19875
20123
  /* eslint-disable @typescript-eslint/no-unsafe-assignment */
@@ -20392,6 +20640,19 @@ var GeneralBuilder = /*#__PURE__*/function () {
20392
20640
  method: method
20393
20641
  }));
20394
20642
  }
20643
+ /**
20644
+ * Optional fee asset for the transaction.
20645
+ *
20646
+ * @param currency - The currency to be used for the fee.
20647
+ * @returns An instance of the Builder
20648
+ */
20649
+ }, {
20650
+ key: "feeAsset",
20651
+ value: function feeAsset(currency) {
20652
+ return new GeneralBuilder(this.api, this.batchManager, _objectSpread2(_objectSpread2({}, this._options), {}, {
20653
+ feeAsset: currency
20654
+ }));
20655
+ }
20395
20656
  /**
20396
20657
  * Adds the transfer transaction to the batch.
20397
20658
  *
@@ -20534,4 +20795,4 @@ var Builder = function Builder(api) {
20534
20795
  return new GeneralBuilder(api, new BatchTransactionManager());
20535
20796
  };
20536
20797
 
20537
- export { AssetClaimBuilder, BatchMode, Builder, DuplicateAssetError, DuplicateAssetIdError, ETHEREUM_JUNCTION, ETH_CHAIN_ID, Foreign, ForeignAbstract, GeneralBuilder, IncompatibleNodesError, InvalidAddressError, InvalidCurrencyError, NODES_WITH_RELAY_CHAINS, NODES_WITH_RELAY_CHAINS_DOT_KSM, NODE_NAMES, NODE_NAMES_DOT_KSM, Native, NoXCMSupportImplementedError, NodeNotSupportedError, Override, Parents, PolkadotXcmError, SUPPORTED_PALLETS, ScenarioNotSupportedError, Version, XTokensError, claimAssets, computeFeeFromDryRun, computeFeeFromDryRunPjs, createApiInstanceForNode, createX1Payload, _deepEqual as deepEqual, determineRelayChain, findAssetById, findAssetByMultiLocation, findAssetBySymbol, findBestMatches, generateAddressMultiLocationV4, generateAddressPayload, getAllAssetsSymbols, getAssetBalance, getAssetBalanceInternal, getAssetBySymbolOrId, getAssetDecimals, getAssetId, getAssetMultiLocation, getAssets, getAssetsObject, getBalanceForeign, getBalanceForeignInternal, getBalanceNative, getBalanceNativeInternal, getDefaultPallet, getDryRun, getExistentialDeposit, getFees, getMaxForeignTransferableAmount, getMaxNativeTransferableAmount, getNativeAssetSymbol, getNativeAssets, getNode, getNodeConfig, getNodeProviders, getOriginFeeDetails, getOriginFeeDetailsInternal, getOtherAssets, getParaEthTransferFees, getParaId, getRelayChainSymbol, getSupportedAssets, getSupportedPallets, getSupportedPalletsDetails, getTNode, getTransferInfo, getTransferableAmount, hasDryRunSupport, hasSupportForAsset, isEthersContract, isEthersSigner, isForeignAsset, isNodeEvm, isOverrideMultiLocationSpecifier, isRelayChain, isSymbolSpecifier, normalizeSymbol, resolveModuleError, resolveParaId, send, transferMoonbeamEvm, transferMoonbeamToEth, transferRelayToPara, validateAddress, verifyEdOnDestination };
20798
+ export { AssetClaimBuilder, BatchMode, Builder, DuplicateAssetError, DuplicateAssetIdError, ETHEREUM_JUNCTION, ETH_CHAIN_ID, Foreign, ForeignAbstract, GeneralBuilder, IncompatibleNodesError, InvalidAddressError, InvalidCurrencyError, NODES_WITH_RELAY_CHAINS, NODES_WITH_RELAY_CHAINS_DOT_KSM, NODE_NAMES, NODE_NAMES_DOT_KSM, Native, NoXCMSupportImplementedError, NodeNotSupportedError, Override, Parents, PolkadotXcmError, SUPPORTED_PALLETS, ScenarioNotSupportedError, Version, XTokensError, claimAssets, computeFeeFromDryRun, computeFeeFromDryRunPjs, createApiInstanceForNode, createX1Payload, _deepEqual as deepEqual, determineRelayChain, findAssetById, findAssetByMultiLocation, findAssetBySymbol, findBestMatches, generateAddressMultiLocationV4, generateAddressPayload, getAllAssetsSymbols, getAssetBalance, getAssetBalanceInternal, getAssetBySymbolOrId, getAssetDecimals, getAssetId, getAssetMultiLocation, getAssets, getAssetsObject, getBalanceForeign, getBalanceForeignInternal, getBalanceNative, getBalanceNativeInternal, getDefaultPallet, getDryRun, getExistentialDeposit, getFees, getMaxForeignTransferableAmount, getMaxNativeTransferableAmount, getNativeAssetSymbol, getNativeAssets, getNode, getNodeConfig, getNodeProviders, getOriginFeeDetails, getOriginFeeDetailsInternal, getOtherAssets, getParaEthTransferFees, getParaId, getRelayChainSymbol, getSupportedAssets, getSupportedPallets, getSupportedPalletsDetails, getTNode, getTransferInfo, getTransferableAmount, hasDryRunSupport, hasSupportForAsset, isAssetEqual, isEthersContract, isEthersSigner, isForeignAsset, isNodeEvm, isOverrideMultiLocationSpecifier, isRelayChain, isSymbolSpecifier, normalizeSymbol, resolveModuleError, resolveParaId, send, transferMoonbeamEvm, transferMoonbeamToEth, transferRelayToPara, transformMultiLocation, validateAddress, verifyEdOnDestination };