@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.
- package/background/KoniTypes.d.ts +16 -34
- package/background/KoniTypes.js +6 -7
- package/background/errors/TransactionError.js +21 -1
- package/cjs/background/KoniTypes.js +6 -7
- package/cjs/background/errors/TransactionError.js +20 -0
- package/cjs/constants/index.js +8 -26
- package/cjs/koni/api/dotsama/balance.js +49 -224
- package/cjs/koni/api/dotsama/transfer.js +30 -29
- package/cjs/koni/api/nft/acala_nft/index.js +4 -1
- package/cjs/koni/api/nft/bit.country/index.js +4 -1
- package/cjs/koni/api/nft/evm_nft/index.js +7 -3
- package/cjs/koni/api/nft/index.js +3 -6
- package/cjs/koni/api/nft/karura_nft/index.js +4 -1
- package/cjs/koni/api/nft/rmrk_nft/index.js +8 -1
- package/cjs/koni/api/nft/statemine_nft/index.js +4 -1
- package/cjs/koni/api/nft/unique_nft/index.js +6 -1
- package/cjs/koni/api/nft/wasm_nft/index.js +169 -111
- package/cjs/koni/api/nft/wasm_nft/utils.js +11 -7
- package/cjs/koni/api/staking/bonding/amplitude.js +13 -9
- package/cjs/koni/api/staking/bonding/astar.js +15 -13
- package/cjs/koni/api/staking/bonding/index.js +22 -10
- package/cjs/koni/api/staking/bonding/paraChain.js +85 -2
- package/cjs/koni/api/staking/bonding/relayChain.js +119 -16
- package/cjs/koni/api/staking/bonding/utils.js +27 -8
- package/cjs/koni/api/tokens/wasm/index.js +5 -4
- package/cjs/koni/api/tokens/wasm/utils.js +63 -0
- package/cjs/koni/api/xcm/polkadotXcm.js +1 -1
- package/cjs/koni/api/xcm/utils.js +18 -13
- package/cjs/koni/api/xcm/xTokens.js +1 -1
- package/cjs/koni/api/xcm/xcmPallet.js +9 -6
- package/cjs/koni/background/cron.js +150 -47
- package/cjs/koni/background/handlers/Extension.js +106 -64
- package/cjs/koni/background/handlers/State.js +19 -21
- package/cjs/koni/background/handlers/Tabs.js +8 -1
- package/cjs/koni/background/subscription.js +32 -29
- package/cjs/services/chain-service/handler/SubstrateChainHandler.js +13 -8
- package/cjs/services/chain-service/handler/light-client/index.js +2 -0
- package/cjs/services/chain-service/index.js +6 -7
- package/cjs/services/event-service/index.js +5 -1
- package/cjs/services/event-service/types.js +11 -1
- package/cjs/services/history-service/index.js +16 -10
- package/cjs/services/history-service/subsquid-multi-chain-history.js +12 -9
- package/cjs/services/price-service/coingecko.js +0 -1
- package/cjs/services/price-service/index.js +2 -3
- package/cjs/services/request-service/handler/AuthRequestHandler.js +6 -2
- package/cjs/services/storage-service/DatabaseService.js +52 -33
- package/cjs/services/storage-service/db-stores/Nft.js +4 -17
- package/cjs/services/transaction-service/event-parser/index.js +20 -48
- package/cjs/services/transaction-service/index.js +23 -14
- package/cjs/utils/index.js +7 -14
- package/constants/index.d.ts +7 -13
- package/constants/index.js +7 -13
- package/koni/api/dotsama/balance.d.ts +0 -1
- package/koni/api/dotsama/balance.js +22 -197
- package/koni/api/dotsama/transfer.js +5 -4
- package/koni/api/nft/acala_nft/index.js +3 -1
- package/koni/api/nft/bit.country/index.js +3 -1
- package/koni/api/nft/evm_nft/index.js +6 -3
- package/koni/api/nft/index.d.ts +1 -2
- package/koni/api/nft/index.js +3 -6
- package/koni/api/nft/karura_nft/index.js +3 -1
- package/koni/api/nft/nft.d.ts +1 -0
- package/koni/api/nft/rmrk_nft/index.js +8 -1
- package/koni/api/nft/statemine_nft/index.js +3 -1
- package/koni/api/nft/unique_nft/index.js +5 -1
- package/koni/api/nft/wasm_nft/index.d.ts +0 -2
- package/koni/api/nft/wasm_nft/index.js +167 -109
- package/koni/api/nft/wasm_nft/utils.d.ts +7 -5
- package/koni/api/nft/wasm_nft/utils.js +7 -5
- package/koni/api/staking/bonding/amplitude.d.ts +0 -1
- package/koni/api/staking/bonding/amplitude.js +15 -10
- package/koni/api/staking/bonding/astar.js +8 -6
- package/koni/api/staking/bonding/index.d.ts +4 -1
- package/koni/api/staking/bonding/index.js +23 -13
- package/koni/api/staking/bonding/paraChain.d.ts +3 -0
- package/koni/api/staking/bonding/paraChain.js +86 -5
- package/koni/api/staking/bonding/relayChain.d.ts +5 -1
- package/koni/api/staking/bonding/relayChain.js +118 -18
- package/koni/api/staking/bonding/utils.d.ts +3 -2
- package/koni/api/staking/bonding/utils.js +27 -9
- package/koni/api/tokens/wasm/index.js +5 -4
- package/koni/api/tokens/wasm/utils.d.ts +6 -0
- package/koni/api/tokens/wasm/utils.js +54 -0
- package/koni/api/xcm/polkadotXcm.js +2 -2
- package/koni/api/xcm/utils.d.ts +5 -6
- package/koni/api/xcm/utils.js +15 -10
- package/koni/api/xcm/xTokens.js +2 -2
- package/koni/api/xcm/xcmPallet.js +10 -9
- package/koni/background/cron.d.ts +6 -1
- package/koni/background/cron.js +151 -48
- package/koni/background/handlers/Extension.d.ts +2 -2
- package/koni/background/handlers/Extension.js +108 -67
- package/koni/background/handlers/State.d.ts +5 -6
- package/koni/background/handlers/State.js +19 -21
- package/koni/background/handlers/Tabs.js +8 -1
- package/koni/background/subscription.js +31 -30
- package/package.json +9 -4
- package/services/chain-service/handler/SubstrateChainHandler.js +14 -9
- package/services/chain-service/handler/light-client/index.d.ts +17 -1
- package/services/chain-service/handler/light-client/index.js +1 -1
- package/services/chain-service/helper/psp22_abi.json +1041 -881
- package/services/chain-service/helper/psp34_abi.json +2963 -1807
- package/services/chain-service/index.js +6 -7
- package/services/event-service/index.js +5 -1
- package/services/event-service/types.d.ts +5 -9
- package/services/event-service/types.js +4 -1
- package/services/history-service/index.d.ts +1 -1
- package/services/history-service/index.js +16 -10
- package/services/history-service/subsquid-multi-chain-history.js +15 -11
- package/services/price-service/coingecko.js +0 -1
- package/services/price-service/index.js +2 -3
- package/services/request-service/handler/AuthRequestHandler.js +6 -2
- package/services/storage-service/DatabaseService.d.ts +1 -0
- package/services/storage-service/DatabaseService.js +52 -33
- package/services/storage-service/db-stores/Nft.d.ts +1 -2
- package/services/storage-service/db-stores/Nft.js +4 -16
- package/services/transaction-service/event-parser/index.js +21 -49
- package/services/transaction-service/index.js +23 -14
- package/utils/index.d.ts +1 -1
- 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
|
|
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:
|
|
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:
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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
|
-
|
|
27
|
-
if (_constants._STAKING_CHAIN_GROUP.
|
|
28
|
-
return (0,
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
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,
|
|
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:
|
|
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
|
-
|
|
30
|
-
|
|
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()
|
|
38
|
-
const
|
|
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
|
|
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.
|
|
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
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
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$
|
|
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$
|
|
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
|
-
|
|
154
|
-
|
|
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
|
|
206
|
-
|
|
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
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
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, {});
|