@paraspell/sdk-core 8.6.2 → 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
@@ -2473,10 +2473,71 @@ var throwUnsupportedCurrency = function throwUnsupportedCurrency(currency, node)
2473
2473
  throw new InvalidCurrencyError("".concat(isDestination ? 'Destination' : 'Origin', " node ").concat(node, " does not support currency ").concat(JSON.stringify(currency), "."));
2474
2474
  };
2475
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
+
2476
2529
  var isForeignAsset = function isForeignAsset(asset) {
2477
2530
  return _typeof(asset) === 'object' && asset !== null && ('assetId' in asset || 'multiLocation' in asset) && !('isNative' in asset);
2478
2531
  };
2479
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
+
2480
2541
  var isSymbolSpecifier = function isSymbolSpecifier(currencySymbolValue) {
2481
2542
  return _typeof(currencySymbolValue) === 'object' && 'type' in currencySymbolValue && 'value' in currencySymbolValue;
2482
2543
  };
@@ -3668,6 +3729,14 @@ var resolveAsset = function resolveAsset(currency, origin, destination, assetChe
3668
3729
  return assetCheckEnabled ? getAssetBySymbolOrId(origin, currency, !isTMultiLocation(destination) ? destination : null) : null;
3669
3730
  };
3670
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
+
3671
3740
  var AssetHubPolkadot$2 = {
3672
3741
  defaultPallet: "PolkadotXcm",
3673
3742
  supportedPallets: [
@@ -4476,7 +4545,7 @@ var getSupportedPalletsDetails = function getSupportedPalletsDetails(node) {
4476
4545
  return palletsMap[node].supportedPallets;
4477
4546
  };
4478
4547
 
4479
- var validateCurrency = function validateCurrency(currency) {
4548
+ var validateCurrency = function validateCurrency(currency, feeAsset) {
4480
4549
  if ('multiasset' in currency) {
4481
4550
  if (currency.multiasset.length === 0) {
4482
4551
  throw new InvalidCurrencyError('Overridden multi assets cannot be empty');
@@ -4484,16 +4553,9 @@ var validateCurrency = function validateCurrency(currency) {
4484
4553
  if (currency.multiasset.length === 1) {
4485
4554
  throw new InvalidCurrencyError('Please provide more than one multi asset');
4486
4555
  }
4487
- if (currency.multiasset.length > 1 && !currency.multiasset.some(function (asset) {
4488
- return asset.isFeeAsset;
4489
- })) {
4556
+ if (currency.multiasset.length > 1 && !feeAsset) {
4490
4557
  throw new InvalidCurrencyError('Overridden multi assets cannot be used without specifying fee asset');
4491
4558
  }
4492
- if (currency.multiasset.length > 1 && currency.multiasset.filter(function (asset) {
4493
- return asset.isFeeAsset;
4494
- }).length > 1) {
4495
- throw new InvalidCurrencyError('Overridden multi assets cannot have more than one fee asset');
4496
- }
4497
4559
  }
4498
4560
  };
4499
4561
  var validateDestination = function validateDestination(origin, destination) {
@@ -4553,7 +4615,7 @@ var validateAssetSupport = function validateAssetSupport(_ref, assetCheckEnabled
4553
4615
  }
4554
4616
  };
4555
4617
 
4556
- var resolveOverriddenAsset = function resolveOverriddenAsset(options, isBridge, assetCheckEnabled) {
4618
+ var resolveOverriddenAsset = function resolveOverriddenAsset(options, isBridge, assetCheckEnabled, feeAsset) {
4557
4619
  var currency = options.currency,
4558
4620
  origin = options.from,
4559
4621
  destination = options.to;
@@ -4561,6 +4623,9 @@ var resolveOverriddenAsset = function resolveOverriddenAsset(options, isBridge,
4561
4623
  return currency.multilocation.value;
4562
4624
  }
4563
4625
  if ('multiasset' in currency) {
4626
+ if (!feeAsset) {
4627
+ throw new InvalidCurrencyError('Overridden multi assets cannot be used without specifying fee asset');
4628
+ }
4564
4629
  if (currency.multiasset.every(function (asset) {
4565
4630
  return isTMultiAsset(asset);
4566
4631
  })) {
@@ -4568,18 +4633,30 @@ var resolveOverriddenAsset = function resolveOverriddenAsset(options, isBridge,
4568
4633
  }
4569
4634
  // MultiAsset is an array of TCurrencyCore, search for assets
4570
4635
  var assets = currency.multiasset.map(function (currency) {
4571
- var _currency$isFeeAsset;
4572
4636
  var asset = getAssetBySymbolOrId(origin, currency, !isTMultiLocation(destination) ? destination : null);
4573
4637
  if (asset && (!isForeignAsset(asset) || !asset.multiLocation)) {
4574
4638
  throw new InvalidCurrencyError("Asset ".concat(JSON.stringify(currency), " does not have a multiLocation"));
4575
4639
  }
4640
+ if (!asset) {
4641
+ throw new InvalidCurrencyError("Origin node ".concat(origin, " does not support currency ").concat(JSON.stringify(currency)));
4642
+ }
4576
4643
  validateAssetSupport(options, assetCheckEnabled, isBridge, asset);
4577
4644
  var originTyped = origin;
4578
4645
  var originNode = getNode(originTyped);
4579
4646
  return _objectSpread2({
4580
- isFeeAsset: (_currency$isFeeAsset = currency.isFeeAsset) !== null && _currency$isFeeAsset !== void 0 ? _currency$isFeeAsset : false
4581
- }, 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));
4582
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
+ }
4583
4660
  return assets;
4584
4661
  }
4585
4662
  return undefined;
@@ -4608,12 +4685,12 @@ var validateDestinationAddress = function validateDestinationAddress(address, de
4608
4685
 
4609
4686
  var send = /*#__PURE__*/function () {
4610
4687
  var _ref = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee(options) {
4611
- 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;
4612
4689
  return _regeneratorRuntime().wrap(function _callee$(_context) {
4613
4690
  while (1) switch (_context.prev = _context.next) {
4614
4691
  case 0:
4615
- 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;
4616
- 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);
4617
4694
  validateDestination(origin, destination);
4618
4695
  validateDestinationAddress(address, destination);
4619
4696
  if (senderAddress) validateAddress(senderAddress, origin, false);
@@ -4627,23 +4704,24 @@ var send = /*#__PURE__*/function () {
4627
4704
  assetCheckEnabled = determineAssetCheckEnabled(origin, currency, isBridge);
4628
4705
  validateAssetSpecifiers(assetCheckEnabled, currency);
4629
4706
  asset = resolveAsset(currency, origin, destination, assetCheckEnabled);
4707
+ resolvedFeeAsset = feeAsset ? resolveFeeAsset(feeAsset, origin, destination) : undefined;
4630
4708
  validateAssetSupport(options, assetCheckEnabled, isBridge, asset);
4631
4709
  if (!isRelayChain(origin)) {
4632
- _context.next = 18;
4710
+ _context.next = 19;
4633
4711
  break;
4634
4712
  }
4635
4713
  if (!(destination === 'Ethereum')) {
4636
- _context.next = 15;
4714
+ _context.next = 16;
4637
4715
  break;
4638
4716
  }
4639
4717
  throw new Error('Transfers from relay chain to Ethereum are not supported.');
4640
- case 15:
4718
+ case 16:
4641
4719
  if (asset) {
4642
- _context.next = 17;
4720
+ _context.next = 18;
4643
4721
  break;
4644
4722
  }
4645
4723
  throw new Error('Asset is required for relay chain to relay chain transfers.');
4646
- case 17:
4724
+ case 18:
4647
4725
  return _context.abrupt("return", transferRelayToPara({
4648
4726
  api: api,
4649
4727
  origin: origin,
@@ -4657,11 +4735,11 @@ var send = /*#__PURE__*/function () {
4657
4735
  pallet: pallet,
4658
4736
  method: method
4659
4737
  }));
4660
- case 18:
4661
- overriddenAsset = resolveOverriddenAsset(options, isBridge, assetCheckEnabled);
4662
- _context.next = 21;
4738
+ case 19:
4739
+ overriddenAsset = resolveOverriddenAsset(options, isBridge, assetCheckEnabled, resolvedFeeAsset);
4740
+ _context.next = 22;
4663
4741
  return api.init(origin);
4664
- case 21:
4742
+ case 22:
4665
4743
  // In case asset check is disabled, we create asset object from currency symbol
4666
4744
  resolvedAsset = asset !== null && asset !== void 0 ? asset : {
4667
4745
  symbol: 'symbol' in currency ? currency.symbol : undefined
@@ -4672,6 +4750,7 @@ var send = /*#__PURE__*/function () {
4672
4750
  asset: _objectSpread2(_objectSpread2({}, resolvedAsset), {}, {
4673
4751
  amount: 'multiasset' in currency ? 0 : currency.amount
4674
4752
  }),
4753
+ feeAsset: resolvedFeeAsset,
4675
4754
  address: address,
4676
4755
  to: destination,
4677
4756
  paraIdTo: paraIdTo,
@@ -4681,7 +4760,7 @@ var send = /*#__PURE__*/function () {
4681
4760
  pallet: pallet,
4682
4761
  method: method
4683
4762
  }));
4684
- case 24:
4763
+ case 25:
4685
4764
  case "end":
4686
4765
  return _context.stop();
4687
4766
  }
@@ -4751,11 +4830,11 @@ var ParachainNode = /*#__PURE__*/function () {
4751
4830
  key: "transfer",
4752
4831
  value: function () {
4753
4832
  var _transfer = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee(options) {
4754
- 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;
4755
4834
  return _regeneratorRuntime().wrap(function _callee$(_context) {
4756
4835
  while (1) switch (_context.prev = _context.next) {
4757
4836
  case 0:
4758
- 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;
4759
4838
  isRelayDestination = !isTMultiLocation(destination) && isRelayChain(destination);
4760
4839
  scenario = isRelayDestination ? 'ParaToRelay' : 'ParaToPara';
4761
4840
  paraId = resolveParaId(paraIdTo, destination);
@@ -4822,6 +4901,7 @@ var ParachainNode = /*#__PURE__*/function () {
4822
4901
  currencySelection: this.createCurrencySpec(asset.amount, scenario, versionOrDefault, asset),
4823
4902
  overriddenAsset: overriddenAsset,
4824
4903
  asset: asset,
4904
+ feeAsset: feeAsset,
4825
4905
  scenario: scenario,
4826
4906
  destination: destination,
4827
4907
  paraIdTo: paraId,
@@ -5122,6 +5202,118 @@ var AssetHubKusama$1 = /*#__PURE__*/function (_ParachainNode) {
5122
5202
  }]);
5123
5203
  }(ParachainNode);
5124
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
+
5125
5317
  var generateAddressMultiLocationV4 = function generateAddressMultiLocationV4(api, address) {
5126
5318
  var isMultiLocation = _typeof(address) === 'object';
5127
5319
  if (isMultiLocation) {
@@ -5166,7 +5358,8 @@ var AssetHubPolkadot$1 = /*#__PURE__*/function (_ParachainNode) {
5166
5358
  _this.handleBifrostEthTransfer = function (input) {
5167
5359
  var api = input.api,
5168
5360
  scenario = input.scenario,
5169
- version = input.version,
5361
+ _input$version = input.version,
5362
+ version = _input$version === void 0 ? _this.version : _input$version,
5170
5363
  destination = input.destination,
5171
5364
  asset = input.asset;
5172
5365
  if (!isForeignAsset(asset)) {
@@ -5175,19 +5368,18 @@ var AssetHubPolkadot$1 = /*#__PURE__*/function (_ParachainNode) {
5175
5368
  if (!asset.multiLocation) {
5176
5369
  throw new InvalidCurrencyError("Asset ".concat(JSON.stringify(asset), " has no multiLocation"));
5177
5370
  }
5178
- var versionOrDefault = version !== null && version !== void 0 ? version : _this.version;
5179
5371
  var call = {
5180
5372
  module: 'PolkadotXcm',
5181
5373
  section: 'transfer_assets_using_type_and_then',
5182
5374
  parameters: {
5183
- dest: _this.createPolkadotXcmHeader(scenario, versionOrDefault, destination, getParaId('BifrostPolkadot')),
5184
- 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)]),
5185
5377
  assets_transfer_type: 'LocalReserve',
5186
- remote_fees_id: _defineProperty({}, versionOrDefault, {
5378
+ remote_fees_id: _defineProperty({}, version, {
5187
5379
  Concrete: asset.multiLocation
5188
5380
  }),
5189
5381
  fees_transfer_type: 'LocalReserve',
5190
- custom_xcm_on_dest: createCustomXcmToBifrost(input, versionOrDefault),
5382
+ custom_xcm_on_dest: createCustomXcmToBifrost(input, version),
5191
5383
  weight_limit: 'Unlimited'
5192
5384
  }
5193
5385
  };
@@ -5286,11 +5478,12 @@ var AssetHubPolkadot$1 = /*#__PURE__*/function (_ParachainNode) {
5286
5478
  paraIdTo = input.paraIdTo,
5287
5479
  scenario = input.scenario,
5288
5480
  api = input.api,
5289
- version = input.version,
5481
+ _input$version2 = input.version,
5482
+ version = _input$version2 === void 0 ? this.version : _input$version2,
5290
5483
  address = input.address;
5291
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') {
5292
- var _input$version;
5293
- 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;
5294
5487
  return _objectSpread2(_objectSpread2({}, input), {}, {
5295
5488
  header: this.createPolkadotXcmHeader(scenario, versionOrDefault, destination, paraIdTo),
5296
5489
  addressSelection: generateAddressPayload(api, scenario, 'PolkadotXcm', address, versionOrDefault, paraIdTo),
@@ -5298,9 +5491,8 @@ var AssetHubPolkadot$1 = /*#__PURE__*/function (_ParachainNode) {
5298
5491
  });
5299
5492
  }
5300
5493
  if ((destination === 'Hydration' || destination === 'Polimec' || destination === 'Moonbeam' || destination === 'BifrostPolkadot') && asset.symbol === 'DOT') {
5301
- var _versionOrDefault = version !== null && version !== void 0 ? version : this.version;
5302
5494
  return _objectSpread2(_objectSpread2({}, input), {}, {
5303
- currencySelection: createVersionedMultiAssets(_versionOrDefault, asset.amount, DOT_MULTILOCATION)
5495
+ currencySelection: createVersionedMultiAssets(version, asset.amount, DOT_MULTILOCATION)
5304
5496
  });
5305
5497
  }
5306
5498
  return input;
@@ -5312,12 +5504,92 @@ var AssetHubPolkadot$1 = /*#__PURE__*/function (_ParachainNode) {
5312
5504
  if (destination === 'Polimec' || destination === 'Moonbeam') return 'transfer_assets';
5313
5505
  return scenario === 'ParaToPara' && !isSystemNode ? 'limited_reserve_transfer_assets' : 'limited_teleport_assets';
5314
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
+ }()
5315
5580
  }, {
5316
5581
  key: "transferPolkadotXCM",
5317
5582
  value: function transferPolkadotXCM(input) {
5318
5583
  var scenario = input.scenario,
5319
5584
  asset = input.asset,
5320
- 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
+ }
5321
5593
  if (destination === 'AssetHubKusama') {
5322
5594
  return Promise.resolve(this.handleBridgeTransfer(input, 'Kusama'));
5323
5595
  }
@@ -19032,13 +19304,13 @@ var getBalanceForeignPolkadotXcm = /*#__PURE__*/function () {
19032
19304
  _context.next = 12;
19033
19305
  break;
19034
19306
  }
19035
- if (!(asset.assetId === undefined)) {
19307
+ if (!(asset.multiLocation === undefined)) {
19036
19308
  _context.next = 11;
19037
19309
  break;
19038
19310
  }
19039
- throw new InvalidCurrencyError("Asset ".concat(JSON.stringify(asset), " has no assetId"));
19311
+ throw new InvalidCurrencyError("Asset ".concat(JSON.stringify(asset), " has no multi-location"));
19040
19312
  case 11:
19041
- return _context.abrupt("return", api.getForeignAssetsByIdBalance(address, asset.assetId));
19313
+ return _context.abrupt("return", api.getAssetHubForeignBalance(address, asset.multiLocation));
19042
19314
  case 12:
19043
19315
  if (!(node === 'AssetHubPolkadot')) {
19044
19316
  _context.next = 18;
@@ -19848,59 +20120,6 @@ var createApiInstanceForNode = /*#__PURE__*/function () {
19848
20120
  };
19849
20121
  }();
19850
20122
 
19851
- var isPrimitive = function isPrimitive(obj) {
19852
- return obj !== Object(obj);
19853
- };
19854
- var _deepEqual = function deepEqual(obj1, obj2) {
19855
- if (obj1 === obj2) return true;
19856
- if (isPrimitive(obj1) && isPrimitive(obj2)) return obj1 === obj2;
19857
- if (_typeof(obj1) !== 'object' || obj1 === null || _typeof(obj2) !== 'object' || obj2 === null) {
19858
- return false;
19859
- }
19860
- if (Array.isArray(obj1) !== Array.isArray(obj2)) {
19861
- return false;
19862
- }
19863
- var obj1Keys = Object.keys(obj1).map(function (key) {
19864
- return key.toLowerCase();
19865
- });
19866
- var obj2Keys = Object.keys(obj2).map(function (key) {
19867
- return key.toLowerCase();
19868
- });
19869
- if (obj1Keys.length !== obj2Keys.length) return false;
19870
- var _iterator = _createForOfIteratorHelper(obj1Keys),
19871
- _step;
19872
- try {
19873
- var _loop = function _loop() {
19874
- var key = _step.value;
19875
- var keyInObj2 = obj2Keys.find(function (k) {
19876
- return k === key;
19877
- });
19878
- if (!keyInObj2) return {
19879
- v: false
19880
- };
19881
- var obj1Value = obj1[Object.keys(obj1).find(function (k) {
19882
- return k.toLowerCase() === key;
19883
- })];
19884
- var obj2Value = obj2[Object.keys(obj2).find(function (k) {
19885
- return k.toLowerCase() === key;
19886
- })];
19887
- if (!_deepEqual(obj1Value, obj2Value)) return {
19888
- v: false
19889
- };
19890
- },
19891
- _ret;
19892
- for (_iterator.s(); !(_step = _iterator.n()).done;) {
19893
- _ret = _loop();
19894
- if (_ret) return _ret.v;
19895
- }
19896
- } catch (err) {
19897
- _iterator.e(err);
19898
- } finally {
19899
- _iterator.f();
19900
- }
19901
- return true;
19902
- };
19903
-
19904
20123
  /* eslint-disable @typescript-eslint/no-explicit-any */
19905
20124
  /* eslint-disable @typescript-eslint/no-unsafe-member-access */
19906
20125
  /* eslint-disable @typescript-eslint/no-unsafe-assignment */
@@ -20423,6 +20642,19 @@ var GeneralBuilder = /*#__PURE__*/function () {
20423
20642
  method: method
20424
20643
  }));
20425
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
+ }
20426
20658
  /**
20427
20659
  * Adds the transfer transaction to the batch.
20428
20660
  *
@@ -20638,6 +20870,7 @@ exports.getTransferInfo = getTransferInfo;
20638
20870
  exports.getTransferableAmount = getTransferableAmount;
20639
20871
  exports.hasDryRunSupport = hasDryRunSupport;
20640
20872
  exports.hasSupportForAsset = hasSupportForAsset;
20873
+ exports.isAssetEqual = isAssetEqual;
20641
20874
  exports.isEthersContract = isEthersContract;
20642
20875
  exports.isEthersSigner = isEthersSigner;
20643
20876
  exports.isForeignAsset = isForeignAsset;
@@ -20652,5 +20885,6 @@ exports.send = send;
20652
20885
  exports.transferMoonbeamEvm = transferMoonbeamEvm;
20653
20886
  exports.transferMoonbeamToEth = transferMoonbeamToEth;
20654
20887
  exports.transferRelayToPara = transferRelayToPara;
20888
+ exports.transformMultiLocation = transformMultiLocation;
20655
20889
  exports.validateAddress = validateAddress;
20656
20890
  exports.verifyEdOnDestination = verifyEdOnDestination;