@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.cjs CHANGED
@@ -716,6 +716,8 @@ var NODES_WITH_RELAY_CHAINS_DOT_KSM = [].concat(NODE_NAMES_DOT_KSM, ['Polkadot',
716
716
  * Supported XCM pallets.
717
717
  */
718
718
  var SUPPORTED_PALLETS = ['XTokens', 'OrmlXTokens', 'PolkadotXcm', 'RelayerXcm', 'XTransfer', 'XcmPallet'];
719
+ var SYSTEM_NODES_POLKADOT = ['PeoplePolkadot', 'CoretimePolkadot', 'Collectives'];
720
+ var SYSTEM_NODES_KUSAMA = ['PeopleKusama', 'CoretimeKusama'];
719
721
 
720
722
  /**
721
723
  * Error thrown when multiple assets with the same symbol are found.
@@ -2362,7 +2364,10 @@ var constructRelayToParaParameters = function constructRelayToParaParameters(_re
2362
2364
  return _objectSpread2({
2363
2365
  dest: createPolkadotXcmHeader('RelayToPara', version, destination, paraId),
2364
2366
  beneficiary: generateAddressPayload(api, 'RelayToPara', null, address, version, paraId),
2365
- assets: createCurrencySpec(asset.amount, version, exports.Parents.ZERO),
2367
+ assets: createVersionedMultiAssets(version, asset.amount, {
2368
+ parents: exports.Parents.ZERO,
2369
+ interior: 'Here'
2370
+ }),
2366
2371
  fee_asset_item: DEFAULT_FEE_ASSET
2367
2372
  }, includeFee && {
2368
2373
  weight_limit: 'Unlimited'
@@ -2375,21 +2380,6 @@ var isTMultiLocation = function isTMultiLocation(value) {
2375
2380
  var isTMultiAsset = function isTMultiAsset(value) {
2376
2381
  return _typeof(value) === 'object' && value !== null && 'id' in value && 'fun' in value;
2377
2382
  };
2378
- var createBridgeCurrencySpec = function createBridgeCurrencySpec(amount, ecosystem) {
2379
- return _defineProperty({}, exports.Version.V4, [{
2380
- id: {
2381
- parents: exports.Parents.TWO,
2382
- interior: {
2383
- X1: [{
2384
- GlobalConsensus: ecosystem
2385
- }]
2386
- }
2387
- },
2388
- fun: {
2389
- Fungible: amount.toString()
2390
- }
2391
- }]);
2392
- };
2393
2383
  var createMultiAsset = function createMultiAsset(version, amount, multiLocation) {
2394
2384
  if (version === exports.Version.V4) {
2395
2385
  return {
@@ -2411,22 +2401,27 @@ var createMultiAsset = function createMultiAsset(version, amount, multiLocation)
2411
2401
  var addXcmVersionHeader = function addXcmVersionHeader(obj, version) {
2412
2402
  return _defineProperty({}, version, obj);
2413
2403
  };
2414
- var getCurrency = function getCurrency(amount, version, parents, overriddenCurrency) {
2415
- var interior = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 'Here';
2404
+ var extractVersionFromHeader = function extractVersionFromHeader(versionHeader) {
2405
+ var keys = Object.keys(versionHeader);
2406
+ if (keys.length !== 1) {
2407
+ throw new Error('Invalid version header: expected exactly one key.');
2408
+ }
2409
+ var version = keys[0];
2410
+ var value = versionHeader[version];
2411
+ if (value === undefined) {
2412
+ throw new Error('Invalid version header: value is undefined.');
2413
+ }
2414
+ return [version, value];
2415
+ };
2416
+ var maybeOverrideMultiAssets = function maybeOverrideMultiAssets(version, amount, multiAssets, overriddenCurrency) {
2416
2417
  if (!overriddenCurrency) {
2417
- return [createMultiAsset(version, amount, {
2418
- parents: parents,
2419
- interior: interior
2420
- })];
2418
+ return multiAssets;
2421
2419
  }
2422
- return isTMultiLocation(overriddenCurrency) ? [createMultiAsset(version, amount, overriddenCurrency)] :
2423
- // It must be TMultiAsset if not TMultiLocation
2424
- overriddenCurrency;
2420
+ return isTMultiLocation(overriddenCurrency) ? [createMultiAsset(version, amount, overriddenCurrency)] : overriddenCurrency;
2425
2421
  };
2426
- var createCurrencySpec = function createCurrencySpec(amount, version, parents, overriddenCurrency) {
2427
- var interior = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 'Here';
2428
- var currency = getCurrency(amount, version, parents, overriddenCurrency, interior);
2429
- return addXcmVersionHeader(currency, version);
2422
+ var createVersionedMultiAssets = function createVersionedMultiAssets(version, amount, multiLocation) {
2423
+ var multiAssets = createMultiAsset(version, amount, multiLocation);
2424
+ return addXcmVersionHeader([multiAssets], version);
2430
2425
  };
2431
2426
  var createPolkadotXcmHeader = function createPolkadotXcmHeader(scenario, version, destination, nodeId, junction, parents) {
2432
2427
  var parentsResolved = parents !== null && parents !== void 0 ? parents : scenario === 'RelayToPara' ? exports.Parents.ZERO : exports.Parents.ONE;
@@ -2468,20 +2463,81 @@ var resolveTNodeFromMultiLocation = function resolveTNodeFromMultiLocation(relay
2468
2463
  return node;
2469
2464
  };
2470
2465
  var throwUnsupportedCurrency = function throwUnsupportedCurrency(currency, node) {
2471
- var _ref4 = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {
2466
+ var _ref3 = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {
2472
2467
  isDestination: false
2473
2468
  },
2474
- isDestination = _ref4.isDestination;
2469
+ isDestination = _ref3.isDestination;
2475
2470
  if ('multilocation' in currency) {
2476
2471
  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), ")}."));
2477
2472
  }
2478
2473
  throw new InvalidCurrencyError("".concat(isDestination ? 'Destination' : 'Origin', " node ").concat(node, " does not support currency ").concat(JSON.stringify(currency), "."));
2479
2474
  };
2480
2475
 
2476
+ var isPrimitive = function isPrimitive(obj) {
2477
+ return obj !== Object(obj);
2478
+ };
2479
+ var _deepEqual = function deepEqual(obj1, obj2) {
2480
+ if (obj1 === obj2) return true;
2481
+ if (isPrimitive(obj1) && isPrimitive(obj2)) return obj1 === obj2;
2482
+ if (_typeof(obj1) !== 'object' || obj1 === null || _typeof(obj2) !== 'object' || obj2 === null) {
2483
+ return false;
2484
+ }
2485
+ if (Array.isArray(obj1) !== Array.isArray(obj2)) {
2486
+ return false;
2487
+ }
2488
+ var obj1Keys = Object.keys(obj1).map(function (key) {
2489
+ return key.toLowerCase();
2490
+ });
2491
+ var obj2Keys = Object.keys(obj2).map(function (key) {
2492
+ return key.toLowerCase();
2493
+ });
2494
+ if (obj1Keys.length !== obj2Keys.length) return false;
2495
+ var _iterator = _createForOfIteratorHelper(obj1Keys),
2496
+ _step;
2497
+ try {
2498
+ var _loop = function _loop() {
2499
+ var key = _step.value;
2500
+ var keyInObj2 = obj2Keys.find(function (k) {
2501
+ return k === key;
2502
+ });
2503
+ if (!keyInObj2) return {
2504
+ v: false
2505
+ };
2506
+ var obj1Value = obj1[Object.keys(obj1).find(function (k) {
2507
+ return k.toLowerCase() === key;
2508
+ })];
2509
+ var obj2Value = obj2[Object.keys(obj2).find(function (k) {
2510
+ return k.toLowerCase() === key;
2511
+ })];
2512
+ if (!_deepEqual(obj1Value, obj2Value)) return {
2513
+ v: false
2514
+ };
2515
+ },
2516
+ _ret;
2517
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
2518
+ _ret = _loop();
2519
+ if (_ret) return _ret.v;
2520
+ }
2521
+ } catch (err) {
2522
+ _iterator.e(err);
2523
+ } finally {
2524
+ _iterator.f();
2525
+ }
2526
+ return true;
2527
+ };
2528
+
2481
2529
  var isForeignAsset = function isForeignAsset(asset) {
2482
2530
  return _typeof(asset) === 'object' && asset !== null && ('assetId' in asset || 'multiLocation' in asset) && !('isNative' in asset);
2483
2531
  };
2484
2532
 
2533
+ var isAssetEqual = function isAssetEqual(asset1, asset2) {
2534
+ var ml1 = asset1.multiLocation;
2535
+ var ml2 = asset2.multiLocation;
2536
+ if (ml1 && ml2 && _deepEqual(ml1, ml2)) return true;
2537
+ if (isForeignAsset(asset1) && isForeignAsset(asset2) && asset1.assetId === asset2.assetId) return true;
2538
+ return asset1.symbol.toLowerCase() === asset2.symbol.toLowerCase();
2539
+ };
2540
+
2485
2541
  var isSymbolSpecifier = function isSymbolSpecifier(currencySymbolValue) {
2486
2542
  return _typeof(currencySymbolValue) === 'object' && 'type' in currencySymbolValue && 'value' in currencySymbolValue;
2487
2543
  };
@@ -2537,19 +2593,21 @@ var buildMultiLocation = function buildMultiLocation(_ref) {
2537
2593
  }
2538
2594
  };
2539
2595
  var getModifiedCurrencySelection = function getModifiedCurrencySelection(version, input) {
2540
- var amount = input.asset.amount;
2596
+ var amount = input.asset.amount,
2597
+ overriddenAsset = input.overriddenAsset;
2598
+ if (overriddenAsset) {
2599
+ return addXcmVersionHeader(maybeOverrideMultiAssets(version, amount, [], overriddenAsset), version);
2600
+ }
2541
2601
  var multiLocation = buildMultiLocation(input);
2542
2602
  var multiAsset = createMultiAsset(version, amount, multiLocation);
2543
2603
  return addXcmVersionHeader(multiAsset, version);
2544
2604
  };
2545
2605
 
2546
- var getCurrencySelection = function getCurrencySelection(input, isAssetHub, currencySelection) {
2547
- var origin = input.origin,
2548
- overriddenAsset = input.overriddenAsset;
2606
+ var getCurrencySelection = function getCurrencySelection(input, useMultiAssets, currencySelection) {
2607
+ var origin = input.origin;
2549
2608
  var _getNode = getNode(origin),
2550
2609
  version = _getNode.version;
2551
- if (overriddenAsset !== undefined) return addXcmVersionHeader(overriddenAsset, version);
2552
- if (isAssetHub) {
2610
+ if (useMultiAssets) {
2553
2611
  return getModifiedCurrencySelection(version, input);
2554
2612
  }
2555
2613
  return currencySelection;
@@ -2557,11 +2615,11 @@ var getCurrencySelection = function getCurrencySelection(input, isAssetHub, curr
2557
2615
 
2558
2616
  var getXTokensParameters = function getXTokensParameters(isMultiAssetTransfer, currencySelection, addressSelection, amount, fees, overriddenAsset) {
2559
2617
  if (isMultiAssetTransfer) {
2560
- var isMultiAsset = overriddenAsset && !isTMultiLocation(overriddenAsset);
2561
- var feeAssetIndex = isMultiAsset ? overriddenAsset.findIndex(function (asset) {
2618
+ var isOverridenMultiAssets = overriddenAsset && !isTMultiLocation(overriddenAsset);
2619
+ var feeAssetIndex = isOverridenMultiAssets ? overriddenAsset.findIndex(function (asset) {
2562
2620
  return asset.isFeeAsset;
2563
2621
  }) : undefined;
2564
- return _objectSpread2(_objectSpread2(_defineProperty({}, isMultiAsset ? 'assets' : 'asset', currencySelection), isMultiAsset && {
2622
+ return _objectSpread2(_objectSpread2(_defineProperty({}, isOverridenMultiAssets ? 'assets' : 'asset', currencySelection), isOverridenMultiAssets && {
2565
2623
  fee_item: feeAssetIndex
2566
2624
  }), {}, {
2567
2625
  dest: addressSelection,
@@ -2601,10 +2659,10 @@ var XTokensTransferImpl = /*#__PURE__*/function () {
2601
2659
  var isAssetHubDest = destination === 'AssetHubPolkadot' || destination === 'AssetHubKusama';
2602
2660
  var isAstarOrShidenToRelay = scenario === 'ParaToRelay' && (origin === 'Astar' || origin === 'Shiden');
2603
2661
  var isTuring = origin === 'Turing';
2604
- var isMultiAsset = overriddenAsset && !isTMultiLocation(overriddenAsset);
2605
- var shouldUseMultiasset = isTuring || isAstarOrShidenToRelay || isAssetHubDest && !isBifrostOrigin || !!isMultiAsset;
2662
+ var isOverridenMultiAssets = overriddenAsset && !isTMultiLocation(overriddenAsset);
2663
+ var shouldUseMultiasset = isTuring || isAstarOrShidenToRelay || isAssetHubDest && !isBifrostOrigin || !!isOverridenMultiAssets;
2606
2664
  var modifiedCurrencySelection = getCurrencySelection(input, shouldUseMultiasset, currencySelection);
2607
- var section = shouldUseMultiasset ? isMultiAsset ? 'transfer_multiassets' : 'transfer_multiasset' : 'transfer';
2665
+ var section = shouldUseMultiasset ? isOverridenMultiAssets ? 'transfer_multiassets' : 'transfer_multiasset' : 'transfer';
2608
2666
  var parameters = getXTokensParameters(shouldUseMultiasset, modifiedCurrencySelection, addressSelection, asset.amount, fees, overriddenAsset);
2609
2667
  var call = {
2610
2668
  module: pallet !== null && pallet !== void 0 ? pallet : 'XTokens',
@@ -3671,6 +3729,14 @@ var resolveAsset = function resolveAsset(currency, origin, destination, assetChe
3671
3729
  return assetCheckEnabled ? getAssetBySymbolOrId(origin, currency, !isTMultiLocation(destination) ? destination : null) : null;
3672
3730
  };
3673
3731
 
3732
+ var resolveFeeAsset = function resolveFeeAsset(feeAsset, origin, destination) {
3733
+ var asset = getAssetBySymbolOrId(origin, feeAsset, !isTMultiLocation(destination) ? destination : null);
3734
+ if (!asset) {
3735
+ throwUnsupportedCurrency(feeAsset, origin);
3736
+ }
3737
+ return asset !== null && asset !== void 0 ? asset : undefined;
3738
+ };
3739
+
3674
3740
  var AssetHubPolkadot$2 = {
3675
3741
  defaultPallet: "PolkadotXcm",
3676
3742
  supportedPallets: [
@@ -4479,7 +4545,7 @@ var getSupportedPalletsDetails = function getSupportedPalletsDetails(node) {
4479
4545
  return palletsMap[node].supportedPallets;
4480
4546
  };
4481
4547
 
4482
- var validateCurrency = function validateCurrency(currency) {
4548
+ var validateCurrency = function validateCurrency(currency, feeAsset) {
4483
4549
  if ('multiasset' in currency) {
4484
4550
  if (currency.multiasset.length === 0) {
4485
4551
  throw new InvalidCurrencyError('Overridden multi assets cannot be empty');
@@ -4487,16 +4553,9 @@ var validateCurrency = function validateCurrency(currency) {
4487
4553
  if (currency.multiasset.length === 1) {
4488
4554
  throw new InvalidCurrencyError('Please provide more than one multi asset');
4489
4555
  }
4490
- if (currency.multiasset.length > 1 && !currency.multiasset.some(function (asset) {
4491
- return asset.isFeeAsset;
4492
- })) {
4556
+ if (currency.multiasset.length > 1 && !feeAsset) {
4493
4557
  throw new InvalidCurrencyError('Overridden multi assets cannot be used without specifying fee asset');
4494
4558
  }
4495
- if (currency.multiasset.length > 1 && currency.multiasset.filter(function (asset) {
4496
- return asset.isFeeAsset;
4497
- }).length > 1) {
4498
- throw new InvalidCurrencyError('Overridden multi assets cannot have more than one fee asset');
4499
- }
4500
4559
  }
4501
4560
  };
4502
4561
  var validateDestination = function validateDestination(origin, destination) {
@@ -4556,7 +4615,7 @@ var validateAssetSupport = function validateAssetSupport(_ref, assetCheckEnabled
4556
4615
  }
4557
4616
  };
4558
4617
 
4559
- var resolveOverriddenAsset = function resolveOverriddenAsset(options, isBridge, assetCheckEnabled) {
4618
+ var resolveOverriddenAsset = function resolveOverriddenAsset(options, isBridge, assetCheckEnabled, feeAsset) {
4560
4619
  var currency = options.currency,
4561
4620
  origin = options.from,
4562
4621
  destination = options.to;
@@ -4564,6 +4623,9 @@ var resolveOverriddenAsset = function resolveOverriddenAsset(options, isBridge,
4564
4623
  return currency.multilocation.value;
4565
4624
  }
4566
4625
  if ('multiasset' in currency) {
4626
+ if (!feeAsset) {
4627
+ throw new InvalidCurrencyError('Overridden multi assets cannot be used without specifying fee asset');
4628
+ }
4567
4629
  if (currency.multiasset.every(function (asset) {
4568
4630
  return isTMultiAsset(asset);
4569
4631
  })) {
@@ -4571,18 +4633,30 @@ var resolveOverriddenAsset = function resolveOverriddenAsset(options, isBridge,
4571
4633
  }
4572
4634
  // MultiAsset is an array of TCurrencyCore, search for assets
4573
4635
  var assets = currency.multiasset.map(function (currency) {
4574
- var _currency$isFeeAsset;
4575
4636
  var asset = getAssetBySymbolOrId(origin, currency, !isTMultiLocation(destination) ? destination : null);
4576
4637
  if (asset && (!isForeignAsset(asset) || !asset.multiLocation)) {
4577
4638
  throw new InvalidCurrencyError("Asset ".concat(JSON.stringify(currency), " does not have a multiLocation"));
4578
4639
  }
4640
+ if (!asset) {
4641
+ throw new InvalidCurrencyError("Origin node ".concat(origin, " does not support currency ").concat(JSON.stringify(currency)));
4642
+ }
4579
4643
  validateAssetSupport(options, assetCheckEnabled, isBridge, asset);
4580
4644
  var originTyped = origin;
4581
4645
  var originNode = getNode(originTyped);
4582
4646
  return _objectSpread2({
4583
- isFeeAsset: (_currency$isFeeAsset = currency.isFeeAsset) !== null && _currency$isFeeAsset !== void 0 ? _currency$isFeeAsset : false
4584
- }, createMultiAsset(originNode.version, currency.amount, asset === null || asset === void 0 ? void 0 : asset.multiLocation));
4647
+ isFeeAsset: isAssetEqual(feeAsset, asset)
4648
+ }, createMultiAsset(originNode.version, currency.amount, asset.multiLocation));
4585
4649
  });
4650
+ if (assets.filter(function (asset) {
4651
+ return asset.isFeeAsset;
4652
+ }).length > 1) {
4653
+ throw new InvalidCurrencyError("Fee asset matches multiple assets in multiassets");
4654
+ }
4655
+ if (assets.filter(function (asset) {
4656
+ return asset.isFeeAsset;
4657
+ }).length === 0) {
4658
+ throw new InvalidCurrencyError("Fee asset not found in multiassets");
4659
+ }
4586
4660
  return assets;
4587
4661
  }
4588
4662
  return undefined;
@@ -4611,12 +4685,12 @@ var validateDestinationAddress = function validateDestinationAddress(address, de
4611
4685
 
4612
4686
  var send = /*#__PURE__*/function () {
4613
4687
  var _ref = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee(options) {
4614
- var api, origin, currency, address, destination, paraIdTo, version, senderAddress, pallet, method, isBridge, assetCheckEnabled, asset, overriddenAsset, resolvedAsset, originNode;
4688
+ var api, origin, currency, feeAsset, address, destination, paraIdTo, version, senderAddress, pallet, method, isBridge, assetCheckEnabled, asset, resolvedFeeAsset, overriddenAsset, resolvedAsset, originNode;
4615
4689
  return _regeneratorRuntime().wrap(function _callee$(_context) {
4616
4690
  while (1) switch (_context.prev = _context.next) {
4617
4691
  case 0:
4618
- 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;
4619
- validateCurrency(currency);
4692
+ 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;
4693
+ validateCurrency(currency, feeAsset);
4620
4694
  validateDestination(origin, destination);
4621
4695
  validateDestinationAddress(address, destination);
4622
4696
  if (senderAddress) validateAddress(senderAddress, origin, false);
@@ -4630,23 +4704,24 @@ var send = /*#__PURE__*/function () {
4630
4704
  assetCheckEnabled = determineAssetCheckEnabled(origin, currency, isBridge);
4631
4705
  validateAssetSpecifiers(assetCheckEnabled, currency);
4632
4706
  asset = resolveAsset(currency, origin, destination, assetCheckEnabled);
4707
+ resolvedFeeAsset = feeAsset ? resolveFeeAsset(feeAsset, origin, destination) : undefined;
4633
4708
  validateAssetSupport(options, assetCheckEnabled, isBridge, asset);
4634
4709
  if (!isRelayChain(origin)) {
4635
- _context.next = 18;
4710
+ _context.next = 19;
4636
4711
  break;
4637
4712
  }
4638
4713
  if (!(destination === 'Ethereum')) {
4639
- _context.next = 15;
4714
+ _context.next = 16;
4640
4715
  break;
4641
4716
  }
4642
4717
  throw new Error('Transfers from relay chain to Ethereum are not supported.');
4643
- case 15:
4718
+ case 16:
4644
4719
  if (asset) {
4645
- _context.next = 17;
4720
+ _context.next = 18;
4646
4721
  break;
4647
4722
  }
4648
4723
  throw new Error('Asset is required for relay chain to relay chain transfers.');
4649
- case 17:
4724
+ case 18:
4650
4725
  return _context.abrupt("return", transferRelayToPara({
4651
4726
  api: api,
4652
4727
  origin: origin,
@@ -4660,11 +4735,11 @@ var send = /*#__PURE__*/function () {
4660
4735
  pallet: pallet,
4661
4736
  method: method
4662
4737
  }));
4663
- case 18:
4664
- overriddenAsset = resolveOverriddenAsset(options, isBridge, assetCheckEnabled);
4665
- _context.next = 21;
4738
+ case 19:
4739
+ overriddenAsset = resolveOverriddenAsset(options, isBridge, assetCheckEnabled, resolvedFeeAsset);
4740
+ _context.next = 22;
4666
4741
  return api.init(origin);
4667
- case 21:
4742
+ case 22:
4668
4743
  // In case asset check is disabled, we create asset object from currency symbol
4669
4744
  resolvedAsset = asset !== null && asset !== void 0 ? asset : {
4670
4745
  symbol: 'symbol' in currency ? currency.symbol : undefined
@@ -4675,6 +4750,7 @@ var send = /*#__PURE__*/function () {
4675
4750
  asset: _objectSpread2(_objectSpread2({}, resolvedAsset), {}, {
4676
4751
  amount: 'multiasset' in currency ? 0 : currency.amount
4677
4752
  }),
4753
+ feeAsset: resolvedFeeAsset,
4678
4754
  address: address,
4679
4755
  to: destination,
4680
4756
  paraIdTo: paraIdTo,
@@ -4684,7 +4760,7 @@ var send = /*#__PURE__*/function () {
4684
4760
  pallet: pallet,
4685
4761
  method: method
4686
4762
  }));
4687
- case 24:
4763
+ case 25:
4688
4764
  case "end":
4689
4765
  return _context.stop();
4690
4766
  }
@@ -4754,11 +4830,11 @@ var ParachainNode = /*#__PURE__*/function () {
4754
4830
  key: "transfer",
4755
4831
  value: function () {
4756
4832
  var _transfer = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee(options) {
4757
- var api, asset, address, destination, paraIdTo, overriddenAsset, version, senderAddress, pallet, method, isRelayDestination, scenario, paraId, versionOrDefault, isBifrostOrigin, isAssetHubDest, shouldUseMultiasset, input;
4833
+ var api, asset, feeAsset, address, destination, paraIdTo, overriddenAsset, version, senderAddress, pallet, method, isRelayDestination, scenario, paraId, versionOrDefault, isBifrostOrigin, isAssetHubDest, shouldUseMultiasset, input;
4758
4834
  return _regeneratorRuntime().wrap(function _callee$(_context) {
4759
4835
  while (1) switch (_context.prev = _context.next) {
4760
4836
  case 0:
4761
- 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;
4837
+ 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;
4762
4838
  isRelayDestination = !isTMultiLocation(destination) && isRelayChain(destination);
4763
4839
  scenario = isRelayDestination ? 'ParaToRelay' : 'ParaToPara';
4764
4840
  paraId = resolveParaId(paraIdTo, destination);
@@ -4822,12 +4898,13 @@ var ParachainNode = /*#__PURE__*/function () {
4822
4898
  header: this.createPolkadotXcmHeader(scenario, versionOrDefault, destination, paraId),
4823
4899
  addressSelection: generateAddressPayload(api, scenario, 'PolkadotXcm', address, versionOrDefault, paraId),
4824
4900
  address: address,
4825
- currencySelection: this.createCurrencySpec(asset.amount, scenario, versionOrDefault, asset, overriddenAsset),
4901
+ currencySelection: this.createCurrencySpec(asset.amount, scenario, versionOrDefault, asset),
4902
+ overriddenAsset: overriddenAsset,
4826
4903
  asset: asset,
4904
+ feeAsset: feeAsset,
4827
4905
  scenario: scenario,
4828
4906
  destination: destination,
4829
4907
  paraIdTo: paraId,
4830
- overriddenAsset: overriddenAsset,
4831
4908
  version: version,
4832
4909
  senderAddress: senderAddress,
4833
4910
  pallet: pallet,
@@ -4874,8 +4951,11 @@ var ParachainNode = /*#__PURE__*/function () {
4874
4951
  }
4875
4952
  }, {
4876
4953
  key: "createCurrencySpec",
4877
- value: function createCurrencySpec$1(amount, scenario, version, _asset, overridedMultiLocation) {
4878
- return createCurrencySpec(amount, version, scenario === 'ParaToRelay' ? exports.Parents.ONE : exports.Parents.ZERO, overridedMultiLocation);
4954
+ value: function createCurrencySpec(amount, scenario, version, _asset) {
4955
+ return createVersionedMultiAssets(version, amount, {
4956
+ parents: scenario === 'ParaToRelay' ? exports.Parents.ONE : exports.Parents.ZERO,
4957
+ interior: 'Here'
4958
+ });
4879
4959
  }
4880
4960
  }, {
4881
4961
  key: "createPolkadotXcmHeader",
@@ -5047,12 +5127,18 @@ var PolkadotXCMTransferImpl = /*#__PURE__*/function () {
5047
5127
  value: function transferPolkadotXCM(_ref, section) {
5048
5128
  var api = _ref.api,
5049
5129
  header = _ref.header,
5130
+ asset = _ref.asset,
5050
5131
  addressSelection = _ref.addressSelection,
5051
5132
  currencySelection = _ref.currencySelection,
5052
5133
  overriddenAsset = _ref.overriddenAsset,
5053
5134
  pallet = _ref.pallet,
5054
5135
  method = _ref.method;
5055
5136
  var fees = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : undefined;
5137
+ var _extractVersionFromHe = extractVersionFromHeader(currencySelection),
5138
+ _extractVersionFromHe2 = _slicedToArray(_extractVersionFromHe, 2),
5139
+ version = _extractVersionFromHe2[0],
5140
+ multiAssets = _extractVersionFromHe2[1];
5141
+ var resolvedMultiAssets = addXcmVersionHeader(maybeOverrideMultiAssets(version, asset.amount, multiAssets, overriddenAsset), version);
5056
5142
  var feeAssetIndex = overriddenAsset === undefined || isTMultiLocation(overriddenAsset) ? DEFAULT_FEE_ASSET : overriddenAsset.findIndex(function (asset) {
5057
5143
  return asset.isFeeAsset;
5058
5144
  });
@@ -5062,7 +5148,7 @@ var PolkadotXCMTransferImpl = /*#__PURE__*/function () {
5062
5148
  parameters: _objectSpread2({
5063
5149
  dest: header,
5064
5150
  beneficiary: addressSelection,
5065
- assets: currencySelection,
5151
+ assets: resolvedMultiAssets,
5066
5152
  fee_asset_item: feeAssetIndex
5067
5153
  }, fees !== undefined ? {
5068
5154
  weight_limit: fees
@@ -5090,13 +5176,14 @@ var AssetHubKusama$1 = /*#__PURE__*/function (_ParachainNode) {
5090
5176
  if (destination === 'AssetHubPolkadot') {
5091
5177
  return Promise.resolve(getNode('AssetHubPolkadot').handleBridgeTransfer(input, 'Polkadot'));
5092
5178
  }
5093
- if (scenario === 'ParaToPara' && asset.symbol === 'KSM' && !isForeignAsset(asset)) {
5179
+ var isSystemNode = !isTMultiLocation(destination) && SYSTEM_NODES_KUSAMA.includes(destination);
5180
+ if (scenario === 'ParaToPara' && asset.symbol === 'KSM' && !isForeignAsset(asset) && !isSystemNode) {
5094
5181
  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.');
5095
5182
  }
5096
5183
  if (scenario === 'ParaToPara' && asset.symbol === 'DOT' && !isForeignAsset(asset)) {
5097
5184
  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>}.');
5098
5185
  }
5099
- var section = scenario === 'ParaToPara' ? 'limited_reserve_transfer_assets' : 'limited_teleport_assets';
5186
+ var section = scenario === 'ParaToPara' && !isSystemNode ? 'limited_reserve_transfer_assets' : 'limited_teleport_assets';
5100
5187
  return Promise.resolve(PolkadotXCMTransferImpl.transferPolkadotXCM(input, section, 'Unlimited'));
5101
5188
  }
5102
5189
  }, {
@@ -5109,12 +5196,124 @@ var AssetHubKusama$1 = /*#__PURE__*/function (_ParachainNode) {
5109
5196
  }
5110
5197
  }, {
5111
5198
  key: "createCurrencySpec",
5112
- value: function createCurrencySpec(amount, scenario, version, asset, overridedMultiLocation) {
5113
- return getNode('AssetHubPolkadot').createCurrencySpec(amount, scenario, version, asset, overridedMultiLocation);
5199
+ value: function createCurrencySpec(amount, scenario, version, asset) {
5200
+ return getNode('AssetHubPolkadot').createCurrencySpec(amount, scenario, version, asset);
5114
5201
  }
5115
5202
  }]);
5116
5203
  }(ParachainNode);
5117
5204
 
5205
+ var transformMultiLocation = function transformMultiLocation(multiLocation) {
5206
+ var newInterior;
5207
+ if (multiLocation.interior === 'Here') {
5208
+ newInterior = 'Here';
5209
+ } else {
5210
+ var junctions = Object.values(multiLocation.interior).flat().filter(function (junction) {
5211
+ return _typeof(junction) === 'object' && junction !== null;
5212
+ });
5213
+ var filteredJunctions = junctions.filter(function (junction) {
5214
+ return !('Parachain' in junction);
5215
+ });
5216
+ if (filteredJunctions.length === 0) {
5217
+ newInterior = 'Here';
5218
+ } else {
5219
+ newInterior = _defineProperty({}, "X".concat(filteredJunctions.length), filteredJunctions);
5220
+ }
5221
+ }
5222
+ return _objectSpread2(_objectSpread2({}, multiLocation), {}, {
5223
+ parents: exports.Parents.ZERO,
5224
+ interior: newInterior
5225
+ });
5226
+ };
5227
+
5228
+ var createExecuteXcm = function createExecuteXcm(input, weight, executionFee) {
5229
+ var api = input.api,
5230
+ _input$version = input.version,
5231
+ version = _input$version === void 0 ? exports.Version.V4 : _input$version,
5232
+ asset = input.asset,
5233
+ scenario = input.scenario,
5234
+ destination = input.destination,
5235
+ paraIdTo = input.paraIdTo,
5236
+ address = input.address;
5237
+ var destWithHeader = createPolkadotXcmHeader(scenario, version, destination, paraIdTo);
5238
+ var _extractVersionFromHe = extractVersionFromHeader(destWithHeader),
5239
+ _extractVersionFromHe2 = _slicedToArray(_extractVersionFromHe, 2);
5240
+ _extractVersionFromHe2[0];
5241
+ var dest = _extractVersionFromHe2[1];
5242
+ var beneficiaryWithHeader = generateAddressPayload(api, scenario, 'PolkadotXcm', address, version, paraIdTo);
5243
+ var _extractVersionFromHe3 = extractVersionFromHeader(beneficiaryWithHeader),
5244
+ _extractVersionFromHe4 = _slicedToArray(_extractVersionFromHe3, 2);
5245
+ _extractVersionFromHe4[0];
5246
+ var beneficiary = _extractVersionFromHe4[1];
5247
+ var transformedMultiLocation = transformMultiLocation(asset.multiLocation);
5248
+ var amountWithoutFee = BigInt(asset.amount) - executionFee;
5249
+ var call = {
5250
+ module: 'PolkadotXcm',
5251
+ section: 'execute',
5252
+ parameters: {
5253
+ message: _defineProperty({}, version, [{
5254
+ WithdrawAsset: [{
5255
+ id: transformedMultiLocation,
5256
+ fun: {
5257
+ Fungible: asset.amount
5258
+ }
5259
+ }]
5260
+ }, {
5261
+ BuyExecution: {
5262
+ fees: {
5263
+ id: transformedMultiLocation,
5264
+ fun: {
5265
+ Fungible: executionFee
5266
+ }
5267
+ },
5268
+ weight_limit: {
5269
+ Limited: {
5270
+ ref_time: 100n,
5271
+ proof_size: 0n
5272
+ }
5273
+ }
5274
+ }
5275
+ }, {
5276
+ DepositReserveAsset: {
5277
+ assets: {
5278
+ Definite: [{
5279
+ id: transformedMultiLocation,
5280
+ fun: {
5281
+ Fungible: amountWithoutFee
5282
+ }
5283
+ }]
5284
+ },
5285
+ dest: dest,
5286
+ xcm: [{
5287
+ BuyExecution: {
5288
+ fees: {
5289
+ id: asset.multiLocation,
5290
+ fun: {
5291
+ Fungible: amountWithoutFee
5292
+ }
5293
+ },
5294
+ weight_limit: 'Unlimited'
5295
+ }
5296
+ }, {
5297
+ DepositAsset: {
5298
+ assets: {
5299
+ Wild: {
5300
+ AllCounted: 1
5301
+ }
5302
+ },
5303
+ beneficiary: beneficiary
5304
+ }
5305
+ }]
5306
+ }
5307
+ }]),
5308
+ max_weight: {
5309
+ ref_time: weight.refTime,
5310
+ proof_size: weight.proofSize
5311
+ }
5312
+ }
5313
+ };
5314
+ return api.callTxMethod(call);
5315
+ };
5316
+
5118
5317
  var generateAddressMultiLocationV4 = function generateAddressMultiLocationV4(api, address) {
5119
5318
  var isMultiLocation = _typeof(address) === 'object';
5120
5319
  if (isMultiLocation) {
@@ -5159,7 +5358,8 @@ var AssetHubPolkadot$1 = /*#__PURE__*/function (_ParachainNode) {
5159
5358
  _this.handleBifrostEthTransfer = function (input) {
5160
5359
  var api = input.api,
5161
5360
  scenario = input.scenario,
5162
- version = input.version,
5361
+ _input$version = input.version,
5362
+ version = _input$version === void 0 ? _this.version : _input$version,
5163
5363
  destination = input.destination,
5164
5364
  asset = input.asset;
5165
5365
  if (!isForeignAsset(asset)) {
@@ -5168,19 +5368,18 @@ var AssetHubPolkadot$1 = /*#__PURE__*/function (_ParachainNode) {
5168
5368
  if (!asset.multiLocation) {
5169
5369
  throw new InvalidCurrencyError("Asset ".concat(JSON.stringify(asset), " has no multiLocation"));
5170
5370
  }
5171
- var versionOrDefault = version !== null && version !== void 0 ? version : _this.version;
5172
5371
  var call = {
5173
5372
  module: 'PolkadotXcm',
5174
5373
  section: 'transfer_assets_using_type_and_then',
5175
5374
  parameters: {
5176
- dest: _this.createPolkadotXcmHeader(scenario, versionOrDefault, destination, getParaId('BifrostPolkadot')),
5177
- assets: _defineProperty({}, versionOrDefault, [createMultiAsset(versionOrDefault, asset.amount, asset.multiLocation)]),
5375
+ dest: _this.createPolkadotXcmHeader(scenario, version, destination, getParaId('BifrostPolkadot')),
5376
+ assets: _defineProperty({}, version, [createMultiAsset(version, asset.amount, asset.multiLocation)]),
5178
5377
  assets_transfer_type: 'LocalReserve',
5179
- remote_fees_id: _defineProperty({}, versionOrDefault, {
5378
+ remote_fees_id: _defineProperty({}, version, {
5180
5379
  Concrete: asset.multiLocation
5181
5380
  }),
5182
5381
  fees_transfer_type: 'LocalReserve',
5183
- custom_xcm_on_dest: createCustomXcmToBifrost(input, versionOrDefault),
5382
+ custom_xcm_on_dest: createCustomXcmToBifrost(input, version),
5184
5383
  weight_limit: 'Unlimited'
5185
5384
  }
5186
5385
  };
@@ -5194,16 +5393,26 @@ var AssetHubPolkadot$1 = /*#__PURE__*/function (_ParachainNode) {
5194
5393
  value: function handleBridgeTransfer(input, targetChain) {
5195
5394
  var _input$asset$symbol, _input$asset$symbol2, _input$asset$symbol3, _input$asset$symbol4;
5196
5395
  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') {
5396
+ var overriddenVersion = exports.Version.V4;
5397
+ var customMultiLocation = {
5398
+ parents: exports.Parents.TWO,
5399
+ interior: {
5400
+ X1: [{
5401
+ GlobalConsensus: targetChain
5402
+ }]
5403
+ }
5404
+ };
5197
5405
  var modifiedInput = _objectSpread2(_objectSpread2({}, input), {}, {
5198
- header: createBridgePolkadotXcmDest(exports.Version.V4, targetChain, input.destination, input.paraIdTo),
5406
+ header: createBridgePolkadotXcmDest(overriddenVersion, targetChain, input.destination, input.paraIdTo),
5199
5407
  addressSelection: generateAddressMultiLocationV4(input.api, input.address),
5200
- currencySelection: createBridgeCurrencySpec(input.asset.amount, targetChain)
5408
+ currencySelection: createVersionedMultiAssets(overriddenVersion, input.asset.amount, customMultiLocation)
5201
5409
  });
5202
5410
  return PolkadotXCMTransferImpl.transferPolkadotXCM(modifiedInput, 'transfer_assets', 'Unlimited');
5203
5411
  } 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') {
5412
+ var _overriddenVersion = exports.Version.V3;
5204
5413
  var _modifiedInput = _objectSpread2(_objectSpread2({}, input), {}, {
5205
- header: createBridgePolkadotXcmDest(exports.Version.V3, targetChain, input.destination, input.paraIdTo),
5206
- currencySelection: createCurrencySpec(input.asset.amount, exports.Version.V3, exports.Parents.ONE, input.overriddenAsset)
5414
+ header: createBridgePolkadotXcmDest(_overriddenVersion, targetChain, input.destination, input.paraIdTo),
5415
+ currencySelection: createVersionedMultiAssets(_overriddenVersion, input.asset.amount, DOT_MULTILOCATION)
5207
5416
  });
5208
5417
  return PolkadotXCMTransferImpl.transferPolkadotXCM(_modifiedInput, 'limited_reserve_transfer_assets', 'Unlimited');
5209
5418
  }
@@ -5230,7 +5439,7 @@ var AssetHubPolkadot$1 = /*#__PURE__*/function (_ParachainNode) {
5230
5439
  var modifiedInput = _objectSpread2(_objectSpread2({}, input), {}, {
5231
5440
  header: createPolkadotXcmHeader(scenario, this.version, destination, paraIdTo, ETHEREUM_JUNCTION, exports.Parents.TWO),
5232
5441
  addressSelection: generateAddressPayload(api, scenario, 'PolkadotXcm', address, this.version, paraIdTo),
5233
- currencySelection: createCurrencySpec(input.asset.amount, exports.Version.V3, exports.Parents.TWO, asset.multiLocation)
5442
+ currencySelection: createVersionedMultiAssets(exports.Version.V3, asset.amount, asset.multiLocation)
5234
5443
  });
5235
5444
  return PolkadotXCMTransferImpl.transferPolkadotXCM(modifiedInput, 'transfer_assets', 'Unlimited');
5236
5445
  }
@@ -5240,7 +5449,6 @@ var AssetHubPolkadot$1 = /*#__PURE__*/function (_ParachainNode) {
5240
5449
  var api = input.api,
5241
5450
  address = input.address,
5242
5451
  asset = input.asset,
5243
- overriddenAsset = input.overriddenAsset,
5244
5452
  scenario = input.scenario,
5245
5453
  destination = input.destination,
5246
5454
  paraIdTo = input.paraIdTo;
@@ -5257,7 +5465,7 @@ var AssetHubPolkadot$1 = /*#__PURE__*/function (_ParachainNode) {
5257
5465
  var modifiedInput = _objectSpread2(_objectSpread2({}, input), {}, {
5258
5466
  header: this.createPolkadotXcmHeader(scenario, version, destination, paraId),
5259
5467
  addressSelection: generateAddressPayload(api, scenario, 'PolkadotXcm', address, version, paraId),
5260
- currencySelection: this.createCurrencySpec(asset.amount, scenario, version, asset, overriddenAsset !== null && overriddenAsset !== void 0 ? overriddenAsset : customMultiLocation)
5468
+ currencySelection: createVersionedMultiAssets(version, asset.amount, customMultiLocation)
5261
5469
  });
5262
5470
  return PolkadotXCMTransferImpl.transferPolkadotXCM(modifiedInput, 'limited_teleport_assets', 'Unlimited');
5263
5471
  }
@@ -5268,24 +5476,23 @@ var AssetHubPolkadot$1 = /*#__PURE__*/function (_ParachainNode) {
5268
5476
  var asset = input.asset,
5269
5477
  destination = input.destination,
5270
5478
  paraIdTo = input.paraIdTo,
5271
- overriddenAsset = input.overriddenAsset,
5272
5479
  scenario = input.scenario,
5273
5480
  api = input.api,
5274
- version = input.version,
5481
+ _input$version2 = input.version,
5482
+ version = _input$version2 === void 0 ? this.version : _input$version2,
5275
5483
  address = input.address;
5276
5484
  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') {
5277
- var _input$version;
5278
- var versionOrDefault = (_input$version = input.version) !== null && _input$version !== void 0 ? _input$version : exports.Version.V2;
5485
+ var _input$version3;
5486
+ var versionOrDefault = (_input$version3 = input.version) !== null && _input$version3 !== void 0 ? _input$version3 : exports.Version.V2;
5279
5487
  return _objectSpread2(_objectSpread2({}, input), {}, {
5280
5488
  header: this.createPolkadotXcmHeader(scenario, versionOrDefault, destination, paraIdTo),
5281
5489
  addressSelection: generateAddressPayload(api, scenario, 'PolkadotXcm', address, versionOrDefault, paraIdTo),
5282
- currencySelection: this.createCurrencySpec(asset.amount, scenario, versionOrDefault, asset, overriddenAsset)
5490
+ currencySelection: this.createCurrencySpec(asset.amount, scenario, versionOrDefault, asset)
5283
5491
  });
5284
5492
  }
5285
5493
  if ((destination === 'Hydration' || destination === 'Polimec' || destination === 'Moonbeam' || destination === 'BifrostPolkadot') && asset.symbol === 'DOT') {
5286
- var _versionOrDefault = version !== null && version !== void 0 ? version : this.version;
5287
5494
  return _objectSpread2(_objectSpread2({}, input), {}, {
5288
- currencySelection: _superPropGet(AssetHubPolkadot, "createCurrencySpec", this, 3)([asset.amount, 'ParaToRelay', _versionOrDefault, asset, overriddenAsset])
5495
+ currencySelection: createVersionedMultiAssets(version, asset.amount, DOT_MULTILOCATION)
5289
5496
  });
5290
5497
  }
5291
5498
  return input;
@@ -5293,15 +5500,96 @@ var AssetHubPolkadot$1 = /*#__PURE__*/function (_ParachainNode) {
5293
5500
  }, {
5294
5501
  key: "getSection",
5295
5502
  value: function getSection(scenario, destination) {
5503
+ var isSystemNode = !isTMultiLocation(destination) && SYSTEM_NODES_POLKADOT.includes(destination);
5296
5504
  if (destination === 'Polimec' || destination === 'Moonbeam') return 'transfer_assets';
5297
- return scenario === 'ParaToPara' ? 'limited_reserve_transfer_assets' : 'limited_teleport_assets';
5505
+ return scenario === 'ParaToPara' && !isSystemNode ? 'limited_reserve_transfer_assets' : 'limited_teleport_assets';
5298
5506
  }
5507
+ }, {
5508
+ key: "handleExecuteTransfer",
5509
+ value: function () {
5510
+ var _handleExecuteTransfer = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee(input) {
5511
+ var api, senderAddress, asset, MIN_FEE, maxU64, dummyTx, dryRunResult, feeDotShifted, toMl, feeConverted, feeConvertedPadded;
5512
+ return _regeneratorRuntime().wrap(function _callee$(_context) {
5513
+ while (1) switch (_context.prev = _context.next) {
5514
+ case 0:
5515
+ api = input.api, senderAddress = input.senderAddress, asset = input.asset;
5516
+ if (senderAddress) {
5517
+ _context.next = 3;
5518
+ break;
5519
+ }
5520
+ throw new Error('Please provide senderAddress');
5521
+ case 3:
5522
+ validateAddress(senderAddress, this.node, false);
5523
+ MIN_FEE = 150000n;
5524
+ maxU64 = (1n << 64n) - 1n;
5525
+ dummyTx = createExecuteXcm(input, {
5526
+ refTime: maxU64,
5527
+ proofSize: maxU64
5528
+ }, MIN_FEE);
5529
+ _context.next = 9;
5530
+ return api.getDryRun({
5531
+ node: this.node,
5532
+ tx: dummyTx,
5533
+ address: senderAddress
5534
+ });
5535
+ case 9:
5536
+ dryRunResult = _context.sent;
5537
+ if (dryRunResult.success) {
5538
+ _context.next = 12;
5539
+ break;
5540
+ }
5541
+ throw new Error("Dry run failed: ".concat(dryRunResult.failureReason));
5542
+ case 12:
5543
+ if (dryRunResult.weight) {
5544
+ _context.next = 14;
5545
+ break;
5546
+ }
5547
+ throw new Error('Dry run failed: weight not found');
5548
+ case 14:
5549
+ feeDotShifted = dryRunResult.fee / 10n;
5550
+ toMl = transformMultiLocation(asset.multiLocation);
5551
+ _context.next = 18;
5552
+ return api.quoteAhPrice(DOT_MULTILOCATION, toMl, feeDotShifted);
5553
+ case 18:
5554
+ feeConverted = _context.sent;
5555
+ if (feeConverted) {
5556
+ _context.next = 21;
5557
+ break;
5558
+ }
5559
+ throw new Error("Pool DOT -> ".concat(asset.symbol, " not found."));
5560
+ case 21:
5561
+ if (!(BigInt(asset.amount) - feeConverted < 0)) {
5562
+ _context.next = 23;
5563
+ break;
5564
+ }
5565
+ throw new Error("Insufficient balance. Fee: ".concat(feeConverted, ", Amount: ").concat(asset.amount));
5566
+ case 23:
5567
+ feeConvertedPadded = feeConverted * 3n / 2n; // increases fee by 50%
5568
+ return _context.abrupt("return", createExecuteXcm(input, dryRunResult.weight, feeConvertedPadded));
5569
+ case 25:
5570
+ case "end":
5571
+ return _context.stop();
5572
+ }
5573
+ }, _callee, this);
5574
+ }));
5575
+ function handleExecuteTransfer(_x) {
5576
+ return _handleExecuteTransfer.apply(this, arguments);
5577
+ }
5578
+ return handleExecuteTransfer;
5579
+ }()
5299
5580
  }, {
5300
5581
  key: "transferPolkadotXCM",
5301
5582
  value: function transferPolkadotXCM(input) {
5302
5583
  var scenario = input.scenario,
5303
5584
  asset = input.asset,
5304
- destination = input.destination;
5585
+ destination = input.destination,
5586
+ feeAsset = input.feeAsset;
5587
+ if (feeAsset) {
5588
+ if (!isAssetEqual(feeAsset, asset)) {
5589
+ throw new InvalidCurrencyError("Fee asset does not match transfer asset.");
5590
+ }
5591
+ return Promise.resolve(this.handleExecuteTransfer(input));
5592
+ }
5305
5593
  if (destination === 'AssetHubKusama') {
5306
5594
  return Promise.resolve(this.handleBridgeTransfer(input, 'Kusama'));
5307
5595
  }
@@ -5320,7 +5608,8 @@ var AssetHubPolkadot$1 = /*#__PURE__*/function (_ParachainNode) {
5320
5608
  if (destination === 'BifrostPolkadot' && isEthereumAsset) {
5321
5609
  return Promise.resolve(this.handleBifrostEthTransfer(input));
5322
5610
  }
5323
- if (scenario === 'ParaToPara' && asset.symbol === 'DOT' && !isForeignAsset(asset) && destination !== 'Hydration' && destination !== 'Polimec' && destination !== 'Moonbeam' && destination !== 'BifrostPolkadot') {
5611
+ var isSystemNode = !isTMultiLocation(destination) && SYSTEM_NODES_POLKADOT.includes(destination);
5612
+ if (scenario === 'ParaToPara' && asset.symbol === 'DOT' && !isForeignAsset(asset) && destination !== 'Hydration' && destination !== 'Polimec' && destination !== 'Moonbeam' && destination !== 'BifrostPolkadot' && destination !== 'PeoplePolkadot' && !isSystemNode) {
5324
5613
  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.');
5325
5614
  }
5326
5615
  if (scenario === 'ParaToPara' && asset.symbol === 'KSM' && !isForeignAsset(asset)) {
@@ -5340,18 +5629,20 @@ var AssetHubPolkadot$1 = /*#__PURE__*/function (_ParachainNode) {
5340
5629
  }
5341
5630
  }, {
5342
5631
  key: "createCurrencySpec",
5343
- value: function createCurrencySpec$1(amount, scenario, version, asset, overridedMultiLocation) {
5632
+ value: function createCurrencySpec(amount, scenario, version, asset) {
5344
5633
  if (scenario === 'ParaToPara') {
5345
- var interior = {
5346
- X2: [{
5347
- PalletInstance: 50
5348
- }, {
5349
- // TODO: Handle missing assedId
5350
- GeneralIndex: asset && isForeignAsset(asset) && asset.assetId ? asset.assetId : 0
5351
- }]
5352
- };
5353
- var multiLocation = overridedMultiLocation !== undefined ? overridedMultiLocation : asset && isForeignAsset(asset) ? asset.multiLocation : undefined;
5354
- return createCurrencySpec(amount, version, exports.Parents.ZERO, multiLocation, interior);
5634
+ var multiLocation = asset ? asset.multiLocation : undefined;
5635
+ return createVersionedMultiAssets(version, amount, multiLocation !== null && multiLocation !== void 0 ? multiLocation : {
5636
+ parents: exports.Parents.ZERO,
5637
+ interior: {
5638
+ X2: [{
5639
+ PalletInstance: 50
5640
+ }, {
5641
+ // TODO: Handle missing assedId
5642
+ GeneralIndex: asset && isForeignAsset(asset) && asset.assetId ? asset.assetId : 0
5643
+ }]
5644
+ }
5645
+ });
5355
5646
  } else {
5356
5647
  return _superPropGet(AssetHubPolkadot, "createCurrencySpec", this, 3)([amount, scenario, version, asset]);
5357
5648
  }
@@ -5497,16 +5788,18 @@ var BifrostPolkadot$1 = /*#__PURE__*/function (_ParachainNode) {
5497
5788
  key: "transferToAssetHub",
5498
5789
  value: function transferToAssetHub(input) {
5499
5790
  var _getAssetId;
5500
- var overriddenAsset = input.overriddenAsset,
5501
- asset = input.asset;
5791
+ var asset = input.asset;
5502
5792
  return Promise.resolve(PolkadotXCMTransferImpl.transferPolkadotXCM(_objectSpread2(_objectSpread2({}, input), {}, {
5503
- currencySelection: createCurrencySpec(asset.amount, this.version, asset.symbol === 'DOT' ? exports.Parents.ONE : exports.Parents.TWO, overriddenAsset, asset.symbol === 'WETH' ? {
5504
- X2: [ETHEREUM_JUNCTION, {
5505
- AccountKey20: {
5506
- key: (_getAssetId = getAssetId('Ethereum', 'WETH')) !== null && _getAssetId !== void 0 ? _getAssetId : ''
5507
- }
5508
- }]
5509
- } : undefined)
5793
+ currencySelection: createVersionedMultiAssets(this.version, asset.amount, {
5794
+ parents: asset.symbol === 'DOT' ? exports.Parents.ONE : exports.Parents.TWO,
5795
+ interior: asset.symbol === 'WETH' ? {
5796
+ X2: [ETHEREUM_JUNCTION, {
5797
+ AccountKey20: {
5798
+ key: (_getAssetId = getAssetId('Ethereum', 'WETH')) !== null && _getAssetId !== void 0 ? _getAssetId : ''
5799
+ }
5800
+ }]
5801
+ } : 'Here'
5802
+ })
5510
5803
  }), 'transfer_assets', 'Unlimited'));
5511
5804
  }
5512
5805
  }, {
@@ -5773,16 +6066,18 @@ var Crab$1 = /*#__PURE__*/function (_ParachainNode) {
5773
6066
  }
5774
6067
  }, {
5775
6068
  key: "createCurrencySpec",
5776
- value: function createCurrencySpec$1(amount, scenario, version, _asset, overridedMultiLocation) {
6069
+ value: function createCurrencySpec(amount, scenario, version, _asset) {
5777
6070
  if (scenario === 'ParaToPara') {
5778
- var interior = {
5779
- X1: {
5780
- PalletInstance: 5
6071
+ return createVersionedMultiAssets(version, amount, {
6072
+ parents: exports.Parents.ZERO,
6073
+ interior: {
6074
+ X1: {
6075
+ PalletInstance: 5
6076
+ }
5781
6077
  }
5782
- };
5783
- return createCurrencySpec(amount, version, exports.Parents.ZERO, overridedMultiLocation, interior);
6078
+ });
5784
6079
  } else {
5785
- return _superPropGet(Crab, "createCurrencySpec", this, 3)([amount, scenario, version, undefined, overridedMultiLocation]);
6080
+ return _superPropGet(Crab, "createCurrencySpec", this, 3)([amount, scenario, version]);
5786
6081
  }
5787
6082
  }
5788
6083
  }]);
@@ -6167,8 +6462,8 @@ var Moonbeam$1 = /*#__PURE__*/function (_ParachainNode) {
6167
6462
  }
6168
6463
  _inherits(Moonbeam, _ParachainNode);
6169
6464
  return _createClass(Moonbeam, [{
6170
- key: "getJunctions",
6171
- value: function getJunctions(asset, scenario) {
6465
+ key: "getMultiLocation",
6466
+ value: function getMultiLocation(asset, scenario) {
6172
6467
  if (scenario === 'ParaToRelay') return DOT_MULTILOCATION;
6173
6468
  if (asset.symbol === this.getNativeAssetSymbol()) return {
6174
6469
  parents: exports.Parents.ZERO,
@@ -6189,11 +6484,10 @@ var Moonbeam$1 = /*#__PURE__*/function (_ParachainNode) {
6189
6484
  var asset = input.asset,
6190
6485
  scenario = input.scenario,
6191
6486
  _input$version = input.version,
6192
- version = _input$version === void 0 ? this.version : _input$version,
6193
- overriddenAsset = input.overriddenAsset;
6194
- var multiLocation = this.getJunctions(asset, scenario);
6487
+ version = _input$version === void 0 ? this.version : _input$version;
6488
+ var multiLocation = this.getMultiLocation(asset, scenario);
6195
6489
  return Promise.resolve(PolkadotXCMTransferImpl.transferPolkadotXCM(_objectSpread2(_objectSpread2({}, input), {}, {
6196
- currencySelection: createCurrencySpec(asset.amount, version, multiLocation.parents, overriddenAsset, multiLocation.interior)
6490
+ currencySelection: createVersionedMultiAssets(version, asset.amount, multiLocation)
6197
6491
  }), 'transfer_assets', 'Unlimited'));
6198
6492
  }
6199
6493
  }, {
@@ -6214,8 +6508,8 @@ var Moonriver$1 = /*#__PURE__*/function (_ParachainNode) {
6214
6508
  }
6215
6509
  _inherits(Moonriver, _ParachainNode);
6216
6510
  return _createClass(Moonriver, [{
6217
- key: "getJunctions",
6218
- value: function getJunctions(asset, scenario) {
6511
+ key: "getMultiLocation",
6512
+ value: function getMultiLocation(asset, scenario) {
6219
6513
  if (scenario === 'ParaToRelay') return DOT_MULTILOCATION;
6220
6514
  if (asset.symbol === this.getNativeAssetSymbol()) return {
6221
6515
  parents: exports.Parents.ZERO,
@@ -6236,11 +6530,10 @@ var Moonriver$1 = /*#__PURE__*/function (_ParachainNode) {
6236
6530
  var asset = input.asset,
6237
6531
  scenario = input.scenario,
6238
6532
  _input$version = input.version,
6239
- version = _input$version === void 0 ? this.version : _input$version,
6240
- overriddenAsset = input.overriddenAsset;
6241
- var multiLocation = this.getJunctions(asset, scenario);
6533
+ version = _input$version === void 0 ? this.version : _input$version;
6534
+ var multiLocation = this.getMultiLocation(asset, scenario);
6242
6535
  return Promise.resolve(PolkadotXCMTransferImpl.transferPolkadotXCM(_objectSpread2(_objectSpread2({}, input), {}, {
6243
- currencySelection: createCurrencySpec(asset.amount, version, multiLocation.parents, overriddenAsset, multiLocation.interior)
6536
+ currencySelection: createVersionedMultiAssets(version, asset.amount, multiLocation)
6244
6537
  }), 'transfer_assets', 'Unlimited'));
6245
6538
  }
6246
6539
  }, {
@@ -6531,7 +6824,12 @@ var XTransferTransferImpl = /*#__PURE__*/function () {
6531
6824
  if (isMultiLocationDestination) {
6532
6825
  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.');
6533
6826
  }
6534
- var currencySpec = getCurrency(asset.amount, exports.Version.V1, exports.Parents.ZERO, overriddenAsset)[0];
6827
+ var version = exports.Version.V1;
6828
+ var multiAssets = [createMultiAsset(version, asset.amount, {
6829
+ parents: exports.Parents.ZERO,
6830
+ interior: 'Here'
6831
+ })];
6832
+ var resolvedMultiAssets = maybeOverrideMultiAssets(version, asset.amount, multiAssets, overriddenAsset);
6535
6833
  var dest = getDestination(input);
6536
6834
  var section = 'transfer';
6537
6835
  var destWeight = determineDestWeight(destination);
@@ -6539,7 +6837,7 @@ var XTransferTransferImpl = /*#__PURE__*/function () {
6539
6837
  module: pallet !== null && pallet !== void 0 ? pallet : 'XTransfer',
6540
6838
  section: method !== null && method !== void 0 ? method : section,
6541
6839
  parameters: {
6542
- asset: currencySpec,
6840
+ asset: resolvedMultiAssets[0],
6543
6841
  dest: dest,
6544
6842
  dest_weight: destWeight
6545
6843
  }
@@ -7003,14 +7301,7 @@ var Polimec = {
7003
7301
  ],
7004
7302
  otherAssets: [
7005
7303
  {
7006
- assetId: "10",
7007
- symbol: "DOT",
7008
- decimals: 10,
7009
- existentialDeposit: "100000000"
7010
- },
7011
- {
7012
- assetId: "1984",
7013
- symbol: "USDt",
7304
+ symbol: "USDC",
7014
7305
  decimals: 6,
7015
7306
  multiLocation: {
7016
7307
  parents: 1,
@@ -7023,7 +7314,7 @@ var Polimec = {
7023
7314
  PalletInstance: 50
7024
7315
  },
7025
7316
  {
7026
- GeneralIndex: 1984
7317
+ GeneralIndex: 1337
7027
7318
  }
7028
7319
  ]
7029
7320
  }
@@ -7031,8 +7322,7 @@ var Polimec = {
7031
7322
  existentialDeposit: "70000"
7032
7323
  },
7033
7324
  {
7034
- assetId: "1337",
7035
- symbol: "USDC",
7325
+ symbol: "USDt",
7036
7326
  decimals: 6,
7037
7327
  multiLocation: {
7038
7328
  parents: 1,
@@ -7045,12 +7335,23 @@ var Polimec = {
7045
7335
  PalletInstance: 50
7046
7336
  },
7047
7337
  {
7048
- GeneralIndex: 1337
7338
+ GeneralIndex: 1984
7049
7339
  }
7050
7340
  ]
7051
7341
  }
7052
7342
  },
7053
7343
  existentialDeposit: "70000"
7344
+ },
7345
+ {
7346
+ symbol: "DOT",
7347
+ decimals: 10,
7348
+ multiLocation: {
7349
+ parents: 1,
7350
+ interior: {
7351
+ Here: null
7352
+ }
7353
+ },
7354
+ existentialDeposit: "100000000"
7054
7355
  }
7055
7356
  ]
7056
7357
  };
@@ -19003,13 +19304,13 @@ var getBalanceForeignPolkadotXcm = /*#__PURE__*/function () {
19003
19304
  _context.next = 12;
19004
19305
  break;
19005
19306
  }
19006
- if (!(asset.assetId === undefined)) {
19307
+ if (!(asset.multiLocation === undefined)) {
19007
19308
  _context.next = 11;
19008
19309
  break;
19009
19310
  }
19010
- throw new InvalidCurrencyError("Asset ".concat(JSON.stringify(asset), " has no assetId"));
19311
+ throw new InvalidCurrencyError("Asset ".concat(JSON.stringify(asset), " has no multi-location"));
19011
19312
  case 11:
19012
- return _context.abrupt("return", api.getForeignAssetsByIdBalance(address, asset.assetId));
19313
+ return _context.abrupt("return", api.getAssetHubForeignBalance(address, asset.multiLocation));
19013
19314
  case 12:
19014
19315
  if (!(node === 'AssetHubPolkadot')) {
19015
19316
  _context.next = 18;
@@ -19819,59 +20120,6 @@ var createApiInstanceForNode = /*#__PURE__*/function () {
19819
20120
  };
19820
20121
  }();
19821
20122
 
19822
- var isPrimitive = function isPrimitive(obj) {
19823
- return obj !== Object(obj);
19824
- };
19825
- var _deepEqual = function deepEqual(obj1, obj2) {
19826
- if (obj1 === obj2) return true;
19827
- if (isPrimitive(obj1) && isPrimitive(obj2)) return obj1 === obj2;
19828
- if (_typeof(obj1) !== 'object' || obj1 === null || _typeof(obj2) !== 'object' || obj2 === null) {
19829
- return false;
19830
- }
19831
- if (Array.isArray(obj1) !== Array.isArray(obj2)) {
19832
- return false;
19833
- }
19834
- var obj1Keys = Object.keys(obj1).map(function (key) {
19835
- return key.toLowerCase();
19836
- });
19837
- var obj2Keys = Object.keys(obj2).map(function (key) {
19838
- return key.toLowerCase();
19839
- });
19840
- if (obj1Keys.length !== obj2Keys.length) return false;
19841
- var _iterator = _createForOfIteratorHelper(obj1Keys),
19842
- _step;
19843
- try {
19844
- var _loop = function _loop() {
19845
- var key = _step.value;
19846
- var keyInObj2 = obj2Keys.find(function (k) {
19847
- return k === key;
19848
- });
19849
- if (!keyInObj2) return {
19850
- v: false
19851
- };
19852
- var obj1Value = obj1[Object.keys(obj1).find(function (k) {
19853
- return k.toLowerCase() === key;
19854
- })];
19855
- var obj2Value = obj2[Object.keys(obj2).find(function (k) {
19856
- return k.toLowerCase() === key;
19857
- })];
19858
- if (!_deepEqual(obj1Value, obj2Value)) return {
19859
- v: false
19860
- };
19861
- },
19862
- _ret;
19863
- for (_iterator.s(); !(_step = _iterator.n()).done;) {
19864
- _ret = _loop();
19865
- if (_ret) return _ret.v;
19866
- }
19867
- } catch (err) {
19868
- _iterator.e(err);
19869
- } finally {
19870
- _iterator.f();
19871
- }
19872
- return true;
19873
- };
19874
-
19875
20123
  /* eslint-disable @typescript-eslint/no-explicit-any */
19876
20124
  /* eslint-disable @typescript-eslint/no-unsafe-member-access */
19877
20125
  /* eslint-disable @typescript-eslint/no-unsafe-assignment */
@@ -20394,6 +20642,19 @@ var GeneralBuilder = /*#__PURE__*/function () {
20394
20642
  method: method
20395
20643
  }));
20396
20644
  }
20645
+ /**
20646
+ * Optional fee asset for the transaction.
20647
+ *
20648
+ * @param currency - The currency to be used for the fee.
20649
+ * @returns An instance of the Builder
20650
+ */
20651
+ }, {
20652
+ key: "feeAsset",
20653
+ value: function feeAsset(currency) {
20654
+ return new GeneralBuilder(this.api, this.batchManager, _objectSpread2(_objectSpread2({}, this._options), {}, {
20655
+ feeAsset: currency
20656
+ }));
20657
+ }
20397
20658
  /**
20398
20659
  * Adds the transfer transaction to the batch.
20399
20660
  *
@@ -20609,6 +20870,7 @@ exports.getTransferInfo = getTransferInfo;
20609
20870
  exports.getTransferableAmount = getTransferableAmount;
20610
20871
  exports.hasDryRunSupport = hasDryRunSupport;
20611
20872
  exports.hasSupportForAsset = hasSupportForAsset;
20873
+ exports.isAssetEqual = isAssetEqual;
20612
20874
  exports.isEthersContract = isEthersContract;
20613
20875
  exports.isEthersSigner = isEthersSigner;
20614
20876
  exports.isForeignAsset = isForeignAsset;
@@ -20623,5 +20885,6 @@ exports.send = send;
20623
20885
  exports.transferMoonbeamEvm = transferMoonbeamEvm;
20624
20886
  exports.transferMoonbeamToEth = transferMoonbeamToEth;
20625
20887
  exports.transferRelayToPara = transferRelayToPara;
20888
+ exports.transformMultiLocation = transformMultiLocation;
20626
20889
  exports.validateAddress = validateAddress;
20627
20890
  exports.verifyEdOnDestination = verifyEdOnDestination;