@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,722 @@
|
|
|
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 } from '@subwallet/extension-base/background/KoniTypes';
|
|
6
|
+
import { CRON_REFRESH_CHAIN_STAKING_METADATA, CRON_REFRESH_EARNING_REWARD_HISTORY_INTERVAL, CRON_REFRESH_STAKING_REWARD_FAST_INTERVAL } from '@subwallet/extension-base/constants';
|
|
7
|
+
import { ServiceStatus } from '@subwallet/extension-base/services/base/types';
|
|
8
|
+
import { _isChainEvmCompatible } from '@subwallet/extension-base/services/chain-service/utils';
|
|
9
|
+
import { _STAKING_CHAIN_GROUP } from '@subwallet/extension-base/services/earning-service/constants';
|
|
10
|
+
import BaseLiquidStakingPoolHandler from '@subwallet/extension-base/services/earning-service/handlers/liquid-staking/base';
|
|
11
|
+
import { YieldPoolType } from '@subwallet/extension-base/types';
|
|
12
|
+
import { addLazy, categoryAddresses, createPromiseHandler } from '@subwallet/extension-base/utils';
|
|
13
|
+
import { fetchStaticCache } from '@subwallet/extension-base/utils/fetchStaticCache';
|
|
14
|
+
import { BehaviorSubject } from 'rxjs';
|
|
15
|
+
import { AcalaLiquidStakingPoolHandler, AmplitudeNativeStakingPoolHandler, AstarNativeStakingPoolHandler, BifrostLiquidStakingPoolHandler, InterlayLendingPoolHandler, NominationPoolHandler, ParallelLiquidStakingPoolHandler, ParaNativeStakingPoolHandler, RelayNativeStakingPoolHandler, StellaSwapLiquidStakingPoolHandler } from "./handlers/index.js";
|
|
16
|
+
const fetchPoolsData = async () => {
|
|
17
|
+
const fetchData = await fetchStaticCache('earning/yield-pools.json', {
|
|
18
|
+
data: {}
|
|
19
|
+
});
|
|
20
|
+
return fetchData.data;
|
|
21
|
+
};
|
|
22
|
+
export default class EarningService {
|
|
23
|
+
handlers = {};
|
|
24
|
+
earningRewardSubject = new BehaviorSubject({
|
|
25
|
+
ready: false,
|
|
26
|
+
data: {}
|
|
27
|
+
});
|
|
28
|
+
earningRewardHistorySubject = new BehaviorSubject({});
|
|
29
|
+
minAmountPercentSubject = new BehaviorSubject({});
|
|
30
|
+
|
|
31
|
+
// earning
|
|
32
|
+
yieldPoolInfoSubject = new BehaviorSubject({});
|
|
33
|
+
yieldPositionSubject = new BehaviorSubject({});
|
|
34
|
+
yieldPositionListSubject = new BehaviorSubject([]); // virtual list of yieldPositionSubject with filter values
|
|
35
|
+
|
|
36
|
+
constructor(state) {
|
|
37
|
+
this.state = state;
|
|
38
|
+
this.dbService = state.dbService;
|
|
39
|
+
this.eventService = state.eventService;
|
|
40
|
+
}
|
|
41
|
+
async initHandlers() {
|
|
42
|
+
await this.eventService.waitChainReady;
|
|
43
|
+
const chains = [];
|
|
44
|
+
for (const chain of Object.values(this.state.getChainInfoMap())) {
|
|
45
|
+
if (chain.chainStatus === 'ACTIVE') {
|
|
46
|
+
chains.push(chain.slug);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
const minAmountPercent = {};
|
|
50
|
+
for (const chain of chains) {
|
|
51
|
+
const handlers = [];
|
|
52
|
+
if (_STAKING_CHAIN_GROUP.relay.includes(chain)) {
|
|
53
|
+
handlers.push(new RelayNativeStakingPoolHandler(this.state, chain));
|
|
54
|
+
}
|
|
55
|
+
if (_STAKING_CHAIN_GROUP.para.includes(chain)) {
|
|
56
|
+
handlers.push(new ParaNativeStakingPoolHandler(this.state, chain));
|
|
57
|
+
}
|
|
58
|
+
if (_STAKING_CHAIN_GROUP.astar.includes(chain)) {
|
|
59
|
+
handlers.push(new AstarNativeStakingPoolHandler(this.state, chain));
|
|
60
|
+
}
|
|
61
|
+
if (_STAKING_CHAIN_GROUP.amplitude.includes(chain)) {
|
|
62
|
+
handlers.push(new AmplitudeNativeStakingPoolHandler(this.state, chain));
|
|
63
|
+
}
|
|
64
|
+
if (_STAKING_CHAIN_GROUP.nominationPool.includes(chain)) {
|
|
65
|
+
handlers.push(new NominationPoolHandler(this.state, chain));
|
|
66
|
+
}
|
|
67
|
+
if (_STAKING_CHAIN_GROUP.liquidStaking.includes(chain)) {
|
|
68
|
+
if (chain === 'bifrost_dot') {
|
|
69
|
+
handlers.push(new BifrostLiquidStakingPoolHandler(this.state, chain));
|
|
70
|
+
}
|
|
71
|
+
if (chain === 'acala') {
|
|
72
|
+
handlers.push(new AcalaLiquidStakingPoolHandler(this.state, chain));
|
|
73
|
+
}
|
|
74
|
+
if (chain === 'parallel') {
|
|
75
|
+
handlers.push(new ParallelLiquidStakingPoolHandler(this.state, chain));
|
|
76
|
+
}
|
|
77
|
+
if (chain === 'moonbeam') {
|
|
78
|
+
handlers.push(new StellaSwapLiquidStakingPoolHandler(this.state, chain));
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
if (_STAKING_CHAIN_GROUP.lending.includes(chain)) {
|
|
82
|
+
if (chain === 'interlay') {
|
|
83
|
+
handlers.push(new InterlayLendingPoolHandler(this.state, chain));
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
for (const handler of handlers) {
|
|
87
|
+
this.handlers[handler.slug] = handler;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
for (const handler of Object.values(this.handlers)) {
|
|
91
|
+
if (handler.type === YieldPoolType.LIQUID_STAKING) {
|
|
92
|
+
minAmountPercent[handler.slug] = handler.minAmountPercent;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
minAmountPercent.default = BaseLiquidStakingPoolHandler.defaultMinAmountPercent;
|
|
96
|
+
this.minAmountPercentSubject.next(minAmountPercent);
|
|
97
|
+
|
|
98
|
+
// Emit earning ready
|
|
99
|
+
this.eventService.emit('earning.ready', true);
|
|
100
|
+
}
|
|
101
|
+
startPromiseHandler = createPromiseHandler();
|
|
102
|
+
stopPromiseHandler = createPromiseHandler();
|
|
103
|
+
status = ServiceStatus.NOT_INITIALIZED;
|
|
104
|
+
async init() {
|
|
105
|
+
this.status = ServiceStatus.INITIALIZING;
|
|
106
|
+
await this.initHandlers();
|
|
107
|
+
|
|
108
|
+
// Load data from db
|
|
109
|
+
await this.loadData();
|
|
110
|
+
|
|
111
|
+
// Pin list with value from map
|
|
112
|
+
this.yieldPositionSubject.subscribe({
|
|
113
|
+
next: data => {
|
|
114
|
+
const activeMap = this.state.getActiveChainInfoMap();
|
|
115
|
+
const activePositions = Object.values(data).filter(item => {
|
|
116
|
+
return !!activeMap[item.chain];
|
|
117
|
+
});
|
|
118
|
+
this.yieldPositionListSubject.next(Object.values(activePositions));
|
|
119
|
+
}
|
|
120
|
+
});
|
|
121
|
+
this.status = ServiceStatus.INITIALIZED;
|
|
122
|
+
await this.start();
|
|
123
|
+
this.handleActions();
|
|
124
|
+
}
|
|
125
|
+
handleActions() {
|
|
126
|
+
this.eventService.onLazy((events, eventTypes) => {
|
|
127
|
+
(async () => {
|
|
128
|
+
const removedAddresses = [];
|
|
129
|
+
events.forEach(event => {
|
|
130
|
+
if (event.type === 'account.remove') {
|
|
131
|
+
removedAddresses.push(event.data[0]);
|
|
132
|
+
}
|
|
133
|
+
});
|
|
134
|
+
if (removedAddresses.length > 0) {
|
|
135
|
+
await this.removeYieldPositions(undefined, removedAddresses);
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
// Account changed or chain changed (active or inactive)
|
|
139
|
+
// Chain changed (active or inactive)
|
|
140
|
+
// Todo: Optimize performance of chain active or inactive in the future
|
|
141
|
+
if (eventTypes.includes('account.updateCurrent') || eventTypes.includes('account.remove') || eventTypes.includes('chain.updateState')) {
|
|
142
|
+
await this.reloadEarning();
|
|
143
|
+
}
|
|
144
|
+
})().catch(console.error);
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
async loadData() {
|
|
148
|
+
await this.getYieldPoolInfoFromDB();
|
|
149
|
+
await this.getYieldPositionFromDB();
|
|
150
|
+
}
|
|
151
|
+
persistData() {
|
|
152
|
+
// Data is auto persisted with lazy queue
|
|
153
|
+
return Promise.resolve(undefined);
|
|
154
|
+
}
|
|
155
|
+
async start() {
|
|
156
|
+
if (this.status === ServiceStatus.STOPPING) {
|
|
157
|
+
await this.waitForStopped();
|
|
158
|
+
}
|
|
159
|
+
if (this.status === ServiceStatus.STARTED || this.status === ServiceStatus.STARTING) {
|
|
160
|
+
return this.waitForStarted();
|
|
161
|
+
}
|
|
162
|
+
this.status = ServiceStatus.STARTING;
|
|
163
|
+
|
|
164
|
+
// Start subscribe pools' info
|
|
165
|
+
await this.runSubscribePoolsInfo();
|
|
166
|
+
|
|
167
|
+
// Start subscribe pools' position
|
|
168
|
+
await this.runSubscribePoolsPosition();
|
|
169
|
+
|
|
170
|
+
// Start subscribe pools' reward
|
|
171
|
+
this.runSubscribeStakingRewardInterval();
|
|
172
|
+
|
|
173
|
+
// Start subscribe pools' reward history
|
|
174
|
+
this.runSubscribeEarningRewardHistoryInterval();
|
|
175
|
+
|
|
176
|
+
// Update promise handler
|
|
177
|
+
this.startPromiseHandler.resolve();
|
|
178
|
+
this.stopPromiseHandler = createPromiseHandler();
|
|
179
|
+
this.status = ServiceStatus.STARTED;
|
|
180
|
+
}
|
|
181
|
+
async stop() {
|
|
182
|
+
if (this.status === ServiceStatus.STARTING) {
|
|
183
|
+
await this.waitForStarted();
|
|
184
|
+
}
|
|
185
|
+
if (this.status === ServiceStatus.STOPPED || this.status === ServiceStatus.STOPPING) {
|
|
186
|
+
return this.waitForStopped();
|
|
187
|
+
}
|
|
188
|
+
this.status = ServiceStatus.STOPPING;
|
|
189
|
+
await this.persistData();
|
|
190
|
+
|
|
191
|
+
// Stop subscribe pools' info
|
|
192
|
+
this.runUnsubscribePoolsInfo();
|
|
193
|
+
|
|
194
|
+
// Stop subscribe pools' position
|
|
195
|
+
this.runUnsubscribePoolsPosition();
|
|
196
|
+
|
|
197
|
+
// Stop subscribe pools' reward
|
|
198
|
+
this.runUnsubscribeStakingRewardInterval();
|
|
199
|
+
|
|
200
|
+
// Stop subscribe pools' reward history
|
|
201
|
+
this.runUnsubscribeEarningRewardHistoryInterval();
|
|
202
|
+
|
|
203
|
+
// Update promise handler
|
|
204
|
+
this.stopPromiseHandler.resolve();
|
|
205
|
+
this.startPromiseHandler = createPromiseHandler();
|
|
206
|
+
this.status = ServiceStatus.STOPPED;
|
|
207
|
+
}
|
|
208
|
+
waitForStarted() {
|
|
209
|
+
return this.startPromiseHandler.promise;
|
|
210
|
+
}
|
|
211
|
+
waitForStopped() {
|
|
212
|
+
return this.stopPromiseHandler.promise;
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
/* Pools' info methods */
|
|
216
|
+
|
|
217
|
+
getPoolHandler(slug) {
|
|
218
|
+
return this.handlers[slug];
|
|
219
|
+
}
|
|
220
|
+
isPoolSupportAlternativeFee(slug) {
|
|
221
|
+
const handler = this.getPoolHandler(slug);
|
|
222
|
+
if (handler) {
|
|
223
|
+
return handler.isPoolSupportAlternativeFee;
|
|
224
|
+
} else {
|
|
225
|
+
throw new TransactionError(BasicTxErrorType.INTERNAL_ERROR);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
subscribeMinAmountPercent() {
|
|
229
|
+
return this.minAmountPercentSubject;
|
|
230
|
+
}
|
|
231
|
+
getMinAmountPercent() {
|
|
232
|
+
return this.minAmountPercentSubject.getValue();
|
|
233
|
+
}
|
|
234
|
+
async getYieldPool(slug) {
|
|
235
|
+
await this.eventService.waitEarningReady;
|
|
236
|
+
return this.yieldPoolInfoSubject.getValue()[slug];
|
|
237
|
+
}
|
|
238
|
+
async subscribePoolsInfo(callback) {
|
|
239
|
+
let cancel = false;
|
|
240
|
+
await this.eventService.waitChainReady;
|
|
241
|
+
const unsubList = [];
|
|
242
|
+
for (const handler of Object.values(this.handlers)) {
|
|
243
|
+
handler.subscribePoolInfo(callback).then(unsub => {
|
|
244
|
+
if (!cancel) {
|
|
245
|
+
unsubList.push(unsub);
|
|
246
|
+
} else {
|
|
247
|
+
unsub();
|
|
248
|
+
}
|
|
249
|
+
}).catch(console.error);
|
|
250
|
+
}
|
|
251
|
+
return () => {
|
|
252
|
+
cancel = true;
|
|
253
|
+
unsubList.forEach(unsub => {
|
|
254
|
+
unsub === null || unsub === void 0 ? void 0 : unsub();
|
|
255
|
+
});
|
|
256
|
+
};
|
|
257
|
+
}
|
|
258
|
+
async getYieldPoolInfoFromDB() {
|
|
259
|
+
// Get online pool data
|
|
260
|
+
const yieldPoolInfo = {};
|
|
261
|
+
const existedYieldPoolInfo = await this.dbService.getYieldPools();
|
|
262
|
+
existedYieldPoolInfo.forEach(info => {
|
|
263
|
+
yieldPoolInfo[info.slug] = info;
|
|
264
|
+
});
|
|
265
|
+
this.yieldPoolInfoSubject.next(yieldPoolInfo);
|
|
266
|
+
}
|
|
267
|
+
subscribeYieldPoolInfo() {
|
|
268
|
+
return this.yieldPoolInfoSubject;
|
|
269
|
+
}
|
|
270
|
+
async getYieldPoolInfo() {
|
|
271
|
+
await this.eventService.waitEarningReady;
|
|
272
|
+
return Object.values(this.yieldPoolInfoSubject.getValue());
|
|
273
|
+
}
|
|
274
|
+
yieldPoolPersistQueue = [];
|
|
275
|
+
updateYieldPoolInfo(data) {
|
|
276
|
+
this.yieldPoolPersistQueue.push(data);
|
|
277
|
+
addLazy('persistYieldPoolInfo', () => {
|
|
278
|
+
const yieldPoolInfo = this.yieldPoolInfoSubject.getValue();
|
|
279
|
+
const queue = [...this.yieldPoolPersistQueue];
|
|
280
|
+
this.yieldPoolPersistQueue = [];
|
|
281
|
+
|
|
282
|
+
// Update yield pool info
|
|
283
|
+
queue.forEach(item => {
|
|
284
|
+
const existed = yieldPoolInfo[item.slug];
|
|
285
|
+
if (item.statistic && (!(existed !== null && existed !== void 0 && existed.lastUpdated) || existed.lastUpdated < ((item === null || item === void 0 ? void 0 : item.lastUpdated) || 0))) {
|
|
286
|
+
// Only update item has statistic information
|
|
287
|
+
yieldPoolInfo[item.slug] = item;
|
|
288
|
+
}
|
|
289
|
+
});
|
|
290
|
+
this.yieldPoolInfoSubject.next(yieldPoolInfo);
|
|
291
|
+
|
|
292
|
+
// Persist data
|
|
293
|
+
this.dbService.updateYieldPoolsStore(queue).catch(console.warn);
|
|
294
|
+
}, 300, 900);
|
|
295
|
+
}
|
|
296
|
+
async fetchingPoolsInfoOnline() {
|
|
297
|
+
const onlineData = await fetchPoolsData();
|
|
298
|
+
Object.values(onlineData).forEach(item => {
|
|
299
|
+
this.updateYieldPoolInfo(item);
|
|
300
|
+
});
|
|
301
|
+
}
|
|
302
|
+
async runSubscribePoolsInfo() {
|
|
303
|
+
await this.eventService.waitChainReady;
|
|
304
|
+
this.runUnsubscribePoolsInfo();
|
|
305
|
+
|
|
306
|
+
// Fetching online data
|
|
307
|
+
this.fetchingPoolsInfoOnline().catch(console.error);
|
|
308
|
+
const interval = setInterval(() => {
|
|
309
|
+
this.fetchingPoolsInfoOnline().catch(console.error);
|
|
310
|
+
}, CRON_REFRESH_CHAIN_STAKING_METADATA);
|
|
311
|
+
|
|
312
|
+
// Fetching from chains
|
|
313
|
+
this.subscribePoolsInfo(data => {
|
|
314
|
+
data.lastUpdated = Date.now();
|
|
315
|
+
this.updateYieldPoolInfo(data);
|
|
316
|
+
}).then(rs => {
|
|
317
|
+
this.yieldPoolsInfoUnsub = () => {
|
|
318
|
+
rs();
|
|
319
|
+
clearInterval(interval);
|
|
320
|
+
};
|
|
321
|
+
}).catch(console.error);
|
|
322
|
+
}
|
|
323
|
+
runUnsubscribePoolsInfo() {
|
|
324
|
+
var _this$yieldPoolsInfoU;
|
|
325
|
+
(_this$yieldPoolsInfoU = this.yieldPoolsInfoUnsub) === null || _this$yieldPoolsInfoU === void 0 ? void 0 : _this$yieldPoolsInfoU.call(this);
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
/* Pools' info methods */
|
|
329
|
+
|
|
330
|
+
/* Pools' position methods */
|
|
331
|
+
|
|
332
|
+
async getYieldPosition(address, slug) {
|
|
333
|
+
await this.eventService.waitEarningReady;
|
|
334
|
+
return this.yieldPositionSubject.getValue()[`${slug}---${address}`];
|
|
335
|
+
}
|
|
336
|
+
async subscribePoolPositions(addresses, callback) {
|
|
337
|
+
let cancel = false;
|
|
338
|
+
await this.eventService.waitChainReady;
|
|
339
|
+
const [substrateAddresses, evmAddresses] = categoryAddresses(addresses);
|
|
340
|
+
const activeChains = this.state.activeChainSlugs;
|
|
341
|
+
const unsubList = [];
|
|
342
|
+
for (const handler of Object.values(this.handlers)) {
|
|
343
|
+
if (activeChains.includes(handler.chain)) {
|
|
344
|
+
const chainInfo = handler.chainInfo;
|
|
345
|
+
const useAddresses = _isChainEvmCompatible(chainInfo) ? evmAddresses : substrateAddresses;
|
|
346
|
+
handler.subscribePoolPosition(useAddresses, callback).then(unsub => {
|
|
347
|
+
if (cancel) {
|
|
348
|
+
unsub();
|
|
349
|
+
} else {
|
|
350
|
+
unsubList.push(unsub);
|
|
351
|
+
}
|
|
352
|
+
}).catch(console.error);
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
return () => {
|
|
356
|
+
cancel = true;
|
|
357
|
+
unsubList.forEach(unsub => {
|
|
358
|
+
unsub === null || unsub === void 0 ? void 0 : unsub();
|
|
359
|
+
});
|
|
360
|
+
};
|
|
361
|
+
}
|
|
362
|
+
async removeYieldPositions(chains, addresses) {
|
|
363
|
+
const removeKeys = [];
|
|
364
|
+
chains && chains.length > 0 && Object.entries(this.yieldPositionSubject.getValue()).forEach(([key, value]) => {
|
|
365
|
+
console.log('removeYieldPositions', key, value.chain, chains.indexOf(value.chain) > -1);
|
|
366
|
+
if (chains.indexOf(value.chain) > -1 && !removeKeys.includes(key)) {
|
|
367
|
+
removeKeys.push(key);
|
|
368
|
+
}
|
|
369
|
+
});
|
|
370
|
+
addresses && addresses.length > 0 && Object.entries(this.yieldPositionSubject.getValue()).forEach(([key, value]) => {
|
|
371
|
+
if (addresses.indexOf(value.address) > -1 && !removeKeys.includes(key)) {
|
|
372
|
+
removeKeys.push(key);
|
|
373
|
+
}
|
|
374
|
+
});
|
|
375
|
+
|
|
376
|
+
// Remove by keys
|
|
377
|
+
const yieldPositionInfo = this.yieldPositionSubject.getValue();
|
|
378
|
+
for (const key of removeKeys) {
|
|
379
|
+
delete yieldPositionInfo[key];
|
|
380
|
+
}
|
|
381
|
+
this.yieldPositionSubject.next(yieldPositionInfo);
|
|
382
|
+
addresses && addresses.length > 0 && (await this.dbService.removeYieldPositionByAddresses(addresses));
|
|
383
|
+
chains && chains.length > 0 && (await this.dbService.removeYieldPositionByChains(chains));
|
|
384
|
+
}
|
|
385
|
+
async getYieldPositionFromDB() {
|
|
386
|
+
await this.eventService.waitChainReady;
|
|
387
|
+
await this.eventService.waitKeyringReady;
|
|
388
|
+
const addresses = this.state.getDecodedAddresses();
|
|
389
|
+
const existedYieldPosition = await this.dbService.getYieldNominationPoolPosition(addresses, this.state.activeChainSlugs);
|
|
390
|
+
const yieldPositionInfo = this.yieldPositionSubject.getValue();
|
|
391
|
+
existedYieldPosition.forEach(item => {
|
|
392
|
+
yieldPositionInfo[this._getYieldPositionKey(item.slug, item.address)] = item;
|
|
393
|
+
});
|
|
394
|
+
this.yieldPositionSubject.next(yieldPositionInfo);
|
|
395
|
+
}
|
|
396
|
+
subscribeYieldPosition() {
|
|
397
|
+
return this.yieldPositionListSubject;
|
|
398
|
+
}
|
|
399
|
+
async getYieldPositionInfo() {
|
|
400
|
+
await this.eventService.waitEarningReady;
|
|
401
|
+
return Promise.resolve(this.yieldPositionListSubject.getValue());
|
|
402
|
+
}
|
|
403
|
+
yieldPositionPersistQueue = [];
|
|
404
|
+
resetYieldPositionQueue() {
|
|
405
|
+
this.yieldPositionPersistQueue = [];
|
|
406
|
+
}
|
|
407
|
+
resetYieldPosition() {
|
|
408
|
+
this.yieldPositionSubject.next({});
|
|
409
|
+
this.yieldPositionPersistQueue = [];
|
|
410
|
+
}
|
|
411
|
+
_getYieldPositionKey(slug, address) {
|
|
412
|
+
return `${slug}---${address}`;
|
|
413
|
+
}
|
|
414
|
+
updateYieldPosition(data) {
|
|
415
|
+
this.yieldPositionPersistQueue.push(data);
|
|
416
|
+
addLazy('persistYieldPositionInfo', () => {
|
|
417
|
+
const yieldPositionInfo = this.yieldPositionSubject.getValue();
|
|
418
|
+
const queue = [...this.yieldPositionPersistQueue];
|
|
419
|
+
this.yieldPositionPersistQueue = [];
|
|
420
|
+
|
|
421
|
+
// Update yield position info
|
|
422
|
+
queue.forEach(item => {
|
|
423
|
+
yieldPositionInfo[this._getYieldPositionKey(item.slug, item.address)] = item;
|
|
424
|
+
});
|
|
425
|
+
this.yieldPositionSubject.next(yieldPositionInfo);
|
|
426
|
+
|
|
427
|
+
// Persist data
|
|
428
|
+
this.dbService.updateYieldPositions(queue).catch(console.warn);
|
|
429
|
+
}, 300, 900);
|
|
430
|
+
}
|
|
431
|
+
async reloadEarning(reset = false) {
|
|
432
|
+
await this.waitForStarted();
|
|
433
|
+
this.runUnsubscribePoolsPosition();
|
|
434
|
+
this.runUnsubscribeStakingRewardInterval();
|
|
435
|
+
this.runUnsubscribeEarningRewardHistoryInterval();
|
|
436
|
+
reset && this.resetYieldPosition();
|
|
437
|
+
await this.runSubscribePoolsPosition();
|
|
438
|
+
this.runSubscribeStakingRewardInterval();
|
|
439
|
+
this.runSubscribeEarningRewardHistoryInterval();
|
|
440
|
+
}
|
|
441
|
+
async runSubscribePoolsPosition() {
|
|
442
|
+
await this.eventService.waitKeyringReady;
|
|
443
|
+
this.runUnsubscribePoolsPosition();
|
|
444
|
+
const addresses = this.state.getDecodedAddresses();
|
|
445
|
+
this.subscribePoolPositions(addresses, data => {
|
|
446
|
+
this.updateYieldPosition(data);
|
|
447
|
+
}).then(rs => {
|
|
448
|
+
this.yieldPositionUnsub = rs;
|
|
449
|
+
}).catch(console.error);
|
|
450
|
+
}
|
|
451
|
+
runUnsubscribePoolsPosition() {
|
|
452
|
+
var _this$yieldPositionUn;
|
|
453
|
+
(_this$yieldPositionUn = this.yieldPositionUnsub) === null || _this$yieldPositionUn === void 0 ? void 0 : _this$yieldPositionUn.call(this);
|
|
454
|
+
this.yieldPositionPersistQueue = [];
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
/* Pools' position methods */
|
|
458
|
+
|
|
459
|
+
/* Get pools' reward */
|
|
460
|
+
|
|
461
|
+
updateEarningReward(stakingRewardData) {
|
|
462
|
+
const stakingRewardState = this.earningRewardSubject.getValue();
|
|
463
|
+
stakingRewardState.ready = true;
|
|
464
|
+
const key = `${stakingRewardData.slug}---${stakingRewardData.address}`;
|
|
465
|
+
stakingRewardState.data[key] = stakingRewardData;
|
|
466
|
+
this.earningRewardSubject.next(stakingRewardState);
|
|
467
|
+
}
|
|
468
|
+
async getPoolReward(addresses, callback) {
|
|
469
|
+
let cancel = false;
|
|
470
|
+
await this.eventService.waitChainReady;
|
|
471
|
+
const [substrateAddresses, evmAddresses] = categoryAddresses(addresses);
|
|
472
|
+
const activeChains = this.state.activeChainSlugs;
|
|
473
|
+
const unsubList = [];
|
|
474
|
+
for (const handler of Object.values(this.handlers)) {
|
|
475
|
+
if (activeChains.includes(handler.chain)) {
|
|
476
|
+
const chainInfo = handler.chainInfo;
|
|
477
|
+
const useAddresses = _isChainEvmCompatible(chainInfo) ? evmAddresses : substrateAddresses;
|
|
478
|
+
handler.getPoolReward(useAddresses, callback).then(unsub => {
|
|
479
|
+
if (cancel) {
|
|
480
|
+
unsub();
|
|
481
|
+
} else {
|
|
482
|
+
unsubList.push(unsub);
|
|
483
|
+
}
|
|
484
|
+
}).catch(console.error);
|
|
485
|
+
}
|
|
486
|
+
}
|
|
487
|
+
return () => {
|
|
488
|
+
cancel = true;
|
|
489
|
+
unsubList.forEach(unsub => {
|
|
490
|
+
unsub === null || unsub === void 0 ? void 0 : unsub();
|
|
491
|
+
});
|
|
492
|
+
};
|
|
493
|
+
}
|
|
494
|
+
subscribeEarningReward() {
|
|
495
|
+
return this.earningRewardSubject;
|
|
496
|
+
}
|
|
497
|
+
getEarningRewards() {
|
|
498
|
+
return this.earningRewardSubject.getValue();
|
|
499
|
+
}
|
|
500
|
+
runSubscribeStakingRewardInterval() {
|
|
501
|
+
const addresses = this.state.getDecodedAddresses();
|
|
502
|
+
if (!addresses.length) {
|
|
503
|
+
return;
|
|
504
|
+
}
|
|
505
|
+
this.getPoolReward(addresses, result => {
|
|
506
|
+
this.updateEarningReward(result);
|
|
507
|
+
}).catch(console.error);
|
|
508
|
+
this.earningsRewardInterval = setInterval(() => {
|
|
509
|
+
this.getPoolReward(addresses, result => {
|
|
510
|
+
this.updateEarningReward(result);
|
|
511
|
+
}).catch(console.error);
|
|
512
|
+
}, CRON_REFRESH_STAKING_REWARD_FAST_INTERVAL);
|
|
513
|
+
}
|
|
514
|
+
runUnsubscribeStakingRewardInterval() {
|
|
515
|
+
this.earningsRewardInterval && clearInterval(this.earningsRewardInterval);
|
|
516
|
+
}
|
|
517
|
+
async fetchPoolRewardHistory(addresses, callback) {
|
|
518
|
+
let cancel = false;
|
|
519
|
+
await this.eventService.waitChainReady;
|
|
520
|
+
const [substrateAddresses, evmAddresses] = categoryAddresses(addresses);
|
|
521
|
+
const activeChains = this.state.activeChainSlugs;
|
|
522
|
+
const unsubList = [];
|
|
523
|
+
for (const handler of Object.values(this.handlers)) {
|
|
524
|
+
if (activeChains.includes(handler.chain)) {
|
|
525
|
+
const chainInfo = handler.chainInfo;
|
|
526
|
+
const useAddresses = _isChainEvmCompatible(chainInfo) ? evmAddresses : substrateAddresses;
|
|
527
|
+
handler.getPoolRewardHistory(useAddresses, callback).then(unsub => {
|
|
528
|
+
if (cancel) {
|
|
529
|
+
unsub();
|
|
530
|
+
} else {
|
|
531
|
+
unsubList.push(unsub);
|
|
532
|
+
}
|
|
533
|
+
}).catch(console.error);
|
|
534
|
+
}
|
|
535
|
+
}
|
|
536
|
+
return () => {
|
|
537
|
+
cancel = true;
|
|
538
|
+
unsubList.forEach(unsub => {
|
|
539
|
+
unsub === null || unsub === void 0 ? void 0 : unsub();
|
|
540
|
+
});
|
|
541
|
+
};
|
|
542
|
+
}
|
|
543
|
+
updateEarningRewardHistory(earningRewardHistory) {
|
|
544
|
+
const earningRewardHistoryState = this.earningRewardHistorySubject.getValue();
|
|
545
|
+
const key = `${earningRewardHistory.slug}---${earningRewardHistory.address}---${earningRewardHistory.eventIndex}`;
|
|
546
|
+
earningRewardHistoryState[key] = earningRewardHistory;
|
|
547
|
+
this.earningRewardHistorySubject.next(earningRewardHistoryState);
|
|
548
|
+
}
|
|
549
|
+
subscribeEarningRewardHistory() {
|
|
550
|
+
return this.earningRewardHistorySubject;
|
|
551
|
+
}
|
|
552
|
+
getEarningRewardHistory() {
|
|
553
|
+
return this.earningRewardHistorySubject.getValue();
|
|
554
|
+
}
|
|
555
|
+
runSubscribeEarningRewardHistoryInterval() {
|
|
556
|
+
this.runUnsubscribeEarningRewardHistoryInterval();
|
|
557
|
+
const addresses = this.state.getDecodedAddresses();
|
|
558
|
+
if (!addresses.length) {
|
|
559
|
+
return;
|
|
560
|
+
}
|
|
561
|
+
this.fetchPoolRewardHistory(addresses, result => {
|
|
562
|
+
this.updateEarningRewardHistory(result);
|
|
563
|
+
}).catch(console.error);
|
|
564
|
+
this.earningsRewardHistoryInterval = setInterval(() => {
|
|
565
|
+
this.fetchPoolRewardHistory(addresses, result => {
|
|
566
|
+
this.updateEarningRewardHistory(result);
|
|
567
|
+
}).catch(console.error);
|
|
568
|
+
}, CRON_REFRESH_EARNING_REWARD_HISTORY_INTERVAL);
|
|
569
|
+
}
|
|
570
|
+
runUnsubscribeEarningRewardHistoryInterval() {
|
|
571
|
+
this.earningsRewardHistoryInterval && clearInterval(this.earningsRewardHistoryInterval);
|
|
572
|
+
}
|
|
573
|
+
|
|
574
|
+
/* Get pools' reward */
|
|
575
|
+
|
|
576
|
+
/* Get pool's targets */
|
|
577
|
+
|
|
578
|
+
/**
|
|
579
|
+
* @async
|
|
580
|
+
* @function getPoolTargets
|
|
581
|
+
* @param {string} slug - Pool's slug
|
|
582
|
+
* @return {Promise<YieldPoolTarget[]>} List of pool's target
|
|
583
|
+
* */
|
|
584
|
+
async getPoolTargets(slug) {
|
|
585
|
+
await this.eventService.waitChainReady;
|
|
586
|
+
const handler = this.getPoolHandler(slug);
|
|
587
|
+
if (handler) {
|
|
588
|
+
return await handler.getPoolTargets();
|
|
589
|
+
} else {
|
|
590
|
+
return [];
|
|
591
|
+
}
|
|
592
|
+
}
|
|
593
|
+
|
|
594
|
+
/* Get pool's targets */
|
|
595
|
+
|
|
596
|
+
/* Handle actions */
|
|
597
|
+
|
|
598
|
+
/* Join */
|
|
599
|
+
|
|
600
|
+
async earlyValidateJoin(request) {
|
|
601
|
+
await this.eventService.waitChainReady;
|
|
602
|
+
const {
|
|
603
|
+
slug
|
|
604
|
+
} = request;
|
|
605
|
+
const handler = this.getPoolHandler(slug);
|
|
606
|
+
if (handler) {
|
|
607
|
+
return handler.earlyValidate(request);
|
|
608
|
+
} else {
|
|
609
|
+
throw new TransactionError(BasicTxErrorType.INTERNAL_ERROR);
|
|
610
|
+
}
|
|
611
|
+
}
|
|
612
|
+
async generateOptimalSteps(params) {
|
|
613
|
+
await this.eventService.waitChainReady;
|
|
614
|
+
const {
|
|
615
|
+
slug
|
|
616
|
+
} = params;
|
|
617
|
+
const handler = this.getPoolHandler(slug);
|
|
618
|
+
if (handler) {
|
|
619
|
+
return handler.generateOptimalPath(params);
|
|
620
|
+
} else {
|
|
621
|
+
throw new TransactionError(BasicTxErrorType.INTERNAL_ERROR);
|
|
622
|
+
}
|
|
623
|
+
}
|
|
624
|
+
async validateYieldJoin(params) {
|
|
625
|
+
await this.eventService.waitChainReady;
|
|
626
|
+
const {
|
|
627
|
+
slug
|
|
628
|
+
} = params.data;
|
|
629
|
+
const handler = this.getPoolHandler(slug);
|
|
630
|
+
if (handler) {
|
|
631
|
+
return handler.validateYieldJoin(params.data, params.path);
|
|
632
|
+
} else {
|
|
633
|
+
return [new TransactionError(BasicTxErrorType.INTERNAL_ERROR)];
|
|
634
|
+
}
|
|
635
|
+
}
|
|
636
|
+
async handleYieldJoin(params) {
|
|
637
|
+
await this.eventService.waitChainReady;
|
|
638
|
+
const {
|
|
639
|
+
slug
|
|
640
|
+
} = params.data;
|
|
641
|
+
const handler = this.getPoolHandler(slug);
|
|
642
|
+
if (handler) {
|
|
643
|
+
return handler.handleYieldJoin(params.data, params.path, params.currentStep);
|
|
644
|
+
} else {
|
|
645
|
+
return Promise.reject(new TransactionError(BasicTxErrorType.INTERNAL_ERROR));
|
|
646
|
+
}
|
|
647
|
+
}
|
|
648
|
+
|
|
649
|
+
/* Join */
|
|
650
|
+
|
|
651
|
+
/* Leave */
|
|
652
|
+
|
|
653
|
+
async validateYieldLeave(params) {
|
|
654
|
+
await this.eventService.waitChainReady;
|
|
655
|
+
const {
|
|
656
|
+
slug
|
|
657
|
+
} = params;
|
|
658
|
+
const handler = this.getPoolHandler(slug);
|
|
659
|
+
if (handler) {
|
|
660
|
+
return handler.validateYieldLeave(params.amount, params.address, params.fastLeave, params.selectedTarget);
|
|
661
|
+
} else {
|
|
662
|
+
return Promise.reject(new TransactionError(BasicTxErrorType.INTERNAL_ERROR));
|
|
663
|
+
}
|
|
664
|
+
}
|
|
665
|
+
async handleYieldLeave(params) {
|
|
666
|
+
await this.eventService.waitChainReady;
|
|
667
|
+
const {
|
|
668
|
+
slug
|
|
669
|
+
} = params;
|
|
670
|
+
const handler = this.getPoolHandler(slug);
|
|
671
|
+
if (handler) {
|
|
672
|
+
return handler.handleYieldLeave(params.fastLeave, params.amount, params.address, params.selectedTarget);
|
|
673
|
+
} else {
|
|
674
|
+
return Promise.reject(new TransactionError(BasicTxErrorType.INTERNAL_ERROR));
|
|
675
|
+
}
|
|
676
|
+
}
|
|
677
|
+
|
|
678
|
+
/* Leave */
|
|
679
|
+
|
|
680
|
+
/* Other */
|
|
681
|
+
|
|
682
|
+
async handleYieldWithdraw(params) {
|
|
683
|
+
await this.eventService.waitChainReady;
|
|
684
|
+
const {
|
|
685
|
+
slug
|
|
686
|
+
} = params;
|
|
687
|
+
const handler = this.getPoolHandler(slug);
|
|
688
|
+
if (handler) {
|
|
689
|
+
return handler.handleYieldWithdraw(params.address, params.unstakingInfo);
|
|
690
|
+
} else {
|
|
691
|
+
return Promise.reject(new TransactionError(BasicTxErrorType.INTERNAL_ERROR));
|
|
692
|
+
}
|
|
693
|
+
}
|
|
694
|
+
async handleYieldCancelUnstake(params) {
|
|
695
|
+
await this.eventService.waitChainReady;
|
|
696
|
+
const {
|
|
697
|
+
slug
|
|
698
|
+
} = params;
|
|
699
|
+
const handler = this.getPoolHandler(slug);
|
|
700
|
+
if (handler) {
|
|
701
|
+
return handler.handleYieldCancelUnstake(params);
|
|
702
|
+
} else {
|
|
703
|
+
return Promise.reject(new TransactionError(BasicTxErrorType.INTERNAL_ERROR));
|
|
704
|
+
}
|
|
705
|
+
}
|
|
706
|
+
async handleYieldClaimReward(params) {
|
|
707
|
+
await this.eventService.waitChainReady;
|
|
708
|
+
const {
|
|
709
|
+
slug
|
|
710
|
+
} = params;
|
|
711
|
+
const handler = this.getPoolHandler(slug);
|
|
712
|
+
if (handler) {
|
|
713
|
+
return handler.handleYieldClaimReward(params.address, params.bondReward);
|
|
714
|
+
} else {
|
|
715
|
+
return Promise.reject(new TransactionError(BasicTxErrorType.INTERNAL_ERROR));
|
|
716
|
+
}
|
|
717
|
+
}
|
|
718
|
+
|
|
719
|
+
/* Other */
|
|
720
|
+
|
|
721
|
+
/* Handle actions */
|
|
722
|
+
}
|