@subwallet/extension-base 1.2.3-0 → 1.2.3-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 (72) hide show
  1. package/background/KoniTypes.d.ts +4 -0
  2. package/cjs/core/logic-validation/earning.js +47 -0
  3. package/cjs/core/logic-validation/swap.js +99 -0
  4. package/cjs/core/logic-validation/transfer.js +219 -0
  5. package/cjs/core/substrate/nominationpools-pallet.js +12 -0
  6. package/cjs/core/substrate/system-pallet.js +78 -0
  7. package/cjs/koni/api/dotsama/transfer.js +49 -4
  8. package/cjs/koni/api/staking/bonding/utils.js +1 -1
  9. package/cjs/koni/api/xcm/index.js +30 -2
  10. package/cjs/koni/background/handlers/Extension.js +135 -245
  11. package/cjs/packageInfo.js +1 -1
  12. package/cjs/services/balance-service/helpers/group.js +4 -27
  13. package/cjs/services/balance-service/helpers/subscribe/index.js +2 -30
  14. package/cjs/services/balance-service/helpers/subscribe/substrate/index.js +41 -80
  15. package/cjs/services/balance-service/index.js +11 -9
  16. package/cjs/services/chain-service/index.js +0 -1
  17. package/cjs/services/chain-service/utils/index.js +6 -0
  18. package/cjs/services/earning-service/handlers/base.js +1 -1
  19. package/cjs/services/earning-service/handlers/special.js +11 -12
  20. package/cjs/services/swap-service/handler/base-handler.js +28 -44
  21. package/cjs/services/swap-service/handler/chainflip-handler.js +23 -21
  22. package/cjs/services/swap-service/handler/hydradx-handler.js +40 -38
  23. package/cjs/services/swap-service/index.js +6 -0
  24. package/cjs/services/swap-service/utils.js +8 -49
  25. package/cjs/services/transaction-service/index.js +66 -155
  26. package/core/logic-validation/earning.d.ts +10 -0
  27. package/core/logic-validation/earning.js +37 -0
  28. package/core/logic-validation/swap.d.ts +8 -0
  29. package/core/logic-validation/swap.js +89 -0
  30. package/core/logic-validation/transfer.d.ts +16 -0
  31. package/core/logic-validation/transfer.js +206 -0
  32. package/core/substrate/nominationpools-pallet.d.ts +7 -0
  33. package/core/substrate/nominationpools-pallet.js +6 -0
  34. package/core/substrate/system-pallet.d.ts +27 -0
  35. package/core/substrate/system-pallet.js +71 -0
  36. package/koni/api/dotsama/transfer.d.ts +3 -1
  37. package/koni/api/dotsama/transfer.js +44 -1
  38. package/koni/api/staking/bonding/relayChain.d.ts +2 -1
  39. package/koni/api/staking/bonding/utils.js +1 -1
  40. package/koni/api/xcm/index.d.ts +2 -0
  41. package/koni/api/xcm/index.js +27 -1
  42. package/koni/background/handlers/Extension.d.ts +5 -5
  43. package/koni/background/handlers/Extension.js +111 -221
  44. package/package.json +34 -9
  45. package/packageInfo.js +1 -1
  46. package/services/balance-service/helpers/group.js +4 -27
  47. package/services/balance-service/helpers/subscribe/index.d.ts +2 -1
  48. package/services/balance-service/helpers/subscribe/index.js +2 -30
  49. package/services/balance-service/helpers/subscribe/substrate/index.d.ts +2 -1
  50. package/services/balance-service/helpers/subscribe/substrate/index.js +26 -64
  51. package/services/balance-service/index.d.ts +7 -6
  52. package/services/balance-service/index.js +12 -10
  53. package/services/chain-service/index.js +0 -1
  54. package/services/chain-service/utils/index.d.ts +1 -0
  55. package/services/chain-service/utils/index.js +4 -0
  56. package/services/earning-service/handlers/base.js +1 -1
  57. package/services/earning-service/handlers/nomination-pool/index.d.ts +2 -1
  58. package/services/earning-service/handlers/special.js +11 -12
  59. package/services/swap-service/handler/base-handler.d.ts +3 -2
  60. package/services/swap-service/handler/base-handler.js +26 -42
  61. package/services/swap-service/handler/chainflip-handler.d.ts +2 -1
  62. package/services/swap-service/handler/chainflip-handler.js +4 -2
  63. package/services/swap-service/handler/hydradx-handler.d.ts +2 -1
  64. package/services/swap-service/handler/hydradx-handler.js +7 -5
  65. package/services/swap-service/index.js +7 -1
  66. package/services/swap-service/utils.d.ts +2 -4
  67. package/services/swap-service/utils.js +7 -47
  68. package/services/transaction-service/index.d.ts +1 -1
  69. package/services/transaction-service/index.js +30 -119
  70. package/services/transaction-service/types.d.ts +1 -0
  71. package/types/balance/index.d.ts +6 -10
  72. package/types/yield/info/pallet.d.ts +0 -6
@@ -13,6 +13,6 @@ const packageInfo = {
13
13
  name: '@subwallet/extension-base',
14
14
  path: typeof __dirname === 'string' ? __dirname : 'auto',
15
15
  type: 'cjs',
16
- version: '1.2.3-0'
16
+ version: '1.2.3-1'
17
17
  };
18
18
  exports.packageInfo = packageInfo;
@@ -6,8 +6,7 @@ Object.defineProperty(exports, "__esModule", {
6
6
  });
7
7
  exports.groupBalance = void 0;
8
8
  var _KoniTypes = require("@subwallet/extension-base/background/KoniTypes");
9
- var _utils = require("@subwallet/extension-base/utils");
10
- var _bn = _interopRequireDefault(require("bn.js"));
9
+ var _bignumber = _interopRequireDefault(require("bignumber.js"));
11
10
  // Copyright 2019-2022 @subwallet/extension-base
12
11
  // SPDX-License-Identifier: Apache-2.0
13
12
 
@@ -20,34 +19,12 @@ var _bn = _interopRequireDefault(require("bn.js"));
20
19
  */
21
20
  const groupBalance = (items, address, token) => {
22
21
  const states = items.map(item => item.state);
23
- const result = {
22
+ return {
24
23
  address,
25
24
  tokenSlug: token,
26
- free: (0, _utils.sumBN)(items.map(item => new _bn.default(item.free))).toString(),
27
- locked: (0, _utils.sumBN)(items.map(item => new _bn.default(item.locked))).toString(),
25
+ free: _bignumber.default.sum.apply(null, items.map(item => item.free)).toFixed(),
26
+ locked: _bignumber.default.sum.apply(null, items.map(item => item.locked)).toFixed(),
28
27
  state: states.every(item => item === _KoniTypes.APIItemState.NOT_SUPPORT) ? _KoniTypes.APIItemState.NOT_SUPPORT : states.some(item => item === _KoniTypes.APIItemState.READY) ? _KoniTypes.APIItemState.READY : _KoniTypes.APIItemState.PENDING
29
28
  };
30
- for (const item of items) {
31
- if (item.substrateInfo) {
32
- if (!result.substrateInfo) {
33
- result.substrateInfo = {
34
- ...item.substrateInfo
35
- };
36
- } else {
37
- const old = {
38
- ...result.substrateInfo
39
- };
40
- const _new = {
41
- ...item.substrateInfo
42
- };
43
- result.substrateInfo = {
44
- reserved: new _bn.default(old.reserved || '0').add(new _bn.default(_new.reserved || '0')).toString(),
45
- feeFrozen: new _bn.default(old.feeFrozen || '0').add(new _bn.default(_new.feeFrozen || '0')).toString(),
46
- miscFrozen: new _bn.default(old.miscFrozen || '0').add(new _bn.default(_new.miscFrozen || '0')).toString()
47
- };
48
- }
49
- }
50
- }
51
- return result;
52
29
  };
53
30
  exports.groupBalance = groupBalance;
@@ -75,18 +75,8 @@ const filterAddress = (addresses, chainInfo) => {
75
75
  }
76
76
  };
77
77
 
78
- // interface SubscribeBlanceOptions {
79
- // addresses: string[];
80
- // chains: string[];
81
- // tokens: string[];
82
- // chainInfoMap: Record<string, _ChainInfo>;
83
- // substrateApiMap: Record<string, _SubstrateApi>;
84
- // evmApiMap: Record<string, _EvmApi>;
85
- // callback: (rs: BalanceItem[]) => void;
86
- // }
87
-
88
78
  // main subscription, use for multiple chains, multiple addresses and multiple tokens
89
- function subscribeBalance(addresses, chains, tokens, _chainAssetMap, _chainInfoMap, substrateApiMap, evmApiMap, callback) {
79
+ function subscribeBalance(addresses, chains, tokens, _chainAssetMap, _chainInfoMap, substrateApiMap, evmApiMap, callback, extrinsicType) {
90
80
  // Filter chain and token
91
81
  const chainAssetMap = Object.fromEntries(Object.entries(_chainAssetMap).filter(_ref => {
92
82
  let [token] = _ref;
@@ -126,26 +116,8 @@ function subscribeBalance(addresses, chains, tokens, _chainAssetMap, _chainInfoM
126
116
  evmApi
127
117
  });
128
118
  }
129
-
130
- // if (!useAddresses || useAddresses.length === 0 || _PURE_EVM_CHAINS.indexOf(chainSlug) > -1) {
131
- // const fungibleTokensByChain = state.chainService.getFungibleTokensByChain(chainSlug, true);
132
- // const now = new Date().getTime();
133
- //
134
- // Object.values(fungibleTokensByChain).map((token) => {
135
- // return {
136
- // tokenSlug: token.slug,
137
- // free: '0',
138
- // locked: '0',
139
- // state: APIItemState.READY,
140
- // timestamp: now
141
- // } as BalanceItem;
142
- // }).forEach(callback);
143
- //
144
- // return undefined;
145
- // }
146
-
147
119
  const substrateApi = await substrateApiMap[chainSlug].isReady;
148
- return (0, _substrate.subscribeSubstrateBalance)(useAddresses, chainInfo, chainAssetMap, substrateApi, evmApi, callback);
120
+ return (0, _substrate.subscribeSubstrateBalance)(useAddresses, chainInfo, chainAssetMap, substrateApi, evmApi, callback, extrinsicType);
149
121
  });
150
122
  return () => {
151
123
  unsubList.forEach(subProm => {
@@ -9,6 +9,8 @@ var _api = require("@gear-js/api");
9
9
  var _types = require("@subwallet/chain-list/types");
10
10
  var _KoniTypes = require("@subwallet/extension-base/background/KoniTypes");
11
11
  var _constants = require("@subwallet/extension-base/constants");
12
+ var _nominationpoolsPallet = require("@subwallet/extension-base/core/substrate/nominationpools-pallet");
13
+ var _systemPallet = require("@subwallet/extension-base/core/substrate/system-pallet");
12
14
  var _wasm = require("@subwallet/extension-base/koni/api/tokens/wasm");
13
15
  var _utils = require("@subwallet/extension-base/koni/api/tokens/wasm/utils");
14
16
  var _constants2 = require("@subwallet/extension-base/services/chain-service/constants");
@@ -23,7 +25,7 @@ var _equilibrium = require("./equilibrium");
23
25
  // Copyright 2019-2022 @subwallet/extension-base
24
26
  // SPDX-License-Identifier: Apache-2.0
25
27
 
26
- const subscribeSubstrateBalance = async (addresses, chainInfo, assetMap, substrateApi, evmApi, callback) => {
28
+ const subscribeSubstrateBalance = async (addresses, chainInfo, assetMap, substrateApi, evmApi, callback, extrinsicType) => {
27
29
  let unsubNativeToken;
28
30
  let unsubLocalToken;
29
31
  let unsubEvmContractToken;
@@ -35,7 +37,8 @@ const subscribeSubstrateBalance = async (addresses, chainInfo, assetMap, substra
35
37
  addresses,
36
38
  chainInfo,
37
39
  assetMap,
38
- callback
40
+ callback,
41
+ extrinsicType
39
42
  };
40
43
  const substrateParams = {
41
44
  ...baseParams,
@@ -107,11 +110,13 @@ const subscribeWithSystemAccountPallet = async _ref => {
107
110
  addresses,
108
111
  callback,
109
112
  chainInfo,
113
+ extrinsicType,
110
114
  substrateApi
111
115
  } = _ref;
112
116
  const chainNativeTokenSlug = (0, _utils2._getChainNativeTokenSlug)(chainInfo);
113
117
  const balanceSubscribe = substrateApi.rx.query.system.account.multi(addresses);
114
- let poolSubscribe;
118
+ let poolSubscribe; // add points in nomination pool back to user's balance
119
+
115
120
  if ((0, _utils2._isSubstrateRelayChain)(chainInfo) && substrateApi.query.nominationPools) {
116
121
  var _substrateApi$rx$quer;
117
122
  poolSubscribe = (_substrateApi$rx$quer = substrateApi.rx.query.nominationPools.poolMembers) === null || _substrateApi$rx$quer === void 0 ? void 0 : _substrateApi$rx$quer.multi(addresses);
@@ -127,54 +132,26 @@ const subscribeWithSystemAccountPallet = async _ref => {
127
132
  }
128
133
  const subscription = (0, _rxjs.combineLatest)({
129
134
  balances: balanceSubscribe,
130
- pools: poolSubscribe
135
+ poolMemberInfos: poolSubscribe
131
136
  }).subscribe(_ref2 => {
132
137
  let {
133
- balances: _balances,
134
- pools: poolMemberDatas
138
+ balances,
139
+ poolMemberInfos
135
140
  } = _ref2;
136
- const balances = _balances;
137
- const pooledStakingBalances = [];
138
- for (const _poolMemberData of poolMemberDatas) {
139
- const poolMemberData = _poolMemberData.toPrimitive();
140
- if (poolMemberData) {
141
- let pooled = new _util.BN(poolMemberData.points.toString());
142
- Object.entries(poolMemberData.unbondingEras).forEach(_ref3 => {
143
- let [, amount] = _ref3;
144
- pooled = pooled.add(new _util.BN(amount));
145
- });
146
- pooledStakingBalances.push(pooled);
147
- } else {
148
- pooledStakingBalances.push(_util.BN_ZERO);
149
- }
150
- }
151
- const items = balances.map((balance, index) => {
152
- var _balance$data, _balance$data$free, _balance$data2, _balance$data2$reserv, _balance$data3, _balance$data3$miscFr, _balance$data4, _balance$data4$frozen, _balance$data5, _balance$data5$feeFro;
153
- let total = ((_balance$data = balance.data) === null || _balance$data === void 0 ? void 0 : (_balance$data$free = _balance$data.free) === null || _balance$data$free === void 0 ? void 0 : _balance$data$free.toBn()) || new _util.BN(0);
154
- const reserved = ((_balance$data2 = balance.data) === null || _balance$data2 === void 0 ? void 0 : (_balance$data2$reserv = _balance$data2.reserved) === null || _balance$data2$reserv === void 0 ? void 0 : _balance$data2$reserv.toBn()) || new _util.BN(0);
155
- // @ts-ignore
156
- // eslint-disable-next-line @typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access
157
- const miscFrozen = ((_balance$data3 = balance.data) === null || _balance$data3 === void 0 ? void 0 : (_balance$data3$miscFr = _balance$data3.miscFrozen) === null || _balance$data3$miscFr === void 0 ? void 0 : _balance$data3$miscFr.toBn()) || (balance === null || balance === void 0 ? void 0 : (_balance$data4 = balance.data) === null || _balance$data4 === void 0 ? void 0 : (_balance$data4$frozen = _balance$data4.frozen) === null || _balance$data4$frozen === void 0 ? void 0 : _balance$data4$frozen.toBn()) || new _util.BN(0);
158
- const feeFrozen = ((_balance$data5 = balance.data) === null || _balance$data5 === void 0 ? void 0 : (_balance$data5$feeFro = _balance$data5.feeFrozen) === null || _balance$data5$feeFro === void 0 ? void 0 : _balance$data5$feeFro.toBn()) || new _util.BN(0);
159
- let locked = reserved.add(miscFrozen);
160
- total = total.add(reserved);
161
- const pooledStakingBalance = pooledStakingBalances[index] || _util.BN_ZERO;
162
- if (pooledStakingBalance.gt(_util.BN_ZERO)) {
163
- total = total.add(pooledStakingBalance);
164
- locked = locked.add(pooledStakingBalance);
165
- }
166
- const free = total.sub(locked);
141
+ const items = balances.map((_balance, index) => {
142
+ const balanceInfo = _balance.toPrimitive();
143
+ const poolMemberInfo = poolMemberInfos[index].toPrimitive();
144
+ const nominationPoolBalance = poolMemberInfo ? (0, _nominationpoolsPallet._getActiveStakeInNominationPool)(poolMemberInfo) : '0';
145
+ const transferableBalance = (0, _systemPallet._getSystemPalletTransferable)(balanceInfo, (0, _utils2._getChainExistentialDeposit)(chainInfo), extrinsicType);
146
+ const totalBalance = (0, _systemPallet._getSystemPalletTotalBalance)(balanceInfo);
147
+ const totalLockedFromTransfer = new _bignumber.default(totalBalance).minus(transferableBalance).plus(nominationPoolBalance);
167
148
  return {
168
149
  address: addresses[index],
169
150
  tokenSlug: chainNativeTokenSlug,
170
- free: free.gte(_util.BN_ZERO) ? free.toString() : '0',
171
- locked: locked.toString(),
151
+ free: transferableBalance,
152
+ locked: totalLockedFromTransfer.toFixed(),
172
153
  state: _KoniTypes.APIItemState.READY,
173
- substrateInfo: {
174
- miscFrozen: miscFrozen.toString(),
175
- reserved: reserved.toString(),
176
- feeFrozen: feeFrozen.toString()
177
- }
154
+ metadata: balanceInfo
178
155
  };
179
156
  });
180
157
  callback(items);
@@ -183,14 +160,14 @@ const subscribeWithSystemAccountPallet = async _ref => {
183
160
  subscription.unsubscribe();
184
161
  };
185
162
  };
186
- const subscribeBridgedBalance = async _ref4 => {
163
+ const subscribeBridgedBalance = async _ref3 => {
187
164
  let {
188
165
  addresses,
189
166
  assetMap,
190
167
  callback,
191
168
  chainInfo,
192
169
  substrateApi
193
- } = _ref4;
170
+ } = _ref3;
194
171
  const chain = chainInfo.slug;
195
172
  const tokenMap = (0, _utils3.filterAssetsByChainAndType)(assetMap, chain, [_types._AssetType.LOCAL]);
196
173
 
@@ -223,11 +200,7 @@ const subscribeBridgedBalance = async _ref4 => {
223
200
  tokenSlug: tokenInfo.slug,
224
201
  free: free.toString(),
225
202
  locked: frozen.toString(),
226
- state: _KoniTypes.APIItemState.READY,
227
- substrateInfo: {
228
- miscFrozen: frozen.toString(),
229
- reserved: '0'
230
- }
203
+ state: _KoniTypes.APIItemState.READY
231
204
  };
232
205
  });
233
206
  callback(items);
@@ -253,19 +226,19 @@ function extractOkResponse(response) {
253
226
  }
254
227
  return undefined;
255
228
  }
256
- const subscribePSP22Balance = _ref5 => {
229
+ const subscribePSP22Balance = _ref4 => {
257
230
  let {
258
231
  addresses,
259
232
  assetMap,
260
233
  callback,
261
234
  chainInfo,
262
235
  substrateApi
263
- } = _ref5;
236
+ } = _ref4;
264
237
  const chain = chainInfo.slug;
265
238
  const psp22ContractMap = {};
266
239
  const tokenList = (0, _utils3.filterAssetsByChainAndType)(assetMap, chain, [_types._AssetType.PSP22]);
267
- Object.entries(tokenList).forEach(_ref6 => {
268
- let [slug, tokenInfo] = _ref6;
240
+ Object.entries(tokenList).forEach(_ref5 => {
241
+ let [slug, tokenInfo] = _ref5;
269
242
  psp22ContractMap[slug] = (0, _wasm.getPSP22ContractPromise)(substrateApi, (0, _utils2._getContractAddressOfToken)(tokenInfo));
270
243
  });
271
244
  const getTokenBalances = () => {
@@ -312,7 +285,7 @@ const subscribePSP22Balance = _ref5 => {
312
285
  clearInterval(interval);
313
286
  };
314
287
  };
315
- const subscribeTokensAccountsPallet = async _ref7 => {
288
+ const subscribeTokensAccountsPallet = async _ref6 => {
316
289
  let {
317
290
  addresses,
318
291
  assetMap,
@@ -320,7 +293,7 @@ const subscribeTokensAccountsPallet = async _ref7 => {
320
293
  chainInfo,
321
294
  includeNativeToken,
322
295
  substrateApi
323
- } = _ref7;
296
+ } = _ref6;
324
297
  const chain = chainInfo.slug;
325
298
  const tokenTypes = includeNativeToken ? [_types._AssetType.NATIVE, _types._AssetType.LOCAL] : [_types._AssetType.LOCAL];
326
299
  const tokenMap = (0, _utils3.filterAssetsByChainAndType)(assetMap, chain, tokenTypes);
@@ -346,11 +319,7 @@ const subscribeTokensAccountsPallet = async _ref7 => {
346
319
  tokenSlug: tokenInfo.slug,
347
320
  state: _KoniTypes.APIItemState.READY,
348
321
  free: freeBalance.toString(),
349
- locked: lockedBalance.toString(),
350
- substrateInfo: {
351
- reserved: tokenBalance.reserved.toString(),
352
- miscFrozen: tokenBalance.frozen.toString()
353
- }
322
+ locked: lockedBalance.toString()
354
323
  };
355
324
  });
356
325
  callback(items);
@@ -366,7 +335,7 @@ const subscribeTokensAccountsPallet = async _ref7 => {
366
335
  });
367
336
  };
368
337
  };
369
- const subscribeAssetsAccountPallet = async _ref8 => {
338
+ const subscribeAssetsAccountPallet = async _ref7 => {
370
339
  let {
371
340
  addresses,
372
341
  assetMap,
@@ -374,7 +343,7 @@ const subscribeAssetsAccountPallet = async _ref8 => {
374
343
  chainInfo,
375
344
  includeNativeToken,
376
345
  substrateApi
377
- } = _ref8;
346
+ } = _ref7;
378
347
  const chain = chainInfo.slug;
379
348
  const tokenMap = (0, _utils3.filterAssetsByChainAndType)(assetMap, chain, [_types._AssetType.LOCAL]);
380
349
  Object.values(tokenMap).forEach(token => {
@@ -409,11 +378,7 @@ const subscribeAssetsAccountPallet = async _ref8 => {
409
378
  tokenSlug: tokenInfo.slug,
410
379
  free: free.toString(),
411
380
  locked: frozen.toString(),
412
- state: _KoniTypes.APIItemState.READY,
413
- substrateInfo: {
414
- miscFrozen: frozen.toString(),
415
- reserved: '0'
416
- }
381
+ state: _KoniTypes.APIItemState.READY
417
382
  };
418
383
  });
419
384
  callback(items);
@@ -431,14 +396,14 @@ const subscribeAssetsAccountPallet = async _ref8 => {
431
396
  };
432
397
 
433
398
  // eslint-disable-next-line @typescript-eslint/require-await
434
- const subscribeOrmlTokensPallet = async _ref9 => {
399
+ const subscribeOrmlTokensPallet = async _ref8 => {
435
400
  let {
436
401
  addresses,
437
402
  assetMap,
438
403
  callback,
439
404
  chainInfo,
440
405
  substrateApi
441
- } = _ref9;
406
+ } = _ref8;
442
407
  const chain = chainInfo.slug;
443
408
  const tokenTypes = [_types._AssetType.LOCAL];
444
409
  const tokenMap = (0, _utils3.filterAssetsByChainAndType)(assetMap, chain, tokenTypes);
@@ -465,11 +430,7 @@ const subscribeOrmlTokensPallet = async _ref9 => {
465
430
  tokenSlug: tokenInfo.slug,
466
431
  state: _KoniTypes.APIItemState.READY,
467
432
  free: freeBalance.toString(),
468
- locked: lockedBalance.toString(),
469
- substrateInfo: {
470
- reserved: tokenBalance.reserved.toString(),
471
- miscFrozen: tokenBalance.frozen.toString()
472
- }
433
+ locked: lockedBalance.toString()
473
434
  };
474
435
  });
475
436
  callback(items);
@@ -488,14 +449,14 @@ const subscribeOrmlTokensPallet = async _ref9 => {
488
449
  });
489
450
  };
490
451
  };
491
- const subscribeGRC20Balance = _ref10 => {
452
+ const subscribeGRC20Balance = _ref9 => {
492
453
  let {
493
454
  addresses,
494
455
  assetMap,
495
456
  callback,
496
457
  chainInfo,
497
458
  substrateApi
498
- } = _ref10;
459
+ } = _ref9;
499
460
  if (!(substrateApi instanceof _api.GearApi)) {
500
461
  console.warn('Cannot subscribe GRC20 balance without GearApi instance');
501
462
  return _util.noop;
@@ -503,8 +464,8 @@ const subscribeGRC20Balance = _ref10 => {
503
464
  const chain = chainInfo.slug;
504
465
  const psp22ContractMap = {};
505
466
  const tokenList = (0, _utils3.filterAssetsByChainAndType)(assetMap, chain, [_types._AssetType.GRC20]);
506
- Object.entries(tokenList).forEach(_ref11 => {
507
- let [slug, tokenInfo] = _ref11;
467
+ Object.entries(tokenList).forEach(_ref10 => {
468
+ let [slug, tokenInfo] = _ref10;
508
469
  psp22ContractMap[slug] = (0, _utils3.getGRC20ContractPromise)(substrateApi, (0, _utils2._getContractAddressOfToken)(tokenInfo));
509
470
  });
510
471
  const getTokenBalances = () => {
@@ -165,8 +165,8 @@ class BalanceService {
165
165
  });
166
166
  }
167
167
 
168
- /** Subscribe token free balance of a address on chain */
169
- async subscribeTokenFreeBalance(address, chain, tokenSlug, callback) {
168
+ /** Subscribe token free balance of an address on chain */
169
+ async subscribeTransferableBalance(address, chain, tokenSlug, extrinsicType, callback) {
170
170
  const chainInfo = this.state.chainService.getChainInfoByKey(chain);
171
171
  const chainState = this.state.chainService.getChainStateByKey(chain);
172
172
  if (!chainInfo || !chainState || !chainState.active) {
@@ -199,7 +199,8 @@ class BalanceService {
199
199
  const balance = {
200
200
  value: rs.free,
201
201
  decimals: tokenInfo.decimals || 0,
202
- symbol: tokenInfo.symbol
202
+ symbol: tokenInfo.symbol,
203
+ metadata: rs.metadata
203
204
  };
204
205
  if (callback) {
205
206
  callback(balance);
@@ -210,7 +211,7 @@ class BalanceService {
210
211
  }
211
212
  resolve([unsub, balance]);
212
213
  }
213
- });
214
+ }, extrinsicType);
214
215
  setTimeout(() => {
215
216
  if (hasError) {
216
217
  var _unsub2;
@@ -224,15 +225,16 @@ class BalanceService {
224
225
  /**
225
226
  * @public
226
227
  * @async
227
- * @function getTokenFreeBalance
228
+ * @function getTransferableBalance
228
229
  * @desc Fetch free balance on chain
229
230
  * @param {string} address - Address
230
231
  * @param {string} chain - Slug of chain
231
232
  * @param {string} [tokenSlug] - Slug of token
233
+ * @param extrinsicType - Customize transferable based on context
232
234
  * @return {Promise<AmountData>} - Free token balance of address on chain
233
- */
234
- async getTokenFreeBalance(address, chain, tokenSlug) {
235
- const [, balance] = await this.subscribeTokenFreeBalance(address, chain, tokenSlug);
235
+ */
236
+ async getTransferableBalance(address, chain, tokenSlug, extrinsicType) {
237
+ const [, balance] = await this.subscribeTransferableBalance(address, chain, tokenSlug, extrinsicType);
236
238
  return balance;
237
239
  }
238
240
 
@@ -334,7 +336,7 @@ class BalanceService {
334
336
  }).map(asset => asset.slug);
335
337
  const unsub = (0, _helpers.subscribeBalance)(addresses, activeChainSlugs, assets, assetMap, chainInfoMap, substrateApiMap, evmApiMap, result => {
336
338
  !cancel && this.setBalanceItem(result);
337
- });
339
+ }, _KoniTypes.ExtrinsicType.TRANSFER_BALANCE);
338
340
  const unsub2 = this.state.subscribeMantaPayBalance();
339
341
  this._unsubscribeBalance = () => {
340
342
  cancel = true;
@@ -497,7 +497,6 @@ class ChainService {
497
497
  needUpdateChainApiList,
498
498
  storedChainInfoList
499
499
  } = (0, _utils.updateLatestChainInfo)(this.dataMap, latestChainInfo);
500
- console.log('here', needUpdateChainApiList, storedChainInfoList);
501
500
  this.dbService.bulkUpdateChainStore(storedChainInfoList).catch(console.error);
502
501
  this.updateChainSubscription();
503
502
  needUpdateChainApiList.forEach(chainInfo => {
@@ -78,6 +78,7 @@ var _exportNames = {
78
78
  findChainInfoByHalfGenesisHash: true,
79
79
  findChainInfoByChainId: true,
80
80
  _isMantaZkAsset: true,
81
+ _getChainExistentialDeposit: true,
81
82
  randomizeProvider: true,
82
83
  _isAssetCanPayTxFee: true,
83
84
  updateLatestChainInfo: true
@@ -90,6 +91,7 @@ exports._getAssetOriginChain = _getAssetOriginChain;
90
91
  exports._getAssetPriceId = _getAssetPriceId;
91
92
  exports._getAssetSymbol = _getAssetSymbol;
92
93
  exports._getBlockExplorerFromChain = _getBlockExplorerFromChain;
94
+ exports._getChainExistentialDeposit = _getChainExistentialDeposit;
93
95
  exports._getChainName = _getChainName;
94
96
  exports._getChainNativeTokenBasicInfo = _getChainNativeTokenBasicInfo;
95
97
  exports._getChainNativeTokenSlug = _getChainNativeTokenSlug;
@@ -582,6 +584,10 @@ exports.findChainInfoByChainId = findChainInfoByChainId;
582
584
  function _isMantaZkAsset(chainAsset) {
583
585
  return _constants._MANTA_ZK_CHAIN_GROUP.includes(chainAsset.originChain) && chainAsset.symbol.startsWith(_constants._ZK_ASSET_PREFIX);
584
586
  }
587
+ function _getChainExistentialDeposit(chainInfo) {
588
+ var _chainInfo$substrateI18;
589
+ return (chainInfo === null || chainInfo === void 0 ? void 0 : (_chainInfo$substrateI18 = chainInfo.substrateInfo) === null || _chainInfo$substrateI18 === void 0 ? void 0 : _chainInfo$substrateI18.existentialDeposit) || '0';
590
+ }
585
591
  function randomizeProvider(providers, excludedKeys) {
586
592
  if (Object.keys(providers).length === 0) {
587
593
  return {
@@ -134,7 +134,7 @@ class BasePoolHandler {
134
134
  };
135
135
  }
136
136
  const nativeTokenInfo = this.state.chainService.getNativeTokenInfo(this.chain);
137
- const nativeTokenBalance = await this.state.balanceService.getTokenFreeBalance(request.address, this.chain);
137
+ const nativeTokenBalance = await this.state.balanceService.getTransferableBalance(request.address, this.chain);
138
138
  const bnNativeTokenBalance = new _util.BN(nativeTokenBalance.value);
139
139
  const bnMinBalanceToJoin = new _util.BN(((_poolInfo$statistic2 = poolInfo.statistic) === null || _poolInfo$statistic2 === void 0 ? void 0 : (_poolInfo$statistic2$ = _poolInfo$statistic2.earningThreshold) === null || _poolInfo$statistic2$ === void 0 ? void 0 : _poolInfo$statistic2$.join) || '0').add(new _util.BN(poolInfo.metadata.maintainBalance));
140
140
  if (bnNativeTokenBalance.lte(bnMinBalanceToJoin)) {
@@ -74,11 +74,11 @@ class BaseSpecialStakingPoolHandler extends _base.default {
74
74
  const feeAssetInfo = this.state.chainService.getAssetBySlug(this.feeAssets[0]);
75
75
  const altInputAssetInfo = this.state.chainService.getAssetBySlug(this.altInputAsset);
76
76
  const inputAssetInfo = this.state.chainService.getAssetBySlug(this.inputAsset);
77
- const [inputAssetBalance, altInputAssetBalance, feeAssetBalance] = await Promise.all([this.state.balanceService.getTokenFreeBalance(request.address, inputAssetInfo.originChain, inputAssetInfo.slug), altInputAssetInfo ? this.state.balanceService.getTokenFreeBalance(request.address, altInputAssetInfo.originChain, altInputAssetInfo.slug) : Promise.resolve({
77
+ const [inputAssetBalance, altInputAssetBalance, feeAssetBalance] = await Promise.all([this.state.balanceService.getTransferableBalance(request.address, inputAssetInfo.originChain, inputAssetInfo.slug), altInputAssetInfo ? this.state.balanceService.getTransferableBalance(request.address, altInputAssetInfo.originChain, altInputAssetInfo.slug) : Promise.resolve({
78
78
  symbol: '',
79
79
  decimals: 0,
80
80
  value: '0'
81
- }), this.state.balanceService.getTokenFreeBalance(request.address, feeAssetInfo.originChain, feeAssetInfo.slug)]);
81
+ }), this.state.balanceService.getTransferableBalance(request.address, feeAssetInfo.originChain, feeAssetInfo.slug)]);
82
82
  const bnInputAssetBalance = new _util.BN(inputAssetBalance.value);
83
83
  const bnAltInputAssetBalance = new _util.BN(altInputAssetBalance.value);
84
84
  const bnMinJoinPool = new _util.BN(poolInfo.statistic.earningThreshold.join);
@@ -200,13 +200,13 @@ class BaseSpecialStakingPoolHandler extends _base.default {
200
200
  const bnAmount = new _util.BN(amount);
201
201
  const inputTokenSlug = this.inputAsset; // assume that the pool only has 1 input token, will update later
202
202
  const inputTokenInfo = this.state.getAssetBySlug(inputTokenSlug);
203
- const inputTokenBalance = await this.state.balanceService.getTokenFreeBalance(address, inputTokenInfo.originChain, inputTokenSlug);
203
+ const inputTokenBalance = await this.state.balanceService.getTransferableBalance(address, inputTokenInfo.originChain, inputTokenSlug);
204
204
  const bnInputTokenBalance = new _util.BN(inputTokenBalance.value);
205
205
  if (!bnInputTokenBalance.gte(bnAmount)) {
206
206
  if (this.altInputAsset) {
207
207
  const altInputTokenSlug = this.altInputAsset;
208
208
  const altInputTokenInfo = this.state.getAssetBySlug(altInputTokenSlug);
209
- const altInputTokenBalance = await this.state.balanceService.getTokenFreeBalance(address, altInputTokenInfo.originChain, altInputTokenSlug);
209
+ const altInputTokenBalance = await this.state.balanceService.getTransferableBalance(address, altInputTokenInfo.originChain, altInputTokenSlug);
210
210
  const bnAltInputTokenBalance = new _util.BN(altInputTokenBalance.value || '0');
211
211
  if (bnAltInputTokenBalance.gt(_util.BN_ZERO)) {
212
212
  const altChainInfo = this.state.getChainInfo(altInputTokenInfo.originChain);
@@ -279,17 +279,16 @@ class BaseSpecialStakingPoolHandler extends _base.default {
279
279
  const altInputTokenSlug = this.altInputAsset || '';
280
280
  const altInputTokenInfo = this.state.getAssetBySlug(altInputTokenSlug);
281
281
  const inputTokenInfo = this.state.getAssetBySlug(this.inputAsset);
282
- const altInputTokenBalance = await this.state.balanceService.getTokenFreeBalance(params.address, altInputTokenInfo.originChain, altInputTokenSlug);
282
+ const altInputTokenBalance = await this.state.balanceService.getTransferableBalance(params.address, altInputTokenInfo.originChain, altInputTokenSlug);
283
283
  const missingAmount = bnAmount.sub(bnInputTokenBalance); // TODO: what if input token is not LOCAL ??
284
284
  const xcmFee = new _util.BN(path.totalFee[1].amount || '0');
285
285
  const xcmAmount = missingAmount.add(xcmFee);
286
286
  const bnAltInputTokenBalance = new _util.BN(altInputTokenBalance.value || '0');
287
- const altInputTokenMinAmount = new _util.BN(altInputTokenInfo.minAmount || '0');
288
- if (!bnAltInputTokenBalance.sub(xcmAmount).gte(altInputTokenMinAmount)) {
287
+ if (!bnAltInputTokenBalance.sub(xcmAmount).gt(_util.BN_ZERO)) {
289
288
  processValidation.failedStep = path.steps[1];
290
289
  processValidation.ok = false;
291
290
  processValidation.status = _types.YieldValidationStatus.NOT_ENOUGH_BALANCE;
292
- const maxBn = bnInputTokenBalance.add(new _util.BN(altInputTokenBalance.value)).sub(xcmFee).sub(altInputTokenMinAmount);
291
+ const maxBn = bnInputTokenBalance.add(new _util.BN(altInputTokenBalance.value)).sub(xcmFee);
293
292
  const maxValue = (0, _utils3.formatNumber)(maxBn.toString(), inputTokenInfo.decimals || 0);
294
293
  const altInputTokenInfo = this.state.getAssetBySlug(altInputTokenSlug);
295
294
  const symbol = altInputTokenInfo.symbol;
@@ -297,7 +296,7 @@ class BaseSpecialStakingPoolHandler extends _base.default {
297
296
  const inputNetworkName = this.chainInfo.name;
298
297
  const altNetworkName = altNetwork.name;
299
298
  const currentValue = (0, _utils3.formatNumber)(bnInputTokenBalance.toString(), inputTokenInfo.decimals || 0);
300
- const bnMaxXCM = new _util.BN(altInputTokenBalance.value).sub(xcmFee).sub(altInputTokenMinAmount);
299
+ const bnMaxXCM = new _util.BN(altInputTokenBalance.value).sub(xcmFee);
301
300
  const maxXCMValue = (0, _utils3.formatNumber)(bnMaxXCM.toString(), inputTokenInfo.decimals || 0);
302
301
  processValidation.message = (0, _i18next.t)('You can only enter a maximum of {{maxValue}} {{symbol}}, which is {{currentValue}} {{symbol}} ({{inputNetworkName}}) and {{maxXCMValue}} {{symbol}} ({{altNetworkName}}). Lower your amount and try again.', {
303
302
  replace: {
@@ -334,7 +333,7 @@ class BaseSpecialStakingPoolHandler extends _base.default {
334
333
  if (this.feeAssets.length === 1 && feeTokenSlug === defaultFeeTokenSlug) {
335
334
  var _path$totalFee$id;
336
335
  const bnFeeAmount = new _util.BN(((_path$totalFee$id = path.totalFee[id]) === null || _path$totalFee$id === void 0 ? void 0 : _path$totalFee$id.amount) || '0');
337
- const feeTokenBalance = await this.state.balanceService.getTokenFreeBalance(params.address, feeTokenInfo.originChain, feeTokenSlug);
336
+ const feeTokenBalance = await this.state.balanceService.getTransferableBalance(params.address, feeTokenInfo.originChain, feeTokenSlug);
338
337
  const bnFeeTokenBalance = new _util.BN(feeTokenBalance.value || '0');
339
338
  const bnFeeTokenMinAmount = new _util.BN((feeTokenInfo === null || feeTokenInfo === void 0 ? void 0 : feeTokenInfo.minAmount) || '0');
340
339
  if (!bnFeeTokenBalance.sub(bnFeeAmount).gte(bnFeeTokenMinAmount)) {
@@ -372,7 +371,7 @@ class BaseSpecialStakingPoolHandler extends _base.default {
372
371
  const inputTokenSlug = this.inputAsset;
373
372
  const inputTokenInfo = this.state.getAssetBySlug(inputTokenSlug);
374
373
  const balanceService = this.state.balanceService;
375
- const inputTokenBalance = await balanceService.getTokenFreeBalance(params.address, inputTokenInfo.originChain, inputTokenSlug);
374
+ const inputTokenBalance = await balanceService.getTransferableBalance(params.address, inputTokenInfo.originChain, inputTokenSlug);
376
375
  const bnInputTokenBalance = new _util.BN(inputTokenBalance.value || '0');
377
376
  const bnAmount = new _util.BN(params.amount);
378
377
  if (bnAmount.lte(_util.BN_ZERO)) {
@@ -422,7 +421,7 @@ class BaseSpecialStakingPoolHandler extends _base.default {
422
421
  const originTokenInfo = this.state.getAssetBySlug(originTokenSlug);
423
422
  const destinationTokenInfo = this.state.getAssetBySlug(destinationTokenSlug);
424
423
  const substrateApi = this.state.getSubstrateApi(originChainInfo.slug);
425
- const inputTokenBalance = await this.state.balanceService.getTokenFreeBalance(address, destinationTokenInfo.originChain, destinationTokenSlug);
424
+ const inputTokenBalance = await this.state.balanceService.getTransferableBalance(address, destinationTokenInfo.originChain, destinationTokenSlug);
426
425
  const bnInputTokenBalance = new _util.BN(inputTokenBalance.value);
427
426
  const bnXcmFee = new _util.BN(xcmFee);
428
427
  const bnAmount = new _util.BN(amount);