@subwallet/extension-base 1.0.2-2 → 1.0.3-0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/background/KoniTypes.d.ts +56 -40
- package/background/KoniTypes.js +11 -9
- package/background/errors/TransactionError.js +25 -1
- package/background/types.d.ts +10 -5
- package/cjs/background/KoniTypes.js +11 -9
- package/cjs/background/errors/TransactionError.js +24 -0
- package/cjs/constants/index.js +8 -26
- package/cjs/koni/api/dotsama/balance.js +49 -224
- package/cjs/koni/api/dotsama/transfer.js +34 -39
- package/cjs/koni/api/nft/acala_nft/index.js +7 -7
- package/cjs/koni/api/nft/bit.country/index.js +7 -6
- package/cjs/koni/api/nft/evm_nft/index.js +8 -3
- package/cjs/koni/api/nft/index.js +3 -6
- package/cjs/koni/api/nft/karura_nft/index.js +7 -6
- package/cjs/koni/api/nft/rmrk_nft/index.js +11 -1
- package/cjs/koni/api/nft/statemine_nft/index.js +7 -6
- package/cjs/koni/api/nft/unique_nft/index.js +5 -1
- package/cjs/koni/api/nft/wasm_nft/index.js +170 -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 +122 -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 +171 -61
- package/cjs/koni/background/handlers/Extension.js +391 -207
- package/cjs/koni/background/handlers/State.js +49 -34
- package/cjs/koni/background/handlers/Tabs.js +50 -17
- package/cjs/koni/background/subscription.js +53 -28
- package/cjs/packageInfo.js +1 -1
- package/cjs/services/base/types.js +20 -0
- package/cjs/services/chain-service/handler/SubstrateChainHandler.js +13 -8
- package/cjs/services/chain-service/index.js +73 -49
- 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 +101 -50
- package/cjs/services/history-service/subsquid-multi-chain-history.js +13 -10
- package/cjs/services/keyring-service/index.js +11 -13
- package/cjs/services/migration-service/scripts/MigrateImportedToken.js +2 -1
- package/cjs/services/price-service/coingecko.js +0 -1
- package/cjs/services/price-service/index.js +71 -24
- package/cjs/services/request-service/handler/AuthRequestHandler.js +13 -7
- package/cjs/services/request-service/handler/EvmRequestHandler.js +8 -12
- package/cjs/services/request-service/index.js +14 -5
- package/cjs/services/storage-service/DatabaseService.js +66 -34
- package/cjs/services/storage-service/db-stores/Nft.js +7 -15
- package/cjs/services/storage-service/db-stores/Transaction.js +6 -10
- package/cjs/services/transaction-service/event-parser/index.js +20 -48
- package/cjs/services/transaction-service/index.js +104 -48
- package/cjs/services/transaction-service/utils.js +10 -8
- package/cjs/utils/address.js +10 -1
- package/cjs/utils/index.js +9 -15
- package/cjs/utils/promise.js +26 -0
- 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 +11 -16
- package/koni/api/nft/acala_nft/index.js +7 -7
- package/koni/api/nft/bit.country/index.js +7 -6
- package/koni/api/nft/evm_nft/index.js +7 -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 +7 -6
- package/koni/api/nft/nft.d.ts +1 -0
- package/koni/api/nft/rmrk_nft/index.js +11 -1
- package/koni/api/nft/statemine_nft/index.js +7 -6
- 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 +168 -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 +121 -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 +172 -62
- package/koni/background/handlers/Extension.d.ts +9 -3
- package/koni/background/handlers/Extension.js +306 -126
- package/koni/background/handlers/State.d.ts +5 -6
- package/koni/background/handlers/State.js +51 -34
- package/koni/background/handlers/Tabs.js +50 -17
- package/koni/background/subscription.d.ts +2 -0
- package/koni/background/subscription.js +51 -29
- package/package.json +29 -14
- package/packageInfo.js +1 -1
- package/services/base/types.d.ts +34 -0
- package/services/base/types.js +15 -0
- package/services/chain-service/handler/SubstrateChainHandler.js +14 -9
- 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.d.ts +5 -2
- package/services/chain-service/index.js +68 -45
- package/services/chain-service/types.d.ts +1 -0
- 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 +28 -7
- package/services/history-service/index.js +101 -50
- package/services/history-service/subsquid-multi-chain-history.js +16 -12
- package/services/keyring-service/index.d.ts +4 -2
- package/services/keyring-service/index.js +11 -13
- package/services/migration-service/scripts/MigrateImportedToken.js +2 -1
- package/services/price-service/coingecko.js +0 -1
- package/services/price-service/index.d.ts +22 -1
- package/services/price-service/index.js +71 -24
- package/services/request-service/handler/AuthRequestHandler.d.ts +3 -1
- package/services/request-service/handler/AuthRequestHandler.js +13 -7
- package/services/request-service/handler/EvmRequestHandler.js +8 -12
- package/services/request-service/index.d.ts +3 -1
- package/services/request-service/index.js +14 -5
- package/services/storage-service/DatabaseService.d.ts +2 -0
- package/services/storage-service/DatabaseService.js +66 -34
- package/services/storage-service/db-stores/Nft.d.ts +2 -2
- package/services/storage-service/db-stores/Nft.js +7 -14
- package/services/storage-service/db-stores/Transaction.d.ts +2 -0
- package/services/storage-service/db-stores/Transaction.js +6 -10
- package/services/transaction-service/event-parser/index.js +21 -49
- package/services/transaction-service/index.d.ts +2 -0
- package/services/transaction-service/index.js +86 -32
- package/services/transaction-service/types.d.ts +2 -0
- package/services/transaction-service/utils.js +10 -8
- package/utils/address.d.ts +3 -0
- package/utils/address.js +8 -1
- package/utils/index.d.ts +2 -2
- package/utils/index.js +7 -13
- package/utils/promise.d.ts +6 -0
- package/utils/promise.js +20 -0
|
@@ -4,7 +4,6 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.getAmplitudeBondingExtrinsic = getAmplitudeBondingExtrinsic;
|
|
7
|
-
exports.getAmplitudeCancelWithdrawalExtrinsic = getAmplitudeCancelWithdrawalExtrinsic;
|
|
8
7
|
exports.getAmplitudeClaimRewardExtrinsic = getAmplitudeClaimRewardExtrinsic;
|
|
9
8
|
exports.getAmplitudeCollatorsInfo = getAmplitudeCollatorsInfo;
|
|
10
9
|
exports.getAmplitudeNominatorMetadata = getAmplitudeNominatorMetadata;
|
|
@@ -52,24 +51,31 @@ async function getAmplitudeNominatorMetadata(chainInfo, address, substrateApi) {
|
|
|
52
51
|
const nominationList = [];
|
|
53
52
|
const unstakingList = [];
|
|
54
53
|
const [_delegatorState, _unstakingInfo] = await Promise.all([chainApi.api.query.parachainStaking.delegatorState(address), chainApi.api.query.parachainStaking.unstaking(address)]);
|
|
54
|
+
const minDelegatorStake = chainApi.api.consts.parachainStaking.minDelegatorStake.toString();
|
|
55
55
|
const delegatorState = _delegatorState.toPrimitive();
|
|
56
56
|
const unstakingInfo = _unstakingInfo.toPrimitive();
|
|
57
|
+
console.log('unstakingInfo ampe', unstakingInfo, !!unstakingInfo);
|
|
57
58
|
if (!delegatorState && !unstakingInfo) {
|
|
58
59
|
return;
|
|
59
60
|
}
|
|
60
61
|
let activeStake = '0';
|
|
61
62
|
if (delegatorState) {
|
|
62
63
|
// delegatorState can be null while unstaking all
|
|
63
|
-
const identityInfo = (await chainApi.api.query.identity.identityOf(delegatorState.owner)).toPrimitive();
|
|
64
|
-
const identity = (0, _utils.parseIdentity)(identityInfo);
|
|
64
|
+
const identityInfo = chainApi.api.query.identity ? (await chainApi.api.query.identity.identityOf(delegatorState.owner)).toPrimitive() : undefined;
|
|
65
|
+
const identity = identityInfo ? (0, _utils.parseIdentity)(identityInfo) : undefined;
|
|
65
66
|
activeStake = delegatorState.amount.toString();
|
|
67
|
+
const bnActiveStake = new _util.BN(activeStake);
|
|
68
|
+
let delegationStatus = _KoniTypes.StakingStatus.NOT_EARNING;
|
|
69
|
+
if (bnActiveStake.gt(_util.BN_ZERO) && bnActiveStake.gte(new _util.BN(minDelegatorStake))) {
|
|
70
|
+
delegationStatus = _KoniTypes.StakingStatus.EARNING_REWARD;
|
|
71
|
+
}
|
|
66
72
|
nominationList.push({
|
|
67
|
-
status:
|
|
73
|
+
status: delegationStatus,
|
|
68
74
|
chain,
|
|
69
75
|
validatorAddress: delegatorState.owner,
|
|
70
76
|
activeStake: delegatorState.amount.toString(),
|
|
71
77
|
validatorMinStake: '0',
|
|
72
|
-
hasUnstaking: !!unstakingInfo,
|
|
78
|
+
hasUnstaking: !!unstakingInfo && Object.values(unstakingInfo).length > 0,
|
|
73
79
|
validatorIdentity: identity
|
|
74
80
|
});
|
|
75
81
|
}
|
|
@@ -97,9 +103,11 @@ async function getAmplitudeNominatorMetadata(chainInfo, address, substrateApi) {
|
|
|
97
103
|
if (nominationList.length === 0 && unstakingList.length === 0) {
|
|
98
104
|
return;
|
|
99
105
|
}
|
|
106
|
+
const stakingStatus = (0, _utils.getStakingStatusByNominations)(new _util.BN(activeStake), nominationList);
|
|
100
107
|
return {
|
|
101
108
|
chain,
|
|
102
109
|
type: _KoniTypes.StakingType.NOMINATED,
|
|
110
|
+
status: stakingStatus,
|
|
103
111
|
address: address,
|
|
104
112
|
activeStake: activeStake,
|
|
105
113
|
nominations: nominationList,
|
|
@@ -180,8 +188,4 @@ async function getAmplitudeWithdrawalExtrinsic(substrateApi, address) {
|
|
|
180
188
|
async function getAmplitudeClaimRewardExtrinsic(substrateApi) {
|
|
181
189
|
const chainApi = await substrateApi.isReady;
|
|
182
190
|
return chainApi.api.tx.utility.batch([chainApi.api.tx.parachainStaking.incrementDelegatorRewards(), chainApi.api.tx.parachainStaking.claimRewards()]);
|
|
183
|
-
}
|
|
184
|
-
async function getAmplitudeCancelWithdrawalExtrinsic(substrateApi) {
|
|
185
|
-
const chainApi = await substrateApi.isReady;
|
|
186
|
-
return chainApi.api.tx.parachainStaking.cancelLeaveCandidates();
|
|
187
191
|
}
|
|
@@ -12,8 +12,9 @@ exports.getAstarStakingMetadata = getAstarStakingMetadata;
|
|
|
12
12
|
exports.getAstarUnbondingExtrinsic = getAstarUnbondingExtrinsic;
|
|
13
13
|
exports.getAstarWithdrawalExtrinsic = getAstarWithdrawalExtrinsic;
|
|
14
14
|
var _KoniTypes = require("@subwallet/extension-base/background/KoniTypes");
|
|
15
|
+
var _utils = require("@subwallet/extension-base/koni/api/staking/bonding/utils");
|
|
15
16
|
var _constants = require("@subwallet/extension-base/services/chain-service/constants");
|
|
16
|
-
var
|
|
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,94 @@ var _utilCrypto = require("@polkadot/util-crypto");
|
|
|
26
30
|
// Copyright 2019-2022 @subwallet/extension-koni authors & contributors
|
|
27
31
|
// SPDX-License-Identifier: Apache-2.0
|
|
28
32
|
|
|
29
|
-
|
|
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 (selectedPool.state !== 'Open') {
|
|
53
|
+
errors.push(new _TransactionError.TransactionError(_KoniTypes.StakingTxErrorType.INACTIVE_NOMINATION_POOL));
|
|
54
|
+
}
|
|
55
|
+
if (nominatorMetadata) {
|
|
56
|
+
const bnCurrentActiveStake = new _util.BN(nominatorMetadata.activeStake);
|
|
57
|
+
bnTotalStake = bnTotalStake.add(bnCurrentActiveStake);
|
|
58
|
+
if (!bnCurrentActiveStake.gt(_util.BN_ZERO)) {
|
|
59
|
+
errors.push(new _TransactionError.TransactionError(_KoniTypes.StakingTxErrorType.EXIST_UNSTAKING_REQUEST));
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
if (!bnTotalStake.gte(bnMinStake)) {
|
|
63
|
+
errors.push(new _TransactionError.TransactionError(_KoniTypes.StakingTxErrorType.NOT_ENOUGH_MIN_STAKE));
|
|
64
|
+
}
|
|
65
|
+
return errors;
|
|
66
|
+
}
|
|
67
|
+
function validateRelayBondingCondition(chainInfo, amount, selectedValidators, address, chainStakingMetadata, nominatorMetadata) {
|
|
68
|
+
const errors = [];
|
|
69
|
+
let bnTotalStake = new _util.BN(amount);
|
|
70
|
+
const bnMinStake = new _util.BN(chainStakingMetadata.minStake);
|
|
71
|
+
if (!nominatorMetadata) {
|
|
72
|
+
if (!bnTotalStake.gte(bnMinStake)) {
|
|
73
|
+
errors.push(new _TransactionError.TransactionError(_KoniTypes.StakingTxErrorType.NOT_ENOUGH_MIN_STAKE));
|
|
74
|
+
}
|
|
75
|
+
if (selectedValidators.length > chainStakingMetadata.maxValidatorPerNominator) {
|
|
76
|
+
errors.push(new _TransactionError.TransactionError(_KoniTypes.StakingTxErrorType.EXCEED_MAX_NOMINATIONS));
|
|
77
|
+
}
|
|
78
|
+
return errors;
|
|
79
|
+
}
|
|
80
|
+
const bnCurrentActiveStake = new _util.BN(nominatorMetadata.activeStake);
|
|
81
|
+
bnTotalStake = bnTotalStake.add(bnCurrentActiveStake);
|
|
82
|
+
if (!bnTotalStake.gte(bnMinStake)) {
|
|
83
|
+
errors.push(new _TransactionError.TransactionError(_KoniTypes.StakingTxErrorType.NOT_ENOUGH_MIN_STAKE));
|
|
84
|
+
}
|
|
85
|
+
if (selectedValidators.length > chainStakingMetadata.maxValidatorPerNominator) {
|
|
86
|
+
errors.push(new _TransactionError.TransactionError(_KoniTypes.StakingTxErrorType.EXCEED_MAX_NOMINATIONS));
|
|
87
|
+
}
|
|
88
|
+
return errors;
|
|
89
|
+
}
|
|
90
|
+
async function getRelayChainStakingMetadata(chainInfo, substrateApi) {
|
|
91
|
+
var _chainApi$api$query$a, _chainApi$api$query, _chainApi$api$query$s, _chainApi$api$query2, _chainApi$api$query2$, _chainApi$api$query3, _chainApi$api$query3$;
|
|
92
|
+
const chain = chainInfo.slug;
|
|
93
|
+
const {
|
|
94
|
+
decimals
|
|
95
|
+
} = (0, _utils2._getChainNativeTokenBasicInfo)(chainInfo);
|
|
31
96
|
const chainApi = await substrateApi.isReady;
|
|
32
97
|
const _era = await chainApi.api.query.staking.currentEra();
|
|
33
98
|
const currentEra = _era.toString();
|
|
34
99
|
const maxNominations = chainApi.api.consts.staking.maxNominations.toString();
|
|
35
100
|
const maxUnlockingChunks = chainApi.api.consts.staking.maxUnlockingChunks.toString();
|
|
36
101
|
const unlockingEras = chainApi.api.consts.staking.bondingDuration.toString();
|
|
37
|
-
const [_totalEraStake, _totalIssuance, _auctionCounter, _minimumActiveStake, _minPoolJoin] = await Promise.all([chainApi.api.query.staking.erasTotalStake(parseInt(currentEra)), chainApi.api.query.balances.totalIssuance(), (_chainApi$api$query$a = chainApi.api.query.auctions) === null || _chainApi$api$query$a === void 0 ? void 0 : _chainApi$api$query$a.auctionCounter(), chainApi.api.query.staking.minimumActiveStake()
|
|
38
|
-
const
|
|
102
|
+
const [_totalEraStake, _totalIssuance, _auctionCounter, _minimumActiveStake, _minNominatorBond, _minPoolJoin, _eraStakers] = await Promise.all([chainApi.api.query.staking.erasTotalStake(parseInt(currentEra)), chainApi.api.query.balances.totalIssuance(), (_chainApi$api$query$a = chainApi.api.query.auctions) === null || _chainApi$api$query$a === void 0 ? void 0 : _chainApi$api$query$a.auctionCounter(), ((_chainApi$api$query = chainApi.api.query) === null || _chainApi$api$query === void 0 ? void 0 : (_chainApi$api$query$s = _chainApi$api$query.staking) === null || _chainApi$api$query$s === void 0 ? void 0 : _chainApi$api$query$s.minimumActiveStake) && ((_chainApi$api$query2 = chainApi.api.query) === null || _chainApi$api$query2 === void 0 ? void 0 : (_chainApi$api$query2$ = _chainApi$api$query2.staking) === null || _chainApi$api$query2$ === void 0 ? void 0 : _chainApi$api$query2$.minimumActiveStake()), chainApi.api.query.staking.minNominatorBond(), (_chainApi$api$query3 = chainApi.api.query) === null || _chainApi$api$query3 === void 0 ? void 0 : (_chainApi$api$query3$ = _chainApi$api$query3.nominationPools) === null || _chainApi$api$query3$ === void 0 ? void 0 : _chainApi$api$query3$.minJoinBond(), chainApi.api.query.staking.erasStakers.entries(parseInt(currentEra))]);
|
|
103
|
+
const eraStakers = _eraStakers;
|
|
104
|
+
const nominatorList = [];
|
|
105
|
+
for (const item of eraStakers) {
|
|
106
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access
|
|
107
|
+
const rawValidatorStat = item[1].toHuman();
|
|
108
|
+
const eraNominators = rawValidatorStat.others;
|
|
109
|
+
for (const nominator of eraNominators) {
|
|
110
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access
|
|
111
|
+
if (!nominatorList.includes(nominator.who)) {
|
|
112
|
+
nominatorList.push(nominator.who);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
const minActiveStake = (_minimumActiveStake === null || _minimumActiveStake === void 0 ? void 0 : _minimumActiveStake.toString()) || '0';
|
|
117
|
+
const minNominatorBond = _minNominatorBond.toString();
|
|
118
|
+
const bnMinActiveStake = new _util.BN(minActiveStake);
|
|
119
|
+
const bnMinNominatorBond = new _util.BN(minNominatorBond);
|
|
120
|
+
const minStake = bnMinActiveStake.gt(bnMinNominatorBond) ? bnMinActiveStake : bnMinNominatorBond;
|
|
39
121
|
const minPoolJoin = (_minPoolJoin === null || _minPoolJoin === void 0 ? void 0 : _minPoolJoin.toString()) || undefined;
|
|
40
122
|
const rawTotalEraStake = _totalEraStake.toString();
|
|
41
123
|
const rawTotalIssuance = _totalIssuance.toString();
|
|
@@ -53,21 +135,30 @@ async function getRelayChainStakingMetadata(chain, substrateApi) {
|
|
|
53
135
|
expectedReturn,
|
|
54
136
|
// in %, annually
|
|
55
137
|
inflation,
|
|
56
|
-
minStake,
|
|
138
|
+
minStake: minStake.toString(),
|
|
139
|
+
minPoolBonding: (10 ** decimals).toString(),
|
|
140
|
+
// default is 1
|
|
57
141
|
maxValidatorPerNominator: parseInt(maxNominations),
|
|
58
142
|
maxWithdrawalRequestPerValidator: parseInt(maxUnlockingChunks),
|
|
59
143
|
allowCancelUnstaking: true,
|
|
60
144
|
unstakingPeriod: unlockingPeriod,
|
|
61
|
-
minJoinNominationPool: minPoolJoin
|
|
145
|
+
minJoinNominationPool: minPoolJoin,
|
|
146
|
+
nominatorCount: nominatorList.length
|
|
62
147
|
};
|
|
63
148
|
}
|
|
64
149
|
async function getRelayChainNominatorMetadata(chainInfo, address, substrateApi) {
|
|
150
|
+
var _chainApi$api$query4, _chainApi$api$query4$, _chainApi$api$query5, _chainApi$api$query5$, _chainApi$api$query6, _chainApi$api$query6$, _chainApi$api$query7, _chainApi$api$query7$, _chainApi$api$query8, _chainApi$api$query8$, _chainApi$api$query9, _chainApi$api$query9$, _chainApi$api$query10, _chainApi$api$query11;
|
|
65
151
|
if ((0, _utilCrypto.isEthereumAddress)(address)) {
|
|
66
152
|
return;
|
|
67
153
|
}
|
|
68
154
|
const chain = chainInfo.slug;
|
|
69
155
|
const chainApi = await substrateApi.isReady;
|
|
70
|
-
const [_ledger, _nominations, _currentEra, _bonded] = await Promise.all([chainApi.api.query.staking
|
|
156
|
+
const [_ledger, _nominations, _currentEra, _bonded, _minimumActiveStake, _minNominatorBond] = await Promise.all([(_chainApi$api$query4 = chainApi.api.query) === null || _chainApi$api$query4 === void 0 ? void 0 : (_chainApi$api$query4$ = _chainApi$api$query4.staking) === null || _chainApi$api$query4$ === void 0 ? void 0 : _chainApi$api$query4$.ledger(address), (_chainApi$api$query5 = chainApi.api.query) === null || _chainApi$api$query5 === void 0 ? void 0 : (_chainApi$api$query5$ = _chainApi$api$query5.staking) === null || _chainApi$api$query5$ === void 0 ? void 0 : _chainApi$api$query5$.nominators(address), (_chainApi$api$query6 = chainApi.api.query) === null || _chainApi$api$query6 === void 0 ? void 0 : (_chainApi$api$query6$ = _chainApi$api$query6.staking) === null || _chainApi$api$query6$ === void 0 ? void 0 : _chainApi$api$query6$.currentEra(), (_chainApi$api$query7 = chainApi.api.query) === null || _chainApi$api$query7 === void 0 ? void 0 : (_chainApi$api$query7$ = _chainApi$api$query7.staking) === null || _chainApi$api$query7$ === void 0 ? void 0 : _chainApi$api$query7$.bonded(address), ((_chainApi$api$query8 = chainApi.api.query) === null || _chainApi$api$query8 === void 0 ? void 0 : (_chainApi$api$query8$ = _chainApi$api$query8.staking) === null || _chainApi$api$query8$ === void 0 ? void 0 : _chainApi$api$query8$.minimumActiveStake) && ((_chainApi$api$query9 = chainApi.api.query) === null || _chainApi$api$query9 === void 0 ? void 0 : (_chainApi$api$query9$ = _chainApi$api$query9.staking) === null || _chainApi$api$query9$ === void 0 ? void 0 : _chainApi$api$query9$.minimumActiveStake()), (_chainApi$api$query10 = chainApi.api.query) === null || _chainApi$api$query10 === void 0 ? void 0 : (_chainApi$api$query11 = _chainApi$api$query10.staking) === null || _chainApi$api$query11 === void 0 ? void 0 : _chainApi$api$query11.minNominatorBond()]);
|
|
157
|
+
const minActiveStake = (_minimumActiveStake === null || _minimumActiveStake === void 0 ? void 0 : _minimumActiveStake.toString()) || '0';
|
|
158
|
+
const minNominatorBond = _minNominatorBond.toString();
|
|
159
|
+
const bnMinActiveStake = new _util.BN(minActiveStake);
|
|
160
|
+
const bnMinNominatorBond = new _util.BN(minNominatorBond);
|
|
161
|
+
const minStake = bnMinActiveStake.gt(bnMinNominatorBond) ? bnMinActiveStake : bnMinNominatorBond;
|
|
71
162
|
const _maxNominatorRewardedPerValidator = chainApi.api.consts.staking.maxNominatorRewardedPerValidator.toString();
|
|
72
163
|
const maxNominatorRewardedPerValidator = parseInt(_maxNominatorRewardedPerValidator);
|
|
73
164
|
const ledger = _ledger.toPrimitive();
|
|
@@ -77,7 +168,6 @@ async function getRelayChainNominatorMetadata(chainInfo, address, substrateApi)
|
|
|
77
168
|
if (!ledger) {
|
|
78
169
|
return;
|
|
79
170
|
}
|
|
80
|
-
let stakingStatus = _KoniTypes.StakingStatus.NOT_EARNING;
|
|
81
171
|
const activeStake = ledger.active.toString();
|
|
82
172
|
const nominationList = [];
|
|
83
173
|
const unstakingList = [];
|
|
@@ -92,7 +182,10 @@ async function getRelayChainNominatorMetadata(chainInfo, address, substrateApi)
|
|
|
92
182
|
const topNominators = eraStaker.others.map(nominator => {
|
|
93
183
|
return nominator.who;
|
|
94
184
|
});
|
|
95
|
-
if (topNominators.
|
|
185
|
+
if (!topNominators.includes((0, _utils3.reformatAddress)(address, (0, _utils2._getChainSubstrateAddressPrefix)(chainInfo)))) {
|
|
186
|
+
// if nominator has target but not in nominator list
|
|
187
|
+
nominationStatus = _KoniTypes.StakingStatus.WAITING;
|
|
188
|
+
} else if (topNominators.slice(0, maxNominatorRewardedPerValidator).includes((0, _utils3.reformatAddress)(address, (0, _utils2._getChainSubstrateAddressPrefix)(chainInfo)))) {
|
|
96
189
|
// if address in top nominators
|
|
97
190
|
nominationStatus = _KoniTypes.StakingStatus.EARNING_REWARD;
|
|
98
191
|
}
|
|
@@ -106,11 +199,20 @@ async function getRelayChainNominatorMetadata(chainInfo, address, substrateApi)
|
|
|
106
199
|
}));
|
|
107
200
|
}
|
|
108
201
|
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
202
|
+
let stakingStatus = _KoniTypes.StakingStatus.NOT_EARNING;
|
|
203
|
+
const bnActiveStake = new _util.BN(activeStake);
|
|
204
|
+
let waitingNominationCount = 0;
|
|
205
|
+
if (bnActiveStake.gte(minStake)) {
|
|
206
|
+
for (const nomination of nominationList) {
|
|
207
|
+
if (nomination.status === _KoniTypes.StakingStatus.EARNING_REWARD) {
|
|
208
|
+
// only need 1 earning nomination to count
|
|
209
|
+
stakingStatus = _KoniTypes.StakingStatus.EARNING_REWARD;
|
|
210
|
+
} else if (nomination.status === _KoniTypes.StakingStatus.WAITING) {
|
|
211
|
+
waitingNominationCount += 1;
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
if (waitingNominationCount === nominationList.length) {
|
|
215
|
+
stakingStatus = _KoniTypes.StakingStatus.WAITING;
|
|
114
216
|
}
|
|
115
217
|
}
|
|
116
218
|
ledger.unlocking.forEach(unlockingChunk => {
|
|
@@ -189,6 +291,10 @@ async function getRelayChainPoolMemberMetadata(chainInfo, address, substrateApi)
|
|
|
189
291
|
waitingTime: waitingTime > 0 ? waitingTime : 0
|
|
190
292
|
});
|
|
191
293
|
});
|
|
294
|
+
const bnActiveStake = new _util.BN(poolMemberInfo.points.toString());
|
|
295
|
+
if (!bnActiveStake.gt(_util.BN_ZERO)) {
|
|
296
|
+
stakingStatus = _KoniTypes.StakingStatus.NOT_EARNING;
|
|
297
|
+
}
|
|
192
298
|
return {
|
|
193
299
|
chain: chainInfo.slug,
|
|
194
300
|
type: _KoniTypes.StakingType.POOLED,
|
|
@@ -249,9 +355,9 @@ async function getRelayValidatorsInfo(chain, substrateApi, decimals, chainStakin
|
|
|
249
355
|
}
|
|
250
356
|
const extraInfoMap = {};
|
|
251
357
|
await Promise.all(allValidators.map(async address => {
|
|
252
|
-
var _chainApi$api$
|
|
358
|
+
var _chainApi$api$query12, _chainApi$api$query13, _identityInfo$judgeme;
|
|
253
359
|
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
|
|
254
|
-
const [_commissionInfo, _identityInfo] = await Promise.all([chainApi.api.query.staking.validators(address), (_chainApi$api$
|
|
360
|
+
const [_commissionInfo, _identityInfo] = await Promise.all([chainApi.api.query.staking.validators(address), (_chainApi$api$query12 = chainApi.api.query) === null || _chainApi$api$query12 === void 0 ? void 0 : (_chainApi$api$query13 = _chainApi$api$query12.identity) === null || _chainApi$api$query13 === void 0 ? void 0 : _chainApi$api$query13.identityOf(address)]);
|
|
255
361
|
const commissionInfo = _commissionInfo.toHuman();
|
|
256
362
|
const identityInfo = _identityInfo ? _identityInfo.toHuman() : null;
|
|
257
363
|
let identity;
|
|
@@ -16,6 +16,7 @@ exports.getInflationParams = getInflationParams;
|
|
|
16
16
|
exports.getParaCurrentInflation = getParaCurrentInflation;
|
|
17
17
|
exports.getStakingAvailableActionsByChain = getStakingAvailableActionsByChain;
|
|
18
18
|
exports.getStakingAvailableActionsByNominator = getStakingAvailableActionsByNominator;
|
|
19
|
+
exports.getStakingStatusByNominations = getStakingStatusByNominations;
|
|
19
20
|
exports.getWithdrawalInfo = getWithdrawalInfo;
|
|
20
21
|
exports.isActionFromValidator = isActionFromValidator;
|
|
21
22
|
exports.isShowNominationByValidator = isShowNominationByValidator;
|
|
@@ -150,11 +151,8 @@ function getBondedValidators(nominations) {
|
|
|
150
151
|
const bondedValidators = [];
|
|
151
152
|
let nominationCount = 0;
|
|
152
153
|
for (const nomination of nominations) {
|
|
153
|
-
|
|
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
|
}
|