@paraspell/sdk-core 14.5.1 → 14.5.2

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.d.ts CHANGED
@@ -1770,7 +1770,7 @@ type TBuildOriginInfoOptions<TApi, TRes, TSigner, TCustomChain extends string =
1770
1770
  amount: bigint;
1771
1771
  originFee: bigint;
1772
1772
  originFeeAsset: TAssetInfo;
1773
- isFeeAssetAh: boolean;
1773
+ isOriginFeeAsset: boolean;
1774
1774
  };
1775
1775
  type BuildHopInfoOptions<TApi, TRes, TSigner, TCustomChain extends string = never> = {
1776
1776
  api: PolkadotApi<TApi, TRes, TSigner, TCustomChain>;
@@ -1789,7 +1789,7 @@ type TBuildDestInfoOptions<TApi, TRes, TSigner, TCustomChain extends string = ne
1789
1789
  recipient: string;
1790
1790
  currency: WithAmount<TSingleCurrencyInput>;
1791
1791
  originFee: bigint;
1792
- isFeeAssetAh: boolean;
1792
+ isOriginFeeAsset: boolean;
1793
1793
  paysDestFee: boolean;
1794
1794
  destFeeDetail: TXcmFeeDetail;
1795
1795
  totalHopFee: bigint;
@@ -2391,7 +2391,7 @@ declare const aggregateHopFees: (hops: TXcmFeeHopInfo[], matchAsset: TAssetInfo)
2391
2391
  bridgeFee?: bigint;
2392
2392
  };
2393
2393
 
2394
- declare const buildDestInfo: <TApi, TRes, TSigner, TCustomChain extends string = never>({ api, origin, destination, recipient, currency, originFee, isFeeAssetAh, paysDestFee, destFeeDetail, totalHopFee, bridgeFee }: TBuildDestInfoOptions<TApi, TRes, TSigner, TCustomChain>) => Promise<{
2394
+ declare const buildDestInfo: <TApi, TRes, TSigner, TCustomChain extends string = never>({ api, origin, destination, recipient, currency, originFee, isOriginFeeAsset, paysDestFee, destFeeDetail, totalHopFee, bridgeFee }: TBuildDestInfoOptions<TApi, TRes, TSigner, TCustomChain>) => Promise<{
2395
2395
  receivedCurrency: {
2396
2396
  sufficient: boolean | UnableToComputeError;
2397
2397
  receivedAmount: bigint | UnableToComputeError;
@@ -2415,7 +2415,7 @@ declare const buildHopInfo: <TApi, TRes, TSigner, TCustomChain extends string =
2415
2415
  };
2416
2416
  }>;
2417
2417
 
2418
- declare const buildOriginInfo: <TApi, TRes, TSigner, TCustomChain extends string = never>({ api, origin, sender, assets, amount, originFee, originFeeAsset, isFeeAssetAh }: TBuildOriginInfoOptions<TApi, TRes, TSigner, TCustomChain>) => Promise<{
2418
+ declare const buildOriginInfo: <TApi, TRes, TSigner, TCustomChain extends string = never>({ api, origin, sender, assets, amount, originFee, originFeeAsset, isOriginFeeAsset }: TBuildOriginInfoOptions<TApi, TRes, TSigner, TCustomChain>) => Promise<{
2419
2419
  selectedCurrency: TSelectedCurrencyInfo[];
2420
2420
  xcmFee: TOriginXcmFeeInfo;
2421
2421
  }>;
package/dist/index.mjs CHANGED
@@ -3401,6 +3401,13 @@ var supportsFeeAssetPayment = function supportsFeeAssetPayment(chain) {
3401
3401
  return chain === 'AssetHubPolkadot' || chain.startsWith('Hydration');
3402
3402
  };
3403
3403
 
3404
+ var usesOriginFeeAsset = function usesOriginFeeAsset(api, origin, currency, assetInfo, feeAssetInfo, originFeeAsset) {
3405
+ return (
3406
+ // Hydration chain origin delivery fee is 0n so we need to handle it only for AssetHubPolkadot
3407
+ origin === 'AssetHubPolkadot' && !Array.isArray(currency) && !!feeAssetInfo && isAssetEqual(feeAssetInfo, assetInfo) && isAssetEqual(originFeeAsset, feeAssetInfo) && !isAssetEqual(feeAssetInfo, api.findNativeAssetInfoOrThrow(origin))
3408
+ );
3409
+ };
3410
+
3404
3411
  var validateCurrency = function validateCurrency(currency, feeAsset) {
3405
3412
  if (Array.isArray(currency)) {
3406
3413
  if (currency.length === 0) {
@@ -6989,15 +6996,192 @@ var getOriginXcmFee = /*#__PURE__*/function () {
6989
6996
  };
6990
6997
  }();
6991
6998
 
6999
+ var FEE_PADDING = 30;
7000
+ var sumHopFees = function sumHopFees(result, _ref) {
7001
+ var assetInfo = _ref.assetInfo,
7002
+ feeAssetInfo = _ref.feeAssetInfo,
7003
+ isRelayAsset = _ref.isRelayAsset,
7004
+ systemAsset = _ref.systemAsset,
7005
+ overriddenAsset = _ref.options.overriddenAsset;
7006
+ var feeAsset = isRelayAsset || overriddenAsset ? assetInfo : feeAssetInfo !== null && feeAssetInfo !== void 0 ? feeAssetInfo : systemAsset;
7007
+ return result.hops.reduce(function (acc, hop) {
7008
+ // only add if asset is equal
7009
+ return isAssetEqual(hop.result.asset, feeAsset) ? acc + hop.result.fee : acc;
7010
+ }, 0n);
7011
+ };
7012
+ var computeAllFees = /*#__PURE__*/function () {
7013
+ var _ref2 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee(context, buildTx) {
7014
+ var origin, dest, feeAssetInfo, edDeposit, _context$options, sender, recipient, currency, feeCurrency, version, overriddenAsset, result, hopFees, destFee;
7015
+ return _regenerator().w(function (_context) {
7016
+ while (1) switch (_context.n) {
7017
+ case 0:
7018
+ origin = context.origin, dest = context.dest, feeAssetInfo = context.feeAssetInfo, edDeposit = context.edDeposit, _context$options = context.options, sender = _context$options.sender, recipient = _context$options.recipient, currency = _context$options.currency, feeCurrency = _context$options.feeCurrency, version = _context$options.version, overriddenAsset = _context$options.overriddenAsset;
7019
+ assertSender(sender);
7020
+ assertAddressIsString(recipient);
7021
+ if (origin.api.hasDryRunSupport(context.origin.chain)) {
7022
+ _context.n = 2;
7023
+ break;
7024
+ }
7025
+ if (!(feeAssetInfo || overriddenAsset)) {
7026
+ _context.n = 1;
7027
+ break;
7028
+ }
7029
+ throw new ScenarioNotSupportedError("Fee asset cannot be used on ".concat(origin.chain, " because it does not support dry run."));
7030
+ case 1:
7031
+ return _context.a(2, null);
7032
+ case 2:
7033
+ _context.n = 3;
7034
+ return getXcmFeeInternal({
7035
+ api: origin.api,
7036
+ buildTx: buildTx,
7037
+ origin: origin.chain,
7038
+ destination: dest.chain,
7039
+ sender: sender,
7040
+ recipient: recipient,
7041
+ version: version,
7042
+ currency: currency,
7043
+ feeAsset: feeCurrency,
7044
+ disableFallback: false,
7045
+ skipReverseFeeCalculation: true
7046
+ });
7047
+ case 3:
7048
+ result = _context.v;
7049
+ hopFees = sumHopFees(result, context);
7050
+ destFee = result.destination.fee;
7051
+ return _context.a(2, {
7052
+ hopFees: padValueBy(hopFees, FEE_PADDING),
7053
+ destFee: padValueBy(destFee, FEE_PADDING) + (edDeposit !== null && edDeposit !== void 0 ? edDeposit : 0n)
7054
+ });
7055
+ }
7056
+ }, _callee);
7057
+ }));
7058
+ return function computeAllFees(_x, _x2) {
7059
+ return _ref2.apply(this, arguments);
7060
+ };
7061
+ }();
7062
+
7063
+ var isAssetSufficient = /*#__PURE__*/function () {
7064
+ var _ref = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee(api, chain, asset) {
7065
+ var pallets, _state$isSufficient, state;
7066
+ return _regenerator().w(function (_context) {
7067
+ while (1) switch (_context.p = _context.n) {
7068
+ case 0:
7069
+ pallets = getOtherAssetsPallets(chain, api._customCtx);
7070
+ if (!(asset.isNative || pallets.length === 0)) {
7071
+ _context.n = 1;
7072
+ break;
7073
+ }
7074
+ return _context.a(2, true);
7075
+ case 1:
7076
+ _context.p = 1;
7077
+ _context.n = 2;
7078
+ return getPalletInstance(pickOtherMintPallet(asset, pallets)).getAssetState(api, asset);
7079
+ case 2:
7080
+ state = _context.v;
7081
+ return _context.a(2, (_state$isSufficient = state === null || state === void 0 ? void 0 : state.isSufficient) !== null && _state$isSufficient !== void 0 ? _state$isSufficient : true);
7082
+ case 3:
7083
+ _context.p = 3;
7084
+ _context.v;
7085
+ return _context.a(2, true);
7086
+ }
7087
+ }, _callee, null, [[1, 3]]);
7088
+ }));
7089
+ return function isAssetSufficient(_x, _x2, _x3) {
7090
+ return _ref.apply(this, arguments);
7091
+ };
7092
+ }();
7093
+
7094
+ var resolveEdDeposit = /*#__PURE__*/function () {
7095
+ var _ref2 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee(_ref) {
7096
+ var _overriddenAsset$map;
7097
+ var origin, _ref$dest, destApi, destChain, assetInfo, overriddenAsset, feeAssetLocation, recipient, nativeAsset, nativeLocation, feeLocation, isFeeNative, _yield$destApi$queryS, providers, destAssets, sufficiency, ed, feeAmount;
7098
+ return _regenerator().w(function (_context) {
7099
+ while (1) switch (_context.n) {
7100
+ case 0:
7101
+ origin = _ref.origin, _ref$dest = _ref.dest, destApi = _ref$dest.api, destChain = _ref$dest.chain, assetInfo = _ref.assetInfo, overriddenAsset = _ref.overriddenAsset, feeAssetLocation = _ref.feeAssetLocation, recipient = _ref.recipient;
7102
+ if (!(isExternalChain(destChain) || typeof recipient !== 'string')) {
7103
+ _context.n = 1;
7104
+ break;
7105
+ }
7106
+ return _context.a(2, undefined);
7107
+ case 1:
7108
+ nativeAsset = destApi.findNativeAssetInfoOrThrow(destChain);
7109
+ nativeLocation = origin.api.localizeLocation(destChain, nativeAsset.location);
7110
+ feeLocation = origin.api.localizeLocation(destChain, feeAssetLocation, origin.chain);
7111
+ isFeeNative = deepEqual(feeLocation, nativeLocation);
7112
+ if (!(!isFeeNative && !destChain.startsWith('AssetHub'))) {
7113
+ _context.n = 2;
7114
+ break;
7115
+ }
7116
+ return _context.a(2, undefined);
7117
+ case 2:
7118
+ _context.n = 3;
7119
+ return destApi.queryState({
7120
+ module: 'System',
7121
+ method: 'Account',
7122
+ params: [recipient]
7123
+ });
7124
+ case 3:
7125
+ _yield$destApi$queryS = _context.v;
7126
+ providers = _yield$destApi$queryS.providers;
7127
+ if (!(providers > 0)) {
7128
+ _context.n = 4;
7129
+ break;
7130
+ }
7131
+ return _context.a(2, undefined);
7132
+ case 4:
7133
+ destAssets = ((_overriddenAsset$map = overriddenAsset === null || overriddenAsset === void 0 ? void 0 : overriddenAsset.map(function (asset) {
7134
+ return extractAssetLocation(asset);
7135
+ })) !== null && _overriddenAsset$map !== void 0 ? _overriddenAsset$map : [assetInfo.location]).map(function (location) {
7136
+ return origin.api.findAssetOnDestOrThrow(origin.chain, destChain, {
7137
+ location: location
7138
+ });
7139
+ });
7140
+ _context.n = 5;
7141
+ return Promise.all(destAssets.map(function (asset) {
7142
+ return isAssetSufficient(destApi, destChain, asset);
7143
+ }));
7144
+ case 5:
7145
+ sufficiency = _context.v;
7146
+ if (!sufficiency.every(Boolean)) {
7147
+ _context.n = 6;
7148
+ break;
7149
+ }
7150
+ return _context.a(2, undefined);
7151
+ case 6:
7152
+ ed = BigInt(nativeAsset.existentialDeposit);
7153
+ if (!isFeeNative) {
7154
+ _context.n = 7;
7155
+ break;
7156
+ }
7157
+ return _context.a(2, ed);
7158
+ case 7:
7159
+ _context.n = 8;
7160
+ return destApi.queryRuntimeApi({
7161
+ module: 'AssetConversionApi',
7162
+ method: 'quote_price_tokens_for_exact_tokens',
7163
+ params: [feeLocation, nativeLocation, ed, true]
7164
+ });
7165
+ case 8:
7166
+ feeAmount = _context.v;
7167
+ return _context.a(2, feeAmount == null ? undefined : padValueBy(BigInt(feeAmount), FEE_PADDING));
7168
+ }
7169
+ }, _callee);
7170
+ }));
7171
+ return function resolveEdDeposit(_x) {
7172
+ return _ref2.apply(this, arguments);
7173
+ };
7174
+ }();
7175
+
6992
7176
  var getXcmFeeOnce = /*#__PURE__*/function () {
6993
7177
  var _ref2 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee2(_ref) {
6994
- var api, tx, origin, destination, sender, recipient, currency, feeAsset, version, disableFallback, swapConfig, useRootOrigin, skipReverseFeeCalculation, resolvedFeeAsset, _resolveCurrency, asset, resolvedVersion, _yield$getOriginXcmFe, originFeeRaw, originAsset, originFeeType, originDryRunError, initialForwardedXcm, initialDestParaId, originWeight, sufficientOriginFee, isMythosToEthereum, originFee, destApi, destFeeRes, _result, _dryRunError, processHop, traversalResult, destFee, destAsset, destFeeType, destDryRunError, destSufficient, destResult, _destApi, destFallback, relayChain, bridgeHubChain, assetHubChain, bridgeHubHop, processedBridgeHub, bridgeHubHopIndex, convertToFeeDetail, result, dryRunError, _t, _t2, _t3, _t4;
7178
+ var api, tx, origin, destination, sender, recipient, currency, feeAsset, version, disableFallback, swapConfig, useRootOrigin, skipReverseFeeCalculation, resolvedFeeAsset, _resolveCurrency, asset, assets, resolvedVersion, _yield$getOriginXcmFe, originFeeRaw, originAsset, originFeeType, originDryRunError, initialForwardedXcm, initialDestParaId, originWeight, sufficientOriginFee, isMythosToEthereum, originFee, destApi, destFeeRes, _result, _dryRunError, processHop, traversalResult, destFee, destAsset, destFeeType, destDryRunError, destSufficient, destResult, _destApi, destFallback, relayChain, bridgeHubChain, assetHubChain, bridgeHubHop, processedBridgeHub, bridgeHubHopIndex, convertToFeeDetail, result, dryRunError, _t, _t2, _t3, _t4;
6995
7179
  return _regenerator().w(function (_context2) {
6996
7180
  while (1) switch (_context2.p = _context2.n) {
6997
7181
  case 0:
6998
7182
  api = _ref.api, tx = _ref.tx, origin = _ref.origin, destination = _ref.destination, sender = _ref.sender, recipient = _ref.recipient, currency = _ref.currency, feeAsset = _ref.feeAsset, version = _ref.version, disableFallback = _ref.disableFallback, swapConfig = _ref.swapConfig, useRootOrigin = _ref.useRootOrigin, skipReverseFeeCalculation = _ref.skipReverseFeeCalculation;
6999
7183
  resolvedFeeAsset = feeAsset ? resolveFeeAsset(api, feeAsset, origin, destination, currency) : undefined;
7000
- _resolveCurrency = resolveCurrency(api, currency, resolvedFeeAsset, origin, destination), asset = _resolveCurrency.asset;
7184
+ _resolveCurrency = resolveCurrency(api, currency, resolvedFeeAsset, origin, destination), asset = _resolveCurrency.asset, assets = _resolveCurrency.assets;
7001
7185
  resolvedVersion = pickCompatibleXcmVersion(api, origin, destination, version);
7002
7186
  _context2.n = 1;
7003
7187
  return getOriginXcmFeeInternal({
@@ -7121,11 +7305,11 @@ var getXcmFeeOnce = /*#__PURE__*/function () {
7121
7305
  case 10:
7122
7306
  processHop = /*#__PURE__*/function () {
7123
7307
  var _ref3 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee(params) {
7124
- var hopApi, currentChain, currentOrigin, currentAsset, forwardedXcms, hasPassedExchange, resolvedHopAsset, hopResult;
7308
+ var hopApi, currentChain, currentOrigin, currentAsset, forwardedXcms, hasPassedExchange, isDestination, resolvedHopAsset, hopResult, edDeposit;
7125
7309
  return _regenerator().w(function (_context) {
7126
7310
  while (1) switch (_context.n) {
7127
7311
  case 0:
7128
- hopApi = params.api, currentChain = params.currentChain, currentOrigin = params.currentOrigin, currentAsset = params.currentAsset, forwardedXcms = params.forwardedXcms, hasPassedExchange = params.hasPassedExchange;
7312
+ hopApi = params.api, currentChain = params.currentChain, currentOrigin = params.currentOrigin, currentAsset = params.currentAsset, forwardedXcms = params.forwardedXcms, hasPassedExchange = params.hasPassedExchange, isDestination = params.isDestination;
7129
7313
  resolvedHopAsset = resolveHopAsset({
7130
7314
  api: api,
7131
7315
  tx: tx,
@@ -7164,7 +7348,36 @@ var getXcmFeeOnce = /*#__PURE__*/function () {
7164
7348
  });
7165
7349
  case 1:
7166
7350
  hopResult = _context.v;
7351
+ if (!(!isDestination || hopResult.fee === undefined || hopResult.dryRunError || isAssetEqual(hopResult.asset, hopApi.findNativeAssetInfoOrThrow(currentChain)))) {
7352
+ _context.n = 2;
7353
+ break;
7354
+ }
7167
7355
  return _context.a(2, hopResult);
7356
+ case 2:
7357
+ _context.n = 3;
7358
+ return resolveEdDeposit({
7359
+ origin: {
7360
+ api: api,
7361
+ chain: origin
7362
+ },
7363
+ dest: {
7364
+ api: hopApi,
7365
+ chain: currentChain
7366
+ },
7367
+ assetInfo: asset,
7368
+ overriddenAsset: assets.map(function (_ref4) {
7369
+ var amount = _ref4.amount,
7370
+ location = _ref4.location;
7371
+ return createAsset(resolvedVersion, amount, location);
7372
+ }),
7373
+ feeAssetLocation: hopResult.asset.location,
7374
+ recipient: recipient
7375
+ });
7376
+ case 3:
7377
+ edDeposit = _context.v;
7378
+ return _context.a(2, _objectSpread2(_objectSpread2({}, hopResult), {}, {
7379
+ fee: hopResult.fee + (edDeposit !== null && edDeposit !== void 0 ? edDeposit : 0n)
7380
+ }));
7168
7381
  }
7169
7382
  }, _callee);
7170
7383
  }));
@@ -7490,11 +7703,11 @@ var aggregateHopFees = function aggregateHopFees(hops, matchAsset) {
7490
7703
 
7491
7704
  var buildDestInfo = /*#__PURE__*/function () {
7492
7705
  var _ref2 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee(_ref) {
7493
- var api, origin, destination, recipient, currency, originFee, isFeeAssetAh, paysDestFee, destFeeDetail, totalHopFee, bridgeFee, destApi, destAsset, edDest, destBalance, destAmount, destFeeAssetEqual, effectiveDestFee, effectiveAmountForBalance, destBalanceSufficient, destBalanceAfter, createUnableToComputeError, isUnableToCompute, destbalanceAfterResult, destBalanceSufficientResult, receivedAmount, isSubBridge, nativeAssetOfOriginSymbol, isOriginAssetNative, destXcmFeeBalance, isDestFeeInNativeCurrency, destRecipientNativeBalance, destXcmFeeBalanceAfter;
7706
+ var api, origin, destination, recipient, currency, originFee, isOriginFeeAsset, paysDestFee, destFeeDetail, totalHopFee, bridgeFee, destApi, destAsset, edDest, destBalance, destAmount, destFeeAssetEqual, effectiveDestFee, effectiveAmountForBalance, destBalanceSufficient, destBalanceAfter, createUnableToComputeError, isUnableToCompute, destbalanceAfterResult, destBalanceSufficientResult, receivedAmount, isSubBridge, nativeAssetOfOriginSymbol, isOriginAssetNative, destXcmFeeBalance, isDestFeeInNativeCurrency, destRecipientNativeBalance, destXcmFeeBalanceAfter;
7494
7707
  return _regenerator().w(function (_context) {
7495
7708
  while (1) switch (_context.n) {
7496
7709
  case 0:
7497
- api = _ref.api, origin = _ref.origin, destination = _ref.destination, recipient = _ref.recipient, currency = _ref.currency, originFee = _ref.originFee, isFeeAssetAh = _ref.isFeeAssetAh, paysDestFee = _ref.paysDestFee, destFeeDetail = _ref.destFeeDetail, totalHopFee = _ref.totalHopFee, bridgeFee = _ref.bridgeFee;
7710
+ api = _ref.api, origin = _ref.origin, destination = _ref.destination, recipient = _ref.recipient, currency = _ref.currency, originFee = _ref.originFee, isOriginFeeAsset = _ref.isOriginFeeAsset, paysDestFee = _ref.paysDestFee, destFeeDetail = _ref.destFeeDetail, totalHopFee = _ref.totalHopFee, bridgeFee = _ref.bridgeFee;
7498
7711
  destApi = api.clone();
7499
7712
  _context.n = 1;
7500
7713
  return destApi.init(destination);
@@ -7510,7 +7723,7 @@ var buildDestInfo = /*#__PURE__*/function () {
7510
7723
  });
7511
7724
  case 2:
7512
7725
  destBalance = _context.v;
7513
- destAmount = isFeeAssetAh ? currency.amount - originFee : currency.amount;
7726
+ destAmount = isOriginFeeAsset ? currency.amount - originFee : currency.amount;
7514
7727
  destFeeAssetEqual = isSymbolMatch(destFeeDetail.asset.symbol, destAsset.symbol);
7515
7728
  effectiveDestFee = paysDestFee && destFeeAssetEqual ? destFeeDetail.fee : 0n;
7516
7729
  effectiveAmountForBalance = destAmount - totalHopFee;
@@ -7564,7 +7777,7 @@ var buildDestInfo = /*#__PURE__*/function () {
7564
7777
  case 4:
7565
7778
  destXcmFeeBalance = destBalance;
7566
7779
  case 5:
7567
- destXcmFeeBalanceAfter = isFeeAssetAh ? destBalanceAfter : destXcmFeeBalance - destFeeDetail.fee + (destFeeAssetEqual ? effectiveAmountForBalance : 0n);
7780
+ destXcmFeeBalanceAfter = isOriginFeeAsset ? destBalanceAfter : destXcmFeeBalance - destFeeDetail.fee + (destFeeAssetEqual ? effectiveAmountForBalance : 0n);
7568
7781
  return _context.a(2, {
7569
7782
  receivedCurrency: {
7570
7783
  sufficient: destBalanceSufficientResult,
@@ -7641,11 +7854,11 @@ var buildHopInfo = /*#__PURE__*/function () {
7641
7854
  var _excluded$1 = ["amount"];
7642
7855
  var buildOriginInfo = /*#__PURE__*/function () {
7643
7856
  var _ref2 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee2(_ref) {
7644
- var api, origin, sender, assets, amount, originFee, originFeeAsset, isFeeAssetAh, buildSelectedCurrency, selectedCurrency, originBalanceFee, originBalanceFeeAfter;
7857
+ var api, origin, sender, assets, amount, originFee, originFeeAsset, isOriginFeeAsset, buildSelectedCurrency, selectedCurrency, originBalanceFee, originBalanceFeeAfter;
7645
7858
  return _regenerator().w(function (_context2) {
7646
7859
  while (1) switch (_context2.n) {
7647
7860
  case 0:
7648
- api = _ref.api, origin = _ref.origin, sender = _ref.sender, assets = _ref.assets, amount = _ref.amount, originFee = _ref.originFee, originFeeAsset = _ref.originFeeAsset, isFeeAssetAh = _ref.isFeeAssetAh;
7861
+ api = _ref.api, origin = _ref.origin, sender = _ref.sender, assets = _ref.assets, amount = _ref.amount, originFee = _ref.originFee, originFeeAsset = _ref.originFeeAsset, isOriginFeeAsset = _ref.isOriginFeeAsset;
7649
7862
  buildSelectedCurrency = /*#__PURE__*/function () {
7650
7863
  var _ref4 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee(_ref3) {
7651
7864
  var assetAmount, asset, balance, balanceAfter;
@@ -7689,7 +7902,7 @@ var buildOriginInfo = /*#__PURE__*/function () {
7689
7902
  });
7690
7903
  case 2:
7691
7904
  originBalanceFee = _context2.v;
7692
- originBalanceFeeAfter = isFeeAssetAh ? originBalanceFee - amount : originBalanceFee - originFee;
7905
+ originBalanceFeeAfter = isOriginFeeAsset ? originBalanceFee - amount : originBalanceFee - originFee;
7693
7906
  return _context2.a(2, {
7694
7907
  selectedCurrency: selectedCurrency,
7695
7908
  xcmFee: {
@@ -7710,7 +7923,7 @@ var buildOriginInfo = /*#__PURE__*/function () {
7710
7923
 
7711
7924
  var getTransferInfo = /*#__PURE__*/function () {
7712
7925
  var _ref2 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee2(_ref) {
7713
- var api, buildTx, origin, destination, sender, ahAddress, recipient, currency, feeAsset, version, resolvedFeeAsset, _resolveCurrency, assets, originAsset, amount, _yield$getXcmFeeInter, _yield$getXcmFeeInter2, originFee, originFeeAsset, destFeeDetail, hops, isFeeAssetAh, feeAssetIndex, feeCurrency, _yield$buildOriginInf, selectedCurrency, originXcmFee, builtHops, _aggregateHopFees, totalHopFee, bridgeFee, buildDestInfoForAsset, destResults, feeResult, result, _t, _t2;
7926
+ var api, buildTx, origin, destination, sender, ahAddress, recipient, currency, feeAsset, version, resolvedFeeAsset, _resolveCurrency, assets, originAsset, amount, _yield$getXcmFeeInter, _yield$getXcmFeeInter2, originFee, originFeeAsset, destFeeDetail, hops, isOriginFeeAsset, feeAssetIndex, feeCurrency, _yield$buildOriginInf, selectedCurrency, originXcmFee, builtHops, _aggregateHopFees, totalHopFee, bridgeFee, buildDestInfoForAsset, destResults, feeResult, result, _t, _t2;
7714
7927
  return _regenerator().w(function (_context2) {
7715
7928
  while (1) switch (_context2.p = _context2.n) {
7716
7929
  case 0:
@@ -7749,7 +7962,7 @@ var getTransferInfo = /*#__PURE__*/function () {
7749
7962
  originFeeAsset = _yield$getXcmFeeInter2.asset;
7750
7963
  destFeeDetail = _yield$getXcmFeeInter.destination;
7751
7964
  hops = _yield$getXcmFeeInter.hops;
7752
- isFeeAssetAh = origin === 'AssetHubPolkadot' && !!resolvedFeeAsset && isAssetEqual(resolvedFeeAsset, originAsset);
7965
+ isOriginFeeAsset = usesOriginFeeAsset(api, origin, currency, originAsset, resolvedFeeAsset, originFeeAsset);
7753
7966
  feeAssetIndex = assets.findIndex(function (asset) {
7754
7967
  return isAssetEqual(asset, originAsset);
7755
7968
  });
@@ -7763,7 +7976,7 @@ var getTransferInfo = /*#__PURE__*/function () {
7763
7976
  amount: amount,
7764
7977
  originFee: originFee,
7765
7978
  originFeeAsset: originFeeAsset,
7766
- isFeeAssetAh: isFeeAssetAh
7979
+ isOriginFeeAsset: isOriginFeeAsset
7767
7980
  });
7768
7981
  case 5:
7769
7982
  _yield$buildOriginInf = _context2.v;
@@ -7817,7 +8030,7 @@ var getTransferInfo = /*#__PURE__*/function () {
7817
8030
  recipient: recipient,
7818
8031
  currency: item,
7819
8032
  originFee: originFee,
7820
- isFeeAssetAh: isFeeAssetAh && isFeeElement,
8033
+ isOriginFeeAsset: isOriginFeeAsset && isFeeElement,
7821
8034
  paysDestFee: isFeeElement,
7822
8035
  destFeeDetail: destFeeDetail,
7823
8036
  totalHopFee: isFeeElement ? totalHopFee : 0n,
@@ -7885,76 +8098,12 @@ var getTransferInfo = /*#__PURE__*/function () {
7885
8098
  };
7886
8099
  }();
7887
8100
 
7888
- var FEE_PADDING = 30;
7889
- var sumHopFees = function sumHopFees(result, _ref) {
7890
- var assetInfo = _ref.assetInfo,
7891
- feeAssetInfo = _ref.feeAssetInfo,
7892
- isRelayAsset = _ref.isRelayAsset,
7893
- systemAsset = _ref.systemAsset,
7894
- overriddenAsset = _ref.options.overriddenAsset;
7895
- var feeAsset = isRelayAsset || overriddenAsset ? assetInfo : feeAssetInfo !== null && feeAssetInfo !== void 0 ? feeAssetInfo : systemAsset;
7896
- return result.hops.reduce(function (acc, hop) {
7897
- // only add if asset is equal
7898
- return isAssetEqual(hop.result.asset, feeAsset) ? acc + hop.result.fee : acc;
7899
- }, 0n);
7900
- };
7901
- var computeAllFees = /*#__PURE__*/function () {
7902
- var _ref2 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee(context, buildTx) {
7903
- var origin, dest, feeAssetInfo, edDeposit, _context$options, sender, recipient, currency, feeCurrency, version, overriddenAsset, result, hopFees, destFee;
7904
- return _regenerator().w(function (_context) {
7905
- while (1) switch (_context.n) {
7906
- case 0:
7907
- origin = context.origin, dest = context.dest, feeAssetInfo = context.feeAssetInfo, edDeposit = context.edDeposit, _context$options = context.options, sender = _context$options.sender, recipient = _context$options.recipient, currency = _context$options.currency, feeCurrency = _context$options.feeCurrency, version = _context$options.version, overriddenAsset = _context$options.overriddenAsset;
7908
- assertSender(sender);
7909
- assertAddressIsString(recipient);
7910
- if (origin.api.hasDryRunSupport(context.origin.chain)) {
7911
- _context.n = 2;
7912
- break;
7913
- }
7914
- if (!(feeAssetInfo || overriddenAsset)) {
7915
- _context.n = 1;
7916
- break;
7917
- }
7918
- throw new ScenarioNotSupportedError("Fee asset cannot be used on ".concat(origin.chain, " because it does not support dry run."));
7919
- case 1:
7920
- return _context.a(2, null);
7921
- case 2:
7922
- _context.n = 3;
7923
- return getXcmFeeInternal({
7924
- api: origin.api,
7925
- buildTx: buildTx,
7926
- origin: origin.chain,
7927
- destination: dest.chain,
7928
- sender: sender,
7929
- recipient: recipient,
7930
- version: version,
7931
- currency: currency,
7932
- feeAsset: feeCurrency,
7933
- disableFallback: false,
7934
- skipReverseFeeCalculation: true
7935
- });
7936
- case 3:
7937
- result = _context.v;
7938
- hopFees = sumHopFees(result, context);
7939
- destFee = result.destination.fee;
7940
- return _context.a(2, {
7941
- hopFees: padValueBy(hopFees, FEE_PADDING),
7942
- destFee: padValueBy(destFee, FEE_PADDING) + (edDeposit !== null && edDeposit !== void 0 ? edDeposit : 0n)
7943
- });
7944
- }
7945
- }, _callee);
7946
- }));
7947
- return function computeAllFees(_x, _x2) {
7948
- return _ref2.apply(this, arguments);
7949
- };
7950
- }();
7951
-
7952
8101
  var toSelectors = function toSelectors(currency) {
7953
8102
  return Array.isArray(currency) ? currency : [currency];
7954
8103
  };
7955
8104
  var getMinTransferableAmountInternal = /*#__PURE__*/function () {
7956
8105
  var _ref2 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee3(_ref) {
7957
- var api, origin, sender, recipient, destination, currency, feeAsset, buildTx, builder, version, resolvedFeeAsset, _resolveCurrency, assets, isMulti, selectors, toResult, destApi, nativeAssetInfo, result, minAmounts, buildMinCurrency, createTx, amounts, tx, dryRunResult, _t;
8106
+ var api, origin, sender, recipient, destination, currency, feeAsset, buildTx, builder, version, resolvedFeeAsset, _resolveCurrency, assets, isMulti, selectors, toResult, destApi, result, minAmounts, buildMinCurrency, createTx, amounts, tx, dryRunResult, _t;
7958
8107
  return _regenerator().w(function (_context3) {
7959
8108
  while (1) switch (_context3.p = _context3.n) {
7960
8109
  case 0:
@@ -7971,7 +8120,6 @@ var getMinTransferableAmountInternal = /*#__PURE__*/function () {
7971
8120
  _context3.n = 1;
7972
8121
  return destApi.init(destination);
7973
8122
  case 1:
7974
- nativeAssetInfo = api.findNativeAssetInfoOrThrow(origin);
7975
8123
  _context3.n = 2;
7976
8124
  return getXcmFee({
7977
8125
  api: api,
@@ -7992,7 +8140,7 @@ var getMinTransferableAmountInternal = /*#__PURE__*/function () {
7992
8140
  _context3.n = 3;
7993
8141
  return Promise.all(assets.map(/*#__PURE__*/function () {
7994
8142
  var _ref3 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee(asset, index) {
7995
- var destAsset, destBalance, destEd, paysOriginInSendingAsset, originFee, originChainAsset, hopFeeTotal, destinationFee, edComponent;
8143
+ var destAsset, destBalance, destEd, isOriginFeeAsset, originFee, originChainAsset, hopFeeTotal, destinationFee, edComponent;
7996
8144
  return _regenerator().w(function (_context) {
7997
8145
  while (1) switch (_context.n) {
7998
8146
  case 0:
@@ -8007,8 +8155,8 @@ var getMinTransferableAmountInternal = /*#__PURE__*/function () {
8007
8155
  case 1:
8008
8156
  destBalance = _context.v;
8009
8157
  destEd = BigInt(destAsset.existentialDeposit);
8010
- paysOriginInSendingAsset = !resolvedFeeAsset && isAssetEqual(nativeAssetInfo, asset) || resolvedFeeAsset && isAssetEqual(resolvedFeeAsset, asset);
8011
- originFee = result.origin && paysOriginInSendingAsset && isAssetEqual(result.origin.asset, asset) ? result.origin.fee : 0n;
8158
+ isOriginFeeAsset = usesOriginFeeAsset(api, origin, currency, asset, resolvedFeeAsset, result.origin.asset);
8159
+ originFee = isOriginFeeAsset ? result.origin.fee : 0n;
8012
8160
  originChainAsset = {
8013
8161
  chain: origin,
8014
8162
  asset: asset
@@ -8326,119 +8474,6 @@ var getTransferableAmount = /*#__PURE__*/function () {
8326
8474
  };
8327
8475
  }();
8328
8476
 
8329
- var isAssetSufficient = /*#__PURE__*/function () {
8330
- var _ref = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee(api, chain, asset) {
8331
- var pallets, _state$isSufficient, state;
8332
- return _regenerator().w(function (_context) {
8333
- while (1) switch (_context.p = _context.n) {
8334
- case 0:
8335
- pallets = getOtherAssetsPallets(chain, api._customCtx);
8336
- if (!(asset.isNative || pallets.length === 0)) {
8337
- _context.n = 1;
8338
- break;
8339
- }
8340
- return _context.a(2, true);
8341
- case 1:
8342
- _context.p = 1;
8343
- _context.n = 2;
8344
- return getPalletInstance(pickOtherMintPallet(asset, pallets)).getAssetState(api, asset);
8345
- case 2:
8346
- state = _context.v;
8347
- return _context.a(2, (_state$isSufficient = state === null || state === void 0 ? void 0 : state.isSufficient) !== null && _state$isSufficient !== void 0 ? _state$isSufficient : true);
8348
- case 3:
8349
- _context.p = 3;
8350
- _context.v;
8351
- return _context.a(2, true);
8352
- }
8353
- }, _callee, null, [[1, 3]]);
8354
- }));
8355
- return function isAssetSufficient(_x, _x2, _x3) {
8356
- return _ref.apply(this, arguments);
8357
- };
8358
- }();
8359
-
8360
- var resolveEdDeposit = /*#__PURE__*/function () {
8361
- var _ref2 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee(_ref) {
8362
- var _overriddenAsset$map;
8363
- var origin, _ref$dest, destApi, destChain, assetInfo, overriddenAsset, feeAssetLocation, recipient, nativeAsset, nativeLocation, feeLocation, isFeeNative, _yield$destApi$queryS, providers, destAssets, sufficiency, ed, feeAmount;
8364
- return _regenerator().w(function (_context) {
8365
- while (1) switch (_context.n) {
8366
- case 0:
8367
- origin = _ref.origin, _ref$dest = _ref.dest, destApi = _ref$dest.api, destChain = _ref$dest.chain, assetInfo = _ref.assetInfo, overriddenAsset = _ref.overriddenAsset, feeAssetLocation = _ref.feeAssetLocation, recipient = _ref.recipient;
8368
- if (!(isExternalChain(destChain) || typeof recipient !== 'string')) {
8369
- _context.n = 1;
8370
- break;
8371
- }
8372
- return _context.a(2, undefined);
8373
- case 1:
8374
- nativeAsset = destApi.findNativeAssetInfoOrThrow(destChain);
8375
- nativeLocation = origin.api.localizeLocation(destChain, nativeAsset.location);
8376
- feeLocation = origin.api.localizeLocation(destChain, feeAssetLocation, origin.chain);
8377
- isFeeNative = deepEqual(feeLocation, nativeLocation);
8378
- if (!(!isFeeNative && !destChain.startsWith('AssetHub'))) {
8379
- _context.n = 2;
8380
- break;
8381
- }
8382
- return _context.a(2, undefined);
8383
- case 2:
8384
- _context.n = 3;
8385
- return destApi.queryState({
8386
- module: 'System',
8387
- method: 'Account',
8388
- params: [recipient]
8389
- });
8390
- case 3:
8391
- _yield$destApi$queryS = _context.v;
8392
- providers = _yield$destApi$queryS.providers;
8393
- if (!(providers > 0)) {
8394
- _context.n = 4;
8395
- break;
8396
- }
8397
- return _context.a(2, undefined);
8398
- case 4:
8399
- destAssets = ((_overriddenAsset$map = overriddenAsset === null || overriddenAsset === void 0 ? void 0 : overriddenAsset.map(function (asset) {
8400
- return extractAssetLocation(asset);
8401
- })) !== null && _overriddenAsset$map !== void 0 ? _overriddenAsset$map : [assetInfo.location]).map(function (location) {
8402
- return origin.api.findAssetOnDestOrThrow(origin.chain, destChain, {
8403
- location: location
8404
- });
8405
- });
8406
- _context.n = 5;
8407
- return Promise.all(destAssets.map(function (asset) {
8408
- return isAssetSufficient(destApi, destChain, asset);
8409
- }));
8410
- case 5:
8411
- sufficiency = _context.v;
8412
- if (!sufficiency.every(Boolean)) {
8413
- _context.n = 6;
8414
- break;
8415
- }
8416
- return _context.a(2, undefined);
8417
- case 6:
8418
- ed = BigInt(nativeAsset.existentialDeposit);
8419
- if (!isFeeNative) {
8420
- _context.n = 7;
8421
- break;
8422
- }
8423
- return _context.a(2, ed);
8424
- case 7:
8425
- _context.n = 8;
8426
- return destApi.queryRuntimeApi({
8427
- module: 'AssetConversionApi',
8428
- method: 'quote_price_tokens_for_exact_tokens',
8429
- params: [feeLocation, nativeLocation, ed, true]
8430
- });
8431
- case 8:
8432
- feeAmount = _context.v;
8433
- return _context.a(2, feeAmount == null ? undefined : padValueBy(BigInt(feeAmount), FEE_PADDING));
8434
- }
8435
- }, _callee);
8436
- }));
8437
- return function resolveEdDeposit(_x) {
8438
- return _ref2.apply(this, arguments);
8439
- };
8440
- }();
8441
-
8442
8477
  var PINK_LOCATION = {
8443
8478
  parents: 1,
8444
8479
  interior: {
@@ -9609,7 +9644,7 @@ var createBaseExecuteXcm = function createBaseExecuteXcm(options) {
9609
9644
  var hopFeeAssetToReserve = isReserveDest ? feeAssetLocalizedToDest : feeAssetLocalizedToReserve;
9610
9645
  // When fees are paid in a separate asset, originFee is denominated in that asset's
9611
9646
  // currency and must not be subtracted from the transfer amount.
9612
- var originFeeDeduction = feeAsset ? 0n : originFee;
9647
+ var originFeeDeduction = feeAssetInfo && !feeAsset ? originFee : 0n;
9613
9648
  var destLocation = createDestination(api, version, chain, destChain, paraIdTo);
9614
9649
  if (chain !== 'AssetHubPolkadot' && reserveChain === undefined) {
9615
9650
  throw new UnsupportedOperationError('Sending local reserve assets with custom fee asset is not yet supported for this chain.');
@@ -9688,7 +9723,7 @@ var createBaseExecuteXcm = function createBaseExecuteXcm(options) {
9688
9723
  reserve: getChainLocation(chain, reserveChain, api._customCtx),
9689
9724
  xcm: [].concat(_toConsumableArray(createBuyExecution(// Decrease amount by 2 units because for some reason polkadot withdraws 2 units less
9690
9725
  // than requested, so we need to account for that
9691
- hopFeeAssetToReserve !== null && hopFeeAssetToReserve !== void 0 ? hopFeeAssetToReserve : updateAsset(assetLocalizedToReserve, amount - 2n))), _toConsumableArray(createReserveToDestXcm()))
9726
+ hopFeeAssetToReserve !== null && hopFeeAssetToReserve !== void 0 ? hopFeeAssetToReserve : updateAsset(assetLocalizedToReserve, amount - originFeeDeduction - 2n))), _toConsumableArray(createReserveToDestXcm()))
9692
9727
  }
9693
9728
  }];
9694
9729
  break;
@@ -9717,6 +9752,7 @@ xcm, maxWeight) {
9717
9752
  var prepareCommonExecuteXcm = function prepareCommonExecuteXcm(options, assetToDeposit) {
9718
9753
  var depositFeeAsset = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
9719
9754
  var api = options.api,
9755
+ feeAssetInfo = options.feeAssetInfo,
9720
9756
  useJitWithdraw = options.useJitWithdraw,
9721
9757
  recipient = options.recipient,
9722
9758
  version = options.version,
@@ -9730,8 +9766,8 @@ var prepareCommonExecuteXcm = function prepareCommonExecuteXcm(options, assetToD
9730
9766
  prefix.push({
9731
9767
  WithdrawAsset: withdrawAssets
9732
9768
  });
9733
- if (feeAssetLocalized && !useJitWithdraw) {
9734
- prefix.push.apply(prefix, _toConsumableArray(createBuyExecution(feeAssetLocalized, MIN_WEIGHT)));
9769
+ if (feeAssetInfo && !useJitWithdraw) {
9770
+ prefix.push.apply(prefix, _toConsumableArray(createBuyExecution(feeAssetLocalized !== null && feeAssetLocalized !== void 0 ? feeAssetLocalized : assetLocalized, MIN_WEIGHT)));
9735
9771
  } else {
9736
9772
  prefix.push({
9737
9773
  SetFeesMode: {
@@ -9800,7 +9836,7 @@ var FEE_PADDING_PERCENTAGE$1 = 40;
9800
9836
  var handleExecuteTransfer = /*#__PURE__*/function () {
9801
9837
  var _ref = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee(options) {
9802
9838
  var _dryRunResult$hops$at;
9803
- var api, chain, sender, paraIdTo, destChain, assetInfo, currency, feeCurrency, recipient, feeAssetInfo, version, transactOptions, checkAmount, resolvedFeeAssetInfo, destApi, edDeposit, internalOptions, FEE_ASSET_AMOUNT, feeAssetAmount, hopFeeAmount, call, dryRunResult, originFee, reserveFee, destFee, xcm, weight, _t, _t2;
9839
+ var api, chain, sender, paraIdTo, destChain, assetInfo, currency, feeCurrency, recipient, feeAssetInfo, version, transactOptions, checkAmount, resolvedFeeAssetInfo, destApi, edDeposit, internalOptions, FEE_ASSET_AMOUNT, feeAssetAmount, call, dryRunResult, originFee, reserveFee, destFee, xcm, weight, _t, _t2;
9804
9840
  return _regenerator().w(function (_context) {
9805
9841
  while (1) switch (_context.n) {
9806
9842
  case 0:
@@ -9863,16 +9899,15 @@ var handleExecuteTransfer = /*#__PURE__*/function () {
9863
9899
  edDeposit: edDeposit
9864
9900
  }; // We mint 1000 units of feeAsset and use 100
9865
9901
  FEE_ASSET_AMOUNT = 100;
9866
- feeAssetAmount = feeAssetInfo ? parseUnits(FEE_ASSET_AMOUNT.toString(), feeAssetInfo.decimals) : MIN_FEE;
9867
- hopFeeAmount = resolvedFeeAssetInfo ? feeAssetAmount : MIN_FEE;
9902
+ feeAssetAmount = resolvedFeeAssetInfo ? parseUnits(FEE_ASSET_AMOUNT.toString(), resolvedFeeAssetInfo.decimals) : MIN_FEE;
9868
9903
  _t = createExecuteCall;
9869
9904
  _t2 = chain;
9870
9905
  _context.n = 6;
9871
9906
  return createDirectExecuteXcm(_objectSpread2(_objectSpread2({}, internalOptions), {}, {
9872
9907
  fees: {
9873
9908
  originFee: feeAssetAmount,
9874
- reserveFee: hopFeeAmount,
9875
- destFee: hopFeeAmount
9909
+ reserveFee: feeAssetAmount,
9910
+ destFee: feeAssetAmount
9876
9911
  }
9877
9912
  }));
9878
9913
  case 6:
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@paraspell/sdk-core",
3
- "version": "14.5.1",
3
+ "version": "14.5.2",
4
4
  "description": "SDK core for ParaSpell XCM/XCMP tool for developers",
5
5
  "repository": {
6
6
  "type": "git",
@@ -23,9 +23,9 @@
23
23
  ],
24
24
  "dependencies": {
25
25
  "@noble/hashes": "^2.4.0",
26
- "@paraspell/assets": "14.5.1",
27
- "@paraspell/pallets": "14.5.1",
28
- "@paraspell/sdk-common": "14.5.1",
26
+ "@paraspell/assets": "14.5.2",
27
+ "@paraspell/pallets": "14.5.2",
28
+ "@paraspell/sdk-common": "14.5.2",
29
29
  "@scure/base": "^2.4.0",
30
30
  "viem": "^2.57.13"
31
31
  },