@paraspell/sdk-core 8.12.0 → 8.13.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
@@ -954,25 +954,6 @@ var ScenarioNotSupportedError = /*#__PURE__*/function (_Error) {
954
954
  return _createClass(ScenarioNotSupportedError);
955
955
  }(/*#__PURE__*/_wrapNativeSuper(Error));
956
956
 
957
- var DEFAULT_FEE_ASSET = 0;
958
- var ETH_PARA_ID = 1;
959
- var ETH_CHAIN_ID = BigInt(ETH_PARA_ID);
960
- var ETHEREUM_JUNCTION = {
961
- GlobalConsensus: {
962
- Ethereum: {
963
- chainId: ETH_CHAIN_ID
964
- }
965
- }
966
- };
967
- var DOT_MULTILOCATION = {
968
- parents: sdkCommon.Parents.ONE,
969
- interior: 'Here'
970
- };
971
- var SYSTEM_NODES_POLKADOT = ['PeoplePolkadot', 'CoretimePolkadot', 'Collectives'];
972
- var SYSTEM_NODES_KUSAMA = ['PeopleKusama', 'CoretimeKusama'];
973
- var ASSET_HUB_EXECUTION_FEE = 2200000000n; // 0.22 DOT
974
- // 30% padding
975
-
976
957
  var AssetHubPolkadot$1 = {
977
958
  name: "AssetHub",
978
959
  info: "PolkadotAssetHub",
@@ -1226,14 +1207,14 @@ var Centrifuge$1 = {
1226
1207
  info: "centrifuge",
1227
1208
  paraId: 2031,
1228
1209
  providers: [
1229
- {
1230
- name: "Centrifuge",
1231
- endpoint: "wss://fullnode.centrifuge.io"
1232
- },
1233
1210
  {
1234
1211
  name: "LuckyFriday",
1235
1212
  endpoint: "wss://rpc-centrifuge.luckyfriday.io"
1236
1213
  },
1214
+ {
1215
+ name: "Centrifuge",
1216
+ endpoint: "wss://fullnode.centrifuge.io"
1217
+ },
1237
1218
  {
1238
1219
  name: "OnFinality",
1239
1220
  endpoint: "wss://centrifuge-parachain.api.onfinality.io/public-ws"
@@ -1329,20 +1310,20 @@ var Moonbeam$1 = {
1329
1310
  paraId: 2004,
1330
1311
  providers: [
1331
1312
  {
1332
- name: "Allnodes",
1333
- endpoint: "wss://moonbeam-rpc.publicnode.com"
1313
+ name: "IBP1",
1314
+ endpoint: "wss://moonbeam.ibp.network"
1334
1315
  },
1335
1316
  {
1336
- name: "Blast",
1337
- endpoint: "wss://moonbeam.public.blastapi.io"
1317
+ name: "RadiumBlock",
1318
+ endpoint: "wss://moonbeam.public.curie.radiumblock.co/ws"
1338
1319
  },
1339
1320
  {
1340
- name: "Dwellir",
1341
- endpoint: "wss://moonbeam-rpc.n.dwellir.com"
1321
+ name: "Allnodes",
1322
+ endpoint: "wss://moonbeam-rpc.publicnode.com"
1342
1323
  },
1343
1324
  {
1344
- name: "IBP1",
1345
- endpoint: "wss://moonbeam.ibp.network"
1325
+ name: "Blast",
1326
+ endpoint: "wss://moonbeam.public.blastapi.io"
1346
1327
  },
1347
1328
  {
1348
1329
  name: "IBP2",
@@ -1356,10 +1337,6 @@ var Moonbeam$1 = {
1356
1337
  name: "OnFinality",
1357
1338
  endpoint: "wss://moonbeam.api.onfinality.io/public-ws"
1358
1339
  },
1359
- {
1360
- name: "RadiumBlock",
1361
- endpoint: "wss://moonbeam.public.curie.radiumblock.co/ws"
1362
- },
1363
1340
  {
1364
1341
  name: "UnitedBloc",
1365
1342
  endpoint: "wss://moonbeam.unitedbloc.com"
@@ -2304,57 +2281,24 @@ var getNodeProviders = function getNodeProviders(node) {
2304
2281
  });
2305
2282
  };
2306
2283
 
2307
- /**
2308
- * Retrieves the parachain ID for a specified node.
2309
- *
2310
- * @param node - The node for which to get the paraId.
2311
- * @returns The parachain ID of the node.
2312
- */
2313
- var getParaId = function getParaId(node) {
2314
- if (node === 'Ethereum') {
2315
- return ETH_PARA_ID;
2316
- }
2317
- return getNodeConfig(node).paraId;
2318
- };
2319
-
2320
- var shuffleArray = function shuffleArray(array) {
2321
- var copy = _toConsumableArray(array);
2322
- for (var i = copy.length - 1; i > 0; i--) {
2323
- var j = Math.floor(Math.random() * (i + 1));
2324
- var _ref = [copy[j], copy[i]];
2325
- copy[i] = _ref[0];
2326
- copy[j] = _ref[1];
2284
+ var DEFAULT_FEE_ASSET = 0;
2285
+ var ETH_PARA_ID = 1;
2286
+ var ETH_CHAIN_ID = BigInt(ETH_PARA_ID);
2287
+ var ETHEREUM_JUNCTION = {
2288
+ GlobalConsensus: {
2289
+ Ethereum: {
2290
+ chainId: ETH_CHAIN_ID
2291
+ }
2327
2292
  }
2328
- return copy;
2329
2293
  };
2330
-
2331
- var shuffleWsProviders = function shuffleWsProviders(node, wsProviders) {
2332
- var ALLOWED_NODES = ['Hydration', 'Acala'];
2333
- if (ALLOWED_NODES.includes(node)) {
2334
- return shuffleArray(wsProviders);
2335
- }
2336
- return wsProviders;
2294
+ var DOT_MULTILOCATION = {
2295
+ parents: sdkCommon.Parents.ONE,
2296
+ interior: 'Here'
2337
2297
  };
2338
-
2339
- var createApiInstanceForNode = /*#__PURE__*/function () {
2340
- var _ref = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee(api, node) {
2341
- var wsUrl, resolvedWsUrl;
2342
- return _regeneratorRuntime().wrap(function _callee$(_context) {
2343
- while (1) switch (_context.prev = _context.next) {
2344
- case 0:
2345
- wsUrl = getNodeProviders(node);
2346
- resolvedWsUrl = Array.isArray(wsUrl) ? shuffleWsProviders(node, wsUrl) : wsUrl;
2347
- return _context.abrupt("return", api.createApiInstance(resolvedWsUrl));
2348
- case 3:
2349
- case "end":
2350
- return _context.stop();
2351
- }
2352
- }, _callee);
2353
- }));
2354
- return function createApiInstanceForNode(_x, _x2) {
2355
- return _ref.apply(this, arguments);
2356
- };
2357
- }();
2298
+ var SYSTEM_NODES_POLKADOT = ['PeoplePolkadot', 'CoretimePolkadot', 'Collectives'];
2299
+ var SYSTEM_NODES_KUSAMA = ['PeopleKusama', 'CoretimeKusama'];
2300
+ var ASSET_HUB_EXECUTION_FEE = 2200000000n; // 0.22 DOT
2301
+ // 30% padding
2358
2302
 
2359
2303
  var createX1Payload = function createX1Payload(version, junction) {
2360
2304
  return version === exports.Version.V4 ? {
@@ -2517,297 +2461,389 @@ var throwUnsupportedCurrency = function throwUnsupportedCurrency(currency, node)
2517
2461
  throw new assets.InvalidCurrencyError("".concat(isDestination ? 'Destination' : 'Origin', " node ").concat(node, " does not support currency ").concat(JSON.stringify(currency), "."));
2518
2462
  };
2519
2463
 
2520
- var createBeneficiaryMultiLocation = function createBeneficiaryMultiLocation(_ref) {
2521
- var api = _ref.api,
2522
- scenario = _ref.scenario,
2523
- pallet = _ref.pallet,
2524
- recipientAddress = _ref.recipientAddress,
2525
- version = _ref.version,
2526
- paraId = _ref.paraId;
2527
- if (sdkCommon.isTMultiLocation(recipientAddress)) {
2528
- return recipientAddress;
2529
- }
2530
- var isEthAddress = ethers.ethers.isAddress(recipientAddress);
2531
- var getAccountPayload = function getAccountPayload(allowNetwork) {
2532
- if (isEthAddress) {
2533
- return {
2534
- AccountKey20: _objectSpread2({
2535
- key: recipientAddress
2536
- }, allowNetwork ? {
2537
- network: 'any'
2538
- } : {})
2539
- };
2464
+ var buildMultiLocation = function buildMultiLocation(_ref) {
2465
+ var paraIdTo = _ref.paraIdTo,
2466
+ asset = _ref.asset,
2467
+ origin = _ref.origin,
2468
+ destination = _ref.destination;
2469
+ if (!assets.isForeignAsset(asset)) {
2470
+ if (_typeof(destination) === 'object') {
2471
+ return destination;
2540
2472
  }
2541
- return {
2542
- AccountId32: _objectSpread2({
2543
- id: api.accountToHex(recipientAddress)
2544
- }, allowNetwork ? {
2545
- network: 'any'
2546
- } : {})
2547
- };
2548
- };
2549
- if (scenario === 'ParaToRelay') {
2550
- return {
2551
- parents: pallet === 'XTokens' ? sdkCommon.Parents.ONE : sdkCommon.Parents.ZERO,
2552
- interior: createX1Payload(version, {
2553
- AccountId32: _objectSpread2({
2554
- id: api.accountToHex(recipientAddress)
2555
- }, version === exports.Version.V1 ? {
2556
- network: 'any'
2557
- } : {})
2558
- })
2559
- };
2560
- } else if (scenario === 'ParaToPara' && pallet === 'XTokens') {
2473
+ // ParaToRelay scenario
2474
+ if (sdkCommon.isRelayChain(destination)) {
2475
+ return DOT_MULTILOCATION;
2476
+ }
2477
+ // If it is a native asset, search by symbol on AssetHub and use the multiLocation from there
2478
+ var assetHubAsset = assets.getOtherAssets(destination).find(function (ahAsset) {
2479
+ var _ahAsset$symbol, _asset$symbol;
2480
+ return ((_ahAsset$symbol = ahAsset.symbol) === null || _ahAsset$symbol === void 0 ? void 0 : _ahAsset$symbol.toLowerCase()) === ((_asset$symbol = asset.symbol) === null || _asset$symbol === void 0 ? void 0 : _asset$symbol.toLowerCase());
2481
+ });
2482
+ if (assetHubAsset === undefined) {
2483
+ throw new assets.InvalidCurrencyError("Asset ".concat(asset.symbol, " not found in AssetHub"));
2484
+ }
2485
+ if (assetHubAsset.multiLocation) {
2486
+ return assetHubAsset.multiLocation;
2487
+ }
2488
+ throw new assets.InvalidCurrencyError("Asset ".concat(asset.symbol, " has no multiLocation"));
2489
+ }
2490
+ var createDefaultMultiLocation = function createDefaultMultiLocation(assetId) {
2561
2491
  return {
2562
2492
  parents: sdkCommon.Parents.ONE,
2563
2493
  interior: {
2564
- X2: [{
2565
- Parachain: paraId
2566
- }, getAccountPayload(version === exports.Version.V1 || version === exports.Version.V2)]
2494
+ X3: [{
2495
+ Parachain: paraIdTo
2496
+ }, {
2497
+ PalletInstance: '50'
2498
+ }, {
2499
+ GeneralIndex: BigInt(assetId)
2500
+ }]
2567
2501
  }
2568
2502
  };
2569
- } else if (scenario === 'ParaToPara' && pallet === 'PolkadotXcm') {
2570
- return {
2571
- parents: sdkCommon.Parents.ZERO,
2572
- interior: createX1Payload(version, getAccountPayload(version === exports.Version.V1 || version === exports.Version.V2))
2573
- };
2503
+ };
2504
+ var isBifrostOrigin = origin === 'BifrostPolkadot' || origin === 'BifrostKusama';
2505
+ if (isBifrostOrigin) {
2506
+ return createDefaultMultiLocation(asset.assetId);
2507
+ }
2508
+ if (asset.multiLocation) {
2509
+ return asset.multiLocation;
2574
2510
  } else {
2575
- return {
2576
- parents: sdkCommon.Parents.ZERO,
2577
- interior: createX1Payload(version, getAccountPayload(false))
2578
- };
2511
+ return createDefaultMultiLocation(asset.assetId);
2579
2512
  }
2580
2513
  };
2581
-
2582
- /**
2583
- * This function transforms a multiLocation by removing the `Parachain` junction
2584
- * if it exists and setting the `parents` to `0`.
2585
- *
2586
- * @param multiLocation - The multiLocation to transform
2587
- * @returns The transformed multiLocation
2588
- */
2589
- var transformMultiLocation = function transformMultiLocation(multiLocation) {
2590
- var newInterior;
2591
- if (multiLocation.interior === 'Here') {
2592
- newInterior = 'Here';
2593
- } else {
2594
- var junctions = Object.values(multiLocation.interior).flat().filter(function (junction) {
2595
- return _typeof(junction) === 'object' && junction !== null;
2596
- });
2597
- var filteredJunctions = junctions.filter(function (junction) {
2598
- return !('Parachain' in junction);
2599
- });
2600
- if (filteredJunctions.length === 0) {
2601
- newInterior = 'Here';
2602
- } else {
2603
- newInterior = _defineProperty({}, "X".concat(filteredJunctions.length), filteredJunctions);
2604
- }
2514
+ var getModifiedCurrencySelection = function getModifiedCurrencySelection(version, input) {
2515
+ var amount = input.asset.amount,
2516
+ overriddenAsset = input.overriddenAsset;
2517
+ if (overriddenAsset) {
2518
+ return addXcmVersionHeader(maybeOverrideMultiAssets(version, amount, [], overriddenAsset), version);
2605
2519
  }
2606
- return _objectSpread2(_objectSpread2({}, multiLocation), {}, {
2607
- parents: sdkCommon.Parents.ZERO,
2608
- interior: newInterior
2609
- });
2520
+ var multiLocation = buildMultiLocation(input);
2521
+ var multiAsset = createMultiAsset(version, amount, multiLocation);
2522
+ return addXcmVersionHeader(multiAsset, version);
2610
2523
  };
2611
2524
 
2612
- var createVersionedBeneficiary = function createVersionedBeneficiary(options) {
2613
- var version = options.version;
2614
- var multiLocation = createBeneficiaryMultiLocation(options);
2615
- return addXcmVersionHeader(multiLocation, version);
2525
+ var getCurrencySelection = function getCurrencySelection(input, useMultiAssets, currencySelection) {
2526
+ var origin = input.origin;
2527
+ var _getNode = getNode(origin),
2528
+ version = _getNode.version;
2529
+ if (useMultiAssets) {
2530
+ return getModifiedCurrencySelection(version, input);
2531
+ }
2532
+ return currencySelection;
2616
2533
  };
2617
2534
 
2618
- var getMultiLocationTokenId = function getMultiLocationTokenId(location, node) {
2619
- if (location.interior.type === 'Here') {
2620
- // native token
2621
- return assets.getNativeAssetSymbol(node);
2622
- }
2623
- var foreignAssets = assets.getOtherAssets(node);
2624
- if (location.interior.type === 'X2') {
2625
- if (location.interior.value[0].type === 'PalletInstance' && location.interior.value[0].value === 50 && location.interior.value[1].type === 'GeneralIndex') {
2626
- var _foreignAssets$find$a, _foreignAssets$find;
2627
- var assetId = location.interior.value[1].value;
2628
- return (_foreignAssets$find$a = (_foreignAssets$find = foreignAssets.find(function (asset) {
2629
- return asset.assetId === String(assetId);
2630
- })) === null || _foreignAssets$find === void 0 ? void 0 : _foreignAssets$find.assetId) !== null && _foreignAssets$find$a !== void 0 ? _foreignAssets$find$a : null;
2631
- }
2535
+ var getXTokensParameters = function getXTokensParameters(isMultiAssetTransfer, currencySelection, addressSelection, amount, fees, overriddenAsset) {
2536
+ if (isMultiAssetTransfer) {
2537
+ var isOverridenMultiAssets = overriddenAsset && !sdkCommon.isTMultiLocation(overriddenAsset);
2538
+ var feeAssetIndex = isOverridenMultiAssets ? overriddenAsset.findIndex(function (asset) {
2539
+ return asset.isFeeAsset;
2540
+ }) : undefined;
2541
+ return _objectSpread2(_objectSpread2(_defineProperty({}, isOverridenMultiAssets ? 'assets' : 'asset', currencySelection), isOverridenMultiAssets && {
2542
+ fee_item: feeAssetIndex
2543
+ }), {}, {
2544
+ dest: addressSelection,
2545
+ dest_weight_limit: fees
2546
+ });
2632
2547
  }
2633
- return null;
2548
+ return {
2549
+ currency_id: currencySelection,
2550
+ amount: BigInt(amount),
2551
+ dest: addressSelection,
2552
+ dest_weight_limit: fees
2553
+ };
2634
2554
  };
2635
2555
 
2636
- var computeFeeFromDryRun = function computeFeeFromDryRun(dryRun, node, executionFee) {
2637
- // Extract delivery fees from emitted events
2638
- var deliveryFees = [];
2639
- var _iterator = _createForOfIteratorHelper(dryRun.value.emitted_events),
2640
- _step;
2641
- try {
2642
- for (_iterator.s(); !(_step = _iterator.n()).done;) {
2643
- var e = _step.value;
2644
- var isXcmEvent = e.type === 'XcmPallet' || e.type === 'PolkadotXcm' || e.type === 'CumulusXcm';
2645
- var isFeesPaid = e.value.type === 'FeesPaid';
2646
- if (isXcmEvent && isFeesPaid && e.value.value.fees) {
2647
- var _iterator2 = _createForOfIteratorHelper(e.value.value.fees),
2648
- _step2;
2649
- try {
2650
- for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
2651
- var feeItem = _step2.value;
2652
- if (feeItem.fun.type === 'NonFungible') continue;
2653
- var plancks = feeItem.fun.value;
2654
- var tokenSymbol = getMultiLocationTokenId(feeItem.id, node);
2655
- if (!tokenSymbol || !plancks) continue;
2656
- deliveryFees.push({
2657
- plancks: plancks,
2658
- tokenSymbol: tokenSymbol
2659
- });
2660
- }
2661
- } catch (err) {
2662
- _iterator2.e(err);
2663
- } finally {
2664
- _iterator2.f();
2665
- }
2556
+ var XTokensTransferImpl = /*#__PURE__*/function () {
2557
+ function XTokensTransferImpl() {
2558
+ _classCallCheck(this, XTokensTransferImpl);
2559
+ }
2560
+ return _createClass(XTokensTransferImpl, null, [{
2561
+ key: "transferXTokens",
2562
+ value: function transferXTokens(input, currencySelection) {
2563
+ var fees = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'Unlimited';
2564
+ var api = input.api,
2565
+ origin = input.origin,
2566
+ asset = input.asset,
2567
+ addressSelection = input.addressSelection,
2568
+ destination = input.destination,
2569
+ scenario = input.scenario,
2570
+ overriddenAsset = input.overriddenAsset,
2571
+ pallet = input.pallet,
2572
+ method = input.method,
2573
+ _input$useMultiAssetT = input.useMultiAssetTransfer,
2574
+ useMultiAssetTransfer = _input$useMultiAssetT === void 0 ? false : _input$useMultiAssetT;
2575
+ var isMultiLocationDestination = _typeof(destination) === 'object';
2576
+ if (isMultiLocationDestination) {
2577
+ 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.');
2666
2578
  }
2579
+ var isBifrostOrigin = origin === 'BifrostPolkadot' || origin === 'BifrostKusama';
2580
+ var isAssetHubDest = destination === 'AssetHubPolkadot' || destination === 'AssetHubKusama';
2581
+ var isAstarOrShidenToRelay = scenario === 'ParaToRelay' && (origin === 'Astar' || origin === 'Shiden');
2582
+ var isOverridenMultiAssets = overriddenAsset && !sdkCommon.isTMultiLocation(overriddenAsset);
2583
+ var shouldUseMultiasset = useMultiAssetTransfer || isAstarOrShidenToRelay || isAssetHubDest && !isBifrostOrigin || !!isOverridenMultiAssets;
2584
+ var modifiedCurrencySelection = getCurrencySelection(input, shouldUseMultiasset, currencySelection);
2585
+ var section = shouldUseMultiasset ? isOverridenMultiAssets ? 'transfer_multiassets' : 'transfer_multiasset' : 'transfer';
2586
+ var parameters = getXTokensParameters(shouldUseMultiasset, modifiedCurrencySelection, addressSelection, asset.amount, fees, overriddenAsset);
2587
+ var call = {
2588
+ module: pallet !== null && pallet !== void 0 ? pallet : 'XTokens',
2589
+ section: method !== null && method !== void 0 ? method : section,
2590
+ parameters: parameters
2591
+ };
2592
+ return api.callTxMethod(call);
2667
2593
  }
2668
- } catch (err) {
2669
- _iterator.e(err);
2670
- } finally {
2671
- _iterator.f();
2672
- }
2673
- var nativeAssetSymbol = assets.getNativeAssetSymbol(node);
2674
- // Sum the fees that match the feeToken
2675
- var totalDeliveryFees = deliveryFees.filter(function (df) {
2676
- return df.tokenSymbol === nativeAssetSymbol;
2677
- }).reduce(function (acc, df) {
2678
- return acc + df.plancks;
2679
- }, 0n);
2680
- return totalDeliveryFees + executionFee;
2681
- };
2594
+ }]);
2595
+ }();
2682
2596
 
2683
- var getMultiLocationTokenIdPjs = function getMultiLocationTokenIdPjs(location, node) {
2684
- if (location.interior === 'Here') {
2685
- // native token
2686
- return assets.getNativeAssetSymbol(node);
2597
+ var getBridgeStatus = /*#__PURE__*/function () {
2598
+ var _ref = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee(api) {
2599
+ return _regeneratorRuntime().wrap(function _callee$(_context) {
2600
+ while (1) switch (_context.prev = _context.next) {
2601
+ case 0:
2602
+ _context.next = 2;
2603
+ return api.init('BridgeHubPolkadot');
2604
+ case 2:
2605
+ _context.prev = 2;
2606
+ _context.next = 5;
2607
+ return api.getBridgeStatus();
2608
+ case 5:
2609
+ return _context.abrupt("return", _context.sent);
2610
+ case 6:
2611
+ _context.prev = 6;
2612
+ _context.next = 9;
2613
+ return api.disconnect();
2614
+ case 9:
2615
+ return _context.finish(6);
2616
+ case 10:
2617
+ case "end":
2618
+ return _context.stop();
2619
+ }
2620
+ }, _callee, null, [[2,, 6, 10]]);
2621
+ }));
2622
+ return function getBridgeStatus(_x) {
2623
+ return _ref.apply(this, arguments);
2624
+ };
2625
+ }();
2626
+
2627
+ var createBeneficiaryMultiLocation = function createBeneficiaryMultiLocation(_ref) {
2628
+ var api = _ref.api,
2629
+ scenario = _ref.scenario,
2630
+ pallet = _ref.pallet,
2631
+ recipientAddress = _ref.recipientAddress,
2632
+ version = _ref.version,
2633
+ paraId = _ref.paraId;
2634
+ if (sdkCommon.isTMultiLocation(recipientAddress)) {
2635
+ return recipientAddress;
2687
2636
  }
2688
- var foreignAssets = assets.getOtherAssets(node);
2689
- if (Object.keys(location.interior)[0] === 'X2') {
2690
- var junctions = Object.values(location.interior)[0];
2691
- if (Object.keys(junctions[0])[0] === 'PalletInstance' && junctions[0].PalletInstance === '50' && Object.keys(junctions[1])[0] === 'GeneralIndex') {
2692
- var _foreignAssets$find$s, _foreignAssets$find;
2693
- var assetId = junctions[1].GeneralIndex;
2694
- return (_foreignAssets$find$s = (_foreignAssets$find = foreignAssets.find(function (asset) {
2695
- return asset.assetId === String(assetId);
2696
- })) === null || _foreignAssets$find === void 0 ? void 0 : _foreignAssets$find.symbol) !== null && _foreignAssets$find$s !== void 0 ? _foreignAssets$find$s : null;
2637
+ var isEthAddress = ethers.ethers.isAddress(recipientAddress);
2638
+ var getAccountPayload = function getAccountPayload(allowNetwork) {
2639
+ if (isEthAddress) {
2640
+ return {
2641
+ AccountKey20: _objectSpread2({
2642
+ key: recipientAddress
2643
+ }, allowNetwork ? {
2644
+ network: 'any'
2645
+ } : {})
2646
+ };
2697
2647
  }
2698
- }
2699
- return null;
2700
- };
2701
-
2702
- var computeFeeFromDryRunPjs = function computeFeeFromDryRunPjs(dryRun, node, executionFee) {
2703
- // Extract delivery fees from emitted events
2704
- var deliveryFees = [];
2705
- var _iterator = _createForOfIteratorHelper(dryRun.Ok.emittedEvents),
2706
- _step;
2707
- try {
2708
- for (_iterator.s(); !(_step = _iterator.n()).done;) {
2709
- var e = _step.value;
2710
- var isXcmEvent = e.section === 'xcmPallet' || e.section === 'polkadotXcm' || e.section === 'cumulusXcm';
2711
- var isFeesPaid = e.method === 'FeesPaid';
2712
- if (isXcmEvent && isFeesPaid && e.data.fees) {
2713
- var _iterator2 = _createForOfIteratorHelper(e.data.fees),
2714
- _step2;
2715
- try {
2716
- for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
2717
- var feeItem = _step2.value;
2718
- if (feeItem.fun.NonFungible) continue;
2719
- var plancks = BigInt(feeItem.fun.Fungible.replace(/,/g, ''));
2720
- var tokenSymbol = getMultiLocationTokenIdPjs(feeItem.id, node);
2721
- if (!tokenSymbol || !plancks) continue;
2722
- deliveryFees.push({
2723
- plancks: plancks,
2724
- tokenSymbol: tokenSymbol
2725
- });
2726
- }
2727
- } catch (err) {
2728
- _iterator2.e(err);
2729
- } finally {
2730
- _iterator2.f();
2731
- }
2648
+ return {
2649
+ AccountId32: _objectSpread2({
2650
+ id: api.accountToHex(recipientAddress)
2651
+ }, allowNetwork ? {
2652
+ network: 'any'
2653
+ } : {})
2654
+ };
2655
+ };
2656
+ if (scenario === 'ParaToRelay') {
2657
+ return {
2658
+ parents: pallet === 'XTokens' ? sdkCommon.Parents.ONE : sdkCommon.Parents.ZERO,
2659
+ interior: createX1Payload(version, {
2660
+ AccountId32: _objectSpread2({
2661
+ id: api.accountToHex(recipientAddress)
2662
+ }, version === exports.Version.V1 ? {
2663
+ network: 'any'
2664
+ } : {})
2665
+ })
2666
+ };
2667
+ } else if (scenario === 'ParaToPara' && pallet === 'XTokens') {
2668
+ return {
2669
+ parents: sdkCommon.Parents.ONE,
2670
+ interior: {
2671
+ X2: [{
2672
+ Parachain: paraId
2673
+ }, getAccountPayload(version === exports.Version.V1 || version === exports.Version.V2)]
2732
2674
  }
2733
- }
2734
- } catch (err) {
2735
- _iterator.e(err);
2736
- } finally {
2737
- _iterator.f();
2675
+ };
2676
+ } else if (scenario === 'ParaToPara' && pallet === 'PolkadotXcm') {
2677
+ return {
2678
+ parents: sdkCommon.Parents.ZERO,
2679
+ interior: createX1Payload(version, getAccountPayload(version === exports.Version.V1 || version === exports.Version.V2))
2680
+ };
2681
+ } else {
2682
+ return {
2683
+ parents: sdkCommon.Parents.ZERO,
2684
+ interior: createX1Payload(version, getAccountPayload(false))
2685
+ };
2738
2686
  }
2739
- var nativeAssetSymbol = assets.getNativeAssetSymbol(node);
2740
- // Sum the fees that match the feeToken
2741
- var totalDeliveryFees = deliveryFees.filter(function (df) {
2742
- return df.tokenSymbol === nativeAssetSymbol;
2743
- }).reduce(function (acc, df) {
2744
- return acc + df.plancks;
2745
- }, 0n);
2746
- return totalDeliveryFees + executionFee;
2747
2687
  };
2748
2688
 
2749
- var resolveModuleError = function resolveModuleError(node, error) {
2750
- var palletDetails = pallets.getSupportedPalletsDetails(node).find(function (p) {
2751
- return p.index === Number(error.index);
2689
+ /**
2690
+ * This function transforms a multiLocation by removing the `Parachain` junction
2691
+ * if it exists and setting the `parents` to `0`.
2692
+ *
2693
+ * @param multiLocation - The multiLocation to transform
2694
+ * @returns The transformed multiLocation
2695
+ */
2696
+ var transformMultiLocation = function transformMultiLocation(multiLocation) {
2697
+ var newInterior;
2698
+ if (multiLocation.interior === 'Here') {
2699
+ newInterior = 'Here';
2700
+ } else {
2701
+ var junctions = Object.values(multiLocation.interior).flat().filter(function (junction) {
2702
+ return _typeof(junction) === 'object' && junction !== null;
2703
+ });
2704
+ var filteredJunctions = junctions.filter(function (junction) {
2705
+ return !('Parachain' in junction);
2706
+ });
2707
+ if (filteredJunctions.length === 0) {
2708
+ newInterior = 'Here';
2709
+ } else {
2710
+ newInterior = _defineProperty({}, "X".concat(filteredJunctions.length), filteredJunctions);
2711
+ }
2712
+ }
2713
+ return _objectSpread2(_objectSpread2({}, multiLocation), {}, {
2714
+ parents: sdkCommon.Parents.ZERO,
2715
+ interior: newInterior
2752
2716
  });
2753
- if (!palletDetails) {
2754
- throw new Error("Pallet with index ".concat(error.index, " not found"));
2717
+ };
2718
+
2719
+ var createCustomXcmOnDest = function createCustomXcmOnDest(_ref, origin, version, messageId) {
2720
+ var api = _ref.api,
2721
+ address = _ref.address,
2722
+ asset = _ref.asset,
2723
+ scenario = _ref.scenario,
2724
+ senderAddress = _ref.senderAddress,
2725
+ ahAddress = _ref.ahAddress;
2726
+ if (!assets.isForeignAsset(asset)) {
2727
+ throw new assets.InvalidCurrencyError("Asset ".concat(JSON.stringify(asset), " is not a foreign asset"));
2755
2728
  }
2756
- // Use only the first byte of the error to get the error index
2757
- var errorIndex = Number(error.error.slice(0, 4));
2758
- var name = palletDetails.name;
2759
- if (name !== 'XTokens' && name !== 'PolkadotXcm' && name !== 'XcmPallet') {
2760
- throw new Error("Pallet ".concat(name, " is not supported"));
2729
+ if (!asset.multiLocation) {
2730
+ throw new assets.InvalidCurrencyError("Asset ".concat(JSON.stringify(asset), " has no multiLocation"));
2761
2731
  }
2762
- var failureReason = name === 'XTokens' ? Object.values(exports.XTokensError)[errorIndex] : Object.values(exports.PolkadotXcmError)[errorIndex];
2763
- if (!failureReason) {
2764
- throw new Error("Error index ".concat(errorIndex, " not found in ").concat(name, " pallet"));
2732
+ if (!senderAddress) {
2733
+ throw new InvalidParameterError("Please provide senderAddress");
2765
2734
  }
2766
- return failureReason;
2767
- };
2768
-
2769
- var generateAddressMultiLocationV4 = function generateAddressMultiLocationV4(api, address) {
2770
- var isMultiLocation = _typeof(address) === 'object';
2771
- if (isMultiLocation) {
2772
- return _defineProperty({}, exports.Version.V4, address);
2735
+ if (assets.isNodeEvm(origin) && !ahAddress) {
2736
+ throw new InvalidParameterError("Please provide ahAddress");
2773
2737
  }
2774
- var isEthAddress = ethers.ethers.isAddress(address);
2775
- return addXcmVersionHeader({
2776
- parents: sdkCommon.Parents.ZERO,
2777
- interior: {
2778
- X1: [isEthAddress ? {
2779
- AccountKey20: {
2780
- key: address
2738
+ var ethAsset = assets.findAssetByMultiLocation(assets.getOtherAssets('Ethereum'), asset.multiLocation);
2739
+ if (!ethAsset) {
2740
+ throw new assets.InvalidCurrencyError("Could not obtain Ethereum asset address for ".concat(JSON.stringify(asset)));
2741
+ }
2742
+ var interiorSb = ethAsset.symbol === 'ETH' ? {
2743
+ Here: null
2744
+ } : {
2745
+ X1: [{
2746
+ AccountKey20: {
2747
+ network: null,
2748
+ key: ethAsset.assetId
2749
+ }
2750
+ }]
2751
+ };
2752
+ return _defineProperty({}, version, [{
2753
+ SetAppendix: [{
2754
+ DepositAsset: {
2755
+ assets: {
2756
+ Wild: 'All'
2757
+ },
2758
+ beneficiary: createBeneficiaryMultiLocation({
2759
+ api: api,
2760
+ scenario: scenario,
2761
+ pallet: 'PolkadotXcm',
2762
+ recipientAddress: assets.isNodeEvm(origin) ? ahAddress : senderAddress,
2763
+ version: version
2764
+ })
2765
+ }
2766
+ }]
2767
+ }, {
2768
+ InitiateReserveWithdraw: {
2769
+ assets: {
2770
+ Wild: {
2771
+ AllOf: {
2772
+ id: asset.multiLocation,
2773
+ fun: 'Fungible'
2774
+ }
2781
2775
  }
2782
- } : {
2783
- AccountId32: {
2784
- id: api.accountToHex(address),
2785
- network: null
2776
+ },
2777
+ reserve: {
2778
+ parents: sdkCommon.Parents.TWO,
2779
+ interior: {
2780
+ X1: [ETHEREUM_JUNCTION]
2781
+ }
2782
+ },
2783
+ xcm: [{
2784
+ BuyExecution: {
2785
+ fees: {
2786
+ id: {
2787
+ parents: sdkCommon.Parents.ZERO,
2788
+ interior: interiorSb
2789
+ },
2790
+ fun: {
2791
+ Fungible: 1n
2792
+ }
2793
+ },
2794
+ weight_limit: 'Unlimited'
2795
+ }
2796
+ }, {
2797
+ DepositAsset: {
2798
+ assets: {
2799
+ Wild: {
2800
+ AllCounted: 1
2801
+ }
2802
+ },
2803
+ beneficiary: {
2804
+ parents: sdkCommon.Parents.ZERO,
2805
+ interior: {
2806
+ X1: [{
2807
+ AccountKey20: {
2808
+ network: null,
2809
+ key: address
2810
+ }
2811
+ }]
2812
+ }
2813
+ }
2786
2814
  }
2815
+ }, {
2816
+ SetTopic: messageId
2787
2817
  }]
2788
2818
  }
2789
- }, exports.Version.V4);
2790
- };
2791
-
2792
- var getFees = function getFees(scenario) {
2793
- if (scenario === 'ParaToRelay') {
2794
- return 4600000000;
2795
- } else if (scenario === 'ParaToPara') {
2796
- return 399600000000;
2797
- }
2798
- throw new Error("Fees for scenario ".concat(scenario, " are not defined."));
2819
+ }, {
2820
+ SetTopic: messageId
2821
+ }]);
2799
2822
  };
2800
2823
 
2801
- /**
2802
- * Retrieves the node instance for a given node.
2803
- *
2804
- * @param node - The node identifier.
2805
- * @returns The node instance
2806
- */
2807
- var getNode = function getNode(node) {
2808
- var nodeMap = nodes();
2809
- return nodeMap[node];
2810
- };
2824
+ var generateMessageId = /*#__PURE__*/function () {
2825
+ var _ref = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee(api, senderAddress, sourceParaId, tokenAddress, recipientAddress, amount) {
2826
+ var accountNextId, sourceAccountHex, entropy;
2827
+ return _regeneratorRuntime().wrap(function _callee$(_context) {
2828
+ while (1) switch (_context.prev = _context.next) {
2829
+ case 0:
2830
+ _context.next = 2;
2831
+ return api.getFromRpc('system', 'accountNextIndex', senderAddress);
2832
+ case 2:
2833
+ accountNextId = _context.sent;
2834
+ sourceAccountHex = api.accountToHex(senderAddress);
2835
+ entropy = new Uint8Array([].concat(_toConsumableArray(api.stringToUint8a(sourceParaId.toString())), _toConsumableArray(api.hexToUint8a(sourceAccountHex)), _toConsumableArray(api.stringToUint8a(accountNextId)), _toConsumableArray(api.hexToUint8a(tokenAddress)), _toConsumableArray(api.stringToUint8a(recipientAddress)), _toConsumableArray(api.stringToUint8a(amount.toString()))));
2836
+ return _context.abrupt("return", api.blake2AsHex(entropy));
2837
+ case 6:
2838
+ case "end":
2839
+ return _context.stop();
2840
+ }
2841
+ }, _callee);
2842
+ }));
2843
+ return function generateMessageId(_x, _x2, _x3, _x4, _x5, _x6) {
2844
+ return _ref.apply(this, arguments);
2845
+ };
2846
+ }();
2811
2847
 
2812
2848
  var resolveParaId = function resolveParaId(paraId, destination) {
2813
2849
  if (sdkCommon.isTMultiLocation(destination) || sdkCommon.isRelayChain(destination) || destination === 'Ethereum') {
@@ -2816,379 +2852,65 @@ var resolveParaId = function resolveParaId(paraId, destination) {
2816
2852
  return paraId !== null && paraId !== void 0 ? paraId : getParaId(destination);
2817
2853
  };
2818
2854
 
2819
- var validateAddress = function validateAddress(address, node) {
2820
- var isDestination = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
2821
- var isEvm = assets.isNodeEvm(node);
2822
- var isEthereumAddress = ethers.ethers.isAddress(address);
2823
- if (isEvm) {
2824
- if (!isEthereumAddress) {
2825
- throw new InvalidAddressError("".concat(isDestination ? 'Destination node' : 'Node', " is an EVM chain, but the address provided is not a valid Ethereum address."));
2826
- }
2827
- } else {
2828
- if (isEthereumAddress) {
2829
- throw new InvalidAddressError("EVM address provided but ".concat(isDestination ? 'destination ' : '', "node is not an EVM chain."));
2830
- }
2831
- }
2855
+ var supportsXTokens = function supportsXTokens(obj) {
2856
+ return _typeof(obj) === 'object' && obj !== null && 'transferXTokens' in obj;
2832
2857
  };
2833
-
2834
- // Contains important call creation utils (Selection of fees,formating of header and more.. )
2835
- /**
2836
- * Determines the relay chain for a given node.
2837
- *
2838
- * @param node - The node for which to determine the relay chain.
2839
- * @returns 'Kusama' if the node's relay chain symbol is 'KSM'; otherwise, 'Polkadot'.
2840
- */
2841
- var determineRelayChain = function determineRelayChain(node) {
2842
- return assets.getRelayChainSymbol(node) === 'KSM' ? 'Kusama' : 'Polkadot';
2858
+ var supportsXTransfer = function supportsXTransfer(obj) {
2859
+ return _typeof(obj) === 'object' && obj !== null && 'transferXTransfer' in obj;
2843
2860
  };
2844
-
2845
- var buildMultiLocation = function buildMultiLocation(_ref) {
2846
- var paraIdTo = _ref.paraIdTo,
2847
- asset = _ref.asset,
2848
- origin = _ref.origin,
2849
- destination = _ref.destination;
2850
- if (!assets.isForeignAsset(asset)) {
2851
- if (_typeof(destination) === 'object') {
2852
- return destination;
2861
+ var supportsPolkadotXCM = function supportsPolkadotXCM(obj) {
2862
+ return _typeof(obj) === 'object' && obj !== null && 'transferPolkadotXCM' in obj;
2863
+ };
2864
+ var ParachainNode = /*#__PURE__*/function () {
2865
+ function ParachainNode(node, info, type, version) {
2866
+ _classCallCheck(this, ParachainNode);
2867
+ this._assetCheckEnabled = true;
2868
+ this._info = info;
2869
+ this._type = type;
2870
+ this._node = node;
2871
+ this._version = version;
2872
+ }
2873
+ return _createClass(ParachainNode, [{
2874
+ key: "info",
2875
+ get: function get() {
2876
+ return this._info;
2853
2877
  }
2854
- // ParaToRelay scenario
2855
- if (sdkCommon.isRelayChain(destination)) {
2856
- return DOT_MULTILOCATION;
2878
+ }, {
2879
+ key: "type",
2880
+ get: function get() {
2881
+ return this._type;
2857
2882
  }
2858
- // If it is a native asset, search by symbol on AssetHub and use the multiLocation from there
2859
- var assetHubAsset = assets.getOtherAssets(destination).find(function (ahAsset) {
2860
- var _ahAsset$symbol, _asset$symbol;
2861
- return ((_ahAsset$symbol = ahAsset.symbol) === null || _ahAsset$symbol === void 0 ? void 0 : _ahAsset$symbol.toLowerCase()) === ((_asset$symbol = asset.symbol) === null || _asset$symbol === void 0 ? void 0 : _asset$symbol.toLowerCase());
2862
- });
2863
- if (assetHubAsset === undefined) {
2864
- throw new assets.InvalidCurrencyError("Asset ".concat(asset.symbol, " not found in AssetHub"));
2883
+ }, {
2884
+ key: "node",
2885
+ get: function get() {
2886
+ return this._node;
2865
2887
  }
2866
- if (assetHubAsset.multiLocation) {
2867
- return assetHubAsset.multiLocation;
2888
+ }, {
2889
+ key: "version",
2890
+ get: function get() {
2891
+ return this._version;
2868
2892
  }
2869
- throw new assets.InvalidCurrencyError("Asset ".concat(asset.symbol, " has no multiLocation"));
2870
- }
2871
- var createDefaultMultiLocation = function createDefaultMultiLocation(assetId) {
2872
- return {
2873
- parents: sdkCommon.Parents.ONE,
2874
- interior: {
2875
- X3: [{
2876
- Parachain: paraIdTo
2877
- }, {
2878
- PalletInstance: '50'
2879
- }, {
2880
- GeneralIndex: BigInt(assetId)
2881
- }]
2882
- }
2883
- };
2884
- };
2885
- var isBifrostOrigin = origin === 'BifrostPolkadot' || origin === 'BifrostKusama';
2886
- if (isBifrostOrigin) {
2887
- return createDefaultMultiLocation(asset.assetId);
2888
- }
2889
- if (asset.multiLocation) {
2890
- return asset.multiLocation;
2891
- } else {
2892
- return createDefaultMultiLocation(asset.assetId);
2893
- }
2894
- };
2895
- var getModifiedCurrencySelection = function getModifiedCurrencySelection(version, input) {
2896
- var amount = input.asset.amount,
2897
- overriddenAsset = input.overriddenAsset;
2898
- if (overriddenAsset) {
2899
- return addXcmVersionHeader(maybeOverrideMultiAssets(version, amount, [], overriddenAsset), version);
2900
- }
2901
- var multiLocation = buildMultiLocation(input);
2902
- var multiAsset = createMultiAsset(version, amount, multiLocation);
2903
- return addXcmVersionHeader(multiAsset, version);
2904
- };
2905
-
2906
- var getCurrencySelection = function getCurrencySelection(input, useMultiAssets, currencySelection) {
2907
- var origin = input.origin;
2908
- var _getNode = getNode(origin),
2909
- version = _getNode.version;
2910
- if (useMultiAssets) {
2911
- return getModifiedCurrencySelection(version, input);
2912
- }
2913
- return currencySelection;
2914
- };
2915
-
2916
- var getXTokensParameters = function getXTokensParameters(isMultiAssetTransfer, currencySelection, addressSelection, amount, fees, overriddenAsset) {
2917
- if (isMultiAssetTransfer) {
2918
- var isOverridenMultiAssets = overriddenAsset && !sdkCommon.isTMultiLocation(overriddenAsset);
2919
- var feeAssetIndex = isOverridenMultiAssets ? overriddenAsset.findIndex(function (asset) {
2920
- return asset.isFeeAsset;
2921
- }) : undefined;
2922
- return _objectSpread2(_objectSpread2(_defineProperty({}, isOverridenMultiAssets ? 'assets' : 'asset', currencySelection), isOverridenMultiAssets && {
2923
- fee_item: feeAssetIndex
2924
- }), {}, {
2925
- dest: addressSelection,
2926
- dest_weight_limit: fees
2927
- });
2928
- }
2929
- return {
2930
- currency_id: currencySelection,
2931
- amount: BigInt(amount),
2932
- dest: addressSelection,
2933
- dest_weight_limit: fees
2934
- };
2935
- };
2936
-
2937
- var XTokensTransferImpl = /*#__PURE__*/function () {
2938
- function XTokensTransferImpl() {
2939
- _classCallCheck(this, XTokensTransferImpl);
2940
- }
2941
- return _createClass(XTokensTransferImpl, null, [{
2942
- key: "transferXTokens",
2943
- value: function transferXTokens(input, currencySelection) {
2944
- var fees = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'Unlimited';
2945
- var api = input.api,
2946
- origin = input.origin,
2947
- asset = input.asset,
2948
- addressSelection = input.addressSelection,
2949
- destination = input.destination,
2950
- scenario = input.scenario,
2951
- overriddenAsset = input.overriddenAsset,
2952
- pallet = input.pallet,
2953
- method = input.method,
2954
- _input$useMultiAssetT = input.useMultiAssetTransfer,
2955
- useMultiAssetTransfer = _input$useMultiAssetT === void 0 ? false : _input$useMultiAssetT;
2956
- var isMultiLocationDestination = _typeof(destination) === 'object';
2957
- if (isMultiLocationDestination) {
2958
- 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.');
2959
- }
2960
- var isBifrostOrigin = origin === 'BifrostPolkadot' || origin === 'BifrostKusama';
2961
- var isAssetHubDest = destination === 'AssetHubPolkadot' || destination === 'AssetHubKusama';
2962
- var isAstarOrShidenToRelay = scenario === 'ParaToRelay' && (origin === 'Astar' || origin === 'Shiden');
2963
- var isOverridenMultiAssets = overriddenAsset && !sdkCommon.isTMultiLocation(overriddenAsset);
2964
- var shouldUseMultiasset = useMultiAssetTransfer || isAstarOrShidenToRelay || isAssetHubDest && !isBifrostOrigin || !!isOverridenMultiAssets;
2965
- var modifiedCurrencySelection = getCurrencySelection(input, shouldUseMultiasset, currencySelection);
2966
- var section = shouldUseMultiasset ? isOverridenMultiAssets ? 'transfer_multiassets' : 'transfer_multiasset' : 'transfer';
2967
- var parameters = getXTokensParameters(shouldUseMultiasset, modifiedCurrencySelection, addressSelection, asset.amount, fees, overriddenAsset);
2968
- var call = {
2969
- module: pallet !== null && pallet !== void 0 ? pallet : 'XTokens',
2970
- section: method !== null && method !== void 0 ? method : section,
2971
- parameters: parameters
2972
- };
2973
- return api.callTxMethod(call);
2893
+ }, {
2894
+ key: "assetCheckEnabled",
2895
+ get: function get() {
2896
+ return this._assetCheckEnabled;
2974
2897
  }
2975
- }]);
2976
- }();
2977
-
2978
- var getBridgeStatus = /*#__PURE__*/function () {
2979
- var _ref = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee(api) {
2980
- return _regeneratorRuntime().wrap(function _callee$(_context) {
2981
- while (1) switch (_context.prev = _context.next) {
2982
- case 0:
2983
- _context.next = 2;
2984
- return api.init('BridgeHubPolkadot');
2985
- case 2:
2986
- _context.prev = 2;
2987
- _context.next = 5;
2988
- return api.getBridgeStatus();
2989
- case 5:
2990
- return _context.abrupt("return", _context.sent);
2991
- case 6:
2992
- _context.prev = 6;
2993
- _context.next = 9;
2994
- return api.disconnect();
2995
- case 9:
2996
- return _context.finish(6);
2997
- case 10:
2998
- case "end":
2999
- return _context.stop();
3000
- }
3001
- }, _callee, null, [[2,, 6, 10]]);
3002
- }));
3003
- return function getBridgeStatus(_x) {
3004
- return _ref.apply(this, arguments);
3005
- };
3006
- }();
3007
-
3008
- var createCustomXcmOnDest = function createCustomXcmOnDest(_ref, version, messageId) {
3009
- var api = _ref.api,
3010
- address = _ref.address,
3011
- asset = _ref.asset,
3012
- scenario = _ref.scenario,
3013
- senderAddress = _ref.senderAddress;
3014
- if (!assets.isForeignAsset(asset)) {
3015
- throw new assets.InvalidCurrencyError("Asset ".concat(JSON.stringify(asset), " is not a foreign asset"));
3016
- }
3017
- if (!asset.multiLocation) {
3018
- throw new assets.InvalidCurrencyError("Asset ".concat(JSON.stringify(asset), " has no multiLocation"));
3019
- }
3020
- if (!senderAddress) {
3021
- throw new assets.InvalidCurrencyError("Please provide senderAddress");
3022
- }
3023
- var ethAsset = assets.findAssetByMultiLocation(assets.getOtherAssets('Ethereum'), asset.multiLocation);
3024
- if (!ethAsset) {
3025
- throw new assets.InvalidCurrencyError("Could not obtain Ethereum asset address for ".concat(JSON.stringify(asset)));
3026
- }
3027
- var interiorSb = ethAsset.symbol === 'ETH' ? {
3028
- Here: null
3029
- } : {
3030
- X1: [{
3031
- AccountKey20: {
3032
- network: null,
3033
- key: ethAsset.assetId
3034
- }
3035
- }]
3036
- };
3037
- return _defineProperty({}, version, [{
3038
- SetAppendix: [{
3039
- DepositAsset: {
3040
- assets: {
3041
- Wild: 'All'
3042
- },
3043
- beneficiary: createBeneficiaryMultiLocation({
3044
- api: api,
3045
- scenario: scenario,
3046
- pallet: 'PolkadotXcm',
3047
- recipientAddress: senderAddress,
3048
- version: version
3049
- })
3050
- }
3051
- }]
3052
2898
  }, {
3053
- InitiateReserveWithdraw: {
3054
- assets: {
3055
- Wild: {
3056
- AllOf: {
3057
- id: asset.multiLocation,
3058
- fun: 'Fungible'
3059
- }
3060
- }
3061
- },
3062
- reserve: {
3063
- parents: sdkCommon.Parents.TWO,
3064
- interior: {
3065
- X1: [ETHEREUM_JUNCTION]
3066
- }
3067
- },
3068
- xcm: [{
3069
- BuyExecution: {
3070
- fees: {
3071
- id: {
3072
- parents: sdkCommon.Parents.ZERO,
3073
- interior: interiorSb
3074
- },
3075
- fun: {
3076
- Fungible: 1n
3077
- }
3078
- },
3079
- weight_limit: 'Unlimited'
3080
- }
3081
- }, {
3082
- DepositAsset: {
3083
- assets: {
3084
- Wild: {
3085
- AllCounted: 1
3086
- }
3087
- },
3088
- beneficiary: {
3089
- parents: sdkCommon.Parents.ZERO,
3090
- interior: {
3091
- X1: [{
3092
- AccountKey20: {
3093
- network: null,
3094
- key: address
3095
- }
3096
- }]
3097
- }
3098
- }
3099
- }
3100
- }, {
3101
- SetTopic: messageId
3102
- }]
3103
- }
3104
- }, {
3105
- SetTopic: messageId
3106
- }]);
3107
- };
3108
-
3109
- var generateMessageId = /*#__PURE__*/function () {
3110
- var _ref = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee(api, senderAddress, sourceParaId, tokenAddress, recipientAddress, amount) {
3111
- var accountNextId, sourceAccountHex, entropy;
3112
- return _regeneratorRuntime().wrap(function _callee$(_context) {
3113
- while (1) switch (_context.prev = _context.next) {
3114
- case 0:
3115
- _context.next = 2;
3116
- return api.getFromRpc('system', 'accountNextIndex', senderAddress);
3117
- case 2:
3118
- accountNextId = _context.sent;
3119
- sourceAccountHex = api.accountToHex(senderAddress);
3120
- entropy = new Uint8Array([].concat(_toConsumableArray(api.stringToUint8a(sourceParaId.toString())), _toConsumableArray(api.hexToUint8a(sourceAccountHex)), _toConsumableArray(api.stringToUint8a(accountNextId)), _toConsumableArray(api.hexToUint8a(tokenAddress)), _toConsumableArray(api.stringToUint8a(recipientAddress)), _toConsumableArray(api.stringToUint8a(amount.toString()))));
3121
- return _context.abrupt("return", api.blake2AsHex(entropy));
3122
- case 6:
3123
- case "end":
3124
- return _context.stop();
3125
- }
3126
- }, _callee);
3127
- }));
3128
- return function generateMessageId(_x, _x2, _x3, _x4, _x5, _x6) {
3129
- return _ref.apply(this, arguments);
3130
- };
3131
- }();
3132
-
3133
- var supportsXTokens = function supportsXTokens(obj) {
3134
- return _typeof(obj) === 'object' && obj !== null && 'transferXTokens' in obj;
3135
- };
3136
- var supportsXTransfer = function supportsXTransfer(obj) {
3137
- return _typeof(obj) === 'object' && obj !== null && 'transferXTransfer' in obj;
3138
- };
3139
- var supportsPolkadotXCM = function supportsPolkadotXCM(obj) {
3140
- return _typeof(obj) === 'object' && obj !== null && 'transferPolkadotXCM' in obj;
3141
- };
3142
- var ParachainNode = /*#__PURE__*/function () {
3143
- function ParachainNode(node, info, type, version) {
3144
- _classCallCheck(this, ParachainNode);
3145
- this._assetCheckEnabled = true;
3146
- this._info = info;
3147
- this._type = type;
3148
- this._node = node;
3149
- this._version = version;
3150
- }
3151
- return _createClass(ParachainNode, [{
3152
- key: "info",
3153
- get: function get() {
3154
- return this._info;
3155
- }
3156
- }, {
3157
- key: "type",
3158
- get: function get() {
3159
- return this._type;
3160
- }
3161
- }, {
3162
- key: "node",
3163
- get: function get() {
3164
- return this._node;
3165
- }
3166
- }, {
3167
- key: "version",
3168
- get: function get() {
3169
- return this._version;
3170
- }
3171
- }, {
3172
- key: "assetCheckEnabled",
3173
- get: function get() {
3174
- return this._assetCheckEnabled;
3175
- }
3176
- }, {
3177
- key: "canUseXTokens",
3178
- value: function canUseXTokens(_ref) {
3179
- var asset = _ref.asset;
3180
- var isEthAsset = asset.multiLocation && assets.findAssetByMultiLocation(assets.getOtherAssets('Ethereum'), asset.multiLocation);
3181
- return !isEthAsset;
2899
+ key: "canUseXTokens",
2900
+ value: function canUseXTokens(_ref) {
2901
+ var asset = _ref.asset;
2902
+ var isEthAsset = asset.multiLocation && assets.findAssetByMultiLocation(assets.getOtherAssets('Ethereum'), asset.multiLocation);
2903
+ return !isEthAsset;
3182
2904
  }
3183
2905
  }, {
3184
2906
  key: "transfer",
3185
2907
  value: function () {
3186
2908
  var _transfer = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee(options) {
3187
- var api, asset, feeAsset, address, destination, paraIdTo, overriddenAsset, version, senderAddress, pallet, method, isRelayDestination, scenario, paraId, versionOrDefault, isLocalTransfer, isBifrostOrigin, isAssetHubDest, shouldUseMultiasset, input, _options, isEthAsset, isAHPOrigin, isAHPDest, isEthDest;
2909
+ var api, asset, feeAsset, address, destination, paraIdTo, overriddenAsset, version, senderAddress, ahAddress, pallet, method, isRelayDestination, scenario, paraId, versionOrDefault, isLocalTransfer, isBifrostOrigin, isAssetHubDest, shouldUseMultiasset, input, _options, isEthAsset, isAHPOrigin, isAHPDest, isEthDest;
3188
2910
  return _regeneratorRuntime().wrap(function _callee$(_context) {
3189
2911
  while (1) switch (_context.prev = _context.next) {
3190
2912
  case 0:
3191
- 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;
2913
+ 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, ahAddress = options.ahAddress, pallet = options.pallet, method = options.method;
3192
2914
  isRelayDestination = !sdkCommon.isTMultiLocation(destination) && sdkCommon.isRelayChain(destination);
3193
2915
  scenario = isRelayDestination ? 'ParaToRelay' : 'ParaToPara';
3194
2916
  paraId = resolveParaId(paraIdTo, destination);
@@ -3282,6 +3004,7 @@ var ParachainNode = /*#__PURE__*/function () {
3282
3004
  paraIdTo: paraId,
3283
3005
  version: version,
3284
3006
  senderAddress: senderAddress,
3007
+ ahAddress: ahAddress,
3285
3008
  pallet: pallet,
3286
3009
  method: method
3287
3010
  }; // Handle common cases
@@ -3454,17 +3177,17 @@ var ParachainNode = /*#__PURE__*/function () {
3454
3177
  return Builder(api.clone()).from('AssetHubPolkadot').to(destination).currency({
3455
3178
  symbol: 'DOT',
3456
3179
  amount: AH_EXECUTION_FEE_PADDED
3457
- }).address(address).dryRun(senderAddress);
3180
+ }).address(address).senderAddress(senderAddress).dryRun();
3458
3181
  case 12:
3459
3182
  dryRunResult = _context2.sent;
3460
- if (dryRunResult.success) {
3183
+ if (dryRunResult.origin.success) {
3461
3184
  _context2.next = 15;
3462
3185
  break;
3463
3186
  }
3464
- throw new DryRunFailedError(dryRunResult.failureReason);
3187
+ throw new DryRunFailedError(dryRunResult.origin.failureReason);
3465
3188
  case 15:
3466
3189
  // Pad fee by 50%
3467
- dryRunFeePadded = BigInt(dryRunResult.fee) * BigInt(3) / BigInt(2);
3190
+ dryRunFeePadded = BigInt(dryRunResult.origin.fee) * BigInt(3) / BigInt(2);
3468
3191
  destWithHeader = createVersionedDestination(scenario, version, destination, paraIdTo);
3469
3192
  _extractVersionFromHe = extractVersionFromHeader(destWithHeader), _extractVersionFromHe2 = _slicedToArray(_extractVersionFromHe, 2), _extractVersionFromHe2[0], dest = _extractVersionFromHe2[1];
3470
3193
  call = {
@@ -3648,7 +3371,7 @@ var ParachainNode = /*#__PURE__*/function () {
3648
3371
  version: version
3649
3372
  })
3650
3373
  }
3651
- }], version) : createCustomXcmOnDest(input, version, messageId),
3374
+ }], version) : createCustomXcmOnDest(input, this.node, version, messageId),
3652
3375
  weight_limit: 'Unlimited'
3653
3376
  }
3654
3377
  };
@@ -3955,6 +3678,12 @@ var AssetHubKusama = /*#__PURE__*/function (_ParachainNode) {
3955
3678
  }]);
3956
3679
  }(ParachainNode);
3957
3680
 
3681
+ var createVersionedBeneficiary = function createVersionedBeneficiary(options) {
3682
+ var version = options.version;
3683
+ var multiLocation = createBeneficiaryMultiLocation(options);
3684
+ return addXcmVersionHeader(multiLocation, version);
3685
+ };
3686
+
3958
3687
  var createExecuteXcm = function createExecuteXcm(input, weight, executionFee) {
3959
3688
  var api = input.api,
3960
3689
  _input$version = input.version,
@@ -4054,6 +3783,44 @@ var createExecuteXcm = function createExecuteXcm(input, weight, executionFee) {
4054
3783
  return api.callTxMethod(call);
4055
3784
  };
4056
3785
 
3786
+ var generateAddressMultiLocationV4 = function generateAddressMultiLocationV4(api, address) {
3787
+ var isMultiLocation = _typeof(address) === 'object';
3788
+ if (isMultiLocation) {
3789
+ return _defineProperty({}, exports.Version.V4, address);
3790
+ }
3791
+ var isEthAddress = ethers.ethers.isAddress(address);
3792
+ return addXcmVersionHeader({
3793
+ parents: sdkCommon.Parents.ZERO,
3794
+ interior: {
3795
+ X1: [isEthAddress ? {
3796
+ AccountKey20: {
3797
+ key: address
3798
+ }
3799
+ } : {
3800
+ AccountId32: {
3801
+ id: api.accountToHex(address),
3802
+ network: null
3803
+ }
3804
+ }]
3805
+ }
3806
+ }, exports.Version.V4);
3807
+ };
3808
+
3809
+ var validateAddress = function validateAddress(address, node) {
3810
+ var isDestination = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
3811
+ var isEvm = assets.isNodeEvm(node);
3812
+ var isEthereumAddress = ethers.ethers.isAddress(address);
3813
+ if (isEvm) {
3814
+ if (!isEthereumAddress) {
3815
+ throw new InvalidAddressError("".concat(isDestination ? 'Destination node' : 'Node', " is an EVM chain, but the address provided is not a valid Ethereum address."));
3816
+ }
3817
+ } else {
3818
+ if (isEthereumAddress) {
3819
+ throw new InvalidAddressError("EVM address provided but ".concat(isDestination ? 'destination ' : '', "node is not an EVM chain."));
3820
+ }
3821
+ }
3822
+ };
3823
+
4057
3824
  var createCustomXcmToBifrost = function createCustomXcmToBifrost(_ref, version) {
4058
3825
  var api = _ref.api,
4059
3826
  address = _ref.address,
@@ -5809,10 +5576,14 @@ var Moonbeam = /*#__PURE__*/function (_ParachainNode) {
5809
5576
  }, {
5810
5577
  key: "transferPolkadotXCM",
5811
5578
  value: function transferPolkadotXCM(input) {
5812
- var asset = input.asset,
5579
+ var destination = input.destination,
5580
+ asset = input.asset,
5813
5581
  scenario = input.scenario,
5814
5582
  _input$version = input.version,
5815
5583
  version = _input$version === void 0 ? this.version : _input$version;
5584
+ if (destination === 'Ethereum') {
5585
+ return this.transferToEthereum(input);
5586
+ }
5816
5587
  var multiLocation = this.getMultiLocation(asset, scenario);
5817
5588
  return Promise.resolve(PolkadotXCMTransferImpl.transferPolkadotXCM(_objectSpread2(_objectSpread2({}, input), {}, {
5818
5589
  currencySelection: createVersionedMultiAssets(version, asset.amount, multiLocation)
@@ -6544,7 +6315,618 @@ var nodes = function nodes() {
6544
6315
  Peaq: new Peaq(),
6545
6316
  Polimec: new Polimec()
6546
6317
  };
6547
- };
6318
+ };
6319
+
6320
+ /**
6321
+ * Retrieves the parachain ID for a specified node.
6322
+ *
6323
+ * @param node - The node for which to get the paraId.
6324
+ * @returns The parachain ID of the node.
6325
+ */
6326
+ var getParaId = function getParaId(node) {
6327
+ if (node === 'Ethereum') {
6328
+ return ETH_PARA_ID;
6329
+ }
6330
+ return getNodeConfig(node).paraId;
6331
+ };
6332
+
6333
+ var shuffleArray = function shuffleArray(array) {
6334
+ var copy = _toConsumableArray(array);
6335
+ for (var i = copy.length - 1; i > 0; i--) {
6336
+ var j = Math.floor(Math.random() * (i + 1));
6337
+ var _ref = [copy[j], copy[i]];
6338
+ copy[i] = _ref[0];
6339
+ copy[j] = _ref[1];
6340
+ }
6341
+ return copy;
6342
+ };
6343
+
6344
+ var shuffleWsProviders = function shuffleWsProviders(node, wsProviders) {
6345
+ var ALLOWED_NODES = ['Hydration', 'Acala'];
6346
+ if (ALLOWED_NODES.includes(node)) {
6347
+ return shuffleArray(wsProviders);
6348
+ }
6349
+ return wsProviders;
6350
+ };
6351
+
6352
+ var createApiInstanceForNode = /*#__PURE__*/function () {
6353
+ var _ref = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee(api, node) {
6354
+ var wsUrl, resolvedWsUrl;
6355
+ return _regeneratorRuntime().wrap(function _callee$(_context) {
6356
+ while (1) switch (_context.prev = _context.next) {
6357
+ case 0:
6358
+ wsUrl = getNodeProviders(node);
6359
+ resolvedWsUrl = Array.isArray(wsUrl) ? shuffleWsProviders(node, wsUrl) : wsUrl;
6360
+ return _context.abrupt("return", api.createApiInstance(resolvedWsUrl));
6361
+ case 3:
6362
+ case "end":
6363
+ return _context.stop();
6364
+ }
6365
+ }, _callee);
6366
+ }));
6367
+ return function createApiInstanceForNode(_x, _x2) {
6368
+ return _ref.apply(this, arguments);
6369
+ };
6370
+ }();
6371
+
6372
+ var getMultiLocationTokenId = function getMultiLocationTokenId(location, node) {
6373
+ if (location.interior.type === 'Here') {
6374
+ // native token
6375
+ return assets.getNativeAssetSymbol(node);
6376
+ }
6377
+ var foreignAssets = assets.getOtherAssets(node);
6378
+ if (location.interior.type === 'X2') {
6379
+ if (location.interior.value[0].type === 'PalletInstance' && location.interior.value[0].value === 50 && location.interior.value[1].type === 'GeneralIndex') {
6380
+ var _foreignAssets$find$a, _foreignAssets$find;
6381
+ var assetId = location.interior.value[1].value;
6382
+ return (_foreignAssets$find$a = (_foreignAssets$find = foreignAssets.find(function (asset) {
6383
+ return asset.assetId === String(assetId);
6384
+ })) === null || _foreignAssets$find === void 0 ? void 0 : _foreignAssets$find.assetId) !== null && _foreignAssets$find$a !== void 0 ? _foreignAssets$find$a : null;
6385
+ }
6386
+ }
6387
+ return null;
6388
+ };
6389
+
6390
+ var computeFeeFromDryRun = function computeFeeFromDryRun(dryRun, node, executionFee) {
6391
+ // Extract delivery fees from emitted events
6392
+ var deliveryFees = [];
6393
+ var _iterator = _createForOfIteratorHelper(dryRun.value.emitted_events),
6394
+ _step;
6395
+ try {
6396
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
6397
+ var e = _step.value;
6398
+ var isXcmEvent = e.type === 'XcmPallet' || e.type === 'PolkadotXcm' || e.type === 'CumulusXcm';
6399
+ var isFeesPaid = e.value.type === 'FeesPaid';
6400
+ if (isXcmEvent && isFeesPaid && e.value.value.fees) {
6401
+ var _iterator2 = _createForOfIteratorHelper(e.value.value.fees),
6402
+ _step2;
6403
+ try {
6404
+ for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
6405
+ var feeItem = _step2.value;
6406
+ if (feeItem.fun.type === 'NonFungible') continue;
6407
+ var plancks = feeItem.fun.value;
6408
+ var tokenSymbol = getMultiLocationTokenId(feeItem.id, node);
6409
+ if (!tokenSymbol || !plancks) continue;
6410
+ deliveryFees.push({
6411
+ plancks: plancks,
6412
+ tokenSymbol: tokenSymbol
6413
+ });
6414
+ }
6415
+ } catch (err) {
6416
+ _iterator2.e(err);
6417
+ } finally {
6418
+ _iterator2.f();
6419
+ }
6420
+ }
6421
+ }
6422
+ } catch (err) {
6423
+ _iterator.e(err);
6424
+ } finally {
6425
+ _iterator.f();
6426
+ }
6427
+ var nativeAssetSymbol = assets.getNativeAssetSymbol(node);
6428
+ // Sum the fees that match the feeToken
6429
+ var totalDeliveryFees = deliveryFees.filter(function (df) {
6430
+ return df.tokenSymbol === nativeAssetSymbol;
6431
+ }).reduce(function (acc, df) {
6432
+ return acc + df.plancks;
6433
+ }, 0n);
6434
+ return totalDeliveryFees + executionFee;
6435
+ };
6436
+
6437
+ var getMultiLocationTokenIdPjs = function getMultiLocationTokenIdPjs(location, node) {
6438
+ if (location.interior === 'Here') {
6439
+ // native token
6440
+ return assets.getNativeAssetSymbol(node);
6441
+ }
6442
+ var foreignAssets = assets.getOtherAssets(node);
6443
+ if (Object.keys(location.interior)[0] === 'X2') {
6444
+ var junctions = Object.values(location.interior)[0];
6445
+ if (Object.keys(junctions[0])[0] === 'PalletInstance' && junctions[0].PalletInstance === '50' && Object.keys(junctions[1])[0] === 'GeneralIndex') {
6446
+ var _foreignAssets$find$s, _foreignAssets$find;
6447
+ var assetId = junctions[1].GeneralIndex;
6448
+ return (_foreignAssets$find$s = (_foreignAssets$find = foreignAssets.find(function (asset) {
6449
+ return asset.assetId === String(assetId);
6450
+ })) === null || _foreignAssets$find === void 0 ? void 0 : _foreignAssets$find.symbol) !== null && _foreignAssets$find$s !== void 0 ? _foreignAssets$find$s : null;
6451
+ }
6452
+ }
6453
+ return null;
6454
+ };
6455
+
6456
+ var computeFeeFromDryRunPjs = function computeFeeFromDryRunPjs(dryRun, node, executionFee) {
6457
+ // Extract delivery fees from emitted events
6458
+ var deliveryFees = [];
6459
+ var _iterator = _createForOfIteratorHelper(dryRun.Ok.emittedEvents),
6460
+ _step;
6461
+ try {
6462
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
6463
+ var e = _step.value;
6464
+ var isXcmEvent = e.section === 'xcmPallet' || e.section === 'polkadotXcm' || e.section === 'cumulusXcm';
6465
+ var isFeesPaid = e.method === 'FeesPaid';
6466
+ if (isXcmEvent && isFeesPaid && e.data.fees) {
6467
+ var _iterator2 = _createForOfIteratorHelper(e.data.fees),
6468
+ _step2;
6469
+ try {
6470
+ for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
6471
+ var feeItem = _step2.value;
6472
+ if (feeItem.fun.NonFungible) continue;
6473
+ var plancks = BigInt(feeItem.fun.Fungible.replace(/,/g, ''));
6474
+ var tokenSymbol = getMultiLocationTokenIdPjs(feeItem.id, node);
6475
+ if (!tokenSymbol || !plancks) continue;
6476
+ deliveryFees.push({
6477
+ plancks: plancks,
6478
+ tokenSymbol: tokenSymbol
6479
+ });
6480
+ }
6481
+ } catch (err) {
6482
+ _iterator2.e(err);
6483
+ } finally {
6484
+ _iterator2.f();
6485
+ }
6486
+ }
6487
+ }
6488
+ } catch (err) {
6489
+ _iterator.e(err);
6490
+ } finally {
6491
+ _iterator.f();
6492
+ }
6493
+ var nativeAssetSymbol = assets.getNativeAssetSymbol(node);
6494
+ // Sum the fees that match the feeToken
6495
+ var totalDeliveryFees = deliveryFees.filter(function (df) {
6496
+ return df.tokenSymbol === nativeAssetSymbol;
6497
+ }).reduce(function (acc, df) {
6498
+ return acc + df.plancks;
6499
+ }, 0n);
6500
+ return totalDeliveryFees + executionFee;
6501
+ };
6502
+
6503
+ var resolveModuleError = function resolveModuleError(node, error) {
6504
+ var palletDetails = pallets.getSupportedPalletsDetails(node).find(function (p) {
6505
+ return p.index === Number(error.index);
6506
+ });
6507
+ if (!palletDetails) {
6508
+ throw new Error("Pallet with index ".concat(error.index, " not found"));
6509
+ }
6510
+ // Use only the first byte of the error to get the error index
6511
+ var errorIndex = Number(error.error.slice(0, 4));
6512
+ var name = palletDetails.name;
6513
+ if (name !== 'XTokens' && name !== 'PolkadotXcm' && name !== 'XcmPallet') {
6514
+ throw new Error("Pallet ".concat(name, " is not supported"));
6515
+ }
6516
+ var failureReason = name === 'XTokens' ? Object.values(exports.XTokensError)[errorIndex] : Object.values(exports.PolkadotXcmError)[errorIndex];
6517
+ if (!failureReason) {
6518
+ throw new Error("Error index ".concat(errorIndex, " not found in ").concat(name, " pallet"));
6519
+ }
6520
+ return failureReason;
6521
+ };
6522
+
6523
+ var getFees = function getFees(scenario) {
6524
+ if (scenario === 'ParaToRelay') {
6525
+ return 4600000000;
6526
+ } else if (scenario === 'ParaToPara') {
6527
+ return 399600000000;
6528
+ }
6529
+ throw new Error("Fees for scenario ".concat(scenario, " are not defined."));
6530
+ };
6531
+
6532
+ /**
6533
+ * Retrieves the node instance for a given node.
6534
+ *
6535
+ * @param node - The node identifier.
6536
+ * @returns The node instance
6537
+ */
6538
+ var getNode = function getNode(node) {
6539
+ var nodeMap = nodes();
6540
+ return nodeMap[node];
6541
+ };
6542
+
6543
+ // Contains important call creation utils (Selection of fees,formating of header and more.. )
6544
+ /**
6545
+ * Determines the relay chain for a given node.
6546
+ *
6547
+ * @param node - The node for which to determine the relay chain.
6548
+ * @returns 'Kusama' if the node's relay chain symbol is 'KSM'; otherwise, 'Polkadot'.
6549
+ */
6550
+ var determineRelayChain = function determineRelayChain(node) {
6551
+ return assets.getRelayChainSymbol(node) === 'KSM' ? 'Kusama' : 'Polkadot';
6552
+ };
6553
+
6554
+ /**
6555
+ * Retrieves the node name corresponding to a specified parachain ID.
6556
+ *
6557
+ * @param paraId - The parachain ID.
6558
+ * @returns The node name if found; otherwise, null.
6559
+ */
6560
+ var getTNode = function getTNode(paraId, ecosystem) {
6561
+ var _NODE_NAMES_DOT_KSM$f;
6562
+ if (paraId === 0) {
6563
+ return ecosystem === 'polkadot' ? 'Polkadot' : 'Kusama';
6564
+ }
6565
+ if (paraId === 1) {
6566
+ return 'Ethereum';
6567
+ }
6568
+ return (_NODE_NAMES_DOT_KSM$f = sdkCommon.NODE_NAMES_DOT_KSM.find(function (nodeName) {
6569
+ return getNode(nodeName).type === ecosystem && getParaId(nodeName) === paraId;
6570
+ })) !== null && _NODE_NAMES_DOT_KSM$f !== void 0 ? _NODE_NAMES_DOT_KSM$f : null;
6571
+ };
6572
+
6573
+ var isAssetHub = function isAssetHub(chain) {
6574
+ return chain === 'AssetHubPolkadot' || chain === 'AssetHubKusama';
6575
+ };
6576
+ var isBridgeHub = function isBridgeHub(chain) {
6577
+ return chain === 'BridgeHubPolkadot' || chain === 'BridgeHubKusama';
6578
+ };
6579
+ var isPeople = function isPeople(chain) {
6580
+ return chain === 'PeoplePolkadot' || chain === 'PeopleKusama';
6581
+ };
6582
+ var isSystemPara = function isSystemPara(chain) {
6583
+ return isAssetHub(chain) || isBridgeHub(chain) || isPeople(chain);
6584
+ };
6585
+ var mul = function mul(v, num) {
6586
+ var den = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1n;
6587
+ return v * num / den;
6588
+ };
6589
+ var padFee = function padFee(raw, origin, dest, side) {
6590
+ var relayOrigin = sdkCommon.isRelayChain(origin);
6591
+ var relayDest = sdkCommon.isRelayChain(dest);
6592
+ var sysParaOrigin = isSystemPara(origin);
6593
+ var sysParaDest = isSystemPara(dest);
6594
+ var relayToPara = relayOrigin && !relayDest;
6595
+ var sysParaToPara = sysParaOrigin && !sysParaDest;
6596
+ var paraToPara = !relayOrigin && !sysParaOrigin;
6597
+ if (sysParaToPara) return raw * 40n;
6598
+ if (relayToPara) return side === 'origin' ? mul(raw, 320n, 100n) : mul(raw, 3000n, 100n);
6599
+ if (paraToPara) return mul(raw, 130n, 100n);
6600
+ // apply default 30% padding
6601
+ return mul(raw, 130n, 100n);
6602
+ };
6603
+
6604
+ var createOriginLocation = function createOriginLocation(origin, destination) {
6605
+ if (sdkCommon.isRelayChain(origin)) return DOT_MULTILOCATION;
6606
+ return {
6607
+ parents: sdkCommon.isRelayChain(destination) ? sdkCommon.Parents.ZERO : sdkCommon.Parents.ONE,
6608
+ interior: {
6609
+ X1: [{
6610
+ Parachain: getParaId(origin)
6611
+ }]
6612
+ }
6613
+ };
6614
+ };
6615
+ var getFeeForDestNode = /*#__PURE__*/function () {
6616
+ var _ref2 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee2(_ref) {
6617
+ var api, forwardedXcms, origin, destination, address, senderAddress, currency, disableFallback, calcPaymentInfoFee, dryRunResult, fee, newForwardedXcms, destParaId;
6618
+ return _regeneratorRuntime().wrap(function _callee2$(_context2) {
6619
+ while (1) switch (_context2.prev = _context2.next) {
6620
+ case 0:
6621
+ api = _ref.api, forwardedXcms = _ref.forwardedXcms, origin = _ref.origin, destination = _ref.destination, address = _ref.address, senderAddress = _ref.senderAddress, currency = _ref.currency, disableFallback = _ref.disableFallback;
6622
+ calcPaymentInfoFee = /*#__PURE__*/function () {
6623
+ var _ref3 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee() {
6624
+ var originAsset, currencyInput, tx, rawFee;
6625
+ return _regeneratorRuntime().wrap(function _callee$(_context) {
6626
+ while (1) switch (_context.prev = _context.next) {
6627
+ case 0:
6628
+ if (!('multiasset' in currency)) {
6629
+ _context.next = 2;
6630
+ break;
6631
+ }
6632
+ throw new assets.InvalidCurrencyError('Multi-assets are not yet supported for XCM fee calculation.');
6633
+ case 2:
6634
+ originAsset = assets.findAsset(origin, currency, destination);
6635
+ if (originAsset) {
6636
+ _context.next = 5;
6637
+ break;
6638
+ }
6639
+ throw new assets.InvalidCurrencyError("Currency ".concat(JSON.stringify(currency), " not found in ").concat(origin));
6640
+ case 5:
6641
+ currencyInput = originAsset.multiLocation ? {
6642
+ multilocation: originAsset.multiLocation
6643
+ } : {
6644
+ symbol: originAsset.symbol
6645
+ };
6646
+ _context.next = 8;
6647
+ return Builder(api).from(destination).to(origin).address(senderAddress).senderAddress(address).currency(_objectSpread2(_objectSpread2({}, currencyInput), {}, {
6648
+ amount: currency.amount
6649
+ })).build();
6650
+ case 8:
6651
+ tx = _context.sent;
6652
+ _context.next = 11;
6653
+ return api.calculateTransactionFee(tx, address);
6654
+ case 11:
6655
+ rawFee = _context.sent;
6656
+ return _context.abrupt("return", padFee(rawFee, origin, destination, 'destination'));
6657
+ case 13:
6658
+ case "end":
6659
+ return _context.stop();
6660
+ }
6661
+ }, _callee);
6662
+ }));
6663
+ return function calcPaymentInfoFee() {
6664
+ return _ref3.apply(this, arguments);
6665
+ };
6666
+ }();
6667
+ if (!(!assets.hasDryRunSupport(destination) || !forwardedXcms)) {
6668
+ _context2.next = 7;
6669
+ break;
6670
+ }
6671
+ _context2.next = 5;
6672
+ return calcPaymentInfoFee();
6673
+ case 5:
6674
+ _context2.t0 = _context2.sent;
6675
+ return _context2.abrupt("return", {
6676
+ fee: _context2.t0,
6677
+ feeType: 'paymentInfo'
6678
+ });
6679
+ case 7:
6680
+ _context2.next = 9;
6681
+ return api.getDryRunXcm({
6682
+ originLocation: addXcmVersionHeader(createOriginLocation(origin, destination), exports.Version.V4),
6683
+ xcm: forwardedXcms[1][0],
6684
+ node: destination,
6685
+ origin: origin
6686
+ });
6687
+ case 9:
6688
+ dryRunResult = _context2.sent;
6689
+ if (dryRunResult.success) {
6690
+ _context2.next = 18;
6691
+ break;
6692
+ }
6693
+ if (!disableFallback) {
6694
+ _context2.next = 13;
6695
+ break;
6696
+ }
6697
+ return _context2.abrupt("return", {
6698
+ dryRunError: dryRunResult.failureReason
6699
+ });
6700
+ case 13:
6701
+ _context2.next = 15;
6702
+ return calcPaymentInfoFee();
6703
+ case 15:
6704
+ _context2.t1 = _context2.sent;
6705
+ _context2.t2 = dryRunResult.failureReason;
6706
+ return _context2.abrupt("return", {
6707
+ fee: _context2.t1,
6708
+ feeType: 'paymentInfo',
6709
+ dryRunError: _context2.t2
6710
+ });
6711
+ case 18:
6712
+ fee = dryRunResult.fee, newForwardedXcms = dryRunResult.forwardedXcms, destParaId = dryRunResult.destParaId;
6713
+ return _context2.abrupt("return", {
6714
+ fee: fee,
6715
+ feeType: 'dryRun',
6716
+ forwardedXcms: newForwardedXcms,
6717
+ destParaId: destParaId
6718
+ });
6719
+ case 20:
6720
+ case "end":
6721
+ return _context2.stop();
6722
+ }
6723
+ }, _callee2);
6724
+ }));
6725
+ return function getFeeForDestNode(_x) {
6726
+ return _ref2.apply(this, arguments);
6727
+ };
6728
+ }();
6729
+
6730
+ var dryRunInternal = /*#__PURE__*/function () {
6731
+ var _ref = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee(options) {
6732
+ var _findAsset, _intermediateFees$ass, _intermediateFees$bri, _destinationDryRun;
6733
+ var origin, destination, currency, api, tx, senderAddress, asset, originDryRun, initialForwardedXcms, initialDestParaId, currentOrigin, forwardedXcms, nextParaId, intermediateFees, destinationDryRun, nextChain, hopApi, hopDryRun, newXcms, destParaId;
6734
+ return _regeneratorRuntime().wrap(function _callee$(_context) {
6735
+ while (1) switch (_context.prev = _context.next) {
6736
+ case 0:
6737
+ origin = options.origin, destination = options.destination, currency = options.currency, api = options.api, tx = options.tx, senderAddress = options.senderAddress;
6738
+ asset = (_findAsset = assets.findAsset(origin, currency, destination)) !== null && _findAsset !== void 0 ? _findAsset : origin === 'AssetHubPolkadot' ? assets.findAsset('Ethereum', currency, null) : null;
6739
+ if (asset) {
6740
+ _context.next = 4;
6741
+ break;
6742
+ }
6743
+ throw new assets.InvalidCurrencyError("Asset ".concat(JSON.stringify(currency), " not found on ").concat(origin));
6744
+ case 4:
6745
+ _context.next = 6;
6746
+ return api.getDryRunCall({
6747
+ tx: tx,
6748
+ node: origin,
6749
+ address: senderAddress
6750
+ });
6751
+ case 6:
6752
+ originDryRun = _context.sent;
6753
+ if (originDryRun.success) {
6754
+ _context.next = 9;
6755
+ break;
6756
+ }
6757
+ return _context.abrupt("return", {
6758
+ origin: originDryRun
6759
+ });
6760
+ case 9:
6761
+ initialForwardedXcms = originDryRun.forwardedXcms, initialDestParaId = originDryRun.destParaId;
6762
+ currentOrigin = origin;
6763
+ forwardedXcms = initialForwardedXcms;
6764
+ nextParaId = initialDestParaId;
6765
+ intermediateFees = {};
6766
+ case 14:
6767
+ if (!(Array.isArray(forwardedXcms) && forwardedXcms.length && forwardedXcms[1].length && ('disconnect' in api.getApi() ? Object.values(forwardedXcms[1][0]).length : forwardedXcms[1][0].value.length) > 0 && nextParaId !== undefined)) {
6768
+ _context.next = 41;
6769
+ break;
6770
+ }
6771
+ nextChain = getTNode(nextParaId, determineRelayChain(origin) === 'Polkadot' ? 'polkadot' : 'kusama');
6772
+ if (nextChain) {
6773
+ _context.next = 18;
6774
+ break;
6775
+ }
6776
+ throw new Error("Unable to find TNode for paraId ".concat(nextParaId));
6777
+ case 18:
6778
+ hopApi = api.clone();
6779
+ _context.prev = 19;
6780
+ if (assets.hasDryRunSupport(nextChain)) {
6781
+ _context.next = 23;
6782
+ break;
6783
+ }
6784
+ if (nextChain === destination) {
6785
+ destinationDryRun = {
6786
+ success: false,
6787
+ failureReason: "DryRunApi is not available on node ".concat(nextChain)
6788
+ };
6789
+ }
6790
+ return _context.abrupt("break", 41);
6791
+ case 23:
6792
+ _context.next = 25;
6793
+ return hopApi.init(nextChain);
6794
+ case 25:
6795
+ _context.next = 27;
6796
+ return hopApi.getDryRunXcm({
6797
+ originLocation: addXcmVersionHeader(createOriginLocation(currentOrigin, nextChain), exports.Version.V4),
6798
+ xcm: forwardedXcms[1][0],
6799
+ node: nextChain,
6800
+ origin: currentOrigin
6801
+ });
6802
+ case 27:
6803
+ hopDryRun = _context.sent;
6804
+ if (nextChain === destination || sdkCommon.isRelayChain(nextChain) && !sdkCommon.isRelayChain(destination)) {
6805
+ destinationDryRun = hopDryRun;
6806
+ } else if (nextChain === 'AssetHubPolkadot') {
6807
+ intermediateFees.assetHub = hopDryRun;
6808
+ } else if (nextChain === 'BridgeHubPolkadot') {
6809
+ intermediateFees.bridgeHub = hopDryRun;
6810
+ }
6811
+ if (hopDryRun.success) {
6812
+ _context.next = 31;
6813
+ break;
6814
+ }
6815
+ return _context.abrupt("break", 41);
6816
+ case 31:
6817
+ newXcms = hopDryRun.forwardedXcms, destParaId = hopDryRun.destParaId;
6818
+ forwardedXcms = newXcms;
6819
+ nextParaId = destParaId;
6820
+ currentOrigin = nextChain;
6821
+ case 35:
6822
+ _context.prev = 35;
6823
+ _context.next = 38;
6824
+ return hopApi.disconnect();
6825
+ case 38:
6826
+ return _context.finish(35);
6827
+ case 39:
6828
+ _context.next = 14;
6829
+ break;
6830
+ case 41:
6831
+ return _context.abrupt("return", {
6832
+ origin: originDryRun.success ? _objectSpread2(_objectSpread2({}, originDryRun), {}, {
6833
+ currency: assets.getNativeAssetSymbol(origin)
6834
+ }) : originDryRun,
6835
+ assetHub: (_intermediateFees$ass = intermediateFees.assetHub) !== null && _intermediateFees$ass !== void 0 && _intermediateFees$ass.success ? _objectSpread2(_objectSpread2({}, intermediateFees.assetHub), {}, {
6836
+ currency: assets.getNativeAssetSymbol('AssetHubPolkadot')
6837
+ }) : intermediateFees.assetHub,
6838
+ bridgeHub: (_intermediateFees$bri = intermediateFees.bridgeHub) !== null && _intermediateFees$bri !== void 0 && _intermediateFees$bri.success ? _objectSpread2(_objectSpread2({}, intermediateFees.bridgeHub), {}, {
6839
+ currency: assets.getNativeAssetSymbol('BridgeHubPolkadot')
6840
+ }) : intermediateFees.bridgeHub,
6841
+ destination: (_destinationDryRun = destinationDryRun) !== null && _destinationDryRun !== void 0 && _destinationDryRun.success ? _objectSpread2(_objectSpread2({}, destinationDryRun), {}, {
6842
+ currency: asset.symbol
6843
+ }) : destinationDryRun
6844
+ });
6845
+ case 42:
6846
+ case "end":
6847
+ return _context.stop();
6848
+ }
6849
+ }, _callee, null, [[19,, 35, 39]]);
6850
+ }));
6851
+ return function dryRunInternal(_x) {
6852
+ return _ref.apply(this, arguments);
6853
+ };
6854
+ }();
6855
+
6856
+ var dryRun = /*#__PURE__*/function () {
6857
+ var _ref = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee(options) {
6858
+ var api, senderAddress, origin;
6859
+ return _regeneratorRuntime().wrap(function _callee$(_context) {
6860
+ while (1) switch (_context.prev = _context.next) {
6861
+ case 0:
6862
+ api = options.api, senderAddress = options.senderAddress, origin = options.origin;
6863
+ validateAddress(senderAddress, origin, false);
6864
+ _context.next = 4;
6865
+ return api.init(origin);
6866
+ case 4:
6867
+ _context.prev = 4;
6868
+ _context.next = 7;
6869
+ return dryRunInternal(options);
6870
+ case 7:
6871
+ return _context.abrupt("return", _context.sent);
6872
+ case 8:
6873
+ _context.prev = 8;
6874
+ _context.next = 11;
6875
+ return api.disconnect();
6876
+ case 11:
6877
+ return _context.finish(8);
6878
+ case 12:
6879
+ case "end":
6880
+ return _context.stop();
6881
+ }
6882
+ }, _callee, null, [[4,, 8, 12]]);
6883
+ }));
6884
+ return function dryRun(_x) {
6885
+ return _ref.apply(this, arguments);
6886
+ };
6887
+ }();
6888
+
6889
+ var dryRunOrigin = /*#__PURE__*/function () {
6890
+ var _ref = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee(options) {
6891
+ var api, node, address, result;
6892
+ return _regeneratorRuntime().wrap(function _callee$(_context) {
6893
+ while (1) switch (_context.prev = _context.next) {
6894
+ case 0:
6895
+ api = options.api, node = options.node, address = options.address;
6896
+ validateAddress(address, node, false);
6897
+ _context.next = 4;
6898
+ return api.init(node);
6899
+ case 4:
6900
+ _context.prev = 4;
6901
+ _context.next = 7;
6902
+ return api.getDryRunCall(options);
6903
+ case 7:
6904
+ result = _context.sent;
6905
+ if (!result.success) {
6906
+ _context.next = 12;
6907
+ break;
6908
+ }
6909
+ return _context.abrupt("return", _objectSpread2(_objectSpread2({}, result), {}, {
6910
+ currency: assets.getNativeAssetSymbol(node)
6911
+ }));
6912
+ case 12:
6913
+ return _context.abrupt("return", result);
6914
+ case 13:
6915
+ _context.prev = 13;
6916
+ _context.next = 16;
6917
+ return api.disconnect();
6918
+ case 16:
6919
+ return _context.finish(13);
6920
+ case 17:
6921
+ case "end":
6922
+ return _context.stop();
6923
+ }
6924
+ }, _callee, null, [[4,, 13, 17]]);
6925
+ }));
6926
+ return function dryRunOrigin(_x) {
6927
+ return _ref.apply(this, arguments);
6928
+ };
6929
+ }();
6548
6930
 
6549
6931
  var getParaEthTransferFees = /*#__PURE__*/function () {
6550
6932
  var _ref = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee(ahApi) {
@@ -6904,345 +7286,137 @@ var transferMoonbeamToEth = /*#__PURE__*/function () {
6904
7286
  break;
6905
7287
  }
6906
7288
  throw new BridgeHaltedError();
6907
- case 8:
6908
- if (!('multiasset' in currency)) {
6909
- _context.next = 10;
6910
- break;
6911
- }
6912
- throw new Error('Multiassets syntax is not supported for Evm transfers');
6913
- case 10:
6914
- if (!('multilocation' in currency && assets.isOverrideMultiLocationSpecifier(currency.multilocation))) {
6915
- _context.next = 12;
6916
- break;
6917
- }
6918
- throw new Error('Override multilocation is not supported for Evm transfers');
6919
- case 12:
6920
- foundAsset = assets.findAsset(from, currency, to);
6921
- if (!(foundAsset === null)) {
6922
- _context.next = 15;
6923
- break;
6924
- }
6925
- throw new assets.InvalidCurrencyError("Origin node ".concat(from, " does not support currency ").concat(JSON.stringify(currency), "."));
6926
- case 15:
6927
- if (!(!assets.isForeignAsset(foundAsset) || !foundAsset.multiLocation)) {
6928
- _context.next = 17;
6929
- break;
6930
- }
6931
- throw new assets.InvalidCurrencyError('Currency must be a foreign asset with valid multi-location');
6932
- case 17:
6933
- ethAsset = assets.findAssetByMultiLocation(assets.getOtherAssets('Ethereum'), foundAsset.multiLocation);
6934
- if (!(!ethAsset || !ethAsset.assetId)) {
6935
- _context.next = 20;
6936
- break;
6937
- }
6938
- throw new assets.InvalidCurrencyError("Could not obtain Ethereum asset address for ".concat(JSON.stringify(foundAsset)));
6939
- case 20:
6940
- contract = isEthersSigner(signer) ? new ethers.Contract(xcmInterfacePrecompile, abi, signer) : viem.getContract({
6941
- abi: abi,
6942
- address: xcmInterfacePrecompile,
6943
- client: {
6944
- "public": viem.createPublicClient({
6945
- chain: signer.chain,
6946
- transport: viem.http()
6947
- }),
6948
- wallet: signer
6949
- }
6950
- });
6951
- if (!isEthersSigner(signer)) {
6952
- _context.next = 27;
6953
- break;
6954
- }
6955
- _context.next = 24;
6956
- return signer.getAddress();
6957
- case 24:
6958
- _context.t0 = _context.sent;
6959
- _context.next = 28;
6960
- break;
6961
- case 27:
6962
- _context.t0 = (_signer$account = signer.account) === null || _signer$account === void 0 ? void 0 : _signer$account.address;
6963
- case 28:
6964
- senderAddress = _context.t0;
6965
- if (senderAddress) {
6966
- _context.next = 31;
6967
- break;
6968
- }
6969
- throw new Error('Unable to get sender address');
6970
- case 31:
6971
- _context.next = 33;
6972
- return api.init(from);
6973
- case 33:
6974
- _context.next = 35;
6975
- return generateMessageId(api, senderAddress, getParaId(from), ethAsset.assetId, address, currency.amount);
6976
- case 35:
6977
- messageId = _context.sent;
6978
- customXcm = createCustomXcmOnDest({
6979
- api: api,
6980
- address: address,
6981
- scenario: 'ParaToPara',
6982
- senderAddress: senderAddress,
6983
- asset: _objectSpread2(_objectSpread2({}, foundAsset), {}, {
6984
- amount: currency.amount
6985
- })}, exports.Version.V4, messageId);
6986
- _context.next = 39;
6987
- return api.objectToHex(customXcm, 'XcmVersionedXcm');
6988
- case 39:
6989
- customXcmOnDest = _context.sent;
6990
- _context.next = 42;
6991
- return api.createApiForNode('AssetHubPolkadot');
6992
- case 42:
6993
- assetHubApi = _context.sent;
6994
- _context.next = 45;
6995
- return getParaEthTransferFees(assetHubApi);
6996
- case 45:
6997
- _yield$getParaEthTran = _context.sent;
6998
- _yield$getParaEthTran2 = _slicedToArray(_yield$getParaEthTran, 2);
6999
- bridgeFee = _yield$getParaEthTran2[0];
7000
- executionFee = _yield$getParaEthTran2[1];
7001
- transferFee = (bridgeFee + executionFee).toString(); // Partially inspired by Moonbeam XCM-SDK
7002
- // https://github.com/moonbeam-foundation/xcm-sdk/blob/ab835c15bf41612604b1c858d956a9f07705ed65/packages/sdk/src/contract/contracts/Xtokens/Xtokens.ts#L53
7003
- createTx = function createTx(func, args) {
7004
- if (isEthersContract(contract)) {
7005
- return contract[func].apply(contract, _toConsumableArray(args));
7006
- }
7007
- return contract.write[func](args);
7008
- };
7009
- numberToHex32 = function numberToHex32(num) {
7010
- return typeof num !== 'number' || isNaN(num) ? function () {
7011
- throw new Error('Input must be a valid number');
7012
- }() : "0x".concat((num >>> 0).toString(16).padStart(8, '0'));
7013
- }; // Execute the custom XCM message with the precompile
7014
- _context.next = 54;
7015
- return createTx(isEthersSigner(signer) ? 'transferAssetsUsingTypeAndThenAddress((uint8,bytes[]),(address,uint256)[],uint8,uint8,uint8,bytes)' : 'transferAssetsUsingTypeAndThenAddress', [
7016
- // This represents (1,X1(Parachain(1000)))
7017
- [1, ['0x00' + numberToHex32(getParaId('AssetHubPolkadot')).slice(2)]],
7018
- // Assets including fee and the ERC20 asset, with fee be the first
7019
- [[XCDOT, transferFee], [ethAsset.assetId, currency.amount.toString()]],
7020
- // The TransferType corresponding to asset being sent, 2 represents `DestinationReserve`
7021
- 2,
7022
- // index for the fee
7023
- 0,
7024
- // The TransferType corresponding to fee asset
7025
- 2, customXcmOnDest]);
7026
- case 54:
7027
- tx = _context.sent;
7028
- return _context.abrupt("return", _typeof(tx) === 'object' ? tx.hash : tx);
7029
- case 56:
7030
- case "end":
7031
- return _context.stop();
7032
- }
7033
- }, _callee);
7034
- }));
7035
- return function transferMoonbeamToEth(_x) {
7036
- return _ref2.apply(this, arguments);
7037
- };
7038
- }();
7039
-
7040
- /**
7041
- * Retrieves the node name corresponding to a specified parachain ID.
7042
- *
7043
- * @param paraId - The parachain ID.
7044
- * @returns The node name if found; otherwise, null.
7045
- */
7046
- var getTNode = function getTNode(paraId, ecosystem) {
7047
- var _NODE_NAMES_DOT_KSM$f;
7048
- if (paraId === 0) {
7049
- return ecosystem === 'polkadot' ? 'Polkadot' : 'Kusama';
7050
- }
7051
- if (paraId === 1) {
7052
- return 'Ethereum';
7053
- }
7054
- return (_NODE_NAMES_DOT_KSM$f = sdkCommon.NODE_NAMES_DOT_KSM.find(function (nodeName) {
7055
- return getNode(nodeName).type === ecosystem && getParaId(nodeName) === paraId;
7056
- })) !== null && _NODE_NAMES_DOT_KSM$f !== void 0 ? _NODE_NAMES_DOT_KSM$f : null;
7057
- };
7058
-
7059
- var isAssetHub = function isAssetHub(chain) {
7060
- return chain === 'AssetHubPolkadot' || chain === 'AssetHubKusama';
7061
- };
7062
- var isBridgeHub = function isBridgeHub(chain) {
7063
- return chain === 'BridgeHubPolkadot' || chain === 'BridgeHubKusama';
7064
- };
7065
- var isPeople = function isPeople(chain) {
7066
- return chain === 'PeoplePolkadot' || chain === 'PeopleKusama';
7067
- };
7068
- var isSystemPara = function isSystemPara(chain) {
7069
- return isAssetHub(chain) || isBridgeHub(chain) || isPeople(chain);
7070
- };
7071
- var mul = function mul(v, num) {
7072
- var den = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1n;
7073
- return v * num / den;
7074
- };
7075
- var padFee = function padFee(raw, origin, dest, side) {
7076
- var relayOrigin = sdkCommon.isRelayChain(origin);
7077
- var relayDest = sdkCommon.isRelayChain(dest);
7078
- var sysParaOrigin = isSystemPara(origin);
7079
- var sysParaDest = isSystemPara(dest);
7080
- var relayToPara = relayOrigin && !relayDest;
7081
- var sysParaToPara = sysParaOrigin && !sysParaDest;
7082
- var paraToPara = !relayOrigin && !sysParaOrigin;
7083
- if (sysParaToPara) return raw * 40n;
7084
- if (relayToPara) return side === 'origin' ? mul(raw, 320n, 100n) : mul(raw, 3000n, 100n);
7085
- if (paraToPara) return mul(raw, 130n, 100n);
7086
- // apply default 30% padding
7087
- return mul(raw, 130n, 100n);
7088
- };
7089
-
7090
- var createOriginLocation = function createOriginLocation(origin, destination) {
7091
- if (sdkCommon.isRelayChain(origin)) return DOT_MULTILOCATION;
7092
- return {
7093
- parents: sdkCommon.isRelayChain(destination) ? sdkCommon.Parents.ZERO : sdkCommon.Parents.ONE,
7094
- interior: {
7095
- X1: [{
7096
- Parachain: getParaId(origin)
7097
- }]
7098
- }
7099
- };
7100
- };
7101
- var getFeeForDestNode = /*#__PURE__*/function () {
7102
- var _ref2 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee2(_ref) {
7103
- var api, forwardedXcms, origin, destination, address, senderAddress, currency, disableFallback, calcPaymentInfoFee, dryRunResult, fee, newForwardedXcms, destParaId;
7104
- return _regeneratorRuntime().wrap(function _callee2$(_context2) {
7105
- while (1) switch (_context2.prev = _context2.next) {
7106
- case 0:
7107
- api = _ref.api, forwardedXcms = _ref.forwardedXcms, origin = _ref.origin, destination = _ref.destination, address = _ref.address, senderAddress = _ref.senderAddress, currency = _ref.currency, disableFallback = _ref.disableFallback;
7108
- calcPaymentInfoFee = /*#__PURE__*/function () {
7109
- var _ref3 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee() {
7110
- var originAsset, currencyInput, tx, rawFee;
7111
- return _regeneratorRuntime().wrap(function _callee$(_context) {
7112
- while (1) switch (_context.prev = _context.next) {
7113
- case 0:
7114
- if (!('multiasset' in currency)) {
7115
- _context.next = 2;
7116
- break;
7117
- }
7118
- throw new assets.InvalidCurrencyError('Multi-assets are not yet supported for XCM fee calculation.');
7119
- case 2:
7120
- originAsset = assets.findAsset(origin, currency, destination);
7121
- if (originAsset) {
7122
- _context.next = 5;
7123
- break;
7124
- }
7125
- throw new assets.InvalidCurrencyError("Currency ".concat(JSON.stringify(currency), " not found in ").concat(origin));
7126
- case 5:
7127
- currencyInput = originAsset.multiLocation ? {
7128
- multilocation: originAsset.multiLocation
7129
- } : {
7130
- symbol: originAsset.symbol
7131
- };
7132
- _context.next = 8;
7133
- return Builder(api).from(destination).to(origin).address(senderAddress, address).currency(_objectSpread2(_objectSpread2({}, currencyInput), {}, {
7134
- amount: currency.amount
7135
- })).build();
7136
- case 8:
7137
- tx = _context.sent;
7138
- _context.next = 11;
7139
- return api.calculateTransactionFee(tx, address);
7140
- case 11:
7141
- rawFee = _context.sent;
7142
- return _context.abrupt("return", padFee(rawFee, origin, destination, 'destination'));
7143
- case 13:
7144
- case "end":
7145
- return _context.stop();
7146
- }
7147
- }, _callee);
7148
- }));
7149
- return function calcPaymentInfoFee() {
7150
- return _ref3.apply(this, arguments);
7151
- };
7152
- }();
7153
- if (!(!assets.hasDryRunSupport(destination) || !forwardedXcms)) {
7154
- _context2.next = 7;
7289
+ case 8:
7290
+ if (!('multiasset' in currency)) {
7291
+ _context.next = 10;
7155
7292
  break;
7156
7293
  }
7157
- _context2.next = 5;
7158
- return calcPaymentInfoFee();
7159
- case 5:
7160
- _context2.t0 = _context2.sent;
7161
- return _context2.abrupt("return", {
7162
- fee: _context2.t0,
7163
- feeType: 'paymentInfo'
7164
- });
7165
- case 7:
7166
- _context2.next = 9;
7167
- return api.getDryRunXcm({
7168
- originLocation: addXcmVersionHeader(createOriginLocation(origin, destination), exports.Version.V4),
7169
- xcm: forwardedXcms[1][0],
7170
- node: destination,
7171
- origin: origin
7172
- });
7173
- case 9:
7174
- dryRunResult = _context2.sent;
7175
- if (dryRunResult.success) {
7176
- _context2.next = 18;
7294
+ throw new Error('Multiassets syntax is not supported for Evm transfers');
7295
+ case 10:
7296
+ if (!('multilocation' in currency && assets.isOverrideMultiLocationSpecifier(currency.multilocation))) {
7297
+ _context.next = 12;
7177
7298
  break;
7178
7299
  }
7179
- if (!disableFallback) {
7180
- _context2.next = 13;
7300
+ throw new Error('Override multilocation is not supported for Evm transfers');
7301
+ case 12:
7302
+ foundAsset = assets.findAsset(from, currency, to);
7303
+ if (!(foundAsset === null)) {
7304
+ _context.next = 15;
7181
7305
  break;
7182
7306
  }
7183
- return _context2.abrupt("return", {
7184
- dryRunError: dryRunResult.failureReason
7185
- });
7186
- case 13:
7187
- _context2.next = 15;
7188
- return calcPaymentInfoFee();
7307
+ throw new assets.InvalidCurrencyError("Origin node ".concat(from, " does not support currency ").concat(JSON.stringify(currency), "."));
7189
7308
  case 15:
7190
- _context2.t1 = _context2.sent;
7191
- _context2.t2 = dryRunResult.failureReason;
7192
- return _context2.abrupt("return", {
7193
- fee: _context2.t1,
7194
- feeType: 'paymentInfo',
7195
- dryRunError: _context2.t2
7196
- });
7197
- case 18:
7198
- fee = dryRunResult.fee, newForwardedXcms = dryRunResult.forwardedXcms, destParaId = dryRunResult.destParaId;
7199
- return _context2.abrupt("return", {
7200
- fee: fee,
7201
- feeType: 'dryRun',
7202
- forwardedXcms: newForwardedXcms,
7203
- destParaId: destParaId
7204
- });
7309
+ if (!(!assets.isForeignAsset(foundAsset) || !foundAsset.multiLocation)) {
7310
+ _context.next = 17;
7311
+ break;
7312
+ }
7313
+ throw new assets.InvalidCurrencyError('Currency must be a foreign asset with valid multi-location');
7314
+ case 17:
7315
+ ethAsset = assets.findAssetByMultiLocation(assets.getOtherAssets('Ethereum'), foundAsset.multiLocation);
7316
+ if (!(!ethAsset || !ethAsset.assetId)) {
7317
+ _context.next = 20;
7318
+ break;
7319
+ }
7320
+ throw new assets.InvalidCurrencyError("Could not obtain Ethereum asset address for ".concat(JSON.stringify(foundAsset)));
7205
7321
  case 20:
7206
- case "end":
7207
- return _context2.stop();
7208
- }
7209
- }, _callee2);
7210
- }));
7211
- return function getFeeForDestNode(_x) {
7212
- return _ref2.apply(this, arguments);
7213
- };
7214
- }();
7215
-
7216
- var getDryRun = /*#__PURE__*/function () {
7217
- var _ref = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee(options) {
7218
- var api, node, address;
7219
- return _regeneratorRuntime().wrap(function _callee$(_context) {
7220
- while (1) switch (_context.prev = _context.next) {
7221
- case 0:
7222
- api = options.api, node = options.node, address = options.address;
7223
- validateAddress(address, node, false);
7224
- _context.next = 4;
7225
- return api.init(node);
7226
- case 4:
7227
- _context.prev = 4;
7228
- _context.next = 7;
7229
- return api.getDryRunCall(options);
7230
- case 7:
7231
- return _context.abrupt("return", _context.sent);
7232
- case 8:
7233
- _context.prev = 8;
7234
- _context.next = 11;
7235
- return api.disconnect();
7236
- case 11:
7237
- return _context.finish(8);
7238
- case 12:
7322
+ contract = isEthersSigner(signer) ? new ethers.Contract(xcmInterfacePrecompile, abi, signer) : viem.getContract({
7323
+ abi: abi,
7324
+ address: xcmInterfacePrecompile,
7325
+ client: {
7326
+ "public": viem.createPublicClient({
7327
+ chain: signer.chain,
7328
+ transport: viem.http()
7329
+ }),
7330
+ wallet: signer
7331
+ }
7332
+ });
7333
+ if (!isEthersSigner(signer)) {
7334
+ _context.next = 27;
7335
+ break;
7336
+ }
7337
+ _context.next = 24;
7338
+ return signer.getAddress();
7339
+ case 24:
7340
+ _context.t0 = _context.sent;
7341
+ _context.next = 28;
7342
+ break;
7343
+ case 27:
7344
+ _context.t0 = (_signer$account = signer.account) === null || _signer$account === void 0 ? void 0 : _signer$account.address;
7345
+ case 28:
7346
+ senderAddress = _context.t0;
7347
+ if (senderAddress) {
7348
+ _context.next = 31;
7349
+ break;
7350
+ }
7351
+ throw new Error('Unable to get sender address');
7352
+ case 31:
7353
+ _context.next = 33;
7354
+ return api.init(from);
7355
+ case 33:
7356
+ _context.next = 35;
7357
+ return generateMessageId(api, senderAddress, getParaId(from), ethAsset.assetId, address, currency.amount);
7358
+ case 35:
7359
+ messageId = _context.sent;
7360
+ customXcm = createCustomXcmOnDest({
7361
+ api: api,
7362
+ address: address,
7363
+ scenario: 'ParaToPara',
7364
+ senderAddress: senderAddress,
7365
+ ahAddress: ahAddress,
7366
+ asset: _objectSpread2(_objectSpread2({}, foundAsset), {}, {
7367
+ amount: currency.amount
7368
+ })}, from, exports.Version.V4, messageId);
7369
+ _context.next = 39;
7370
+ return api.objectToHex(customXcm, 'XcmVersionedXcm');
7371
+ case 39:
7372
+ customXcmOnDest = _context.sent;
7373
+ _context.next = 42;
7374
+ return api.createApiForNode('AssetHubPolkadot');
7375
+ case 42:
7376
+ assetHubApi = _context.sent;
7377
+ _context.next = 45;
7378
+ return getParaEthTransferFees(assetHubApi);
7379
+ case 45:
7380
+ _yield$getParaEthTran = _context.sent;
7381
+ _yield$getParaEthTran2 = _slicedToArray(_yield$getParaEthTran, 2);
7382
+ bridgeFee = _yield$getParaEthTran2[0];
7383
+ executionFee = _yield$getParaEthTran2[1];
7384
+ transferFee = (bridgeFee + executionFee).toString(); // Partially inspired by Moonbeam XCM-SDK
7385
+ // https://github.com/moonbeam-foundation/xcm-sdk/blob/ab835c15bf41612604b1c858d956a9f07705ed65/packages/sdk/src/contract/contracts/Xtokens/Xtokens.ts#L53
7386
+ createTx = function createTx(func, args) {
7387
+ if (isEthersContract(contract)) {
7388
+ return contract[func].apply(contract, _toConsumableArray(args));
7389
+ }
7390
+ return contract.write[func](args);
7391
+ };
7392
+ numberToHex32 = function numberToHex32(num) {
7393
+ return typeof num !== 'number' || isNaN(num) ? function () {
7394
+ throw new Error('Input must be a valid number');
7395
+ }() : "0x".concat((num >>> 0).toString(16).padStart(8, '0'));
7396
+ }; // Execute the custom XCM message with the precompile
7397
+ _context.next = 54;
7398
+ return createTx(isEthersSigner(signer) ? 'transferAssetsUsingTypeAndThenAddress((uint8,bytes[]),(address,uint256)[],uint8,uint8,uint8,bytes)' : 'transferAssetsUsingTypeAndThenAddress', [
7399
+ // This represents (1,X1(Parachain(1000)))
7400
+ [1, ['0x00' + numberToHex32(getParaId('AssetHubPolkadot')).slice(2)]],
7401
+ // Assets including fee and the ERC20 asset, with fee be the first
7402
+ [[XCDOT, transferFee], [ethAsset.assetId, currency.amount.toString()]],
7403
+ // The TransferType corresponding to asset being sent, 2 represents `DestinationReserve`
7404
+ 2,
7405
+ // index for the fee
7406
+ 0,
7407
+ // The TransferType corresponding to fee asset
7408
+ 2, customXcmOnDest]);
7409
+ case 54:
7410
+ tx = _context.sent;
7411
+ return _context.abrupt("return", _typeof(tx) === 'object' ? tx.hash : tx);
7412
+ case 56:
7239
7413
  case "end":
7240
7414
  return _context.stop();
7241
7415
  }
7242
- }, _callee, null, [[4,, 8, 12]]);
7416
+ }, _callee);
7243
7417
  }));
7244
- return function getDryRun(_x) {
7245
- return _ref.apply(this, arguments);
7418
+ return function transferMoonbeamToEth(_x) {
7419
+ return _ref2.apply(this, arguments);
7246
7420
  };
7247
7421
  }();
7248
7422
 
@@ -7267,8 +7441,7 @@ var getFeeForOriginNode = /*#__PURE__*/function () {
7267
7441
  });
7268
7442
  case 6:
7269
7443
  _context.next = 8;
7270
- return getDryRun({
7271
- api: api,
7444
+ return api.getDryRunCall({
7272
7445
  tx: tx,
7273
7446
  node: origin,
7274
7447
  address: senderAddress
@@ -7407,7 +7580,7 @@ var getXcmFee = /*#__PURE__*/function () {
7407
7580
  destinationFeeType = 'paymentInfo';
7408
7581
  case 36:
7409
7582
  if (!(Array.isArray(forwardedXcms) && forwardedXcms.length > 0 && forwardedXcms[1].length > 0 && ('disconnect' in api.getApi() ? Object.values(forwardedXcms[1][0]).length : forwardedXcms[1][0].value.length) > 0 && nextParaId !== undefined)) {
7410
- _context.next = 69;
7583
+ _context.next = 68;
7411
7584
  break;
7412
7585
  }
7413
7586
  nextChain = getTNode(nextParaId, determineRelayChain(origin) === 'Polkadot' ? 'polkadot' : 'kusama');
@@ -7478,7 +7651,7 @@ var getXcmFee = /*#__PURE__*/function () {
7478
7651
  destinationFee = destFallback.fee;
7479
7652
  destinationFeeType = destFallback.feeType; // paymentInfo
7480
7653
  case 57:
7481
- return _context.abrupt("break", 69);
7654
+ return _context.abrupt("break", 68);
7482
7655
  case 58:
7483
7656
  if (nextChain === destination || sdkCommon.isRelayChain(nextChain) && !sdkCommon.isRelayChain(destination)) {
7484
7657
  destinationFee = hopResult.fee;
@@ -7501,15 +7674,14 @@ var getXcmFee = /*#__PURE__*/function () {
7501
7674
  currentOrigin = nextChain;
7502
7675
  case 62:
7503
7676
  _context.prev = 62;
7504
- hopApi.setDisconnectAllowed(true);
7505
- _context.next = 66;
7677
+ _context.next = 65;
7506
7678
  return hopApi.disconnect();
7507
- case 66:
7679
+ case 65:
7508
7680
  return _context.finish(62);
7509
- case 67:
7681
+ case 66:
7510
7682
  _context.next = 36;
7511
7683
  break;
7512
- case 69:
7684
+ case 68:
7513
7685
  return _context.abrupt("return", _objectSpread2(_objectSpread2({
7514
7686
  origin: _objectSpread2(_objectSpread2(_objectSpread2({}, originFee && {
7515
7687
  fee: originFee
@@ -7531,11 +7703,11 @@ var getXcmFee = /*#__PURE__*/function () {
7531
7703
  dryRunError: destinationDryRunError
7532
7704
  })
7533
7705
  }));
7534
- case 70:
7706
+ case 69:
7535
7707
  case "end":
7536
7708
  return _context.stop();
7537
7709
  }
7538
- }, _callee, null, [[17,, 25, 30], [41,, 62, 67]]);
7710
+ }, _callee, null, [[17,, 25, 30], [41,, 62, 66]]);
7539
7711
  }));
7540
7712
  return function getXcmFee(_x) {
7541
7713
  return _ref2.apply(this, arguments);
@@ -7609,7 +7781,7 @@ var getXcmFeeEstimate = /*#__PURE__*/function () {
7609
7781
  symbol: originAsset.symbol
7610
7782
  };
7611
7783
  _context.next = 20;
7612
- return Builder(destApi).from(destination).to(origin).address(senderAddress, address).currency(_objectSpread2(_objectSpread2({}, currencyInput), {}, {
7784
+ return Builder(destApi).from(destination).to(origin).address(senderAddress).senderAddress(address).currency(_objectSpread2(_objectSpread2({}, currencyInput), {}, {
7613
7785
  amount: currency.amount
7614
7786
  })).build();
7615
7787
  case 20:
@@ -7722,7 +7894,7 @@ var validateDestination = function validateDestination(origin, destination) {
7722
7894
  if (sdkCommon.isRelayChain(origin) && !sdkCommon.isTMultiLocation(destination) && sdkCommon.isRelayChain(destination) && origin !== destination) {
7723
7895
  throw new IncompatibleNodesError('Direct relay chain to relay chain transfers are not supported. Please use Polkadot <-> Kusama bridge through AssetHub.');
7724
7896
  }
7725
- if (destination === 'Ethereum' && origin !== 'AssetHubPolkadot' && origin !== 'Hydration' && origin !== 'BifrostPolkadot') {
7897
+ if (destination === 'Ethereum' && origin !== 'AssetHubPolkadot' && origin !== 'Hydration' && origin !== 'BifrostPolkadot' && origin !== 'Moonbeam') {
7726
7898
  throw new IncompatibleNodesError('Transfers to Ethereum are only supported from AssetHubPolkadot and Hydration.');
7727
7899
  }
7728
7900
  var isMultiLocationDestination = _typeof(destination) === 'object';
@@ -7848,11 +8020,11 @@ var validateDestinationAddress = function validateDestinationAddress(address, de
7848
8020
 
7849
8021
  var send = /*#__PURE__*/function () {
7850
8022
  var _ref = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee(options) {
7851
- var api, origin, currency, feeAsset, address, destination, paraIdTo, version, senderAddress, pallet, method, isBridge, assetCheckEnabled, asset, resolvedFeeAsset, isLocalTransfer, overriddenAsset, resolvedAsset, originNode;
8023
+ var api, origin, currency, feeAsset, address, destination, paraIdTo, version, senderAddress, ahAddress, pallet, method, isBridge, assetCheckEnabled, asset, resolvedFeeAsset, isLocalTransfer, overriddenAsset, resolvedAsset, originNode;
7852
8024
  return _regeneratorRuntime().wrap(function _callee$(_context) {
7853
8025
  while (1) switch (_context.prev = _context.next) {
7854
8026
  case 0:
7855
- 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;
8027
+ 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, ahAddress = options.ahAddress, pallet = options.pallet, method = options.method;
7856
8028
  validateCurrency(currency, feeAsset);
7857
8029
  validateDestination(origin, destination);
7858
8030
  validateDestinationAddress(address, destination);
@@ -7939,6 +8111,7 @@ var send = /*#__PURE__*/function () {
7939
8111
  overriddenAsset: overriddenAsset,
7940
8112
  version: version,
7941
8113
  senderAddress: senderAddress,
8114
+ ahAddress: ahAddress,
7942
8115
  pallet: pallet,
7943
8116
  method: method
7944
8117
  }));
@@ -8092,14 +8265,44 @@ var GeneralBuilder = /*#__PURE__*/function () {
8092
8265
  currency: _currency
8093
8266
  }));
8094
8267
  }
8268
+ /**
8269
+ * Sets the recipient address.
8270
+ *
8271
+ * @param address - The destination address.
8272
+ * @returns An instance of Builder
8273
+ */
8095
8274
  }, {
8096
8275
  key: "address",
8097
- value: function address(_address, senderAddress) {
8276
+ value: function address(_address) {
8098
8277
  return new GeneralBuilder(this.api, this.batchManager, _objectSpread2(_objectSpread2({}, this._options), {}, {
8099
8278
  address: _address
8100
- }, senderAddress ? {
8101
- senderAddress: senderAddress
8102
- } : {}));
8279
+ }));
8280
+ }
8281
+ /**
8282
+ * Sets the sender address.
8283
+ *
8284
+ * @param address - The sender address.
8285
+ * @returns
8286
+ */
8287
+ }, {
8288
+ key: "senderAddress",
8289
+ value: function senderAddress(address) {
8290
+ return new GeneralBuilder(this.api, this.batchManager, _objectSpread2(_objectSpread2({}, this._options), {}, {
8291
+ senderAddress: address
8292
+ }));
8293
+ }
8294
+ /**
8295
+ * Sets the asset hub address. This is used for transfers that go through the Asset Hub and originate from an EVM chain.
8296
+ *
8297
+ * @param address - The address to be used.
8298
+ * @returns An instance of Builder
8299
+ */
8300
+ }, {
8301
+ key: "ahAddress",
8302
+ value: function ahAddress(address) {
8303
+ return new GeneralBuilder(this.api, this.batchManager, _objectSpread2(_objectSpread2({}, this._options), {}, {
8304
+ ahAddress: address
8305
+ }));
8103
8306
  }
8104
8307
  /**
8105
8308
  * Sets the XCM version to be used for the transfer.
@@ -8225,33 +8428,53 @@ var GeneralBuilder = /*#__PURE__*/function () {
8225
8428
  }, {
8226
8429
  key: "dryRun",
8227
8430
  value: function () {
8228
- var _dryRun = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee3(senderAddress) {
8229
- var tx;
8431
+ var _dryRun2 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee3() {
8432
+ var _this$_options2, to, address, senderAddress, tx;
8230
8433
  return _regeneratorRuntime().wrap(function _callee3$(_context3) {
8231
8434
  while (1) switch (_context3.prev = _context3.next) {
8232
8435
  case 0:
8233
- this.api.setDisconnectAllowed(false);
8436
+ _this$_options2 = this._options, to = _this$_options2.to, address = _this$_options2.address, senderAddress = _this$_options2.senderAddress;
8234
8437
  _context3.next = 3;
8235
8438
  return this.build();
8236
8439
  case 3:
8237
8440
  tx = _context3.sent;
8238
- this.api.setDisconnectAllowed(true);
8239
- return _context3.abrupt("return", getDryRun({
8441
+ if (!sdkCommon.isTMultiLocation(to)) {
8442
+ _context3.next = 6;
8443
+ break;
8444
+ }
8445
+ throw new InvalidParameterError('Multi-Location destination is not supported for XCM fee calculation.');
8446
+ case 6:
8447
+ if (!sdkCommon.isTMultiLocation(address)) {
8448
+ _context3.next = 8;
8449
+ break;
8450
+ }
8451
+ throw new InvalidParameterError('Multi-Location address is not supported for XCM fee calculation.');
8452
+ case 8:
8453
+ if (!(to === 'Ethereum')) {
8454
+ _context3.next = 10;
8455
+ break;
8456
+ }
8457
+ throw new InvalidParameterError('Ethereum destination is not yet supported for XCM fee calculation.');
8458
+ case 10:
8459
+ return _context3.abrupt("return", dryRun({
8240
8460
  api: this.api,
8241
8461
  tx: tx,
8242
8462
  address: senderAddress,
8243
- node: this._options.from
8463
+ origin: this._options.from,
8464
+ destination: to,
8465
+ currency: this._options.currency,
8466
+ senderAddress: this._options.senderAddress
8244
8467
  }));
8245
- case 6:
8468
+ case 11:
8246
8469
  case "end":
8247
8470
  return _context3.stop();
8248
8471
  }
8249
8472
  }, _callee3, this);
8250
8473
  }));
8251
- function dryRun(_x2) {
8252
- return _dryRun.apply(this, arguments);
8474
+ function dryRun$1() {
8475
+ return _dryRun2.apply(this, arguments);
8253
8476
  }
8254
- return dryRun;
8477
+ return dryRun$1;
8255
8478
  }()
8256
8479
  /**
8257
8480
  * Estimates the XCM fee for the transfer using paymentInfo function.
@@ -8262,11 +8485,11 @@ var GeneralBuilder = /*#__PURE__*/function () {
8262
8485
  key: "getXcmFeeEstimate",
8263
8486
  value: (function () {
8264
8487
  var _getXcmFeeEstimate2 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee4() {
8265
- var _this$_options2, from, to, address, senderAddress, tx;
8488
+ var _this$_options3, from, to, address, senderAddress, tx;
8266
8489
  return _regeneratorRuntime().wrap(function _callee4$(_context4) {
8267
8490
  while (1) switch (_context4.prev = _context4.next) {
8268
8491
  case 0:
8269
- _this$_options2 = this._options, from = _this$_options2.from, to = _this$_options2.to, address = _this$_options2.address, senderAddress = _this$_options2.senderAddress;
8492
+ _this$_options3 = this._options, from = _this$_options3.from, to = _this$_options3.to, address = _this$_options3.address, senderAddress = _this$_options3.senderAddress;
8270
8493
  if (!sdkCommon.isTMultiLocation(to)) {
8271
8494
  _context4.next = 3;
8272
8495
  break;
@@ -8291,7 +8514,9 @@ var GeneralBuilder = /*#__PURE__*/function () {
8291
8514
  case 10:
8292
8515
  tx = _context4.sent;
8293
8516
  this.api.setDisconnectAllowed(true);
8294
- return _context4.abrupt("return", getXcmFeeEstimate({
8517
+ _context4.prev = 12;
8518
+ _context4.next = 15;
8519
+ return getXcmFeeEstimate({
8295
8520
  api: this.api,
8296
8521
  tx: tx,
8297
8522
  origin: from,
@@ -8299,12 +8524,20 @@ var GeneralBuilder = /*#__PURE__*/function () {
8299
8524
  address: address,
8300
8525
  senderAddress: senderAddress,
8301
8526
  currency: this._options.currency
8302
- }));
8303
- case 13:
8527
+ });
8528
+ case 15:
8529
+ return _context4.abrupt("return", _context4.sent);
8530
+ case 16:
8531
+ _context4.prev = 16;
8532
+ _context4.next = 19;
8533
+ return this.api.disconnect();
8534
+ case 19:
8535
+ return _context4.finish(16);
8536
+ case 20:
8304
8537
  case "end":
8305
8538
  return _context4.stop();
8306
8539
  }
8307
- }, _callee4, this);
8540
+ }, _callee4, this, [[12,, 16, 20]]);
8308
8541
  }));
8309
8542
  function getXcmFeeEstimate$1() {
8310
8543
  return _getXcmFeeEstimate2.apply(this, arguments);
@@ -8323,7 +8556,7 @@ var GeneralBuilder = /*#__PURE__*/function () {
8323
8556
  var _getXcmFee2 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee5() {
8324
8557
  var _ref,
8325
8558
  disableFallback,
8326
- _this$_options3,
8559
+ _this$_options4,
8327
8560
  from,
8328
8561
  to,
8329
8562
  address,
@@ -8336,7 +8569,7 @@ var GeneralBuilder = /*#__PURE__*/function () {
8336
8569
  _ref = _args5.length > 0 && _args5[0] !== undefined ? _args5[0] : {
8337
8570
  disableFallback: false
8338
8571
  }, disableFallback = _ref.disableFallback;
8339
- _this$_options3 = this._options, from = _this$_options3.from, to = _this$_options3.to, address = _this$_options3.address, senderAddress = _this$_options3.senderAddress;
8572
+ _this$_options4 = this._options, from = _this$_options4.from, to = _this$_options4.to, address = _this$_options4.address, senderAddress = _this$_options4.senderAddress;
8340
8573
  if (!sdkCommon.isTMultiLocation(to)) {
8341
8574
  _context5.next = 4;
8342
8575
  break;
@@ -8359,8 +8592,9 @@ var GeneralBuilder = /*#__PURE__*/function () {
8359
8592
  return this.build();
8360
8593
  case 10:
8361
8594
  tx = _context5.sent;
8362
- this.api.setDisconnectAllowed(false);
8363
- return _context5.abrupt("return", getXcmFee({
8595
+ _context5.prev = 11;
8596
+ _context5.next = 14;
8597
+ return getXcmFee({
8364
8598
  api: this.api,
8365
8599
  tx: tx,
8366
8600
  origin: from,
@@ -8369,12 +8603,20 @@ var GeneralBuilder = /*#__PURE__*/function () {
8369
8603
  address: address,
8370
8604
  currency: this._options.currency,
8371
8605
  disableFallback: disableFallback
8372
- }));
8373
- case 13:
8606
+ });
8607
+ case 14:
8608
+ return _context5.abrupt("return", _context5.sent);
8609
+ case 15:
8610
+ _context5.prev = 15;
8611
+ _context5.next = 18;
8612
+ return this.api.disconnect();
8613
+ case 18:
8614
+ return _context5.finish(15);
8615
+ case 19:
8374
8616
  case "end":
8375
8617
  return _context5.stop();
8376
8618
  }
8377
- }, _callee5, this);
8619
+ }, _callee5, this, [[11,, 15, 19]]);
8378
8620
  }));
8379
8621
  function getXcmFee$1() {
8380
8622
  return _getXcmFee2.apply(this, arguments);
@@ -8775,7 +9017,7 @@ var getOriginFeeDetailsInternal = /*#__PURE__*/function () {
8775
9017
  return api.init(origin);
8776
9018
  case 3:
8777
9019
  _context.next = 5;
8778
- return Builder(api).from(origin).to(destination).currency(currency).address(accountDestination, account).build();
9020
+ return Builder(api).from(origin).to(destination).currency(currency).address(accountDestination).senderAddress(account).build();
8779
9021
  case 5:
8780
9022
  tx = _context.sent;
8781
9023
  _context.next = 8;
@@ -9191,6 +9433,8 @@ exports.createBeneficiaryMultiLocation = createBeneficiaryMultiLocation;
9191
9433
  exports.createVersionedBeneficiary = createVersionedBeneficiary;
9192
9434
  exports.createX1Payload = createX1Payload;
9193
9435
  exports.determineRelayChain = determineRelayChain;
9436
+ exports.dryRun = dryRun;
9437
+ exports.dryRunOrigin = dryRunOrigin;
9194
9438
  exports.generateAddressMultiLocationV4 = generateAddressMultiLocationV4;
9195
9439
  exports.getAssetBalance = getAssetBalance;
9196
9440
  exports.getAssetBalanceInternal = getAssetBalanceInternal;
@@ -9199,7 +9443,6 @@ exports.getBalanceForeignInternal = getBalanceForeignInternal;
9199
9443
  exports.getBalanceNative = getBalanceNative;
9200
9444
  exports.getBalanceNativeInternal = getBalanceNativeInternal;
9201
9445
  exports.getBridgeStatus = getBridgeStatus;
9202
- exports.getDryRun = getDryRun;
9203
9446
  exports.getFees = getFees;
9204
9447
  exports.getMaxForeignTransferableAmount = getMaxForeignTransferableAmount;
9205
9448
  exports.getMaxNativeTransferableAmount = getMaxNativeTransferableAmount;