@paraspell/sdk-core 10.11.7 → 10.11.9

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
@@ -3526,16 +3526,16 @@ var ERC20_ABI$1 = [{
3526
3526
  }]
3527
3527
  }];
3528
3528
  var getMoonbeamErc20Balance = /*#__PURE__*/function () {
3529
- var _ref = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee(node, assetId, address) {
3529
+ var _ref = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee(chain, assetId, address) {
3530
3530
  var client, tokenAddress;
3531
3531
  return _regenerator().w(function (_context) {
3532
3532
  while (1) switch (_context.n) {
3533
3533
  case 0:
3534
3534
  client = viem.createPublicClient({
3535
- chain: node === 'Moonbeam' ? chains.moonbeam : chains.moonriver,
3536
- transport: viem.http()
3535
+ chain: chain === 'Moonbeam' ? chains.moonbeam : chains.moonriver,
3536
+ transport: viem.http(chain === 'Moonbeam' ? 'https://rpc.api.moonbeam.network/' : 'https://rpc.api.moonriver.moonbeam.network')
3537
3537
  });
3538
- tokenAddress = formatAssetIdToERC20(assetId);
3538
+ tokenAddress = assetId.startsWith('0x') ? assetId : formatAssetIdToERC20(assetId);
3539
3539
  _context.n = 1;
3540
3540
  return client.readContract({
3541
3541
  address: tokenAddress,
@@ -8031,20 +8031,20 @@ var ParachainNode = /*#__PURE__*/function () {
8031
8031
  }
8032
8032
  }, {
8033
8033
  key: "canUseXTokens",
8034
- value: function canUseXTokens(_ref) {
8035
- var asset = _ref.asset;
8034
+ value: function canUseXTokens(options) {
8035
+ var asset = options.asset;
8036
8036
  var isEthAsset = asset.multiLocation && assets.findAssetByMultiLocation(assets.getOtherAssets('Ethereum'), asset.multiLocation);
8037
- return !isEthAsset;
8037
+ return !isEthAsset && !this.shouldUseNativeAssetTeleport(options);
8038
8038
  }
8039
8039
  }, {
8040
8040
  key: "transfer",
8041
8041
  value: function () {
8042
- var _transfer = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee(options) {
8043
- var api, asset, currency, feeAsset, feeCurrency, address, destination, paraIdTo, overriddenAsset, version, senderAddress, ahAddress, pallet, method, scenario, paraId, isLocalTransfer, isBifrostOrigin, isJamtonOrigin, isAssetHubDest, shouldUseMultiasset, input, _options, isEthAsset, isAHPOrigin, isAHPDest, isEthDest, isEthAssetViaAh, isEthAssetToAh, call;
8042
+ var _transfer = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee(sendOptions) {
8043
+ var api, asset, currency, feeAsset, feeCurrency, address, destination, paraIdTo, overriddenAsset, version, senderAddress, ahAddress, pallet, method, scenario, paraId, isLocalTransfer, isBifrostOrigin, isJamtonOrigin, isAssetHubDest, shouldUseMultiasset, input, options, shouldUseTeleport, isAHPOrigin, isAHPDest, isEthAsset, isEthDest, isEthAssetViaAh, isEthAssetToAh, call;
8044
8044
  return _regenerator().w(function (_context) {
8045
8045
  while (1) switch (_context.n) {
8046
8046
  case 0:
8047
- api = options.api, asset = options.asset, currency = options.currency, feeAsset = options.feeAsset, feeCurrency = options.feeCurrency, 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;
8047
+ api = sendOptions.api, asset = sendOptions.asset, currency = sendOptions.currency, feeAsset = sendOptions.feeAsset, feeCurrency = sendOptions.feeCurrency, address = sendOptions.address, destination = sendOptions.to, paraIdTo = sendOptions.paraIdTo, overriddenAsset = sendOptions.overriddenAsset, version = sendOptions.version, senderAddress = sendOptions.senderAddress, ahAddress = sendOptions.ahAddress, pallet = sendOptions.pallet, method = sendOptions.method;
8048
8048
  scenario = resolveScenario(this.node, destination);
8049
8049
  paraId = resolveParaId(paraIdTo, destination);
8050
8050
  if (!(destination === 'Polimec' && this.node !== 'AssetHubPolkadot' && this.node !== 'Hydration' && this.node !== destination)) {
@@ -8058,9 +8058,9 @@ var ParachainNode = /*#__PURE__*/function () {
8058
8058
  _context.n = 2;
8059
8059
  break;
8060
8060
  }
8061
- return _context.a(2, this.transferLocal(options));
8061
+ return _context.a(2, this.transferLocal(sendOptions));
8062
8062
  case 2:
8063
- if (!(supportsXTokens(this) && this.canUseXTokens(options))) {
8063
+ if (!(supportsXTokens(this) && this.canUseXTokens(sendOptions))) {
8064
8064
  _context.n = 4;
8065
8065
  break;
8066
8066
  }
@@ -8106,10 +8106,10 @@ var ParachainNode = /*#__PURE__*/function () {
8106
8106
  }));
8107
8107
  case 5:
8108
8108
  if (!supportsPolkadotXCM(this)) {
8109
- _context.n = 8;
8109
+ _context.n = 9;
8110
8110
  break;
8111
8111
  }
8112
- _options = {
8112
+ options = {
8113
8113
  api: api,
8114
8114
  destLocation: createDestination(version, this.node, destination, paraId),
8115
8115
  beneficiaryLocation: createBeneficiaryLocation({
@@ -8132,27 +8132,34 @@ var ParachainNode = /*#__PURE__*/function () {
8132
8132
  ahAddress: ahAddress,
8133
8133
  pallet: pallet,
8134
8134
  method: method
8135
- }; // Handle common cases
8135
+ };
8136
+ shouldUseTeleport = this.shouldUseNativeAssetTeleport(sendOptions);
8137
+ if (!shouldUseTeleport) {
8138
+ _context.n = 6;
8139
+ break;
8140
+ }
8141
+ throw new TransferToAhNotSupported('Native asset transfers to or from AssetHub are temporarily disabled');
8142
+ case 6:
8143
+ isAHPOrigin = this.node.includes('AssetHub');
8144
+ isAHPDest = !sdkCommon.isTMultiLocation(destination) && destination.includes('AssetHub'); // Handle common cases
8136
8145
  isEthAsset = asset.multiLocation && assets.findAssetByMultiLocation(assets.getOtherAssets('Ethereum'), asset.multiLocation);
8137
- isAHPOrigin = this.node === 'AssetHubPolkadot' || this.node === 'AssetHubKusama';
8138
- isAHPDest = destination === 'AssetHubPolkadot' || destination === 'AssetHubKusama';
8139
8146
  isEthDest = destination === 'Ethereum'; // Eth asset - Any origin to any dest via AH - DestinationReserve - multiple instructions
8140
8147
  isEthAssetViaAh = isEthAsset && !isAHPOrigin && !isAHPDest && !isEthDest && !feeAsset; // Eth asset - Any origin to AHP - DestinationReserve - one DepositAsset instruction
8141
8148
  isEthAssetToAh = isEthAsset && isAHPDest && !isAHPOrigin && !isEthDest && !feeAsset;
8142
8149
  if (!(isEthAssetViaAh || isEthAssetToAh)) {
8143
- _context.n = 7;
8150
+ _context.n = 8;
8144
8151
  break;
8145
8152
  }
8146
- _context.n = 6;
8147
- return createTypeAndThenCall(this.node, _options);
8148
- case 6:
8153
+ _context.n = 7;
8154
+ return createTypeAndThenCall(this.node, options);
8155
+ case 7:
8149
8156
  call = _context.v;
8150
8157
  return _context.a(2, api.callTxMethod(call));
8151
- case 7:
8152
- return _context.a(2, this.transferPolkadotXCM(_options));
8153
8158
  case 8:
8154
- throw new NoXCMSupportImplementedError(this._node);
8159
+ return _context.a(2, this.transferPolkadotXCM(options));
8155
8160
  case 9:
8161
+ throw new NoXCMSupportImplementedError(this._node);
8162
+ case 10:
8156
8163
  return _context.a(2);
8157
8164
  }
8158
8165
  }, _callee, this);
@@ -8162,6 +8169,21 @@ var ParachainNode = /*#__PURE__*/function () {
8162
8169
  }
8163
8170
  return transfer;
8164
8171
  }()
8172
+ }, {
8173
+ key: "shouldUseNativeAssetTeleport",
8174
+ value: function shouldUseNativeAssetTeleport(_ref) {
8175
+ var asset = _ref.asset,
8176
+ to = _ref.to;
8177
+ if (sdkCommon.isTMultiLocation(to) || sdkCommon.isDotKsmBridge(this.node, to) || to === 'Ethereum') return false;
8178
+ var isAHPOrigin = this.node.includes('AssetHub');
8179
+ var isAHPDest = !sdkCommon.isTMultiLocation(to) && to.includes('AssetHub');
8180
+ var isNativeAsset = !sdkCommon.isTMultiLocation(to) && (isAHPOrigin && assets.isForeignAsset(asset) && assets.isSymbolMatch(asset.symbol, assets.getNativeAssetSymbol(to)) || isAHPDest && !assets.isForeignAsset(asset) && assets.isSymbolMatch(asset.symbol, assets.getNativeAssetSymbol(this.node)));
8181
+ var assetHubChain = "AssetHub".concat(getRelayChainOf(this.node));
8182
+ var isRegisteredOnAh = asset.multiLocation && assets.findAsset(assetHubChain, {
8183
+ multilocation: asset.multiLocation
8184
+ }, null);
8185
+ return isNativeAsset && Boolean(isRegisteredOnAh) && (isAHPOrigin || isAHPDest);
8186
+ }
8165
8187
  }, {
8166
8188
  key: "getRelayToParaOverrides",
8167
8189
  value: function getRelayToParaOverrides() {
@@ -10122,24 +10144,46 @@ var Hydration = /*#__PURE__*/function (_ParachainNode) {
10122
10144
  }
10123
10145
  return transferPolkadotXCM;
10124
10146
  }()
10147
+ }, {
10148
+ key: "transferMoonbeamWhAsset",
10149
+ value: function transferMoonbeamWhAsset(input) {
10150
+ var asset = input.asset,
10151
+ version = input.version;
10152
+ assertHasLocation(asset);
10153
+ var glmr = assets.findAssetForNodeOrThrow(this.node, {
10154
+ symbol: assets.getNativeAssetSymbol('Moonbeam')
10155
+ }, null);
10156
+ var FEE_AMOUNT = 80000000000000000n; // 0.08 GLMR
10157
+ assertHasLocation(glmr);
10158
+ return transferXTokens(_objectSpread2(_objectSpread2({}, input), {}, {
10159
+ overriddenAsset: [_objectSpread2(_objectSpread2({}, createMultiAsset(version, FEE_AMOUNT, glmr.multiLocation)), {}, {
10160
+ isFeeAsset: true
10161
+ }), createMultiAsset(version, asset.amount, asset.multiLocation)]
10162
+ }), Number(asset.assetId));
10163
+ }
10125
10164
  }, {
10126
10165
  key: "transferXTokens",
10127
10166
  value: function transferXTokens$1(input) {
10128
- var asset = input.asset;
10167
+ var asset = input.asset,
10168
+ destination = input.destination;
10129
10169
  if (asset.symbol === this.getNativeAssetSymbol()) {
10130
10170
  return transferXTokens(input, Hydration.NATIVE_ASSET_ID);
10131
10171
  }
10172
+ var isMoonbeamWhAsset = asset.multiLocation && sdkCommon.hasJunction(asset.multiLocation, 'Parachain', getParaId('Moonbeam')) && sdkCommon.hasJunction(asset.multiLocation, 'PalletInstance', 110);
10173
+ if (isMoonbeamWhAsset && destination === 'Moonbeam') {
10174
+ return this.transferMoonbeamWhAsset(input);
10175
+ }
10132
10176
  assertHasId(asset);
10133
10177
  return transferXTokens(input, Number(asset.assetId));
10134
10178
  }
10135
10179
  }, {
10136
10180
  key: "canUseXTokens",
10137
- value: function canUseXTokens(_ref3) {
10138
- var destination = _ref3.to,
10139
- asset = _ref3.asset,
10140
- feeAsset = _ref3.feeAsset;
10141
- var isEthAsset = asset.multiLocation && assets.findAssetByMultiLocation(assets.getOtherAssets('Ethereum'), asset.multiLocation);
10142
- return destination !== 'Ethereum' && destination !== 'Polimec' && !(destination === 'AssetHubPolkadot' && asset.symbol === 'DOT') && !isEthAsset && !feeAsset;
10181
+ value: function canUseXTokens(options) {
10182
+ var destination = options.to,
10183
+ asset = options.asset,
10184
+ feeAsset = options.feeAsset;
10185
+ var baseCanUseXTokens = _superPropGet(Hydration, "canUseXTokens", this, 3)([options]);
10186
+ return destination !== 'Ethereum' && destination !== 'Polimec' && !(destination === 'AssetHubPolkadot' && asset.symbol === 'DOT') && baseCanUseXTokens && !feeAsset;
10143
10187
  }
10144
10188
  }, {
10145
10189
  key: "transferLocalNativeAsset",
package/dist/index.d.ts CHANGED
@@ -1387,8 +1387,9 @@ declare abstract class ParachainNode<TApi, TRes> {
1387
1387
  get type(): TEcosystemType;
1388
1388
  get node(): TNodePolkadotKusama;
1389
1389
  get version(): Version;
1390
- protected canUseXTokens({ asset }: TSendInternalOptions<TApi, TRes>): boolean;
1391
- transfer(options: TSendInternalOptions<TApi, TRes>): Promise<TRes>;
1390
+ canUseXTokens(options: TSendInternalOptions<TApi, TRes>): boolean;
1391
+ transfer(sendOptions: TSendInternalOptions<TApi, TRes>): Promise<TRes>;
1392
+ shouldUseNativeAssetTeleport({ asset, to }: TSendInternalOptions<TApi, TRes>): boolean;
1392
1393
  getRelayToParaOverrides(): TRelayToParaOverrides;
1393
1394
  transferRelayToPara(options: TRelayToParaOptions<TApi, TRes>): TSerializedApiCall;
1394
1395
  createCurrencySpec(amount: bigint, scenario: TScenario, version: Version, _asset?: TAsset, _isOverridenAsset?: boolean): TMultiAsset;
@@ -1411,7 +1412,7 @@ declare class Ajuna<TApi, TRes> extends ParachainNode<TApi, TRes> implements IXT
1411
1412
  constructor(chain?: TNodePolkadotKusama, info?: string, type?: TEcosystemType, version?: Version);
1412
1413
  transferXTokens<TApi, TRes>(input: TXTokensTransferOptions<TApi, TRes>): TRes;
1413
1414
  transferPolkadotXCM<TApi, TRes>(input: TPolkadotXCMTransferOptions<TApi, TRes>): Promise<TRes>;
1414
- protected canUseXTokens({ asset, to: destination }: TSendInternalOptions<TApi, TRes>): boolean;
1415
+ canUseXTokens({ asset, to: destination }: TSendInternalOptions<TApi, TRes>): boolean;
1415
1416
  transferRelayToPara(): TSerializedApiCall;
1416
1417
  transferLocalNonNativeAsset(options: TTransferLocalOptions<TApi, TRes>): TRes;
1417
1418
  }
@@ -1466,7 +1467,7 @@ declare class Astar<TApi, TRes> extends ParachainNode<TApi, TRes> implements IPo
1466
1467
  constructor();
1467
1468
  transferPolkadotXCM<TApi, TRes>(input: TPolkadotXCMTransferOptions<TApi, TRes>): Promise<TRes>;
1468
1469
  transferXTokens<TApi, TRes>(input: TXTokensTransferOptions<TApi, TRes>): TRes;
1469
- protected canUseXTokens({ asset }: TSendInternalOptions<TApi, TRes>): boolean;
1470
+ canUseXTokens({ asset }: TSendInternalOptions<TApi, TRes>): boolean;
1470
1471
  transferLocalNonNativeAsset(options: TTransferLocalOptions<TApi, TRes>): TRes;
1471
1472
  }
1472
1473
 
@@ -1531,7 +1532,7 @@ declare class BifrostPolkadot<TApi, TRes> extends ParachainNode<TApi, TRes> impl
1531
1532
  transferXTokens<TApi, TRes>(input: TXTokensTransferOptions<TApi, TRes>): TRes;
1532
1533
  transferToAssetHub<TApi, TRes>(input: TPolkadotXCMTransferOptions<TApi, TRes>): Promise<TRes>;
1533
1534
  transferPolkadotXCM<TApi, TRes>(input: TPolkadotXCMTransferOptions<TApi, TRes>): Promise<TRes>;
1534
- protected canUseXTokens({ asset, to: destination }: TSendInternalOptions<TApi, TRes>): boolean;
1535
+ canUseXTokens({ asset, to: destination }: TSendInternalOptions<TApi, TRes>): boolean;
1535
1536
  transferLocalNonNativeAsset(options: TTransferLocalOptions<TApi, TRes>): TRes;
1536
1537
  }
1537
1538
 
@@ -1666,8 +1667,9 @@ declare class Hydration<TApi, TRes> extends ParachainNode<TApi, TRes> implements
1666
1667
  transferToAssetHub<TApi, TRes>(input: TPolkadotXCMTransferOptions<TApi, TRes>): TRes;
1667
1668
  transferToPolimec<TApi, TRes>(options: TPolkadotXCMTransferOptions<TApi, TRes>): Promise<TRes>;
1668
1669
  transferPolkadotXCM<TApi, TRes>(input: TPolkadotXCMTransferOptions<TApi, TRes>): Promise<TRes>;
1670
+ transferMoonbeamWhAsset<TApi, TRes>(input: TXTokensTransferOptions<TApi, TRes>): TRes;
1669
1671
  transferXTokens<TApi, TRes>(input: TXTokensTransferOptions<TApi, TRes>): TRes;
1670
- protected canUseXTokens({ to: destination, asset, feeAsset }: TSendInternalOptions<TApi, TRes>): boolean;
1672
+ canUseXTokens(options: TSendInternalOptions<TApi, TRes>): boolean;
1671
1673
  transferLocalNativeAsset(options: TTransferLocalOptions<TApi, TRes>): TRes;
1672
1674
  transferLocalNonNativeAsset(options: TTransferLocalOptions<TApi, TRes>): TRes;
1673
1675
  }
@@ -1862,7 +1864,7 @@ declare class Shiden<TApi, TRes> extends ParachainNode<TApi, TRes> implements IP
1862
1864
  constructor();
1863
1865
  transferPolkadotXCM<TApi, TRes>(input: TPolkadotXCMTransferOptions<TApi, TRes>): Promise<TRes>;
1864
1866
  transferXTokens<TApi, TRes>(input: TXTokensTransferOptions<TApi, TRes>): TRes;
1865
- protected canUseXTokens({ asset }: TSendInternalOptions<TApi, TRes>): boolean;
1867
+ canUseXTokens({ asset }: TSendInternalOptions<TApi, TRes>): boolean;
1866
1868
  transferLocalNonNativeAsset(options: TTransferLocalOptions<TApi, TRes>): TRes;
1867
1869
  }
1868
1870
 
package/dist/index.mjs CHANGED
@@ -3527,16 +3527,16 @@ var ERC20_ABI$1 = [{
3527
3527
  }]
3528
3528
  }];
3529
3529
  var getMoonbeamErc20Balance = /*#__PURE__*/function () {
3530
- var _ref = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee(node, assetId, address) {
3530
+ var _ref = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee(chain, assetId, address) {
3531
3531
  var client, tokenAddress;
3532
3532
  return _regenerator().w(function (_context) {
3533
3533
  while (1) switch (_context.n) {
3534
3534
  case 0:
3535
3535
  client = createPublicClient({
3536
- chain: node === 'Moonbeam' ? moonbeam : moonriver,
3537
- transport: http()
3536
+ chain: chain === 'Moonbeam' ? moonbeam : moonriver,
3537
+ transport: http(chain === 'Moonbeam' ? 'https://rpc.api.moonbeam.network/' : 'https://rpc.api.moonriver.moonbeam.network')
3538
3538
  });
3539
- tokenAddress = formatAssetIdToERC20(assetId);
3539
+ tokenAddress = assetId.startsWith('0x') ? assetId : formatAssetIdToERC20(assetId);
3540
3540
  _context.n = 1;
3541
3541
  return client.readContract({
3542
3542
  address: tokenAddress,
@@ -8032,20 +8032,20 @@ var ParachainNode = /*#__PURE__*/function () {
8032
8032
  }
8033
8033
  }, {
8034
8034
  key: "canUseXTokens",
8035
- value: function canUseXTokens(_ref) {
8036
- var asset = _ref.asset;
8035
+ value: function canUseXTokens(options) {
8036
+ var asset = options.asset;
8037
8037
  var isEthAsset = asset.multiLocation && findAssetByMultiLocation(getOtherAssets('Ethereum'), asset.multiLocation);
8038
- return !isEthAsset;
8038
+ return !isEthAsset && !this.shouldUseNativeAssetTeleport(options);
8039
8039
  }
8040
8040
  }, {
8041
8041
  key: "transfer",
8042
8042
  value: function () {
8043
- var _transfer = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee(options) {
8044
- var api, asset, currency, feeAsset, feeCurrency, address, destination, paraIdTo, overriddenAsset, version, senderAddress, ahAddress, pallet, method, scenario, paraId, isLocalTransfer, isBifrostOrigin, isJamtonOrigin, isAssetHubDest, shouldUseMultiasset, input, _options, isEthAsset, isAHPOrigin, isAHPDest, isEthDest, isEthAssetViaAh, isEthAssetToAh, call;
8043
+ var _transfer = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee(sendOptions) {
8044
+ var api, asset, currency, feeAsset, feeCurrency, address, destination, paraIdTo, overriddenAsset, version, senderAddress, ahAddress, pallet, method, scenario, paraId, isLocalTransfer, isBifrostOrigin, isJamtonOrigin, isAssetHubDest, shouldUseMultiasset, input, options, shouldUseTeleport, isAHPOrigin, isAHPDest, isEthAsset, isEthDest, isEthAssetViaAh, isEthAssetToAh, call;
8045
8045
  return _regenerator().w(function (_context) {
8046
8046
  while (1) switch (_context.n) {
8047
8047
  case 0:
8048
- api = options.api, asset = options.asset, currency = options.currency, feeAsset = options.feeAsset, feeCurrency = options.feeCurrency, 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;
8048
+ api = sendOptions.api, asset = sendOptions.asset, currency = sendOptions.currency, feeAsset = sendOptions.feeAsset, feeCurrency = sendOptions.feeCurrency, address = sendOptions.address, destination = sendOptions.to, paraIdTo = sendOptions.paraIdTo, overriddenAsset = sendOptions.overriddenAsset, version = sendOptions.version, senderAddress = sendOptions.senderAddress, ahAddress = sendOptions.ahAddress, pallet = sendOptions.pallet, method = sendOptions.method;
8049
8049
  scenario = resolveScenario(this.node, destination);
8050
8050
  paraId = resolveParaId(paraIdTo, destination);
8051
8051
  if (!(destination === 'Polimec' && this.node !== 'AssetHubPolkadot' && this.node !== 'Hydration' && this.node !== destination)) {
@@ -8059,9 +8059,9 @@ var ParachainNode = /*#__PURE__*/function () {
8059
8059
  _context.n = 2;
8060
8060
  break;
8061
8061
  }
8062
- return _context.a(2, this.transferLocal(options));
8062
+ return _context.a(2, this.transferLocal(sendOptions));
8063
8063
  case 2:
8064
- if (!(supportsXTokens(this) && this.canUseXTokens(options))) {
8064
+ if (!(supportsXTokens(this) && this.canUseXTokens(sendOptions))) {
8065
8065
  _context.n = 4;
8066
8066
  break;
8067
8067
  }
@@ -8107,10 +8107,10 @@ var ParachainNode = /*#__PURE__*/function () {
8107
8107
  }));
8108
8108
  case 5:
8109
8109
  if (!supportsPolkadotXCM(this)) {
8110
- _context.n = 8;
8110
+ _context.n = 9;
8111
8111
  break;
8112
8112
  }
8113
- _options = {
8113
+ options = {
8114
8114
  api: api,
8115
8115
  destLocation: createDestination(version, this.node, destination, paraId),
8116
8116
  beneficiaryLocation: createBeneficiaryLocation({
@@ -8133,27 +8133,34 @@ var ParachainNode = /*#__PURE__*/function () {
8133
8133
  ahAddress: ahAddress,
8134
8134
  pallet: pallet,
8135
8135
  method: method
8136
- }; // Handle common cases
8136
+ };
8137
+ shouldUseTeleport = this.shouldUseNativeAssetTeleport(sendOptions);
8138
+ if (!shouldUseTeleport) {
8139
+ _context.n = 6;
8140
+ break;
8141
+ }
8142
+ throw new TransferToAhNotSupported('Native asset transfers to or from AssetHub are temporarily disabled');
8143
+ case 6:
8144
+ isAHPOrigin = this.node.includes('AssetHub');
8145
+ isAHPDest = !isTMultiLocation(destination) && destination.includes('AssetHub'); // Handle common cases
8137
8146
  isEthAsset = asset.multiLocation && findAssetByMultiLocation(getOtherAssets('Ethereum'), asset.multiLocation);
8138
- isAHPOrigin = this.node === 'AssetHubPolkadot' || this.node === 'AssetHubKusama';
8139
- isAHPDest = destination === 'AssetHubPolkadot' || destination === 'AssetHubKusama';
8140
8147
  isEthDest = destination === 'Ethereum'; // Eth asset - Any origin to any dest via AH - DestinationReserve - multiple instructions
8141
8148
  isEthAssetViaAh = isEthAsset && !isAHPOrigin && !isAHPDest && !isEthDest && !feeAsset; // Eth asset - Any origin to AHP - DestinationReserve - one DepositAsset instruction
8142
8149
  isEthAssetToAh = isEthAsset && isAHPDest && !isAHPOrigin && !isEthDest && !feeAsset;
8143
8150
  if (!(isEthAssetViaAh || isEthAssetToAh)) {
8144
- _context.n = 7;
8151
+ _context.n = 8;
8145
8152
  break;
8146
8153
  }
8147
- _context.n = 6;
8148
- return createTypeAndThenCall(this.node, _options);
8149
- case 6:
8154
+ _context.n = 7;
8155
+ return createTypeAndThenCall(this.node, options);
8156
+ case 7:
8150
8157
  call = _context.v;
8151
8158
  return _context.a(2, api.callTxMethod(call));
8152
- case 7:
8153
- return _context.a(2, this.transferPolkadotXCM(_options));
8154
8159
  case 8:
8155
- throw new NoXCMSupportImplementedError(this._node);
8160
+ return _context.a(2, this.transferPolkadotXCM(options));
8156
8161
  case 9:
8162
+ throw new NoXCMSupportImplementedError(this._node);
8163
+ case 10:
8157
8164
  return _context.a(2);
8158
8165
  }
8159
8166
  }, _callee, this);
@@ -8163,6 +8170,21 @@ var ParachainNode = /*#__PURE__*/function () {
8163
8170
  }
8164
8171
  return transfer;
8165
8172
  }()
8173
+ }, {
8174
+ key: "shouldUseNativeAssetTeleport",
8175
+ value: function shouldUseNativeAssetTeleport(_ref) {
8176
+ var asset = _ref.asset,
8177
+ to = _ref.to;
8178
+ if (isTMultiLocation(to) || isDotKsmBridge(this.node, to) || to === 'Ethereum') return false;
8179
+ var isAHPOrigin = this.node.includes('AssetHub');
8180
+ var isAHPDest = !isTMultiLocation(to) && to.includes('AssetHub');
8181
+ var isNativeAsset = !isTMultiLocation(to) && (isAHPOrigin && isForeignAsset(asset) && isSymbolMatch(asset.symbol, getNativeAssetSymbol(to)) || isAHPDest && !isForeignAsset(asset) && isSymbolMatch(asset.symbol, getNativeAssetSymbol(this.node)));
8182
+ var assetHubChain = "AssetHub".concat(getRelayChainOf(this.node));
8183
+ var isRegisteredOnAh = asset.multiLocation && findAsset(assetHubChain, {
8184
+ multilocation: asset.multiLocation
8185
+ }, null);
8186
+ return isNativeAsset && Boolean(isRegisteredOnAh) && (isAHPOrigin || isAHPDest);
8187
+ }
8166
8188
  }, {
8167
8189
  key: "getRelayToParaOverrides",
8168
8190
  value: function getRelayToParaOverrides() {
@@ -10123,24 +10145,46 @@ var Hydration = /*#__PURE__*/function (_ParachainNode) {
10123
10145
  }
10124
10146
  return transferPolkadotXCM;
10125
10147
  }()
10148
+ }, {
10149
+ key: "transferMoonbeamWhAsset",
10150
+ value: function transferMoonbeamWhAsset(input) {
10151
+ var asset = input.asset,
10152
+ version = input.version;
10153
+ assertHasLocation(asset);
10154
+ var glmr = findAssetForNodeOrThrow(this.node, {
10155
+ symbol: getNativeAssetSymbol('Moonbeam')
10156
+ }, null);
10157
+ var FEE_AMOUNT = 80000000000000000n; // 0.08 GLMR
10158
+ assertHasLocation(glmr);
10159
+ return transferXTokens(_objectSpread2(_objectSpread2({}, input), {}, {
10160
+ overriddenAsset: [_objectSpread2(_objectSpread2({}, createMultiAsset(version, FEE_AMOUNT, glmr.multiLocation)), {}, {
10161
+ isFeeAsset: true
10162
+ }), createMultiAsset(version, asset.amount, asset.multiLocation)]
10163
+ }), Number(asset.assetId));
10164
+ }
10126
10165
  }, {
10127
10166
  key: "transferXTokens",
10128
10167
  value: function transferXTokens$1(input) {
10129
- var asset = input.asset;
10168
+ var asset = input.asset,
10169
+ destination = input.destination;
10130
10170
  if (asset.symbol === this.getNativeAssetSymbol()) {
10131
10171
  return transferXTokens(input, Hydration.NATIVE_ASSET_ID);
10132
10172
  }
10173
+ var isMoonbeamWhAsset = asset.multiLocation && hasJunction(asset.multiLocation, 'Parachain', getParaId('Moonbeam')) && hasJunction(asset.multiLocation, 'PalletInstance', 110);
10174
+ if (isMoonbeamWhAsset && destination === 'Moonbeam') {
10175
+ return this.transferMoonbeamWhAsset(input);
10176
+ }
10133
10177
  assertHasId(asset);
10134
10178
  return transferXTokens(input, Number(asset.assetId));
10135
10179
  }
10136
10180
  }, {
10137
10181
  key: "canUseXTokens",
10138
- value: function canUseXTokens(_ref3) {
10139
- var destination = _ref3.to,
10140
- asset = _ref3.asset,
10141
- feeAsset = _ref3.feeAsset;
10142
- var isEthAsset = asset.multiLocation && findAssetByMultiLocation(getOtherAssets('Ethereum'), asset.multiLocation);
10143
- return destination !== 'Ethereum' && destination !== 'Polimec' && !(destination === 'AssetHubPolkadot' && asset.symbol === 'DOT') && !isEthAsset && !feeAsset;
10182
+ value: function canUseXTokens(options) {
10183
+ var destination = options.to,
10184
+ asset = options.asset,
10185
+ feeAsset = options.feeAsset;
10186
+ var baseCanUseXTokens = _superPropGet(Hydration, "canUseXTokens", this, 3)([options]);
10187
+ return destination !== 'Ethereum' && destination !== 'Polimec' && !(destination === 'AssetHubPolkadot' && asset.symbol === 'DOT') && baseCanUseXTokens && !feeAsset;
10144
10188
  }
10145
10189
  }, {
10146
10190
  key: "transferLocalNativeAsset",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@paraspell/sdk-core",
3
- "version": "10.11.7",
3
+ "version": "10.11.9",
4
4
  "description": "SDK core for ParaSpell XCM/XCMP tool for developers",
5
5
  "repository": {
6
6
  "type": "git",
@@ -26,9 +26,9 @@
26
26
  "@noble/hashes": "^1.8.0",
27
27
  "@scure/base": "^1.2.6",
28
28
  "viem": "^2.33.2",
29
- "@paraspell/sdk-common": "10.11.7",
30
- "@paraspell/pallets": "10.11.7",
31
- "@paraspell/assets": "10.11.7"
29
+ "@paraspell/assets": "10.11.9",
30
+ "@paraspell/sdk-common": "10.11.9",
31
+ "@paraspell/pallets": "10.11.9"
32
32
  },
33
33
  "devDependencies": {
34
34
  "@babel/plugin-syntax-import-attributes": "^7.27.1",