@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.mjs CHANGED
@@ -2471,10 +2471,71 @@ var throwUnsupportedCurrency = function throwUnsupportedCurrency(currency, node)
2471
2471
  throw new InvalidCurrencyError("".concat(isDestination ? 'Destination' : 'Origin', " node ").concat(node, " does not support currency ").concat(JSON.stringify(currency), "."));
2472
2472
  };
2473
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
+
2474
2527
  var isForeignAsset = function isForeignAsset(asset) {
2475
2528
  return _typeof(asset) === 'object' && asset !== null && ('assetId' in asset || 'multiLocation' in asset) && !('isNative' in asset);
2476
2529
  };
2477
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
+
2478
2539
  var isSymbolSpecifier = function isSymbolSpecifier(currencySymbolValue) {
2479
2540
  return _typeof(currencySymbolValue) === 'object' && 'type' in currencySymbolValue && 'value' in currencySymbolValue;
2480
2541
  };
@@ -3666,6 +3727,14 @@ var resolveAsset = function resolveAsset(currency, origin, destination, assetChe
3666
3727
  return assetCheckEnabled ? getAssetBySymbolOrId(origin, currency, !isTMultiLocation(destination) ? destination : null) : null;
3667
3728
  };
3668
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
+
3669
3738
  var AssetHubPolkadot$2 = {
3670
3739
  defaultPallet: "PolkadotXcm",
3671
3740
  supportedPallets: [
@@ -4474,7 +4543,7 @@ var getSupportedPalletsDetails = function getSupportedPalletsDetails(node) {
4474
4543
  return palletsMap[node].supportedPallets;
4475
4544
  };
4476
4545
 
4477
- var validateCurrency = function validateCurrency(currency) {
4546
+ var validateCurrency = function validateCurrency(currency, feeAsset) {
4478
4547
  if ('multiasset' in currency) {
4479
4548
  if (currency.multiasset.length === 0) {
4480
4549
  throw new InvalidCurrencyError('Overridden multi assets cannot be empty');
@@ -4482,16 +4551,9 @@ var validateCurrency = function validateCurrency(currency) {
4482
4551
  if (currency.multiasset.length === 1) {
4483
4552
  throw new InvalidCurrencyError('Please provide more than one multi asset');
4484
4553
  }
4485
- if (currency.multiasset.length > 1 && !currency.multiasset.some(function (asset) {
4486
- return asset.isFeeAsset;
4487
- })) {
4554
+ if (currency.multiasset.length > 1 && !feeAsset) {
4488
4555
  throw new InvalidCurrencyError('Overridden multi assets cannot be used without specifying fee asset');
4489
4556
  }
4490
- if (currency.multiasset.length > 1 && currency.multiasset.filter(function (asset) {
4491
- return asset.isFeeAsset;
4492
- }).length > 1) {
4493
- throw new InvalidCurrencyError('Overridden multi assets cannot have more than one fee asset');
4494
- }
4495
4557
  }
4496
4558
  };
4497
4559
  var validateDestination = function validateDestination(origin, destination) {
@@ -4551,7 +4613,7 @@ var validateAssetSupport = function validateAssetSupport(_ref, assetCheckEnabled
4551
4613
  }
4552
4614
  };
4553
4615
 
4554
- var resolveOverriddenAsset = function resolveOverriddenAsset(options, isBridge, assetCheckEnabled) {
4616
+ var resolveOverriddenAsset = function resolveOverriddenAsset(options, isBridge, assetCheckEnabled, feeAsset) {
4555
4617
  var currency = options.currency,
4556
4618
  origin = options.from,
4557
4619
  destination = options.to;
@@ -4559,6 +4621,9 @@ var resolveOverriddenAsset = function resolveOverriddenAsset(options, isBridge,
4559
4621
  return currency.multilocation.value;
4560
4622
  }
4561
4623
  if ('multiasset' in currency) {
4624
+ if (!feeAsset) {
4625
+ throw new InvalidCurrencyError('Overridden multi assets cannot be used without specifying fee asset');
4626
+ }
4562
4627
  if (currency.multiasset.every(function (asset) {
4563
4628
  return isTMultiAsset(asset);
4564
4629
  })) {
@@ -4566,18 +4631,30 @@ var resolveOverriddenAsset = function resolveOverriddenAsset(options, isBridge,
4566
4631
  }
4567
4632
  // MultiAsset is an array of TCurrencyCore, search for assets
4568
4633
  var assets = currency.multiasset.map(function (currency) {
4569
- var _currency$isFeeAsset;
4570
4634
  var asset = getAssetBySymbolOrId(origin, currency, !isTMultiLocation(destination) ? destination : null);
4571
4635
  if (asset && (!isForeignAsset(asset) || !asset.multiLocation)) {
4572
4636
  throw new InvalidCurrencyError("Asset ".concat(JSON.stringify(currency), " does not have a multiLocation"));
4573
4637
  }
4638
+ if (!asset) {
4639
+ throw new InvalidCurrencyError("Origin node ".concat(origin, " does not support currency ").concat(JSON.stringify(currency)));
4640
+ }
4574
4641
  validateAssetSupport(options, assetCheckEnabled, isBridge, asset);
4575
4642
  var originTyped = origin;
4576
4643
  var originNode = getNode(originTyped);
4577
4644
  return _objectSpread2({
4578
- isFeeAsset: (_currency$isFeeAsset = currency.isFeeAsset) !== null && _currency$isFeeAsset !== void 0 ? _currency$isFeeAsset : false
4579
- }, 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));
4580
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
+ }
4581
4658
  return assets;
4582
4659
  }
4583
4660
  return undefined;
@@ -4606,12 +4683,12 @@ var validateDestinationAddress = function validateDestinationAddress(address, de
4606
4683
 
4607
4684
  var send = /*#__PURE__*/function () {
4608
4685
  var _ref = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee(options) {
4609
- 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;
4610
4687
  return _regeneratorRuntime().wrap(function _callee$(_context) {
4611
4688
  while (1) switch (_context.prev = _context.next) {
4612
4689
  case 0:
4613
- 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;
4614
- 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);
4615
4692
  validateDestination(origin, destination);
4616
4693
  validateDestinationAddress(address, destination);
4617
4694
  if (senderAddress) validateAddress(senderAddress, origin, false);
@@ -4625,23 +4702,24 @@ var send = /*#__PURE__*/function () {
4625
4702
  assetCheckEnabled = determineAssetCheckEnabled(origin, currency, isBridge);
4626
4703
  validateAssetSpecifiers(assetCheckEnabled, currency);
4627
4704
  asset = resolveAsset(currency, origin, destination, assetCheckEnabled);
4705
+ resolvedFeeAsset = feeAsset ? resolveFeeAsset(feeAsset, origin, destination) : undefined;
4628
4706
  validateAssetSupport(options, assetCheckEnabled, isBridge, asset);
4629
4707
  if (!isRelayChain(origin)) {
4630
- _context.next = 18;
4708
+ _context.next = 19;
4631
4709
  break;
4632
4710
  }
4633
4711
  if (!(destination === 'Ethereum')) {
4634
- _context.next = 15;
4712
+ _context.next = 16;
4635
4713
  break;
4636
4714
  }
4637
4715
  throw new Error('Transfers from relay chain to Ethereum are not supported.');
4638
- case 15:
4716
+ case 16:
4639
4717
  if (asset) {
4640
- _context.next = 17;
4718
+ _context.next = 18;
4641
4719
  break;
4642
4720
  }
4643
4721
  throw new Error('Asset is required for relay chain to relay chain transfers.');
4644
- case 17:
4722
+ case 18:
4645
4723
  return _context.abrupt("return", transferRelayToPara({
4646
4724
  api: api,
4647
4725
  origin: origin,
@@ -4655,11 +4733,11 @@ var send = /*#__PURE__*/function () {
4655
4733
  pallet: pallet,
4656
4734
  method: method
4657
4735
  }));
4658
- case 18:
4659
- overriddenAsset = resolveOverriddenAsset(options, isBridge, assetCheckEnabled);
4660
- _context.next = 21;
4736
+ case 19:
4737
+ overriddenAsset = resolveOverriddenAsset(options, isBridge, assetCheckEnabled, resolvedFeeAsset);
4738
+ _context.next = 22;
4661
4739
  return api.init(origin);
4662
- case 21:
4740
+ case 22:
4663
4741
  // In case asset check is disabled, we create asset object from currency symbol
4664
4742
  resolvedAsset = asset !== null && asset !== void 0 ? asset : {
4665
4743
  symbol: 'symbol' in currency ? currency.symbol : undefined
@@ -4670,6 +4748,7 @@ var send = /*#__PURE__*/function () {
4670
4748
  asset: _objectSpread2(_objectSpread2({}, resolvedAsset), {}, {
4671
4749
  amount: 'multiasset' in currency ? 0 : currency.amount
4672
4750
  }),
4751
+ feeAsset: resolvedFeeAsset,
4673
4752
  address: address,
4674
4753
  to: destination,
4675
4754
  paraIdTo: paraIdTo,
@@ -4679,7 +4758,7 @@ var send = /*#__PURE__*/function () {
4679
4758
  pallet: pallet,
4680
4759
  method: method
4681
4760
  }));
4682
- case 24:
4761
+ case 25:
4683
4762
  case "end":
4684
4763
  return _context.stop();
4685
4764
  }
@@ -4749,11 +4828,11 @@ var ParachainNode = /*#__PURE__*/function () {
4749
4828
  key: "transfer",
4750
4829
  value: function () {
4751
4830
  var _transfer = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee(options) {
4752
- 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;
4753
4832
  return _regeneratorRuntime().wrap(function _callee$(_context) {
4754
4833
  while (1) switch (_context.prev = _context.next) {
4755
4834
  case 0:
4756
- 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;
4757
4836
  isRelayDestination = !isTMultiLocation(destination) && isRelayChain(destination);
4758
4837
  scenario = isRelayDestination ? 'ParaToRelay' : 'ParaToPara';
4759
4838
  paraId = resolveParaId(paraIdTo, destination);
@@ -4820,6 +4899,7 @@ var ParachainNode = /*#__PURE__*/function () {
4820
4899
  currencySelection: this.createCurrencySpec(asset.amount, scenario, versionOrDefault, asset),
4821
4900
  overriddenAsset: overriddenAsset,
4822
4901
  asset: asset,
4902
+ feeAsset: feeAsset,
4823
4903
  scenario: scenario,
4824
4904
  destination: destination,
4825
4905
  paraIdTo: paraId,
@@ -5120,6 +5200,118 @@ var AssetHubKusama$1 = /*#__PURE__*/function (_ParachainNode) {
5120
5200
  }]);
5121
5201
  }(ParachainNode);
5122
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
+
5123
5315
  var generateAddressMultiLocationV4 = function generateAddressMultiLocationV4(api, address) {
5124
5316
  var isMultiLocation = _typeof(address) === 'object';
5125
5317
  if (isMultiLocation) {
@@ -5164,7 +5356,8 @@ var AssetHubPolkadot$1 = /*#__PURE__*/function (_ParachainNode) {
5164
5356
  _this.handleBifrostEthTransfer = function (input) {
5165
5357
  var api = input.api,
5166
5358
  scenario = input.scenario,
5167
- version = input.version,
5359
+ _input$version = input.version,
5360
+ version = _input$version === void 0 ? _this.version : _input$version,
5168
5361
  destination = input.destination,
5169
5362
  asset = input.asset;
5170
5363
  if (!isForeignAsset(asset)) {
@@ -5173,19 +5366,18 @@ var AssetHubPolkadot$1 = /*#__PURE__*/function (_ParachainNode) {
5173
5366
  if (!asset.multiLocation) {
5174
5367
  throw new InvalidCurrencyError("Asset ".concat(JSON.stringify(asset), " has no multiLocation"));
5175
5368
  }
5176
- var versionOrDefault = version !== null && version !== void 0 ? version : _this.version;
5177
5369
  var call = {
5178
5370
  module: 'PolkadotXcm',
5179
5371
  section: 'transfer_assets_using_type_and_then',
5180
5372
  parameters: {
5181
- dest: _this.createPolkadotXcmHeader(scenario, versionOrDefault, destination, getParaId('BifrostPolkadot')),
5182
- 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)]),
5183
5375
  assets_transfer_type: 'LocalReserve',
5184
- remote_fees_id: _defineProperty({}, versionOrDefault, {
5376
+ remote_fees_id: _defineProperty({}, version, {
5185
5377
  Concrete: asset.multiLocation
5186
5378
  }),
5187
5379
  fees_transfer_type: 'LocalReserve',
5188
- custom_xcm_on_dest: createCustomXcmToBifrost(input, versionOrDefault),
5380
+ custom_xcm_on_dest: createCustomXcmToBifrost(input, version),
5189
5381
  weight_limit: 'Unlimited'
5190
5382
  }
5191
5383
  };
@@ -5284,11 +5476,12 @@ var AssetHubPolkadot$1 = /*#__PURE__*/function (_ParachainNode) {
5284
5476
  paraIdTo = input.paraIdTo,
5285
5477
  scenario = input.scenario,
5286
5478
  api = input.api,
5287
- version = input.version,
5479
+ _input$version2 = input.version,
5480
+ version = _input$version2 === void 0 ? this.version : _input$version2,
5288
5481
  address = input.address;
5289
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') {
5290
- var _input$version;
5291
- 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;
5292
5485
  return _objectSpread2(_objectSpread2({}, input), {}, {
5293
5486
  header: this.createPolkadotXcmHeader(scenario, versionOrDefault, destination, paraIdTo),
5294
5487
  addressSelection: generateAddressPayload(api, scenario, 'PolkadotXcm', address, versionOrDefault, paraIdTo),
@@ -5296,9 +5489,8 @@ var AssetHubPolkadot$1 = /*#__PURE__*/function (_ParachainNode) {
5296
5489
  });
5297
5490
  }
5298
5491
  if ((destination === 'Hydration' || destination === 'Polimec' || destination === 'Moonbeam' || destination === 'BifrostPolkadot') && asset.symbol === 'DOT') {
5299
- var _versionOrDefault = version !== null && version !== void 0 ? version : this.version;
5300
5492
  return _objectSpread2(_objectSpread2({}, input), {}, {
5301
- currencySelection: createVersionedMultiAssets(_versionOrDefault, asset.amount, DOT_MULTILOCATION)
5493
+ currencySelection: createVersionedMultiAssets(version, asset.amount, DOT_MULTILOCATION)
5302
5494
  });
5303
5495
  }
5304
5496
  return input;
@@ -5310,12 +5502,92 @@ var AssetHubPolkadot$1 = /*#__PURE__*/function (_ParachainNode) {
5310
5502
  if (destination === 'Polimec' || destination === 'Moonbeam') return 'transfer_assets';
5311
5503
  return scenario === 'ParaToPara' && !isSystemNode ? 'limited_reserve_transfer_assets' : 'limited_teleport_assets';
5312
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
+ }()
5313
5578
  }, {
5314
5579
  key: "transferPolkadotXCM",
5315
5580
  value: function transferPolkadotXCM(input) {
5316
5581
  var scenario = input.scenario,
5317
5582
  asset = input.asset,
5318
- 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
+ }
5319
5591
  if (destination === 'AssetHubKusama') {
5320
5592
  return Promise.resolve(this.handleBridgeTransfer(input, 'Kusama'));
5321
5593
  }
@@ -19030,13 +19302,13 @@ var getBalanceForeignPolkadotXcm = /*#__PURE__*/function () {
19030
19302
  _context.next = 12;
19031
19303
  break;
19032
19304
  }
19033
- if (!(asset.assetId === undefined)) {
19305
+ if (!(asset.multiLocation === undefined)) {
19034
19306
  _context.next = 11;
19035
19307
  break;
19036
19308
  }
19037
- throw new InvalidCurrencyError("Asset ".concat(JSON.stringify(asset), " has no assetId"));
19309
+ throw new InvalidCurrencyError("Asset ".concat(JSON.stringify(asset), " has no multi-location"));
19038
19310
  case 11:
19039
- return _context.abrupt("return", api.getForeignAssetsByIdBalance(address, asset.assetId));
19311
+ return _context.abrupt("return", api.getAssetHubForeignBalance(address, asset.multiLocation));
19040
19312
  case 12:
19041
19313
  if (!(node === 'AssetHubPolkadot')) {
19042
19314
  _context.next = 18;
@@ -19846,59 +20118,6 @@ var createApiInstanceForNode = /*#__PURE__*/function () {
19846
20118
  };
19847
20119
  }();
19848
20120
 
19849
- var isPrimitive = function isPrimitive(obj) {
19850
- return obj !== Object(obj);
19851
- };
19852
- var _deepEqual = function deepEqual(obj1, obj2) {
19853
- if (obj1 === obj2) return true;
19854
- if (isPrimitive(obj1) && isPrimitive(obj2)) return obj1 === obj2;
19855
- if (_typeof(obj1) !== 'object' || obj1 === null || _typeof(obj2) !== 'object' || obj2 === null) {
19856
- return false;
19857
- }
19858
- if (Array.isArray(obj1) !== Array.isArray(obj2)) {
19859
- return false;
19860
- }
19861
- var obj1Keys = Object.keys(obj1).map(function (key) {
19862
- return key.toLowerCase();
19863
- });
19864
- var obj2Keys = Object.keys(obj2).map(function (key) {
19865
- return key.toLowerCase();
19866
- });
19867
- if (obj1Keys.length !== obj2Keys.length) return false;
19868
- var _iterator = _createForOfIteratorHelper(obj1Keys),
19869
- _step;
19870
- try {
19871
- var _loop = function _loop() {
19872
- var key = _step.value;
19873
- var keyInObj2 = obj2Keys.find(function (k) {
19874
- return k === key;
19875
- });
19876
- if (!keyInObj2) return {
19877
- v: false
19878
- };
19879
- var obj1Value = obj1[Object.keys(obj1).find(function (k) {
19880
- return k.toLowerCase() === key;
19881
- })];
19882
- var obj2Value = obj2[Object.keys(obj2).find(function (k) {
19883
- return k.toLowerCase() === key;
19884
- })];
19885
- if (!_deepEqual(obj1Value, obj2Value)) return {
19886
- v: false
19887
- };
19888
- },
19889
- _ret;
19890
- for (_iterator.s(); !(_step = _iterator.n()).done;) {
19891
- _ret = _loop();
19892
- if (_ret) return _ret.v;
19893
- }
19894
- } catch (err) {
19895
- _iterator.e(err);
19896
- } finally {
19897
- _iterator.f();
19898
- }
19899
- return true;
19900
- };
19901
-
19902
20121
  /* eslint-disable @typescript-eslint/no-explicit-any */
19903
20122
  /* eslint-disable @typescript-eslint/no-unsafe-member-access */
19904
20123
  /* eslint-disable @typescript-eslint/no-unsafe-assignment */
@@ -20421,6 +20640,19 @@ var GeneralBuilder = /*#__PURE__*/function () {
20421
20640
  method: method
20422
20641
  }));
20423
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
+ }
20424
20656
  /**
20425
20657
  * Adds the transfer transaction to the batch.
20426
20658
  *
@@ -20563,4 +20795,4 @@ var Builder = function Builder(api) {
20563
20795
  return new GeneralBuilder(api, new BatchTransactionManager());
20564
20796
  };
20565
20797
 
20566
- 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 };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@paraspell/sdk-core",
3
- "version": "8.6.2",
3
+ "version": "8.7.0",
4
4
  "description": "SDK core for ParaSpell XCM/XCMP tool for developers",
5
5
  "repository": {
6
6
  "type": "git",