@subwallet/extension-base 1.0.2-1 → 1.0.2-1b

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 (120) hide show
  1. package/background/KoniTypes.d.ts +16 -34
  2. package/background/KoniTypes.js +6 -7
  3. package/background/errors/TransactionError.js +21 -1
  4. package/cjs/background/KoniTypes.js +6 -7
  5. package/cjs/background/errors/TransactionError.js +20 -0
  6. package/cjs/constants/index.js +8 -26
  7. package/cjs/koni/api/dotsama/balance.js +49 -224
  8. package/cjs/koni/api/dotsama/transfer.js +30 -29
  9. package/cjs/koni/api/nft/acala_nft/index.js +4 -1
  10. package/cjs/koni/api/nft/bit.country/index.js +4 -1
  11. package/cjs/koni/api/nft/evm_nft/index.js +7 -3
  12. package/cjs/koni/api/nft/index.js +3 -6
  13. package/cjs/koni/api/nft/karura_nft/index.js +4 -1
  14. package/cjs/koni/api/nft/rmrk_nft/index.js +8 -1
  15. package/cjs/koni/api/nft/statemine_nft/index.js +4 -1
  16. package/cjs/koni/api/nft/unique_nft/index.js +6 -1
  17. package/cjs/koni/api/nft/wasm_nft/index.js +169 -111
  18. package/cjs/koni/api/nft/wasm_nft/utils.js +11 -7
  19. package/cjs/koni/api/staking/bonding/amplitude.js +13 -9
  20. package/cjs/koni/api/staking/bonding/astar.js +15 -13
  21. package/cjs/koni/api/staking/bonding/index.js +22 -10
  22. package/cjs/koni/api/staking/bonding/paraChain.js +85 -2
  23. package/cjs/koni/api/staking/bonding/relayChain.js +119 -16
  24. package/cjs/koni/api/staking/bonding/utils.js +27 -8
  25. package/cjs/koni/api/tokens/wasm/index.js +5 -4
  26. package/cjs/koni/api/tokens/wasm/utils.js +63 -0
  27. package/cjs/koni/api/xcm/polkadotXcm.js +1 -1
  28. package/cjs/koni/api/xcm/utils.js +18 -13
  29. package/cjs/koni/api/xcm/xTokens.js +1 -1
  30. package/cjs/koni/api/xcm/xcmPallet.js +9 -6
  31. package/cjs/koni/background/cron.js +150 -47
  32. package/cjs/koni/background/handlers/Extension.js +106 -64
  33. package/cjs/koni/background/handlers/State.js +19 -21
  34. package/cjs/koni/background/handlers/Tabs.js +8 -1
  35. package/cjs/koni/background/subscription.js +32 -29
  36. package/cjs/services/chain-service/handler/SubstrateChainHandler.js +13 -8
  37. package/cjs/services/chain-service/handler/light-client/index.js +2 -0
  38. package/cjs/services/chain-service/index.js +6 -7
  39. package/cjs/services/event-service/index.js +5 -1
  40. package/cjs/services/event-service/types.js +11 -1
  41. package/cjs/services/history-service/index.js +16 -10
  42. package/cjs/services/history-service/subsquid-multi-chain-history.js +12 -9
  43. package/cjs/services/price-service/coingecko.js +0 -1
  44. package/cjs/services/price-service/index.js +2 -3
  45. package/cjs/services/request-service/handler/AuthRequestHandler.js +6 -2
  46. package/cjs/services/storage-service/DatabaseService.js +52 -33
  47. package/cjs/services/storage-service/db-stores/Nft.js +4 -17
  48. package/cjs/services/transaction-service/event-parser/index.js +20 -48
  49. package/cjs/services/transaction-service/index.js +23 -14
  50. package/cjs/utils/index.js +7 -14
  51. package/constants/index.d.ts +7 -13
  52. package/constants/index.js +7 -13
  53. package/koni/api/dotsama/balance.d.ts +0 -1
  54. package/koni/api/dotsama/balance.js +22 -197
  55. package/koni/api/dotsama/transfer.js +5 -4
  56. package/koni/api/nft/acala_nft/index.js +3 -1
  57. package/koni/api/nft/bit.country/index.js +3 -1
  58. package/koni/api/nft/evm_nft/index.js +6 -3
  59. package/koni/api/nft/index.d.ts +1 -2
  60. package/koni/api/nft/index.js +3 -6
  61. package/koni/api/nft/karura_nft/index.js +3 -1
  62. package/koni/api/nft/nft.d.ts +1 -0
  63. package/koni/api/nft/rmrk_nft/index.js +8 -1
  64. package/koni/api/nft/statemine_nft/index.js +3 -1
  65. package/koni/api/nft/unique_nft/index.js +5 -1
  66. package/koni/api/nft/wasm_nft/index.d.ts +0 -2
  67. package/koni/api/nft/wasm_nft/index.js +167 -109
  68. package/koni/api/nft/wasm_nft/utils.d.ts +7 -5
  69. package/koni/api/nft/wasm_nft/utils.js +7 -5
  70. package/koni/api/staking/bonding/amplitude.d.ts +0 -1
  71. package/koni/api/staking/bonding/amplitude.js +15 -10
  72. package/koni/api/staking/bonding/astar.js +8 -6
  73. package/koni/api/staking/bonding/index.d.ts +4 -1
  74. package/koni/api/staking/bonding/index.js +23 -13
  75. package/koni/api/staking/bonding/paraChain.d.ts +3 -0
  76. package/koni/api/staking/bonding/paraChain.js +86 -5
  77. package/koni/api/staking/bonding/relayChain.d.ts +5 -1
  78. package/koni/api/staking/bonding/relayChain.js +118 -18
  79. package/koni/api/staking/bonding/utils.d.ts +3 -2
  80. package/koni/api/staking/bonding/utils.js +27 -9
  81. package/koni/api/tokens/wasm/index.js +5 -4
  82. package/koni/api/tokens/wasm/utils.d.ts +6 -0
  83. package/koni/api/tokens/wasm/utils.js +54 -0
  84. package/koni/api/xcm/polkadotXcm.js +2 -2
  85. package/koni/api/xcm/utils.d.ts +5 -6
  86. package/koni/api/xcm/utils.js +15 -10
  87. package/koni/api/xcm/xTokens.js +2 -2
  88. package/koni/api/xcm/xcmPallet.js +10 -9
  89. package/koni/background/cron.d.ts +6 -1
  90. package/koni/background/cron.js +151 -48
  91. package/koni/background/handlers/Extension.d.ts +2 -2
  92. package/koni/background/handlers/Extension.js +108 -67
  93. package/koni/background/handlers/State.d.ts +5 -6
  94. package/koni/background/handlers/State.js +19 -21
  95. package/koni/background/handlers/Tabs.js +8 -1
  96. package/koni/background/subscription.js +31 -30
  97. package/package.json +9 -4
  98. package/services/chain-service/handler/SubstrateChainHandler.js +14 -9
  99. package/services/chain-service/handler/light-client/index.d.ts +17 -1
  100. package/services/chain-service/handler/light-client/index.js +1 -1
  101. package/services/chain-service/helper/psp22_abi.json +1041 -881
  102. package/services/chain-service/helper/psp34_abi.json +2963 -1807
  103. package/services/chain-service/index.js +6 -7
  104. package/services/event-service/index.js +5 -1
  105. package/services/event-service/types.d.ts +5 -9
  106. package/services/event-service/types.js +4 -1
  107. package/services/history-service/index.d.ts +1 -1
  108. package/services/history-service/index.js +16 -10
  109. package/services/history-service/subsquid-multi-chain-history.js +15 -11
  110. package/services/price-service/coingecko.js +0 -1
  111. package/services/price-service/index.js +2 -3
  112. package/services/request-service/handler/AuthRequestHandler.js +6 -2
  113. package/services/storage-service/DatabaseService.d.ts +1 -0
  114. package/services/storage-service/DatabaseService.js +52 -33
  115. package/services/storage-service/db-stores/Nft.d.ts +1 -2
  116. package/services/storage-service/db-stores/Nft.js +4 -16
  117. package/services/transaction-service/event-parser/index.js +21 -49
  118. package/services/transaction-service/index.js +23 -14
  119. package/utils/index.d.ts +1 -1
  120. package/utils/index.js +6 -12
@@ -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,91 @@ 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 (nominatorMetadata) {
53
+ const bnCurrentActiveStake = new _util.BN(nominatorMetadata.activeStake);
54
+ bnTotalStake = bnTotalStake.add(bnCurrentActiveStake);
55
+ if (!bnCurrentActiveStake.gt(_util.BN_ZERO)) {
56
+ errors.push(new _TransactionError.TransactionError(_KoniTypes.StakingTxErrorType.EXIST_UNSTAKING_REQUEST));
57
+ }
58
+ }
59
+ if (!bnTotalStake.gte(bnMinStake)) {
60
+ errors.push(new _TransactionError.TransactionError(_KoniTypes.StakingTxErrorType.NOT_ENOUGH_MIN_STAKE));
61
+ }
62
+ return errors;
63
+ }
64
+ function validateRelayBondingCondition(chainInfo, amount, selectedValidators, address, chainStakingMetadata, nominatorMetadata) {
65
+ const errors = [];
66
+ let bnTotalStake = new _util.BN(amount);
67
+ const bnMinStake = new _util.BN(chainStakingMetadata.minStake);
68
+ if (!nominatorMetadata) {
69
+ if (!bnTotalStake.gte(bnMinStake)) {
70
+ errors.push(new _TransactionError.TransactionError(_KoniTypes.StakingTxErrorType.NOT_ENOUGH_MIN_STAKE));
71
+ }
72
+ if (selectedValidators.length > chainStakingMetadata.maxValidatorPerNominator) {
73
+ errors.push(new _TransactionError.TransactionError(_KoniTypes.StakingTxErrorType.EXCEED_MAX_NOMINATIONS));
74
+ }
75
+ return errors;
76
+ }
77
+ const bnCurrentActiveStake = new _util.BN(nominatorMetadata.activeStake);
78
+ bnTotalStake = bnTotalStake.add(bnCurrentActiveStake);
79
+ if (!bnTotalStake.gte(bnMinStake)) {
80
+ errors.push(new _TransactionError.TransactionError(_KoniTypes.StakingTxErrorType.NOT_ENOUGH_MIN_STAKE));
81
+ }
82
+ if (selectedValidators.length > chainStakingMetadata.maxValidatorPerNominator) {
83
+ errors.push(new _TransactionError.TransactionError(_KoniTypes.StakingTxErrorType.EXCEED_MAX_NOMINATIONS));
84
+ }
85
+ return errors;
86
+ }
87
+ async function getRelayChainStakingMetadata(chainInfo, substrateApi) {
88
+ var _chainApi$api$query$a, _chainApi$api$query, _chainApi$api$query$s, _chainApi$api$query2, _chainApi$api$query2$, _chainApi$api$query3, _chainApi$api$query3$;
89
+ const chain = chainInfo.slug;
90
+ const {
91
+ decimals
92
+ } = (0, _utils2._getChainNativeTokenBasicInfo)(chainInfo);
31
93
  const chainApi = await substrateApi.isReady;
32
94
  const _era = await chainApi.api.query.staking.currentEra();
33
95
  const currentEra = _era.toString();
34
96
  const maxNominations = chainApi.api.consts.staking.maxNominations.toString();
35
97
  const maxUnlockingChunks = chainApi.api.consts.staking.maxUnlockingChunks.toString();
36
98
  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();
99
+ 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))]);
100
+ const eraStakers = _eraStakers;
101
+ const nominatorList = [];
102
+ for (const item of eraStakers) {
103
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access
104
+ const rawValidatorStat = item[1].toHuman();
105
+ const eraNominators = rawValidatorStat.others;
106
+ for (const nominator of eraNominators) {
107
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access
108
+ if (!nominatorList.includes(nominator.who)) {
109
+ nominatorList.push(nominator.who);
110
+ }
111
+ }
112
+ }
113
+ const minActiveStake = (_minimumActiveStake === null || _minimumActiveStake === void 0 ? void 0 : _minimumActiveStake.toString()) || '0';
114
+ const minNominatorBond = _minNominatorBond.toString();
115
+ const bnMinActiveStake = new _util.BN(minActiveStake);
116
+ const bnMinNominatorBond = new _util.BN(minNominatorBond);
117
+ const minStake = bnMinActiveStake.gt(bnMinNominatorBond) ? bnMinActiveStake : bnMinNominatorBond;
39
118
  const minPoolJoin = (_minPoolJoin === null || _minPoolJoin === void 0 ? void 0 : _minPoolJoin.toString()) || undefined;
40
119
  const rawTotalEraStake = _totalEraStake.toString();
41
120
  const rawTotalIssuance = _totalIssuance.toString();
@@ -53,21 +132,30 @@ async function getRelayChainStakingMetadata(chain, substrateApi) {
53
132
  expectedReturn,
54
133
  // in %, annually
55
134
  inflation,
56
- minStake,
135
+ minStake: minStake.toString(),
136
+ minPoolBonding: (10 ** decimals).toString(),
137
+ // default is 1
57
138
  maxValidatorPerNominator: parseInt(maxNominations),
58
139
  maxWithdrawalRequestPerValidator: parseInt(maxUnlockingChunks),
59
140
  allowCancelUnstaking: true,
60
141
  unstakingPeriod: unlockingPeriod,
61
- minJoinNominationPool: minPoolJoin
142
+ minJoinNominationPool: minPoolJoin,
143
+ nominatorCount: nominatorList.length
62
144
  };
63
145
  }
64
146
  async function getRelayChainNominatorMetadata(chainInfo, address, substrateApi) {
147
+ 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
148
  if ((0, _utilCrypto.isEthereumAddress)(address)) {
66
149
  return;
67
150
  }
68
151
  const chain = chainInfo.slug;
69
152
  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)]);
153
+ 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()]);
154
+ const minActiveStake = (_minimumActiveStake === null || _minimumActiveStake === void 0 ? void 0 : _minimumActiveStake.toString()) || '0';
155
+ const minNominatorBond = _minNominatorBond.toString();
156
+ const bnMinActiveStake = new _util.BN(minActiveStake);
157
+ const bnMinNominatorBond = new _util.BN(minNominatorBond);
158
+ const minStake = bnMinActiveStake.gt(bnMinNominatorBond) ? bnMinActiveStake : bnMinNominatorBond;
71
159
  const _maxNominatorRewardedPerValidator = chainApi.api.consts.staking.maxNominatorRewardedPerValidator.toString();
72
160
  const maxNominatorRewardedPerValidator = parseInt(_maxNominatorRewardedPerValidator);
73
161
  const ledger = _ledger.toPrimitive();
@@ -77,7 +165,6 @@ async function getRelayChainNominatorMetadata(chainInfo, address, substrateApi)
77
165
  if (!ledger) {
78
166
  return;
79
167
  }
80
- let stakingStatus = _KoniTypes.StakingStatus.NOT_EARNING;
81
168
  const activeStake = ledger.active.toString();
82
169
  const nominationList = [];
83
170
  const unstakingList = [];
@@ -92,7 +179,10 @@ async function getRelayChainNominatorMetadata(chainInfo, address, substrateApi)
92
179
  const topNominators = eraStaker.others.map(nominator => {
93
180
  return nominator.who;
94
181
  });
95
- if (topNominators.slice(0, maxNominatorRewardedPerValidator).includes((0, _utils3.reformatAddress)(address, (0, _utils2._getChainSubstrateAddressPrefix)(chainInfo)))) {
182
+ if (!topNominators.includes((0, _utils3.reformatAddress)(address, (0, _utils2._getChainSubstrateAddressPrefix)(chainInfo)))) {
183
+ // if nominator has target but not in nominator list
184
+ nominationStatus = _KoniTypes.StakingStatus.WAITING;
185
+ } else if (topNominators.slice(0, maxNominatorRewardedPerValidator).includes((0, _utils3.reformatAddress)(address, (0, _utils2._getChainSubstrateAddressPrefix)(chainInfo)))) {
96
186
  // if address in top nominators
97
187
  nominationStatus = _KoniTypes.StakingStatus.EARNING_REWARD;
98
188
  }
@@ -106,11 +196,20 @@ async function getRelayChainNominatorMetadata(chainInfo, address, substrateApi)
106
196
  }));
107
197
  }
108
198
 
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;
199
+ let stakingStatus = _KoniTypes.StakingStatus.NOT_EARNING;
200
+ const bnActiveStake = new _util.BN(activeStake);
201
+ let waitingNominationCount = 0;
202
+ if (bnActiveStake.gte(minStake)) {
203
+ for (const nomination of nominationList) {
204
+ if (nomination.status === _KoniTypes.StakingStatus.EARNING_REWARD) {
205
+ // only need 1 earning nomination to count
206
+ stakingStatus = _KoniTypes.StakingStatus.EARNING_REWARD;
207
+ } else if (nomination.status === _KoniTypes.StakingStatus.WAITING) {
208
+ waitingNominationCount += 1;
209
+ }
210
+ }
211
+ if (waitingNominationCount === nominationList.length) {
212
+ stakingStatus = _KoniTypes.StakingStatus.WAITING;
114
213
  }
115
214
  }
116
215
  ledger.unlocking.forEach(unlockingChunk => {
@@ -189,6 +288,10 @@ async function getRelayChainPoolMemberMetadata(chainInfo, address, substrateApi)
189
288
  waitingTime: waitingTime > 0 ? waitingTime : 0
190
289
  });
191
290
  });
291
+ const bnActiveStake = new _util.BN(poolMemberInfo.points.toString());
292
+ if (!bnActiveStake.gt(_util.BN_ZERO)) {
293
+ stakingStatus = _KoniTypes.StakingStatus.NOT_EARNING;
294
+ }
192
295
  return {
193
296
  chain: chainInfo.slug,
194
297
  type: _KoniTypes.StakingType.POOLED,
@@ -249,9 +352,9 @@ async function getRelayValidatorsInfo(chain, substrateApi, decimals, chainStakin
249
352
  }
250
353
  const extraInfoMap = {};
251
354
  await Promise.all(allValidators.map(async address => {
252
- var _chainApi$api$query2, _chainApi$api$query2$, _identityInfo$judgeme;
355
+ var _chainApi$api$query12, _chainApi$api$query13, _identityInfo$judgeme;
253
356
  // 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)]);
357
+ 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
358
  const commissionInfo = _commissionInfo.toHuman();
256
359
  const identityInfo = _identityInfo ? _identityInfo.toHuman() : null;
257
360
  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
  }
@@ -6,6 +6,7 @@ Object.defineProperty(exports, "__esModule", {
6
6
  exports.getPSP22ContractPromise = getPSP22ContractPromise;
7
7
  exports.getPSP34ContractPromise = getPSP34ContractPromise;
8
8
  exports.getPSP34TransferExtrinsic = getPSP34TransferExtrinsic;
9
+ var _utils = require("@subwallet/extension-base/koni/api/tokens/wasm/utils");
9
10
  var _helper = require("@subwallet/extension-base/services/chain-service/helper");
10
11
  var _apiContract = require("@polkadot/api-contract");
11
12
  // Copyright 2019-2022 @subwallet/extension-base
@@ -22,10 +23,10 @@ async function getPSP34TransferExtrinsic(networkKey, substrateApi, senderAddress
22
23
  const onChainOption = params.onChainOption;
23
24
  try {
24
25
  const contractPromise = getPSP34ContractPromise(substrateApi.api, contractAddress);
25
- const transferQuery = await contractPromise.query['psp34::transfer'](senderAddress, {
26
- gasLimit: -1
27
- }, recipientAddress, onChainOption, {});
28
- const gasLimit = transferQuery.gasRequired.toString();
26
+ // @ts-ignore
27
+ const gasLimit = await (0, _utils.getWasmContractGasLimit)(substrateApi.api, senderAddress, 'psp34::transfer', contractPromise, {}, [recipientAddress, onChainOption, {}]);
28
+
29
+ // @ts-ignore
29
30
  return contractPromise.tx['psp34::transfer']({
30
31
  gasLimit
31
32
  }, recipientAddress, onChainOption, {});