@subwallet/extension-base 1.0.6-2 → 1.0.7-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 (66) hide show
  1. package/background/KoniTypes.d.ts +11 -5
  2. package/cjs/constants/index.js +1 -1
  3. package/cjs/koni/api/staking/bonding/amplitude.js +83 -0
  4. package/cjs/koni/api/staking/bonding/astar.js +104 -1
  5. package/cjs/koni/api/staking/bonding/index.js +35 -0
  6. package/cjs/koni/api/staking/bonding/paraChain.js +97 -0
  7. package/cjs/koni/api/staking/bonding/relayChain.js +191 -12
  8. package/cjs/koni/api/staking/index.js +11 -11
  9. package/cjs/koni/api/staking/paraChain.js +200 -130
  10. package/cjs/koni/api/staking/relayChain.js +66 -68
  11. package/cjs/koni/api/staking/subsquidStaking.js +6 -11
  12. package/cjs/koni/background/cron.js +0 -25
  13. package/cjs/koni/background/handlers/State.js +18 -19
  14. package/cjs/koni/background/handlers/Tabs.js +68 -19
  15. package/cjs/koni/background/subscription.js +57 -12
  16. package/cjs/packageInfo.js +1 -1
  17. package/cjs/services/chain-service/utils.js +6 -1
  18. package/cjs/services/migration-service/index.js +2 -2
  19. package/cjs/services/request-service/handler/EvmRequestHandler.js +23 -0
  20. package/cjs/services/request-service/index.js +5 -0
  21. package/cjs/services/storage-service/DatabaseService.js +7 -3
  22. package/cjs/services/storage-service/db-stores/ChainStakingMetadata.js +5 -0
  23. package/cjs/services/storage-service/db-stores/NominatorMetadata.js +4 -4
  24. package/cjs/services/transaction-service/index.js +6 -1
  25. package/constants/index.d.ts +1 -1
  26. package/constants/index.js +1 -1
  27. package/koni/api/staking/bonding/amplitude.d.ts +4 -0
  28. package/koni/api/staking/bonding/amplitude.js +81 -0
  29. package/koni/api/staking/bonding/astar.d.ts +4 -0
  30. package/koni/api/staking/bonding/astar.js +102 -1
  31. package/koni/api/staking/bonding/index.d.ts +1 -0
  32. package/koni/api/staking/bonding/index.js +38 -4
  33. package/koni/api/staking/bonding/paraChain.d.ts +4 -0
  34. package/koni/api/staking/bonding/paraChain.js +95 -0
  35. package/koni/api/staking/bonding/relayChain.d.ts +5 -0
  36. package/koni/api/staking/bonding/relayChain.js +185 -10
  37. package/koni/api/staking/index.d.ts +4 -4
  38. package/koni/api/staking/index.js +11 -11
  39. package/koni/api/staking/paraChain.d.ts +5 -5
  40. package/koni/api/staking/paraChain.js +201 -131
  41. package/koni/api/staking/relayChain.d.ts +4 -4
  42. package/koni/api/staking/relayChain.js +66 -67
  43. package/koni/api/staking/subsquidStaking.d.ts +1 -1
  44. package/koni/api/staking/subsquidStaking.js +6 -11
  45. package/koni/background/cron.js +1 -26
  46. package/koni/background/handlers/State.d.ts +2 -2
  47. package/koni/background/handlers/State.js +18 -19
  48. package/koni/background/handlers/Tabs.js +68 -19
  49. package/koni/background/subscription.d.ts +2 -1
  50. package/koni/background/subscription.js +58 -13
  51. package/package.json +6 -6
  52. package/packageInfo.js +1 -1
  53. package/services/chain-service/types.d.ts +3 -0
  54. package/services/chain-service/utils.js +6 -1
  55. package/services/migration-service/index.js +2 -2
  56. package/services/request-service/handler/EvmRequestHandler.d.ts +1 -0
  57. package/services/request-service/handler/EvmRequestHandler.js +21 -0
  58. package/services/request-service/index.d.ts +1 -0
  59. package/services/request-service/index.js +3 -0
  60. package/services/storage-service/DatabaseService.d.ts +2 -2
  61. package/services/storage-service/DatabaseService.js +7 -3
  62. package/services/storage-service/db-stores/ChainStakingMetadata.d.ts +1 -0
  63. package/services/storage-service/db-stores/ChainStakingMetadata.js +3 -0
  64. package/services/storage-service/db-stores/NominatorMetadata.d.ts +2 -2
  65. package/services/storage-service/db-stores/NominatorMetadata.js +4 -4
  66. package/services/transaction-service/index.js +6 -1
@@ -1,98 +1,143 @@
1
1
  // Copyright 2019-2022 @subwallet/extension-koni authors & contributors
2
2
  // SPDX-License-Identifier: Apache-2.0
3
3
 
4
- import { APIItemState, StakingType } from '@subwallet/extension-base/background/KoniTypes';
4
+ import { APIItemState, StakingStatus, StakingType } from '@subwallet/extension-base/background/KoniTypes';
5
+ import { subscribeAmplitudeNominatorMetadata } from '@subwallet/extension-base/koni/api/staking/bonding/amplitude';
6
+ import { subscribeAstarNominatorMetadata } from '@subwallet/extension-base/koni/api/staking/bonding/astar';
7
+ import { subscribeParaChainNominatorMetadata } from '@subwallet/extension-base/koni/api/staking/bonding/paraChain';
5
8
  import { _STAKING_CHAIN_GROUP } from '@subwallet/extension-base/services/chain-service/constants';
6
9
  import { _getChainNativeTokenBasicInfo } from '@subwallet/extension-base/services/chain-service/utils';
7
10
  import { reformatAddress } from '@subwallet/extension-base/utils';
8
11
  import { BN, BN_ZERO } from '@polkadot/util';
9
12
  import { isEthereumAddress } from '@polkadot/util-crypto';
10
- function getSingleStakingAmplitude(parentApi, address, networks, chain, callback) {
11
- return parentApi.api.queryMulti([[parentApi.api.query.parachainStaking.delegatorState, address], [parentApi.api.query.parachainStaking.unstaking, address]], ([_delegatorState, _unstaking]) => {
12
- const _stakingData = _delegatorState.toHuman();
13
- const _unstakingData = _unstaking.toHuman();
14
- let _activeBalance = '0';
15
- if (_stakingData !== null) {
16
- _activeBalance = _stakingData.amount || _stakingData.total;
17
- _activeBalance = _activeBalance.replaceAll(',', '');
18
- }
19
- const activeBalance = new BN(_activeBalance);
20
- let unstakingBalance = BN_ZERO;
21
- if (_unstakingData !== null) {
22
- Object.values(_unstakingData).forEach(_unstakingAmount => {
23
- const bnUnstakingAmount = new BN(_unstakingAmount.replaceAll(',', ''));
24
- unstakingBalance = unstakingBalance.add(bnUnstakingAmount);
25
- });
26
- }
27
- const totalBalance = activeBalance.add(unstakingBalance);
13
+ function getSingleStakingAmplitude(substrateApi, address, chainInfoMap, chain, stakingCallback, nominatorStateCallback) {
14
+ return substrateApi.api.queryMulti([[substrateApi.api.query.parachainStaking.delegatorState, address], [substrateApi.api.query.parachainStaking.unstaking, address]], async ([_delegatorState, _unstaking]) => {
15
+ const delegatorState = _delegatorState.toPrimitive();
16
+ const unstakingInfo = _unstaking.toPrimitive();
28
17
  const {
29
18
  symbol
30
- } = _getChainNativeTokenBasicInfo(networks[chain]);
31
- const stakingItem = {
32
- name: networks[chain].name,
33
- chain: chain,
34
- balance: totalBalance.toString(),
35
- activeBalance: activeBalance.toString(),
36
- unlockingBalance: unstakingBalance.toString(),
37
- nativeToken: symbol,
38
- unit: symbol,
39
- state: APIItemState.READY,
40
- type: StakingType.NOMINATED,
41
- address
42
- };
43
- callback(chain, stakingItem);
19
+ } = _getChainNativeTokenBasicInfo(chainInfoMap[chain]);
20
+ const owner = reformatAddress(address, 42);
21
+ if (!delegatorState && !unstakingInfo) {
22
+ stakingCallback(chain, {
23
+ name: chainInfoMap[chain].name,
24
+ chain: chain,
25
+ balance: '0',
26
+ activeBalance: '0',
27
+ unlockingBalance: '0',
28
+ nativeToken: symbol,
29
+ unit: symbol,
30
+ state: APIItemState.READY,
31
+ type: StakingType.NOMINATED,
32
+ address: owner
33
+ });
34
+ nominatorStateCallback({
35
+ chain,
36
+ type: StakingType.NOMINATED,
37
+ address: owner,
38
+ status: StakingStatus.NOT_STAKING,
39
+ activeStake: '0',
40
+ nominations: [],
41
+ unstakings: []
42
+ });
43
+ } else {
44
+ const activeBalance = delegatorState ? new BN(delegatorState.amount.toString()) : BN_ZERO;
45
+ let unstakingBalance = BN_ZERO;
46
+ if (unstakingInfo) {
47
+ Object.values(unstakingInfo).forEach(unstakingAmount => {
48
+ const bnUnstakingAmount = new BN(unstakingAmount.toString());
49
+ unstakingBalance = unstakingBalance.add(bnUnstakingAmount);
50
+ });
51
+ }
52
+ const totalBalance = activeBalance.add(unstakingBalance);
53
+ const stakingItem = {
54
+ name: chainInfoMap[chain].name,
55
+ chain: chain,
56
+ balance: totalBalance.toString(),
57
+ activeBalance: activeBalance.toString(),
58
+ unlockingBalance: unstakingBalance.toString(),
59
+ nativeToken: symbol,
60
+ unit: symbol,
61
+ state: APIItemState.READY,
62
+ type: StakingType.NOMINATED,
63
+ address: owner
64
+ };
65
+ stakingCallback(chain, stakingItem);
66
+ const nominatorMetadata = await subscribeAmplitudeNominatorMetadata(chainInfoMap[chain], owner, substrateApi, delegatorState, unstakingInfo);
67
+ nominatorStateCallback(nominatorMetadata);
68
+ }
44
69
  });
45
70
  }
46
- function getMultiStakingAmplitude(parentApi, useAddresses, networks, chain, callback) {
47
- return parentApi.api.query.parachainStaking.delegatorState.multi(useAddresses, async ledgers => {
71
+ function getMultiStakingAmplitude(substrateApi, useAddresses, chainInfoMap, chain, stakingCallback, nominatorStateCallback) {
72
+ return substrateApi.api.query.parachainStaking.delegatorState.multi(useAddresses, async ledgers => {
48
73
  if (ledgers) {
49
- const _unstakingStates = await parentApi.api.query.parachainStaking.unstaking.multi(useAddresses);
50
- for (let i = 0; i < ledgers.length; i++) {
51
- const ledger = ledgers[i];
52
- const _unstakingData = _unstakingStates[i].toHuman();
74
+ const {
75
+ symbol
76
+ } = _getChainNativeTokenBasicInfo(chainInfoMap[chain]);
77
+ const _unstakingStates = await substrateApi.api.query.parachainStaking.unstaking.multi(useAddresses);
78
+ await Promise.all(ledgers.map(async (_delegatorState, i) => {
53
79
  const owner = reformatAddress(useAddresses[i], 42);
54
- const _stakingData = ledger.toHuman();
55
- let _activeBalance = '0';
56
- if (_stakingData !== null) {
57
- _activeBalance = _stakingData.amount || _stakingData.total;
58
- _activeBalance = _activeBalance.replaceAll(',', '');
59
- }
60
- const activeBalance = new BN(_activeBalance);
61
- let unstakingBalance = BN_ZERO;
62
- if (_unstakingData !== null) {
63
- Object.values(_unstakingData).forEach(_unstakingAmount => {
64
- const bnUnstakingAmount = new BN(_unstakingAmount.replaceAll(',', ''));
65
- unstakingBalance = unstakingBalance.add(bnUnstakingAmount);
80
+ const delegatorState = _delegatorState.toPrimitive();
81
+ const unstakingInfo = _unstakingStates[i].toPrimitive();
82
+ if (!delegatorState && !unstakingInfo) {
83
+ stakingCallback(chain, {
84
+ name: chainInfoMap[chain].name,
85
+ chain: chain,
86
+ balance: '0',
87
+ activeBalance: '0',
88
+ unlockingBalance: '0',
89
+ nativeToken: symbol,
90
+ unit: symbol,
91
+ state: APIItemState.READY,
92
+ type: StakingType.NOMINATED,
93
+ address: owner
66
94
  });
95
+ nominatorStateCallback({
96
+ chain,
97
+ type: StakingType.NOMINATED,
98
+ address: owner,
99
+ status: StakingStatus.NOT_STAKING,
100
+ activeStake: '0',
101
+ nominations: [],
102
+ unstakings: []
103
+ });
104
+ } else {
105
+ const activeBalance = delegatorState ? new BN(delegatorState.amount.toString()) : BN_ZERO;
106
+ let unstakingBalance = BN_ZERO;
107
+ if (unstakingInfo) {
108
+ Object.values(unstakingInfo).forEach(unstakingAmount => {
109
+ const bnUnstakingAmount = new BN(unstakingAmount.toString());
110
+ unstakingBalance = unstakingBalance.add(bnUnstakingAmount);
111
+ });
112
+ }
113
+ const totalBalance = activeBalance.add(unstakingBalance);
114
+ const stakingItem = {
115
+ name: chainInfoMap[chain].name,
116
+ chain: chain,
117
+ balance: totalBalance.toString(),
118
+ activeBalance: activeBalance.toString(),
119
+ unlockingBalance: unstakingBalance.toString(),
120
+ nativeToken: symbol,
121
+ unit: symbol,
122
+ state: APIItemState.READY,
123
+ type: StakingType.NOMINATED,
124
+ address: owner
125
+ };
126
+ stakingCallback(chain, stakingItem);
127
+ const nominatorMetadata = await subscribeAmplitudeNominatorMetadata(chainInfoMap[chain], owner, substrateApi, delegatorState, unstakingInfo);
128
+ nominatorStateCallback(nominatorMetadata);
67
129
  }
68
- const totalBalance = activeBalance.add(unstakingBalance);
69
- const {
70
- symbol
71
- } = _getChainNativeTokenBasicInfo(networks[chain]);
72
- const stakingItem = {
73
- name: networks[chain].name,
74
- chain: chain,
75
- balance: totalBalance.toString(),
76
- activeBalance: activeBalance.toString(),
77
- unlockingBalance: unstakingBalance.toString(),
78
- nativeToken: symbol,
79
- unit: symbol,
80
- state: APIItemState.READY,
81
- type: StakingType.NOMINATED,
82
- address: owner
83
- };
84
- callback(chain, stakingItem);
85
- }
130
+ }));
86
131
  }
87
132
  });
88
133
  }
89
- export function getAmplitudeStakingOnChain(parentApi, useAddresses, networks, chain, callback) {
134
+ export function getAmplitudeStakingOnChain(parentApi, useAddresses, networks, chain, callback, nominatorStateCallback) {
90
135
  if (useAddresses.length === 1) {
91
- return getSingleStakingAmplitude(parentApi, useAddresses[0], networks, chain, callback);
136
+ return getSingleStakingAmplitude(parentApi, useAddresses[0], networks, chain, callback, nominatorStateCallback);
92
137
  }
93
- return getMultiStakingAmplitude(parentApi, useAddresses, networks, chain, callback);
138
+ return getMultiStakingAmplitude(parentApi, useAddresses, networks, chain, callback, nominatorStateCallback);
94
139
  }
95
- export async function getAmplitudeUnclaimedStakingReward(substrateApiMap, addresses, networks, chains) {
140
+ export async function getAmplitudeUnclaimedStakingReward(substrateApiMap, addresses, networks, chains, callBack) {
96
141
  if (chains.length === 0) {
97
142
  return [];
98
143
  }
@@ -109,42 +154,37 @@ export async function getAmplitudeUnclaimedStakingReward(substrateApiMap, addres
109
154
  const apiProps = await substrateApiMap[chain].isReady;
110
155
  await Promise.all(useAddresses.map(async address => {
111
156
  const _unclaimedReward = await apiProps.api.query.parachainStaking.rewards(address);
112
- const unclaimedReward = _unclaimedReward.toString();
113
- const rewardItem = {
157
+ callBack({
114
158
  chain,
115
159
  name: networkInfo.name,
116
160
  state: APIItemState.READY,
117
161
  type: StakingType.NOMINATED,
118
162
  address: reformatAddress(address, 42),
119
- unclaimedReward
120
- };
121
- unclaimedRewardList.push(rewardItem);
163
+ unclaimedReward: _unclaimedReward.toString()
164
+ });
122
165
  }));
123
166
  }
124
167
  }));
125
168
  return unclaimedRewardList;
126
169
  }
127
- export function getParaStakingOnChain(parentApi, useAddresses, networks, chain, callback) {
170
+ export function getParaStakingOnChain(substrateApi, useAddresses, chainInfoMap, chain, stakingCallback, nominatorStateCallback) {
128
171
  const {
129
172
  symbol
130
- } = _getChainNativeTokenBasicInfo(networks[chain]);
131
- return parentApi.api.query.parachainStaking.delegatorState.multi(useAddresses, ledgers => {
173
+ } = _getChainNativeTokenBasicInfo(chainInfoMap[chain]);
174
+ return substrateApi.api.query.parachainStaking.delegatorState.multi(useAddresses, async ledgers => {
132
175
  if (ledgers) {
133
- for (let i = 0; i < ledgers.length; i++) {
134
- const ledger = ledgers[i];
176
+ await Promise.all(ledgers.map(async (_delegatorState, i) => {
177
+ const delegatorState = _delegatorState.toPrimitive();
135
178
  const owner = reformatAddress(useAddresses[i], 42);
136
- const data = ledger.toHuman();
137
- if (data !== null) {
138
- let _totalBalance = data.total;
139
- // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
140
- let _unlockingBalance = data.lessTotal ? data.lessTotal : data.requests.lessTotal;
141
- _totalBalance = _totalBalance.replaceAll(',', '');
142
- _unlockingBalance = _unlockingBalance.replaceAll(',', '');
143
- const totalBalance = new BN(_totalBalance);
144
- const unlockingBalance = new BN(_unlockingBalance);
179
+ if (delegatorState) {
180
+ const _totalBalance = delegatorState.total;
181
+ // let _unlockingBalance = delegatorState.lessTotal ? delegatorState.lessTotal : delegatorState.requests.lessTotal;
182
+ const _unlockingBalance = delegatorState.lessTotal;
183
+ const totalBalance = new BN(_totalBalance.toString());
184
+ const unlockingBalance = new BN(_unlockingBalance.toString());
145
185
  const activeBalance = totalBalance.sub(unlockingBalance);
146
- const stakingItem = {
147
- name: networks[chain].name,
186
+ stakingCallback(chain, {
187
+ name: chainInfoMap[chain].name,
148
188
  chain: chain,
149
189
  balance: totalBalance.toString(),
150
190
  activeBalance: activeBalance.toString(),
@@ -154,11 +194,12 @@ export function getParaStakingOnChain(parentApi, useAddresses, networks, chain,
154
194
  state: APIItemState.READY,
155
195
  type: StakingType.NOMINATED,
156
196
  address: owner
157
- };
158
- callback(chain, stakingItem);
197
+ });
198
+ const nominatorMetadata = await subscribeParaChainNominatorMetadata(chainInfoMap[chain], owner, substrateApi, delegatorState);
199
+ nominatorStateCallback(nominatorMetadata);
159
200
  } else {
160
- const stakingItem = {
161
- name: networks[chain].name,
201
+ stakingCallback(chain, {
202
+ name: chainInfoMap[chain].name,
162
203
  chain: chain,
163
204
  balance: '0',
164
205
  activeBalance: '0',
@@ -168,49 +209,78 @@ export function getParaStakingOnChain(parentApi, useAddresses, networks, chain,
168
209
  state: APIItemState.READY,
169
210
  type: StakingType.NOMINATED,
170
211
  address: owner
171
- };
172
- callback(chain, stakingItem);
212
+ });
213
+ nominatorStateCallback({
214
+ chain,
215
+ type: StakingType.NOMINATED,
216
+ address: owner,
217
+ status: StakingStatus.NOT_STAKING,
218
+ activeStake: '0',
219
+ nominations: [],
220
+ unstakings: []
221
+ });
173
222
  }
174
- }
223
+ }));
175
224
  }
176
225
  });
177
226
  }
178
- export function getAstarStakingOnChain(parentApi, useAddresses, networks, chain, callback) {
227
+ export function getAstarStakingOnChain(substrateApi, useAddresses, chainInfoMap, chain, stakingCallback, nominatorStateCallback) {
179
228
  const {
180
229
  symbol
181
- } = _getChainNativeTokenBasicInfo(networks[chain]);
182
- return parentApi.api.query.dappsStaking.ledger.multi(useAddresses, ledgers => {
230
+ } = _getChainNativeTokenBasicInfo(chainInfoMap[chain]);
231
+ return substrateApi.api.query.dappsStaking.ledger.multi(useAddresses, async ledgers => {
183
232
  if (ledgers) {
184
- for (let i = 0; i < ledgers.length; i++) {
233
+ await Promise.all(ledgers.map(async (_ledger, i) => {
185
234
  let bnUnlockingBalance = BN_ZERO;
186
235
  const owner = reformatAddress(useAddresses[i], 42);
187
- const ledger = ledgers[i];
188
- const data = ledger.toHuman();
189
- // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
190
- const unlockingChunks = data.unbondingInfo.unlockingChunks;
191
- const _totalStake = data.locked;
192
- for (const chunk of unlockingChunks) {
193
- const bnChunk = new BN(chunk.amount.replaceAll(',', ''));
194
- bnUnlockingBalance = bnUnlockingBalance.add(bnChunk);
236
+ const ledger = _ledger.toPrimitive();
237
+ if (ledger && ledger.locked > 0) {
238
+ const unlockingChunks = ledger.unbondingInfo.unlockingChunks;
239
+ const _totalStake = ledger.locked;
240
+ const bnTotalStake = new BN(_totalStake.toString());
241
+ for (const chunk of unlockingChunks) {
242
+ const bnChunk = new BN(chunk.amount.toString());
243
+ bnUnlockingBalance = bnUnlockingBalance.add(bnChunk);
244
+ }
245
+ const bnActiveStake = bnTotalStake.sub(bnUnlockingBalance);
246
+ stakingCallback(chain, {
247
+ name: chainInfoMap[chain].name,
248
+ chain: chain,
249
+ balance: bnTotalStake.toString(),
250
+ activeBalance: bnActiveStake.toString(),
251
+ unlockingBalance: bnUnlockingBalance.toString(),
252
+ nativeToken: symbol,
253
+ unit: symbol,
254
+ state: APIItemState.READY,
255
+ type: StakingType.NOMINATED,
256
+ address: owner
257
+ });
258
+ const nominatorMetadata = await subscribeAstarNominatorMetadata(chainInfoMap[chain], owner, substrateApi, ledger);
259
+ nominatorStateCallback(nominatorMetadata);
260
+ } else {
261
+ stakingCallback(chain, {
262
+ name: chainInfoMap[chain].name,
263
+ chain,
264
+ balance: '0',
265
+ activeBalance: '0',
266
+ unlockingBalance: '0',
267
+ nativeToken: symbol,
268
+ unit: symbol,
269
+ state: APIItemState.READY,
270
+ type: StakingType.NOMINATED,
271
+ address: owner
272
+ });
273
+ nominatorStateCallback({
274
+ chain,
275
+ type: StakingType.NOMINATED,
276
+ address: owner,
277
+ status: StakingStatus.NOT_STAKING,
278
+ activeStake: '0',
279
+ nominations: [],
280
+ unstakings: []
281
+ });
195
282
  }
196
- const bnTotalStake = new BN(_totalStake.replaceAll(',', ''));
197
- const bnActiveStake = bnTotalStake.sub(bnUnlockingBalance);
198
- const stakingItem = {
199
- name: networks[chain].name,
200
- chain: chain,
201
- balance: bnTotalStake.toString(),
202
- activeBalance: bnActiveStake.toString(),
203
- unlockingBalance: bnUnlockingBalance.toString(),
204
- nativeToken: symbol,
205
- unit: symbol,
206
- state: APIItemState.READY,
207
- type: StakingType.NOMINATED,
208
- address: owner
209
- };
210
-
211
- // eslint-disable-next-line node/no-callback-literal
212
- callback(chain, stakingItem);
213
- }
283
+ }));
214
284
  }
215
285
  });
216
286
  }
@@ -1,6 +1,6 @@
1
1
  import { _ChainInfo } from '@subwallet/chain-list/types';
2
- import { StakingItem, StakingRewardItem } from '@subwallet/extension-base/background/KoniTypes';
2
+ import { NominatorMetadata, StakingItem, StakingRewardItem } from '@subwallet/extension-base/background/KoniTypes';
3
3
  import { _SubstrateApi } from '@subwallet/extension-base/services/chain-service/types';
4
- export declare function getRelayStakingOnChain(substrateApi: _SubstrateApi, useAddresses: string[], chainInfoMap: Record<string, _ChainInfo>, chain: string, callback: (networkKey: string, rs: StakingItem) => void): import("@polkadot/api-base/types").UnsubscribePromise;
5
- export declare function getRelayPoolingOnChain(parentApi: _SubstrateApi, useAddresses: string[], networks: Record<string, _ChainInfo>, chain: string, callback: (networkKey: string, rs: StakingItem) => void): import("@polkadot/api-base/types").UnsubscribePromise;
6
- export declare function getNominationPoolReward(addresses: string[], chainInfoMap: Record<string, _ChainInfo>, substrateApiMap: Record<string, _SubstrateApi>): Promise<StakingRewardItem[]>;
4
+ export declare function getRelayStakingOnChain(substrateApi: _SubstrateApi, useAddresses: string[], chainInfoMap: Record<string, _ChainInfo>, chain: string, stakingCallback: (networkKey: string, rs: StakingItem) => void, nominatorStateCallback: (rs: NominatorMetadata) => void): import("@polkadot/api-base/types").UnsubscribePromise;
5
+ export declare function getRelayPoolingOnChain(substrateApi: _SubstrateApi, useAddresses: string[], chainInfoMap: Record<string, _ChainInfo>, chain: string, stakingCallback: (networkKey: string, rs: StakingItem) => void, nominatorStateCallback: (rs: NominatorMetadata) => void): import("@polkadot/api-base/types").UnsubscribePromise;
6
+ export declare function getNominationPoolReward(addresses: string[], chainInfoMap: Record<string, _ChainInfo>, substrateApiMap: Record<string, _SubstrateApi>, callBack: (rs: StakingRewardItem) => void): Promise<void>;
@@ -1,98 +1,89 @@
1
1
  // Copyright 2019-2022 @subwallet/extension-koni authors & contributors
2
2
  // SPDX-License-Identifier: Apache-2.0
3
3
 
4
- import { APIItemState, StakingType } from '@subwallet/extension-base/background/KoniTypes';
4
+ import { APIItemState, StakingStatus, StakingType } from '@subwallet/extension-base/background/KoniTypes';
5
+ import { subscribeRelayChainNominatorMetadata, subscribeRelayChainPoolMemberMetadata } from '@subwallet/extension-base/koni/api/staking/bonding/relayChain';
5
6
  import { _getChainNativeTokenBasicInfo } from '@subwallet/extension-base/services/chain-service/utils';
6
7
  import { reformatAddress } from '@subwallet/extension-base/utils';
7
8
  import { BN } from '@polkadot/util';
8
9
  import { isEthereumAddress } from '@polkadot/util-crypto';
9
- export function getRelayStakingOnChain(substrateApi, useAddresses, chainInfoMap, chain, callback) {
10
+ export function getRelayStakingOnChain(substrateApi, useAddresses, chainInfoMap, chain, stakingCallback, nominatorStateCallback) {
10
11
  var _substrateApi$api$que;
11
12
  const {
12
13
  symbol
13
14
  } = _getChainNativeTokenBasicInfo(chainInfoMap[chain]);
14
- return (_substrateApi$api$que = substrateApi.api.query.staking) === null || _substrateApi$api$que === void 0 ? void 0 : _substrateApi$api$que.ledger.multi(useAddresses, ledgers => {
15
- let unit = '';
15
+ return (_substrateApi$api$que = substrateApi.api.query.staking) === null || _substrateApi$api$que === void 0 ? void 0 : _substrateApi$api$que.ledger.multi(useAddresses, async ledgers => {
16
16
  if (ledgers) {
17
- for (let i = 0; i < ledgers.length; i++) {
18
- const ledger = ledgers[i];
19
- const owner = reformatAddress(useAddresses[i], 42) || undefined;
20
- const data = ledger.toHuman();
21
- if (data && data.active) {
22
- const _totalBalance = data.total;
23
- const _activeBalance = data.active;
24
- let bnUnlockingBalance = new BN(0);
25
- data.unlocking.forEach(({
26
- value
27
- }) => {
28
- value = value.split(' ')[0];
29
- const _unlockingBalance = value.replaceAll(',', '');
30
- bnUnlockingBalance = bnUnlockingBalance.add(new BN(_unlockingBalance));
31
- });
32
- let amount = _totalBalance ? _totalBalance.split(' ')[0] : '';
33
- amount = amount.replaceAll(',', '');
34
- unit = _totalBalance ? _totalBalance.split(' ')[1] : '';
35
- const bnTotalBalance = new BN(amount);
36
- amount = _activeBalance ? _activeBalance.split(' ')[0] : '';
37
- amount = amount.replaceAll(',', '');
38
- unit = _activeBalance ? _activeBalance.split(' ')[1] : '';
39
- const bnActiveBalance = new BN(amount);
40
- const stakingItem = {
17
+ await Promise.all(ledgers.map(async (_ledger, i) => {
18
+ const owner = reformatAddress(useAddresses[i], 42);
19
+ const ledger = _ledger.toPrimitive();
20
+ if (ledger) {
21
+ const _totalBalance = ledger.total.toString();
22
+ const _activeBalance = ledger.active.toString();
23
+ const bnUnlockingBalance = new BN(_totalBalance).sub(new BN(_activeBalance));
24
+ stakingCallback(chain, {
41
25
  name: chainInfoMap[chain].name,
42
26
  chain: chain,
43
- balance: bnTotalBalance.toString(),
44
- activeBalance: bnActiveBalance.toString(),
27
+ balance: _totalBalance,
28
+ activeBalance: _activeBalance,
45
29
  unlockingBalance: bnUnlockingBalance.toString(),
46
30
  nativeToken: symbol,
47
- unit: unit || symbol,
31
+ unit: symbol,
48
32
  state: APIItemState.READY,
49
33
  type: StakingType.NOMINATED,
50
34
  address: owner
51
- };
52
- callback(chain, stakingItem);
35
+ });
36
+ const nominatorMetadata = await subscribeRelayChainNominatorMetadata(chainInfoMap[chain], owner, substrateApi, ledger);
37
+ nominatorStateCallback(nominatorMetadata);
53
38
  } else {
54
- const stakingItem = {
39
+ stakingCallback(chain, {
55
40
  name: chainInfoMap[chain].name,
56
41
  chain: chain,
57
42
  balance: '0',
58
43
  activeBalance: '0',
59
44
  unlockingBalance: '0',
60
45
  nativeToken: symbol,
61
- unit: unit || symbol,
46
+ unit: symbol,
62
47
  state: APIItemState.READY,
63
48
  type: StakingType.NOMINATED,
64
49
  address: owner
65
- };
66
- callback(chain, stakingItem);
50
+ });
51
+ nominatorStateCallback({
52
+ chain,
53
+ type: StakingType.NOMINATED,
54
+ status: StakingStatus.NOT_STAKING,
55
+ address: owner,
56
+ activeStake: '0',
57
+ nominations: [],
58
+ unstakings: []
59
+ });
67
60
  }
68
- }
61
+ }));
69
62
  }
70
63
  });
71
64
  }
72
- export function getRelayPoolingOnChain(parentApi, useAddresses, networks, chain, callback) {
73
- var _parentApi$api$query, _parentApi$api$query$;
65
+ export function getRelayPoolingOnChain(substrateApi, useAddresses, chainInfoMap, chain, stakingCallback, nominatorStateCallback) {
66
+ var _substrateApi$api$que2, _substrateApi$api$que3;
74
67
  const {
75
68
  symbol
76
- } = _getChainNativeTokenBasicInfo(networks[chain]);
77
- return (_parentApi$api$query = parentApi.api.query) === null || _parentApi$api$query === void 0 ? void 0 : (_parentApi$api$query$ = _parentApi$api$query.nominationPools) === null || _parentApi$api$query$ === void 0 ? void 0 : _parentApi$api$query$.poolMembers.multi(useAddresses, ledgers => {
69
+ } = _getChainNativeTokenBasicInfo(chainInfoMap[chain]);
70
+ return (_substrateApi$api$que2 = substrateApi.api.query) === null || _substrateApi$api$que2 === void 0 ? void 0 : (_substrateApi$api$que3 = _substrateApi$api$que2.nominationPools) === null || _substrateApi$api$que3 === void 0 ? void 0 : _substrateApi$api$que3.poolMembers.multi(useAddresses, async ledgers => {
78
71
  if (ledgers) {
79
- for (let i = 0; i < ledgers.length; i++) {
80
- const ledger = ledgers[i];
72
+ await Promise.all(ledgers.map(async (_poolMemberInfo, i) => {
73
+ const poolMemberInfo = _poolMemberInfo.toPrimitive();
81
74
  const owner = reformatAddress(useAddresses[i], 42);
82
- const data = ledger.toHuman();
83
- if (data !== null) {
84
- const bondedBalance = data.points;
85
- const unbondedBalance = data.unbondingEras;
75
+ if (poolMemberInfo) {
76
+ const bondedBalance = poolMemberInfo.points;
77
+ const unbondedBalance = poolMemberInfo.unbondingEras;
86
78
  let unlockingBalance = new BN(0);
87
- let totalBalance = new BN(0);
88
- Object.entries(unbondedBalance).forEach(([era, value]) => {
89
- const bnUnbondedBalance = new BN(value.replaceAll(',', ''));
79
+ const bnBondedBalance = new BN(bondedBalance.toString());
80
+ Object.entries(unbondedBalance).forEach(([, value]) => {
81
+ const bnUnbondedBalance = new BN(value.toString());
90
82
  unlockingBalance = unlockingBalance.add(bnUnbondedBalance);
91
83
  });
92
- const bnBondedBalance = new BN(bondedBalance.replaceAll(',', ''));
93
- totalBalance = totalBalance.add(bnBondedBalance).add(unlockingBalance);
94
- const stakingItem = {
95
- name: networks[chain].name,
84
+ const totalBalance = bnBondedBalance.add(unlockingBalance);
85
+ stakingCallback(chain, {
86
+ name: chainInfoMap[chain].name,
96
87
  chain: chain,
97
88
  balance: totalBalance.toString(),
98
89
  activeBalance: bnBondedBalance.toString(),
@@ -102,11 +93,12 @@ export function getRelayPoolingOnChain(parentApi, useAddresses, networks, chain,
102
93
  state: APIItemState.READY,
103
94
  type: StakingType.POOLED,
104
95
  address: owner
105
- };
106
- callback(chain, stakingItem);
96
+ });
97
+ const nominatorMetadata = await subscribeRelayChainPoolMemberMetadata(chainInfoMap[chain], owner, substrateApi, poolMemberInfo);
98
+ nominatorStateCallback(nominatorMetadata);
107
99
  } else {
108
- const stakingItem = {
109
- name: networks[chain].name,
100
+ stakingCallback(chain, {
101
+ name: chainInfoMap[chain].name,
110
102
  chain: chain,
111
103
  balance: '0',
112
104
  activeBalance: '0',
@@ -116,14 +108,23 @@ export function getRelayPoolingOnChain(parentApi, useAddresses, networks, chain,
116
108
  state: APIItemState.READY,
117
109
  type: StakingType.POOLED,
118
110
  address: owner
119
- };
120
- callback(chain, stakingItem);
111
+ });
112
+ nominatorStateCallback({
113
+ chain,
114
+ type: StakingType.POOLED,
115
+ address: owner,
116
+ status: StakingStatus.NOT_STAKING,
117
+ activeStake: '0',
118
+ nominations: [],
119
+ // can only join 1 pool at a time
120
+ unstakings: []
121
+ });
121
122
  }
122
- }
123
+ }));
123
124
  }
124
125
  });
125
126
  }
126
- export async function getNominationPoolReward(addresses, chainInfoMap, substrateApiMap) {
127
+ export async function getNominationPoolReward(addresses, chainInfoMap, substrateApiMap, callBack) {
127
128
  const targetNetworks = [];
128
129
  const validAddresses = [];
129
130
  Object.keys(chainInfoMap).forEach(key => {
@@ -134,7 +135,6 @@ export async function getNominationPoolReward(addresses, chainInfoMap, substrate
134
135
  validAddresses.push(address);
135
136
  }
136
137
  });
137
- const rewardList = [];
138
138
  try {
139
139
  await Promise.all(targetNetworks.map(async networkKey => {
140
140
  const substrateApi = await substrateApiMap[networkKey].isReady;
@@ -143,7 +143,7 @@ export async function getNominationPoolReward(addresses, chainInfoMap, substrate
143
143
  var _substrateApi$api$cal, _substrateApi$api$cal2;
144
144
  const _unclaimedReward = await ((_substrateApi$api$cal = substrateApi.api.call) === null || _substrateApi$api$cal === void 0 ? void 0 : (_substrateApi$api$cal2 = _substrateApi$api$cal.nominationPoolsApi) === null || _substrateApi$api$cal2 === void 0 ? void 0 : _substrateApi$api$cal2.pendingRewards(address));
145
145
  if (_unclaimedReward) {
146
- rewardList.push({
146
+ callBack({
147
147
  address: address,
148
148
  chain: networkKey,
149
149
  unclaimedReward: _unclaimedReward.toString(),
@@ -156,7 +156,6 @@ export async function getNominationPoolReward(addresses, chainInfoMap, substrate
156
156
  }
157
157
  }));
158
158
  } catch (e) {
159
- return rewardList;
159
+ console.debug(e);
160
160
  }
161
- return rewardList;
162
161
  }
@@ -1,3 +1,3 @@
1
1
  import { _ChainInfo } from '@subwallet/chain-list/types';
2
2
  import { StakingRewardItem } from '@subwallet/extension-base/background/KoniTypes';
3
- export declare const getAllSubsquidStaking: (accounts: string[], chainInfoMap: Record<string, _ChainInfo>) => Promise<StakingRewardItem[]>;
3
+ export declare const getAllSubsquidStaking: (accounts: string[], chainInfoMap: Record<string, _ChainInfo>, callback: (rewardItem: StakingRewardItem) => void) => Promise<void>;