@subwallet/extension-base 1.1.52-0 → 1.1.53-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (107) hide show
  1. package/background/KoniTypes.d.ts +9 -1
  2. package/background/KoniTypes.js +1 -0
  3. package/background/errors/SwapError.d.ts +6 -0
  4. package/background/errors/SwapError.js +57 -0
  5. package/background/errors/TransactionError.js +9 -0
  6. package/cjs/background/KoniTypes.js +1 -0
  7. package/cjs/background/errors/SwapError.js +64 -0
  8. package/cjs/background/errors/TransactionError.js +9 -0
  9. package/cjs/koni/api/dotsama/balance.js +464 -0
  10. package/cjs/koni/api/nft/ordinal_nft/utils.js +41 -0
  11. package/cjs/koni/api/staking/bonding/utils.js +35 -6
  12. package/cjs/koni/background/handlers/Extension.js +85 -0
  13. package/cjs/koni/background/handlers/State.js +25 -5
  14. package/cjs/packageInfo.js +1 -1
  15. package/cjs/services/balance-service/helpers/subscribe/balance.js +140 -0
  16. package/cjs/services/balance-service/helpers/subscribe/substrate/index.js +2 -1
  17. package/cjs/services/balance-service/index.js +6 -3
  18. package/cjs/services/chain-service/constants.js +1 -1
  19. package/cjs/services/chain-service/index.js +43 -18
  20. package/cjs/services/chain-service/utils/index.js +7 -2
  21. package/cjs/services/chain-service/utils/patch.js +1 -1
  22. package/cjs/services/chain-service/utils.js +506 -0
  23. package/cjs/services/earning-service/constants/chains.js +4 -2
  24. package/cjs/services/earning-service/handlers/native-staking/astar.js +4 -3
  25. package/cjs/services/earning-service/handlers/native-staking/relay-chain.js +22 -3
  26. package/cjs/services/migration-service/scripts/MigrateEthProvider.js +17 -0
  27. package/cjs/services/migration-service/scripts/MigratePioneerProvider.js +17 -0
  28. package/cjs/services/migration-service/scripts/MigrateProvider.js +29 -0
  29. package/cjs/services/request-service/handler/ConnectWCRequestHandler.js +0 -1
  30. package/cjs/services/storage-service/index.js +241 -0
  31. package/cjs/services/swap-service/handler/base-handler.js +171 -0
  32. package/cjs/services/swap-service/handler/chainflip-handler.js +407 -0
  33. package/cjs/services/swap-service/handler/hydradx-handler.js +444 -0
  34. package/cjs/services/swap-service/index.js +249 -0
  35. package/cjs/services/swap-service/utils.js +126 -0
  36. package/cjs/services/transaction-service/index.js +20 -0
  37. package/cjs/services/transaction-service/utils.js +6 -0
  38. package/cjs/services/wallet-connect-service/helpers.js +1 -1
  39. package/cjs/services/wallet-connect-service/index.js +19 -0
  40. package/cjs/types/balance.js +1 -0
  41. package/cjs/types/fee/evm.js +1 -0
  42. package/cjs/types/fee/fee.js +70 -0
  43. package/cjs/types/fee/index.js +27 -1
  44. package/cjs/types/service-base.js +1 -0
  45. package/cjs/types/swap/index.js +50 -0
  46. package/cjs/types.js +1 -0
  47. package/cjs/utils/address.js +34 -0
  48. package/cjs/utils/eth/parseTransaction/index.js +1 -1
  49. package/cjs/utils/index.js +12 -0
  50. package/cjs/utils/keyring.js +57 -0
  51. package/cjs/utils/swap.js +78 -0
  52. package/koni/api/staking/bonding/utils.d.ts +3 -1
  53. package/koni/api/staking/bonding/utils.js +32 -6
  54. package/koni/background/handlers/Extension.d.ts +5 -0
  55. package/koni/background/handlers/Extension.js +85 -0
  56. package/koni/background/handlers/State.d.ts +2 -0
  57. package/koni/background/handlers/State.js +26 -6
  58. package/package.json +64 -7
  59. package/packageInfo.js +1 -1
  60. package/services/balance-service/helpers/subscribe/substrate/index.js +2 -1
  61. package/services/balance-service/index.js +6 -3
  62. package/services/base/types.d.ts +4 -0
  63. package/services/chain-service/constants.js +1 -1
  64. package/services/chain-service/index.d.ts +4 -0
  65. package/services/chain-service/index.js +24 -0
  66. package/services/chain-service/utils/index.d.ts +6 -5
  67. package/services/chain-service/utils/index.js +5 -2
  68. package/services/chain-service/utils/patch.js +1 -1
  69. package/services/earning-service/constants/chains.d.ts +1 -0
  70. package/services/earning-service/constants/chains.js +1 -0
  71. package/services/earning-service/handlers/native-staking/astar.js +4 -3
  72. package/services/earning-service/handlers/native-staking/relay-chain.js +24 -5
  73. package/services/event-service/types.d.ts +1 -0
  74. package/services/request-service/handler/ConnectWCRequestHandler.js +0 -1
  75. package/services/swap-service/handler/base-handler.d.ts +38 -0
  76. package/services/swap-service/handler/base-handler.js +162 -0
  77. package/services/swap-service/handler/chainflip-handler.d.ts +30 -0
  78. package/services/swap-service/handler/chainflip-handler.js +399 -0
  79. package/services/swap-service/handler/hydradx-handler.d.ts +36 -0
  80. package/services/swap-service/handler/hydradx-handler.js +435 -0
  81. package/services/swap-service/index.d.ts +32 -0
  82. package/services/swap-service/index.js +240 -0
  83. package/services/swap-service/utils.d.ts +18 -0
  84. package/services/swap-service/utils.js +105 -0
  85. package/services/transaction-service/index.js +20 -0
  86. package/services/transaction-service/utils.d.ts +2 -0
  87. package/services/transaction-service/utils.js +6 -2
  88. package/services/wallet-connect-service/helpers.js +1 -1
  89. package/services/wallet-connect-service/index.d.ts +1 -0
  90. package/services/wallet-connect-service/index.js +19 -1
  91. package/types/fee/evm.d.ts +49 -0
  92. package/types/fee/evm.js +1 -0
  93. package/types/fee/fee.d.ts +32 -0
  94. package/types/fee/fee.js +63 -0
  95. package/types/fee/index.d.ts +2 -49
  96. package/types/fee/index.js +5 -1
  97. package/types/service-base.d.ts +10 -0
  98. package/types/service-base.js +1 -0
  99. package/types/swap/index.d.ts +166 -0
  100. package/types/swap/index.js +41 -0
  101. package/types/yield/info/chain/target.d.ts +2 -0
  102. package/types/yield/info/pallet.d.ts +4 -0
  103. package/utils/eth/parseTransaction/index.js +1 -1
  104. package/utils/index.d.ts +1 -0
  105. package/utils/index.js +2 -1
  106. package/utils/swap.d.ts +3 -0
  107. package/utils/swap.js +70 -0
@@ -0,0 +1,464 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.subscribeBalance = subscribeBalance;
8
+ exports.subscribeEVMBalance = subscribeEVMBalance;
9
+ exports.subscribeSubstrateBalance = subscribeSubstrateBalance;
10
+ var _types = require("@subwallet/chain-list/types");
11
+ var _KoniTypes = require("@subwallet/extension-base/background/KoniTypes");
12
+ var _constants = require("@subwallet/extension-base/constants");
13
+ var _balance = require("@subwallet/extension-base/koni/api/tokens/evm/balance");
14
+ var _web = require("@subwallet/extension-base/koni/api/tokens/evm/web3");
15
+ var _wasm = require("@subwallet/extension-base/koni/api/tokens/wasm");
16
+ var _utils = require("@subwallet/extension-base/koni/api/tokens/wasm/utils");
17
+ var _handlers = require("@subwallet/extension-base/koni/background/handlers");
18
+ var _constants2 = require("@subwallet/extension-base/services/chain-service/constants");
19
+ var _utils2 = require("@subwallet/extension-base/services/chain-service/utils");
20
+ var _utils3 = require("@subwallet/extension-base/utils");
21
+ var _bignumber = _interopRequireDefault(require("bignumber.js"));
22
+ var _util = require("@polkadot/util");
23
+ // Copyright 2019-2022 @subwallet/extension-base
24
+ // SPDX-License-Identifier: Apache-2.0
25
+
26
+ // main subscription
27
+ function subscribeBalance(addresses, chainInfoMap, substrateApiMap, evmApiMap, callback) {
28
+ const [substrateAddresses, evmAddresses] = (0, _utils3.categoryAddresses)(addresses);
29
+
30
+ // Looping over each chain
31
+ const unsubList = Object.entries(chainInfoMap).map(async _ref => {
32
+ let [chainSlug, chainInfo] = _ref;
33
+ const useAddresses = (0, _utils2._isChainEvmCompatible)(chainInfo) ? evmAddresses : substrateAddresses;
34
+ if ((0, _utils2._isPureEvmChain)(chainInfo)) {
35
+ const nativeTokenInfo = _handlers.state.getNativeTokenInfo(chainSlug);
36
+ return subscribeEVMBalance(chainSlug, useAddresses, evmApiMap, callback, nativeTokenInfo);
37
+ }
38
+ if (!useAddresses || useAddresses.length === 0 || _constants2._PURE_EVM_CHAINS.indexOf(chainSlug) > -1) {
39
+ const fungibleTokensByChain = _handlers.state.chainService.getFungibleTokensByChain(chainSlug, true);
40
+ const now = new Date().getTime();
41
+ Object.values(fungibleTokensByChain).map(token => {
42
+ return {
43
+ tokenSlug: token.slug,
44
+ free: '0',
45
+ locked: '0',
46
+ state: _KoniTypes.APIItemState.READY,
47
+ timestamp: now
48
+ };
49
+ }).forEach(callback);
50
+ return undefined;
51
+ }
52
+ const networkAPI = await substrateApiMap[chainSlug].isReady;
53
+ return subscribeSubstrateBalance(useAddresses, chainInfo, chainSlug, networkAPI, evmApiMap, callback);
54
+ });
55
+ return () => {
56
+ unsubList.forEach(subProm => {
57
+ subProm.then(unsub => {
58
+ unsub && unsub();
59
+ }).catch(console.error);
60
+ });
61
+ };
62
+ }
63
+ async function subscribeSubstrateBalance(addresses, chainInfo, chain, networkAPI, evmApiMap, callBack) {
64
+ let unsubNativeToken;
65
+ if (!_constants2._BALANCE_CHAIN_GROUP.kintsugi.includes(chain) && !_constants2._BALANCE_CHAIN_GROUP.genshiro.includes(chain) && !_constants2._BALANCE_CHAIN_GROUP.equilibrium_parachain.includes(chain)) {
66
+ unsubNativeToken = await subscribeWithSystemAccountPallet(addresses, chainInfo, networkAPI.api, callBack);
67
+ }
68
+ let unsubLocalToken;
69
+ let unsubEvmContractToken;
70
+ let unsubWasmContractToken;
71
+ try {
72
+ if (_constants2._BALANCE_CHAIN_GROUP.bifrost.includes(chain)) {
73
+ unsubLocalToken = await subscribeTokensAccountsPallet(addresses, chain, networkAPI.api, callBack);
74
+ } else if (_constants2._BALANCE_CHAIN_GROUP.kintsugi.includes(chain)) {
75
+ unsubLocalToken = await subscribeTokensAccountsPallet(addresses, chain, networkAPI.api, callBack, true);
76
+ } else if (_constants2._BALANCE_CHAIN_GROUP.statemine.includes(chain)) {
77
+ unsubLocalToken = await subscribeAssetsAccountPallet(addresses, chain, networkAPI.api, callBack);
78
+ } else if (_constants2._BALANCE_CHAIN_GROUP.genshiro.includes(chain)) {
79
+ unsubLocalToken = await subscribeEqBalanceAccountPallet(addresses, chain, networkAPI.api, callBack, true);
80
+ } else if (_constants2._BALANCE_CHAIN_GROUP.equilibrium_parachain.includes(chain)) {
81
+ unsubLocalToken = await subscribeEquilibriumTokenBalance(addresses, chain, networkAPI.api, callBack, true);
82
+ } else if (_constants2._BALANCE_CHAIN_GROUP.centrifuge.includes(chain)) {
83
+ unsubLocalToken = await subscribeOrmlTokensPallet(addresses, chain, networkAPI.api, callBack);
84
+ }
85
+ if ((0, _utils2._isChainEvmCompatible)(chainInfo)) {
86
+ unsubEvmContractToken = subscribeERC20Interval(addresses, chain, evmApiMap, callBack);
87
+ }
88
+ if ((0, _utils2._checkSmartContractSupportByChain)(chainInfo, _types._AssetType.PSP22)) {
89
+ // Get sub-token for substrate-based chains
90
+ unsubWasmContractToken = subscribePSP22Balance(addresses, chain, networkAPI.api, callBack);
91
+ }
92
+ } catch (err) {
93
+ console.warn(err);
94
+ }
95
+ return () => {
96
+ unsubNativeToken && unsubNativeToken();
97
+ unsubLocalToken && unsubLocalToken();
98
+ unsubEvmContractToken && unsubEvmContractToken();
99
+ unsubWasmContractToken && unsubWasmContractToken();
100
+ };
101
+ }
102
+
103
+ // handler according to different logic
104
+ async function subscribeWithSystemAccountPallet(addresses, chainInfo, networkAPI, callBack) {
105
+ const chainNativeTokenSlug = (0, _utils2._getChainNativeTokenSlug)(chainInfo);
106
+ const unsub = await networkAPI.query.system.account.multi(addresses, async balances => {
107
+ let [total, reserved, miscFrozen, feeFrozen] = [new _util.BN(0), new _util.BN(0), new _util.BN(0), new _util.BN(0)];
108
+ let pooledStakingBalance = _util.BN_ZERO;
109
+ if ((0, _utils2._isSubstrateRelayChain)(chainInfo) && networkAPI.query.nominationPools) {
110
+ var _networkAPI$query$nom;
111
+ const poolMemberDatas = await ((_networkAPI$query$nom = networkAPI.query.nominationPools.poolMembers) === null || _networkAPI$query$nom === void 0 ? void 0 : _networkAPI$query$nom.multi(addresses));
112
+ if (poolMemberDatas) {
113
+ for (const _poolMemberData of poolMemberDatas) {
114
+ const poolMemberData = _poolMemberData.toPrimitive();
115
+ if (poolMemberData) {
116
+ const pooledBalance = new _util.BN(poolMemberData.points.toString());
117
+ pooledStakingBalance = pooledStakingBalance.add(pooledBalance);
118
+ Object.entries(poolMemberData.unbondingEras).forEach(_ref2 => {
119
+ let [, amount] = _ref2;
120
+ pooledStakingBalance = pooledStakingBalance.add(new _util.BN(amount));
121
+ });
122
+ }
123
+ }
124
+ }
125
+ }
126
+ balances.forEach(balance => {
127
+ 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;
128
+ total = total.add(((_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)); // reserved is seperated
129
+ reserved = reserved.add(((_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));
130
+ // @ts-ignore
131
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access
132
+ miscFrozen = miscFrozen.add(((_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)); // TODO: update frozen
133
+ feeFrozen = feeFrozen.add(((_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));
134
+ });
135
+ let locked = reserved.add(miscFrozen);
136
+ total = total.add(reserved); // total = free + reserved
137
+
138
+ if (pooledStakingBalance.gt(_util.BN_ZERO)) {
139
+ total = total.add(pooledStakingBalance);
140
+ locked = locked.add(pooledStakingBalance);
141
+ }
142
+ const free = total.sub(locked);
143
+ callBack({
144
+ tokenSlug: chainNativeTokenSlug,
145
+ free: free.gte(_util.BN_ZERO) ? free.toString() : '0',
146
+ locked: locked.toString(),
147
+ state: _KoniTypes.APIItemState.READY,
148
+ substrateInfo: {
149
+ miscFrozen: miscFrozen.toString(),
150
+ reserved: reserved.toString(),
151
+ feeFrozen: feeFrozen.toString()
152
+ }
153
+ });
154
+ });
155
+ return () => {
156
+ unsub();
157
+ };
158
+ }
159
+ function subscribeERC20Interval(addresses, chain, evmApiMap, callBack) {
160
+ let tokenList = {};
161
+ const erc20ContractMap = {};
162
+ const getTokenBalances = () => {
163
+ Object.values(tokenList).map(async tokenInfo => {
164
+ let free = new _util.BN(0);
165
+ try {
166
+ const contract = erc20ContractMap[tokenInfo.slug];
167
+ const balanceList = await Promise.all(addresses.map(address => {
168
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-return,@typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access
169
+ return contract.methods.balanceOf(address).call();
170
+ }));
171
+ free = (0, _utils3.sumBN)(balanceList.map(balance => new _util.BN(balance || 0)));
172
+ callBack({
173
+ tokenSlug: tokenInfo.slug,
174
+ free: free.toString(),
175
+ locked: '0',
176
+ state: _KoniTypes.APIItemState.READY
177
+ });
178
+ } catch (err) {
179
+ console.log(tokenInfo.slug, err);
180
+ }
181
+ });
182
+ };
183
+ tokenList = _handlers.state.getAssetByChainAndAsset(chain, [_types._AssetType.ERC20]);
184
+ Object.entries(tokenList).forEach(_ref3 => {
185
+ let [slug, tokenInfo] = _ref3;
186
+ erc20ContractMap[slug] = (0, _web.getERC20Contract)(chain, (0, _utils2._getContractAddressOfToken)(tokenInfo), evmApiMap);
187
+ });
188
+ getTokenBalances();
189
+ const interval = setInterval(getTokenBalances, _constants.SUB_TOKEN_REFRESH_BALANCE_INTERVAL);
190
+ return () => {
191
+ clearInterval(interval);
192
+ };
193
+ }
194
+ function subscribePSP22Balance(addresses, chain, api, callBack) {
195
+ let tokenList = {};
196
+ const psp22ContractMap = {};
197
+ const getTokenBalances = () => {
198
+ Object.values(tokenList).map(async tokenInfo => {
199
+ let free = new _util.BN(0);
200
+ try {
201
+ const contract = psp22ContractMap[tokenInfo.slug];
202
+ const balances = await Promise.all(addresses.map(async address => {
203
+ var _balanceOf$output;
204
+ const _balanceOf = await contract.query['psp22::balanceOf'](address, {
205
+ gasLimit: (0, _utils.getDefaultWeightV2)(api)
206
+ }, address);
207
+ const balanceObj = _balanceOf === null || _balanceOf === void 0 ? void 0 : (_balanceOf$output = _balanceOf.output) === null || _balanceOf$output === void 0 ? void 0 : _balanceOf$output.toPrimitive();
208
+ return _balanceOf.output ? balanceObj.ok || balanceObj.Ok : '0';
209
+ }));
210
+ free = (0, _utils3.sumBN)(balances.map(bal => new _util.BN(bal || 0)));
211
+ callBack({
212
+ tokenSlug: tokenInfo.slug,
213
+ free: free.toString(),
214
+ locked: '0',
215
+ state: _KoniTypes.APIItemState.READY
216
+ });
217
+ } catch (err) {
218
+ console.warn(tokenInfo.slug, err); // TODO: error createType
219
+ }
220
+ });
221
+ };
222
+
223
+ tokenList = _handlers.state.getAssetByChainAndAsset(chain, [_types._AssetType.PSP22]);
224
+ Object.entries(tokenList).forEach(_ref4 => {
225
+ let [slug, tokenInfo] = _ref4;
226
+ psp22ContractMap[slug] = (0, _wasm.getPSP22ContractPromise)(api, (0, _utils2._getContractAddressOfToken)(tokenInfo));
227
+ });
228
+ getTokenBalances();
229
+ const interval = setInterval(getTokenBalances, _constants.SUB_TOKEN_REFRESH_BALANCE_INTERVAL);
230
+ return () => {
231
+ clearInterval(interval);
232
+ };
233
+ }
234
+ async function subscribeEquilibriumTokenBalance(addresses, chain, api, callBack, includeNativeToken) {
235
+ const tokenTypes = includeNativeToken ? [_types._AssetType.NATIVE, _types._AssetType.LOCAL] : [_types._AssetType.LOCAL];
236
+ const tokenMap = _handlers.state.getAssetByChainAndAsset(chain, tokenTypes);
237
+ const unsub = await api.query.system.account.multi(addresses, balances => {
238
+ // Equilibrium customizes the SystemAccount pallet
239
+ Object.values(tokenMap).forEach(tokenInfo => {
240
+ const assetId = (0, _utils2._getTokenOnChainAssetId)(tokenInfo);
241
+ let tokenFreeBalance = _util.BN_ZERO;
242
+ for (const balance of balances) {
243
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-argument,@typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access
244
+ const balancesData = JSON.parse(balance.data.toString());
245
+ const balanceList = balancesData.v0.balance;
246
+
247
+ // @ts-ignore
248
+ const freeTokenBalance = balanceList.find(data => data[0] === parseInt(assetId));
249
+ const bnFreeTokenBalance = freeTokenBalance ? new _util.BN(new _bignumber.default(freeTokenBalance[1].positive).toString()) : _util.BN_ZERO;
250
+ tokenFreeBalance = tokenFreeBalance.add(bnFreeTokenBalance);
251
+ }
252
+ const tokenBalance = {
253
+ free: tokenFreeBalance.toString(),
254
+ locked: '0',
255
+ // Equilibrium doesn't show locked balance
256
+ state: _KoniTypes.APIItemState.READY,
257
+ tokenSlug: tokenInfo.slug
258
+ };
259
+ callBack(tokenBalance);
260
+ });
261
+ });
262
+ return () => {
263
+ unsub();
264
+ };
265
+ }
266
+
267
+ // eslint-disable-next-line @typescript-eslint/require-await
268
+ async function subscribeEqBalanceAccountPallet(addresses, chain, api, callBack, includeNativeToken) {
269
+ const tokenTypes = includeNativeToken ? [_types._AssetType.NATIVE, _types._AssetType.LOCAL] : [_types._AssetType.LOCAL];
270
+ const tokenMap = _handlers.state.getAssetByChainAndAsset(chain, tokenTypes);
271
+ const unsubList = Object.values(tokenMap).map(async tokenInfo => {
272
+ try {
273
+ const assetId = (0, _utils2._getTokenOnChainAssetId)(tokenInfo);
274
+ const unsub = await api.query.eqBalances.account.multi(addresses.map(address => [address, [assetId]]), balances => {
275
+ const tokenBalance = {
276
+ free: (0, _utils3.sumBN)(balances.map(b => b.asPositive)).toString(),
277
+ locked: '0',
278
+ // Equilibrium doesn't show locked balance
279
+ state: _KoniTypes.APIItemState.READY,
280
+ tokenSlug: tokenInfo.slug
281
+ };
282
+ callBack(tokenBalance);
283
+ });
284
+ return unsub;
285
+ } catch (err) {
286
+ console.warn(err);
287
+ return undefined;
288
+ }
289
+ });
290
+ return () => {
291
+ unsubList.forEach(subProm => {
292
+ subProm.then(unsub => {
293
+ unsub && unsub();
294
+ }).catch(console.error);
295
+ });
296
+ };
297
+ }
298
+
299
+ // eslint-disable-next-line @typescript-eslint/require-await
300
+ async function subscribeOrmlTokensPallet(addresses, chain, api, callBack) {
301
+ const tokenTypes = [_types._AssetType.LOCAL];
302
+ const tokenMap = _handlers.state.getAssetByChainAndAsset(chain, tokenTypes);
303
+ const unsubList = Object.values(tokenMap).map(async tokenInfo => {
304
+ try {
305
+ const onChainInfo = (0, _utils2._getTokenOnChainInfo)(tokenInfo);
306
+
307
+ // Get Token Balance
308
+ // @ts-ignore
309
+ const unsub = await api.query.ormlTokens.accounts.multi(addresses.map(address => [address, onChainInfo]), balances => {
310
+ const tokenBalance = {
311
+ reserved: (0, _utils3.sumBN)(balances.map(b => b.reserved || new _util.BN(0))),
312
+ frozen: (0, _utils3.sumBN)(balances.map(b => b.frozen || new _util.BN(0))),
313
+ free: (0, _utils3.sumBN)(balances.map(b => b.free || new _util.BN(0))) // free is actually total balance
314
+ };
315
+
316
+ // free balance = total balance - frozen misc
317
+ // locked balance = reserved + frozen misc
318
+ const freeBalance = tokenBalance.free.sub(tokenBalance.frozen);
319
+ const lockedBalance = tokenBalance.frozen.add(tokenBalance.reserved);
320
+ callBack({
321
+ tokenSlug: tokenInfo.slug,
322
+ state: _KoniTypes.APIItemState.READY,
323
+ free: freeBalance.toString(),
324
+ locked: lockedBalance.toString(),
325
+ substrateInfo: {
326
+ reserved: tokenBalance.reserved.toString(),
327
+ miscFrozen: tokenBalance.frozen.toString()
328
+ }
329
+ });
330
+ });
331
+ return unsub;
332
+ } catch (err) {
333
+ console.warn(err);
334
+ return undefined;
335
+ }
336
+ });
337
+ return () => {
338
+ unsubList.forEach(subProm => {
339
+ subProm.then(unsub => {
340
+ unsub && unsub();
341
+ }).catch(console.error);
342
+ });
343
+ };
344
+ }
345
+ async function subscribeTokensAccountsPallet(addresses, chain, api, callBack, includeNativeToken) {
346
+ const tokenTypes = includeNativeToken ? [_types._AssetType.NATIVE, _types._AssetType.LOCAL] : [_types._AssetType.LOCAL];
347
+ const tokenMap = _handlers.state.getAssetByChainAndAsset(chain, tokenTypes);
348
+ const unsubList = await Promise.all(Object.values(tokenMap).map(async tokenInfo => {
349
+ try {
350
+ const onChainInfo = (0, _utils2._getTokenOnChainInfo)(tokenInfo);
351
+ const assetId = (0, _utils2._getTokenOnChainAssetId)(tokenInfo);
352
+
353
+ // Get Token Balance
354
+ // @ts-ignore
355
+ return await api.query.tokens.accounts.multi(addresses.map(address => [address, onChainInfo || assetId]), balances => {
356
+ const tokenBalance = {
357
+ reserved: (0, _utils3.sumBN)(balances.map(b => b.reserved || new _util.BN(0))),
358
+ frozen: (0, _utils3.sumBN)(balances.map(b => b.frozen || new _util.BN(0))),
359
+ free: (0, _utils3.sumBN)(balances.map(b => b.free || new _util.BN(0))) // free is actually total balance
360
+ };
361
+
362
+ // free balance = total balance - frozen misc
363
+ // locked balance = reserved + frozen misc
364
+ const freeBalance = tokenBalance.free.sub(tokenBalance.frozen);
365
+ const lockedBalance = tokenBalance.frozen.add(tokenBalance.reserved);
366
+ callBack({
367
+ tokenSlug: tokenInfo.slug,
368
+ state: _KoniTypes.APIItemState.READY,
369
+ free: freeBalance.toString(),
370
+ locked: lockedBalance.toString(),
371
+ substrateInfo: {
372
+ reserved: tokenBalance.reserved.toString(),
373
+ miscFrozen: tokenBalance.frozen.toString()
374
+ }
375
+ });
376
+ });
377
+ } catch (err) {
378
+ console.warn(err);
379
+ }
380
+ return undefined;
381
+ }));
382
+ return () => {
383
+ unsubList.forEach(unsub => {
384
+ unsub && unsub();
385
+ });
386
+ };
387
+ }
388
+ async function subscribeAssetsAccountPallet(addresses, chain, api, callBack) {
389
+ const tokenMap = _handlers.state.getAssetByChainAndAsset(chain, [_types._AssetType.LOCAL]);
390
+ Object.values(tokenMap).forEach(token => {
391
+ if (_constants2._MANTA_ZK_CHAIN_GROUP.includes(token.originChain) && token.symbol.startsWith(_constants2._ZK_ASSET_PREFIX)) {
392
+ delete tokenMap[token.slug];
393
+ }
394
+ });
395
+ const unsubList = await Promise.all(Object.values(tokenMap).map(async tokenInfo => {
396
+ try {
397
+ const assetIndex = (0, _utils2._getTokenOnChainAssetId)(tokenInfo);
398
+
399
+ // Get Token Balance
400
+ return await api.query.assets.account.multi(addresses.map(address => [assetIndex, address]), balances => {
401
+ let total = new _util.BN(0);
402
+ let frozen = new _util.BN(0);
403
+ balances.forEach(b => {
404
+ // @ts-ignore
405
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-assignment
406
+ const bdata = b === null || b === void 0 ? void 0 : b.toHuman();
407
+ if (bdata) {
408
+ // @ts-ignore
409
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access,@typescript-eslint/no-unsafe-argument
410
+ const addressBalance = new _util.BN(String(bdata === null || bdata === void 0 ? void 0 : bdata.balance).replaceAll(',', '') || '0');
411
+
412
+ // @ts-ignore
413
+ if (bdata !== null && bdata !== void 0 && bdata.isFrozen) {
414
+ frozen = frozen.add(addressBalance);
415
+ } else {
416
+ total = total.add(addressBalance);
417
+ }
418
+ }
419
+ });
420
+ const free = total.sub(frozen);
421
+ callBack({
422
+ tokenSlug: tokenInfo.slug,
423
+ free: free.toString(),
424
+ locked: frozen.toString(),
425
+ state: _KoniTypes.APIItemState.READY,
426
+ substrateInfo: {
427
+ miscFrozen: frozen.toString(),
428
+ reserved: '0'
429
+ }
430
+ });
431
+ });
432
+ } catch (err) {
433
+ console.warn(err);
434
+ }
435
+ return undefined;
436
+ }));
437
+ return () => {
438
+ unsubList.forEach(unsub => {
439
+ unsub && unsub();
440
+ });
441
+ };
442
+ }
443
+ function subscribeEVMBalance(chain, addresses, evmApiMap, callback, tokenInfo) {
444
+ const balanceItem = {
445
+ tokenSlug: tokenInfo.slug,
446
+ state: _KoniTypes.APIItemState.PENDING,
447
+ free: '0',
448
+ locked: '0'
449
+ };
450
+ function getBalance() {
451
+ (0, _balance.getEVMBalance)(chain, addresses, evmApiMap).then(balances => {
452
+ balanceItem.free = (0, _utils3.sumBN)(balances.map(b => new _util.BN(b || '0'))).toString();
453
+ balanceItem.state = _KoniTypes.APIItemState.READY;
454
+ callback(balanceItem);
455
+ }).catch(console.warn);
456
+ }
457
+ getBalance();
458
+ const interval = setInterval(getBalance, _constants.ASTAR_REFRESH_BALANCE_INTERVAL);
459
+ const unsub2 = subscribeERC20Interval(addresses, chain, evmApiMap, callback);
460
+ return () => {
461
+ clearInterval(interval);
462
+ unsub2 && unsub2();
463
+ };
464
+ }
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.fetchRemarkEvent = exports.fetchExtrinsicParams = void 0;
7
+ var _constants = require("./constants");
8
+ // Copyright 2019-2022 @subwallet/extension-base authors & contributors
9
+ // SPDX-License-Identifier: Apache-2.0
10
+
11
+ const fetchRemarkEvent = async (chain, address) => {
12
+ const params = {
13
+ ..._constants.BASE_FETCH_ORDINAL_EVENT_DATA,
14
+ address
15
+ };
16
+ const response = await fetch(_constants.GET_EVENT_LIST_API.replace('{{chain}}', chain), {
17
+ method: 'POST',
18
+ headers: {
19
+ 'Content-Type': 'application/json'
20
+ },
21
+ body: JSON.stringify(params)
22
+ });
23
+ const data = await response.json();
24
+ return data.data.events;
25
+ };
26
+ exports.fetchRemarkEvent = fetchRemarkEvent;
27
+ const fetchExtrinsicParams = async (chain, extrinsicIndexes) => {
28
+ const params = {
29
+ extrinsic_index: extrinsicIndexes
30
+ };
31
+ const response = await fetch(_constants.GET_EXTRINSIC_PARAMS_API.replace('{{chain}}', chain), {
32
+ method: 'POST',
33
+ headers: {
34
+ 'Content-Type': 'application/json'
35
+ },
36
+ body: JSON.stringify(params)
37
+ });
38
+ const data = await response.json();
39
+ return data.data;
40
+ };
41
+ exports.fetchExtrinsicParams = fetchExtrinsicParams;
@@ -24,7 +24,9 @@ exports.getParaCurrentInflation = getParaCurrentInflation;
24
24
  exports.getStakingAvailableActionsByChain = getStakingAvailableActionsByChain;
25
25
  exports.getStakingAvailableActionsByNominator = getStakingAvailableActionsByNominator;
26
26
  exports.getSupportedDaysByHistoryDepth = getSupportedDaysByHistoryDepth;
27
+ exports.getTopValidatorByPoints = getTopValidatorByPoints;
27
28
  exports.getValidatorLabel = getValidatorLabel;
29
+ exports.getValidatorPointsMap = getValidatorPointsMap;
28
30
  exports.getWithdrawalInfo = getWithdrawalInfo;
29
31
  exports.getYieldAvailableActionsByPosition = getYieldAvailableActionsByPosition;
30
32
  exports.getYieldAvailableActionsByType = getYieldAvailableActionsByType;
@@ -233,13 +235,13 @@ function getYieldAvailableActionsByPosition(yieldPosition, yieldPoolInfo, unclai
233
235
  const result = [];
234
236
  if ([_types.YieldPoolType.NATIVE_STAKING, _types.YieldPoolType.NOMINATION_POOL].includes(yieldPoolInfo.type)) {
235
237
  result.push(YieldAction.STAKE);
236
- const bnActiveStake = new _util.BN(yieldPosition.activeStake);
237
- if (yieldPosition.activeStake && bnActiveStake.gt(_util.BN_ZERO)) {
238
+ const bnActiveStake = new _bignumber.default(yieldPosition.activeStake);
239
+ if (yieldPosition.activeStake && bnActiveStake.gt('0')) {
238
240
  result.push(YieldAction.UNSTAKE);
239
241
  const isAstarNetwork = _constants2._STAKING_CHAIN_GROUP.astar.includes(yieldPosition.chain);
240
242
  const isAmplitudeNetwork = _constants2._STAKING_CHAIN_GROUP.amplitude.includes(yieldPosition.chain);
241
- const bnUnclaimedReward = new _util.BN(unclaimedReward || '0');
242
- if ((yieldPosition.type === _types.YieldPoolType.NOMINATION_POOL || isAmplitudeNetwork) && bnUnclaimedReward.gt(_util.BN_ZERO) || isAstarNetwork) {
243
+ const bnUnclaimedReward = new _bignumber.default(unclaimedReward || '0');
244
+ if ((yieldPosition.type === _types.YieldPoolType.NOMINATION_POOL || isAmplitudeNetwork) && bnUnclaimedReward.gt('0') || isAstarNetwork) {
243
245
  result.push(YieldAction.CLAIM_REWARD);
244
246
  }
245
247
  }
@@ -252,8 +254,8 @@ function getYieldAvailableActionsByPosition(yieldPosition, yieldPoolInfo, unclai
252
254
  }
253
255
  } else if (yieldPoolInfo.type === _types.YieldPoolType.LIQUID_STAKING) {
254
256
  result.push(YieldAction.START_EARNING);
255
- const activeBalance = new _util.BN(yieldPosition.activeStake || '0');
256
- if (activeBalance.gt(_util.BN_ZERO)) {
257
+ const activeBalance = new _bignumber.default(yieldPosition.activeStake);
258
+ if (activeBalance.gt('0')) {
257
259
  result.push(YieldAction.UNSTAKE);
258
260
  }
259
261
  const hasWithdrawal = yieldPosition.unstakings.some(unstakingInfo => unstakingInfo.status === _types.UnstakingStatus.CLAIMABLE);
@@ -387,6 +389,33 @@ function getSupportedDaysByHistoryDepth(erasPerDay, maxSupportedEras) {
387
389
  return 15;
388
390
  }
389
391
  }
392
+ function getValidatorPointsMap(eraRewardMap) {
393
+ // mapping store validator and totalPoints
394
+ const validatorTotalPointsMap = {};
395
+ Object.values(eraRewardMap).forEach(info => {
396
+ const individual = info.individual;
397
+ Object.entries(individual).forEach(_ref => {
398
+ let [validator, rawPoints] = _ref;
399
+ const points = rawPoints.replaceAll(',', '');
400
+ if (!validatorTotalPointsMap[validator]) {
401
+ validatorTotalPointsMap[validator] = new _bignumber.default(points);
402
+ } else {
403
+ validatorTotalPointsMap[validator] = validatorTotalPointsMap[validator].plus(points);
404
+ }
405
+ });
406
+ });
407
+ return validatorTotalPointsMap;
408
+ }
409
+ function getTopValidatorByPoints(validatorPointsList) {
410
+ const sortValidatorPointsList = Object.fromEntries(Object.entries(validatorPointsList).sort((a, b) => a[1].minus(b[1]).toNumber()).reverse());
411
+
412
+ // keep 50% first validator
413
+ const entries = Object.entries(sortValidatorPointsList);
414
+ const endIndex = Math.ceil(entries.length / 2);
415
+ const top50PercentEntries = entries.slice(0, endIndex);
416
+ const top50PercentRecord = Object.fromEntries(top50PercentEntries);
417
+ return Object.keys(top50PercentRecord);
418
+ }
390
419
  const getMinStakeErrorMessage = (chainInfo, bnMinStake) => {
391
420
  const tokenInfo = (0, _utils._getChainNativeTokenBasicInfo)(chainInfo);
392
421
  const number = (0, _number.formatNumber)(bnMinStake.toString(), tokenInfo.decimals || 0, _number.balanceFormatter);
@@ -4047,6 +4047,78 @@ class KoniExtension {
4047
4047
 
4048
4048
  /* Buy service */
4049
4049
 
4050
+ /* Swap service */
4051
+ async subscribeSwapPairs(id, port) {
4052
+ const cb = (0, _subscriptions.createSubscription)(id, port);
4053
+ let ready = false;
4054
+ await this.#koniState.swapService.waitForStarted();
4055
+ const callback = rs => {
4056
+ if (ready) {
4057
+ cb(rs);
4058
+ }
4059
+ };
4060
+ const subscription = this.#koniState.swapService.subscribeSwapPairs(callback);
4061
+ this.createUnsubscriptionHandle(id, subscription.unsubscribe);
4062
+ port.onDisconnect.addListener(() => {
4063
+ this.cancelSubscription(id);
4064
+ });
4065
+ ready = true;
4066
+ return this.#koniState.swapService.getSwapPairs();
4067
+ }
4068
+ async handleSwapRequest(request) {
4069
+ return this.#koniState.swapService.handleSwapRequest(request);
4070
+ }
4071
+ async getLatestSwapQuote(swapRequest) {
4072
+ return this.#koniState.swapService.getLatestQuotes(swapRequest);
4073
+ }
4074
+ async validateSwapProcess(params) {
4075
+ return this.#koniState.swapService.validateSwapProcess(params);
4076
+ }
4077
+ async handleSwapStep(inputData) {
4078
+ const {
4079
+ address,
4080
+ process,
4081
+ quote,
4082
+ recipient
4083
+ } = inputData;
4084
+ if (!quote || !address || !process) {
4085
+ return this.#koniState.transactionService.generateBeforeHandleResponseErrors([new _TransactionError.TransactionError(_KoniTypes.BasicTxErrorType.INTERNAL_ERROR)]);
4086
+ }
4087
+ const isLastStep = inputData.currentStep + 1 === process.steps.length;
4088
+ const swapValidations = await this.#koniState.swapService.validateSwapProcess({
4089
+ address,
4090
+ process,
4091
+ selectedQuote: quote,
4092
+ recipient
4093
+ });
4094
+ if (swapValidations.length > 0) {
4095
+ return this.#koniState.transactionService.generateBeforeHandleResponseErrors(swapValidations);
4096
+ }
4097
+
4098
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
4099
+ const {
4100
+ chainType,
4101
+ extrinsic,
4102
+ extrinsicType,
4103
+ transferNativeAmount,
4104
+ txChain,
4105
+ txData
4106
+ } = await this.#koniState.swapService.handleSwapProcess(inputData);
4107
+ return await this.#koniState.transactionService.handleTransaction({
4108
+ address,
4109
+ chain: txChain,
4110
+ transaction: extrinsic,
4111
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
4112
+ data: txData,
4113
+ extrinsicType,
4114
+ // change this depends on step
4115
+ chainType,
4116
+ resolveOnDone: !isLastStep,
4117
+ transferNativeAmount
4118
+ });
4119
+ }
4120
+ /* Swap service */
4121
+
4050
4122
  // --------------------------------------------------------------
4051
4123
  // eslint-disable-next-line @typescript-eslint/require-await
4052
4124
  async handle(id, type, request, port) {
@@ -4576,6 +4648,19 @@ class KoniExtension {
4576
4648
  case 'pri(database.exportJson)':
4577
4649
  return this.#koniState.dbService.getExportJson();
4578
4650
  /* Database */
4651
+
4652
+ /* Swap service */
4653
+ case 'pri(swapService.subscribePairs)':
4654
+ return this.subscribeSwapPairs(id, port);
4655
+ case 'pri(swapService.handleSwapRequest)':
4656
+ return this.handleSwapRequest(request);
4657
+ case 'pri(swapService.getLatestQuote)':
4658
+ return this.getLatestSwapQuote(request);
4659
+ case 'pri(swapService.validateSwapProcess)':
4660
+ return this.validateSwapProcess(request);
4661
+ case 'pri(swapService.handleSwapStep)':
4662
+ return this.handleSwapStep(request);
4663
+ /* Swap service */
4579
4664
  // Default
4580
4665
  default:
4581
4666
  throw new Error(`Unable to handle message of type ${type}`);