@subwallet/extension-base 1.1.35-0 → 1.1.35-beta.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 +111 -69
- package/background/KoniTypes.js +19 -13
- package/background/errors/TransactionError.js +9 -0
- package/cjs/background/KoniTypes.js +20 -16
- package/cjs/background/errors/TransactionError.js +9 -0
- package/cjs/constants/index.js +19 -4
- package/cjs/koni/api/dotsama/balance.js +464 -0
- package/cjs/koni/api/nft/config.js +33 -23
- package/cjs/koni/api/nft/index.js +14 -0
- package/cjs/koni/api/nft/nft.js +1 -22
- package/cjs/koni/api/nft/ordinal_nft/constants.js +21 -0
- package/cjs/koni/api/nft/ordinal_nft/index.js +121 -0
- package/cjs/koni/api/nft/ordinal_nft/utils.js +41 -0
- package/cjs/koni/api/staking/bonding/amplitude.js +19 -16
- package/cjs/koni/api/staking/bonding/astar.js +11 -10
- package/cjs/koni/api/staking/bonding/index.js +4 -1
- package/cjs/koni/api/staking/bonding/paraChain.js +25 -23
- package/cjs/koni/api/staking/bonding/relayChain.js +48 -45
- package/cjs/koni/api/staking/bonding/utils.js +104 -86
- package/cjs/koni/api/staking/index.js +6 -5
- package/cjs/koni/api/staking/paraChain.js +6 -5
- package/cjs/koni/api/staking/relayChain.js +3 -2
- package/cjs/koni/api/yield/helper/utils.js +46 -0
- package/cjs/koni/background/cron.js +3 -21
- package/cjs/koni/background/handlers/Extension.js +368 -69
- package/cjs/koni/background/handlers/State.js +18 -12
- package/cjs/koni/background/handlers/index.js +4 -2
- package/cjs/koni/background/subscription.js +7 -104
- package/cjs/services/campaign-service/index.js +9 -6
- package/cjs/services/chain-service/constants.js +1 -16
- package/cjs/services/chain-service/index.js +6 -2
- package/cjs/services/chain-service/utils.js +7 -1
- package/cjs/services/earning-service/constants/chains.js +30 -0
- package/cjs/services/earning-service/constants/index.js +27 -0
- package/cjs/services/earning-service/constants/step.js +18 -0
- package/cjs/services/earning-service/handlers/base.js +262 -0
- package/cjs/services/earning-service/handlers/index.js +60 -0
- package/cjs/services/earning-service/handlers/lending/base.js +81 -0
- package/cjs/services/earning-service/handlers/lending/index.js +13 -0
- package/cjs/services/earning-service/handlers/lending/interlay.js +192 -0
- package/cjs/services/earning-service/handlers/liquid-staking/acala.js +240 -0
- package/cjs/services/earning-service/handlers/liquid-staking/base.js +97 -0
- package/cjs/services/earning-service/handlers/liquid-staking/bifrost-manta.js +140 -0
- package/cjs/services/earning-service/handlers/liquid-staking/bifrost.js +298 -0
- package/cjs/services/earning-service/handlers/liquid-staking/index.js +34 -0
- package/cjs/services/earning-service/handlers/liquid-staking/parallel.js +227 -0
- package/cjs/services/earning-service/handlers/liquid-staking/stella-swap.js +404 -0
- package/cjs/services/earning-service/handlers/native-staking/amplitude.js +434 -0
- package/cjs/services/earning-service/handlers/native-staking/astar.js +466 -0
- package/cjs/services/earning-service/handlers/native-staking/base-para.js +146 -0
- package/cjs/services/earning-service/handlers/native-staking/base.js +161 -0
- package/cjs/services/earning-service/handlers/native-staking/index.js +34 -0
- package/cjs/services/earning-service/handlers/native-staking/para-chain.js +390 -0
- package/cjs/services/earning-service/handlers/native-staking/relay-chain.js +567 -0
- package/cjs/services/earning-service/handlers/nomination-pool/index.js +566 -0
- package/cjs/services/earning-service/handlers/special.js +493 -0
- package/cjs/services/earning-service/service.js +733 -0
- package/cjs/services/earning-service/utils/index.js +128 -0
- package/cjs/services/event-service/index.js +5 -0
- package/cjs/services/keyring-service/index.js +14 -2
- package/cjs/services/migration-service/scripts/DeleteEarningData.js +21 -0
- package/cjs/services/migration-service/scripts/EnableEarningChains.js +21 -0
- package/cjs/services/migration-service/scripts/MigrateEthProvider.js +17 -0
- package/cjs/services/migration-service/scripts/MigrateLedgerAccount.js +1 -1
- package/cjs/services/migration-service/scripts/MigratePioneerProvider.js +17 -0
- package/cjs/services/migration-service/scripts/MigrateProvider.js +29 -0
- package/cjs/services/migration-service/scripts/MigrateTransactionHistory.js +1 -1
- package/cjs/services/migration-service/scripts/databases/MigrateEarningHistory.js +21 -0
- package/cjs/services/migration-service/scripts/databases/MigrateEarningVersion.js +21 -0
- package/cjs/services/migration-service/scripts/index.js +6 -1
- package/cjs/services/mint-campaign-service/campaigns/UnlockDotCampaign.js +149 -0
- package/cjs/services/mint-campaign-service/campaigns/index.js +13 -0
- package/cjs/services/mint-campaign-service/constants.js +11 -0
- package/cjs/services/mint-campaign-service/index.js +18 -0
- package/cjs/services/notification-service/NotificationService.js +3 -2
- package/cjs/services/request-service/handler/PopupHandler.js +2 -3
- package/cjs/services/storage-service/DatabaseService.js +63 -0
- package/cjs/services/storage-service/databases/index.js +4 -0
- package/cjs/services/storage-service/db-stores/NominatorMetadata.js +3 -3
- package/cjs/services/storage-service/db-stores/YieldPoolStore.js +36 -0
- package/cjs/services/storage-service/db-stores/YieldPositionStore.js +71 -0
- package/cjs/services/storage-service/index.js +241 -0
- package/cjs/services/subscan-service/index.js +16 -0
- package/cjs/services/transaction-service/event-parser/index.js +58 -0
- package/cjs/services/transaction-service/helpers/index.js +3 -1
- package/cjs/services/transaction-service/index.js +249 -75
- package/cjs/services/transaction-service/utils.js +1 -0
- package/cjs/types/campaigns/index.js +16 -0
- package/cjs/types/campaigns/unlock-dot.js +1 -0
- package/cjs/types/index.js +44 -0
- package/cjs/types/ordinal.js +1 -0
- package/cjs/types/transaction.js +1 -0
- package/cjs/types/yield/actions/index.js +27 -0
- package/cjs/types/yield/actions/join/index.js +38 -0
- package/cjs/types/yield/actions/join/step.js +47 -0
- package/cjs/types/yield/actions/join/submit.js +1 -0
- package/cjs/types/yield/actions/join/validate.js +16 -0
- package/cjs/types/yield/actions/others.js +1 -0
- package/cjs/types/yield/index.js +27 -0
- package/cjs/types/yield/info/account/index.js +49 -0
- package/cjs/types/yield/info/account/info.js +1 -0
- package/cjs/types/yield/info/account/reward.js +1 -0
- package/cjs/types/yield/info/account/target.js +32 -0
- package/cjs/types/yield/info/account/unstake.js +27 -0
- package/cjs/types/yield/info/base.js +41 -0
- package/cjs/types/yield/info/chain/index.js +27 -0
- package/cjs/types/yield/info/chain/info.js +1 -0
- package/cjs/types/yield/info/chain/target.js +1 -0
- package/cjs/types/yield/info/index.js +49 -0
- package/cjs/types/yield/info/pallet.js +15 -0
- package/cjs/types.js +1 -0
- package/cjs/utils/address.js +34 -0
- package/cjs/utils/environment.js +23 -28
- package/cjs/utils/fetchStaticCache.js +22 -0
- package/cjs/utils/fetchStaticData.js +2 -1
- package/cjs/utils/index.js +94 -10
- package/cjs/utils/keyring.js +57 -0
- package/cjs/utils/mv3.js +14 -0
- package/cjs/utils/number.js +6 -2
- package/cjs/utils/object.js +12 -0
- package/constants/index.d.ts +6 -1
- package/constants/index.js +6 -1
- package/koni/api/nft/config.js +33 -23
- package/koni/api/nft/index.js +15 -1
- package/koni/api/nft/nft.js +2 -23
- package/koni/api/nft/ordinal_nft/constants.d.ts +9 -0
- package/koni/api/nft/ordinal_nft/constants.js +12 -0
- package/koni/api/nft/ordinal_nft/index.d.ts +8 -0
- package/koni/api/nft/ordinal_nft/index.js +114 -0
- package/koni/api/nft/ordinal_nft/utils.d.ts +2 -0
- package/koni/api/nft/ordinal_nft/utils.js +33 -0
- package/koni/api/staking/bonding/amplitude.js +13 -10
- package/koni/api/staking/bonding/astar.js +9 -8
- package/koni/api/staking/bonding/index.d.ts +1 -1
- package/koni/api/staking/bonding/index.js +5 -1
- package/koni/api/staking/bonding/paraChain.js +12 -10
- package/koni/api/staking/bonding/relayChain.d.ts +2 -2
- package/koni/api/staking/bonding/relayChain.js +33 -30
- package/koni/api/staking/bonding/utils.d.ts +15 -38
- package/koni/api/staking/bonding/utils.js +85 -69
- package/koni/api/staking/index.js +2 -1
- package/koni/api/staking/paraChain.js +7 -6
- package/koni/api/staking/relayChain.js +4 -3
- package/koni/api/yield/helper/utils.d.ts +10 -0
- package/koni/api/yield/helper/utils.js +32 -0
- package/koni/background/cron.d.ts +0 -4
- package/koni/background/cron.js +4 -22
- package/koni/background/handlers/Extension.d.ts +17 -1
- package/koni/background/handlers/Extension.js +327 -30
- package/koni/background/handlers/State.d.ts +6 -1
- package/koni/background/handlers/State.js +17 -12
- package/koni/background/handlers/index.js +4 -2
- package/koni/background/subscription.d.ts +1 -6
- package/koni/background/subscription.js +8 -104
- package/package.json +326 -3
- package/services/campaign-service/index.js +9 -6
- package/services/chain-service/constants.d.ts +0 -12
- package/services/chain-service/constants.js +0 -14
- package/services/chain-service/index.js +6 -2
- package/services/chain-service/utils.d.ts +1 -0
- package/services/chain-service/utils.js +5 -1
- package/services/earning-service/constants/abis/compound_finance_v2_abi.json +1235 -0
- package/services/earning-service/constants/abis/st_liquid_token_abi.json +1355 -0
- package/services/earning-service/constants/chains.d.ts +15 -0
- package/services/earning-service/constants/chains.js +22 -0
- package/services/earning-service/constants/index.d.ts +2 -0
- package/services/earning-service/constants/index.js +5 -0
- package/services/earning-service/constants/step.d.ts +3 -0
- package/services/earning-service/constants/step.js +10 -0
- package/services/earning-service/handlers/base.d.ts +113 -0
- package/services/earning-service/handlers/base.js +256 -0
- package/services/earning-service/handlers/index.d.ts +5 -0
- package/services/earning-service/handlers/index.js +8 -0
- package/services/earning-service/handlers/lending/base.d.ts +8 -0
- package/services/earning-service/handlers/lending/base.js +73 -0
- package/services/earning-service/handlers/lending/index.d.ts +1 -0
- package/services/earning-service/handlers/lending/index.js +4 -0
- package/services/earning-service/handlers/lending/interlay.d.ts +24 -0
- package/services/earning-service/handlers/lending/interlay.js +184 -0
- package/services/earning-service/handlers/liquid-staking/acala.d.ts +27 -0
- package/services/earning-service/handlers/liquid-staking/acala.js +232 -0
- package/services/earning-service/handlers/liquid-staking/base.d.ts +11 -0
- package/services/earning-service/handlers/liquid-staking/base.js +89 -0
- package/services/earning-service/handlers/liquid-staking/bifrost.d.ts +46 -0
- package/services/earning-service/handlers/liquid-staking/bifrost.js +287 -0
- package/services/earning-service/handlers/liquid-staking/index.d.ts +4 -0
- package/services/earning-service/handlers/liquid-staking/index.js +7 -0
- package/services/earning-service/handlers/liquid-staking/parallel.d.ts +26 -0
- package/services/earning-service/handlers/liquid-staking/parallel.js +219 -0
- package/services/earning-service/handlers/liquid-staking/stella-swap.d.ts +34 -0
- package/services/earning-service/handlers/liquid-staking/stella-swap.js +394 -0
- package/services/earning-service/handlers/native-staking/amplitude.d.ts +22 -0
- package/services/earning-service/handlers/native-staking/amplitude.js +425 -0
- package/services/earning-service/handlers/native-staking/astar.d.ts +19 -0
- package/services/earning-service/handlers/native-staking/astar.js +456 -0
- package/services/earning-service/handlers/native-staking/base-para.d.ts +11 -0
- package/services/earning-service/handlers/native-staking/base-para.js +138 -0
- package/services/earning-service/handlers/native-staking/base.d.ts +21 -0
- package/services/earning-service/handlers/native-staking/base.js +152 -0
- package/services/earning-service/handlers/native-staking/index.d.ts +4 -0
- package/services/earning-service/handlers/native-staking/index.js +7 -0
- package/services/earning-service/handlers/native-staking/para-chain.d.ts +15 -0
- package/services/earning-service/handlers/native-staking/para-chain.js +382 -0
- package/services/earning-service/handlers/native-staking/relay-chain.d.ts +21 -0
- package/services/earning-service/handlers/native-staking/relay-chain.js +558 -0
- package/services/earning-service/handlers/nomination-pool/index.d.ts +36 -0
- package/services/earning-service/handlers/nomination-pool/index.js +556 -0
- package/services/earning-service/handlers/special.d.ts +64 -0
- package/services/earning-service/handlers/special.js +485 -0
- package/services/earning-service/service.d.ts +94 -0
- package/services/earning-service/service.js +722 -0
- package/services/earning-service/utils/index.d.ts +18 -0
- package/services/earning-service/utils/index.js +112 -0
- package/services/event-service/index.d.ts +2 -0
- package/services/event-service/index.js +5 -0
- package/services/event-service/types.d.ts +9 -0
- package/services/keyring-service/index.d.ts +2 -1
- package/services/keyring-service/index.js +14 -2
- package/services/migration-service/scripts/DeleteEarningData.d.ts +4 -0
- package/services/migration-service/scripts/DeleteEarningData.js +13 -0
- package/services/migration-service/scripts/EnableEarningChains.d.ts +4 -0
- package/services/migration-service/scripts/EnableEarningChains.js +13 -0
- package/services/migration-service/scripts/MigrateLedgerAccount.js +1 -1
- package/services/migration-service/scripts/MigrateTransactionHistory.js +1 -1
- package/services/migration-service/scripts/databases/MigrateEarningHistory.d.ts +4 -0
- package/services/migration-service/scripts/databases/MigrateEarningHistory.js +13 -0
- package/services/migration-service/scripts/databases/MigrateEarningVersion.d.ts +4 -0
- package/services/migration-service/scripts/databases/MigrateEarningVersion.js +13 -0
- package/services/migration-service/scripts/index.js +6 -1
- package/services/mint-campaign-service/campaigns/UnlockDotCampaign.d.ts +13 -0
- package/services/mint-campaign-service/campaigns/UnlockDotCampaign.js +139 -0
- package/services/mint-campaign-service/campaigns/index.d.ts +1 -0
- package/services/mint-campaign-service/campaigns/index.js +4 -0
- package/services/mint-campaign-service/constants.d.ts +1 -0
- package/services/mint-campaign-service/constants.js +4 -0
- package/services/mint-campaign-service/index.d.ts +7 -0
- package/services/mint-campaign-service/index.js +11 -0
- package/services/notification-service/NotificationService.js +3 -2
- package/services/request-service/handler/PopupHandler.js +3 -4
- package/services/storage-service/DatabaseService.d.ts +22 -1
- package/services/storage-service/DatabaseService.js +63 -0
- package/services/storage-service/databases/index.d.ts +3 -1
- package/services/storage-service/databases/index.js +4 -0
- package/services/storage-service/db-stores/NominatorMetadata.js +3 -3
- package/services/storage-service/db-stores/YieldPoolStore.d.ts +10 -0
- package/services/storage-service/db-stores/YieldPoolStore.js +28 -0
- package/services/storage-service/db-stores/YieldPositionStore.d.ts +11 -0
- package/services/storage-service/db-stores/YieldPositionStore.js +63 -0
- package/services/subscan-service/index.d.ts +3 -2
- package/services/subscan-service/index.js +15 -0
- package/services/subscan-service/types.d.ts +20 -0
- package/services/transaction-service/event-parser/index.d.ts +3 -1
- package/services/transaction-service/event-parser/index.js +57 -1
- package/services/transaction-service/helpers/index.js +3 -1
- package/services/transaction-service/index.d.ts +6 -13
- package/services/transaction-service/index.js +247 -73
- package/services/transaction-service/types.d.ts +2 -0
- package/services/transaction-service/utils.js +1 -0
- package/types/campaigns/index.d.ts +1 -0
- package/types/campaigns/index.js +4 -0
- package/types/campaigns/unlock-dot.d.ts +71 -0
- package/types/campaigns/unlock-dot.js +1 -0
- package/types/index.d.ts +5 -0
- package/types/index.js +5 -1
- package/types/ordinal.d.ts +69 -0
- package/types/ordinal.js +1 -0
- package/types/transaction.d.ts +3 -0
- package/types/transaction.js +1 -0
- package/types/yield/actions/index.d.ts +2 -0
- package/types/yield/actions/index.js +5 -0
- package/types/yield/actions/join/index.d.ts +3 -0
- package/types/yield/actions/join/index.js +6 -0
- package/types/yield/actions/join/step.d.ts +95 -0
- package/types/yield/actions/join/step.js +46 -0
- package/types/yield/actions/join/submit.d.ts +58 -0
- package/types/yield/actions/join/submit.js +1 -0
- package/types/yield/actions/join/validate.d.ts +18 -0
- package/types/yield/actions/join/validate.js +10 -0
- package/types/yield/actions/others.d.ts +85 -0
- package/types/yield/actions/others.js +1 -0
- package/types/yield/index.d.ts +2 -0
- package/types/yield/index.js +5 -0
- package/types/yield/info/account/index.d.ts +4 -0
- package/types/yield/info/account/index.js +7 -0
- package/types/yield/info/account/info.d.ts +92 -0
- package/types/yield/info/account/info.js +1 -0
- package/types/yield/info/account/reward.d.ts +47 -0
- package/types/yield/info/account/reward.js +1 -0
- package/types/yield/info/account/target.d.ts +43 -0
- package/types/yield/info/account/target.js +27 -0
- package/types/yield/info/account/unstake.d.ts +31 -0
- package/types/yield/info/account/unstake.js +22 -0
- package/types/yield/info/base.d.ts +45 -0
- package/types/yield/info/base.js +36 -0
- package/types/yield/info/chain/index.d.ts +2 -0
- package/types/yield/info/chain/index.js +5 -0
- package/types/yield/info/chain/info.d.ts +252 -0
- package/types/yield/info/chain/info.js +1 -0
- package/types/yield/info/chain/target.d.ts +37 -0
- package/types/yield/info/chain/target.js +1 -0
- package/types/yield/info/index.d.ts +4 -0
- package/types/yield/info/index.js +7 -0
- package/types/yield/info/pallet.d.ts +143 -0
- package/types/yield/info/pallet.js +9 -0
- package/utils/environment.d.ts +9 -2
- package/utils/environment.js +14 -26
- package/utils/fetchStaticCache.d.ts +1 -0
- package/utils/fetchStaticCache.js +14 -0
- package/utils/fetchStaticData.js +2 -1
- package/utils/index.d.ts +5 -1
- package/utils/index.js +53 -3
- package/utils/mv3.d.ts +2 -0
- package/utils/mv3.js +6 -0
- package/utils/number.d.ts +2 -1
- package/utils/number.js +2 -1
- package/utils/object.d.ts +1 -0
- package/utils/object.js +6 -0
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
// Copyright 2019-2022 @subwallet/extension-base
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
|
|
4
|
+
import { TransactionError } from '@subwallet/extension-base/background/errors/TransactionError';
|
|
5
|
+
import { BasicTxErrorType, ChainType, ExtrinsicType } from '@subwallet/extension-base/background/KoniTypes';
|
|
6
|
+
import { YieldPoolType, YieldStepType } from '@subwallet/extension-base/types';
|
|
7
|
+
import { noop } from '@polkadot/util';
|
|
8
|
+
import BasePoolHandler from "../base.js";
|
|
9
|
+
export default class BaseNativeStakingPoolHandler extends BasePoolHandler {
|
|
10
|
+
type = YieldPoolType.NATIVE_STAKING;
|
|
11
|
+
availableMethod = {
|
|
12
|
+
join: true,
|
|
13
|
+
defaultUnstake: true,
|
|
14
|
+
fastUnstake: false,
|
|
15
|
+
cancelUnstake: true,
|
|
16
|
+
withdraw: true,
|
|
17
|
+
claimReward: false
|
|
18
|
+
};
|
|
19
|
+
constructor(state, chain) {
|
|
20
|
+
super(state, chain);
|
|
21
|
+
const _chainAsset = this.nativeToken;
|
|
22
|
+
const _chainInfo = this.chainInfo;
|
|
23
|
+
const symbol = _chainAsset.symbol;
|
|
24
|
+
this.slug = `${symbol}___native_staking___${_chainInfo.slug}`;
|
|
25
|
+
this.name = `${_chainInfo.name} Native Staking`;
|
|
26
|
+
this.shortName = _chainInfo.name.replaceAll(' Relay Chain', '');
|
|
27
|
+
}
|
|
28
|
+
getDescription(amount = '0') {
|
|
29
|
+
const _chainAsset = this.nativeToken;
|
|
30
|
+
const symbol = _chainAsset.symbol;
|
|
31
|
+
return `Start staking with just {{amount}} ${symbol}`.replace('{{amount}}', amount);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/* Get pool reward */
|
|
35
|
+
|
|
36
|
+
async getPoolReward(useAddresses, callBack) {
|
|
37
|
+
return new Promise(resolve => resolve(noop));
|
|
38
|
+
}
|
|
39
|
+
async getPoolRewardHistory(useAddresses, callBack) {
|
|
40
|
+
let cancel = false;
|
|
41
|
+
const haveSubscanService = this.state.subscanService.checkSupportedSubscanChain(this.chain);
|
|
42
|
+
if (haveSubscanService) {
|
|
43
|
+
for (const address of useAddresses) {
|
|
44
|
+
if (cancel) {
|
|
45
|
+
break;
|
|
46
|
+
}
|
|
47
|
+
try {
|
|
48
|
+
const rs = await this.state.subscanService.getRewardHistoryList(this.chain, address);
|
|
49
|
+
const items = rs.list;
|
|
50
|
+
if (items) {
|
|
51
|
+
for (const item of items) {
|
|
52
|
+
const now = new Date();
|
|
53
|
+
const isMillisecond = now.getTime().toString().length === item.block_timestamp.toString().length;
|
|
54
|
+
const timeStamp = isMillisecond ? item.block_timestamp : item.block_timestamp * 1000;
|
|
55
|
+
const data = {
|
|
56
|
+
slug: this.slug,
|
|
57
|
+
type: this.type,
|
|
58
|
+
chain: this.chain,
|
|
59
|
+
address: address,
|
|
60
|
+
group: this.group,
|
|
61
|
+
blockTimestamp: timeStamp,
|
|
62
|
+
amount: item.amount,
|
|
63
|
+
eventIndex: item.event_index
|
|
64
|
+
};
|
|
65
|
+
callBack(data);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
} catch (e) {
|
|
69
|
+
console.error(e);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return () => {
|
|
74
|
+
cancel = false;
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/* Get pool reward */
|
|
79
|
+
|
|
80
|
+
/* Join pool action */
|
|
81
|
+
|
|
82
|
+
get defaultSubmitStep() {
|
|
83
|
+
return [{
|
|
84
|
+
name: 'Nominate validators',
|
|
85
|
+
type: YieldStepType.NOMINATE
|
|
86
|
+
}, {
|
|
87
|
+
slug: this.nativeToken.slug,
|
|
88
|
+
amount: '0'
|
|
89
|
+
}];
|
|
90
|
+
}
|
|
91
|
+
async getSubmitStep(params) {
|
|
92
|
+
const {
|
|
93
|
+
address,
|
|
94
|
+
amount,
|
|
95
|
+
slug,
|
|
96
|
+
targets
|
|
97
|
+
} = params;
|
|
98
|
+
const selectedValidators = !targets ? [] : targets;
|
|
99
|
+
const data = {
|
|
100
|
+
amount,
|
|
101
|
+
address,
|
|
102
|
+
slug,
|
|
103
|
+
selectedValidators
|
|
104
|
+
};
|
|
105
|
+
const positionInfo = await this.getPoolPosition(address);
|
|
106
|
+
const [, fee] = await this.createJoinExtrinsic(data, positionInfo);
|
|
107
|
+
return [this.defaultSubmitStep[0], fee];
|
|
108
|
+
}
|
|
109
|
+
async handleYieldJoin(_data, path, currentStep) {
|
|
110
|
+
const data = _data;
|
|
111
|
+
const {
|
|
112
|
+
address,
|
|
113
|
+
amount,
|
|
114
|
+
selectedValidators
|
|
115
|
+
} = data;
|
|
116
|
+
const positionInfo = await this.getPoolPosition(address);
|
|
117
|
+
const [extrinsic] = await this.createJoinExtrinsic(data, positionInfo);
|
|
118
|
+
const bondingData = {
|
|
119
|
+
poolPosition: positionInfo,
|
|
120
|
+
slug: this.slug,
|
|
121
|
+
amount,
|
|
122
|
+
address,
|
|
123
|
+
selectedValidators
|
|
124
|
+
};
|
|
125
|
+
return {
|
|
126
|
+
txChain: this.chain,
|
|
127
|
+
extrinsicType: ExtrinsicType.STAKING_BOND,
|
|
128
|
+
extrinsic,
|
|
129
|
+
txData: bondingData,
|
|
130
|
+
transferNativeAmount: amount,
|
|
131
|
+
chainType: ChainType.SUBSTRATE
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
/* Join pool action */
|
|
136
|
+
|
|
137
|
+
/* Leave pool action */
|
|
138
|
+
|
|
139
|
+
async handleYieldRedeem(amount, address, selectedTarget) {
|
|
140
|
+
return Promise.reject(new TransactionError(BasicTxErrorType.UNSUPPORTED));
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
/* Leave pool action */
|
|
144
|
+
|
|
145
|
+
/* Other action */
|
|
146
|
+
|
|
147
|
+
async handleYieldClaimReward(address, bondReward) {
|
|
148
|
+
return Promise.reject(new TransactionError(BasicTxErrorType.UNSUPPORTED));
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/* Other actions */
|
|
152
|
+
}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { default as AmplitudeNativeStakingPoolHandler } from './amplitude';
|
|
2
|
+
export { default as AstarNativeStakingPoolHandler } from './astar';
|
|
3
|
+
export { default as RelayNativeStakingPoolHandler } from './relay-chain';
|
|
4
|
+
export { default as ParaNativeStakingPoolHandler } from './para-chain';
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
// Copyright 2019-2022 @subwallet/extension-base
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
|
|
4
|
+
export { default as AmplitudeNativeStakingPoolHandler } from "./amplitude.js";
|
|
5
|
+
export { default as AstarNativeStakingPoolHandler } from "./astar.js";
|
|
6
|
+
export { default as RelayNativeStakingPoolHandler } from "./relay-chain.js";
|
|
7
|
+
export { default as ParaNativeStakingPoolHandler } from "./para-chain.js";
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { _ChainInfo } from '@subwallet/chain-list/types';
|
|
2
|
+
import { ExtrinsicType, UnstakingInfo } from '@subwallet/extension-base/background/KoniTypes';
|
|
3
|
+
import { _SubstrateApi } from '@subwallet/extension-base/services/chain-service/types';
|
|
4
|
+
import { BaseYieldPositionInfo, PalletParachainStakingDelegator, StakeCancelWithdrawalParams, SubmitJoinNativeStaking, TransactionData, ValidatorInfo, YieldPoolInfo, YieldPositionInfo, YieldTokenBaseInfo } from '@subwallet/extension-base/types';
|
|
5
|
+
import BaseParaNativeStakingPoolHandler from './base-para';
|
|
6
|
+
export default class ParaNativeStakingPoolHandler extends BaseParaNativeStakingPoolHandler {
|
|
7
|
+
subscribePoolInfo(callback: (data: YieldPoolInfo) => void): Promise<VoidFunction>;
|
|
8
|
+
parseNominatorMetadata(chainInfo: _ChainInfo, address: string, substrateApi: _SubstrateApi, delegatorState: PalletParachainStakingDelegator): Promise<Omit<YieldPositionInfo, keyof BaseYieldPositionInfo>>;
|
|
9
|
+
subscribePoolPosition(useAddresses: string[], resultCallback: (rs: YieldPositionInfo) => void): Promise<VoidFunction>;
|
|
10
|
+
getPoolTargets(): Promise<ValidatorInfo[]>;
|
|
11
|
+
createJoinExtrinsic(data: SubmitJoinNativeStaking, positionInfo?: YieldPositionInfo): Promise<[TransactionData, YieldTokenBaseInfo]>;
|
|
12
|
+
handleYieldUnstake(amount: string, address: string, selectedTarget?: string): Promise<[ExtrinsicType, TransactionData]>;
|
|
13
|
+
handleYieldCancelUnstake(params: StakeCancelWithdrawalParams): Promise<TransactionData>;
|
|
14
|
+
handleYieldWithdraw(address: string, unstakingInfo: UnstakingInfo): Promise<TransactionData>;
|
|
15
|
+
}
|
|
@@ -0,0 +1,382 @@
|
|
|
1
|
+
// Copyright 2019-2022 @subwallet/extension-base
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
|
|
4
|
+
import { TransactionError } from '@subwallet/extension-base/background/errors/TransactionError';
|
|
5
|
+
import { BasicTxErrorType, ExtrinsicType } from '@subwallet/extension-base/background/KoniTypes';
|
|
6
|
+
import { getBondedValidators, getEarningStatusByNominations, getParaCurrentInflation, isUnstakeAll } from '@subwallet/extension-base/koni/api/staking/bonding/utils';
|
|
7
|
+
import { _STAKING_ERA_LENGTH_MAP } from '@subwallet/extension-base/services/chain-service/constants';
|
|
8
|
+
import { parseIdentity } from '@subwallet/extension-base/services/earning-service/utils';
|
|
9
|
+
import { EarningStatus, UnstakingStatus } from '@subwallet/extension-base/types';
|
|
10
|
+
import { balanceFormatter, formatNumber, parseRawNumber, reformatAddress } from '@subwallet/extension-base/utils';
|
|
11
|
+
import { BN, BN_ZERO } from '@polkadot/util';
|
|
12
|
+
import BaseParaNativeStakingPoolHandler from "./base-para.js";
|
|
13
|
+
export default class ParaNativeStakingPoolHandler extends BaseParaNativeStakingPoolHandler {
|
|
14
|
+
/* Subscribe pool info */
|
|
15
|
+
|
|
16
|
+
async subscribePoolInfo(callback) {
|
|
17
|
+
let cancel = false;
|
|
18
|
+
const chainApi = this.substrateApi;
|
|
19
|
+
const nativeToken = this.nativeToken;
|
|
20
|
+
const defaultCallback = async () => {
|
|
21
|
+
const data = {
|
|
22
|
+
...this.baseInfo,
|
|
23
|
+
type: this.type,
|
|
24
|
+
metadata: {
|
|
25
|
+
...this.metadataInfo,
|
|
26
|
+
description: this.getDescription()
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
const poolInfo = await this.getPoolInfo();
|
|
30
|
+
!poolInfo && callback(data);
|
|
31
|
+
};
|
|
32
|
+
if (!this.isActive) {
|
|
33
|
+
await defaultCallback();
|
|
34
|
+
return () => {
|
|
35
|
+
cancel = true;
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
await defaultCallback();
|
|
39
|
+
await chainApi.isReady;
|
|
40
|
+
const unsub = await chainApi.api.query.parachainStaking.round(async _round => {
|
|
41
|
+
var _chainApi$api$consts, _chainApi$api$consts$, _chainApi$api$consts$2;
|
|
42
|
+
if (cancel) {
|
|
43
|
+
unsub();
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
const roundObj = _round.toHuman();
|
|
47
|
+
const round = parseRawNumber(roundObj.current);
|
|
48
|
+
const maxDelegations = (_chainApi$api$consts = chainApi.api.consts) === null || _chainApi$api$consts === void 0 ? void 0 : (_chainApi$api$consts$ = _chainApi$api$consts.parachainStaking) === null || _chainApi$api$consts$ === void 0 ? void 0 : (_chainApi$api$consts$2 = _chainApi$api$consts$.maxDelegationsPerDelegator) === null || _chainApi$api$consts$2 === void 0 ? void 0 : _chainApi$api$consts$2.toString();
|
|
49
|
+
const unstakingDelay = chainApi.api.consts.parachainStaking.delegationBondLessDelay.toString();
|
|
50
|
+
let _unvestedAllocation;
|
|
51
|
+
if (chainApi.api.query.vesting && chainApi.api.query.vesting.totalUnvestedAllocation) {
|
|
52
|
+
_unvestedAllocation = await chainApi.api.query.vesting.totalUnvestedAllocation();
|
|
53
|
+
}
|
|
54
|
+
const [_totalStake, _totalIssuance, _inflation] = await Promise.all([chainApi.api.query.parachainStaking.staked(round), chainApi.api.query.balances.totalIssuance(), chainApi.api.query.parachainStaking.inflationConfig()]);
|
|
55
|
+
let unvestedAllocation;
|
|
56
|
+
if (_unvestedAllocation) {
|
|
57
|
+
const rawUnvestedAllocation = _unvestedAllocation.toString();
|
|
58
|
+
unvestedAllocation = new BN(rawUnvestedAllocation);
|
|
59
|
+
}
|
|
60
|
+
const totalStake = _totalStake ? new BN(_totalStake.toString()) : BN_ZERO;
|
|
61
|
+
const totalIssuance = new BN(_totalIssuance.toString());
|
|
62
|
+
if (unvestedAllocation) {
|
|
63
|
+
totalIssuance.add(unvestedAllocation); // for Turing network, read more at https://hackmd.io/@sbAqOuXkRvyiZPOB3Ryn6Q/Sypr3ZJh5
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
const inflationConfig = _inflation.toHuman();
|
|
67
|
+
const inflation = getParaCurrentInflation(parseRawNumber(totalStake.toString()), inflationConfig);
|
|
68
|
+
const eraTime = _STAKING_ERA_LENGTH_MAP[this.chain] || _STAKING_ERA_LENGTH_MAP.default; // in hours
|
|
69
|
+
const unstakingPeriod = parseInt(unstakingDelay) * eraTime;
|
|
70
|
+
const minStake = '0';
|
|
71
|
+
const minToHuman = formatNumber(minStake.toString(), nativeToken.decimals || 0, balanceFormatter);
|
|
72
|
+
const data = {
|
|
73
|
+
...this.baseInfo,
|
|
74
|
+
type: this.type,
|
|
75
|
+
metadata: {
|
|
76
|
+
...this.metadataInfo,
|
|
77
|
+
description: this.getDescription(minToHuman)
|
|
78
|
+
},
|
|
79
|
+
statistic: {
|
|
80
|
+
assetEarning: [{
|
|
81
|
+
slug: this.nativeToken.slug
|
|
82
|
+
}],
|
|
83
|
+
maxCandidatePerFarmer: parseInt(maxDelegations),
|
|
84
|
+
maxWithdrawalRequestPerFarmer: 1,
|
|
85
|
+
// by default
|
|
86
|
+
earningThreshold: {
|
|
87
|
+
join: minStake.toString(),
|
|
88
|
+
defaultUnstake: '0',
|
|
89
|
+
fastUnstake: '0'
|
|
90
|
+
},
|
|
91
|
+
farmerCount: 0,
|
|
92
|
+
// TODO recheck
|
|
93
|
+
era: round,
|
|
94
|
+
eraTime,
|
|
95
|
+
totalApy: undefined,
|
|
96
|
+
// not have
|
|
97
|
+
tvl: totalStake.toString(),
|
|
98
|
+
unstakingPeriod: unstakingPeriod,
|
|
99
|
+
inflation
|
|
100
|
+
}
|
|
101
|
+
};
|
|
102
|
+
callback(data);
|
|
103
|
+
});
|
|
104
|
+
return () => {
|
|
105
|
+
cancel = true;
|
|
106
|
+
unsub();
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/* Subscribe pool info */
|
|
111
|
+
|
|
112
|
+
/* Subscribe pool position */
|
|
113
|
+
|
|
114
|
+
async parseNominatorMetadata(chainInfo, address, substrateApi, delegatorState) {
|
|
115
|
+
const nominationList = [];
|
|
116
|
+
const unstakingMap = {};
|
|
117
|
+
let bnTotalActiveStake = BN_ZERO;
|
|
118
|
+
let bnTotalStake = BN_ZERO;
|
|
119
|
+
let bnTotalUnstaking = BN_ZERO;
|
|
120
|
+
const _roundInfo = await substrateApi.api.query.parachainStaking.round();
|
|
121
|
+
const roundInfo = _roundInfo.toPrimitive();
|
|
122
|
+
const currentRound = roundInfo.current;
|
|
123
|
+
await Promise.all(delegatorState.delegations.map(async delegation => {
|
|
124
|
+
const [_delegationScheduledRequests, [identity], _collatorInfo] = await Promise.all([substrateApi.api.query.parachainStaking.delegationScheduledRequests(delegation.owner), parseIdentity(substrateApi, delegation.owner), substrateApi.api.query.parachainStaking.candidateInfo(delegation.owner)]);
|
|
125
|
+
const collatorInfo = _collatorInfo.toPrimitive();
|
|
126
|
+
const minDelegation = collatorInfo === null || collatorInfo === void 0 ? void 0 : collatorInfo.lowestTopDelegationAmount.toString();
|
|
127
|
+
const delegationScheduledRequests = _delegationScheduledRequests.toPrimitive();
|
|
128
|
+
let hasUnstaking = false;
|
|
129
|
+
let delegationStatus = EarningStatus.NOT_EARNING;
|
|
130
|
+
|
|
131
|
+
// parse unstaking info
|
|
132
|
+
if (delegationScheduledRequests) {
|
|
133
|
+
for (const scheduledRequest of delegationScheduledRequests) {
|
|
134
|
+
if (reformatAddress(scheduledRequest.delegator, 0) === reformatAddress(address, 0)) {
|
|
135
|
+
// add network prefix
|
|
136
|
+
const isClaimable = scheduledRequest.whenExecutable - currentRound < 0;
|
|
137
|
+
const remainingEra = scheduledRequest.whenExecutable - currentRound;
|
|
138
|
+
const waitingTime = remainingEra * _STAKING_ERA_LENGTH_MAP[chainInfo.slug];
|
|
139
|
+
const claimable = Object.values(scheduledRequest.action)[0];
|
|
140
|
+
unstakingMap[delegation.owner] = {
|
|
141
|
+
chain: chainInfo.slug,
|
|
142
|
+
status: isClaimable ? UnstakingStatus.CLAIMABLE : UnstakingStatus.UNLOCKING,
|
|
143
|
+
validatorAddress: delegation.owner,
|
|
144
|
+
claimable: claimable.toString(),
|
|
145
|
+
waitingTime
|
|
146
|
+
};
|
|
147
|
+
hasUnstaking = true;
|
|
148
|
+
break; // only handle 1 scheduledRequest per collator
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
const bnStake = new BN(delegation.amount);
|
|
154
|
+
const bnUnstakeBalance = unstakingMap[delegation.owner] ? new BN(unstakingMap[delegation.owner].claimable) : BN_ZERO;
|
|
155
|
+
const bnActiveStake = bnStake.sub(bnUnstakeBalance);
|
|
156
|
+
if (bnActiveStake.gt(BN_ZERO) && bnActiveStake.gte(new BN(minDelegation))) {
|
|
157
|
+
delegationStatus = EarningStatus.EARNING_REWARD;
|
|
158
|
+
}
|
|
159
|
+
bnTotalActiveStake = bnTotalActiveStake.add(bnActiveStake);
|
|
160
|
+
bnTotalStake = bnTotalStake.add(bnStake);
|
|
161
|
+
bnTotalUnstaking = bnTotalUnstaking.add(bnUnstakeBalance);
|
|
162
|
+
nominationList.push({
|
|
163
|
+
chain: chainInfo.slug,
|
|
164
|
+
status: delegationStatus,
|
|
165
|
+
validatorAddress: delegation.owner,
|
|
166
|
+
validatorIdentity: identity,
|
|
167
|
+
activeStake: bnActiveStake.toString(),
|
|
168
|
+
hasUnstaking,
|
|
169
|
+
validatorMinStake: collatorInfo.lowestTopDelegationAmount.toString()
|
|
170
|
+
});
|
|
171
|
+
}));
|
|
172
|
+
|
|
173
|
+
// await Promise.all(nominationList.map(async (nomination) => {
|
|
174
|
+
// const _collatorInfo = await substrateApi.api.query.parachainStaking.candidateInfo(nomination.validatorAddress);
|
|
175
|
+
// const collatorInfo = _collatorInfo.toPrimitive() as unknown as ParachainStakingCandidateMetadata;
|
|
176
|
+
//
|
|
177
|
+
// nomination.validatorMinStake = collatorInfo.lowestTopDelegationAmount.toString();
|
|
178
|
+
// }));
|
|
179
|
+
|
|
180
|
+
const stakingStatus = getEarningStatusByNominations(bnTotalActiveStake, nominationList);
|
|
181
|
+
const totalStake = bnTotalStake.toString();
|
|
182
|
+
const activeStake = bnTotalActiveStake.toString();
|
|
183
|
+
const unstakingBalance = bnTotalUnstaking.toString();
|
|
184
|
+
return {
|
|
185
|
+
status: stakingStatus,
|
|
186
|
+
totalStake,
|
|
187
|
+
balanceToken: this.nativeToken.slug,
|
|
188
|
+
activeStake: activeStake,
|
|
189
|
+
unstakeBalance: unstakingBalance,
|
|
190
|
+
isBondedBefore: !!nominationList.length,
|
|
191
|
+
nominations: nominationList,
|
|
192
|
+
unstakings: Object.values(unstakingMap)
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
async subscribePoolPosition(useAddresses, resultCallback) {
|
|
196
|
+
let cancel = false;
|
|
197
|
+
const substrateApi = this.substrateApi;
|
|
198
|
+
const defaultInfo = this.baseInfo;
|
|
199
|
+
const chainInfo = this.chainInfo;
|
|
200
|
+
await substrateApi.isReady;
|
|
201
|
+
const unsub = await substrateApi.api.query.parachainStaking.delegatorState.multi(useAddresses, async ledgers => {
|
|
202
|
+
if (cancel) {
|
|
203
|
+
unsub();
|
|
204
|
+
return;
|
|
205
|
+
}
|
|
206
|
+
if (ledgers) {
|
|
207
|
+
await Promise.all(ledgers.map(async (_delegatorState, i) => {
|
|
208
|
+
const delegatorState = _delegatorState.toPrimitive();
|
|
209
|
+
const owner = reformatAddress(useAddresses[i], 42);
|
|
210
|
+
if (delegatorState) {
|
|
211
|
+
const nominatorMetadata = await this.parseNominatorMetadata(chainInfo, owner, substrateApi, delegatorState);
|
|
212
|
+
resultCallback({
|
|
213
|
+
...defaultInfo,
|
|
214
|
+
...nominatorMetadata,
|
|
215
|
+
address: owner,
|
|
216
|
+
type: this.type
|
|
217
|
+
});
|
|
218
|
+
} else {
|
|
219
|
+
resultCallback({
|
|
220
|
+
...defaultInfo,
|
|
221
|
+
type: this.type,
|
|
222
|
+
address: owner,
|
|
223
|
+
balanceToken: this.nativeToken.slug,
|
|
224
|
+
totalStake: '0',
|
|
225
|
+
activeStake: '0',
|
|
226
|
+
unstakeBalance: '0',
|
|
227
|
+
status: EarningStatus.NOT_STAKING,
|
|
228
|
+
isBondedBefore: false,
|
|
229
|
+
nominations: [],
|
|
230
|
+
unstakings: []
|
|
231
|
+
});
|
|
232
|
+
}
|
|
233
|
+
}));
|
|
234
|
+
}
|
|
235
|
+
});
|
|
236
|
+
return () => {
|
|
237
|
+
cancel = true;
|
|
238
|
+
unsub();
|
|
239
|
+
};
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
/* Subscribe pool position */
|
|
243
|
+
|
|
244
|
+
/* Get pool targets */
|
|
245
|
+
|
|
246
|
+
async getPoolTargets() {
|
|
247
|
+
const apiProps = await this.substrateApi.isReady;
|
|
248
|
+
const allCollators = [];
|
|
249
|
+
const [_allCollators, _collatorCommission] = await Promise.all([apiProps.api.query.parachainStaking.candidateInfo.entries(), apiProps.api.query.parachainStaking.collatorCommission()]);
|
|
250
|
+
const maxDelegationPerCollator = apiProps.api.consts.parachainStaking.maxTopDelegationsPerCandidate.toString();
|
|
251
|
+
const rawCollatorCommission = _collatorCommission.toHuman();
|
|
252
|
+
const collatorCommission = parseFloat(rawCollatorCommission.split('%')[0]);
|
|
253
|
+
for (const collator of _allCollators) {
|
|
254
|
+
const _collatorAddress = collator[0].toHuman();
|
|
255
|
+
const collatorAddress = _collatorAddress[0];
|
|
256
|
+
const collatorInfo = collator[1].toPrimitive();
|
|
257
|
+
const bnTotalStake = new BN(collatorInfo.totalCounted);
|
|
258
|
+
const bnOwnStake = new BN(collatorInfo.bond);
|
|
259
|
+
const bnOtherStake = bnTotalStake.sub(bnOwnStake);
|
|
260
|
+
const bnMinBond = new BN(collatorInfo.lowestTopDelegationAmount);
|
|
261
|
+
allCollators.push({
|
|
262
|
+
commission: 0,
|
|
263
|
+
expectedReturn: 0,
|
|
264
|
+
address: collatorAddress,
|
|
265
|
+
totalStake: bnTotalStake.toString(),
|
|
266
|
+
ownStake: bnOwnStake.toString(),
|
|
267
|
+
otherStake: bnOtherStake.toString(),
|
|
268
|
+
nominatorCount: collatorInfo.delegationCount,
|
|
269
|
+
blocked: false,
|
|
270
|
+
isVerified: false,
|
|
271
|
+
minBond: bnMinBond.toString(),
|
|
272
|
+
chain: this.chain,
|
|
273
|
+
isCrowded: parseInt(maxDelegationPerCollator) > 0
|
|
274
|
+
});
|
|
275
|
+
}
|
|
276
|
+
const extraInfoMap = {};
|
|
277
|
+
await Promise.all(allCollators.map(async collator => {
|
|
278
|
+
const [_info, [identity, isReasonable]] = await Promise.all([apiProps.api.query.parachainStaking.candidateInfo(collator.address), parseIdentity(apiProps, collator.address)]);
|
|
279
|
+
const rawInfo = _info.toHuman();
|
|
280
|
+
const active = (rawInfo === null || rawInfo === void 0 ? void 0 : rawInfo.status) === 'Active';
|
|
281
|
+
extraInfoMap[collator.address] = {
|
|
282
|
+
identity,
|
|
283
|
+
isVerified: isReasonable,
|
|
284
|
+
active
|
|
285
|
+
};
|
|
286
|
+
}));
|
|
287
|
+
for (const validator of allCollators) {
|
|
288
|
+
validator.blocked = !extraInfoMap[validator.address].active;
|
|
289
|
+
validator.identity = extraInfoMap[validator.address].identity;
|
|
290
|
+
validator.isVerified = extraInfoMap[validator.address].isVerified;
|
|
291
|
+
// @ts-ignore
|
|
292
|
+
validator.commission = collatorCommission;
|
|
293
|
+
}
|
|
294
|
+
return allCollators;
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
/* Get pool targets */
|
|
298
|
+
|
|
299
|
+
/* Join pool action */
|
|
300
|
+
|
|
301
|
+
async createJoinExtrinsic(data, positionInfo) {
|
|
302
|
+
const {
|
|
303
|
+
amount,
|
|
304
|
+
selectedValidators
|
|
305
|
+
} = data;
|
|
306
|
+
const apiPromise = await this.substrateApi.isReady;
|
|
307
|
+
const binaryAmount = new BN(amount);
|
|
308
|
+
const selectedCollatorInfo = selectedValidators[0];
|
|
309
|
+
|
|
310
|
+
// eslint-disable-next-line @typescript-eslint/require-await
|
|
311
|
+
const compoundResult = async extrinsic => {
|
|
312
|
+
const tokenSlug = this.nativeToken.slug;
|
|
313
|
+
// const feeInfo = await extrinsic.paymentInfo(address);
|
|
314
|
+
// const fee = feeInfo.toPrimitive() as unknown as RuntimeDispatchInfo;
|
|
315
|
+
|
|
316
|
+
// Not use the fee to validate and to display on UI
|
|
317
|
+
return [extrinsic, {
|
|
318
|
+
slug: tokenSlug,
|
|
319
|
+
amount: '0'
|
|
320
|
+
}];
|
|
321
|
+
};
|
|
322
|
+
if (!positionInfo) {
|
|
323
|
+
const extrinsic = apiPromise.api.tx.parachainStaking.delegate(selectedCollatorInfo.address, binaryAmount, new BN(selectedCollatorInfo.nominatorCount), 0);
|
|
324
|
+
return compoundResult(extrinsic);
|
|
325
|
+
}
|
|
326
|
+
const {
|
|
327
|
+
bondedValidators,
|
|
328
|
+
nominationCount
|
|
329
|
+
} = getBondedValidators(positionInfo.nominations);
|
|
330
|
+
const parsedSelectedCollatorAddress = reformatAddress(selectedCollatorInfo.address, 0);
|
|
331
|
+
if (!bondedValidators.includes(parsedSelectedCollatorAddress)) {
|
|
332
|
+
const extrinsic = apiPromise.api.tx.parachainStaking.delegate(selectedCollatorInfo.address, binaryAmount, new BN(selectedCollatorInfo.nominatorCount), nominationCount);
|
|
333
|
+
return compoundResult(extrinsic);
|
|
334
|
+
} else {
|
|
335
|
+
const extrinsic = apiPromise.api.tx.parachainStaking.delegatorBondMore(selectedCollatorInfo.address, binaryAmount);
|
|
336
|
+
return compoundResult(extrinsic);
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
/* Join pool action */
|
|
341
|
+
|
|
342
|
+
/* Leave pool action */
|
|
343
|
+
|
|
344
|
+
async handleYieldUnstake(amount, address, selectedTarget) {
|
|
345
|
+
const apiPromise = await this.substrateApi.isReady;
|
|
346
|
+
const binaryAmount = new BN(amount);
|
|
347
|
+
const poolPosition = await this.getPoolPosition(address);
|
|
348
|
+
if (!selectedTarget || !poolPosition) {
|
|
349
|
+
return Promise.reject(new TransactionError(BasicTxErrorType.INVALID_PARAMS));
|
|
350
|
+
}
|
|
351
|
+
const unstakeAll = isUnstakeAll(selectedTarget, poolPosition.nominations, amount);
|
|
352
|
+
let extrinsic;
|
|
353
|
+
if (!unstakeAll) {
|
|
354
|
+
extrinsic = apiPromise.api.tx.parachainStaking.scheduleDelegatorBondLess(selectedTarget, binaryAmount);
|
|
355
|
+
} else {
|
|
356
|
+
extrinsic = apiPromise.api.tx.parachainStaking.scheduleRevokeDelegation(selectedTarget);
|
|
357
|
+
}
|
|
358
|
+
return [ExtrinsicType.STAKING_LEAVE_POOL, extrinsic];
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
/* Leave pool action */
|
|
362
|
+
|
|
363
|
+
/* Other action */
|
|
364
|
+
|
|
365
|
+
async handleYieldCancelUnstake(params) {
|
|
366
|
+
const {
|
|
367
|
+
selectedUnstaking
|
|
368
|
+
} = params;
|
|
369
|
+
const chainApi = await this.substrateApi.isReady;
|
|
370
|
+
return chainApi.api.tx.parachainStaking.cancelDelegationRequest(selectedUnstaking.validatorAddress);
|
|
371
|
+
}
|
|
372
|
+
async handleYieldWithdraw(address, unstakingInfo) {
|
|
373
|
+
const collatorAddress = unstakingInfo.validatorAddress;
|
|
374
|
+
if (!collatorAddress) {
|
|
375
|
+
return Promise.reject(new TransactionError(BasicTxErrorType.INVALID_PARAMS));
|
|
376
|
+
}
|
|
377
|
+
const chainApi = await this.substrateApi.isReady;
|
|
378
|
+
return chainApi.api.tx.parachainStaking.executeDelegationRequest(address, collatorAddress);
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
/* Other actions */
|
|
382
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/// <reference types="bn.js" />
|
|
2
|
+
import { _ChainInfo } from '@subwallet/chain-list/types';
|
|
3
|
+
import { TransactionError } from '@subwallet/extension-base/background/errors/TransactionError';
|
|
4
|
+
import { ExtrinsicType, UnstakingInfo } from '@subwallet/extension-base/background/KoniTypes';
|
|
5
|
+
import { _SubstrateApi } from '@subwallet/extension-base/services/chain-service/types';
|
|
6
|
+
import { BaseYieldPositionInfo, OptimalYieldPath, PalletStakingStakingLedger, StakeCancelWithdrawalParams, SubmitJoinNativeStaking, SubmitYieldJoinData, TransactionData, ValidatorInfo, YieldPoolInfo, YieldPositionInfo, YieldTokenBaseInfo } from '@subwallet/extension-base/types';
|
|
7
|
+
import { DeriveSessionProgress } from '@polkadot/api-derive/types';
|
|
8
|
+
import { BN } from '@polkadot/util';
|
|
9
|
+
import BaseNativeStakingPoolHandler from './base';
|
|
10
|
+
export default class RelayNativeStakingPoolHandler extends BaseNativeStakingPoolHandler {
|
|
11
|
+
subscribePoolInfo(callback: (data: YieldPoolInfo) => void): Promise<VoidFunction>;
|
|
12
|
+
parseNominatorMetadata(chainInfo: _ChainInfo, address: string, substrateApi: _SubstrateApi, ledger: PalletStakingStakingLedger, currentEra: string, minStake: BN, _deriveSessionProgress: DeriveSessionProgress): Promise<Omit<YieldPositionInfo, keyof BaseYieldPositionInfo>>;
|
|
13
|
+
subscribePoolPosition(useAddresses: string[], resultCallback: (rs: YieldPositionInfo) => void): Promise<VoidFunction>;
|
|
14
|
+
getPoolTargets(): Promise<ValidatorInfo[]>;
|
|
15
|
+
validateYieldJoin(data: SubmitYieldJoinData, path: OptimalYieldPath): Promise<TransactionError[]>;
|
|
16
|
+
createJoinExtrinsic(data: SubmitJoinNativeStaking, positionInfo?: YieldPositionInfo, bondDest?: string): Promise<[TransactionData, YieldTokenBaseInfo]>;
|
|
17
|
+
validateYieldLeave(amount: string, address: string, fastLeave: boolean, selectedTarget?: string): Promise<TransactionError[]>;
|
|
18
|
+
handleYieldUnstake(amount: string, address: string, selectedTarget?: string): Promise<[ExtrinsicType, TransactionData]>;
|
|
19
|
+
handleYieldCancelUnstake(params: StakeCancelWithdrawalParams): Promise<TransactionData>;
|
|
20
|
+
handleYieldWithdraw(address: string, unstakingInfo: UnstakingInfo): Promise<TransactionData>;
|
|
21
|
+
}
|