@subwallet/extension-base 1.2.23-0 → 1.2.24-1

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.
Files changed (97) hide show
  1. package/background/KoniTypes.d.ts +14 -0
  2. package/cjs/constants/index.js +4 -1
  3. package/cjs/core/substrate/assets-pallet.js +35 -0
  4. package/cjs/core/substrate/foreign-asset-pallet.js +13 -3
  5. package/cjs/core/substrate/nominationpools-pallet.js +4 -6
  6. package/cjs/core/substrate/ormlTokens-pallet.js +24 -0
  7. package/cjs/core/substrate/system-pallet.js +16 -18
  8. package/cjs/core/substrate/tokens-pallet.js +24 -0
  9. package/cjs/core/substrate/types.js +19 -0
  10. package/cjs/core/substrate/xcm-parser.js +16 -2
  11. package/cjs/core/utils.js +31 -0
  12. package/cjs/koni/background/cron.js +10 -0
  13. package/cjs/koni/background/handlers/Extension.js +61 -5
  14. package/cjs/koni/background/handlers/State.js +3 -0
  15. package/cjs/packageInfo.js +1 -1
  16. package/cjs/services/balance-service/helpers/subscribe/substrate/equilibrium.js +2 -2
  17. package/cjs/services/balance-service/helpers/subscribe/substrate/index.js +120 -133
  18. package/cjs/services/balance-service/transfer/xcm/index.js +2 -1
  19. package/cjs/services/balance-service/transfer/xcm/polkadotXcm.js +1 -1
  20. package/cjs/services/balance-service/transfer/xcm/utils.js +3 -2
  21. package/cjs/services/chain-service/constants.js +1 -1
  22. package/cjs/services/chain-service/handler/SubstrateApi.js +128 -34
  23. package/cjs/services/chain-service/handler/SubstrateChainHandler.js +26 -9
  24. package/cjs/services/chain-service/utils/index.js +5 -0
  25. package/cjs/services/migration-service/scripts/MigrateLedgerAccountV2.js +3 -3
  26. package/cjs/services/mkt-campaign-service/index.js +284 -0
  27. package/cjs/services/mkt-campaign-service/types.js +17 -0
  28. package/cjs/services/storage-service/DatabaseService.js +115 -0
  29. package/cjs/services/storage-service/db-stores/Balance.js +6 -0
  30. package/cjs/services/storage-service/db-stores/Crowdloan.js +8 -0
  31. package/cjs/services/storage-service/db-stores/Nft.js +12 -0
  32. package/cjs/services/storage-service/db-stores/NftCollection.js +11 -0
  33. package/cjs/services/storage-service/db-stores/YieldPositionStore.js +6 -0
  34. package/constants/index.d.ts +1 -0
  35. package/constants/index.js +1 -0
  36. package/core/substrate/assets-pallet.d.ts +4 -0
  37. package/core/substrate/assets-pallet.js +28 -0
  38. package/core/substrate/foreign-asset-pallet.d.ts +4 -8
  39. package/core/substrate/foreign-asset-pallet.js +13 -3
  40. package/core/substrate/nominationpools-pallet.d.ts +4 -10
  41. package/core/substrate/nominationpools-pallet.js +4 -5
  42. package/core/substrate/ormlTokens-pallet.d.ts +4 -0
  43. package/core/substrate/ormlTokens-pallet.js +17 -0
  44. package/core/substrate/system-pallet.d.ts +4 -24
  45. package/core/substrate/system-pallet.js +16 -21
  46. package/core/substrate/tokens-pallet.d.ts +5 -0
  47. package/core/substrate/tokens-pallet.js +16 -0
  48. package/core/substrate/types.d.ts +43 -0
  49. package/core/substrate/types.js +12 -0
  50. package/core/substrate/xcm-parser.d.ts +1 -0
  51. package/core/substrate/xcm-parser.js +15 -2
  52. package/core/utils.d.ts +4 -0
  53. package/core/utils.js +23 -0
  54. package/koni/api/staking/bonding/relayChain.d.ts +1 -1
  55. package/koni/background/cron.d.ts +1 -0
  56. package/koni/background/cron.js +11 -1
  57. package/koni/background/handlers/Extension.d.ts +3 -0
  58. package/koni/background/handlers/Extension.js +61 -5
  59. package/koni/background/handlers/State.d.ts +4 -2
  60. package/koni/background/handlers/State.js +3 -0
  61. package/package.json +41 -6
  62. package/packageInfo.js +1 -1
  63. package/services/balance-service/helpers/subscribe/substrate/equilibrium.js +2 -2
  64. package/services/balance-service/helpers/subscribe/substrate/index.js +109 -121
  65. package/services/balance-service/transfer/xcm/index.d.ts +1 -1
  66. package/services/balance-service/transfer/xcm/index.js +2 -1
  67. package/services/balance-service/transfer/xcm/polkadotXcm.js +1 -1
  68. package/services/balance-service/transfer/xcm/utils.d.ts +1 -1
  69. package/services/balance-service/transfer/xcm/utils.js +3 -2
  70. package/services/chain-service/constants.js +1 -1
  71. package/services/chain-service/handler/SubstrateApi.d.ts +5 -7
  72. package/services/chain-service/handler/SubstrateApi.js +128 -35
  73. package/services/chain-service/handler/SubstrateChainHandler.d.ts +5 -6
  74. package/services/chain-service/handler/SubstrateChainHandler.js +26 -9
  75. package/services/chain-service/index.d.ts +3 -3
  76. package/services/chain-service/types.d.ts +22 -5
  77. package/services/chain-service/utils/index.d.ts +1 -0
  78. package/services/chain-service/utils/index.js +3 -0
  79. package/services/earning-service/handlers/nomination-pool/index.d.ts +1 -1
  80. package/services/migration-service/scripts/MigrateLedgerAccountV2.js +3 -3
  81. package/services/mkt-campaign-service/index.d.ts +30 -0
  82. package/services/mkt-campaign-service/index.js +275 -0
  83. package/services/mkt-campaign-service/types.d.ts +107 -0
  84. package/services/mkt-campaign-service/types.js +11 -0
  85. package/services/storage-service/DatabaseService.d.ts +5 -0
  86. package/services/storage-service/DatabaseService.js +116 -1
  87. package/services/storage-service/db-stores/Balance.d.ts +2 -0
  88. package/services/storage-service/db-stores/Balance.js +6 -0
  89. package/services/storage-service/db-stores/Crowdloan.d.ts +2 -0
  90. package/services/storage-service/db-stores/Crowdloan.js +8 -0
  91. package/services/storage-service/db-stores/Nft.d.ts +2 -0
  92. package/services/storage-service/db-stores/Nft.js +12 -0
  93. package/services/storage-service/db-stores/NftCollection.d.ts +1 -0
  94. package/services/storage-service/db-stores/NftCollection.js +11 -0
  95. package/services/storage-service/db-stores/YieldPositionStore.d.ts +2 -0
  96. package/services/storage-service/db-stores/YieldPositionStore.js +6 -0
  97. package/types/balance/index.d.ts +2 -3
@@ -4,17 +4,19 @@
4
4
  import { _AssetType } from '@subwallet/chain-list/types';
5
5
  import { APIItemState } from '@subwallet/extension-base/background/KoniTypes';
6
6
  import { SUB_TOKEN_REFRESH_BALANCE_INTERVAL } from '@subwallet/extension-base/constants';
7
+ import { _getAssetsPalletLockedBalance, _getAssetsPalletTransferable } from '@subwallet/extension-base/core/substrate/assets-pallet';
7
8
  import { _getForeignAssetPalletLockedBalance, _getForeignAssetPalletTransferable } from '@subwallet/extension-base/core/substrate/foreign-asset-pallet';
8
9
  import { _getTotalStakeInNominationPool } from '@subwallet/extension-base/core/substrate/nominationpools-pallet';
10
+ import { _getOrmlTokensPalletLockedBalance, _getOrmlTokensPalletTransferable } from '@subwallet/extension-base/core/substrate/ormlTokens-pallet';
9
11
  import { _getSystemPalletTotalBalance, _getSystemPalletTransferable } from '@subwallet/extension-base/core/substrate/system-pallet';
12
+ import { _getTokensPalletLocked, _getTokensPalletTransferable } from '@subwallet/extension-base/core/substrate/tokens-pallet';
13
+ import { _adaptX1Interior } from '@subwallet/extension-base/core/substrate/xcm-parser';
10
14
  import { getPSP22ContractPromise } from '@subwallet/extension-base/koni/api/contract-handler/wasm';
11
15
  import { getDefaultWeightV2 } from '@subwallet/extension-base/koni/api/contract-handler/wasm/utils';
12
16
  import { _BALANCE_CHAIN_GROUP, _MANTA_ZK_CHAIN_GROUP, _ZK_ASSET_PREFIX } from '@subwallet/extension-base/services/chain-service/constants';
13
- import { _checkSmartContractSupportByChain, _getChainExistentialDeposit, _getChainNativeTokenSlug, _getContractAddressOfToken, _getTokenOnChainAssetId, _getTokenOnChainInfo, _getTokenTypesSupportedByChain, _getXcmAssetMultilocation, _isBridgedToken, _isChainEvmCompatible, _isSubstrateRelayChain } from '@subwallet/extension-base/services/chain-service/utils';
17
+ import { _checkSmartContractSupportByChain, _getAssetExistentialDeposit, _getChainExistentialDeposit, _getChainNativeTokenSlug, _getContractAddressOfToken, _getTokenOnChainAssetId, _getTokenOnChainInfo, _getTokenTypesSupportedByChain, _getXcmAssetMultilocation, _isBridgedToken, _isChainEvmCompatible } from '@subwallet/extension-base/services/chain-service/utils';
14
18
  import { filterAssetsByChainAndType } from '@subwallet/extension-base/utils';
15
19
  import BigN from 'bignumber.js';
16
- import { combineLatest, Observable } from 'rxjs';
17
- import { BN, BN_ZERO } from '@polkadot/util';
18
20
  import { subscribeERC20Interval } from "../evm.js";
19
21
  import { subscribeEquilibriumTokenBalance } from "./equilibrium.js";
20
22
  import { subscribeGRC20Balance, subscribeVftBalance } from "./gear.js";
@@ -36,7 +38,7 @@ export const subscribeSubstrateBalance = async (addresses, chainInfo, assetMap,
36
38
  };
37
39
  const substrateParams = {
38
40
  ...baseParams,
39
- substrateApi: substrateApi.api
41
+ substrateApi
40
42
  };
41
43
  if (!_BALANCE_CHAIN_GROUP.kintsugi.includes(chain) && !_BALANCE_CHAIN_GROUP.genshiro.includes(chain) && !_BALANCE_CHAIN_GROUP.equilibrium_parachain.includes(chain)) {
42
44
  unsubNativeToken = await subscribeWithSystemAccountPallet(substrateParams);
@@ -110,42 +112,34 @@ const subscribeWithSystemAccountPallet = async ({
110
112
  extrinsicType,
111
113
  substrateApi
112
114
  }) => {
113
- const chainNativeTokenSlug = _getChainNativeTokenSlug(chainInfo);
114
- const balanceSubscribe = substrateApi.rx.query.system.account.multi(addresses);
115
- let poolSubscribe; // add points in nomination pool back to user's balance
116
-
117
- if (_isSubstrateRelayChain(chainInfo) && substrateApi.query.nominationPools) {
118
- var _substrateApi$rx$quer;
119
- poolSubscribe = (_substrateApi$rx$quer = substrateApi.rx.query.nominationPools.poolMembers) === null || _substrateApi$rx$quer === void 0 ? void 0 : _substrateApi$rx$quer.multi(addresses);
120
- }
121
- if (!poolSubscribe) {
122
- poolSubscribe = new Observable(subscriber => {
123
- subscriber.next(addresses.map(() => ({
124
- toPrimitive() {
125
- return null;
126
- }
127
- })));
128
- });
129
- }
130
- const subscription = combineLatest({
131
- balances: balanceSubscribe,
132
- poolMemberInfos: poolSubscribe
133
- }).subscribe(({
134
- balances,
135
- poolMemberInfos
136
- }) => {
115
+ const systemAccountKey = 'query_system_account';
116
+ const poolMembersKey = 'query_nominationPools_poolMembers';
117
+ const params = [{
118
+ section: 'query',
119
+ module: systemAccountKey.split('_')[1],
120
+ method: systemAccountKey.split('_')[2],
121
+ args: addresses
122
+ }, {
123
+ section: 'query',
124
+ module: poolMembersKey.split('_')[1],
125
+ method: poolMembersKey.split('_')[2],
126
+ args: addresses
127
+ }];
128
+ const subscription = substrateApi.subscribeDataWithMulti(params, rs => {
129
+ const balances = rs[systemAccountKey];
130
+ const poolMemberInfos = rs[poolMembersKey];
137
131
  const items = balances.map((_balance, index) => {
138
- const balanceInfo = _balance.toPrimitive();
139
- const poolMemberInfo = poolMemberInfos[index].toPrimitive();
140
- const nominationPoolBalance = poolMemberInfo ? _getTotalStakeInNominationPool(poolMemberInfo) : new BigN(0);
132
+ const balanceInfo = _balance;
133
+ const poolMemberInfo = poolMemberInfos[index];
134
+ const nominationPoolBalance = poolMemberInfo ? _getTotalStakeInNominationPool(poolMemberInfo) : BigInt(0);
141
135
  const transferableBalance = _getSystemPalletTransferable(balanceInfo, _getChainExistentialDeposit(chainInfo), extrinsicType);
142
136
  const totalBalance = _getSystemPalletTotalBalance(balanceInfo);
143
- const totalLockedFromTransfer = new BigN(totalBalance).minus(transferableBalance).plus(nominationPoolBalance);
137
+ const totalLockedFromTransfer = totalBalance - transferableBalance + nominationPoolBalance;
144
138
  return {
145
139
  address: addresses[index],
146
- tokenSlug: chainNativeTokenSlug,
147
- free: transferableBalance,
148
- locked: totalLockedFromTransfer.toFixed(),
140
+ tokenSlug: _getChainNativeTokenSlug(chainInfo),
141
+ free: transferableBalance.toString(),
142
+ locked: totalLockedFromTransfer.toString(),
149
143
  state: APIItemState.READY,
150
144
  metadata: balanceInfo
151
145
  };
@@ -161,25 +155,31 @@ const subscribeForeignAssetBalance = async ({
161
155
  assetMap,
162
156
  callback,
163
157
  chainInfo,
158
+ extrinsicType,
164
159
  substrateApi
165
160
  }) => {
166
- const chain = chainInfo.slug;
167
- const tokenMap = filterAssetsByChainAndType(assetMap, chain, [_AssetType.LOCAL]);
168
-
169
- // @ts-ignore
170
- const unsubList = await Promise.all(Object.values(tokenMap).map(async tokenInfo => {
161
+ const foreignAssetsAccountKey = 'query_foreignAssets_account';
162
+ const tokenMap = filterAssetsByChainAndType(assetMap, chainInfo.slug, [_AssetType.LOCAL]);
163
+ const unsubList = await Promise.all(Object.values(tokenMap).map(tokenInfo => {
171
164
  try {
172
- const isBridgedToken = _isBridgedToken(tokenInfo);
173
- if (isBridgedToken) {
174
- const assetLocation = _getTokenOnChainInfo(tokenInfo) || _getXcmAssetMultilocation(tokenInfo);
175
- return await substrateApi.query.foreignAssets.account.multi(addresses.map(address => [assetLocation, address]), balances => {
176
- const items = balances.map((balance, index) => {
177
- const accountInfo = balance === null || balance === void 0 ? void 0 : balance.toPrimitive();
165
+ if (_isBridgedToken(tokenInfo)) {
166
+ const params = [{
167
+ section: 'query',
168
+ module: foreignAssetsAccountKey.split('_')[1],
169
+ method: foreignAssetsAccountKey.split('_')[2],
170
+ args: addresses.map(address => [_getTokenOnChainInfo(tokenInfo) || _adaptX1Interior(_getXcmAssetMultilocation(tokenInfo), 3), address])
171
+ }];
172
+ return substrateApi.subscribeDataWithMulti(params, rs => {
173
+ const balances = rs[foreignAssetsAccountKey];
174
+ const items = balances.map((_balance, index) => {
175
+ const balanceInfo = _balance;
176
+ const transferableBalance = _getForeignAssetPalletTransferable(balanceInfo, _getAssetExistentialDeposit(tokenInfo), extrinsicType);
177
+ const totalLockedFromTransfer = _getForeignAssetPalletLockedBalance(balanceInfo);
178
178
  return {
179
179
  address: addresses[index],
180
180
  tokenSlug: tokenInfo.slug,
181
- free: accountInfo ? _getForeignAssetPalletTransferable(accountInfo).toString() : '0',
182
- locked: accountInfo ? _getForeignAssetPalletLockedBalance(accountInfo).toString() : '0',
181
+ free: transferableBalance.toString(),
182
+ locked: totalLockedFromTransfer.toString(),
183
183
  state: APIItemState.READY
184
184
  };
185
185
  });
@@ -193,7 +193,7 @@ const subscribeForeignAssetBalance = async ({
193
193
  }));
194
194
  return () => {
195
195
  unsubList.forEach(unsub => {
196
- unsub && unsub();
196
+ unsub && unsub.unsubscribe();
197
197
  });
198
198
  };
199
199
  };
@@ -217,7 +217,7 @@ const subscribePSP22Balance = ({
217
217
  const psp22ContractMap = {};
218
218
  const tokenList = filterAssetsByChainAndType(assetMap, chain, [_AssetType.PSP22]);
219
219
  Object.entries(tokenList).forEach(([slug, tokenInfo]) => {
220
- psp22ContractMap[slug] = getPSP22ContractPromise(substrateApi, _getContractAddressOfToken(tokenInfo));
220
+ psp22ContractMap[slug] = getPSP22ContractPromise(substrateApi.api, _getContractAddressOfToken(tokenInfo));
221
221
  });
222
222
  const getTokenBalances = () => {
223
223
  Object.values(tokenList).map(async tokenInfo => {
@@ -227,7 +227,7 @@ const subscribePSP22Balance = ({
227
227
  try {
228
228
  var _balanceOf$output;
229
229
  const _balanceOf = await contract.query['psp22::balanceOf'](address, {
230
- gasLimit: getDefaultWeightV2(substrateApi)
230
+ gasLimit: getDefaultWeightV2(substrateApi.api)
231
231
  }, address);
232
232
  const balanceObj = _balanceOf === null || _balanceOf === void 0 ? void 0 : (_balanceOf$output = _balanceOf.output) === null || _balanceOf$output === void 0 ? void 0 : _balanceOf$output.toPrimitive();
233
233
  const freeResponse = extractOkResponse(balanceObj);
@@ -268,35 +268,33 @@ const subscribeTokensAccountsPallet = async ({
268
268
  assetMap,
269
269
  callback,
270
270
  chainInfo,
271
+ extrinsicType,
271
272
  includeNativeToken,
272
273
  substrateApi
273
274
  }) => {
274
- const chain = chainInfo.slug;
275
+ const tokensAccountsKey = 'query_tokens_accounts';
275
276
  const tokenTypes = includeNativeToken ? [_AssetType.NATIVE, _AssetType.LOCAL] : [_AssetType.LOCAL];
276
- const tokenMap = filterAssetsByChainAndType(assetMap, chain, tokenTypes);
277
- const unsubList = await Promise.all(Object.values(tokenMap).map(async tokenInfo => {
277
+ const tokenMap = filterAssetsByChainAndType(assetMap, chainInfo.slug, tokenTypes);
278
+ const unsubList = await Promise.all(Object.values(tokenMap).map(tokenInfo => {
278
279
  try {
279
- const onChainInfo = _getTokenOnChainInfo(tokenInfo);
280
- const assetId = _getTokenOnChainAssetId(tokenInfo);
281
-
282
- // Get Token Balance
283
- // @ts-ignore
284
- return await substrateApi.query.tokens.accounts.multi(addresses.map(address => [address, onChainInfo || assetId]), balances => {
285
- const items = balances.map((balance, index) => {
286
- const tokenBalance = {
287
- reserved: balance.reserved || new BN(0),
288
- frozen: balance.frozen || new BN(0),
289
- free: balance.free || new BN(0) // free is actually total balance
290
- };
291
-
292
- const freeBalance = tokenBalance.free.sub(tokenBalance.frozen);
293
- const lockedBalance = tokenBalance.frozen.add(tokenBalance.reserved);
280
+ const params = [{
281
+ section: 'query',
282
+ module: tokensAccountsKey.split('_')[1],
283
+ method: tokensAccountsKey.split('_')[2],
284
+ args: addresses.map(address => [address, _getTokenOnChainInfo(tokenInfo) || _getTokenOnChainAssetId(tokenInfo)])
285
+ }];
286
+ return substrateApi.subscribeDataWithMulti(params, rs => {
287
+ const balances = rs[tokensAccountsKey];
288
+ const items = balances.map((_balance, index) => {
289
+ const balanceInfo = _balance;
290
+ const transferableBalance = _getTokensPalletTransferable(balanceInfo, _getAssetExistentialDeposit(tokenInfo), extrinsicType);
291
+ const totalLockedFromTransfer = _getTokensPalletLocked(balanceInfo);
294
292
  return {
295
293
  address: addresses[index],
296
294
  tokenSlug: tokenInfo.slug,
297
295
  state: APIItemState.READY,
298
- free: freeBalance.toString(),
299
- locked: lockedBalance.toString()
296
+ free: transferableBalance.toString(),
297
+ locked: totalLockedFromTransfer.toString()
300
298
  };
301
299
  });
302
300
  callback(items);
@@ -308,7 +306,7 @@ const subscribeTokensAccountsPallet = async ({
308
306
  }));
309
307
  return () => {
310
308
  unsubList.forEach(unsub => {
311
- unsub && unsub();
309
+ unsub && unsub.unsubscribe();
312
310
  });
313
311
  };
314
312
  };
@@ -317,46 +315,41 @@ const subscribeAssetsAccountPallet = async ({
317
315
  assetMap,
318
316
  callback,
319
317
  chainInfo,
320
- includeNativeToken,
318
+ extrinsicType,
321
319
  substrateApi
322
320
  }) => {
323
- const chain = chainInfo.slug;
324
- const tokenMap = filterAssetsByChainAndType(assetMap, chain, [_AssetType.LOCAL]);
321
+ const assetsAccountKey = 'query_assets_account';
322
+ const tokenMap = filterAssetsByChainAndType(assetMap, chainInfo.slug, [_AssetType.LOCAL]);
325
323
  Object.values(tokenMap).forEach(token => {
326
324
  if (_MANTA_ZK_CHAIN_GROUP.includes(token.originChain) && token.symbol.startsWith(_ZK_ASSET_PREFIX)) {
327
325
  delete tokenMap[token.slug];
328
326
  }
329
327
  });
330
- const unsubList = await Promise.all(Object.values(tokenMap).map(async tokenInfo => {
328
+ const unsubList = await Promise.all(Object.values(tokenMap).map(tokenInfo => {
331
329
  try {
332
330
  const assetIndex = _getTokenOnChainAssetId(tokenInfo);
333
331
  if (assetIndex === '-1') {
334
332
  return undefined;
335
333
  }
334
+ const params = [{
335
+ section: 'query',
336
+ module: assetsAccountKey.split('_')[1],
337
+ method: assetsAccountKey.split('_')[2],
338
+ args: addresses.map(address => [assetIndex, address])
339
+ }];
336
340
 
337
341
  // Get Token Balance
338
- return await substrateApi.query.assets.account.multi(addresses.map(address => [assetIndex, address]), balances => {
339
- const items = balances.map((balance, index) => {
340
- const bdata = balance === null || balance === void 0 ? void 0 : balance.toPrimitive();
341
- let frozen = BN_ZERO;
342
- let total = BN_ZERO;
343
- if (bdata) {
344
- // @ts-ignore
345
- const addressBalance = new BN(String(bdata === null || bdata === void 0 ? void 0 : bdata.balance).replaceAll(',', '') || '0');
346
-
347
- // @ts-ignore
348
- if (bdata !== null && bdata !== void 0 && bdata.isFrozen || ['Blocked', 'Frozen'].includes(bdata === null || bdata === void 0 ? void 0 : bdata.status)) {
349
- // Status 'Frozen' and 'Blocked' are for frozen balance
350
- frozen = addressBalance;
351
- }
352
- total = addressBalance;
353
- }
354
- const free = total.sub(frozen);
342
+ return substrateApi.subscribeDataWithMulti(params, rs => {
343
+ const balances = rs[assetsAccountKey];
344
+ const items = balances.map((_balance, index) => {
345
+ const balanceInfo = _balance;
346
+ const transferableBalance = _getAssetsPalletTransferable(balanceInfo, _getAssetExistentialDeposit(tokenInfo), extrinsicType);
347
+ const totalLockedFromTransfer = _getAssetsPalletLockedBalance(balanceInfo);
355
348
  return {
356
349
  address: addresses[index],
357
350
  tokenSlug: tokenInfo.slug,
358
- free: free.toString(),
359
- locked: frozen.toString(),
351
+ free: transferableBalance.toString(),
352
+ locked: totalLockedFromTransfer.toString(),
360
353
  state: APIItemState.READY
361
354
  };
362
355
  });
@@ -369,7 +362,7 @@ const subscribeAssetsAccountPallet = async ({
369
362
  }));
370
363
  return () => {
371
364
  unsubList.forEach(unsub => {
372
- unsub && unsub();
365
+ unsub && unsub.unsubscribe();
373
366
  });
374
367
  };
375
368
  };
@@ -380,50 +373,45 @@ const subscribeOrmlTokensPallet = async ({
380
373
  assetMap,
381
374
  callback,
382
375
  chainInfo,
376
+ extrinsicType,
383
377
  substrateApi
384
378
  }) => {
385
- const chain = chainInfo.slug;
386
- const tokenTypes = [_AssetType.LOCAL];
387
- const tokenMap = filterAssetsByChainAndType(assetMap, chain, tokenTypes);
388
- const unsubList = Object.values(tokenMap).map(async tokenInfo => {
379
+ const ormlTokensAccountsKey = 'query_ormlTokens_accounts';
380
+ const tokenMap = filterAssetsByChainAndType(assetMap, chainInfo.slug, [_AssetType.LOCAL]);
381
+ const unsubList = Object.values(tokenMap).map(tokenInfo => {
389
382
  try {
390
- const onChainInfo = _getTokenOnChainInfo(tokenInfo);
383
+ const params = [{
384
+ section: 'query',
385
+ module: ormlTokensAccountsKey.split('_')[1],
386
+ method: ormlTokensAccountsKey.split('_')[2],
387
+ args: addresses.map(address => [address, _getTokenOnChainInfo(tokenInfo)])
388
+ }];
391
389
 
392
- // Get Token Balance
393
390
  // @ts-ignore
394
- const unsub = await substrateApi.query.ormlTokens.accounts.multi(addresses.map(address => [address, onChainInfo]), balances => {
395
- const items = balances.map((balance, index) => {
396
- const tokenBalance = {
397
- reserved: balance.reserved || new BN(0),
398
- frozen: balance.frozen || new BN(0),
399
- free: balance.free || new BN(0) // free is actually total balance
400
- };
401
-
402
- // free balance = total balance - frozen misc
403
- // locked balance = reserved + frozen misc
404
- const freeBalance = tokenBalance.free.sub(tokenBalance.frozen);
405
- const lockedBalance = tokenBalance.frozen.add(tokenBalance.reserved);
391
+ return substrateApi.subscribeDataWithMulti(params, rs => {
392
+ const balances = rs[ormlTokensAccountsKey];
393
+ const items = balances.map((_balance, index) => {
394
+ const balanceInfo = _balance;
395
+ const transferableBalance = _getOrmlTokensPalletTransferable(balanceInfo, _getAssetExistentialDeposit(tokenInfo), extrinsicType);
396
+ const totalLockedFromTransfer = _getOrmlTokensPalletLockedBalance(balanceInfo);
406
397
  return {
407
398
  address: addresses[index],
408
399
  tokenSlug: tokenInfo.slug,
409
400
  state: APIItemState.READY,
410
- free: freeBalance.toString(),
411
- locked: lockedBalance.toString()
401
+ free: transferableBalance.toString(),
402
+ locked: totalLockedFromTransfer.toString()
412
403
  };
413
404
  });
414
405
  callback(items);
415
406
  });
416
- return unsub;
417
407
  } catch (err) {
418
408
  console.warn(err);
419
409
  return undefined;
420
410
  }
421
411
  });
422
412
  return () => {
423
- unsubList.forEach(subProm => {
424
- subProm.then(unsub => {
425
- unsub && unsub();
426
- }).catch(console.error);
413
+ unsubList.forEach(unsub => {
414
+ unsub && unsub.unsubscribe();
427
415
  });
428
416
  };
429
417
  };
@@ -17,5 +17,5 @@ declare type CreateSnowBridgeExtrinsicProps = Omit<CreateXcmExtrinsicProps, 'sub
17
17
  };
18
18
  export declare const createSnowBridgeExtrinsic: ({ chainInfoMap, destinationTokenInfo, evmApi, originTokenInfo, recipient, sender, sendingValue }: CreateSnowBridgeExtrinsicProps) => Promise<TransactionConfig>;
19
19
  export declare const createXcmExtrinsic: ({ chainInfoMap, destinationTokenInfo, originTokenInfo, recipient, sendingValue, substrateApi }: CreateXcmExtrinsicProps) => Promise<SubmittableExtrinsic<'promise'>>;
20
- export declare const getXcmMockTxFee: (substrateApi: _SubstrateApi, chainInfoMap: Record<string, _ChainInfo>, address: string, originTokenInfo: _ChainAsset, destinationTokenInfo: _ChainAsset) => Promise<BigN>;
20
+ export declare const getXcmMockTxFee: (substrateApi: _SubstrateApi, chainInfoMap: Record<string, _ChainInfo>, originTokenInfo: _ChainAsset, destinationTokenInfo: _ChainAsset) => Promise<BigN>;
21
21
  export {};
@@ -53,11 +53,12 @@ export const createXcmExtrinsic = async ({
53
53
  }
54
54
  return extrinsic;
55
55
  };
56
- export const getXcmMockTxFee = async (substrateApi, chainInfoMap, address, originTokenInfo, destinationTokenInfo) => {
56
+ export const getXcmMockTxFee = async (substrateApi, chainInfoMap, originTokenInfo, destinationTokenInfo) => {
57
57
  try {
58
58
  var _paymentInfo$partialF;
59
59
  const destChainInfo = chainInfoMap[destinationTokenInfo.originChain];
60
60
  const originChainInfo = chainInfoMap[originTokenInfo.originChain];
61
+ const address = '5DRewsYzhJqZXU3SRaWy1FSt5iDr875ao91aw5fjrJmDG4Ap';
61
62
 
62
63
  // mock receiving account from sender
63
64
  const recipient = !isEthereumAddress(address) && _isChainEvmCompatible(destChainInfo) && !_isChainEvmCompatible(originChainInfo) ? u8aToHex(addressToEvm(address)) : address;
@@ -11,7 +11,7 @@ export function getExtrinsicByPolkadotXcmPallet(tokenInfo, originChainInfo, dest
11
11
  version = 4;
12
12
  method = 'transferAssets';
13
13
  }
14
- if (isUseTeleportProtocol(originChainInfo, destinationChainInfo)) {
14
+ if (isUseTeleportProtocol(originChainInfo, destinationChainInfo, tokenInfo.slug)) {
15
15
  method = 'limitedTeleportAssets';
16
16
  }
17
17
  const weightParam = _getXcmDestWeight(originChainInfo);
@@ -1,3 +1,3 @@
1
1
  import { _ChainInfo } from '@subwallet/chain-list/types';
2
2
  export declare const STABLE_XCM_VERSION = 3;
3
- export declare function isUseTeleportProtocol(originChainInfo: _ChainInfo, destChainInfo: _ChainInfo): boolean;
3
+ export declare function isUseTeleportProtocol(originChainInfo: _ChainInfo, destChainInfo: _ChainInfo, tokenSlug?: string): boolean;
@@ -2,8 +2,9 @@
2
2
  // SPDX-License-Identifier: Apache-2.0
3
3
 
4
4
  export const STABLE_XCM_VERSION = 3;
5
- export function isUseTeleportProtocol(originChainInfo, destChainInfo) {
5
+ export function isUseTeleportProtocol(originChainInfo, destChainInfo, tokenSlug) {
6
6
  const relayChainToSystemChain = ['polkadot'].includes(originChainInfo.slug) && ['statemint'].includes(destChainInfo.slug) || ['kusama'].includes(originChainInfo.slug) && ['statemine'].includes(destChainInfo.slug) || ['rococo'].includes(originChainInfo.slug) && ['rococo_assethub'].includes(destChainInfo.slug);
7
7
  const systemChainToRelayChain = ['polkadot'].includes(destChainInfo.slug) && ['statemint'].includes(originChainInfo.slug) || ['kusama'].includes(destChainInfo.slug) && ['statemine'].includes(originChainInfo.slug) || ['rococo'].includes(destChainInfo.slug) && ['rococo_assethub'].includes(originChainInfo.slug);
8
- return relayChainToSystemChain || systemChainToRelayChain;
8
+ const isXcmMythos = originChainInfo.slug === 'mythos' && destChainInfo.slug === 'statemint' && tokenSlug === 'mythos-NATIVE-MYTH' || originChainInfo.slug === 'statemint' && destChainInfo.slug === 'mythos' && tokenSlug === 'statemint-LOCAL-MYTH';
9
+ return relayChainToSystemChain || systemChainToRelayChain || isXcmMythos;
9
10
  }
@@ -256,7 +256,7 @@ export const _DEFAULT_MANTA_ZK_CHAIN = 'calamari';
256
256
  // XCM------------------------------------------------------------------------------------------------------------------
257
257
 
258
258
  export const _XCM_CHAIN_GROUP = {
259
- polkadotXcm: ['astar', 'shiden', 'statemine', 'statemint', 'equilibrium_parachain', 'rococo_assethub'],
259
+ polkadotXcm: ['astar', 'shiden', 'statemine', 'statemint', 'equilibrium_parachain', 'rococo_assethub', 'mythos'],
260
260
  xcmPallet: ['polkadot', 'kusama', 'rococo']
261
261
  // default is xTokens pallet
262
262
  };
@@ -1,12 +1,11 @@
1
1
  import '@polkadot/types-augment';
2
2
  import { MetadataItem } from '@subwallet/extension-base/background/KoniTypes';
3
3
  import { _ApiOptions } from '@subwallet/extension-base/services/chain-service/handler/types';
4
- import { _ChainConnectionStatus, _SubstrateApi, _SubstrateDefaultFormatBalance } from '@subwallet/extension-base/services/chain-service/types';
5
- import { BehaviorSubject } from 'rxjs';
4
+ import { _ChainConnectionStatus, _SubstrateAdapterQueryArgs, _SubstrateAdapterSubscriptionArgs, _SubstrateApi } from '@subwallet/extension-base/services/chain-service/types';
5
+ import { BehaviorSubject, Subscription } from 'rxjs';
6
6
  import { ApiPromise } from '@polkadot/api';
7
- import { SubmittableExtrinsicFunction } from '@polkadot/api/promise/types';
8
7
  import { ProviderInterface } from '@polkadot/rpc-provider/types';
9
- import { Registry } from '@polkadot/types/types';
8
+ import { AnyJson, Registry } from '@polkadot/types/types';
10
9
  export declare class SubstrateApi implements _SubstrateApi {
11
10
  chainSlug: string;
12
11
  api: ApiPromise;
@@ -25,9 +24,6 @@ export declare class SubstrateApi implements _SubstrateApi {
25
24
  substrateRetry: number;
26
25
  get connectionStatus(): _ChainConnectionStatus;
27
26
  private updateConnectionStatus;
28
- apiDefaultTx?: SubmittableExtrinsicFunction;
29
- apiDefaultTxSudo?: SubmittableExtrinsicFunction;
30
- defaultFormatBalance?: _SubstrateDefaultFormatBalance;
31
27
  registry: Registry;
32
28
  specName: string;
33
29
  specVersion: string;
@@ -48,4 +44,6 @@ export declare class SubstrateApi implements _SubstrateApi {
48
44
  onDisconnect(): void;
49
45
  onError(e: Error): void;
50
46
  fillApiInfo(): Promise<void>;
47
+ makeRpcQuery<T>({ args, method, module, section }: _SubstrateAdapterQueryArgs): Promise<T>;
48
+ subscribeDataWithMulti(params: _SubstrateAdapterSubscriptionArgs[], callback: (rs: Record<string, AnyJson[]>) => void): Subscription;
51
49
  }