@subwallet/extension-base 1.1.23-0 → 1.1.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 (82) hide show
  1. package/background/KoniTypes.d.ts +12 -26
  2. package/cjs/constants/index.js +9 -3
  3. package/cjs/koni/api/staking/bonding/index.js +1 -0
  4. package/cjs/koni/api/tokens/evm/balance.js +5 -1
  5. package/cjs/koni/api/tokens/evm/transfer.js +8 -4
  6. package/cjs/koni/background/cron.js +2 -2
  7. package/cjs/koni/background/handlers/Extension.js +14 -5
  8. package/cjs/koni/background/handlers/Mobile.js +32 -0
  9. package/cjs/koni/background/handlers/State.js +126 -45
  10. package/cjs/koni/background/subscription.js +2 -2
  11. package/cjs/packageInfo.js +1 -1
  12. package/cjs/services/balance-service/helpers/group.js +53 -0
  13. package/cjs/services/balance-service/helpers/subscribe/balance.js +111 -0
  14. package/cjs/services/balance-service/helpers/subscribe/evm.js +95 -0
  15. package/cjs/services/balance-service/helpers/subscribe/substrate/equilibrium.js +113 -0
  16. package/cjs/services/balance-service/helpers/subscribe/substrate/index.js +324 -0
  17. package/cjs/services/balance-service/index.js +41 -16
  18. package/cjs/services/history-service/helpers/subscan-extrinsic-parser-helper.js +7 -1
  19. package/cjs/services/history-service/index.js +12 -8
  20. package/cjs/services/migration-service/scripts/MigrateProvider.js +1 -1
  21. package/cjs/services/storage-service/DatabaseService.js +47 -2
  22. package/cjs/services/storage-service/db-stores/Balance.js +9 -9
  23. package/cjs/services/subscan-service/index.js +66 -22
  24. package/cjs/services/transaction-service/index.js +4 -3
  25. package/cjs/types/balance.js +1 -0
  26. package/cjs/types/index.js +11 -0
  27. package/cjs/utils/{address.js → account.js} +32 -2
  28. package/cjs/utils/eth.js +7 -2
  29. package/cjs/utils/index.js +12 -0
  30. package/constants/index.d.ts +2 -0
  31. package/constants/index.js +2 -0
  32. package/koni/api/staking/bonding/index.js +1 -0
  33. package/koni/api/tokens/evm/balance.js +5 -1
  34. package/koni/api/tokens/evm/transfer.d.ts +1 -1
  35. package/koni/api/tokens/evm/transfer.js +8 -4
  36. package/koni/background/cron.js +3 -3
  37. package/koni/background/handlers/Extension.js +14 -5
  38. package/koni/background/handlers/Mobile.d.ts +5 -1
  39. package/koni/background/handlers/Mobile.js +31 -0
  40. package/koni/background/handlers/State.d.ts +6 -4
  41. package/koni/background/handlers/State.js +114 -34
  42. package/koni/background/subscription.js +2 -2
  43. package/package.json +40 -14
  44. package/packageInfo.js +1 -1
  45. package/services/balance-service/helpers/group.d.ts +9 -0
  46. package/services/balance-service/helpers/group.js +46 -0
  47. package/services/balance-service/helpers/subscribe/balance.d.ts +4 -0
  48. package/services/balance-service/helpers/subscribe/balance.js +103 -0
  49. package/services/balance-service/helpers/subscribe/evm.d.ts +5 -0
  50. package/services/balance-service/helpers/subscribe/evm.js +87 -0
  51. package/services/balance-service/helpers/subscribe/substrate/equilibrium.d.ts +4 -0
  52. package/services/balance-service/helpers/subscribe/substrate/equilibrium.js +105 -0
  53. package/services/balance-service/helpers/subscribe/substrate/index.d.ts +4 -0
  54. package/services/balance-service/helpers/subscribe/substrate/index.js +316 -0
  55. package/services/balance-service/index.d.ts +24 -5
  56. package/services/balance-service/index.js +40 -14
  57. package/services/history-service/helpers/subscan-extrinsic-parser-helper.js +7 -1
  58. package/services/history-service/index.js +12 -8
  59. package/services/migration-service/scripts/MigrateProvider.js +1 -1
  60. package/services/storage-service/DatabaseService.d.ts +7 -2
  61. package/services/storage-service/DatabaseService.js +47 -2
  62. package/services/storage-service/databases/index.d.ts +2 -1
  63. package/services/storage-service/db-stores/Balance.d.ts +2 -2
  64. package/services/storage-service/db-stores/Balance.js +9 -9
  65. package/services/subscan-service/index.d.ts +11 -5
  66. package/services/subscan-service/index.js +66 -26
  67. package/services/subscan-service/types.d.ts +4 -0
  68. package/services/transaction-service/index.js +5 -4
  69. package/types/balance.d.ts +40 -0
  70. package/types/balance.js +1 -0
  71. package/types/index.d.ts +1 -0
  72. package/types/index.js +1 -0
  73. package/utils/account.d.ts +15 -0
  74. package/utils/{address.js → account.js} +28 -0
  75. package/utils/eth.d.ts +1 -0
  76. package/utils/eth.js +4 -0
  77. package/utils/index.d.ts +1 -0
  78. package/utils/index.js +1 -0
  79. package/cjs/koni/api/dotsama/balance.js +0 -464
  80. package/koni/api/dotsama/balance.d.ts +0 -6
  81. package/koni/api/dotsama/balance.js +0 -451
  82. package/utils/address.d.ts +0 -5
@@ -7,6 +7,7 @@ import { isSubscriptionRunning, unsubscribe } from '@subwallet/extension-base/ba
7
7
  import { APIItemState, BasicTxErrorType, ChainType, EvmProviderErrorType, ExternalRequestPromiseStatus, ExtrinsicType } from '@subwallet/extension-base/background/KoniTypes';
8
8
  import { ALL_ACCOUNT_KEY, ALL_GENESIS_HASH, MANTA_PAY_BALANCE_INTERVAL } from '@subwallet/extension-base/constants';
9
9
  import { BalanceService } from '@subwallet/extension-base/services/balance-service';
10
+ import { groupBalance } from '@subwallet/extension-base/services/balance-service/helpers/group';
10
11
  import { ServiceStatus } from '@subwallet/extension-base/services/base/types';
11
12
  import BuyService from '@subwallet/extension-base/services/buy-service';
12
13
  import CampaignService from '@subwallet/extension-base/services/campaign-service';
@@ -27,7 +28,8 @@ import { SUBSCAN_API_CHAIN_MAP, SUBSCAN_BALANCE_CHAIN_MAP_REVERSE } from '@subwa
27
28
  import TransactionService from '@subwallet/extension-base/services/transaction-service';
28
29
  import WalletConnectService from '@subwallet/extension-base/services/wallet-connect-service';
29
30
  import AccountRefStore from '@subwallet/extension-base/stores/AccountRef';
30
- import { stripUrl } from '@subwallet/extension-base/utils';
31
+ import { isAccountAll, isSameAddress, stripUrl, TARGET_ENV } from '@subwallet/extension-base/utils';
32
+ import { recalculateGasPrice } from '@subwallet/extension-base/utils/eth';
31
33
  import { isContractAddress, parseContractInput } from '@subwallet/extension-base/utils/eth/parseTransaction';
32
34
  import { createPromiseHandler } from '@subwallet/extension-base/utils/promise';
33
35
  import { decodePair } from '@subwallet/keyring/pair/decode';
@@ -90,7 +92,7 @@ export default class KoniState {
90
92
  this.settingService = new SettingService();
91
93
  this.requestService = new RequestService(this.chainService, this.settingService, this.keyringService);
92
94
  this.priceService = new PriceService(this.dbService, this.eventService, this.chainService);
93
- this.balanceService = new BalanceService(this.chainService);
95
+ this.balanceService = new BalanceService(this);
94
96
  this.historyService = new HistoryService(this.dbService, this.chainService, this.eventService, this.keyringService, this.subscanService);
95
97
  this.transactionService = new TransactionService(this.chainService, this.eventService, this.requestService, this.balanceService, this.historyService, this.notificationService, this.dbService);
96
98
  this.walletConnectService = new WalletConnectService(this, this.requestService);
@@ -102,7 +104,9 @@ export default class KoniState {
102
104
  this.logger = createLogger('State');
103
105
 
104
106
  // Init state
105
- this.init().catch(console.error);
107
+ if (TARGET_ENV !== 'mobile') {
108
+ this.init().catch(console.error);
109
+ }
106
110
  }
107
111
 
108
112
  // Clone from polkadot.js
@@ -185,16 +189,23 @@ export default class KoniState {
185
189
  generateDefaultBalanceMap() {
186
190
  const balanceMap = {};
187
191
  const activeChains = this.chainService.getActiveChainInfoMap();
188
- Object.values(activeChains).forEach(chainInfo => {
189
- const chainAssetMap = this.chainService.getFungibleTokensByChain(chainInfo.slug);
190
- Object.keys(chainAssetMap).forEach(assetSlug => {
191
- balanceMap[assetSlug] = {
192
- tokenSlug: assetSlug,
193
- free: '',
194
- locked: '',
195
- state: APIItemState.PENDING
196
- };
192
+ const isAllAccount = isAccountAll(this.keyringService.currentAccount.address);
193
+ const addresses = isAllAccount ? Object.keys(this.keyringService.accounts) : [this.keyringService.currentAccount.address];
194
+ addresses.forEach(address => {
195
+ const temp = {};
196
+ Object.values(activeChains).forEach(chainInfo => {
197
+ const chainAssetMap = this.chainService.getFungibleTokensByChain(chainInfo.slug);
198
+ Object.keys(chainAssetMap).forEach(assetSlug => {
199
+ temp[assetSlug] = {
200
+ address,
201
+ tokenSlug: assetSlug,
202
+ free: '',
203
+ locked: '',
204
+ state: APIItemState.PENDING
205
+ };
206
+ });
197
207
  });
208
+ balanceMap[address] = temp;
198
209
  });
199
210
  return balanceMap;
200
211
  }
@@ -664,14 +675,17 @@ export default class KoniState {
664
675
  }
665
676
  removeInactiveChainBalances(balanceMap) {
666
677
  const activeBalanceMap = {};
667
- Object.entries(balanceMap).forEach(([tokenSlug, balanceItem]) => {
668
- const tokenInfo = this.chainService.getAssetBySlug(tokenSlug);
669
- if (tokenInfo) {
670
- const chainInfo = this.chainService.getChainInfoByKey(tokenInfo.originChain);
671
- if (chainInfo && this.getChainStateByKey(chainInfo.slug).active) {
672
- activeBalanceMap[tokenSlug] = balanceItem;
678
+ Object.entries(balanceMap).forEach(([address, balances]) => {
679
+ activeBalanceMap[address] = {};
680
+ Object.entries(balances).forEach(([tokenSlug, item]) => {
681
+ const tokenInfo = this.chainService.getAssetBySlug(tokenSlug);
682
+ if (tokenInfo) {
683
+ const chainInfo = this.chainService.getChainInfoByKey(tokenInfo.originChain);
684
+ if (chainInfo && this.getChainStateByKey(chainInfo.slug).active) {
685
+ activeBalanceMap[address][tokenSlug] = item;
686
+ }
673
687
  }
674
- }
688
+ });
675
689
  });
676
690
  return activeBalanceMap;
677
691
  }
@@ -683,7 +697,7 @@ export default class KoniState {
683
697
  };
684
698
  }
685
699
  async getStoredBalance(address) {
686
- const items = await this.dbService.stores.balance.getBalanceMapByAddress(address);
700
+ const items = await this.dbService.stores.balance.getBalanceMapByAddresses(address);
687
701
  return items || {};
688
702
  }
689
703
  async handleSwitchAccount(newAddress) {
@@ -693,6 +707,31 @@ export default class KoniState {
693
707
  const defaultData = this.generateDefaultBalanceMap();
694
708
  let storedData = await this.getStoredBalance(newAddress);
695
709
  storedData = this.removeInactiveChainBalances(storedData);
710
+ const result = {};
711
+ for (const [address, balanceInfo] of Object.entries(defaultData)) {
712
+ result[address] = {
713
+ ...balanceInfo
714
+ };
715
+ }
716
+ for (const [address, balanceInfo] of Object.entries(storedData)) {
717
+ if (!result[address]) {
718
+ result[address] = {
719
+ ...balanceInfo
720
+ };
721
+ } else {
722
+ const temp = {
723
+ ...result[address]
724
+ };
725
+ for (const [slug, item] of Object.entries(balanceInfo)) {
726
+ temp[slug] = {
727
+ ...item
728
+ };
729
+ }
730
+ result[address] = {
731
+ ...temp
732
+ };
733
+ }
734
+ }
696
735
  this.balanceMap = {
697
736
  ...defaultData,
698
737
  ...storedData
@@ -720,19 +759,59 @@ export default class KoniState {
720
759
  });
721
760
  });
722
761
  }
723
- setBalanceItem(tokenSlug, item) {
724
- this.balanceMap[tokenSlug] = {
725
- timestamp: +new Date(),
726
- ...item
727
- };
728
- this.updateBalanceStore(item);
729
- this.lazyNext('setBalanceItem', () => {
730
- this.publishBalance();
731
- });
762
+
763
+ /** Note: items must be same tokenSlug */
764
+ setBalanceItem(items) {
765
+ if (items.length) {
766
+ const tokens = [];
767
+ const updates = [];
768
+ for (const item of items) {
769
+ const address = item.address;
770
+ const tokenSlug = item.tokenSlug;
771
+ if (!tokens.includes(tokenSlug)) {
772
+ tokens.push(tokenSlug);
773
+ }
774
+ if (!this.balanceMap[address]) {
775
+ this.balanceMap[address] = {};
776
+ }
777
+ const data = {
778
+ timestamp: +new Date(),
779
+ ...item
780
+ };
781
+ this.balanceMap[address][tokenSlug] = data;
782
+ updates.push(data);
783
+ }
784
+ const isAllAccount = isAccountAll(this.keyringService.currentAccount.address);
785
+ if (isAllAccount) {
786
+ const address = ALL_ACCOUNT_KEY;
787
+ for (const token of tokens) {
788
+ const items = [];
789
+ for (const [_adr, balanceInfo] of Object.entries(this.balanceMap)) {
790
+ if (!isSameAddress(_adr, address)) {
791
+ const item = balanceInfo[token];
792
+ item && items.push(item);
793
+ }
794
+ }
795
+ const _balance = groupBalance(items, address, token);
796
+ const balance = {
797
+ timestamp: +new Date(),
798
+ ..._balance
799
+ };
800
+ if (!this.balanceMap[address]) {
801
+ this.balanceMap[address] = {};
802
+ }
803
+ this.balanceMap[address][token] = balance;
804
+ updates.push(balance);
805
+ }
806
+ }
807
+ this.updateBalanceStore(updates);
808
+ this.lazyNext('setBalanceItem', () => {
809
+ this.publishBalance();
810
+ });
811
+ }
732
812
  }
733
- updateBalanceStore(item) {
734
- const currentAccountInfo = this.keyringService.currentAccount;
735
- this.dbService.updateBalanceStore(currentAccountInfo.address, item).catch(e => this.logger.warn(e));
813
+ updateBalanceStore(items) {
814
+ this.dbService.updateBulkBalanceStore(items).catch(e => this.logger.warn(e));
736
815
  }
737
816
  subscribeBalance() {
738
817
  return this.balanceSubject;
@@ -1228,7 +1307,8 @@ export default class KoniState {
1228
1307
  // eslint-disable-next-line @typescript-eslint/no-unsafe-argument
1229
1308
  throw new EvmProviderError(EvmProviderErrorType.INVALID_PARAMS, e === null || e === void 0 ? void 0 : e.message);
1230
1309
  }
1231
- const gasPrice = await web3.eth.getGasPrice();
1310
+ const _price = await web3.eth.getGasPrice();
1311
+ const gasPrice = recalculateGasPrice(_price, networkKey);
1232
1312
  transaction.gasPrice = gasPrice;
1233
1313
  const estimateGas = new BN(gasPrice.toString()).mul(new BN(transaction.gas)).toString();
1234
1314
 
@@ -1661,7 +1741,7 @@ export default class KoniState {
1661
1741
  };
1662
1742
  balanceItem.free = ((_zkBalances$i = zkBalances[i]) === null || _zkBalances$i === void 0 ? void 0 : _zkBalances$i.toString()) || '0';
1663
1743
  balanceItem.state = APIItemState.READY;
1664
- this.setBalanceItem(balanceItem.tokenSlug, balanceItem);
1744
+ this.setBalanceItem([balanceItem]);
1665
1745
  }
1666
1746
  }).catch(console.warn);
1667
1747
  }
@@ -1,12 +1,12 @@
1
1
  // Copyright 2019-2022 @subwallet/extension-koni authors & contributors
2
2
  // SPDX-License-Identifier: Apache-2.0
3
3
 
4
- import { subscribeBalance } from '@subwallet/extension-base/koni/api/dotsama/balance';
5
4
  import { subscribeCrowdloan } from '@subwallet/extension-base/koni/api/dotsama/crowdloan';
6
5
  import { getNominationStakingRewardData, getPoolingStakingRewardData, stakingOnChainApi } from '@subwallet/extension-base/koni/api/staking';
7
6
  import { subscribeEssentialChainStakingMetadata } from '@subwallet/extension-base/koni/api/staking/bonding';
8
7
  import { getAmplitudeUnclaimedStakingReward } from '@subwallet/extension-base/koni/api/staking/paraChain';
9
8
  import { nftHandler } from '@subwallet/extension-base/koni/background/handlers';
9
+ import { subscribeBalance } from '@subwallet/extension-base/services/balance-service/helpers/subscribe/balance';
10
10
  import { _isChainEnabled, _isChainSupportSubstrateStaking } from '@subwallet/extension-base/services/chain-service/utils';
11
11
  import { COMMON_RELOAD_EVENTS } from '@subwallet/extension-base/services/event-service/types';
12
12
  import { waitTimeout } from '@subwallet/extension-base/utils';
@@ -147,7 +147,7 @@ export class KoniSubscription {
147
147
  }
148
148
  });
149
149
  const unsub = subscribeBalance(addresses, filteredChainInfoMap, substrateApiMap, evmApiMap, result => {
150
- this.state.setBalanceItem(result.tokenSlug, result);
150
+ this.state.setBalanceItem(result);
151
151
  });
152
152
  const unsub2 = this.state.subscribeMantaPayBalance();
153
153
  if (onlyRunOnFirstTime) {
package/package.json CHANGED
@@ -17,7 +17,7 @@
17
17
  "./cjs/detectPackage.js"
18
18
  ],
19
19
  "type": "module",
20
- "version": "1.1.23-0",
20
+ "version": "1.1.24-1",
21
21
  "main": "./cjs/index.js",
22
22
  "module": "./index.js",
23
23
  "types": "./index.d.ts",
@@ -164,11 +164,6 @@
164
164
  "require": "./cjs/koni/api/donate.js",
165
165
  "default": "./koni/api/donate.js"
166
166
  },
167
- "./koni/api/dotsama/balance": {
168
- "types": "./koni/api/dotsama/balance.d.ts",
169
- "require": "./cjs/koni/api/dotsama/balance.js",
170
- "default": "./koni/api/dotsama/balance.js"
171
- },
172
167
  "./koni/api/dotsama/crowdloan": {
173
168
  "types": "./koni/api/dotsama/crowdloan.d.ts",
174
169
  "require": "./cjs/koni/api/dotsama/crowdloan.js",
@@ -515,6 +510,31 @@
515
510
  "require": "./cjs/services/balance-service/index.js",
516
511
  "default": "./services/balance-service/index.js"
517
512
  },
513
+ "./services/balance-service/helpers/group": {
514
+ "types": "./services/balance-service/helpers/group.d.ts",
515
+ "require": "./cjs/services/balance-service/helpers/group.js",
516
+ "default": "./services/balance-service/helpers/group.js"
517
+ },
518
+ "./services/balance-service/helpers/subscribe/balance": {
519
+ "types": "./services/balance-service/helpers/subscribe/balance.d.ts",
520
+ "require": "./cjs/services/balance-service/helpers/subscribe/balance.js",
521
+ "default": "./services/balance-service/helpers/subscribe/balance.js"
522
+ },
523
+ "./services/balance-service/helpers/subscribe/evm": {
524
+ "types": "./services/balance-service/helpers/subscribe/evm.d.ts",
525
+ "require": "./cjs/services/balance-service/helpers/subscribe/evm.js",
526
+ "default": "./services/balance-service/helpers/subscribe/evm.js"
527
+ },
528
+ "./services/balance-service/helpers/subscribe/substrate": {
529
+ "types": "./services/balance-service/helpers/subscribe/substrate/index.d.ts",
530
+ "require": "./cjs/services/balance-service/helpers/subscribe/substrate/index.js",
531
+ "default": "./services/balance-service/helpers/subscribe/substrate/index.js"
532
+ },
533
+ "./services/balance-service/helpers/subscribe/substrate/equilibrium": {
534
+ "types": "./services/balance-service/helpers/subscribe/substrate/equilibrium.d.ts",
535
+ "require": "./cjs/services/balance-service/helpers/subscribe/substrate/equilibrium.js",
536
+ "default": "./services/balance-service/helpers/subscribe/substrate/equilibrium.js"
537
+ },
518
538
  "./services/base/types": {
519
539
  "types": "./services/base/types.d.ts",
520
540
  "require": "./cjs/services/base/types.js",
@@ -1203,6 +1223,11 @@
1203
1223
  "require": "./cjs/types/index.js",
1204
1224
  "default": "./types/index.js"
1205
1225
  },
1226
+ "./types/balance": {
1227
+ "types": "./types/balance.d.ts",
1228
+ "require": "./cjs/types/balance.js",
1229
+ "default": "./types/balance.js"
1230
+ },
1206
1231
  "./types/buy": {
1207
1232
  "types": "./types/buy.d.ts",
1208
1233
  "require": "./cjs/types/buy.js",
@@ -1213,10 +1238,10 @@
1213
1238
  "require": "./cjs/utils/index.js",
1214
1239
  "default": "./utils/index.js"
1215
1240
  },
1216
- "./utils/address": {
1217
- "types": "./utils/address.d.ts",
1218
- "require": "./cjs/utils/address.js",
1219
- "default": "./utils/address.js"
1241
+ "./utils/account": {
1242
+ "types": "./utils/account.d.ts",
1243
+ "require": "./cjs/utils/account.js",
1244
+ "default": "./utils/account.js"
1220
1245
  },
1221
1246
  "./utils/array": {
1222
1247
  "types": "./utils/array.d.ts",
@@ -1323,10 +1348,10 @@
1323
1348
  "@sora-substrate/type-definitions": "^1.17.7",
1324
1349
  "@substrate/connect": "^0.7.26",
1325
1350
  "@subwallet/chain-list": "0.2.26",
1326
- "@subwallet/extension-base": "^1.1.23-0",
1327
- "@subwallet/extension-chains": "^1.1.23-0",
1328
- "@subwallet/extension-dapp": "^1.1.23-0",
1329
- "@subwallet/extension-inject": "^1.1.23-0",
1351
+ "@subwallet/extension-base": "^1.1.24-1",
1352
+ "@subwallet/extension-chains": "^1.1.24-1",
1353
+ "@subwallet/extension-dapp": "^1.1.24-1",
1354
+ "@subwallet/extension-inject": "^1.1.24-1",
1330
1355
  "@subwallet/keyring": "^0.1.1",
1331
1356
  "@subwallet/ui-keyring": "^0.1.1",
1332
1357
  "@walletconnect/sign-client": "^2.8.4",
@@ -1341,6 +1366,7 @@
1341
1366
  "buffer": "^6.0.3",
1342
1367
  "cross-fetch": "^3.1.5",
1343
1368
  "dexie": "^3.2.2",
1369
+ "dexie-export-import": "^4.0.7",
1344
1370
  "eth-simple-keyring": "^4.2.0",
1345
1371
  "ethereumjs-tx": "^2.1.2",
1346
1372
  "ethereumjs-util": "^7.1.5",
package/packageInfo.js CHANGED
@@ -7,5 +7,5 @@ export const packageInfo = {
7
7
  name: '@subwallet/extension-base',
8
8
  path: (import.meta && import.meta.url) ? new URL(import.meta.url).pathname.substring(0, new URL(import.meta.url).pathname.lastIndexOf('/') + 1) : 'auto',
9
9
  type: 'esm',
10
- version: '1.1.23-0'
10
+ version: '1.1.24-1'
11
11
  };
@@ -0,0 +1,9 @@
1
+ import { BalanceItem } from '@subwallet/extension-base/types';
2
+ /**
3
+ * Group the balance of {token} from {items} into {address}
4
+ * @param {BalanceItem[]} items - List balance want to group
5
+ * @param {string} address - Address will be grouped to
6
+ * @param {string} token - Slug of token will be group balance
7
+ * @return {BalanceItem} - Grouped balance information of token
8
+ */
9
+ export declare const groupBalance: (items: BalanceItem[], address: string, token: string) => BalanceItem;
@@ -0,0 +1,46 @@
1
+ // Copyright 2019-2022 @subwallet/extension-base
2
+ // SPDX-License-Identifier: Apache-2.0
3
+
4
+ import { APIItemState } from '@subwallet/extension-base/background/KoniTypes';
5
+ import { sumBN } from '@subwallet/extension-base/utils';
6
+ import BN from 'bn.js';
7
+
8
+ /**
9
+ * Group the balance of {token} from {items} into {address}
10
+ * @param {BalanceItem[]} items - List balance want to group
11
+ * @param {string} address - Address will be grouped to
12
+ * @param {string} token - Slug of token will be group balance
13
+ * @return {BalanceItem} - Grouped balance information of token
14
+ */
15
+ export const groupBalance = (items, address, token) => {
16
+ const states = items.map(item => item.state);
17
+ const result = {
18
+ address,
19
+ tokenSlug: token,
20
+ free: sumBN(items.map(item => new BN(item.free))).toString(),
21
+ locked: sumBN(items.map(item => new BN(item.locked))).toString(),
22
+ state: states.every(item => item === APIItemState.NOT_SUPPORT) ? APIItemState.NOT_SUPPORT : states.some(item => item === APIItemState.READY) ? APIItemState.READY : APIItemState.PENDING
23
+ };
24
+ for (const item of items) {
25
+ if (item.substrateInfo) {
26
+ if (!result.substrateInfo) {
27
+ result.substrateInfo = {
28
+ ...item.substrateInfo
29
+ };
30
+ } else {
31
+ const old = {
32
+ ...result.substrateInfo
33
+ };
34
+ const _new = {
35
+ ...item.substrateInfo
36
+ };
37
+ result.substrateInfo = {
38
+ reserved: new BN(old.reserved || '0').add(new BN(_new.reserved || '0')).toString(),
39
+ feeFrozen: new BN(old.feeFrozen || '0').add(new BN(_new.feeFrozen || '0')).toString(),
40
+ miscFrozen: new BN(old.miscFrozen || '0').add(new BN(_new.miscFrozen || '0')).toString()
41
+ };
42
+ }
43
+ }
44
+ }
45
+ return result;
46
+ };
@@ -0,0 +1,4 @@
1
+ import { _ChainInfo } from '@subwallet/chain-list/types';
2
+ import { _EvmApi, _SubstrateApi } from '@subwallet/extension-base/services/chain-service/types';
3
+ import { BalanceItem } from '@subwallet/extension-base/types';
4
+ export declare function subscribeBalance(addresses: string[], chainInfoMap: Record<string, _ChainInfo>, substrateApiMap: Record<string, _SubstrateApi>, evmApiMap: Record<string, _EvmApi>, callback: (rs: BalanceItem[]) => void): () => void;
@@ -0,0 +1,103 @@
1
+ // Copyright 2019-2022 @subwallet/extension-base
2
+ // SPDX-License-Identifier: Apache-2.0
3
+
4
+ import { _AssetType } from '@subwallet/chain-list/types';
5
+ import { APIItemState } from '@subwallet/extension-base/background/KoniTypes';
6
+ import { state } from '@subwallet/extension-base/koni/background/handlers';
7
+ import { _getSubstrateGenesisHash, _isChainEvmCompatible, _isPureEvmChain } from '@subwallet/extension-base/services/chain-service/utils';
8
+ import { categoryAddresses } from '@subwallet/extension-base/utils';
9
+ import { getAccountJsonByAddress } from '@subwallet/extension-base/utils/account';
10
+ import { subscribeEVMBalance } from "./evm.js";
11
+ import { subscribeSubstrateBalance } from "./substrate/index.js";
12
+ const filterAddress = (addresses, chainInfo) => {
13
+ const isEvmChain = _isChainEvmCompatible(chainInfo);
14
+ const [substrateAddresses, evmAddresses] = categoryAddresses(addresses);
15
+ if (isEvmChain) {
16
+ return [evmAddresses, []];
17
+ } else {
18
+ const fetchList = [];
19
+ const unfetchList = [];
20
+ substrateAddresses.forEach(address => {
21
+ const account = getAccountJsonByAddress(address);
22
+ if (account) {
23
+ if (account.isHardware) {
24
+ const availGen = account.availableGenesisHashes || [];
25
+ const gen = _getSubstrateGenesisHash(chainInfo);
26
+ if (availGen.includes(gen)) {
27
+ fetchList.push(address);
28
+ } else {
29
+ unfetchList.push(address);
30
+ }
31
+ } else {
32
+ fetchList.push(address);
33
+ }
34
+ } else {
35
+ fetchList.push(address);
36
+ }
37
+ });
38
+ return [fetchList, [...unfetchList, ...evmAddresses]];
39
+ }
40
+ };
41
+
42
+ // main subscription
43
+ export function subscribeBalance(addresses, chainInfoMap, substrateApiMap, evmApiMap, callback) {
44
+ // Looping over each chain
45
+ const unsubList = Object.entries(chainInfoMap).map(async ([chainSlug, chainInfo]) => {
46
+ const [useAddresses, notSupportAddresses] = filterAddress(addresses, chainInfo);
47
+ if (notSupportAddresses.length) {
48
+ const tokens = state.chainService.getAssetByChainAndType(chainSlug, [_AssetType.NATIVE, _AssetType.ERC20, _AssetType.PSP22, _AssetType.LOCAL]);
49
+ const assetSetting = await state.chainService.getAssetSettings();
50
+ const filtered = Object.values(tokens).filter(({
51
+ slug
52
+ }) => {
53
+ var _assetSetting$slug;
54
+ return (_assetSetting$slug = assetSetting[slug]) === null || _assetSetting$slug === void 0 ? void 0 : _assetSetting$slug.visible;
55
+ });
56
+ const now = new Date().getTime();
57
+ notSupportAddresses.forEach(address => {
58
+ const items = filtered.map(token => {
59
+ return {
60
+ address,
61
+ tokenSlug: token.slug,
62
+ free: '0',
63
+ locked: '0',
64
+ state: APIItemState.NOT_SUPPORT,
65
+ timestamp: now
66
+ };
67
+ });
68
+ callback(items);
69
+ });
70
+ }
71
+ if (_isPureEvmChain(chainInfo)) {
72
+ const nativeTokenInfo = state.getNativeTokenInfo(chainSlug);
73
+ return subscribeEVMBalance(chainSlug, useAddresses, evmApiMap, callback, nativeTokenInfo);
74
+ }
75
+
76
+ // if (!useAddresses || useAddresses.length === 0 || _PURE_EVM_CHAINS.indexOf(chainSlug) > -1) {
77
+ // const fungibleTokensByChain = state.chainService.getFungibleTokensByChain(chainSlug, true);
78
+ // const now = new Date().getTime();
79
+ //
80
+ // Object.values(fungibleTokensByChain).map((token) => {
81
+ // return {
82
+ // tokenSlug: token.slug,
83
+ // free: '0',
84
+ // locked: '0',
85
+ // state: APIItemState.READY,
86
+ // timestamp: now
87
+ // } as BalanceItem;
88
+ // }).forEach(callback);
89
+ //
90
+ // return undefined;
91
+ // }
92
+
93
+ const networkAPI = await substrateApiMap[chainSlug].isReady;
94
+ return subscribeSubstrateBalance(useAddresses, chainInfo, chainSlug, networkAPI, evmApiMap, callback);
95
+ });
96
+ return () => {
97
+ unsubList.forEach(subProm => {
98
+ subProm.then(unsub => {
99
+ unsub && unsub();
100
+ }).catch(console.error);
101
+ });
102
+ };
103
+ }
@@ -0,0 +1,5 @@
1
+ import { _ChainAsset } from '@subwallet/chain-list/types';
2
+ import { _EvmApi } from '@subwallet/extension-base/services/chain-service/types';
3
+ import { BalanceItem } from '@subwallet/extension-base/types';
4
+ export declare function subscribeERC20Interval(addresses: string[], chain: string, evmApiMap: Record<string, _EvmApi>, callBack: (result: BalanceItem[]) => void): () => void;
5
+ export declare function subscribeEVMBalance(chain: string, addresses: string[], evmApiMap: Record<string, _EvmApi>, callback: (rs: BalanceItem[]) => void, tokenInfo: _ChainAsset): () => void;
@@ -0,0 +1,87 @@
1
+ // Copyright 2019-2022 @subwallet/extension-base
2
+ // SPDX-License-Identifier: Apache-2.0
3
+
4
+ import { _AssetType } from '@subwallet/chain-list/types';
5
+ import { APIItemState } from '@subwallet/extension-base/background/KoniTypes';
6
+ import { ASTAR_REFRESH_BALANCE_INTERVAL, SUB_TOKEN_REFRESH_BALANCE_INTERVAL } from '@subwallet/extension-base/constants';
7
+ import { getEVMBalance } from '@subwallet/extension-base/koni/api/tokens/evm/balance';
8
+ import { getERC20Contract } from '@subwallet/extension-base/koni/api/tokens/evm/web3';
9
+ import { state } from '@subwallet/extension-base/koni/background/handlers';
10
+ import { _getContractAddressOfToken } from '@subwallet/extension-base/services/chain-service/utils';
11
+ import { BN } from '@polkadot/util';
12
+ export function subscribeERC20Interval(addresses, chain, evmApiMap, callBack) {
13
+ let tokenList = {};
14
+ const erc20ContractMap = {};
15
+ const getTokenBalances = () => {
16
+ Object.values(tokenList).map(async tokenInfo => {
17
+ try {
18
+ const contract = erc20ContractMap[tokenInfo.slug];
19
+ const balances = await Promise.all(addresses.map(async address => {
20
+ try {
21
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-return,@typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access
22
+ return await contract.methods.balanceOf(address).call();
23
+ } catch (e) {
24
+ console.error(`Error on get balance of account ${address} for token ${tokenInfo.slug}`, e);
25
+ return '0';
26
+ }
27
+ }));
28
+ const items = balances.map((balance, index) => {
29
+ return {
30
+ address: addresses[index],
31
+ tokenSlug: tokenInfo.slug,
32
+ free: new BN(balance || 0).toString(),
33
+ locked: '0',
34
+ state: APIItemState.READY
35
+ };
36
+ });
37
+ callBack(items);
38
+ } catch (err) {
39
+ console.log(tokenInfo.slug, err);
40
+ }
41
+ });
42
+ };
43
+ tokenList = state.getAssetByChainAndAsset(chain, [_AssetType.ERC20]);
44
+ Object.entries(tokenList).forEach(([slug, tokenInfo]) => {
45
+ erc20ContractMap[slug] = getERC20Contract(chain, _getContractAddressOfToken(tokenInfo), evmApiMap);
46
+ });
47
+ getTokenBalances();
48
+ const interval = setInterval(getTokenBalances, SUB_TOKEN_REFRESH_BALANCE_INTERVAL);
49
+ return () => {
50
+ clearInterval(interval);
51
+ };
52
+ }
53
+ export function subscribeEVMBalance(chain, addresses, evmApiMap, callback, tokenInfo) {
54
+ function getBalance() {
55
+ getEVMBalance(chain, addresses, evmApiMap).then(balances => {
56
+ return balances.map((balance, index) => {
57
+ return {
58
+ address: addresses[index],
59
+ tokenSlug: tokenInfo.slug,
60
+ state: APIItemState.READY,
61
+ free: new BN(balance || '0').toString(),
62
+ locked: '0'
63
+ };
64
+ });
65
+ }).catch(e => {
66
+ console.error(`Error on get native balance with token ${tokenInfo.slug}`, e);
67
+ return addresses.map(address => {
68
+ return {
69
+ address: address,
70
+ tokenSlug: tokenInfo.slug,
71
+ state: APIItemState.READY,
72
+ free: '0',
73
+ locked: '0'
74
+ };
75
+ });
76
+ }).then(items => {
77
+ callback(items);
78
+ }).catch(console.error);
79
+ }
80
+ getBalance();
81
+ const interval = setInterval(getBalance, ASTAR_REFRESH_BALANCE_INTERVAL);
82
+ const unsub2 = subscribeERC20Interval(addresses, chain, evmApiMap, callback);
83
+ return () => {
84
+ clearInterval(interval);
85
+ unsub2 && unsub2();
86
+ };
87
+ }
@@ -0,0 +1,4 @@
1
+ import { BalanceItem } from '@subwallet/extension-base/types';
2
+ import { ApiPromise } from '@polkadot/api';
3
+ export declare function subscribeEquilibriumTokenBalance(addresses: string[], chain: string, api: ApiPromise, callBack: (rs: BalanceItem[]) => void, includeNativeToken?: boolean): Promise<() => void>;
4
+ export declare function subscribeEqBalanceAccountPallet(addresses: string[], chain: string, api: ApiPromise, callBack: (rs: BalanceItem[]) => void, includeNativeToken?: boolean): Promise<() => void>;