@subwallet/extension-base 1.1.31-beta.0 → 1.1.32-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 (84) hide show
  1. package/background/KoniTypes.d.ts +1 -0
  2. package/cjs/koni/api/staking/bonding/index.js +2 -0
  3. package/cjs/koni/api/staking/bonding/paraChain.js +6 -3
  4. package/cjs/koni/background/cron.js +0 -28
  5. package/cjs/koni/background/handlers/Extension.js +17 -11
  6. package/cjs/koni/background/handlers/State.js +4 -46
  7. package/cjs/koni/background/subscription.js +0 -155
  8. package/cjs/packageInfo.js +1 -1
  9. package/cjs/services/campaign-service/index.js +19 -0
  10. package/cjs/services/chain-service/constants.js +3 -2
  11. package/cjs/services/earning-service/constants/chains.js +1 -1
  12. package/cjs/services/earning-service/handlers/base.js +9 -6
  13. package/cjs/services/earning-service/handlers/lending/base.js +61 -0
  14. package/cjs/services/earning-service/handlers/lending/interlay.js +3 -2
  15. package/cjs/services/earning-service/handlers/liquid-staking/acala.js +3 -2
  16. package/cjs/services/earning-service/handlers/liquid-staking/base.js +54 -0
  17. package/cjs/services/earning-service/handlers/liquid-staking/bifrost.js +3 -2
  18. package/cjs/services/earning-service/handlers/liquid-staking/parallel.js +3 -2
  19. package/cjs/services/earning-service/handlers/liquid-staking/stella-swap.js +16 -7
  20. package/cjs/services/earning-service/handlers/native-staking/amplitude.js +7 -2
  21. package/cjs/services/earning-service/handlers/native-staking/astar.js +7 -2
  22. package/cjs/services/earning-service/handlers/native-staking/base.js +4 -2
  23. package/cjs/services/earning-service/handlers/native-staking/para-chain.js +7 -2
  24. package/cjs/services/earning-service/handlers/native-staking/relay-chain.js +12 -3
  25. package/cjs/services/earning-service/handlers/nomination-pool/index.js +9 -3
  26. package/cjs/services/earning-service/handlers/special.js +57 -67
  27. package/cjs/services/earning-service/service.js +370 -37
  28. package/cjs/services/event-service/index.js +1 -0
  29. package/cjs/services/migration-service/scripts/index.js +1 -2
  30. package/cjs/services/storage-service/DatabaseService.js +15 -0
  31. package/cjs/services/storage-service/db-stores/Campaign.js +9 -3
  32. package/cjs/services/storage-service/db-stores/YieldPositionStore.js +6 -0
  33. package/cjs/services/transaction-service/index.js +15 -1
  34. package/cjs/utils/number.js +3 -1
  35. package/koni/api/staking/bonding/index.d.ts +1 -0
  36. package/koni/api/staking/bonding/index.js +2 -0
  37. package/koni/api/staking/bonding/paraChain.js +6 -3
  38. package/koni/background/cron.d.ts +0 -5
  39. package/koni/background/cron.js +1 -29
  40. package/koni/background/handlers/Extension.js +17 -11
  41. package/koni/background/handlers/State.d.ts +1 -12
  42. package/koni/background/handlers/State.js +4 -46
  43. package/koni/background/subscription.d.ts +1 -11
  44. package/koni/background/subscription.js +2 -157
  45. package/package.json +6 -6
  46. package/packageInfo.js +1 -1
  47. package/services/campaign-service/index.js +19 -0
  48. package/services/chain-service/constants.js +3 -2
  49. package/services/earning-service/constants/chains.js +1 -1
  50. package/services/earning-service/handlers/base.d.ts +1 -0
  51. package/services/earning-service/handlers/base.js +9 -6
  52. package/services/earning-service/handlers/lending/base.d.ts +2 -0
  53. package/services/earning-service/handlers/lending/base.js +61 -0
  54. package/services/earning-service/handlers/lending/interlay.js +4 -3
  55. package/services/earning-service/handlers/liquid-staking/acala.js +4 -3
  56. package/services/earning-service/handlers/liquid-staking/base.d.ts +2 -0
  57. package/services/earning-service/handlers/liquid-staking/base.js +55 -1
  58. package/services/earning-service/handlers/liquid-staking/bifrost.js +4 -3
  59. package/services/earning-service/handlers/liquid-staking/parallel.js +4 -3
  60. package/services/earning-service/handlers/liquid-staking/stella-swap.js +16 -7
  61. package/services/earning-service/handlers/native-staking/amplitude.js +7 -2
  62. package/services/earning-service/handlers/native-staking/astar.js +7 -2
  63. package/services/earning-service/handlers/native-staking/base.js +5 -3
  64. package/services/earning-service/handlers/native-staking/para-chain.js +7 -2
  65. package/services/earning-service/handlers/native-staking/relay-chain.js +12 -3
  66. package/services/earning-service/handlers/nomination-pool/index.js +10 -4
  67. package/services/earning-service/handlers/special.d.ts +0 -1
  68. package/services/earning-service/handlers/special.js +58 -68
  69. package/services/earning-service/service.d.ts +49 -1
  70. package/services/earning-service/service.js +358 -28
  71. package/services/event-service/index.d.ts +1 -0
  72. package/services/event-service/index.js +1 -0
  73. package/services/event-service/types.d.ts +1 -0
  74. package/services/migration-service/scripts/index.js +1 -2
  75. package/services/storage-service/DatabaseService.d.ts +5 -0
  76. package/services/storage-service/DatabaseService.js +15 -0
  77. package/services/storage-service/db-stores/Campaign.js +9 -3
  78. package/services/storage-service/db-stores/YieldPositionStore.d.ts +2 -0
  79. package/services/storage-service/db-stores/YieldPositionStore.js +6 -0
  80. package/services/transaction-service/index.js +15 -1
  81. package/types/yield/actions/join/submit.d.ts +2 -1
  82. package/types/yield/info/account/reward.d.ts +2 -0
  83. package/utils/number.d.ts +1 -0
  84. package/utils/number.js +1 -0
@@ -7,16 +7,28 @@ Object.defineProperty(exports, "__esModule", {
7
7
  exports.default = void 0;
8
8
  var _TransactionError = require("@subwallet/extension-base/background/errors/TransactionError");
9
9
  var _KoniTypes = require("@subwallet/extension-base/background/KoniTypes");
10
+ var _constants = require("@subwallet/extension-base/constants");
11
+ var _types = require("@subwallet/extension-base/services/base/types");
10
12
  var _utils = require("@subwallet/extension-base/services/chain-service/utils");
11
- var _constants = require("@subwallet/extension-base/services/earning-service/constants");
13
+ var _constants2 = require("@subwallet/extension-base/services/earning-service/constants");
12
14
  var _base = _interopRequireDefault(require("@subwallet/extension-base/services/earning-service/handlers/liquid-staking/base"));
13
- var _types = require("@subwallet/extension-base/types");
15
+ var _types2 = require("@subwallet/extension-base/types");
14
16
  var _utils2 = require("@subwallet/extension-base/utils");
17
+ var _crossFetch = _interopRequireDefault(require("cross-fetch"));
15
18
  var _rxjs = require("rxjs");
16
19
  var _handlers = require("./handlers");
17
20
  // Copyright 2019-2022 @subwallet/extension-base
18
21
  // SPDX-License-Identifier: Apache-2.0
19
22
 
23
+ const POOLS_DATA_URLS = 'https://sw-static-cache.pages.dev/earning/yield-pools.json';
24
+ const fetchPoolsData = async () => {
25
+ const res = await (0, _crossFetch.default)(POOLS_DATA_URLS);
26
+ if (res.status !== 200) {
27
+ return {};
28
+ }
29
+ const fetchData = await res.json();
30
+ return fetchData.data;
31
+ };
20
32
  class EarningService {
21
33
  handlers = {};
22
34
  earningRewardSubject = new _rxjs.BehaviorSubject({
@@ -25,32 +37,44 @@ class EarningService {
25
37
  });
26
38
  earningRewardHistorySubject = new _rxjs.BehaviorSubject({});
27
39
  minAmountPercentSubject = new _rxjs.BehaviorSubject({});
40
+
41
+ // earning
42
+ yieldPoolInfoSubject = new _rxjs.BehaviorSubject({});
43
+ yieldPositionSubject = new _rxjs.BehaviorSubject({});
44
+ yieldPositionListSubject = new _rxjs.BehaviorSubject([]); // virtual list of yieldPositionSubject with filter values
45
+
28
46
  constructor(state) {
29
47
  this.state = state;
30
- this.initHandlers().catch(console.error);
48
+ this.dbService = state.dbService;
49
+ this.eventService = state.eventService;
31
50
  }
32
51
  async initHandlers() {
33
- await this.state.eventService.waitChainReady;
34
- const chains = Object.keys(this.state.getChainInfoMap());
52
+ await this.eventService.waitChainReady;
53
+ const chains = [];
54
+ for (const chain of Object.values(this.state.getChainInfoMap())) {
55
+ if (chain.chainStatus === 'ACTIVE') {
56
+ chains.push(chain.slug);
57
+ }
58
+ }
35
59
  const minAmountPercent = {};
36
60
  for (const chain of chains) {
37
61
  const handlers = [];
38
- if (_constants._STAKING_CHAIN_GROUP.relay.includes(chain)) {
62
+ if (_constants2._STAKING_CHAIN_GROUP.relay.includes(chain)) {
39
63
  handlers.push(new _handlers.RelayNativeStakingPoolHandler(this.state, chain));
40
64
  }
41
- if (_constants._STAKING_CHAIN_GROUP.para.includes(chain)) {
65
+ if (_constants2._STAKING_CHAIN_GROUP.para.includes(chain)) {
42
66
  handlers.push(new _handlers.ParaNativeStakingPoolHandler(this.state, chain));
43
67
  }
44
- if (_constants._STAKING_CHAIN_GROUP.astar.includes(chain)) {
68
+ if (_constants2._STAKING_CHAIN_GROUP.astar.includes(chain)) {
45
69
  handlers.push(new _handlers.AstarNativeStakingPoolHandler(this.state, chain));
46
70
  }
47
- if (_constants._STAKING_CHAIN_GROUP.amplitude.includes(chain)) {
71
+ if (_constants2._STAKING_CHAIN_GROUP.amplitude.includes(chain)) {
48
72
  handlers.push(new _handlers.AmplitudeNativeStakingPoolHandler(this.state, chain));
49
73
  }
50
- if (_constants._STAKING_CHAIN_GROUP.nominationPool.includes(chain)) {
74
+ if (_constants2._STAKING_CHAIN_GROUP.nominationPool.includes(chain)) {
51
75
  handlers.push(new _handlers.NominationPoolHandler(this.state, chain));
52
76
  }
53
- if (_constants._STAKING_CHAIN_GROUP.liquidStaking.includes(chain)) {
77
+ if (_constants2._STAKING_CHAIN_GROUP.liquidStaking.includes(chain)) {
54
78
  if (chain === 'bifrost_dot') {
55
79
  handlers.push(new _handlers.BifrostLiquidStakingPoolHandler(this.state, chain));
56
80
  }
@@ -64,7 +88,7 @@ class EarningService {
64
88
  handlers.push(new _handlers.StellaSwapLiquidStakingPoolHandler(this.state, chain));
65
89
  }
66
90
  }
67
- if (_constants._STAKING_CHAIN_GROUP.lending.includes(chain)) {
91
+ if (_constants2._STAKING_CHAIN_GROUP.lending.includes(chain)) {
68
92
  if (chain === 'interlay') {
69
93
  handlers.push(new _handlers.InterlayLendingPoolHandler(this.state, chain));
70
94
  }
@@ -74,13 +98,132 @@ class EarningService {
74
98
  }
75
99
  }
76
100
  for (const handler of Object.values(this.handlers)) {
77
- if (handler.type === _types.YieldPoolType.LIQUID_STAKING) {
101
+ if (handler.type === _types2.YieldPoolType.LIQUID_STAKING) {
78
102
  minAmountPercent[handler.slug] = handler.minAmountPercent;
79
103
  }
80
104
  }
81
105
  minAmountPercent.default = _base.default.defaultMinAmountPercent;
82
106
  this.minAmountPercentSubject.next(minAmountPercent);
107
+
108
+ // Emit earning ready
109
+ this.eventService.emit('earning.ready', true);
83
110
  }
111
+ startPromiseHandler = (0, _utils2.createPromiseHandler)();
112
+ stopPromiseHandler = (0, _utils2.createPromiseHandler)();
113
+ status = _types.ServiceStatus.NOT_INITIALIZED;
114
+ async init() {
115
+ this.status = _types.ServiceStatus.INITIALIZING;
116
+ await this.initHandlers();
117
+
118
+ // Load data from db
119
+ await this.loadData();
120
+
121
+ // Pin list with value from map
122
+ this.yieldPositionSubject.subscribe({
123
+ next: data => {
124
+ const activeMap = this.state.getActiveChainInfoMap();
125
+ const activePositions = Object.values(data).filter(item => {
126
+ return !!activeMap[item.chain];
127
+ });
128
+ this.yieldPositionListSubject.next(Object.values(activePositions));
129
+ }
130
+ });
131
+ this.status = _types.ServiceStatus.INITIALIZED;
132
+ await this.start();
133
+ this.handleActions();
134
+ }
135
+ handleActions() {
136
+ this.eventService.onLazy((events, eventTypes) => {
137
+ (async () => {
138
+ const removedAddresses = [];
139
+ events.forEach(event => {
140
+ if (event.type === 'account.remove') {
141
+ removedAddresses.push(event.data[0]);
142
+ }
143
+ });
144
+ if (removedAddresses.length > 0) {
145
+ await this.removeYieldPositions(undefined, removedAddresses);
146
+ }
147
+
148
+ // Account changed or chain changed (active or inactive)
149
+ // Chain changed (active or inactive)
150
+ // Todo: Optimize performance of chain active or inactive in the future
151
+ if (eventTypes.includes('account.updateCurrent') || eventTypes.includes('account.remove') || eventTypes.includes('chain.updateState')) {
152
+ await this.reloadEarning();
153
+ }
154
+ })().catch(console.error);
155
+ });
156
+ }
157
+ async loadData() {
158
+ await this.getYieldPoolInfoFromDBAndOnline();
159
+ await this.getYieldPositionFromDB();
160
+ }
161
+ persistData() {
162
+ // Data is auto persisted with lazy queue
163
+ return Promise.resolve(undefined);
164
+ }
165
+ async start() {
166
+ if (this.status === _types.ServiceStatus.STOPPING) {
167
+ await this.waitForStopped();
168
+ }
169
+ if (this.status === _types.ServiceStatus.STARTED || this.status === _types.ServiceStatus.STARTING) {
170
+ return this.waitForStarted();
171
+ }
172
+ this.status = _types.ServiceStatus.STARTING;
173
+
174
+ // Start subscribe pools' info
175
+ await this.runSubscribePoolsInfo();
176
+
177
+ // Start subscribe pools' position
178
+ await this.runSubscribePoolsPosition();
179
+
180
+ // Start subscribe pools' reward
181
+ this.runSubscribeStakingRewardInterval();
182
+
183
+ // Start subscribe pools' reward history
184
+ this.runSubscribeEarningRewardHistoryInterval();
185
+
186
+ // Update promise handler
187
+ this.startPromiseHandler.resolve();
188
+ this.stopPromiseHandler = (0, _utils2.createPromiseHandler)();
189
+ this.status = _types.ServiceStatus.STARTED;
190
+ }
191
+ async stop() {
192
+ if (this.status === _types.ServiceStatus.STARTING) {
193
+ await this.waitForStarted();
194
+ }
195
+ if (this.status === _types.ServiceStatus.STOPPED || this.status === _types.ServiceStatus.STOPPING) {
196
+ return this.waitForStopped();
197
+ }
198
+ this.status = _types.ServiceStatus.STOPPING;
199
+ await this.persistData();
200
+
201
+ // Stop subscribe pools' info
202
+ this.runUnsubscribePoolsInfo();
203
+
204
+ // Stop subscribe pools' position
205
+ this.runUnsubscribePoolsPosition();
206
+
207
+ // Stop subscribe pools' reward
208
+ this.runUnsubscribeStakingRewardInterval();
209
+
210
+ // Stop subscribe pools' reward history
211
+ this.runUnsubscribeEarningRewardHistoryInterval();
212
+
213
+ // Update promise handler
214
+ this.stopPromiseHandler.resolve();
215
+ this.startPromiseHandler = (0, _utils2.createPromiseHandler)();
216
+ this.status = _types.ServiceStatus.STOPPED;
217
+ }
218
+ waitForStarted() {
219
+ return this.startPromiseHandler.promise;
220
+ }
221
+ waitForStopped() {
222
+ return this.stopPromiseHandler.promise;
223
+ }
224
+
225
+ /* Pools' info methods */
226
+
84
227
  getPoolHandler(slug) {
85
228
  return this.handlers[slug];
86
229
  }
@@ -98,19 +241,20 @@ class EarningService {
98
241
  getMinAmountPercent() {
99
242
  return this.minAmountPercentSubject.getValue();
100
243
  }
101
-
102
- /* Subscribe pools' info */
103
-
244
+ async getYieldPool(slug) {
245
+ await this.eventService.waitEarningReady;
246
+ return this.yieldPoolInfoSubject.getValue()[slug];
247
+ }
104
248
  async subscribePoolsInfo(callback) {
105
249
  let cancel = false;
106
- await this.state.eventService.waitChainReady;
250
+ await this.eventService.waitChainReady;
107
251
  const unsubList = [];
108
252
  for (const handler of Object.values(this.handlers)) {
109
253
  handler.subscribePoolInfo(callback).then(unsub => {
110
- if (cancel) {
111
- unsub();
112
- } else {
254
+ if (!cancel) {
113
255
  unsubList.push(unsub);
256
+ } else {
257
+ unsub();
114
258
  }
115
259
  }).catch(console.error);
116
260
  }
@@ -121,14 +265,71 @@ class EarningService {
121
265
  });
122
266
  };
123
267
  }
268
+ async getYieldPoolInfoFromDBAndOnline() {
269
+ // Get online pool data
270
+ const yieldPoolInfo = await Promise.race([fetchPoolsData(), new Promise(resolve => {
271
+ setTimeout(() => {
272
+ resolve({});
273
+ }, 1200);
274
+ })]);
275
+ const existedYieldPoolInfo = await this.dbService.getYieldPools();
276
+ existedYieldPoolInfo.forEach(info => {
277
+ if (!yieldPoolInfo[info.slug]) {
278
+ yieldPoolInfo[info.slug] = info;
279
+ }
280
+ });
281
+ this.yieldPoolInfoSubject.next(yieldPoolInfo);
282
+ }
283
+ subscribeYieldPoolInfo() {
284
+ return this.yieldPoolInfoSubject;
285
+ }
286
+ async getYieldPoolInfo() {
287
+ await this.eventService.waitEarningReady;
288
+ return Object.values(this.yieldPoolInfoSubject.getValue());
289
+ }
290
+ yieldPoolPersistQueue = [];
291
+ updateYieldPoolInfo(data) {
292
+ this.yieldPoolPersistQueue.push(data);
293
+ (0, _utils2.addLazy)('persistYieldPoolInfo', () => {
294
+ const yieldPoolInfo = this.yieldPoolInfoSubject.getValue();
295
+ const queue = [...this.yieldPoolPersistQueue];
296
+ this.yieldPoolPersistQueue = [];
297
+
298
+ // Update yield pool info
299
+ queue.forEach(item => {
300
+ yieldPoolInfo[item.slug] = item;
301
+ });
302
+ this.yieldPoolInfoSubject.next(yieldPoolInfo);
303
+
304
+ // Persist data
305
+ this.dbService.updateYieldPoolsStore(queue).catch(console.warn);
306
+ }, 300, 900);
307
+ }
308
+ async runSubscribePoolsInfo() {
309
+ await this.eventService.waitChainReady;
310
+ this.runUnsubscribePoolsInfo();
311
+ this.subscribePoolsInfo(data => {
312
+ this.updateYieldPoolInfo(data);
313
+ }).then(rs => {
314
+ this.yieldPoolsInfoUnsub = rs;
315
+ }).catch(console.error);
316
+ }
317
+ runUnsubscribePoolsInfo() {
318
+ var _this$yieldPoolsInfoU;
319
+ (_this$yieldPoolsInfoU = this.yieldPoolsInfoUnsub) === null || _this$yieldPoolsInfoU === void 0 ? void 0 : _this$yieldPoolsInfoU.call(this);
320
+ }
124
321
 
125
- /* Subscribe pools' info */
322
+ /* Pools' info methods */
126
323
 
127
- /* Subscribe pools' position */
324
+ /* Pools' position methods */
128
325
 
326
+ async getYieldPosition(address, slug) {
327
+ await this.eventService.waitEarningReady;
328
+ return this.yieldPositionSubject.getValue()[`${slug}---${address}`];
329
+ }
129
330
  async subscribePoolPositions(addresses, callback) {
130
331
  let cancel = false;
131
- await this.state.eventService.waitChainReady;
332
+ await this.eventService.waitChainReady;
132
333
  const [substrateAddresses, evmAddresses] = (0, _utils2.categoryAddresses)(addresses);
133
334
  const activeChains = this.state.activeChainSlugs;
134
335
  const unsubList = [];
@@ -152,8 +353,105 @@ class EarningService {
152
353
  });
153
354
  };
154
355
  }
356
+ async removeYieldPositions(chains, addresses) {
357
+ const removeKeys = [];
358
+ chains && chains.length > 0 && Object.entries(this.yieldPositionSubject.getValue()).forEach(_ref => {
359
+ let [key, value] = _ref;
360
+ console.log('removeYieldPositions', key, value.chain, chains.indexOf(value.chain) > -1);
361
+ if (chains.indexOf(value.chain) > -1 && !removeKeys.includes(key)) {
362
+ removeKeys.push(key);
363
+ }
364
+ });
365
+ addresses && addresses.length > 0 && Object.entries(this.yieldPositionSubject.getValue()).forEach(_ref2 => {
366
+ let [key, value] = _ref2;
367
+ if (addresses.indexOf(value.address) > -1 && !removeKeys.includes(key)) {
368
+ removeKeys.push(key);
369
+ }
370
+ });
371
+
372
+ // Remove by keys
373
+ const yieldPositionInfo = this.yieldPositionSubject.getValue();
374
+ for (const key of removeKeys) {
375
+ delete yieldPositionInfo[key];
376
+ }
377
+ this.yieldPositionSubject.next(yieldPositionInfo);
378
+ addresses && addresses.length > 0 && (await this.dbService.removeYieldPositionByAddresses(addresses));
379
+ chains && chains.length > 0 && (await this.dbService.removeYieldPositionByChains(chains));
380
+ }
381
+ async getYieldPositionFromDB() {
382
+ await this.eventService.waitChainReady;
383
+ await this.eventService.waitKeyringReady;
384
+ const addresses = this.state.getDecodedAddresses();
385
+ const existedYieldPosition = await this.dbService.getYieldNominationPoolPosition(addresses, this.state.activeChainSlugs);
386
+ const yieldPositionInfo = this.yieldPositionSubject.getValue();
387
+ existedYieldPosition.forEach(item => {
388
+ yieldPositionInfo[this._getYieldPositionKey(item.slug, item.address)] = item;
389
+ });
390
+ this.yieldPositionSubject.next(yieldPositionInfo);
391
+ }
392
+ subscribeYieldPosition() {
393
+ return this.yieldPositionListSubject;
394
+ }
395
+ async getYieldPositionInfo() {
396
+ await this.eventService.waitEarningReady;
397
+ return Promise.resolve(this.yieldPositionListSubject.getValue());
398
+ }
399
+ yieldPositionPersistQueue = [];
400
+ resetYieldPositionQueue() {
401
+ this.yieldPositionPersistQueue = [];
402
+ }
403
+ resetYieldPosition() {
404
+ this.yieldPositionSubject.next({});
405
+ this.yieldPositionPersistQueue = [];
406
+ }
407
+ _getYieldPositionKey(slug, address) {
408
+ return `${slug}---${address}`;
409
+ }
410
+ updateYieldPosition(data) {
411
+ this.yieldPositionPersistQueue.push(data);
412
+ (0, _utils2.addLazy)('persistYieldPositionInfo', () => {
413
+ const yieldPositionInfo = this.yieldPositionSubject.getValue();
414
+ const queue = [...this.yieldPositionPersistQueue];
415
+ this.yieldPositionPersistQueue = [];
416
+
417
+ // Update yield position info
418
+ queue.forEach(item => {
419
+ yieldPositionInfo[this._getYieldPositionKey(item.slug, item.address)] = item;
420
+ });
421
+ this.yieldPositionSubject.next(yieldPositionInfo);
422
+
423
+ // Persist data
424
+ this.dbService.updateYieldPositions(queue).catch(console.warn);
425
+ }, 300, 900);
426
+ }
427
+ async reloadEarning() {
428
+ let reset = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
429
+ await this.waitForStarted();
430
+ this.runUnsubscribePoolsPosition();
431
+ this.runUnsubscribeStakingRewardInterval();
432
+ this.runUnsubscribeEarningRewardHistoryInterval();
433
+ reset && this.resetYieldPosition();
434
+ await this.runSubscribePoolsPosition();
435
+ this.runSubscribeStakingRewardInterval();
436
+ this.runSubscribeEarningRewardHistoryInterval();
437
+ }
438
+ async runSubscribePoolsPosition() {
439
+ await this.eventService.waitKeyringReady;
440
+ this.runUnsubscribePoolsPosition();
441
+ const addresses = this.state.getDecodedAddresses();
442
+ this.subscribePoolPositions(addresses, data => {
443
+ this.updateYieldPosition(data);
444
+ }).then(rs => {
445
+ this.yieldPositionUnsub = rs;
446
+ }).catch(console.error);
447
+ }
448
+ runUnsubscribePoolsPosition() {
449
+ var _this$yieldPositionUn;
450
+ (_this$yieldPositionUn = this.yieldPositionUnsub) === null || _this$yieldPositionUn === void 0 ? void 0 : _this$yieldPositionUn.call(this);
451
+ this.yieldPositionPersistQueue = [];
452
+ }
155
453
 
156
- /* Subscribe pools' position */
454
+ /* Pools' position methods */
157
455
 
158
456
  /* Get pools' reward */
159
457
 
@@ -166,7 +464,7 @@ class EarningService {
166
464
  }
167
465
  async getPoolReward(addresses, callback) {
168
466
  let cancel = false;
169
- await this.state.eventService.waitChainReady;
467
+ await this.eventService.waitChainReady;
170
468
  const [substrateAddresses, evmAddresses] = (0, _utils2.categoryAddresses)(addresses);
171
469
  const activeChains = this.state.activeChainSlugs;
172
470
  const unsubList = [];
@@ -196,9 +494,26 @@ class EarningService {
196
494
  getEarningRewards() {
197
495
  return this.earningRewardSubject.getValue();
198
496
  }
497
+ runSubscribeStakingRewardInterval() {
498
+ const addresses = this.state.getDecodedAddresses();
499
+ if (!addresses.length) {
500
+ return;
501
+ }
502
+ this.getPoolReward(addresses, result => {
503
+ this.updateEarningReward(result);
504
+ }).catch(console.error);
505
+ this.earningsRewardInterval = setInterval(() => {
506
+ this.getPoolReward(addresses, result => {
507
+ this.updateEarningReward(result);
508
+ }).catch(console.error);
509
+ }, _constants.CRON_REFRESH_STAKING_REWARD_FAST_INTERVAL);
510
+ }
511
+ runUnsubscribeStakingRewardInterval() {
512
+ this.earningsRewardInterval && clearInterval(this.earningsRewardInterval);
513
+ }
199
514
  async fetchPoolRewardHistory(addresses, callback) {
200
515
  let cancel = false;
201
- await this.state.eventService.waitChainReady;
516
+ await this.eventService.waitChainReady;
202
517
  const [substrateAddresses, evmAddresses] = (0, _utils2.categoryAddresses)(addresses);
203
518
  const activeChains = this.state.activeChainSlugs;
204
519
  const unsubList = [];
@@ -224,7 +539,7 @@ class EarningService {
224
539
  }
225
540
  updateEarningRewardHistory(earningRewardHistory) {
226
541
  const earningRewardHistoryState = this.earningRewardHistorySubject.getValue();
227
- const key = `${earningRewardHistory.slug}---${earningRewardHistory.address}---${earningRewardHistory.blockTimestamp}`;
542
+ const key = `${earningRewardHistory.slug}---${earningRewardHistory.address}---${earningRewardHistory.eventIndex}`;
228
543
  earningRewardHistoryState[key] = earningRewardHistory;
229
544
  this.earningRewardHistorySubject.next(earningRewardHistoryState);
230
545
  }
@@ -234,6 +549,24 @@ class EarningService {
234
549
  getEarningRewardHistory() {
235
550
  return this.earningRewardHistorySubject.getValue();
236
551
  }
552
+ runSubscribeEarningRewardHistoryInterval() {
553
+ this.runUnsubscribeEarningRewardHistoryInterval();
554
+ const addresses = this.state.getDecodedAddresses();
555
+ if (!addresses.length) {
556
+ return;
557
+ }
558
+ this.fetchPoolRewardHistory(addresses, result => {
559
+ this.updateEarningRewardHistory(result);
560
+ }).catch(console.error);
561
+ this.earningsRewardHistoryInterval = setInterval(() => {
562
+ this.fetchPoolRewardHistory(addresses, result => {
563
+ this.updateEarningRewardHistory(result);
564
+ }).catch(console.error);
565
+ }, _constants.CRON_REFRESH_EARNING_REWARD_HISTORY_INTERVAL);
566
+ }
567
+ runUnsubscribeEarningRewardHistoryInterval() {
568
+ this.earningsRewardHistoryInterval && clearInterval(this.earningsRewardHistoryInterval);
569
+ }
237
570
 
238
571
  /* Get pools' reward */
239
572
 
@@ -246,7 +579,7 @@ class EarningService {
246
579
  * @return {Promise<YieldPoolTarget[]>} List of pool's target
247
580
  * */
248
581
  async getPoolTargets(slug) {
249
- await this.state.eventService.waitChainReady;
582
+ await this.eventService.waitChainReady;
250
583
  const handler = this.getPoolHandler(slug);
251
584
  if (handler) {
252
585
  return await handler.getPoolTargets();
@@ -262,7 +595,7 @@ class EarningService {
262
595
  /* Join */
263
596
 
264
597
  async earlyValidateJoin(request) {
265
- await this.state.eventService.waitChainReady;
598
+ await this.eventService.waitChainReady;
266
599
  const {
267
600
  slug
268
601
  } = request;
@@ -274,7 +607,7 @@ class EarningService {
274
607
  }
275
608
  }
276
609
  async generateOptimalSteps(params) {
277
- await this.state.eventService.waitChainReady;
610
+ await this.eventService.waitChainReady;
278
611
  const {
279
612
  slug
280
613
  } = params;
@@ -286,7 +619,7 @@ class EarningService {
286
619
  }
287
620
  }
288
621
  async validateYieldJoin(params) {
289
- await this.state.eventService.waitChainReady;
622
+ await this.eventService.waitChainReady;
290
623
  const {
291
624
  slug
292
625
  } = params.data;
@@ -298,7 +631,7 @@ class EarningService {
298
631
  }
299
632
  }
300
633
  async handleYieldJoin(params) {
301
- await this.state.eventService.waitChainReady;
634
+ await this.eventService.waitChainReady;
302
635
  const {
303
636
  slug
304
637
  } = params.data;
@@ -315,7 +648,7 @@ class EarningService {
315
648
  /* Leave */
316
649
 
317
650
  async validateYieldLeave(params) {
318
- await this.state.eventService.waitChainReady;
651
+ await this.eventService.waitChainReady;
319
652
  const {
320
653
  slug
321
654
  } = params;
@@ -327,7 +660,7 @@ class EarningService {
327
660
  }
328
661
  }
329
662
  async handleYieldLeave(params) {
330
- await this.state.eventService.waitChainReady;
663
+ await this.eventService.waitChainReady;
331
664
  const {
332
665
  slug
333
666
  } = params;
@@ -344,7 +677,7 @@ class EarningService {
344
677
  /* Other */
345
678
 
346
679
  async handleYieldWithdraw(params) {
347
- await this.state.eventService.waitChainReady;
680
+ await this.eventService.waitChainReady;
348
681
  const {
349
682
  slug
350
683
  } = params;
@@ -356,7 +689,7 @@ class EarningService {
356
689
  }
357
690
  }
358
691
  async handleYieldCancelUnstake(params) {
359
- await this.state.eventService.waitChainReady;
692
+ await this.eventService.waitChainReady;
360
693
  const {
361
694
  slug
362
695
  } = params;
@@ -368,7 +701,7 @@ class EarningService {
368
701
  }
369
702
  }
370
703
  async handleYieldClaimReward(params) {
371
- await this.state.eventService.waitChainReady;
704
+ await this.eventService.waitChainReady;
372
705
  const {
373
706
  slug
374
707
  } = params;
@@ -33,6 +33,7 @@ class EventService extends _eventemitter.default {
33
33
  this.waitCampaignReady = this.generateWaitPromise('campaign.ready');
34
34
  this.waitBuyTokenReady = this.generateWaitPromise('buy.tokens.ready');
35
35
  this.waitBuyServiceReady = this.generateWaitPromise('buy.services.ready');
36
+ this.waitEarningReady = this.generateWaitPromise('earning.ready');
36
37
  }
37
38
  generateWaitPromise(eventType) {
38
39
  return new Promise(resolve => {
@@ -6,7 +6,6 @@ Object.defineProperty(exports, "__esModule", {
6
6
  });
7
7
  exports.default = exports.EVERYTIME = void 0;
8
8
  var _DeleteEarningData = _interopRequireDefault(require("@subwallet/extension-base/services/migration-service/scripts/DeleteEarningData"));
9
- var _EnableEarningChains = _interopRequireDefault(require("@subwallet/extension-base/services/migration-service/scripts/EnableEarningChains"));
10
9
  var _MigrateEarningVersion = _interopRequireDefault(require("./databases/MigrateEarningVersion"));
11
10
  var _MigrateEthProvider = _interopRequireDefault(require("./providers/MigrateEthProvider"));
12
11
  var _MigratePioneerProvider = _interopRequireDefault(require("./providers/MigratePioneerProvider"));
@@ -44,7 +43,7 @@ var _default = {
44
43
  '1.1.6-01': _MigrateWalletReference.default,
45
44
  '1.1.7': _DeleteChain.default,
46
45
  '1.1.13-01': _MigrateTokenDecimals.default,
47
- '1.1.13-02': _EnableEarningChains.default,
46
+ // '1.1.13-02-2': EnableEarningChains,
48
47
  '1.1.13-03': _DeleteEarningData.default,
49
48
  '1.1.17-01': _MigratePioneerProvider.default,
50
49
  '1.1.17-03': _EnableVaraChain.default,
@@ -295,6 +295,9 @@ class DatabaseService {
295
295
  async updateYieldPoolStore(data) {
296
296
  await this.stores.yieldPoolInfo.upsert(data);
297
297
  }
298
+ async updateYieldPoolsStore(data) {
299
+ await this.stores.yieldPoolInfo.bulkUpsert(data);
300
+ }
298
301
  async deleteYieldPoolInfo(slugs) {
299
302
  await this.stores.yieldPoolInfo.bulkDelete(slugs);
300
303
  }
@@ -317,9 +320,18 @@ class DatabaseService {
317
320
  });
318
321
  return this.yieldInfoSubscription;
319
322
  }
323
+ removeYieldPositionByAddresses(addresses) {
324
+ return this.stores.yieldPosition.removeByAddresses(addresses);
325
+ }
326
+ removeYieldPositionByChains(chains) {
327
+ return this.stores.yieldPosition.removeByChains(chains);
328
+ }
320
329
  async updateYieldPosition(data) {
321
330
  await this.stores.yieldPosition.upsert(data);
322
331
  }
332
+ async updateYieldPositions(data) {
333
+ await this.stores.yieldPosition.bulkUpsert(data);
334
+ }
323
335
  async getYieldPositionByAddress(addresses) {
324
336
  return this.stores.yieldPosition.getByAddress(addresses);
325
337
  }
@@ -334,6 +346,9 @@ class DatabaseService {
334
346
 
335
347
  /* Campaign */
336
348
 
349
+ getAllCampaign() {
350
+ return this.stores.campaign.getAll();
351
+ }
337
352
  subscribeProcessingCampaign() {
338
353
  return this.stores.campaign.subscribeProcessingCampaign();
339
354
  }
@@ -13,7 +13,13 @@ var _dexie = require("dexie");
13
13
  const filterProcessing = campaign => {
14
14
  const now = new Date().getTime();
15
15
  const isExpired = now <= campaign.startTime || now >= campaign.endTime;
16
- return !(campaign.isDone || isExpired);
16
+ return !(campaign.isArchive || campaign.isDone || isExpired);
17
+ };
18
+ const getId = campaign => {
19
+ return campaign.campaignId;
20
+ };
21
+ const sortById = (a, b) => {
22
+ return getId(a) - getId(b);
17
23
  };
18
24
  class CampaignStore extends _BaseStore.default {
19
25
  async getAll() {
@@ -23,10 +29,10 @@ class CampaignStore extends _BaseStore.default {
23
29
  return this.table.get(slug);
24
30
  }
25
31
  async getProcessingCampaign() {
26
- return (await this.table.toArray()).filter(filterProcessing);
32
+ return (await this.table.toArray()).filter(filterProcessing).sort(sortById);
27
33
  }
28
34
  subscribeProcessingCampaign() {
29
- return (0, _dexie.liveQuery)(() => this.table.filter(filterProcessing).toArray());
35
+ return (0, _dexie.liveQuery)(async () => (await this.table.filter(filterProcessing).toArray()).sort(sortById));
30
36
  }
31
37
  upsertCampaign(campaign) {
32
38
  return this.table.put(campaign);