@subwallet/extension-base 1.0.2-2 → 1.0.3-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 (151) hide show
  1. package/background/KoniTypes.d.ts +56 -40
  2. package/background/KoniTypes.js +11 -9
  3. package/background/errors/TransactionError.js +25 -1
  4. package/background/types.d.ts +10 -5
  5. package/cjs/background/KoniTypes.js +11 -9
  6. package/cjs/background/errors/TransactionError.js +24 -0
  7. package/cjs/constants/index.js +8 -26
  8. package/cjs/koni/api/dotsama/balance.js +49 -224
  9. package/cjs/koni/api/dotsama/transfer.js +34 -39
  10. package/cjs/koni/api/nft/acala_nft/index.js +7 -7
  11. package/cjs/koni/api/nft/bit.country/index.js +7 -6
  12. package/cjs/koni/api/nft/evm_nft/index.js +8 -3
  13. package/cjs/koni/api/nft/index.js +3 -6
  14. package/cjs/koni/api/nft/karura_nft/index.js +7 -6
  15. package/cjs/koni/api/nft/rmrk_nft/index.js +11 -1
  16. package/cjs/koni/api/nft/statemine_nft/index.js +7 -6
  17. package/cjs/koni/api/nft/unique_nft/index.js +5 -1
  18. package/cjs/koni/api/nft/wasm_nft/index.js +170 -111
  19. package/cjs/koni/api/nft/wasm_nft/utils.js +11 -7
  20. package/cjs/koni/api/staking/bonding/amplitude.js +13 -9
  21. package/cjs/koni/api/staking/bonding/astar.js +15 -13
  22. package/cjs/koni/api/staking/bonding/index.js +22 -10
  23. package/cjs/koni/api/staking/bonding/paraChain.js +85 -2
  24. package/cjs/koni/api/staking/bonding/relayChain.js +122 -16
  25. package/cjs/koni/api/staking/bonding/utils.js +27 -8
  26. package/cjs/koni/api/tokens/wasm/index.js +5 -4
  27. package/cjs/koni/api/tokens/wasm/utils.js +63 -0
  28. package/cjs/koni/api/xcm/polkadotXcm.js +1 -1
  29. package/cjs/koni/api/xcm/utils.js +18 -13
  30. package/cjs/koni/api/xcm/xTokens.js +1 -1
  31. package/cjs/koni/api/xcm/xcmPallet.js +9 -6
  32. package/cjs/koni/background/cron.js +171 -61
  33. package/cjs/koni/background/handlers/Extension.js +391 -207
  34. package/cjs/koni/background/handlers/State.js +49 -34
  35. package/cjs/koni/background/handlers/Tabs.js +50 -17
  36. package/cjs/koni/background/subscription.js +53 -28
  37. package/cjs/packageInfo.js +1 -1
  38. package/cjs/services/base/types.js +20 -0
  39. package/cjs/services/chain-service/handler/SubstrateChainHandler.js +13 -8
  40. package/cjs/services/chain-service/index.js +73 -49
  41. package/cjs/services/event-service/index.js +5 -1
  42. package/cjs/services/event-service/types.js +11 -1
  43. package/cjs/services/history-service/index.js +101 -50
  44. package/cjs/services/history-service/subsquid-multi-chain-history.js +13 -10
  45. package/cjs/services/keyring-service/index.js +11 -13
  46. package/cjs/services/migration-service/scripts/MigrateImportedToken.js +2 -1
  47. package/cjs/services/price-service/coingecko.js +0 -1
  48. package/cjs/services/price-service/index.js +71 -24
  49. package/cjs/services/request-service/handler/AuthRequestHandler.js +13 -7
  50. package/cjs/services/request-service/handler/EvmRequestHandler.js +8 -12
  51. package/cjs/services/request-service/index.js +14 -5
  52. package/cjs/services/storage-service/DatabaseService.js +66 -34
  53. package/cjs/services/storage-service/db-stores/Nft.js +7 -15
  54. package/cjs/services/storage-service/db-stores/Transaction.js +6 -10
  55. package/cjs/services/transaction-service/event-parser/index.js +20 -48
  56. package/cjs/services/transaction-service/index.js +104 -48
  57. package/cjs/services/transaction-service/utils.js +10 -8
  58. package/cjs/utils/address.js +10 -1
  59. package/cjs/utils/index.js +9 -15
  60. package/cjs/utils/promise.js +26 -0
  61. package/constants/index.d.ts +7 -13
  62. package/constants/index.js +7 -13
  63. package/koni/api/dotsama/balance.d.ts +0 -1
  64. package/koni/api/dotsama/balance.js +22 -197
  65. package/koni/api/dotsama/transfer.js +11 -16
  66. package/koni/api/nft/acala_nft/index.js +7 -7
  67. package/koni/api/nft/bit.country/index.js +7 -6
  68. package/koni/api/nft/evm_nft/index.js +7 -3
  69. package/koni/api/nft/index.d.ts +1 -2
  70. package/koni/api/nft/index.js +3 -6
  71. package/koni/api/nft/karura_nft/index.js +7 -6
  72. package/koni/api/nft/nft.d.ts +1 -0
  73. package/koni/api/nft/rmrk_nft/index.js +11 -1
  74. package/koni/api/nft/statemine_nft/index.js +7 -6
  75. package/koni/api/nft/unique_nft/index.js +5 -1
  76. package/koni/api/nft/wasm_nft/index.d.ts +0 -2
  77. package/koni/api/nft/wasm_nft/index.js +168 -109
  78. package/koni/api/nft/wasm_nft/utils.d.ts +7 -5
  79. package/koni/api/nft/wasm_nft/utils.js +7 -5
  80. package/koni/api/staking/bonding/amplitude.d.ts +0 -1
  81. package/koni/api/staking/bonding/amplitude.js +15 -10
  82. package/koni/api/staking/bonding/astar.js +8 -6
  83. package/koni/api/staking/bonding/index.d.ts +4 -1
  84. package/koni/api/staking/bonding/index.js +23 -13
  85. package/koni/api/staking/bonding/paraChain.d.ts +3 -0
  86. package/koni/api/staking/bonding/paraChain.js +86 -5
  87. package/koni/api/staking/bonding/relayChain.d.ts +5 -1
  88. package/koni/api/staking/bonding/relayChain.js +121 -18
  89. package/koni/api/staking/bonding/utils.d.ts +3 -2
  90. package/koni/api/staking/bonding/utils.js +27 -9
  91. package/koni/api/tokens/wasm/index.js +5 -4
  92. package/koni/api/tokens/wasm/utils.d.ts +6 -0
  93. package/koni/api/tokens/wasm/utils.js +54 -0
  94. package/koni/api/xcm/polkadotXcm.js +2 -2
  95. package/koni/api/xcm/utils.d.ts +5 -6
  96. package/koni/api/xcm/utils.js +15 -10
  97. package/koni/api/xcm/xTokens.js +2 -2
  98. package/koni/api/xcm/xcmPallet.js +10 -9
  99. package/koni/background/cron.d.ts +6 -1
  100. package/koni/background/cron.js +172 -62
  101. package/koni/background/handlers/Extension.d.ts +9 -3
  102. package/koni/background/handlers/Extension.js +306 -126
  103. package/koni/background/handlers/State.d.ts +5 -6
  104. package/koni/background/handlers/State.js +51 -34
  105. package/koni/background/handlers/Tabs.js +50 -17
  106. package/koni/background/subscription.d.ts +2 -0
  107. package/koni/background/subscription.js +51 -29
  108. package/package.json +29 -14
  109. package/packageInfo.js +1 -1
  110. package/services/base/types.d.ts +34 -0
  111. package/services/base/types.js +15 -0
  112. package/services/chain-service/handler/SubstrateChainHandler.js +14 -9
  113. package/services/chain-service/helper/psp22_abi.json +1041 -881
  114. package/services/chain-service/helper/psp34_abi.json +2963 -1807
  115. package/services/chain-service/index.d.ts +5 -2
  116. package/services/chain-service/index.js +68 -45
  117. package/services/chain-service/types.d.ts +1 -0
  118. package/services/event-service/index.js +5 -1
  119. package/services/event-service/types.d.ts +5 -9
  120. package/services/event-service/types.js +4 -1
  121. package/services/history-service/index.d.ts +28 -7
  122. package/services/history-service/index.js +101 -50
  123. package/services/history-service/subsquid-multi-chain-history.js +16 -12
  124. package/services/keyring-service/index.d.ts +4 -2
  125. package/services/keyring-service/index.js +11 -13
  126. package/services/migration-service/scripts/MigrateImportedToken.js +2 -1
  127. package/services/price-service/coingecko.js +0 -1
  128. package/services/price-service/index.d.ts +22 -1
  129. package/services/price-service/index.js +71 -24
  130. package/services/request-service/handler/AuthRequestHandler.d.ts +3 -1
  131. package/services/request-service/handler/AuthRequestHandler.js +13 -7
  132. package/services/request-service/handler/EvmRequestHandler.js +8 -12
  133. package/services/request-service/index.d.ts +3 -1
  134. package/services/request-service/index.js +14 -5
  135. package/services/storage-service/DatabaseService.d.ts +2 -0
  136. package/services/storage-service/DatabaseService.js +66 -34
  137. package/services/storage-service/db-stores/Nft.d.ts +2 -2
  138. package/services/storage-service/db-stores/Nft.js +7 -14
  139. package/services/storage-service/db-stores/Transaction.d.ts +2 -0
  140. package/services/storage-service/db-stores/Transaction.js +6 -10
  141. package/services/transaction-service/event-parser/index.js +21 -49
  142. package/services/transaction-service/index.d.ts +2 -0
  143. package/services/transaction-service/index.js +86 -32
  144. package/services/transaction-service/types.d.ts +2 -0
  145. package/services/transaction-service/utils.js +10 -8
  146. package/utils/address.d.ts +3 -0
  147. package/utils/address.js +8 -1
  148. package/utils/index.d.ts +2 -2
  149. package/utils/index.js +7 -13
  150. package/utils/promise.d.ts +6 -0
  151. package/utils/promise.js +20 -0
@@ -4,7 +4,6 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.getAmplitudeBondingExtrinsic = getAmplitudeBondingExtrinsic;
7
- exports.getAmplitudeCancelWithdrawalExtrinsic = getAmplitudeCancelWithdrawalExtrinsic;
8
7
  exports.getAmplitudeClaimRewardExtrinsic = getAmplitudeClaimRewardExtrinsic;
9
8
  exports.getAmplitudeCollatorsInfo = getAmplitudeCollatorsInfo;
10
9
  exports.getAmplitudeNominatorMetadata = getAmplitudeNominatorMetadata;
@@ -52,24 +51,31 @@ async function getAmplitudeNominatorMetadata(chainInfo, address, substrateApi) {
52
51
  const nominationList = [];
53
52
  const unstakingList = [];
54
53
  const [_delegatorState, _unstakingInfo] = await Promise.all([chainApi.api.query.parachainStaking.delegatorState(address), chainApi.api.query.parachainStaking.unstaking(address)]);
54
+ const minDelegatorStake = chainApi.api.consts.parachainStaking.minDelegatorStake.toString();
55
55
  const delegatorState = _delegatorState.toPrimitive();
56
56
  const unstakingInfo = _unstakingInfo.toPrimitive();
57
+ console.log('unstakingInfo ampe', unstakingInfo, !!unstakingInfo);
57
58
  if (!delegatorState && !unstakingInfo) {
58
59
  return;
59
60
  }
60
61
  let activeStake = '0';
61
62
  if (delegatorState) {
62
63
  // delegatorState can be null while unstaking all
63
- const identityInfo = (await chainApi.api.query.identity.identityOf(delegatorState.owner)).toPrimitive();
64
- const identity = (0, _utils.parseIdentity)(identityInfo);
64
+ const identityInfo = chainApi.api.query.identity ? (await chainApi.api.query.identity.identityOf(delegatorState.owner)).toPrimitive() : undefined;
65
+ const identity = identityInfo ? (0, _utils.parseIdentity)(identityInfo) : undefined;
65
66
  activeStake = delegatorState.amount.toString();
67
+ const bnActiveStake = new _util.BN(activeStake);
68
+ let delegationStatus = _KoniTypes.StakingStatus.NOT_EARNING;
69
+ if (bnActiveStake.gt(_util.BN_ZERO) && bnActiveStake.gte(new _util.BN(minDelegatorStake))) {
70
+ delegationStatus = _KoniTypes.StakingStatus.EARNING_REWARD;
71
+ }
66
72
  nominationList.push({
67
- status: _KoniTypes.StakingStatus.NOT_EARNING,
73
+ status: delegationStatus,
68
74
  chain,
69
75
  validatorAddress: delegatorState.owner,
70
76
  activeStake: delegatorState.amount.toString(),
71
77
  validatorMinStake: '0',
72
- hasUnstaking: !!unstakingInfo,
78
+ hasUnstaking: !!unstakingInfo && Object.values(unstakingInfo).length > 0,
73
79
  validatorIdentity: identity
74
80
  });
75
81
  }
@@ -97,9 +103,11 @@ async function getAmplitudeNominatorMetadata(chainInfo, address, substrateApi) {
97
103
  if (nominationList.length === 0 && unstakingList.length === 0) {
98
104
  return;
99
105
  }
106
+ const stakingStatus = (0, _utils.getStakingStatusByNominations)(new _util.BN(activeStake), nominationList);
100
107
  return {
101
108
  chain,
102
109
  type: _KoniTypes.StakingType.NOMINATED,
110
+ status: stakingStatus,
103
111
  address: address,
104
112
  activeStake: activeStake,
105
113
  nominations: nominationList,
@@ -180,8 +188,4 @@ async function getAmplitudeWithdrawalExtrinsic(substrateApi, address) {
180
188
  async function getAmplitudeClaimRewardExtrinsic(substrateApi) {
181
189
  const chainApi = await substrateApi.isReady;
182
190
  return chainApi.api.tx.utility.batch([chainApi.api.tx.parachainStaking.incrementDelegatorRewards(), chainApi.api.tx.parachainStaking.claimRewards()]);
183
- }
184
- async function getAmplitudeCancelWithdrawalExtrinsic(substrateApi) {
185
- const chainApi = await substrateApi.isReady;
186
- return chainApi.api.tx.parachainStaking.cancelLeaveCandidates();
187
191
  }
@@ -12,8 +12,9 @@ exports.getAstarStakingMetadata = getAstarStakingMetadata;
12
12
  exports.getAstarUnbondingExtrinsic = getAstarUnbondingExtrinsic;
13
13
  exports.getAstarWithdrawalExtrinsic = getAstarWithdrawalExtrinsic;
14
14
  var _KoniTypes = require("@subwallet/extension-base/background/KoniTypes");
15
+ var _utils = require("@subwallet/extension-base/koni/api/staking/bonding/utils");
15
16
  var _constants = require("@subwallet/extension-base/services/chain-service/constants");
16
- var _utils = require("@subwallet/extension-base/utils");
17
+ var _utils2 = require("@subwallet/extension-base/utils");
17
18
  var _crossFetch = _interopRequireDefault(require("cross-fetch"));
18
19
  var _util = require("@polkadot/util");
19
20
  var _utilCrypto = require("@polkadot/util-crypto");
@@ -73,6 +74,7 @@ async function getAstarNominatorMetadata(chainInfo, address, substrateApi) {
73
74
  const [_ledger, _era, _stakerInfo] = await Promise.all([chainApi.api.query.dappsStaking.ledger(address), chainApi.api.query.dappsStaking.currentEra(), chainApi.api.query.dappsStaking.generalStakerInfo.entries(address)]);
74
75
  const ledger = _ledger.toPrimitive();
75
76
  const currentEra = _era.toString();
77
+ const minDelegatorStake = chainApi.api.consts.dappsStaking.minimumStakingAmount.toString();
76
78
  let bnTotalActiveStake = _util.BN_ZERO;
77
79
  if (_stakerInfo.length > 0) {
78
80
  const dAppInfoMap = {};
@@ -89,13 +91,13 @@ async function getAstarNominatorMetadata(chainInfo, address, substrateApi) {
89
91
  const currentStake = stakeList.slice(-1)[0].staked.toString() || '0';
90
92
  const bnCurrentStake = new _util.BN(currentStake);
91
93
  if (bnCurrentStake.gt(_util.BN_ZERO)) {
94
+ const dappStakingStatus = bnCurrentStake.gt(_util.BN_ZERO) && bnCurrentStake.gte(new _util.BN(minDelegatorStake)) ? _KoniTypes.StakingStatus.EARNING_REWARD : _KoniTypes.StakingStatus.NOT_EARNING;
92
95
  bnTotalActiveStake = bnTotalActiveStake.add(bnCurrentStake);
93
96
  const dappInfo = dAppInfoMap[dappAddress];
94
97
  nominationList.push({
95
- status: _KoniTypes.StakingStatus.NOT_EARNING,
96
- // TODO
98
+ status: dappStakingStatus,
97
99
  chain,
98
- validatorAddress: dappAddress,
100
+ validatorAddress: dappAddress.toLowerCase(),
99
101
  activeStake: currentStake,
100
102
  validatorMinStake: '0',
101
103
  validatorIdentity: dappInfo === null || dappInfo === void 0 ? void 0 : dappInfo.name,
@@ -122,6 +124,7 @@ async function getAstarNominatorMetadata(chainInfo, address, substrateApi) {
122
124
  if (nominationList.length === 0 && unstakingList.length === 0) {
123
125
  return;
124
126
  }
127
+ const stakingStatus = (0, _utils.getStakingStatusByNominations)(bnTotalActiveStake, nominationList);
125
128
  return {
126
129
  chain,
127
130
  type: _KoniTypes.StakingType.NOMINATED,
@@ -129,15 +132,14 @@ async function getAstarNominatorMetadata(chainInfo, address, substrateApi) {
129
132
  activeStake: bnTotalActiveStake.toString(),
130
133
  nominations: nominationList,
131
134
  unstakings: unstakingList,
132
- status: _KoniTypes.StakingStatus.NOT_EARNING // TODO
135
+ status: stakingStatus
133
136
  };
134
137
  }
135
-
136
138
  async function getAstarDappsInfo(networkKey, substrateApi) {
137
139
  const chainApi = await substrateApi.isReady;
138
140
  const rawMaxStakerPerContract = chainApi.api.consts.dappsStaking.maxNumberOfStakersPerContract.toHuman();
139
141
  const allDappsInfo = [];
140
- const maxStakerPerContract = (0, _utils.parseRawNumber)(rawMaxStakerPerContract);
142
+ const maxStakerPerContract = (0, _utils2.parseRawNumber)(rawMaxStakerPerContract);
141
143
  const allDappsReq = new Promise(function (resolve) {
142
144
  (0, _crossFetch.default)(`https://api.astar.network/api/v1/${networkKey}/dapps-staking/dapps`, {
143
145
  method: 'GET'
@@ -146,12 +148,12 @@ async function getAstarDappsInfo(networkKey, substrateApi) {
146
148
  }).catch(console.error);
147
149
  });
148
150
  const [_era, _allDapps] = await Promise.all([chainApi.api.query.dappsStaking.currentEra(), allDappsReq]);
149
- const era = (0, _utils.parseRawNumber)(_era.toHuman());
151
+ const era = (0, _utils2.parseRawNumber)(_era.toHuman());
150
152
  const allDapps = _allDapps;
151
153
  await Promise.all(allDapps.map(async dapp => {
152
154
  const dappName = dapp.name;
153
155
  const dappAddress = dapp.address;
154
- const dappIcon = (0, _utils.isUrl)(dapp.iconUrl) ? dapp.iconUrl : undefined;
156
+ const dappIcon = (0, _utils2.isUrl)(dapp.iconUrl) ? dapp.iconUrl : undefined;
155
157
  const contractParam = (0, _utilCrypto.isEthereumAddress)(dappAddress) ? {
156
158
  Evm: dappAddress
157
159
  } : {
@@ -170,7 +172,7 @@ async function getAstarDappsInfo(networkKey, substrateApi) {
170
172
  allDappsInfo.push({
171
173
  commission: 0,
172
174
  expectedReturn: 0,
173
- address: dappAddress,
175
+ address: dappAddress.toLowerCase(),
174
176
  totalStake: totalStake,
175
177
  ownStake: '0',
176
178
  otherStake: totalStake.toString(),
@@ -213,7 +215,7 @@ async function getAstarWithdrawalExtrinsic(substrateApi) {
213
215
  async function getAstarClaimRewardExtrinsic(substrateApi, address) {
214
216
  const apiPromise = await substrateApi.isReady;
215
217
  const [_stakedDapps, _currentEra] = await Promise.all([apiPromise.api.query.dappsStaking.generalStakerInfo.entries(address), apiPromise.api.query.dappsStaking.currentEra()]);
216
- const currentEra = (0, _utils.parseRawNumber)(_currentEra.toHuman());
218
+ const currentEra = (0, _utils2.parseRawNumber)(_currentEra.toHuman());
217
219
  const transactions = [];
218
220
  for (const item of _stakedDapps) {
219
221
  const data = item[0].toHuman();
@@ -230,12 +232,12 @@ async function getAstarClaimRewardExtrinsic(substrateApi, address) {
230
232
  staked
231
233
  } = stakes[i];
232
234
  const bnStaked = new _util.BN(staked.replaceAll(',', ''));
233
- const parsedEra = (0, _utils.parseRawNumber)(era);
235
+ const parsedEra = (0, _utils2.parseRawNumber)(era);
234
236
  if (bnStaked.eq(new _util.BN(0))) {
235
237
  continue;
236
238
  }
237
239
  const nextEraData = (_stakes = stakes[i + 1]) !== null && _stakes !== void 0 ? _stakes : null;
238
- const nextEra = nextEraData && (0, _utils.parseRawNumber)(nextEraData.era);
240
+ const nextEra = nextEraData && (0, _utils2.parseRawNumber)(nextEraData.era);
239
241
  const isLastEra = i === stakes.length - 1;
240
242
  const eraToClaim = isLastEra ? currentEra - parsedEra : nextEra - parsedEra;
241
243
  numberOfUnclaimedEra += eraToClaim;
@@ -12,6 +12,8 @@ exports.getNominatorMetadata = getNominatorMetadata;
12
12
  exports.getUnbondingExtrinsic = getUnbondingExtrinsic;
13
13
  exports.getValidatorsInfo = getValidatorsInfo;
14
14
  exports.getWithdrawalExtrinsic = getWithdrawalExtrinsic;
15
+ exports.validateBondingCondition = validateBondingCondition;
16
+ exports.validateUnbondingCondition = validateUnbondingCondition;
15
17
  var _KoniTypes = require("@subwallet/extension-base/background/KoniTypes");
16
18
  var _amplitude = require("@subwallet/extension-base/koni/api/staking/bonding/amplitude");
17
19
  var _astar = require("@subwallet/extension-base/koni/api/staking/bonding/astar");
@@ -23,15 +25,27 @@ var _constants = require("@subwallet/extension-base/services/chain-service/const
23
25
 
24
26
  // all addresses must be converted to its chain format
25
27
 
26
- async function getChainStakingMetadata(chain, substrateApi) {
27
- if (_constants._STAKING_CHAIN_GROUP.astar.includes(chain)) {
28
- return (0, _astar.getAstarStakingMetadata)(chain, substrateApi);
29
- } else if (_constants._STAKING_CHAIN_GROUP.para.includes(chain)) {
30
- return (0, _paraChain.getParaChainStakingMetadata)(chain, substrateApi);
31
- } else if (_constants._STAKING_CHAIN_GROUP.amplitude.includes(chain)) {
32
- return (0, _amplitude.getAmplitudeStakingMetadata)(chain, substrateApi);
28
+ function validateUnbondingCondition(nominatorMetadata, amount, chain, chainStakingMetadata, selectedValidator) {
29
+ if (_constants._STAKING_CHAIN_GROUP.relay.includes(chain)) {
30
+ return (0, _relayChain.validateRelayUnbondingCondition)(amount, chainStakingMetadata, nominatorMetadata);
31
+ }
32
+ return (0, _paraChain.validateParaChainUnbondingCondition)(amount, nominatorMetadata, chainStakingMetadata, selectedValidator);
33
+ }
34
+ function validateBondingCondition(chainInfo, amount, selectedValidators, address, chainStakingMetadata, nominatorMetadata) {
35
+ if (_constants._STAKING_CHAIN_GROUP.relay.includes(chainInfo.slug)) {
36
+ return (0, _relayChain.validateRelayBondingCondition)(chainInfo, amount, selectedValidators, address, chainStakingMetadata, nominatorMetadata);
33
37
  }
34
- return (0, _relayChain.getRelayChainStakingMetadata)(chain, substrateApi);
38
+ return (0, _paraChain.validateParaChainBondingCondition)(chainInfo, amount, selectedValidators, address, chainStakingMetadata, nominatorMetadata);
39
+ }
40
+ async function getChainStakingMetadata(chainInfo, substrateApi) {
41
+ if (_constants._STAKING_CHAIN_GROUP.astar.includes(chainInfo.slug)) {
42
+ return (0, _astar.getAstarStakingMetadata)(chainInfo.slug, substrateApi);
43
+ } else if (_constants._STAKING_CHAIN_GROUP.para.includes(chainInfo.slug)) {
44
+ return (0, _paraChain.getParaChainStakingMetadata)(chainInfo.slug, substrateApi);
45
+ } else if (_constants._STAKING_CHAIN_GROUP.amplitude.includes(chainInfo.slug)) {
46
+ return (0, _amplitude.getAmplitudeStakingMetadata)(chainInfo.slug, substrateApi);
47
+ }
48
+ return (0, _relayChain.getRelayChainStakingMetadata)(chainInfo, substrateApi);
35
49
  }
36
50
  async function getNominatorMetadata(chainInfo, address, substrateApi) {
37
51
  if (_constants._STAKING_CHAIN_GROUP.astar.includes(chainInfo.slug)) {
@@ -101,8 +115,6 @@ async function getClaimRewardExtrinsic(substrateApi, chain, address, stakingType
101
115
  async function getCancelWithdrawalExtrinsic(substrateApi, chain, selectedUnstaking) {
102
116
  if (_constants._STAKING_CHAIN_GROUP.para.includes(chain)) {
103
117
  return (0, _paraChain.getParaCancelWithdrawalExtrinsic)(substrateApi, selectedUnstaking);
104
- } else if (_constants._STAKING_CHAIN_GROUP.amplitude.includes(chain)) {
105
- return (0, _amplitude.getAmplitudeCancelWithdrawalExtrinsic)(substrateApi);
106
118
  }
107
119
  return (0, _relayChain.getRelayCancelWithdrawalExtrinsic)(substrateApi, selectedUnstaking);
108
120
  }
@@ -12,6 +12,9 @@ exports.getParaWithdrawalExtrinsic = getParaWithdrawalExtrinsic;
12
12
  exports.getParachainCollatorsInfo = getParachainCollatorsInfo;
13
13
  exports.getTuringCancelCompoundingExtrinsic = getTuringCancelCompoundingExtrinsic;
14
14
  exports.getTuringCompoundExtrinsic = getTuringCompoundExtrinsic;
15
+ exports.validateParaChainBondingCondition = validateParaChainBondingCondition;
16
+ exports.validateParaChainUnbondingCondition = validateParaChainUnbondingCondition;
17
+ var _TransactionError = require("@subwallet/extension-base/background/errors/TransactionError");
15
18
  var _KoniTypes = require("@subwallet/extension-base/background/KoniTypes");
16
19
  var _utils = require("@subwallet/extension-base/koni/api/staking/bonding/utils");
17
20
  var _constants = require("@subwallet/extension-base/services/chain-service/constants");
@@ -22,6 +25,78 @@ var _utilCrypto = require("@polkadot/util-crypto");
22
25
  // Copyright 2019-2022 @subwallet/extension-koni authors & contributors
23
26
  // SPDX-License-Identifier: Apache-2.0
24
27
 
28
+ function validateParaChainUnbondingCondition(amount, nominatorMetadata, chainStakingMetadata, selectedCollator) {
29
+ const errors = [];
30
+ let targetNomination;
31
+ for (const nomination of nominatorMetadata.nominations) {
32
+ if ((0, _utils3.isSameAddress)(nomination.validatorAddress, selectedCollator)) {
33
+ targetNomination = nomination;
34
+ break;
35
+ }
36
+ }
37
+ if (!targetNomination) {
38
+ errors.push(new _TransactionError.TransactionError(_KoniTypes.BasicTxErrorType.INTERNAL_ERROR));
39
+ return errors;
40
+ }
41
+ const bnActiveStake = new _util.BN(targetNomination.activeStake);
42
+ const bnRemainingStake = bnActiveStake.sub(new _util.BN(amount));
43
+ const bnChainMinStake = new _util.BN(chainStakingMetadata.minStake || '0');
44
+ const bnCollatorMinStake = new _util.BN(targetNomination.validatorMinStake || '0');
45
+ const bnMinStake = bnCollatorMinStake > bnChainMinStake ? bnCollatorMinStake : bnChainMinStake;
46
+ if (targetNomination.hasUnstaking) {
47
+ errors.push(new _TransactionError.TransactionError(_KoniTypes.StakingTxErrorType.EXIST_UNSTAKING_REQUEST));
48
+ }
49
+ if (!(bnRemainingStake.isZero() || bnRemainingStake.gte(bnMinStake))) {
50
+ errors.push(new _TransactionError.TransactionError(_KoniTypes.StakingTxErrorType.INVALID_ACTIVE_STAKE));
51
+ }
52
+ return errors;
53
+ }
54
+ function validateParaChainBondingCondition(chainInfo, amount, selectedCollators, address, chainStakingMetadata, nominatorMetadata) {
55
+ const errors = [];
56
+ const selectedCollator = selectedCollators[0];
57
+ let bnTotalStake = new _util.BN(amount);
58
+ const bnChainMinStake = new _util.BN(chainStakingMetadata.minStake || '0');
59
+ const bnCollatorMinStake = new _util.BN(selectedCollator.minBond || '0');
60
+ const bnMinStake = bnCollatorMinStake > bnChainMinStake ? bnCollatorMinStake : bnChainMinStake;
61
+ if (!nominatorMetadata) {
62
+ if (!bnTotalStake.gte(bnMinStake)) {
63
+ errors.push(new _TransactionError.TransactionError(_KoniTypes.StakingTxErrorType.NOT_ENOUGH_MIN_STAKE));
64
+ }
65
+ return errors;
66
+ }
67
+ const {
68
+ bondedValidators
69
+ } = (0, _utils.getBondedValidators)(nominatorMetadata.nominations);
70
+ const parsedSelectedCollatorAddress = (0, _utils3.reformatAddress)(selectedCollator.address, 0);
71
+ if (!bondedValidators.includes(parsedSelectedCollatorAddress)) {
72
+ // new delegation
73
+ if (!bnTotalStake.gte(bnMinStake)) {
74
+ errors.push(new _TransactionError.TransactionError(_KoniTypes.StakingTxErrorType.NOT_ENOUGH_MIN_STAKE));
75
+ }
76
+ const delegationCount = nominatorMetadata.nominations.length + 1;
77
+ if (delegationCount > chainStakingMetadata.maxValidatorPerNominator) {
78
+ errors.push(new _TransactionError.TransactionError(_KoniTypes.StakingTxErrorType.EXCEED_MAX_NOMINATIONS));
79
+ }
80
+ } else {
81
+ let currentDelegationAmount = '0';
82
+ let hasUnstaking = false;
83
+ for (const delegation of nominatorMetadata.nominations) {
84
+ if ((0, _utils3.reformatAddress)(delegation.validatorAddress, 0) === parsedSelectedCollatorAddress) {
85
+ currentDelegationAmount = delegation.activeStake;
86
+ hasUnstaking = !!delegation.hasUnstaking && delegation.hasUnstaking;
87
+ break;
88
+ }
89
+ }
90
+ bnTotalStake = bnTotalStake.add(new _util.BN(currentDelegationAmount));
91
+ if (!bnTotalStake.gte(bnMinStake)) {
92
+ errors.push(new _TransactionError.TransactionError(_KoniTypes.StakingTxErrorType.NOT_ENOUGH_MIN_STAKE));
93
+ }
94
+ if (hasUnstaking) {
95
+ errors.push(new _TransactionError.TransactionError(_KoniTypes.StakingTxErrorType.EXIST_UNSTAKING_REQUEST));
96
+ }
97
+ }
98
+ return errors;
99
+ }
25
100
  async function getParaChainStakingMetadata(chain, substrateApi) {
26
101
  const chainApi = await substrateApi.isReady;
27
102
  const _round = (await chainApi.api.query.parachainStaking.round()).toHuman();
@@ -75,13 +150,16 @@ async function getParaChainNominatorMetadata(chainInfo, address, substrateApi) {
75
150
  }
76
151
  let bnTotalActiveStake = _util.BN_ZERO;
77
152
  await Promise.all(delegatorState.delegations.map(async delegation => {
78
- const [_delegationScheduledRequests, _identity, _roundInfo] = await Promise.all([chainApi.api.query.parachainStaking.delegationScheduledRequests(delegation.owner), chainApi.api.query.identity.identityOf(delegation.owner), chainApi.api.query.parachainStaking.round()]);
153
+ const [_delegationScheduledRequests, _identity, _roundInfo, _collatorInfo] = await Promise.all([chainApi.api.query.parachainStaking.delegationScheduledRequests(delegation.owner), chainApi.api.query.identity.identityOf(delegation.owner), chainApi.api.query.parachainStaking.round(), chainApi.api.query.parachainStaking.candidateInfo(delegation.owner)]);
154
+ const rawCollatorInfo = _collatorInfo.toHuman();
155
+ const minDelegation = (rawCollatorInfo === null || rawCollatorInfo === void 0 ? void 0 : rawCollatorInfo.lowestTopDelegationAmount).replaceAll(',', '');
79
156
  const identityInfo = _identity.toHuman();
80
157
  const roundInfo = _roundInfo.toPrimitive();
81
158
  const delegationScheduledRequests = _delegationScheduledRequests.toPrimitive();
82
159
  const currentRound = roundInfo.current;
83
160
  const identity = (0, _utils.parseIdentity)(identityInfo);
84
161
  let hasUnstaking = false;
162
+ let delegationStatus = _KoniTypes.StakingStatus.NOT_EARNING;
85
163
 
86
164
  // parse unstaking info
87
165
  if (delegationScheduledRequests) {
@@ -108,10 +186,13 @@ async function getParaChainNominatorMetadata(chainInfo, address, substrateApi) {
108
186
  const bnStake = new _util.BN(delegation.amount);
109
187
  const bnUnstakeBalance = unstakingMap[delegation.owner] ? new _util.BN(unstakingMap[delegation.owner].claimable) : _util.BN_ZERO;
110
188
  const bnActiveStake = bnStake.sub(bnUnstakeBalance);
189
+ if (bnActiveStake.gt(_util.BN_ZERO) && bnActiveStake.gte(new _util.BN(minDelegation))) {
190
+ delegationStatus = _KoniTypes.StakingStatus.EARNING_REWARD;
191
+ }
111
192
  bnTotalActiveStake = bnTotalActiveStake.add(bnActiveStake);
112
193
  nominationList.push({
113
194
  chain,
114
- status: _KoniTypes.StakingStatus.NOT_EARNING,
195
+ status: delegationStatus,
115
196
  validatorAddress: delegation.owner,
116
197
  validatorIdentity: identity,
117
198
  activeStake: bnActiveStake.toString(),
@@ -123,9 +204,11 @@ async function getParaChainNominatorMetadata(chainInfo, address, substrateApi) {
123
204
  const collatorInfo = _collatorInfo.toPrimitive();
124
205
  nomination.validatorMinStake = collatorInfo.lowestTopDelegationAmount.toString();
125
206
  }));
207
+ const stakingStatus = (0, _utils.getStakingStatusByNominations)(bnTotalActiveStake, nominationList);
126
208
  return {
127
209
  chain,
128
210
  type: _KoniTypes.StakingType.NOMINATED,
211
+ status: stakingStatus,
129
212
  address: address,
130
213
  activeStake: bnTotalActiveStake.toString(),
131
214
  nominations: nominationList,
@@ -16,6 +16,10 @@ exports.getRelayPoolsInfo = getRelayPoolsInfo;
16
16
  exports.getRelayUnbondingExtrinsic = getRelayUnbondingExtrinsic;
17
17
  exports.getRelayValidatorsInfo = getRelayValidatorsInfo;
18
18
  exports.getRelayWithdrawalExtrinsic = getRelayWithdrawalExtrinsic;
19
+ exports.validatePoolBondingCondition = validatePoolBondingCondition;
20
+ exports.validateRelayBondingCondition = validateRelayBondingCondition;
21
+ exports.validateRelayUnbondingCondition = validateRelayUnbondingCondition;
22
+ var _TransactionError = require("@subwallet/extension-base/background/errors/TransactionError");
19
23
  var _KoniTypes = require("@subwallet/extension-base/background/KoniTypes");
20
24
  var _utils = require("@subwallet/extension-base/koni/api/staking/bonding/utils");
21
25
  var _constants = require("@subwallet/extension-base/services/chain-service/constants");
@@ -26,16 +30,94 @@ var _utilCrypto = require("@polkadot/util-crypto");
26
30
  // Copyright 2019-2022 @subwallet/extension-koni authors & contributors
27
31
  // SPDX-License-Identifier: Apache-2.0
28
32
 
29
- async function getRelayChainStakingMetadata(chain, substrateApi) {
30
- var _chainApi$api$query$a, _chainApi$api$query, _chainApi$api$query$n;
33
+ function validateRelayUnbondingCondition(amount, chainStakingMetadata, nominatorMetadata) {
34
+ const errors = [];
35
+ const bnActiveStake = new _util.BN(nominatorMetadata.activeStake);
36
+ const bnRemainingStake = bnActiveStake.sub(new _util.BN(amount));
37
+ const minStake = new _util.BN(chainStakingMetadata.minPoolBonding || '0');
38
+ if (!(bnRemainingStake.isZero() || bnRemainingStake.gte(minStake))) {
39
+ errors.push(new _TransactionError.TransactionError(_KoniTypes.StakingTxErrorType.INVALID_ACTIVE_STAKE));
40
+ }
41
+ if (nominatorMetadata.unstakings.length > chainStakingMetadata.maxWithdrawalRequestPerValidator) {
42
+ errors.push(new _TransactionError.TransactionError(_KoniTypes.StakingTxErrorType.EXCEED_MAX_UNSTAKING));
43
+ }
44
+ return errors;
45
+ }
46
+ function validatePoolBondingCondition(chainInfo, amount, selectedPool, address, chainStakingMetadata, nominatorMetadata) {
47
+ // cannot stake when unstake all
48
+ // amount >= min stake
49
+ const errors = [];
50
+ let bnTotalStake = new _util.BN(amount);
51
+ const bnMinStake = new _util.BN(chainStakingMetadata.minPoolBonding || '0');
52
+ if (selectedPool.state !== 'Open') {
53
+ errors.push(new _TransactionError.TransactionError(_KoniTypes.StakingTxErrorType.INACTIVE_NOMINATION_POOL));
54
+ }
55
+ if (nominatorMetadata) {
56
+ const bnCurrentActiveStake = new _util.BN(nominatorMetadata.activeStake);
57
+ bnTotalStake = bnTotalStake.add(bnCurrentActiveStake);
58
+ if (!bnCurrentActiveStake.gt(_util.BN_ZERO)) {
59
+ errors.push(new _TransactionError.TransactionError(_KoniTypes.StakingTxErrorType.EXIST_UNSTAKING_REQUEST));
60
+ }
61
+ }
62
+ if (!bnTotalStake.gte(bnMinStake)) {
63
+ errors.push(new _TransactionError.TransactionError(_KoniTypes.StakingTxErrorType.NOT_ENOUGH_MIN_STAKE));
64
+ }
65
+ return errors;
66
+ }
67
+ function validateRelayBondingCondition(chainInfo, amount, selectedValidators, address, chainStakingMetadata, nominatorMetadata) {
68
+ const errors = [];
69
+ let bnTotalStake = new _util.BN(amount);
70
+ const bnMinStake = new _util.BN(chainStakingMetadata.minStake);
71
+ if (!nominatorMetadata) {
72
+ if (!bnTotalStake.gte(bnMinStake)) {
73
+ errors.push(new _TransactionError.TransactionError(_KoniTypes.StakingTxErrorType.NOT_ENOUGH_MIN_STAKE));
74
+ }
75
+ if (selectedValidators.length > chainStakingMetadata.maxValidatorPerNominator) {
76
+ errors.push(new _TransactionError.TransactionError(_KoniTypes.StakingTxErrorType.EXCEED_MAX_NOMINATIONS));
77
+ }
78
+ return errors;
79
+ }
80
+ const bnCurrentActiveStake = new _util.BN(nominatorMetadata.activeStake);
81
+ bnTotalStake = bnTotalStake.add(bnCurrentActiveStake);
82
+ if (!bnTotalStake.gte(bnMinStake)) {
83
+ errors.push(new _TransactionError.TransactionError(_KoniTypes.StakingTxErrorType.NOT_ENOUGH_MIN_STAKE));
84
+ }
85
+ if (selectedValidators.length > chainStakingMetadata.maxValidatorPerNominator) {
86
+ errors.push(new _TransactionError.TransactionError(_KoniTypes.StakingTxErrorType.EXCEED_MAX_NOMINATIONS));
87
+ }
88
+ return errors;
89
+ }
90
+ async function getRelayChainStakingMetadata(chainInfo, substrateApi) {
91
+ var _chainApi$api$query$a, _chainApi$api$query, _chainApi$api$query$s, _chainApi$api$query2, _chainApi$api$query2$, _chainApi$api$query3, _chainApi$api$query3$;
92
+ const chain = chainInfo.slug;
93
+ const {
94
+ decimals
95
+ } = (0, _utils2._getChainNativeTokenBasicInfo)(chainInfo);
31
96
  const chainApi = await substrateApi.isReady;
32
97
  const _era = await chainApi.api.query.staking.currentEra();
33
98
  const currentEra = _era.toString();
34
99
  const maxNominations = chainApi.api.consts.staking.maxNominations.toString();
35
100
  const maxUnlockingChunks = chainApi.api.consts.staking.maxUnlockingChunks.toString();
36
101
  const unlockingEras = chainApi.api.consts.staking.bondingDuration.toString();
37
- const [_totalEraStake, _totalIssuance, _auctionCounter, _minimumActiveStake, _minPoolJoin] = await Promise.all([chainApi.api.query.staking.erasTotalStake(parseInt(currentEra)), chainApi.api.query.balances.totalIssuance(), (_chainApi$api$query$a = chainApi.api.query.auctions) === null || _chainApi$api$query$a === void 0 ? void 0 : _chainApi$api$query$a.auctionCounter(), chainApi.api.query.staking.minimumActiveStake(), (_chainApi$api$query = chainApi.api.query) === null || _chainApi$api$query === void 0 ? void 0 : (_chainApi$api$query$n = _chainApi$api$query.nominationPools) === null || _chainApi$api$query$n === void 0 ? void 0 : _chainApi$api$query$n.minJoinBond()]);
38
- const minStake = _minimumActiveStake.toString();
102
+ const [_totalEraStake, _totalIssuance, _auctionCounter, _minimumActiveStake, _minNominatorBond, _minPoolJoin, _eraStakers] = await Promise.all([chainApi.api.query.staking.erasTotalStake(parseInt(currentEra)), chainApi.api.query.balances.totalIssuance(), (_chainApi$api$query$a = chainApi.api.query.auctions) === null || _chainApi$api$query$a === void 0 ? void 0 : _chainApi$api$query$a.auctionCounter(), ((_chainApi$api$query = chainApi.api.query) === null || _chainApi$api$query === void 0 ? void 0 : (_chainApi$api$query$s = _chainApi$api$query.staking) === null || _chainApi$api$query$s === void 0 ? void 0 : _chainApi$api$query$s.minimumActiveStake) && ((_chainApi$api$query2 = chainApi.api.query) === null || _chainApi$api$query2 === void 0 ? void 0 : (_chainApi$api$query2$ = _chainApi$api$query2.staking) === null || _chainApi$api$query2$ === void 0 ? void 0 : _chainApi$api$query2$.minimumActiveStake()), chainApi.api.query.staking.minNominatorBond(), (_chainApi$api$query3 = chainApi.api.query) === null || _chainApi$api$query3 === void 0 ? void 0 : (_chainApi$api$query3$ = _chainApi$api$query3.nominationPools) === null || _chainApi$api$query3$ === void 0 ? void 0 : _chainApi$api$query3$.minJoinBond(), chainApi.api.query.staking.erasStakers.entries(parseInt(currentEra))]);
103
+ const eraStakers = _eraStakers;
104
+ const nominatorList = [];
105
+ for (const item of eraStakers) {
106
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access
107
+ const rawValidatorStat = item[1].toHuman();
108
+ const eraNominators = rawValidatorStat.others;
109
+ for (const nominator of eraNominators) {
110
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access
111
+ if (!nominatorList.includes(nominator.who)) {
112
+ nominatorList.push(nominator.who);
113
+ }
114
+ }
115
+ }
116
+ const minActiveStake = (_minimumActiveStake === null || _minimumActiveStake === void 0 ? void 0 : _minimumActiveStake.toString()) || '0';
117
+ const minNominatorBond = _minNominatorBond.toString();
118
+ const bnMinActiveStake = new _util.BN(minActiveStake);
119
+ const bnMinNominatorBond = new _util.BN(minNominatorBond);
120
+ const minStake = bnMinActiveStake.gt(bnMinNominatorBond) ? bnMinActiveStake : bnMinNominatorBond;
39
121
  const minPoolJoin = (_minPoolJoin === null || _minPoolJoin === void 0 ? void 0 : _minPoolJoin.toString()) || undefined;
40
122
  const rawTotalEraStake = _totalEraStake.toString();
41
123
  const rawTotalIssuance = _totalIssuance.toString();
@@ -53,21 +135,30 @@ async function getRelayChainStakingMetadata(chain, substrateApi) {
53
135
  expectedReturn,
54
136
  // in %, annually
55
137
  inflation,
56
- minStake,
138
+ minStake: minStake.toString(),
139
+ minPoolBonding: (10 ** decimals).toString(),
140
+ // default is 1
57
141
  maxValidatorPerNominator: parseInt(maxNominations),
58
142
  maxWithdrawalRequestPerValidator: parseInt(maxUnlockingChunks),
59
143
  allowCancelUnstaking: true,
60
144
  unstakingPeriod: unlockingPeriod,
61
- minJoinNominationPool: minPoolJoin
145
+ minJoinNominationPool: minPoolJoin,
146
+ nominatorCount: nominatorList.length
62
147
  };
63
148
  }
64
149
  async function getRelayChainNominatorMetadata(chainInfo, address, substrateApi) {
150
+ var _chainApi$api$query4, _chainApi$api$query4$, _chainApi$api$query5, _chainApi$api$query5$, _chainApi$api$query6, _chainApi$api$query6$, _chainApi$api$query7, _chainApi$api$query7$, _chainApi$api$query8, _chainApi$api$query8$, _chainApi$api$query9, _chainApi$api$query9$, _chainApi$api$query10, _chainApi$api$query11;
65
151
  if ((0, _utilCrypto.isEthereumAddress)(address)) {
66
152
  return;
67
153
  }
68
154
  const chain = chainInfo.slug;
69
155
  const chainApi = await substrateApi.isReady;
70
- const [_ledger, _nominations, _currentEra, _bonded] = await Promise.all([chainApi.api.query.staking.ledger(address), chainApi.api.query.staking.nominators(address), chainApi.api.query.staking.currentEra(), chainApi.api.query.staking.bonded(address)]);
156
+ const [_ledger, _nominations, _currentEra, _bonded, _minimumActiveStake, _minNominatorBond] = await Promise.all([(_chainApi$api$query4 = chainApi.api.query) === null || _chainApi$api$query4 === void 0 ? void 0 : (_chainApi$api$query4$ = _chainApi$api$query4.staking) === null || _chainApi$api$query4$ === void 0 ? void 0 : _chainApi$api$query4$.ledger(address), (_chainApi$api$query5 = chainApi.api.query) === null || _chainApi$api$query5 === void 0 ? void 0 : (_chainApi$api$query5$ = _chainApi$api$query5.staking) === null || _chainApi$api$query5$ === void 0 ? void 0 : _chainApi$api$query5$.nominators(address), (_chainApi$api$query6 = chainApi.api.query) === null || _chainApi$api$query6 === void 0 ? void 0 : (_chainApi$api$query6$ = _chainApi$api$query6.staking) === null || _chainApi$api$query6$ === void 0 ? void 0 : _chainApi$api$query6$.currentEra(), (_chainApi$api$query7 = chainApi.api.query) === null || _chainApi$api$query7 === void 0 ? void 0 : (_chainApi$api$query7$ = _chainApi$api$query7.staking) === null || _chainApi$api$query7$ === void 0 ? void 0 : _chainApi$api$query7$.bonded(address), ((_chainApi$api$query8 = chainApi.api.query) === null || _chainApi$api$query8 === void 0 ? void 0 : (_chainApi$api$query8$ = _chainApi$api$query8.staking) === null || _chainApi$api$query8$ === void 0 ? void 0 : _chainApi$api$query8$.minimumActiveStake) && ((_chainApi$api$query9 = chainApi.api.query) === null || _chainApi$api$query9 === void 0 ? void 0 : (_chainApi$api$query9$ = _chainApi$api$query9.staking) === null || _chainApi$api$query9$ === void 0 ? void 0 : _chainApi$api$query9$.minimumActiveStake()), (_chainApi$api$query10 = chainApi.api.query) === null || _chainApi$api$query10 === void 0 ? void 0 : (_chainApi$api$query11 = _chainApi$api$query10.staking) === null || _chainApi$api$query11 === void 0 ? void 0 : _chainApi$api$query11.minNominatorBond()]);
157
+ const minActiveStake = (_minimumActiveStake === null || _minimumActiveStake === void 0 ? void 0 : _minimumActiveStake.toString()) || '0';
158
+ const minNominatorBond = _minNominatorBond.toString();
159
+ const bnMinActiveStake = new _util.BN(minActiveStake);
160
+ const bnMinNominatorBond = new _util.BN(minNominatorBond);
161
+ const minStake = bnMinActiveStake.gt(bnMinNominatorBond) ? bnMinActiveStake : bnMinNominatorBond;
71
162
  const _maxNominatorRewardedPerValidator = chainApi.api.consts.staking.maxNominatorRewardedPerValidator.toString();
72
163
  const maxNominatorRewardedPerValidator = parseInt(_maxNominatorRewardedPerValidator);
73
164
  const ledger = _ledger.toPrimitive();
@@ -77,7 +168,6 @@ async function getRelayChainNominatorMetadata(chainInfo, address, substrateApi)
77
168
  if (!ledger) {
78
169
  return;
79
170
  }
80
- let stakingStatus = _KoniTypes.StakingStatus.NOT_EARNING;
81
171
  const activeStake = ledger.active.toString();
82
172
  const nominationList = [];
83
173
  const unstakingList = [];
@@ -92,7 +182,10 @@ async function getRelayChainNominatorMetadata(chainInfo, address, substrateApi)
92
182
  const topNominators = eraStaker.others.map(nominator => {
93
183
  return nominator.who;
94
184
  });
95
- if (topNominators.slice(0, maxNominatorRewardedPerValidator).includes((0, _utils3.reformatAddress)(address, (0, _utils2._getChainSubstrateAddressPrefix)(chainInfo)))) {
185
+ if (!topNominators.includes((0, _utils3.reformatAddress)(address, (0, _utils2._getChainSubstrateAddressPrefix)(chainInfo)))) {
186
+ // if nominator has target but not in nominator list
187
+ nominationStatus = _KoniTypes.StakingStatus.WAITING;
188
+ } else if (topNominators.slice(0, maxNominatorRewardedPerValidator).includes((0, _utils3.reformatAddress)(address, (0, _utils2._getChainSubstrateAddressPrefix)(chainInfo)))) {
96
189
  // if address in top nominators
97
190
  nominationStatus = _KoniTypes.StakingStatus.EARNING_REWARD;
98
191
  }
@@ -106,11 +199,20 @@ async function getRelayChainNominatorMetadata(chainInfo, address, substrateApi)
106
199
  }));
107
200
  }
108
201
 
109
- for (const nomination of nominationList) {
110
- if (nomination.status === _KoniTypes.StakingStatus.EARNING_REWARD) {
111
- // only need 1 earning nomination to count
112
- stakingStatus = _KoniTypes.StakingStatus.EARNING_REWARD;
113
- break;
202
+ let stakingStatus = _KoniTypes.StakingStatus.NOT_EARNING;
203
+ const bnActiveStake = new _util.BN(activeStake);
204
+ let waitingNominationCount = 0;
205
+ if (bnActiveStake.gte(minStake)) {
206
+ for (const nomination of nominationList) {
207
+ if (nomination.status === _KoniTypes.StakingStatus.EARNING_REWARD) {
208
+ // only need 1 earning nomination to count
209
+ stakingStatus = _KoniTypes.StakingStatus.EARNING_REWARD;
210
+ } else if (nomination.status === _KoniTypes.StakingStatus.WAITING) {
211
+ waitingNominationCount += 1;
212
+ }
213
+ }
214
+ if (waitingNominationCount === nominationList.length) {
215
+ stakingStatus = _KoniTypes.StakingStatus.WAITING;
114
216
  }
115
217
  }
116
218
  ledger.unlocking.forEach(unlockingChunk => {
@@ -189,6 +291,10 @@ async function getRelayChainPoolMemberMetadata(chainInfo, address, substrateApi)
189
291
  waitingTime: waitingTime > 0 ? waitingTime : 0
190
292
  });
191
293
  });
294
+ const bnActiveStake = new _util.BN(poolMemberInfo.points.toString());
295
+ if (!bnActiveStake.gt(_util.BN_ZERO)) {
296
+ stakingStatus = _KoniTypes.StakingStatus.NOT_EARNING;
297
+ }
192
298
  return {
193
299
  chain: chainInfo.slug,
194
300
  type: _KoniTypes.StakingType.POOLED,
@@ -249,9 +355,9 @@ async function getRelayValidatorsInfo(chain, substrateApi, decimals, chainStakin
249
355
  }
250
356
  const extraInfoMap = {};
251
357
  await Promise.all(allValidators.map(async address => {
252
- var _chainApi$api$query2, _chainApi$api$query2$, _identityInfo$judgeme;
358
+ var _chainApi$api$query12, _chainApi$api$query13, _identityInfo$judgeme;
253
359
  // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
254
- const [_commissionInfo, _identityInfo] = await Promise.all([chainApi.api.query.staking.validators(address), (_chainApi$api$query2 = chainApi.api.query) === null || _chainApi$api$query2 === void 0 ? void 0 : (_chainApi$api$query2$ = _chainApi$api$query2.identity) === null || _chainApi$api$query2$ === void 0 ? void 0 : _chainApi$api$query2$.identityOf(address)]);
360
+ const [_commissionInfo, _identityInfo] = await Promise.all([chainApi.api.query.staking.validators(address), (_chainApi$api$query12 = chainApi.api.query) === null || _chainApi$api$query12 === void 0 ? void 0 : (_chainApi$api$query13 = _chainApi$api$query12.identity) === null || _chainApi$api$query13 === void 0 ? void 0 : _chainApi$api$query13.identityOf(address)]);
255
361
  const commissionInfo = _commissionInfo.toHuman();
256
362
  const identityInfo = _identityInfo ? _identityInfo.toHuman() : null;
257
363
  let identity;
@@ -16,6 +16,7 @@ exports.getInflationParams = getInflationParams;
16
16
  exports.getParaCurrentInflation = getParaCurrentInflation;
17
17
  exports.getStakingAvailableActionsByChain = getStakingAvailableActionsByChain;
18
18
  exports.getStakingAvailableActionsByNominator = getStakingAvailableActionsByNominator;
19
+ exports.getStakingStatusByNominations = getStakingStatusByNominations;
19
20
  exports.getWithdrawalInfo = getWithdrawalInfo;
20
21
  exports.isActionFromValidator = isActionFromValidator;
21
22
  exports.isShowNominationByValidator = isShowNominationByValidator;
@@ -150,11 +151,8 @@ function getBondedValidators(nominations) {
150
151
  const bondedValidators = [];
151
152
  let nominationCount = 0;
152
153
  for (const nomination of nominations) {
153
- const bnActiveStake = new _util.BN(nomination.activeStake);
154
- if (bnActiveStake.gt(_util.BN_ZERO)) {
155
- nominationCount += 1;
156
- bondedValidators.push((0, _utils.reformatAddress)(nomination.validatorAddress, 0));
157
- }
154
+ nominationCount += 1;
155
+ bondedValidators.push((0, _utils.reformatAddress)(nomination.validatorAddress, 0));
158
156
  }
159
157
  return {
160
158
  nominationCount,
@@ -197,13 +195,15 @@ function getStakingAvailableActionsByChain(chain, type) {
197
195
  }
198
196
  return [StakingAction.STAKE, StakingAction.UNSTAKE, StakingAction.WITHDRAW, StakingAction.CANCEL_UNSTAKE];
199
197
  }
200
- function getStakingAvailableActionsByNominator(nominatorMetadata) {
198
+ function getStakingAvailableActionsByNominator(nominatorMetadata, unclaimedReward) {
201
199
  const result = [StakingAction.STAKE];
202
200
  const bnActiveStake = new _util.BN(nominatorMetadata.activeStake);
203
201
  if (nominatorMetadata.activeStake && bnActiveStake.gt(_util.BN_ZERO)) {
204
202
  result.push(StakingAction.UNSTAKE);
205
- const isChainAllowClaimReward = _constants._STAKING_CHAIN_GROUP.amplitude.includes(nominatorMetadata.chain) || _constants._STAKING_CHAIN_GROUP.astar.includes(nominatorMetadata.chain);
206
- if (nominatorMetadata.type === _KoniTypes.StakingType.POOLED || isChainAllowClaimReward) {
203
+ const isAstarNetwork = _constants._STAKING_CHAIN_GROUP.astar.includes(nominatorMetadata.chain);
204
+ const isAmplitudeNetwork = _constants._STAKING_CHAIN_GROUP.amplitude.includes(nominatorMetadata.chain);
205
+ const bnUnclaimedReward = new _util.BN(unclaimedReward || '0');
206
+ if ((nominatorMetadata.type === _KoniTypes.StakingType.POOLED || isAmplitudeNetwork) && bnUnclaimedReward.gt(_util.BN_ZERO) || isAstarNetwork) {
207
207
  result.push(StakingAction.CLAIM_REWARD);
208
208
  }
209
209
  }
@@ -245,4 +245,23 @@ function getWithdrawalInfo(nominatorMetadata) {
245
245
  }
246
246
  }
247
247
  return result;
248
+ }
249
+ function getStakingStatusByNominations(bnTotalActiveStake, nominationList) {
250
+ let stakingStatus = _KoniTypes.StakingStatus.EARNING_REWARD;
251
+ if (bnTotalActiveStake.isZero()) {
252
+ stakingStatus = _KoniTypes.StakingStatus.NOT_EARNING;
253
+ } else {
254
+ let invalidDelegationCount = 0;
255
+ for (const nomination of nominationList) {
256
+ if (nomination.status === _KoniTypes.StakingStatus.NOT_EARNING) {
257
+ invalidDelegationCount += 1;
258
+ }
259
+ }
260
+ if (invalidDelegationCount > 0 && invalidDelegationCount < nominationList.length) {
261
+ stakingStatus = _KoniTypes.StakingStatus.PARTIALLY_EARNING;
262
+ } else if (invalidDelegationCount === nominationList.length) {
263
+ stakingStatus = _KoniTypes.StakingStatus.NOT_EARNING;
264
+ }
265
+ }
266
+ return stakingStatus;
248
267
  }