@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
@@ -2,20 +2,17 @@
2
2
  // SPDX-License-Identifier: Apache-2.0
3
3
 
4
4
  import { subscribeCrowdloan } from '@subwallet/extension-base/koni/api/dotsama/crowdloan';
5
- import { getNominationStakingRewardData, stakingOnChainApi } from '@subwallet/extension-base/koni/api/staking';
6
- import { subscribeEssentialChainStakingMetadata } from '@subwallet/extension-base/koni/api/staking/bonding';
5
+ import { getNominationStakingRewardData } from '@subwallet/extension-base/koni/api/staking';
7
6
  import { nftHandler } from '@subwallet/extension-base/koni/background/handlers';
8
7
  import { subscribeBalance } from '@subwallet/extension-base/services/balance-service/helpers/subscribe/balance';
9
8
  import { _isChainEnabled, _isChainSupportSubstrateStaking } from '@subwallet/extension-base/services/chain-service/utils';
10
9
  import { COMMON_RELOAD_EVENTS } from '@subwallet/extension-base/services/event-service/types';
11
10
  import { waitTimeout } from '@subwallet/extension-base/utils';
12
- import { logger as createLogger, noop } from '@polkadot/util';
11
+ import { logger as createLogger } from '@polkadot/util';
13
12
  export class KoniSubscription {
14
13
  subscriptionMap = {
15
14
  crowdloan: undefined,
16
15
  balance: undefined,
17
- stakingOnChain: undefined,
18
- essentialChainStakingMetadata: undefined,
19
16
  yieldPoolStats: undefined,
20
17
  yieldPosition: undefined
21
18
  };
@@ -44,20 +41,14 @@ export class KoniSubscription {
44
41
  this.subscriptionMap.crowdloan();
45
42
  delete this.subscriptionMap.crowdloan;
46
43
  }
47
- if (this.subscriptionMap.stakingOnChain) {
48
- this.subscriptionMap.stakingOnChain();
49
- delete this.subscriptionMap.stakingOnChain;
50
- }
51
44
  }
52
45
  async start() {
53
46
  var _this$state$keyringSe;
54
47
  await Promise.all([this.state.eventService.waitCryptoReady, this.state.eventService.waitKeyringReady, this.state.eventService.waitAssetReady]);
55
48
  const currentAddress = (_this$state$keyringSe = this.state.keyringService.currentAccount) === null || _this$state$keyringSe === void 0 ? void 0 : _this$state$keyringSe.address;
56
- this.subscribeYieldPools(this.state.getChainInfoMap(), this.state.getAssetRegistry(), this.state.getSubstrateApiMap(), this.state.getEvmApiMap(), currentAddress);
57
49
  if (currentAddress) {
58
50
  this.subscribeBalances(currentAddress, this.state.getChainInfoMap(), this.state.getChainStateMap(), this.state.getSubstrateApiMap(), this.state.getEvmApiMap());
59
51
  this.subscribeCrowdloans(currentAddress, this.state.getSubstrateApiMap());
60
- this.subscribeStakingOnChain(currentAddress, this.state.getSubstrateApiMap());
61
52
  }
62
53
  this.eventHandler = (events, eventTypes) => {
63
54
  var _serviceInfo$currentA;
@@ -67,15 +58,11 @@ export class KoniSubscription {
67
58
  return;
68
59
  }
69
60
  const address = (_serviceInfo$currentA = serviceInfo.currentAccountInfo) === null || _serviceInfo$currentA === void 0 ? void 0 : _serviceInfo$currentA.address;
70
-
71
- // @ts-ignore
72
- this.subscribeYieldPools(serviceInfo.chainInfoMap, serviceInfo.assetRegistry, serviceInfo.chainApiMap.substrate, serviceInfo.chainApiMap.evm, address);
73
61
  if (!address) {
74
62
  return;
75
63
  }
76
64
  this.subscribeBalances(address, serviceInfo.chainInfoMap, serviceInfo.chainStateMap, serviceInfo.chainApiMap.substrate, serviceInfo.chainApiMap.evm);
77
65
  this.subscribeCrowdloans(address, serviceInfo.chainApiMap.substrate);
78
- this.subscribeStakingOnChain(address, serviceInfo.chainApiMap.substrate);
79
66
  };
80
67
  this.state.eventService.onLazy(this.eventHandler.bind(this));
81
68
  }
@@ -105,121 +92,6 @@ export class KoniSubscription {
105
92
  this.updateSubscription('crowdloan', this.initCrowdloanSubscription(addresses, substrateApiMap, onlyRunOnFirstTime));
106
93
  }).catch(console.error);
107
94
  }
108
- subscribeYieldPools(chainInfoMap, assetInfoMap, substrateApiMap, evmApiMap, address, onlyRunOnFirstTime) {
109
- this.updateSubscription('yieldPoolStats', this.initYieldPoolStatsSubscription(substrateApiMap, evmApiMap, onlyRunOnFirstTime));
110
- if (address) {
111
- const addresses = this.state.getDecodedAddresses(address);
112
- if (!addresses.length) {
113
- return;
114
- }
115
- this.updateSubscription('yieldPosition', this.initYieldPositionSubscription(addresses, substrateApiMap, evmApiMap, chainInfoMap, assetInfoMap));
116
- }
117
- }
118
- initYieldPositionSubscription(addresses, substrateApiMap, evmApiMap, chainInfoMap, assetInfoMap, onlyRunOnFirstTime) {
119
- let cancel = false;
120
- const updateYieldPoolStats = data => {
121
- this.state.updateYieldPosition(data);
122
- };
123
- let unsub = noop;
124
- this.state.earningService.subscribePoolPositions(addresses, updateYieldPoolStats).then(rs => {
125
- if (cancel) {
126
- rs();
127
- } else {
128
- if (onlyRunOnFirstTime) {
129
- rs && rs();
130
- } else {
131
- unsub = rs;
132
- }
133
- }
134
- }).catch(console.error);
135
- return () => {
136
- cancel = true;
137
- unsub && unsub();
138
- };
139
- }
140
- initYieldPoolStatsSubscription(substrateApiMap, evmApiMap, onlyRunOnFirstTime) {
141
- let cancel = false;
142
- this.state.resetYieldPoolInfo(Object.keys(this.state.getChainInfoMap()));
143
- const updateYieldPoolStats = data => {
144
- this.state.updateYieldPoolInfo(data);
145
- };
146
-
147
- // const unsub = subscribeYieldPoolStats(substrateApiMap, evmApiMap, this.state.getActiveChainInfoMap(), this.state.getAssetRegistry(), updateYieldPoolStats);
148
- let unsub = noop;
149
- this.state.earningService.subscribePoolsInfo(updateYieldPoolStats).then(rs => {
150
- if (cancel) {
151
- rs();
152
- } else {
153
- if (onlyRunOnFirstTime) {
154
- rs && rs();
155
- } else {
156
- unsub = rs;
157
- }
158
- }
159
- }).catch(console.error);
160
-
161
- //
162
- // if (onlyRunOnFirstTime) {
163
- // unsub && unsub();
164
- //
165
- // return;
166
- // }
167
-
168
- return () => {
169
- cancel = true;
170
- // unsub && unsub();
171
- unsub && unsub();
172
- };
173
- }
174
- subscribeStakingOnChain(address, substrateApiMap, onlyRunOnFirstTime) {
175
- this.state.resetStaking(address);
176
- const addresses = this.state.getDecodedAddresses(address);
177
- if (!addresses.length) {
178
- return;
179
- }
180
- this.updateSubscription('stakingOnChain', this.initStakingOnChainSubscription(addresses, substrateApiMap, onlyRunOnFirstTime));
181
- this.updateSubscription('essentialChainStakingMetadata', this.initEssentialChainStakingMetadataSubscription(substrateApiMap, onlyRunOnFirstTime)); // TODO: might not need to re-subscribe on changing account
182
- }
183
-
184
- initStakingOnChainSubscription(addresses, substrateApiMap, onlyRunOnFirstTime) {
185
- const stakingCallback = (networkKey, rs) => {
186
- this.state.setStakingItem(networkKey, rs);
187
- };
188
- const nominatorStateCallback = nominatorMetadata => {
189
- this.state.updateStakingNominatorMetadata(nominatorMetadata);
190
- };
191
- const unsub = stakingOnChainApi(addresses, substrateApiMap, this.state.getActiveChainInfoMap(), stakingCallback, nominatorStateCallback);
192
- if (onlyRunOnFirstTime) {
193
- unsub && unsub();
194
- return;
195
- }
196
- return () => {
197
- unsub && unsub();
198
- };
199
- }
200
- initEssentialChainStakingMetadataSubscription(substrateApiMap, onlyRunOnFirstTime) {
201
- const unsub = subscribeEssentialChainStakingMetadata(substrateApiMap, this.state.getActiveChainInfoMap(), (networkKey, rs) => {
202
- this.state.updateChainStakingMetadata(rs, {
203
- era: rs.era,
204
- minStake: rs.minStake,
205
- maxValidatorPerNominator: rs.maxValidatorPerNominator,
206
- // temporary fix for Astar, there's no limit for now
207
- maxWithdrawalRequestPerValidator: rs.maxWithdrawalRequestPerValidator,
208
- // by default
209
- allowCancelUnstaking: rs.allowCancelUnstaking,
210
- unstakingPeriod: rs.unstakingPeriod,
211
- expectedReturn: rs.expectedReturn,
212
- inflation: rs.inflation
213
- });
214
- });
215
- if (onlyRunOnFirstTime) {
216
- unsub && unsub();
217
- return;
218
- }
219
- return () => {
220
- unsub && unsub();
221
- };
222
- }
223
95
  initBalanceSubscription(addresses, chainInfoMap, chainStateMap, substrateApiMap, evmApiMap, onlyRunOnFirstTime) {
224
96
  const filteredChainInfoMap = {};
225
97
  Object.values(chainStateMap).forEach(chainState => {
@@ -284,33 +156,6 @@ export class KoniSubscription {
284
156
  this.state.updateStakingReward(rewardItem);
285
157
  });
286
158
  }
287
- async subscribeStakingRewardFastInterval(address) {
288
- const addresses = this.state.getDecodedAddresses(address);
289
- if (!addresses.length) {
290
- return;
291
- }
292
- const updateState = result => {
293
- this.state.earningService.updateEarningReward(result);
294
- };
295
- await Promise.all([this.state.earningService.getPoolReward(addresses, updateState)]);
296
- }
297
- async subscribeEarningRewardHistoryInterval(address) {
298
- const addresses = this.state.getDecodedAddresses(address);
299
- if (!addresses.length) {
300
- return;
301
- }
302
- const updateState = result => {
303
- this.state.earningService.updateEarningRewardHistory(result);
304
- };
305
- await Promise.all([this.state.earningService.fetchPoolRewardHistory(addresses, updateState)]);
306
- }
307
- async reloadStaking() {
308
- // const currentAddress = this.state.keyringService.currentAccount?.address;
309
-
310
- // this.subscribeYieldPools(this.state.getSubstrateApiMap());
311
-
312
- await waitTimeout(1800);
313
- }
314
159
  async reloadBalance() {
315
160
  var _this$state$keyringSe2;
316
161
  const currentAddress = (_this$state$keyringSe2 = this.state.keyringService.currentAccount) === null || _this$state$keyringSe2 === void 0 ? void 0 : _this$state$keyringSe2.address;
package/package.json CHANGED
@@ -17,7 +17,7 @@
17
17
  "./cjs/detectPackage.js"
18
18
  ],
19
19
  "type": "module",
20
- "version": "1.1.31-beta.0",
20
+ "version": "1.1.32-beta.0",
21
21
  "main": "./cjs/index.js",
22
22
  "module": "./index.js",
23
23
  "types": "./index.d.ts",
@@ -1706,11 +1706,11 @@
1706
1706
  "@reduxjs/toolkit": "^1.9.1",
1707
1707
  "@sora-substrate/type-definitions": "^1.17.7",
1708
1708
  "@substrate/connect": "^0.7.26",
1709
- "@subwallet/chain-list": "^0.2.37",
1710
- "@subwallet/extension-base": "^1.1.31-1",
1711
- "@subwallet/extension-chains": "^1.1.31-1",
1712
- "@subwallet/extension-dapp": "^1.1.31-1",
1713
- "@subwallet/extension-inject": "^1.1.31-1",
1709
+ "@subwallet/chain-list": "0.2.38",
1710
+ "@subwallet/extension-base": "^1.1.32-0",
1711
+ "@subwallet/extension-chains": "^1.1.32-0",
1712
+ "@subwallet/extension-dapp": "^1.1.32-0",
1713
+ "@subwallet/extension-inject": "^1.1.32-0",
1714
1714
  "@subwallet/keyring": "^0.1.1",
1715
1715
  "@subwallet/ui-keyring": "^0.1.1",
1716
1716
  "@walletconnect/sign-client": "^2.8.4",
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.31-1'
10
+ version: '1.1.32-0'
11
11
  };
@@ -47,6 +47,7 @@ export default class CampaignService {
47
47
  endTime,
48
48
  startTime,
49
49
  isDone: false,
50
+ isArchive: false,
50
51
  campaignId,
51
52
  type: CampaignDataType.BANNER,
52
53
  buttons,
@@ -67,6 +68,7 @@ export default class CampaignService {
67
68
  endTime,
68
69
  startTime,
69
70
  isDone: false,
71
+ isArchive: false,
70
72
  campaignId,
71
73
  type: CampaignDataType.NOTIFICATION,
72
74
  buttons,
@@ -79,6 +81,23 @@ export default class CampaignService {
79
81
  const exists = await this.#state.dbService.getCampaign(campaign.slug);
80
82
  if (!exists) {
81
83
  await this.#state.dbService.upsertCampaign(campaign);
84
+ } else {
85
+ const data = {
86
+ ...campaign,
87
+ isDone: exists.isDone
88
+ };
89
+ await this.#state.dbService.upsertCampaign(data);
90
+ }
91
+ }
92
+ const allCampaign = await this.#state.dbService.getAllCampaign();
93
+ for (const stored of allCampaign) {
94
+ const exists = campaigns.find(campaign => campaign.slug === stored.slug);
95
+ if (!exists) {
96
+ const data = {
97
+ ...stored,
98
+ isArchive: true
99
+ };
100
+ await this.#state.dbService.upsertCampaign(data);
82
101
  }
83
102
  }
84
103
  this.#state.eventService.emit('campaign.ready', true);
@@ -83,7 +83,8 @@ export const _STAKING_ERA_LENGTH_MAP = {
83
83
  kate: 6,
84
84
  creditcoin: 24,
85
85
  vara_network: 12,
86
- goldberg_testnet: 24
86
+ goldberg_testnet: 24,
87
+ manta_network: 6
87
88
  };
88
89
  export const _EXPECTED_BLOCK_TIME = {
89
90
  // in seconds
@@ -229,7 +230,7 @@ export const _XCM_TYPE = {
229
230
  PR: `${_SubstrateChainType.PARACHAIN}-${_SubstrateChainType.RELAYCHAIN}` // UMP
230
231
  };
231
232
 
232
- export const _DEFAULT_ACTIVE_CHAINS = [..._DEFAULT_CHAINS, 'vara_network', 'bifrost_dot', 'parallel', 'acala', 'interlay'];
233
+ export const _DEFAULT_ACTIVE_CHAINS = [..._DEFAULT_CHAINS, 'vara_network'];
233
234
  export const EVM_PASS_CONNECT_STATUS = {
234
235
  arbitrum_one: ['*']
235
236
  };
@@ -3,7 +3,7 @@
3
3
 
4
4
  export const _STAKING_CHAIN_GROUP = {
5
5
  relay: ['polkadot', 'kusama', 'aleph', 'polkadex', 'ternoa', 'ternoa_alphanet', 'alephTest', 'polkadexTest', 'westend', 'kate', 'edgeware', 'creditcoin', 'vara_network', 'goldberg_testnet'],
6
- para: ['moonbeam', 'moonriver', 'moonbase', 'turing', 'turingStaging', 'bifrost', 'bifrost_testnet', 'calamari_test', 'calamari'],
6
+ para: ['moonbeam', 'moonriver', 'moonbase', 'turing', 'turingStaging', 'bifrost', 'bifrost_testnet', 'calamari_test', 'calamari', 'manta_network'],
7
7
  astar: ['astar', 'shiden', 'shibuya'],
8
8
  amplitude: ['amplitude', 'amplitude_test', 'kilt', 'kilt_peregrine', 'pendulum'],
9
9
  // amplitude and kilt only share some common logic
@@ -41,6 +41,7 @@ export default abstract class BasePoolHandler {
41
41
  get chainInfo(): _ChainInfo;
42
42
  protected get nativeToken(): _ChainAsset;
43
43
  protected get baseInfo(): Omit<BasePoolInfo, 'type'>;
44
+ protected getAssetBySlug(slug: string): _ChainAsset;
44
45
  protected abstract getDescription(amount?: string): string;
45
46
  protected get maintainBalance(): string;
46
47
  get metadataInfo(): Omit<BaseYieldPoolMetadata, 'description'>;
@@ -70,6 +70,9 @@ export default class BasePoolHandler {
70
70
  slug: this.slug
71
71
  };
72
72
  }
73
+ getAssetBySlug(slug) {
74
+ return this.state.getAssetBySlug(slug);
75
+ }
73
76
  get maintainBalance() {
74
77
  const decimals = this.nativeToken.decimals || 0;
75
78
  const defaultMaintainBalance = new BN(1).mul(BN_TEN.pow(new BN(decimals)));
@@ -95,10 +98,10 @@ export default class BasePoolHandler {
95
98
  return false;
96
99
  }
97
100
  async getPoolInfo() {
98
- return this.state.dbService.getYieldPool(this.slug);
101
+ return await this.state.earningService.getYieldPool(this.slug);
99
102
  }
100
103
  async getPoolPosition(address) {
101
- return this.state.dbService.getYieldPositionByAddressAndSlug(address, this.slug);
104
+ return await this.state.earningService.getYieldPosition(address, this.slug);
102
105
  }
103
106
 
104
107
  /* Subscribe data */
@@ -117,7 +120,7 @@ export default class BasePoolHandler {
117
120
  if (!poolInfo || !((_poolInfo$statistic = poolInfo.statistic) !== null && _poolInfo$statistic !== void 0 && _poolInfo$statistic.earningThreshold.join)) {
118
121
  return {
119
122
  passed: false,
120
- errorMessage: 'There\'s a trouble fetching data, please check your internet connection and try again'
123
+ errorMessage: 'There is a problem fetching your data. Check your Internet connection or change the network endpoint and try again.'
121
124
  };
122
125
  }
123
126
  if (request.address === ALL_ACCOUNT_KEY) {
@@ -128,9 +131,9 @@ export default class BasePoolHandler {
128
131
  const nativeTokenInfo = this.state.chainService.getNativeTokenInfo(this.chain);
129
132
  const nativeTokenBalance = await this.state.balanceService.getTokenFreeBalance(request.address, this.chain);
130
133
  const bnNativeTokenBalance = new BN(nativeTokenBalance.value);
131
- if (bnNativeTokenBalance.lte(new BN((_poolInfo$statistic2 = poolInfo.statistic) === null || _poolInfo$statistic2 === void 0 ? void 0 : (_poolInfo$statistic2$ = _poolInfo$statistic2.earningThreshold) === null || _poolInfo$statistic2$ === void 0 ? void 0 : _poolInfo$statistic2$.join))) {
132
- var _poolInfo$statistic3, _poolInfo$statistic3$;
133
- const minJoin = formatNumber(((_poolInfo$statistic3 = poolInfo.statistic) === null || _poolInfo$statistic3 === void 0 ? void 0 : (_poolInfo$statistic3$ = _poolInfo$statistic3.earningThreshold) === null || _poolInfo$statistic3$ === void 0 ? void 0 : _poolInfo$statistic3$.join) || '0', this.nativeToken.decimals || 0);
134
+ const bnMinBalanceToJoin = new BN(((_poolInfo$statistic2 = poolInfo.statistic) === null || _poolInfo$statistic2 === void 0 ? void 0 : (_poolInfo$statistic2$ = _poolInfo$statistic2.earningThreshold) === null || _poolInfo$statistic2$ === void 0 ? void 0 : _poolInfo$statistic2$.join) || '0').add(new BN(poolInfo.metadata.maintainBalance));
135
+ if (bnNativeTokenBalance.lte(bnMinBalanceToJoin)) {
136
+ const minJoin = formatNumber(bnMinBalanceToJoin.toString(), this.nativeToken.decimals || 0);
134
137
  const originChain = this.state.getChainInfo(nativeTokenInfo.originChain);
135
138
  return {
136
139
  passed: false,
@@ -1,6 +1,8 @@
1
+ import { TransactionError } from '@subwallet/extension-base/background/errors/TransactionError';
1
2
  import { LendingYieldPoolInfo, YieldPoolType } from '@subwallet/extension-base/types';
2
3
  import BaseSpecialStakingPoolHandler from '../special';
3
4
  export default abstract class BaseLendingPoolHandler extends BaseSpecialStakingPoolHandler {
4
5
  readonly type = YieldPoolType.LENDING;
5
6
  abstract getPoolStat(): Promise<LendingYieldPoolInfo>;
7
+ validateYieldLeave(amount: string, address: string, fastLeave: boolean, selectedTarget?: string): Promise<TransactionError[]>;
6
8
  }
@@ -1,7 +1,12 @@
1
1
  // Copyright 2019-2022 @subwallet/extension-base
2
2
  // SPDX-License-Identifier: Apache-2.0
3
3
 
4
+ import { TransactionError } from '@subwallet/extension-base/background/errors/TransactionError';
5
+ import { BasicTxErrorType, StakingTxErrorType } from '@subwallet/extension-base/background/KoniTypes';
4
6
  import { YieldPoolType } from '@subwallet/extension-base/types';
7
+ import { BN_ZERO, formatNumber } from '@subwallet/extension-base/utils';
8
+ import BigN from 'bignumber.js';
9
+ import { t } from 'i18next';
5
10
  import BaseSpecialStakingPoolHandler from "../special.js";
6
11
  export default class BaseLendingPoolHandler extends BaseSpecialStakingPoolHandler {
7
12
  type = YieldPoolType.LENDING;
@@ -9,4 +14,60 @@ export default class BaseLendingPoolHandler extends BaseSpecialStakingPoolHandle
9
14
  /* Subscribe pool info */
10
15
 
11
16
  /* Subscribe pool info */
17
+
18
+ /* Leave pool action */
19
+
20
+ async validateYieldLeave(amount, address, fastLeave, selectedTarget) {
21
+ const poolInfo = await this.getPoolInfo();
22
+ const poolPosition = await this.getPoolPosition(address);
23
+ if (!poolInfo || !poolInfo.statistic || !poolPosition) {
24
+ return [new TransactionError(BasicTxErrorType.INTERNAL_ERROR)];
25
+ }
26
+ if (!this.availableMethod.defaultUnstake && !fastLeave) {
27
+ return [new TransactionError(BasicTxErrorType.INTERNAL_ERROR)];
28
+ }
29
+ if (!this.availableMethod.fastUnstake && fastLeave) {
30
+ return [new TransactionError(BasicTxErrorType.INTERNAL_ERROR)];
31
+ }
32
+ const errors = [];
33
+ const bnActiveStake = new BigN(poolPosition.activeStake).multipliedBy(poolInfo.statistic.assetEarning[0].exchangeRate || 1);
34
+ const bnAmount = new BigN(amount);
35
+ const bnRemainingStake = bnActiveStake.minus(bnAmount);
36
+ const minStake = new BigN(poolInfo.statistic.earningThreshold.join || '0');
37
+ const minUnstake = new BigN((fastLeave ? poolInfo.statistic.earningThreshold.fastUnstake : poolInfo.statistic.earningThreshold.defaultUnstake) || '0');
38
+ const maxUnstakeRequest = poolInfo.statistic.maxWithdrawalRequestPerFarmer;
39
+ const derivativeTokenInfo = this.state.getAssetBySlug(this.derivativeAssets[0]);
40
+ if (bnAmount.lte(BN_ZERO)) {
41
+ return [new TransactionError(BasicTxErrorType.INVALID_PARAMS, t('Amount must be greater than 0'))];
42
+ }
43
+ if (bnAmount.lt(minUnstake)) {
44
+ const minUnstakeStr = formatNumber(minUnstake.toString(), derivativeTokenInfo.decimals || 0);
45
+ errors.push(new TransactionError(StakingTxErrorType.NOT_ENOUGH_MIN_UNSTAKE, t('You need to unstake at least {{amount}} {{token}}', {
46
+ replace: {
47
+ amount: minUnstakeStr,
48
+ token: derivativeTokenInfo.symbol
49
+ }
50
+ })));
51
+ }
52
+ if (!fastLeave) {
53
+ if (!(bnRemainingStake.isZero() || bnRemainingStake.gte(minStake))) {
54
+ errors.push(new TransactionError(StakingTxErrorType.INVALID_ACTIVE_STAKE)); // TODO
55
+ }
56
+
57
+ if (poolPosition.unstakings.length > maxUnstakeRequest) {
58
+ errors.push(new TransactionError(StakingTxErrorType.EXCEED_MAX_UNSTAKING, t('You cannot unstake more than {{number}} times', {
59
+ replace: {
60
+ number: maxUnstakeRequest
61
+ }
62
+ })));
63
+ }
64
+ }
65
+ if (bnRemainingStake.lt(0)) {
66
+ errors.push(new TransactionError(StakingTxErrorType.INVALID_ACTIVE_STAKE)); // TODO
67
+ }
68
+
69
+ return Promise.resolve(errors);
70
+ }
71
+
72
+ /* Leave pool action */
12
73
  }
@@ -2,7 +2,7 @@
2
2
  // SPDX-License-Identifier: Apache-2.0
3
3
 
4
4
  import { TransactionError } from '@subwallet/extension-base/background/errors/TransactionError';
5
- import { BasicTxErrorType, ExtrinsicType } from '@subwallet/extension-base/background/KoniTypes';
5
+ import { BasicTxErrorType, ChainType, ExtrinsicType } from '@subwallet/extension-base/background/KoniTypes';
6
6
  import { _getTokenOnChainInfo } from '@subwallet/extension-base/services/chain-service/utils';
7
7
  import { EarningStatus, YieldStepType } from '@subwallet/extension-base/types';
8
8
  import { BN, BN_TEN, BN_ZERO } from '@polkadot/util';
@@ -101,7 +101,7 @@ export default class InterlayLendingPoolHandler extends BaseLendingPoolHandler {
101
101
  totalStake: bnTotalBalance.toString(),
102
102
  activeStake: bnActiveBalance.toString(),
103
103
  unstakeBalance: '0',
104
- status: EarningStatus.EARNING_REWARD,
104
+ status: bnActiveBalance.gt(BN_ZERO) ? EarningStatus.EARNING_REWARD : EarningStatus.NOT_EARNING,
105
105
  derivativeToken: derivativeTokenSlug,
106
106
  isBondedBefore: bnTotalBalance.gt(BN_ZERO),
107
107
  nominations: [],
@@ -155,7 +155,8 @@ export default class InterlayLendingPoolHandler extends BaseLendingPoolHandler {
155
155
  extrinsicType: ExtrinsicType.MINT_QDOT,
156
156
  extrinsic,
157
157
  txData: data,
158
- transferNativeAmount: '0'
158
+ transferNativeAmount: '0',
159
+ chainType: ChainType.SUBSTRATE
159
160
  };
160
161
  }
161
162
 
@@ -1,7 +1,7 @@
1
1
  // Copyright 2019-2022 @subwallet/extension-base
2
2
  // SPDX-License-Identifier: Apache-2.0
3
3
 
4
- import { ExtrinsicType } from '@subwallet/extension-base/background/KoniTypes';
4
+ import { ChainType, ExtrinsicType } from '@subwallet/extension-base/background/KoniTypes';
5
5
  import { _getTokenOnChainInfo } from '@subwallet/extension-base/services/chain-service/utils';
6
6
  import { fakeAddress } from '@subwallet/extension-base/services/earning-service/constants';
7
7
  import { EarningStatus, UnstakingStatus, YieldStepType } from '@subwallet/extension-base/types';
@@ -141,7 +141,7 @@ export default class AcalaLiquidStakingPoolHandler extends BaseLiquidStakingPool
141
141
  totalStake: totalBalance.toString(),
142
142
  activeStake: activeTotalBalance.toString(),
143
143
  unstakeBalance: unlockingBalance.toString(),
144
- status: EarningStatus.EARNING_REWARD,
144
+ status: activeTotalBalance.gt(BN_ZERO) ? EarningStatus.EARNING_REWARD : EarningStatus.NOT_EARNING,
145
145
  derivativeToken: derivativeTokenSlug,
146
146
  isBondedBefore: totalBalance.gt(BN_ZERO),
147
147
  nominations: [],
@@ -191,7 +191,8 @@ export default class AcalaLiquidStakingPoolHandler extends BaseLiquidStakingPool
191
191
  extrinsicType: ExtrinsicType.MINT_LDOT,
192
192
  extrinsic,
193
193
  txData: data,
194
- transferNativeAmount: '0'
194
+ transferNativeAmount: '0',
195
+ chainType: ChainType.SUBSTRATE
195
196
  };
196
197
  }
197
198
 
@@ -1,3 +1,4 @@
1
+ import { TransactionError } from '@subwallet/extension-base/background/errors/TransactionError';
1
2
  import { YieldPoolType } from '@subwallet/extension-base/types';
2
3
  import BaseSpecialStakingPoolHandler from '../special';
3
4
  export default abstract class BaseLiquidStakingPoolHandler extends BaseSpecialStakingPoolHandler {
@@ -6,4 +7,5 @@ export default abstract class BaseLiquidStakingPoolHandler extends BaseSpecialSt
6
7
  readonly minAmountPercent: number;
7
8
  static get defaultMinAmountPercent(): number;
8
9
  createParamToRedeem(amount: string, address: string): Promise<number>;
10
+ validateYieldLeave(amount: string, address: string, fastLeave: boolean, selectedTarget?: string): Promise<TransactionError[]>;
9
11
  }
@@ -2,9 +2,12 @@
2
2
  // SPDX-License-Identifier: Apache-2.0
3
3
 
4
4
  import { TransactionError } from '@subwallet/extension-base/background/errors/TransactionError';
5
- import { BasicTxErrorType } from '@subwallet/extension-base/background/KoniTypes';
5
+ import { BasicTxErrorType, StakingTxErrorType } from '@subwallet/extension-base/background/KoniTypes';
6
6
  import { convertDerivativeToOriginToken } from '@subwallet/extension-base/koni/api/yield/helper/utils';
7
7
  import { YieldPoolType } from '@subwallet/extension-base/types';
8
+ import { formatNumber } from '@subwallet/extension-base/utils';
9
+ import { t } from 'i18next';
10
+ import { BN, BN_ZERO } from '@polkadot/util';
8
11
  import BaseSpecialStakingPoolHandler from "../special.js";
9
12
  const DEFAULT_MIN_AMOUNT_PERCENT = 0.98;
10
13
  export default class BaseLiquidStakingPoolHandler extends BaseSpecialStakingPoolHandler {
@@ -30,6 +33,57 @@ export default class BaseLiquidStakingPoolHandler extends BaseSpecialStakingPool
30
33
  const formattedMinAmount = convertDerivativeToOriginToken(amount, poolInfo, derivativeTokenInfo, originTokenInfo);
31
34
  return Math.floor(this.minAmountPercent * formattedMinAmount);
32
35
  }
36
+ async validateYieldLeave(amount, address, fastLeave, selectedTarget) {
37
+ const poolInfo = await this.getPoolInfo();
38
+ const poolPosition = await this.getPoolPosition(address);
39
+ if (!poolInfo || !poolInfo.statistic || !poolPosition) {
40
+ return [new TransactionError(BasicTxErrorType.INTERNAL_ERROR)];
41
+ }
42
+ if (!this.availableMethod.defaultUnstake && !fastLeave) {
43
+ return [new TransactionError(BasicTxErrorType.INTERNAL_ERROR)];
44
+ }
45
+ if (!this.availableMethod.fastUnstake && fastLeave) {
46
+ return [new TransactionError(BasicTxErrorType.INTERNAL_ERROR)];
47
+ }
48
+ const errors = [];
49
+ const bnActiveStake = new BN(poolPosition.activeStake);
50
+ const bnAmount = new BN(amount);
51
+ const bnRemainingStake = bnActiveStake.sub(bnAmount);
52
+ const minStake = new BN(poolInfo.statistic.earningThreshold.join || '0');
53
+ const minUnstake = new BN((fastLeave ? poolInfo.statistic.earningThreshold.fastUnstake : poolInfo.statistic.earningThreshold.defaultUnstake) || '0');
54
+ const maxUnstakeRequest = poolInfo.statistic.maxWithdrawalRequestPerFarmer;
55
+ const derivativeTokenInfo = this.state.getAssetBySlug(this.derivativeAssets[0]);
56
+ if (bnAmount.lte(BN_ZERO)) {
57
+ return [new TransactionError(BasicTxErrorType.INVALID_PARAMS, t('Amount must be greater than 0'))];
58
+ }
59
+ if (bnAmount.lt(minUnstake)) {
60
+ const minUnstakeStr = formatNumber(minUnstake.toString(), derivativeTokenInfo.decimals || 0);
61
+ errors.push(new TransactionError(StakingTxErrorType.NOT_ENOUGH_MIN_UNSTAKE, t('You need to unstake at least {{amount}} {{token}}', {
62
+ replace: {
63
+ amount: minUnstakeStr,
64
+ token: derivativeTokenInfo.symbol
65
+ }
66
+ })));
67
+ }
68
+ if (!fastLeave) {
69
+ if (!(bnRemainingStake.isZero() || bnRemainingStake.gte(minStake))) {
70
+ errors.push(new TransactionError(StakingTxErrorType.INVALID_ACTIVE_STAKE)); // TODO
71
+ }
72
+
73
+ if (poolPosition.unstakings.length > maxUnstakeRequest) {
74
+ errors.push(new TransactionError(StakingTxErrorType.EXCEED_MAX_UNSTAKING, t('You cannot unstake more than {{number}} times', {
75
+ replace: {
76
+ number: maxUnstakeRequest
77
+ }
78
+ })));
79
+ }
80
+ }
81
+ if (bnRemainingStake.lt(BN_ZERO)) {
82
+ errors.push(new TransactionError(StakingTxErrorType.INVALID_ACTIVE_STAKE)); // TODO
83
+ }
84
+
85
+ return Promise.resolve(errors);
86
+ }
33
87
 
34
88
  /* Leave pool action */
35
89
  }
@@ -1,7 +1,7 @@
1
1
  // Copyright 2019-2022 @subwallet/extension-base
2
2
  // SPDX-License-Identifier: Apache-2.0
3
3
 
4
- import { ExtrinsicType } from '@subwallet/extension-base/background/KoniTypes';
4
+ import { ChainType, ExtrinsicType } from '@subwallet/extension-base/background/KoniTypes';
5
5
  import { _STAKING_ERA_LENGTH_MAP } from '@subwallet/extension-base/services/chain-service/constants';
6
6
  import { _getAssetDecimals, _getTokenOnChainInfo } from '@subwallet/extension-base/services/chain-service/utils';
7
7
  import { fakeAddress } from '@subwallet/extension-base/services/earning-service/constants';
@@ -207,7 +207,7 @@ export default class BifrostLiquidStakingPoolHandler extends BaseLiquidStakingPo
207
207
  totalStake: totalBalance.toString(),
208
208
  activeStake: bnActiveBalance.toString(),
209
209
  unstakeBalance: unlockBalance.toString(),
210
- status: bnActiveBalance.eq(BN_ZERO) ? EarningStatus.NOT_EARNING : EarningStatus.EARNING_REWARD,
210
+ status: bnActiveBalance.gt(BN_ZERO) ? EarningStatus.EARNING_REWARD : EarningStatus.NOT_EARNING,
211
211
  isBondedBefore: totalBalance.gt(BN_ZERO.toString()),
212
212
  nominations: [],
213
213
  unstakings: unstakingList
@@ -260,7 +260,8 @@ export default class BifrostLiquidStakingPoolHandler extends BaseLiquidStakingPo
260
260
  extrinsicType: ExtrinsicType.MINT_VDOT,
261
261
  extrinsic,
262
262
  txData: data,
263
- transferNativeAmount: '0'
263
+ transferNativeAmount: '0',
264
+ chainType: ChainType.SUBSTRATE
264
265
  };
265
266
  }
266
267
 
@@ -1,7 +1,7 @@
1
1
  // Copyright 2019-2022 @subwallet/extension-base
2
2
  // SPDX-License-Identifier: Apache-2.0
3
3
 
4
- import { ExtrinsicType } from '@subwallet/extension-base/background/KoniTypes';
4
+ import { ChainType, ExtrinsicType } from '@subwallet/extension-base/background/KoniTypes';
5
5
  import { _STAKING_ERA_LENGTH_MAP } from '@subwallet/extension-base/services/chain-service/constants';
6
6
  import { _getTokenOnChainAssetId } from '@subwallet/extension-base/services/chain-service/utils';
7
7
  import { fakeAddress } from '@subwallet/extension-base/services/earning-service/constants';
@@ -144,7 +144,7 @@ export default class ParallelLiquidStakingPoolHandler extends BaseLiquidStakingP
144
144
  totalStake: totalBalance.toString(),
145
145
  activeStake: activeBalance.toString(),
146
146
  unstakeBalance: unlockingBalance.toString(),
147
- status: EarningStatus.EARNING_REWARD,
147
+ status: activeBalance.gt(BN_ZERO) ? EarningStatus.EARNING_REWARD : EarningStatus.NOT_EARNING,
148
148
  derivativeToken: derivativeTokenSlug,
149
149
  isBondedBefore: totalBalance.gt(BN_ZERO),
150
150
  nominations: [],
@@ -194,7 +194,8 @@ export default class ParallelLiquidStakingPoolHandler extends BaseLiquidStakingP
194
194
  extrinsicType: ExtrinsicType.MINT_SDOT,
195
195
  extrinsic,
196
196
  txData: data,
197
- transferNativeAmount: '0'
197
+ transferNativeAmount: '0',
198
+ chainType: ChainType.SUBSTRATE
198
199
  };
199
200
  }
200
201