@subwallet/extension-base 1.0.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 +25 -36
- package/background/KoniTypes.js +12 -7
- package/background/errors/TransactionError.js +21 -1
- package/cjs/background/KoniTypes.js +14 -8
- package/cjs/background/errors/TransactionError.js +20 -0
- package/cjs/constants/index.js +13 -28
- package/cjs/koni/api/dotsama/balance.js +60 -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 +18 -10
- package/cjs/koni/api/staking/bonding/astar.js +37 -238
- package/cjs/koni/api/staking/bonding/index.js +26 -14
- package/cjs/koni/api/staking/bonding/paraChain.js +100 -11
- package/cjs/koni/api/staking/bonding/relayChain.js +174 -16
- package/cjs/koni/api/staking/bonding/utils.js +55 -10
- 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/index.js +0 -111
- package/cjs/koni/api/xcm/polkadotXcm.js +2 -2
- package/cjs/koni/api/xcm/utils.js +18 -13
- package/cjs/koni/api/xcm/xTokens.js +3 -5
- package/cjs/koni/api/xcm/xcmPallet.js +9 -6
- package/cjs/koni/background/cron.js +179 -77
- package/cjs/koni/background/handlers/Extension.js +231 -195
- package/cjs/koni/background/handlers/State.js +147 -111
- package/cjs/koni/background/handlers/Tabs.js +48 -39
- package/cjs/koni/background/subscription.js +64 -56
- package/cjs/packageInfo.js +1 -1
- package/cjs/page/index.js +5 -0
- package/cjs/services/chain-service/constants.js +1 -11
- 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 +39 -6
- package/cjs/services/chain-service/utils.js +4 -0
- package/cjs/services/event-service/index.js +75 -0
- package/cjs/services/event-service/types.js +11 -0
- package/cjs/services/history-service/index.js +46 -21
- package/cjs/services/history-service/subsquid-multi-chain-history.js +19 -11
- package/cjs/services/keyring-service/index.js +101 -0
- package/cjs/services/migration-service/index.js +13 -10
- package/cjs/{koni/migration/scripts/RemoveWrongCrowdloan.js → services/migration-service/scripts/AutoEnableChainsTokens.js} +11 -6
- package/cjs/services/migration-service/scripts/MigrateNetworkSettings.js +39 -19
- package/cjs/services/migration-service/scripts/MigrateSettings.js +31 -0
- package/cjs/services/migration-service/scripts/MigrateTransactionHistory.js +72 -0
- package/cjs/services/migration-service/scripts/index.js +13 -4
- package/cjs/services/price-service/coingecko.js +15 -3
- package/cjs/services/price-service/index.js +15 -18
- package/cjs/services/request-service/constants.js +8 -2
- package/cjs/services/request-service/handler/AuthRequestHandler.js +43 -12
- package/cjs/services/request-service/index.js +3 -0
- package/cjs/services/storage-service/DatabaseService.js +53 -34
- package/cjs/services/storage-service/databases/index.js +1 -1
- package/cjs/services/storage-service/db-stores/BaseStoreWithAddressAndChain.js +2 -8
- package/cjs/services/storage-service/db-stores/Nft.js +8 -18
- package/cjs/services/storage-service/db-stores/Transaction.js +10 -7
- package/cjs/services/subscan-service/index.js +107 -0
- package/cjs/services/subscan-service/subscan-chain-map.js +74 -0
- package/cjs/services/subscan-service/types.js +1 -0
- package/cjs/services/transaction-service/event-parser/index.js +20 -48
- package/cjs/services/transaction-service/index.js +66 -22
- package/cjs/services/transaction-service/utils.js +4 -6
- package/cjs/utils/address.js +9 -1
- package/cjs/utils/index.js +30 -26
- package/constants/index.d.ts +8 -13
- package/constants/index.js +8 -13
- package/koni/api/dotsama/balance.d.ts +0 -1
- package/koni/api/dotsama/balance.js +33 -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 +1 -2
- package/koni/api/staking/bonding/amplitude.js +22 -13
- package/koni/api/staking/bonding/astar.d.ts +2 -11
- package/koni/api/staking/bonding/astar.js +39 -231
- package/koni/api/staking/bonding/index.d.ts +5 -2
- package/koni/api/staking/bonding/index.js +27 -17
- package/koni/api/staking/bonding/paraChain.d.ts +4 -1
- package/koni/api/staking/bonding/paraChain.js +101 -14
- package/koni/api/staking/bonding/relayChain.d.ts +6 -2
- package/koni/api/staking/bonding/relayChain.js +172 -17
- package/koni/api/staking/bonding/utils.d.ts +15 -2
- package/koni/api/staking/bonding/utils.js +53 -11
- 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/index.js +1 -112
- package/koni/api/xcm/polkadotXcm.js +3 -3
- package/koni/api/xcm/utils.d.ts +5 -6
- package/koni/api/xcm/utils.js +15 -10
- package/koni/api/xcm/xTokens.js +5 -7
- package/koni/api/xcm/xcmPallet.js +10 -9
- package/koni/background/cron.d.ts +6 -1
- package/koni/background/cron.js +179 -76
- package/koni/background/handlers/Extension.d.ts +2 -2
- package/koni/background/handlers/Extension.js +161 -125
- package/koni/background/handlers/State.d.ts +21 -20
- package/koni/background/handlers/State.js +144 -111
- package/koni/background/handlers/Tabs.js +30 -20
- package/koni/background/subscription.d.ts +1 -1
- package/koni/background/subscription.js +64 -58
- package/package.json +63 -18
- package/packageInfo.js +1 -1
- package/page/index.d.ts +2 -0
- package/page/index.js +4 -0
- package/services/chain-service/constants.d.ts +0 -1
- package/services/chain-service/constants.js +0 -9
- 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.d.ts +6 -4
- package/services/chain-service/index.js +40 -9
- package/services/chain-service/utils.d.ts +1 -0
- package/services/chain-service/utils.js +3 -0
- package/services/event-service/index.d.ts +22 -0
- package/services/event-service/index.js +63 -0
- package/services/event-service/types.d.ts +28 -0
- package/services/event-service/types.js +4 -0
- package/services/history-service/index.d.ts +5 -3
- package/services/history-service/index.js +46 -21
- package/services/history-service/subsquid-multi-chain-history.js +22 -13
- package/services/keyring-service/index.d.ts +19 -0
- package/services/keyring-service/index.js +93 -0
- package/services/migration-service/index.js +11 -9
- package/services/migration-service/scripts/AutoEnableChainsTokens.d.ts +4 -0
- package/services/migration-service/scripts/AutoEnableChainsTokens.js +13 -0
- package/services/migration-service/scripts/MigrateNetworkSettings.js +37 -18
- package/services/migration-service/scripts/MigrateSettings.d.ts +4 -0
- package/services/migration-service/scripts/MigrateSettings.js +23 -0
- package/services/migration-service/scripts/MigrateTransactionHistory.d.ts +4 -0
- package/services/migration-service/scripts/MigrateTransactionHistory.js +64 -0
- package/services/migration-service/scripts/index.d.ts +1 -0
- package/services/migration-service/scripts/index.js +10 -3
- package/services/price-service/coingecko.js +15 -3
- package/services/price-service/index.d.ts +5 -3
- package/services/price-service/index.js +15 -18
- package/services/request-service/constants.d.ts +1 -0
- package/services/request-service/constants.js +6 -1
- package/services/request-service/handler/AuthRequestHandler.d.ts +8 -1
- package/services/request-service/handler/AuthRequestHandler.js +44 -13
- package/services/request-service/index.d.ts +7 -1
- package/services/request-service/index.js +3 -0
- package/services/storage-service/DatabaseService.d.ts +1 -0
- package/services/storage-service/DatabaseService.js +53 -34
- package/services/storage-service/databases/index.js +1 -1
- package/services/storage-service/db-stores/BaseStoreWithAddressAndChain.d.ts +1 -1
- package/services/storage-service/db-stores/BaseStoreWithAddressAndChain.js +2 -8
- package/services/storage-service/db-stores/Nft.d.ts +3 -3
- package/services/storage-service/db-stores/Nft.js +8 -17
- package/services/storage-service/db-stores/Transaction.js +10 -7
- package/services/subscan-service/index.d.ts +20 -0
- package/services/subscan-service/index.js +99 -0
- package/services/subscan-service/subscan-chain-map.d.ts +5 -0
- package/services/subscan-service/subscan-chain-map.js +63 -0
- package/services/subscan-service/types.d.ts +27 -0
- package/services/subscan-service/types.js +1 -0
- package/services/transaction-service/event-parser/index.d.ts +2 -2
- package/services/transaction-service/event-parser/index.js +21 -49
- package/services/transaction-service/index.d.ts +4 -2
- package/services/transaction-service/index.js +66 -22
- package/services/transaction-service/utils.js +5 -6
- package/utils/address.d.ts +1 -0
- package/utils/address.js +9 -2
- package/utils/index.d.ts +2 -1
- package/utils/index.js +26 -23
- package/cjs/background/errors/EvmRpcError.js +0 -21
- package/cjs/background/errors/SubWalletProviderError.js +0 -17
- package/cjs/constants/ethereum.js +0 -19
- package/cjs/errors/SubWalletProviderError.js +0 -17
- package/cjs/koni/api/xcm/astar.js +0 -160
- package/cjs/koni/api/xcm/moonbeamXcm.js +0 -80
- package/cjs/koni/api/xcm/statemintXcm.js +0 -197
- package/cjs/koni/api/xcm/substrateXcm.js +0 -213
- package/cjs/koni/migration/Base.js +0 -20
- package/cjs/koni/migration/index.js +0 -45
- package/cjs/koni/migration/scripts/ChangeRouteToHome.js +0 -22
- package/cjs/koni/migration/scripts/ClearOldStorage.js +0 -24
- package/cjs/koni/migration/scripts/RemoveWrongTransactionHistoriesFromStore.js +0 -36
- package/cjs/koni/migration/scripts/ResetTransactionHistoryEventIdx.js +0 -21
- package/cjs/koni/migration/scripts/index.js +0 -22
- package/cjs/koni/page/index.js +0 -16
- package/cjs/services/asset-service/index.js +0 -91
- package/cjs/services/storage-service/db-stores/ExtraDelegationInfo.js +0 -17
- package/cjs/stores/Balance.js +0 -18
- package/cjs/stores/Crowdloan.js +0 -18
- package/cjs/stores/CustomEvmToken.js +0 -18
- package/cjs/stores/NetworkMap.js +0 -18
- package/cjs/stores/Nft.js +0 -18
- package/cjs/stores/NftCollection.js +0 -18
- package/cjs/stores/Price.js +0 -18
- package/cjs/stores/Staking.js +0 -18
- package/cjs/stores/StakingReward.js +0 -18
- package/cjs/utils/eth/parseTransactionData.js +0 -284
- package/koni/page/index.d.ts +0 -2
- package/koni/page/index.js +0 -9
- /package/cjs/{koni/page → page}/SubWalleEvmProvider.js +0 -0
- /package/{koni/page → page}/SubWalleEvmProvider.d.ts +0 -0
- /package/{koni/page → page}/SubWalleEvmProvider.js +0 -0
|
@@ -5,25 +5,15 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
value: true
|
|
6
6
|
});
|
|
7
7
|
exports.getAstarBondingExtrinsic = getAstarBondingExtrinsic;
|
|
8
|
-
exports.getAstarBondingTxInfo = getAstarBondingTxInfo;
|
|
9
8
|
exports.getAstarClaimRewardExtrinsic = getAstarClaimRewardExtrinsic;
|
|
10
|
-
exports.getAstarClaimRewardTxInfo = getAstarClaimRewardTxInfo;
|
|
11
9
|
exports.getAstarDappsInfo = getAstarDappsInfo;
|
|
12
10
|
exports.getAstarNominatorMetadata = getAstarNominatorMetadata;
|
|
13
11
|
exports.getAstarStakingMetadata = getAstarStakingMetadata;
|
|
14
12
|
exports.getAstarUnbondingExtrinsic = getAstarUnbondingExtrinsic;
|
|
15
|
-
exports.getAstarUnbondingTxInfo = getAstarUnbondingTxInfo;
|
|
16
13
|
exports.getAstarWithdrawalExtrinsic = getAstarWithdrawalExtrinsic;
|
|
17
|
-
exports.getAstarWithdrawalTxInfo = getAstarWithdrawalTxInfo;
|
|
18
|
-
exports.handleAstarBondingTxInfo = handleAstarBondingTxInfo;
|
|
19
|
-
exports.handleAstarClaimRewardTxInfo = handleAstarClaimRewardTxInfo;
|
|
20
|
-
exports.handleAstarUnbondingTxInfo = handleAstarUnbondingTxInfo;
|
|
21
|
-
exports.handleAstarUnlockingInfo = handleAstarUnlockingInfo;
|
|
22
|
-
exports.handleAstarWithdrawalTxInfo = handleAstarWithdrawalTxInfo;
|
|
23
14
|
var _KoniTypes = require("@subwallet/extension-base/background/KoniTypes");
|
|
24
|
-
var
|
|
15
|
+
var _utils = require("@subwallet/extension-base/koni/api/staking/bonding/utils");
|
|
25
16
|
var _constants = require("@subwallet/extension-base/services/chain-service/constants");
|
|
26
|
-
var _utils = require("@subwallet/extension-base/services/chain-service/utils");
|
|
27
17
|
var _utils2 = require("@subwallet/extension-base/utils");
|
|
28
18
|
var _crossFetch = _interopRequireDefault(require("cross-fetch"));
|
|
29
19
|
var _util = require("@polkadot/util");
|
|
@@ -84,6 +74,7 @@ async function getAstarNominatorMetadata(chainInfo, address, substrateApi) {
|
|
|
84
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)]);
|
|
85
75
|
const ledger = _ledger.toPrimitive();
|
|
86
76
|
const currentEra = _era.toString();
|
|
77
|
+
const minDelegatorStake = chainApi.api.consts.dappsStaking.minimumStakingAmount.toString();
|
|
87
78
|
let bnTotalActiveStake = _util.BN_ZERO;
|
|
88
79
|
if (_stakerInfo.length > 0) {
|
|
89
80
|
const dAppInfoMap = {};
|
|
@@ -100,11 +91,13 @@ async function getAstarNominatorMetadata(chainInfo, address, substrateApi) {
|
|
|
100
91
|
const currentStake = stakeList.slice(-1)[0].staked.toString() || '0';
|
|
101
92
|
const bnCurrentStake = new _util.BN(currentStake);
|
|
102
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;
|
|
103
95
|
bnTotalActiveStake = bnTotalActiveStake.add(bnCurrentStake);
|
|
104
96
|
const dappInfo = dAppInfoMap[dappAddress];
|
|
105
97
|
nominationList.push({
|
|
98
|
+
status: dappStakingStatus,
|
|
106
99
|
chain,
|
|
107
|
-
validatorAddress: dappAddress,
|
|
100
|
+
validatorAddress: dappAddress.toLowerCase(),
|
|
108
101
|
activeStake: currentStake,
|
|
109
102
|
validatorMinStake: '0',
|
|
110
103
|
validatorIdentity: dappInfo === null || dappInfo === void 0 ? void 0 : dappInfo.name,
|
|
@@ -131,13 +124,15 @@ async function getAstarNominatorMetadata(chainInfo, address, substrateApi) {
|
|
|
131
124
|
if (nominationList.length === 0 && unstakingList.length === 0) {
|
|
132
125
|
return;
|
|
133
126
|
}
|
|
127
|
+
const stakingStatus = (0, _utils.getStakingStatusByNominations)(bnTotalActiveStake, nominationList);
|
|
134
128
|
return {
|
|
135
129
|
chain,
|
|
136
130
|
type: _KoniTypes.StakingType.NOMINATED,
|
|
137
131
|
address: address,
|
|
138
132
|
activeStake: bnTotalActiveStake.toString(),
|
|
139
133
|
nominations: nominationList,
|
|
140
|
-
unstakings: unstakingList
|
|
134
|
+
unstakings: unstakingList,
|
|
135
|
+
status: stakingStatus
|
|
141
136
|
};
|
|
142
137
|
}
|
|
143
138
|
async function getAstarDappsInfo(networkKey, substrateApi) {
|
|
@@ -159,21 +154,26 @@ async function getAstarDappsInfo(networkKey, substrateApi) {
|
|
|
159
154
|
const dappName = dapp.name;
|
|
160
155
|
const dappAddress = dapp.address;
|
|
161
156
|
const dappIcon = (0, _utils2.isUrl)(dapp.iconUrl) ? dapp.iconUrl : undefined;
|
|
162
|
-
const
|
|
157
|
+
const contractParam = (0, _utilCrypto.isEthereumAddress)(dappAddress) ? {
|
|
163
158
|
Evm: dappAddress
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
|
|
159
|
+
} : {
|
|
160
|
+
Wasm: dappAddress
|
|
161
|
+
};
|
|
162
|
+
const _contractInfo = await chainApi.api.query.dappsStaking.contractEraStake(contractParam, era);
|
|
163
|
+
const contractInfo = _contractInfo.toPrimitive();
|
|
164
|
+
let totalStake = '0';
|
|
167
165
|
let stakerCount = 0;
|
|
168
166
|
if (contractInfo !== null) {
|
|
169
|
-
|
|
170
|
-
|
|
167
|
+
var _contractInfo$total;
|
|
168
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access,@typescript-eslint/no-unsafe-assignment
|
|
169
|
+
totalStake = contractInfo === null || contractInfo === void 0 ? void 0 : (_contractInfo$total = contractInfo.total) === null || _contractInfo$total === void 0 ? void 0 : _contractInfo$total.toString();
|
|
170
|
+
stakerCount = contractInfo.numberOfStakers;
|
|
171
171
|
}
|
|
172
172
|
allDappsInfo.push({
|
|
173
173
|
commission: 0,
|
|
174
174
|
expectedReturn: 0,
|
|
175
|
-
address: dappAddress,
|
|
176
|
-
totalStake: totalStake
|
|
175
|
+
address: dappAddress.toLowerCase(),
|
|
176
|
+
totalStake: totalStake,
|
|
177
177
|
ownStake: '0',
|
|
178
178
|
otherStake: totalStake.toString(),
|
|
179
179
|
nominatorCount: stakerCount,
|
|
@@ -188,172 +188,31 @@ async function getAstarDappsInfo(networkKey, substrateApi) {
|
|
|
188
188
|
}));
|
|
189
189
|
return allDappsInfo;
|
|
190
190
|
}
|
|
191
|
-
async function getAstarBondingTxInfo(chainInfo, substrateApi, stakerAddress, amount, dappInfo) {
|
|
192
|
-
const apiPromise = await substrateApi.isReady;
|
|
193
|
-
const {
|
|
194
|
-
decimals
|
|
195
|
-
} = (0, _utils._getChainNativeTokenBasicInfo)(chainInfo);
|
|
196
|
-
const parsedAmount = amount * 10 ** decimals;
|
|
197
|
-
const binaryAmount = new _util.BN(parsedAmount.toString());
|
|
198
|
-
const extrinsic = apiPromise.api.tx.dappsStaking.bondAndStake({
|
|
199
|
-
Evm: dappInfo.address
|
|
200
|
-
}, binaryAmount);
|
|
201
|
-
return extrinsic.paymentInfo(stakerAddress);
|
|
202
|
-
}
|
|
203
|
-
async function handleAstarBondingTxInfo(chainInfo, amount, networkKey, stakerAddress, dappInfo, substrateApiMap, evmApiMap) {
|
|
204
|
-
const {
|
|
205
|
-
decimals,
|
|
206
|
-
symbol
|
|
207
|
-
} = (0, _utils._getChainNativeTokenBasicInfo)(chainInfo);
|
|
208
|
-
try {
|
|
209
|
-
const [txInfo, balance] = await Promise.all([getAstarBondingTxInfo(chainInfo, substrateApiMap[networkKey], stakerAddress, amount, dappInfo), (0, _balance.getFreeBalance)(networkKey, stakerAddress, substrateApiMap, evmApiMap)]);
|
|
210
|
-
const feeString = (0, _utils2.parseNumberToDisplay)(txInfo.partialFee, decimals) + ` ${symbol}`;
|
|
211
|
-
const rawFee = (0, _utils2.parseRawNumber)(txInfo.partialFee.toString());
|
|
212
|
-
const binaryBalance = new _util.BN(balance);
|
|
213
|
-
const sumAmount = txInfo.partialFee.addn(amount);
|
|
214
|
-
const balanceError = sumAmount.gt(binaryBalance);
|
|
215
|
-
return {
|
|
216
|
-
rawFee,
|
|
217
|
-
fee: feeString,
|
|
218
|
-
balanceError
|
|
219
|
-
};
|
|
220
|
-
} catch (e) {
|
|
221
|
-
return {
|
|
222
|
-
fee: `0.0000 ${symbol}`,
|
|
223
|
-
balanceError: false
|
|
224
|
-
};
|
|
225
|
-
}
|
|
226
|
-
}
|
|
227
191
|
async function getAstarBondingExtrinsic(substrateApi, amount, dappInfo) {
|
|
228
192
|
const chainApi = await substrateApi.isReady;
|
|
229
193
|
const binaryAmount = new _util.BN(amount);
|
|
230
|
-
|
|
194
|
+
const dappParam = (0, _utilCrypto.isEthereumAddress)(dappInfo.address) ? {
|
|
231
195
|
Evm: dappInfo.address
|
|
232
|
-
}
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
const {
|
|
237
|
-
decimals
|
|
238
|
-
} = (0, _utils._getChainNativeTokenBasicInfo)(chainInfo);
|
|
239
|
-
const parsedAmount = amount * 10 ** decimals;
|
|
240
|
-
const binaryAmount = new _util.BN(parsedAmount.toString());
|
|
241
|
-
const extrinsic = apiPromise.api.tx.dappsStaking.unbondAndUnstake({
|
|
242
|
-
Evm: dappAddress
|
|
243
|
-
}, binaryAmount);
|
|
244
|
-
return extrinsic.paymentInfo(stakerAddress);
|
|
245
|
-
}
|
|
246
|
-
async function handleAstarUnbondingTxInfo(chainInfo, amount, networkKey, stakerAddress, dappAddress, substrateApiMap, evmApiMap) {
|
|
247
|
-
const {
|
|
248
|
-
decimals,
|
|
249
|
-
symbol
|
|
250
|
-
} = (0, _utils._getChainNativeTokenBasicInfo)(chainInfo);
|
|
251
|
-
try {
|
|
252
|
-
const [txInfo, balance] = await Promise.all([getAstarUnbondingTxInfo(chainInfo, substrateApiMap[networkKey], stakerAddress, amount, dappAddress), (0, _balance.getFreeBalance)(networkKey, stakerAddress, substrateApiMap, evmApiMap)]);
|
|
253
|
-
const feeString = (0, _utils2.parseNumberToDisplay)(txInfo.partialFee, decimals) + ` ${symbol}`;
|
|
254
|
-
const rawFee = (0, _utils2.parseRawNumber)(txInfo.partialFee.toString());
|
|
255
|
-
const binaryBalance = new _util.BN(balance);
|
|
256
|
-
const balanceError = txInfo.partialFee.gt(binaryBalance);
|
|
257
|
-
return {
|
|
258
|
-
rawFee,
|
|
259
|
-
fee: feeString,
|
|
260
|
-
balanceError
|
|
261
|
-
};
|
|
262
|
-
} catch (e) {
|
|
263
|
-
return {
|
|
264
|
-
fee: `0.0000 ${symbol}`,
|
|
265
|
-
balanceError: false
|
|
266
|
-
};
|
|
267
|
-
}
|
|
196
|
+
} : {
|
|
197
|
+
Wasm: dappInfo.address
|
|
198
|
+
};
|
|
199
|
+
return chainApi.api.tx.dappsStaking.bondAndStake(dappParam, binaryAmount);
|
|
268
200
|
}
|
|
269
201
|
async function getAstarUnbondingExtrinsic(substrateApi, amount, dappAddress) {
|
|
270
202
|
const apiPromise = await substrateApi.isReady;
|
|
271
203
|
const binaryAmount = new _util.BN(amount);
|
|
272
|
-
|
|
204
|
+
const dappParam = (0, _utilCrypto.isEthereumAddress)(dappAddress) ? {
|
|
273
205
|
Evm: dappAddress
|
|
274
|
-
}
|
|
275
|
-
|
|
276
|
-
async function getAstarUnlockingInfo(substrateApi, address, networkKey) {
|
|
277
|
-
const chainApi = await substrateApi.isReady;
|
|
278
|
-
const [_stakingInfo, _era] = await Promise.all([chainApi.api.query.dappsStaking.ledger(address), chainApi.api.query.dappsStaking.currentEra()]);
|
|
279
|
-
const currentEra = (0, _utils2.parseRawNumber)(_era.toHuman());
|
|
280
|
-
const stakingInfo = _stakingInfo.toHuman();
|
|
281
|
-
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
|
|
282
|
-
const unlockingChunks = stakingInfo.unbondingInfo.unlockingChunks;
|
|
283
|
-
let nextWithdrawalEra = -1;
|
|
284
|
-
let nextWithdrawalAmount = 0;
|
|
285
|
-
let redeemable = 0;
|
|
286
|
-
for (const chunk of unlockingChunks) {
|
|
287
|
-
const unlockEra = (0, _utils2.parseRawNumber)(chunk.unlockEra);
|
|
288
|
-
const amount = (0, _utils2.parseRawNumber)(chunk.amount);
|
|
289
|
-
|
|
290
|
-
// Find next withdrawal
|
|
291
|
-
if (nextWithdrawalEra === -1) {
|
|
292
|
-
nextWithdrawalEra = unlockEra;
|
|
293
|
-
nextWithdrawalAmount = amount;
|
|
294
|
-
} else if (unlockEra <= nextWithdrawalEra) {
|
|
295
|
-
nextWithdrawalEra = unlockEra;
|
|
296
|
-
nextWithdrawalAmount += amount;
|
|
297
|
-
}
|
|
298
|
-
|
|
299
|
-
// Find redeemable
|
|
300
|
-
if (unlockEra - currentEra <= 0) {
|
|
301
|
-
redeemable += amount;
|
|
302
|
-
}
|
|
303
|
-
}
|
|
304
|
-
const nextWithdrawal = (nextWithdrawalEra - currentEra) * _constants._STAKING_ERA_LENGTH_MAP[networkKey];
|
|
305
|
-
return {
|
|
306
|
-
nextWithdrawal,
|
|
307
|
-
nextWithdrawalAmount,
|
|
308
|
-
redeemable
|
|
309
|
-
};
|
|
310
|
-
}
|
|
311
|
-
async function handleAstarUnlockingInfo(substrateApi, chainInfo, networkKey, address, type) {
|
|
312
|
-
const {
|
|
313
|
-
nextWithdrawal,
|
|
314
|
-
nextWithdrawalAmount,
|
|
315
|
-
redeemable
|
|
316
|
-
} = await getAstarUnlockingInfo(substrateApi, address, networkKey);
|
|
317
|
-
const {
|
|
318
|
-
decimals
|
|
319
|
-
} = (0, _utils._getChainNativeTokenBasicInfo)(chainInfo);
|
|
320
|
-
const parsedRedeemable = redeemable / 10 ** decimals;
|
|
321
|
-
const parsedNextWithdrawalAmount = nextWithdrawalAmount / 10 ** decimals;
|
|
322
|
-
return {
|
|
323
|
-
address,
|
|
324
|
-
type,
|
|
325
|
-
chain: networkKey,
|
|
326
|
-
nextWithdrawal: nextWithdrawal,
|
|
327
|
-
redeemable: parsedRedeemable,
|
|
328
|
-
nextWithdrawalAmount: parsedNextWithdrawalAmount
|
|
329
|
-
};
|
|
330
|
-
}
|
|
331
|
-
async function getAstarWithdrawalTxInfo(substrateApi, address) {
|
|
332
|
-
const apiPromise = await substrateApi.isReady;
|
|
333
|
-
const extrinsic = apiPromise.api.tx.dappsStaking.withdrawUnbonded();
|
|
334
|
-
return extrinsic.paymentInfo(address);
|
|
335
|
-
}
|
|
336
|
-
async function handleAstarWithdrawalTxInfo(networkKey, chainInfo, substrateApiMap, evmApiMap, address) {
|
|
337
|
-
const [txInfo, balance] = await Promise.all([getAstarWithdrawalTxInfo(substrateApiMap[networkKey], address), (0, _balance.getFreeBalance)(networkKey, address, substrateApiMap, evmApiMap)]);
|
|
338
|
-
const {
|
|
339
|
-
decimals,
|
|
340
|
-
symbol
|
|
341
|
-
} = (0, _utils._getChainNativeTokenBasicInfo)(chainInfo);
|
|
342
|
-
const feeString = (0, _utils2.parseNumberToDisplay)(txInfo.partialFee, decimals) + ` ${symbol}`;
|
|
343
|
-
const rawFee = (0, _utils2.parseRawNumber)(txInfo.partialFee.toString());
|
|
344
|
-
const binaryBalance = new _util.BN(balance);
|
|
345
|
-
const balanceError = txInfo.partialFee.gt(binaryBalance);
|
|
346
|
-
return {
|
|
347
|
-
rawFee,
|
|
348
|
-
fee: feeString,
|
|
349
|
-
balanceError
|
|
206
|
+
} : {
|
|
207
|
+
Wasm: dappAddress
|
|
350
208
|
};
|
|
209
|
+
return apiPromise.api.tx.dappsStaking.unbondAndUnstake(dappParam, binaryAmount);
|
|
351
210
|
}
|
|
352
211
|
async function getAstarWithdrawalExtrinsic(substrateApi) {
|
|
353
212
|
const chainApi = await substrateApi.isReady;
|
|
354
213
|
return chainApi.api.tx.dappsStaking.withdrawUnbonded();
|
|
355
214
|
}
|
|
356
|
-
async function
|
|
215
|
+
async function getAstarClaimRewardExtrinsic(substrateApi, address) {
|
|
357
216
|
const apiPromise = await substrateApi.isReady;
|
|
358
217
|
const [_stakedDapps, _currentEra] = await Promise.all([apiPromise.api.query.dappsStaking.generalStakerInfo.entries(address), apiPromise.api.query.dappsStaking.currentEra()]);
|
|
359
218
|
const currentEra = (0, _utils2.parseRawNumber)(_currentEra.toHuman());
|
|
@@ -365,6 +224,7 @@ async function getAstarClaimRewardTxInfo(substrateApi, address) {
|
|
|
365
224
|
const stakes = stakeData.stakes;
|
|
366
225
|
const dappAddress = stakedDapp.Evm.toLowerCase();
|
|
367
226
|
let numberOfUnclaimedEra = 0;
|
|
227
|
+
const maxTx = 50;
|
|
368
228
|
for (let i = 0; i < stakes.length; i++) {
|
|
369
229
|
var _stakes;
|
|
370
230
|
const {
|
|
@@ -382,74 +242,13 @@ async function getAstarClaimRewardTxInfo(substrateApi, address) {
|
|
|
382
242
|
const eraToClaim = isLastEra ? currentEra - parsedEra : nextEra - parsedEra;
|
|
383
243
|
numberOfUnclaimedEra += eraToClaim;
|
|
384
244
|
}
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
transactions.push(tx);
|
|
390
|
-
}
|
|
391
|
-
}
|
|
392
|
-
console.log('no of tx: ', transactions.length);
|
|
393
|
-
const extrinsic = apiPromise.api.tx.utility.batch(transactions);
|
|
394
|
-
return extrinsic.paymentInfo(address);
|
|
395
|
-
}
|
|
396
|
-
async function handleAstarClaimRewardTxInfo(address, networkKey, chainInfo, substrateApiMap, evmApiMap) {
|
|
397
|
-
const {
|
|
398
|
-
decimals,
|
|
399
|
-
symbol
|
|
400
|
-
} = (0, _utils._getChainNativeTokenBasicInfo)(chainInfo);
|
|
401
|
-
try {
|
|
402
|
-
const [txInfo, balance] = await Promise.all([getAstarClaimRewardTxInfo(substrateApiMap[networkKey], address), (0, _balance.getFreeBalance)(networkKey, address, substrateApiMap, evmApiMap)]);
|
|
403
|
-
const feeString = (0, _utils2.parseNumberToDisplay)(txInfo.partialFee, decimals) + ` ${symbol}`;
|
|
404
|
-
const rawFee = (0, _utils2.parseRawNumber)(txInfo.partialFee.toString());
|
|
405
|
-
const binaryBalance = new _util.BN(balance);
|
|
406
|
-
const balanceError = txInfo.partialFee.gt(binaryBalance);
|
|
407
|
-
return {
|
|
408
|
-
rawFee,
|
|
409
|
-
fee: feeString,
|
|
410
|
-
balanceError
|
|
411
|
-
};
|
|
412
|
-
} catch (e) {
|
|
413
|
-
return {
|
|
414
|
-
fee: `0.0000 ${symbol}`,
|
|
415
|
-
balanceError: false
|
|
245
|
+
const dappParam = (0, _utilCrypto.isEthereumAddress)(dappAddress) ? {
|
|
246
|
+
Evm: dappAddress
|
|
247
|
+
} : {
|
|
248
|
+
Wasm: dappAddress
|
|
416
249
|
};
|
|
417
|
-
}
|
|
418
|
-
}
|
|
419
|
-
async function getAstarClaimRewardExtrinsic(substrateApi, address) {
|
|
420
|
-
const apiPromise = await substrateApi.isReady;
|
|
421
|
-
const [_stakedDapps, _currentEra] = await Promise.all([apiPromise.api.query.dappsStaking.generalStakerInfo.entries(address), apiPromise.api.query.dappsStaking.currentEra()]);
|
|
422
|
-
const currentEra = (0, _utils2.parseRawNumber)(_currentEra.toHuman());
|
|
423
|
-
const transactions = [];
|
|
424
|
-
for (const item of _stakedDapps) {
|
|
425
|
-
const data = item[0].toHuman();
|
|
426
|
-
const stakedDapp = data[1];
|
|
427
|
-
const stakeData = item[1].toHuman();
|
|
428
|
-
const stakes = stakeData.stakes;
|
|
429
|
-
const dappAddress = stakedDapp.Evm.toLowerCase();
|
|
430
|
-
let numberOfUnclaimedEra = 0;
|
|
431
|
-
const maxTx = 50;
|
|
432
|
-
for (let i = 0; i < stakes.length; i++) {
|
|
433
|
-
var _stakes2;
|
|
434
|
-
const {
|
|
435
|
-
era,
|
|
436
|
-
staked
|
|
437
|
-
} = stakes[i];
|
|
438
|
-
const bnStaked = new _util.BN(staked.replaceAll(',', ''));
|
|
439
|
-
const parsedEra = (0, _utils2.parseRawNumber)(era);
|
|
440
|
-
if (bnStaked.eq(new _util.BN(0))) {
|
|
441
|
-
continue;
|
|
442
|
-
}
|
|
443
|
-
const nextEraData = (_stakes2 = stakes[i + 1]) !== null && _stakes2 !== void 0 ? _stakes2 : null;
|
|
444
|
-
const nextEra = nextEraData && (0, _utils2.parseRawNumber)(nextEraData.era);
|
|
445
|
-
const isLastEra = i === stakes.length - 1;
|
|
446
|
-
const eraToClaim = isLastEra ? currentEra - parsedEra : nextEra - parsedEra;
|
|
447
|
-
numberOfUnclaimedEra += eraToClaim;
|
|
448
|
-
}
|
|
449
250
|
for (let i = 0; i < Math.min(numberOfUnclaimedEra, maxTx); i++) {
|
|
450
|
-
const tx = apiPromise.api.tx.dappsStaking.claimStaker(
|
|
451
|
-
Evm: dappAddress
|
|
452
|
-
});
|
|
251
|
+
const tx = apiPromise.api.tx.dappsStaking.claimStaker(dappParam);
|
|
453
252
|
transactions.push(tx);
|
|
454
253
|
}
|
|
455
254
|
}
|
|
@@ -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)) {
|
|
@@ -56,15 +70,15 @@ async function getValidatorsInfo(networkKey, substrateApi, decimals, chainStakin
|
|
|
56
70
|
async function getNominationPoolsInfo(chain, substrateApi) {
|
|
57
71
|
return (0, _relayChain.getRelayPoolsInfo)(chain, substrateApi);
|
|
58
72
|
}
|
|
59
|
-
async function getBondingExtrinsic(chainInfo, amount,
|
|
73
|
+
async function getBondingExtrinsic(chainInfo, amount, selectedValidators, substrateApi, address, nominatorMetadata) {
|
|
60
74
|
if (_constants._STAKING_CHAIN_GROUP.para.includes(chainInfo.slug)) {
|
|
61
|
-
return (0, _paraChain.getParaBondingExtrinsic)(
|
|
75
|
+
return (0, _paraChain.getParaBondingExtrinsic)(chainInfo, substrateApi, amount, selectedValidators[0], nominatorMetadata); // only select 1 validator at a time
|
|
62
76
|
} else if (_constants._STAKING_CHAIN_GROUP.astar.includes(chainInfo.slug)) {
|
|
63
77
|
return (0, _astar.getAstarBondingExtrinsic)(substrateApi, amount, selectedValidators[0]);
|
|
64
78
|
} else if (_constants._STAKING_CHAIN_GROUP.amplitude.includes(chainInfo.slug)) {
|
|
65
|
-
return (0, _amplitude.getAmplitudeBondingExtrinsic)(
|
|
79
|
+
return (0, _amplitude.getAmplitudeBondingExtrinsic)(substrateApi, amount, selectedValidators[0], nominatorMetadata);
|
|
66
80
|
}
|
|
67
|
-
return (0, _relayChain.getRelayBondingExtrinsic)(substrateApi, amount, selectedValidators,
|
|
81
|
+
return (0, _relayChain.getRelayBondingExtrinsic)(substrateApi, amount, selectedValidators, chainInfo, address, nominatorMetadata);
|
|
68
82
|
}
|
|
69
83
|
async function getUnbondingExtrinsic(nominatorMetadata, amount, chain, substrateApi, selectedValidator) {
|
|
70
84
|
if (_constants._STAKING_CHAIN_GROUP.para.includes(chain)) {
|
|
@@ -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,9 +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,
|
|
195
|
+
status: delegationStatus,
|
|
114
196
|
validatorAddress: delegation.owner,
|
|
115
197
|
validatorIdentity: identity,
|
|
116
198
|
activeStake: bnActiveStake.toString(),
|
|
@@ -122,9 +204,11 @@ async function getParaChainNominatorMetadata(chainInfo, address, substrateApi) {
|
|
|
122
204
|
const collatorInfo = _collatorInfo.toPrimitive();
|
|
123
205
|
nomination.validatorMinStake = collatorInfo.lowestTopDelegationAmount.toString();
|
|
124
206
|
}));
|
|
207
|
+
const stakingStatus = (0, _utils.getStakingStatusByNominations)(bnTotalActiveStake, nominationList);
|
|
125
208
|
return {
|
|
126
209
|
chain,
|
|
127
210
|
type: _KoniTypes.StakingType.NOMINATED,
|
|
211
|
+
status: stakingStatus,
|
|
128
212
|
address: address,
|
|
129
213
|
activeStake: bnTotalActiveStake.toString(),
|
|
130
214
|
nominations: nominationList,
|
|
@@ -133,15 +217,16 @@ async function getParaChainNominatorMetadata(chainInfo, address, substrateApi) {
|
|
|
133
217
|
}
|
|
134
218
|
async function getParachainCollatorsInfo(chain, substrateApi) {
|
|
135
219
|
const apiProps = await substrateApi.isReady;
|
|
136
|
-
const
|
|
220
|
+
const allCollators = [];
|
|
137
221
|
const [_allCollators, _collatorCommission] = await Promise.all([apiProps.api.query.parachainStaking.candidateInfo.entries(), apiProps.api.query.parachainStaking.collatorCommission()]);
|
|
138
222
|
const maxDelegationPerCollator = apiProps.api.consts.parachainStaking.maxTopDelegationsPerCandidate.toString();
|
|
139
223
|
const rawCollatorCommission = _collatorCommission.toHuman();
|
|
140
224
|
const collatorCommission = parseFloat(rawCollatorCommission.split('%')[0]);
|
|
141
225
|
for (const collator of _allCollators) {
|
|
142
|
-
const
|
|
226
|
+
const _collatorAddress = collator[0].toHuman();
|
|
227
|
+
const collatorAddress = _collatorAddress[0];
|
|
143
228
|
const collatorInfo = collator[1].toPrimitive();
|
|
144
|
-
|
|
229
|
+
allCollators.push({
|
|
145
230
|
commission: 0,
|
|
146
231
|
expectedReturn: 0,
|
|
147
232
|
address: collatorAddress,
|
|
@@ -157,9 +242,9 @@ async function getParachainCollatorsInfo(chain, substrateApi) {
|
|
|
157
242
|
});
|
|
158
243
|
}
|
|
159
244
|
const extraInfoMap = {};
|
|
160
|
-
await Promise.all(
|
|
245
|
+
await Promise.all(allCollators.map(async collator => {
|
|
161
246
|
var _apiProps$api$query, _apiProps$api$query$i;
|
|
162
|
-
const [_info, _identity] = await Promise.all([apiProps.api.query.parachainStaking.candidateInfo(
|
|
247
|
+
const [_info, _identity] = await Promise.all([apiProps.api.query.parachainStaking.candidateInfo(collator.address), (_apiProps$api$query = apiProps.api.query) === null || _apiProps$api$query === void 0 ? void 0 : (_apiProps$api$query$i = _apiProps$api$query.identity) === null || _apiProps$api$query$i === void 0 ? void 0 : _apiProps$api$query$i.identityOf(collator.address) // some chains might not have identity pallet
|
|
163
248
|
]);
|
|
164
249
|
const rawInfo = _info.toHuman();
|
|
165
250
|
const rawIdentity = _identity ? _identity.toHuman() : null;
|
|
@@ -175,7 +260,7 @@ async function getParachainCollatorsInfo(chain, substrateApi) {
|
|
|
175
260
|
isReasonable = rawIdentity.judgements.length > 0;
|
|
176
261
|
identity = (0, _utils.parseIdentity)(rawIdentity);
|
|
177
262
|
}
|
|
178
|
-
extraInfoMap[
|
|
263
|
+
extraInfoMap[collator.address] = {
|
|
179
264
|
identity,
|
|
180
265
|
isVerified: isReasonable,
|
|
181
266
|
bond: bond.toString(),
|
|
@@ -184,7 +269,7 @@ async function getParachainCollatorsInfo(chain, substrateApi) {
|
|
|
184
269
|
active
|
|
185
270
|
};
|
|
186
271
|
}));
|
|
187
|
-
for (const validator of
|
|
272
|
+
for (const validator of allCollators) {
|
|
188
273
|
validator.minBond = extraInfoMap[validator.address].minDelegation.toString();
|
|
189
274
|
validator.ownStake = extraInfoMap[validator.address].bond.toString();
|
|
190
275
|
validator.blocked = !extraInfoMap[validator.address].active;
|
|
@@ -195,16 +280,20 @@ async function getParachainCollatorsInfo(chain, substrateApi) {
|
|
|
195
280
|
validator.nominatorCount = extraInfoMap[validator.address].delegationCount;
|
|
196
281
|
validator.commission = collatorCommission;
|
|
197
282
|
}
|
|
198
|
-
return
|
|
283
|
+
return allCollators;
|
|
199
284
|
}
|
|
200
|
-
async function getParaBondingExtrinsic(
|
|
285
|
+
async function getParaBondingExtrinsic(chainInfo, substrateApi, amount, selectedCollatorInfo, nominatorMetadata) {
|
|
201
286
|
const apiPromise = await substrateApi.isReady;
|
|
202
287
|
const binaryAmount = new _util.BN(amount);
|
|
288
|
+
if (!nominatorMetadata) {
|
|
289
|
+
return apiPromise.api.tx.parachainStaking.delegate(selectedCollatorInfo.address, binaryAmount, new _util.BN(selectedCollatorInfo.nominatorCount), 0);
|
|
290
|
+
}
|
|
203
291
|
const {
|
|
204
292
|
bondedValidators,
|
|
205
293
|
nominationCount
|
|
206
294
|
} = (0, _utils.getBondedValidators)(nominatorMetadata.nominations);
|
|
207
|
-
|
|
295
|
+
const parsedSelectedCollatorAddress = (0, _utils3.reformatAddress)(selectedCollatorInfo.address, 0);
|
|
296
|
+
if (!bondedValidators.includes(parsedSelectedCollatorAddress)) {
|
|
208
297
|
return apiPromise.api.tx.parachainStaking.delegate(selectedCollatorInfo.address, binaryAmount, new _util.BN(selectedCollatorInfo.nominatorCount), nominationCount);
|
|
209
298
|
} else {
|
|
210
299
|
return apiPromise.api.tx.parachainStaking.delegatorBondMore(selectedCollatorInfo.address, binaryAmount);
|