@subwallet/extension-base 1.1.28-beta.1 → 1.1.28-beta.2
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 +9 -7
- package/cjs/koni/api/yield/helper/utils.js +2 -2
- package/cjs/koni/background/handlers/Extension.js +25 -1
- package/cjs/services/earning-service/constants/chains.js +2 -2
- package/cjs/services/earning-service/handlers/base.js +24 -6
- package/cjs/services/earning-service/handlers/lending/interlay.js +9 -7
- package/cjs/services/earning-service/handlers/liquid-staking/acala.js +9 -7
- package/cjs/services/earning-service/handlers/liquid-staking/base.js +5 -1
- package/cjs/services/earning-service/handlers/liquid-staking/bifrost.js +9 -7
- package/cjs/services/earning-service/handlers/liquid-staking/parallel.js +9 -7
- package/cjs/services/earning-service/handlers/liquid-staking/stella-swap.js +9 -7
- package/cjs/services/earning-service/handlers/native-staking/amplitude.js +23 -9
- package/cjs/services/earning-service/handlers/native-staking/astar.js +28 -8
- package/cjs/services/earning-service/handlers/native-staking/base-para.js +5 -5
- package/cjs/services/earning-service/handlers/native-staking/base.js +11 -1
- package/cjs/services/earning-service/handlers/native-staking/para-chain.js +21 -7
- package/cjs/services/earning-service/handlers/native-staking/relay-chain.js +35 -18
- package/cjs/services/earning-service/handlers/nomination-pool/index.js +34 -14
- package/cjs/services/earning-service/handlers/special.js +32 -8
- package/cjs/services/earning-service/service.js +41 -17
- package/cjs/services/earning-service/utils/index.js +18 -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 +3 -1
- package/cjs/services/storage-service/DatabaseService.js +4 -0
- package/cjs/services/transaction-service/index.js +3 -3
- package/cjs/types/yield/actions/join/step.js +10 -0
- package/cjs/types/yield/info/base.js +7 -0
- package/cjs/utils/yield/index.js +3 -0
- package/koni/api/yield/helper/utils.js +2 -2
- package/koni/background/handlers/Extension.d.ts +2 -0
- package/koni/background/handlers/Extension.js +25 -1
- package/package.json +11 -1
- package/services/earning-service/constants/chains.js +2 -2
- package/services/earning-service/handlers/base.d.ts +6 -4
- package/services/earning-service/handlers/base.js +24 -6
- package/services/earning-service/handlers/lending/interlay.d.ts +1 -1
- package/services/earning-service/handlers/lending/interlay.js +9 -7
- package/services/earning-service/handlers/liquid-staking/acala.d.ts +2 -2
- package/services/earning-service/handlers/liquid-staking/acala.js +9 -7
- package/services/earning-service/handlers/liquid-staking/base.d.ts +2 -1
- package/services/earning-service/handlers/liquid-staking/base.js +5 -1
- package/services/earning-service/handlers/liquid-staking/bifrost.d.ts +2 -2
- package/services/earning-service/handlers/liquid-staking/bifrost.js +9 -7
- package/services/earning-service/handlers/liquid-staking/parallel.d.ts +2 -2
- package/services/earning-service/handlers/liquid-staking/parallel.js +9 -7
- package/services/earning-service/handlers/liquid-staking/stella-swap.d.ts +1 -1
- package/services/earning-service/handlers/liquid-staking/stella-swap.js +9 -7
- package/services/earning-service/handlers/native-staking/amplitude.js +23 -9
- package/services/earning-service/handlers/native-staking/astar.d.ts +2 -1
- package/services/earning-service/handlers/native-staking/astar.js +28 -8
- package/services/earning-service/handlers/native-staking/base-para.js +5 -5
- package/services/earning-service/handlers/native-staking/base.d.ts +3 -2
- package/services/earning-service/handlers/native-staking/base.js +10 -1
- package/services/earning-service/handlers/native-staking/para-chain.js +21 -7
- package/services/earning-service/handlers/native-staking/relay-chain.js +35 -18
- package/services/earning-service/handlers/nomination-pool/index.d.ts +1 -1
- package/services/earning-service/handlers/nomination-pool/index.js +33 -14
- package/services/earning-service/handlers/special.d.ts +4 -2
- package/services/earning-service/handlers/special.js +32 -8
- package/services/earning-service/service.d.ts +6 -2
- package/services/earning-service/service.js +40 -17
- package/services/earning-service/utils/index.d.ts +5 -1
- package/services/earning-service/utils/index.js +13 -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 +3 -1
- package/services/storage-service/DatabaseService.d.ts +1 -0
- package/services/storage-service/DatabaseService.js +4 -0
- package/services/transaction-service/index.js +3 -3
- package/types/yield/actions/join/step.d.ts +19 -0
- package/types/yield/actions/join/step.js +12 -0
- package/types/yield/actions/others.d.ts +4 -1
- package/types/yield/info/account/info.d.ts +3 -14
- package/types/yield/info/account/reward.d.ts +3 -14
- package/types/yield/info/base.d.ts +17 -0
- package/types/yield/info/base.js +8 -0
- package/types/yield/info/chain/info.d.ts +81 -63
- package/types/yield/info/chain/target.d.ts +4 -0
- package/cjs/koni/api/dotsama/balance.js +0 -464
- package/cjs/services/migration-service/scripts/MigrateEthProvider.js +0 -17
- package/cjs/services/migration-service/scripts/MigratePioneerProvider.js +0 -17
- package/cjs/services/migration-service/scripts/MigrateProvider.js +0 -29
- package/cjs/services/storage-service/index.js +0 -241
- package/cjs/types.js +0 -1
- package/cjs/utils/address.js +0 -34
- package/cjs/utils/keyring.js +0 -57
|
@@ -17,7 +17,21 @@ export default class AmplitudeNativeStakingPoolHandler extends BaseParaNativeSta
|
|
|
17
17
|
async subscribePoolInfo(callback) {
|
|
18
18
|
let cancel = false;
|
|
19
19
|
const nativeToken = this.nativeToken;
|
|
20
|
-
|
|
20
|
+
if (!this.isActive) {
|
|
21
|
+
const data = {
|
|
22
|
+
// TODO
|
|
23
|
+
...this.baseInfo,
|
|
24
|
+
type: this.type,
|
|
25
|
+
metadata: {
|
|
26
|
+
...this.metadataInfo,
|
|
27
|
+
description: this.getDescription()
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
callback(data);
|
|
31
|
+
return () => {
|
|
32
|
+
cancel = true;
|
|
33
|
+
};
|
|
34
|
+
}
|
|
21
35
|
const substrateApi = await this.substrateApi.isReady;
|
|
22
36
|
const unsub = await substrateApi.api.query.parachainStaking.round(async _round => {
|
|
23
37
|
if (cancel) {
|
|
@@ -39,12 +53,13 @@ export default class AmplitudeNativeStakingPoolHandler extends BaseParaNativeSta
|
|
|
39
53
|
const stakeInfo = staked.toPrimitive();
|
|
40
54
|
const data = {
|
|
41
55
|
// TODO
|
|
42
|
-
...
|
|
43
|
-
description: this.description.replaceAll('{{amount}}', minToHuman),
|
|
56
|
+
...this.baseInfo,
|
|
44
57
|
type: this.type,
|
|
45
58
|
metadata: {
|
|
46
|
-
|
|
47
|
-
|
|
59
|
+
...this.metadataInfo,
|
|
60
|
+
description: this.getDescription(minToHuman)
|
|
61
|
+
},
|
|
62
|
+
statistic: {
|
|
48
63
|
maxCandidatePerFarmer: parseInt(maxDelegations),
|
|
49
64
|
maxWithdrawalRequestPerFarmer: 1,
|
|
50
65
|
// by default
|
|
@@ -56,8 +71,7 @@ export default class AmplitudeNativeStakingPoolHandler extends BaseParaNativeSta
|
|
|
56
71
|
// TODO recheck
|
|
57
72
|
totalApy: undefined,
|
|
58
73
|
// TODO recheck
|
|
59
|
-
unstakingPeriod
|
|
60
|
-
allowCancelUnstaking: true
|
|
74
|
+
unstakingPeriod
|
|
61
75
|
}
|
|
62
76
|
};
|
|
63
77
|
callback(data);
|
|
@@ -135,7 +149,7 @@ export default class AmplitudeNativeStakingPoolHandler extends BaseParaNativeSta
|
|
|
135
149
|
async subscribePoolPosition(useAddresses, resultCallback) {
|
|
136
150
|
let cancel = false;
|
|
137
151
|
const substrateApi = await this.substrateApi.isReady;
|
|
138
|
-
const defaultInfo = this.
|
|
152
|
+
const defaultInfo = this.baseInfo;
|
|
139
153
|
const chainInfo = this.chainInfo;
|
|
140
154
|
const unsub = await substrateApi.api.query.parachainStaking.delegatorState.multi(useAddresses, async ledgers => {
|
|
141
155
|
if (cancel) {
|
|
@@ -195,7 +209,7 @@ export default class AmplitudeNativeStakingPoolHandler extends BaseParaNativeSta
|
|
|
195
209
|
return;
|
|
196
210
|
}
|
|
197
211
|
callBack({
|
|
198
|
-
...this.
|
|
212
|
+
...this.baseInfo,
|
|
199
213
|
address: address,
|
|
200
214
|
type: this.type,
|
|
201
215
|
unclaimedReward: _unclaimedReward.toString(),
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { _ChainInfo } from '@subwallet/chain-list/types';
|
|
2
2
|
import { ExtrinsicType, UnstakingInfo } from '@subwallet/extension-base/background/KoniTypes';
|
|
3
3
|
import { _SubstrateApi } from '@subwallet/extension-base/services/chain-service/types';
|
|
4
|
-
import { BaseYieldPositionInfo, PalletDappsStakingAccountLedger, StakeCancelWithdrawalParams, SubmitJoinNativeStaking, TransactionData, ValidatorInfo, YieldPoolInfo, YieldPositionInfo, YieldStepBaseInfo, YieldTokenBaseInfo } from '@subwallet/extension-base/types';
|
|
4
|
+
import { BaseYieldPoolMetadata, BaseYieldPositionInfo, PalletDappsStakingAccountLedger, StakeCancelWithdrawalParams, SubmitJoinNativeStaking, TransactionData, ValidatorInfo, YieldPoolInfo, YieldPositionInfo, YieldStepBaseInfo, YieldTokenBaseInfo } from '@subwallet/extension-base/types';
|
|
5
5
|
import BaseParaNativeStakingPoolHandler from './base-para';
|
|
6
6
|
export declare function getAstarWithdrawable(yieldPosition: YieldPositionInfo): UnstakingInfo | undefined;
|
|
7
7
|
export default class AstarNativeStakingPoolHandler extends BaseParaNativeStakingPoolHandler {
|
|
8
|
+
protected get metadataInfo(): Omit<BaseYieldPoolMetadata, 'description'>;
|
|
8
9
|
subscribePoolInfo(callback: (data: YieldPoolInfo) => void): Promise<VoidFunction>;
|
|
9
10
|
parseNominatorMetadata(chainInfo: _ChainInfo, address: string, substrateApi: _SubstrateApi, ledger: PalletDappsStakingAccountLedger): Promise<Omit<YieldPositionInfo, keyof BaseYieldPositionInfo>>;
|
|
10
11
|
subscribePoolPosition(useAddresses: string[], resultCallback: (rs: YieldPositionInfo) => void): Promise<VoidFunction>;
|
|
@@ -35,12 +35,32 @@ export function getAstarWithdrawable(yieldPosition) {
|
|
|
35
35
|
}
|
|
36
36
|
}
|
|
37
37
|
export default class AstarNativeStakingPoolHandler extends BaseParaNativeStakingPoolHandler {
|
|
38
|
+
get metadataInfo() {
|
|
39
|
+
const result = super.metadataInfo;
|
|
40
|
+
result.allowCancelUnstaking = false;
|
|
41
|
+
return result;
|
|
42
|
+
}
|
|
43
|
+
|
|
38
44
|
/* Subscribe pool info */
|
|
39
45
|
|
|
40
46
|
async subscribePoolInfo(callback) {
|
|
41
47
|
let cancel = false;
|
|
42
48
|
const nativeToken = this.nativeToken;
|
|
43
|
-
|
|
49
|
+
if (!this.isActive) {
|
|
50
|
+
const data = {
|
|
51
|
+
// TODO
|
|
52
|
+
...this.baseInfo,
|
|
53
|
+
type: this.type,
|
|
54
|
+
metadata: {
|
|
55
|
+
...this.metadataInfo,
|
|
56
|
+
description: this.getDescription()
|
|
57
|
+
}
|
|
58
|
+
};
|
|
59
|
+
callback(data);
|
|
60
|
+
return () => {
|
|
61
|
+
cancel = true;
|
|
62
|
+
};
|
|
63
|
+
}
|
|
44
64
|
const apyPromise = new Promise(resolve => {
|
|
45
65
|
fetch(`https://api.astar.network/api/v1/${this.chain}/dapps-staking/apy`, {
|
|
46
66
|
method: 'GET'
|
|
@@ -75,12 +95,13 @@ export default class AstarNativeStakingPoolHandler extends BaseParaNativeStaking
|
|
|
75
95
|
const minToHuman = formatNumber(minDelegatorStake, nativeToken.decimals || 0, balanceFormatter);
|
|
76
96
|
const data = {
|
|
77
97
|
// TODO
|
|
78
|
-
...
|
|
79
|
-
description: this.description.replaceAll('{{amount}}', minToHuman),
|
|
98
|
+
...this.baseInfo,
|
|
80
99
|
type: this.type,
|
|
81
100
|
metadata: {
|
|
82
|
-
|
|
83
|
-
|
|
101
|
+
...this.metadataInfo,
|
|
102
|
+
description: this.getDescription(minToHuman)
|
|
103
|
+
},
|
|
104
|
+
statistic: {
|
|
84
105
|
maxCandidatePerFarmer: 100,
|
|
85
106
|
// temporary fix for Astar, there's no limit for now
|
|
86
107
|
maxWithdrawalRequestPerFarmer: 1,
|
|
@@ -93,8 +114,7 @@ export default class AstarNativeStakingPoolHandler extends BaseParaNativeStaking
|
|
|
93
114
|
// TODO recheck
|
|
94
115
|
totalApy: apyInfo !== null ? apyInfo : undefined,
|
|
95
116
|
// TODO recheck
|
|
96
|
-
unstakingPeriod
|
|
97
|
-
allowCancelUnstaking: false
|
|
117
|
+
unstakingPeriod
|
|
98
118
|
}
|
|
99
119
|
};
|
|
100
120
|
callback(data);
|
|
@@ -201,7 +221,7 @@ export default class AstarNativeStakingPoolHandler extends BaseParaNativeStaking
|
|
|
201
221
|
async subscribePoolPosition(useAddresses, resultCallback) {
|
|
202
222
|
let cancel = false;
|
|
203
223
|
const substrateApi = await this.substrateApi.isReady;
|
|
204
|
-
const defaultInfo = this.
|
|
224
|
+
const defaultInfo = this.baseInfo;
|
|
205
225
|
const chainInfo = this.chainInfo;
|
|
206
226
|
const unsub = await substrateApi.api.query.dappsStaking.ledger.multi(useAddresses, async ledgers => {
|
|
207
227
|
if (cancel) {
|
|
@@ -29,17 +29,17 @@ export default class BaseParaNativeStakingPoolHandler extends BaseNativeStakingP
|
|
|
29
29
|
const poolInfo = await this.getPoolInfo();
|
|
30
30
|
const poolPosition = await this.getPoolPosition(address);
|
|
31
31
|
const chainInfo = this.chainInfo;
|
|
32
|
-
if (!poolInfo) {
|
|
32
|
+
if (!poolInfo || !poolInfo.statistic) {
|
|
33
33
|
return Promise.resolve([new TransactionError(BasicTxErrorType.INTERNAL_ERROR)]);
|
|
34
34
|
}
|
|
35
35
|
const errors = [];
|
|
36
36
|
const selectedCollator = selectedValidators[0];
|
|
37
37
|
let bnTotalStake = new BN(amount);
|
|
38
|
-
const bnChainMinStake = new BN(poolInfo.
|
|
38
|
+
const bnChainMinStake = new BN(poolInfo.statistic.minJoinPool || '0');
|
|
39
39
|
const bnCollatorMinStake = new BN(selectedCollator.minBond || '0');
|
|
40
40
|
const bnMinStake = bnCollatorMinStake > bnChainMinStake ? bnCollatorMinStake : bnChainMinStake;
|
|
41
41
|
const minStakeErrorMessage = getMinStakeErrorMessage(chainInfo, bnMinStake);
|
|
42
|
-
const maxValidator = poolInfo.
|
|
42
|
+
const maxValidator = poolInfo.statistic.maxCandidatePerFarmer;
|
|
43
43
|
const maxValidatorErrorMessage = getMaxValidatorErrorMessage(chainInfo, maxValidator);
|
|
44
44
|
const existUnstakeErrorMessage = getExistUnstakeErrorMessage(chainInfo.slug, StakingType.NOMINATED, true);
|
|
45
45
|
if (!poolPosition || poolPosition.status === EarningStatus.NOT_STAKING) {
|
|
@@ -93,7 +93,7 @@ export default class BaseParaNativeStakingPoolHandler extends BaseNativeStakingP
|
|
|
93
93
|
const errors = [];
|
|
94
94
|
const poolInfo = await this.getPoolInfo();
|
|
95
95
|
const poolPosition = await this.getPoolPosition(address);
|
|
96
|
-
if (!poolInfo || !poolPosition || fastLeave || !selectedTarget) {
|
|
96
|
+
if (!poolInfo || !poolInfo.statistic || !poolPosition || fastLeave || !selectedTarget) {
|
|
97
97
|
return [new TransactionError(BasicTxErrorType.INTERNAL_ERROR)];
|
|
98
98
|
}
|
|
99
99
|
if (fastLeave) {
|
|
@@ -112,7 +112,7 @@ export default class BaseParaNativeStakingPoolHandler extends BaseNativeStakingP
|
|
|
112
112
|
}
|
|
113
113
|
const bnActiveStake = new BN(targetNomination.activeStake);
|
|
114
114
|
const bnRemainingStake = bnActiveStake.sub(new BN(amount));
|
|
115
|
-
const bnChainMinStake = new BN(poolInfo.
|
|
115
|
+
const bnChainMinStake = new BN(poolInfo.statistic.minJoinPool || '0');
|
|
116
116
|
const bnCollatorMinStake = new BN(targetNomination.validatorMinStake || '0');
|
|
117
117
|
const bnMinStake = BN.max(bnCollatorMinStake, bnChainMinStake);
|
|
118
118
|
const existUnstakeErrorMessage = getExistUnstakeErrorMessage(this.chain, StakingType.NOMINATED);
|
|
@@ -1,14 +1,15 @@
|
|
|
1
1
|
import { ExtrinsicType } from '@subwallet/extension-base/background/KoniTypes';
|
|
2
2
|
import KoniState from '@subwallet/extension-base/koni/background/handlers/State';
|
|
3
|
-
import { EarningRewardItem, HandleYieldStepData, OptimalYieldPath, OptimalYieldPathParams, SubmitJoinNativeStaking, SubmitYieldJoinData, TransactionData, YieldPoolType, YieldPositionInfo, YieldStepBaseInfo, YieldTokenBaseInfo } from '@subwallet/extension-base/types';
|
|
3
|
+
import { BaseYieldPoolMetadata, EarningRewardItem, HandleYieldStepData, OptimalYieldPath, OptimalYieldPathParams, SubmitJoinNativeStaking, SubmitYieldJoinData, TransactionData, YieldPoolType, YieldPositionInfo, YieldStepBaseInfo, YieldTokenBaseInfo } from '@subwallet/extension-base/types';
|
|
4
4
|
import BasePoolHandler from '../base';
|
|
5
5
|
export default abstract class BaseNativeStakingPoolHandler extends BasePoolHandler {
|
|
6
6
|
readonly type = YieldPoolType.NATIVE_STAKING;
|
|
7
|
-
protected readonly description: string;
|
|
8
7
|
protected readonly name: string;
|
|
9
8
|
protected readonly shortName: string;
|
|
10
9
|
slug: string;
|
|
11
10
|
constructor(state: KoniState, chain: string);
|
|
11
|
+
protected getDescription(amount?: string): string;
|
|
12
|
+
protected get metadataInfo(): Omit<BaseYieldPoolMetadata, 'description'>;
|
|
12
13
|
getPoolReward(useAddresses: string[], callBack: (rs: EarningRewardItem) => void): Promise<VoidFunction>;
|
|
13
14
|
get defaultSubmitStep(): YieldStepBaseInfo;
|
|
14
15
|
abstract createJoinExtrinsic(data: SubmitJoinNativeStaking, positionInfo?: YieldPositionInfo, bondDest?: string): Promise<[TransactionData, YieldTokenBaseInfo]>;
|
|
@@ -16,7 +16,16 @@ export default class BaseNativeStakingPoolHandler extends BasePoolHandler {
|
|
|
16
16
|
this.slug = `${symbol}___native_staking___${_chainInfo.slug}`;
|
|
17
17
|
this.name = `${_chainInfo.name} Native Staking`;
|
|
18
18
|
this.shortName = _chainInfo.name.replaceAll(' Relay Chain', '');
|
|
19
|
-
|
|
19
|
+
}
|
|
20
|
+
getDescription(amount = '0') {
|
|
21
|
+
const _chainAsset = this.nativeToken;
|
|
22
|
+
const symbol = _chainAsset.symbol;
|
|
23
|
+
return `Start staking with just {{amount}} ${symbol}`.replace('{{amount}}', amount);
|
|
24
|
+
}
|
|
25
|
+
get metadataInfo() {
|
|
26
|
+
const result = super.metadataInfo;
|
|
27
|
+
result.allowCancelUnstaking = true;
|
|
28
|
+
return result;
|
|
20
29
|
}
|
|
21
30
|
|
|
22
31
|
/* Get pool reward */
|
|
@@ -17,7 +17,21 @@ export default class ParaNativeStakingPoolHandler extends BaseParaNativeStakingP
|
|
|
17
17
|
let cancel = false;
|
|
18
18
|
const chainApi = this.substrateApi;
|
|
19
19
|
const nativeToken = this.nativeToken;
|
|
20
|
-
|
|
20
|
+
if (!this.isActive) {
|
|
21
|
+
const data = {
|
|
22
|
+
// TODO
|
|
23
|
+
...this.baseInfo,
|
|
24
|
+
type: this.type,
|
|
25
|
+
metadata: {
|
|
26
|
+
...this.metadataInfo,
|
|
27
|
+
description: this.getDescription()
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
callback(data);
|
|
31
|
+
return () => {
|
|
32
|
+
cancel = true;
|
|
33
|
+
};
|
|
34
|
+
}
|
|
21
35
|
await chainApi.isReady;
|
|
22
36
|
const unsub = await chainApi.api.query.parachainStaking.round(async _round => {
|
|
23
37
|
var _chainApi$api$consts, _chainApi$api$consts$, _chainApi$api$consts$2;
|
|
@@ -52,12 +66,13 @@ export default class ParaNativeStakingPoolHandler extends BaseParaNativeStakingP
|
|
|
52
66
|
const minToHuman = formatNumber(minStake.toString(), nativeToken.decimals || 0, balanceFormatter);
|
|
53
67
|
const data = {
|
|
54
68
|
// TODO
|
|
55
|
-
...
|
|
56
|
-
description: this.description.replaceAll('{{amount}}', minToHuman),
|
|
69
|
+
...this.baseInfo,
|
|
57
70
|
type: this.type,
|
|
58
71
|
metadata: {
|
|
59
|
-
|
|
60
|
-
|
|
72
|
+
...this.metadataInfo,
|
|
73
|
+
description: this.getDescription(minToHuman)
|
|
74
|
+
},
|
|
75
|
+
statistic: {
|
|
61
76
|
maxCandidatePerFarmer: parseInt(maxDelegations),
|
|
62
77
|
maxWithdrawalRequestPerFarmer: 1,
|
|
63
78
|
// by default
|
|
@@ -69,7 +84,6 @@ export default class ParaNativeStakingPoolHandler extends BaseParaNativeStakingP
|
|
|
69
84
|
// not have
|
|
70
85
|
tvl: totalStake.toString(),
|
|
71
86
|
unstakingPeriod: unstakingPeriod,
|
|
72
|
-
allowCancelUnstaking: true,
|
|
73
87
|
inflation
|
|
74
88
|
}
|
|
75
89
|
};
|
|
@@ -169,7 +183,7 @@ export default class ParaNativeStakingPoolHandler extends BaseParaNativeStakingP
|
|
|
169
183
|
async subscribePoolPosition(useAddresses, resultCallback) {
|
|
170
184
|
let cancel = false;
|
|
171
185
|
const substrateApi = this.substrateApi;
|
|
172
|
-
const defaultInfo = this.
|
|
186
|
+
const defaultInfo = this.baseInfo;
|
|
173
187
|
const chainInfo = this.chainInfo;
|
|
174
188
|
await substrateApi.isReady;
|
|
175
189
|
const unsub = await substrateApi.api.query.parachainStaking.delegatorState.multi(useAddresses, async ledgers => {
|
|
@@ -22,7 +22,21 @@ export default class RelayNativeStakingPoolHandler extends BaseNativeStakingPool
|
|
|
22
22
|
const substrateApi = this.substrateApi;
|
|
23
23
|
const chainInfo = this.chainInfo;
|
|
24
24
|
const nativeToken = this.nativeToken;
|
|
25
|
-
|
|
25
|
+
if (!this.isActive) {
|
|
26
|
+
const data = {
|
|
27
|
+
// TODO
|
|
28
|
+
...this.baseInfo,
|
|
29
|
+
type: this.type,
|
|
30
|
+
metadata: {
|
|
31
|
+
...this.metadataInfo,
|
|
32
|
+
description: this.getDescription()
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
callback(data);
|
|
36
|
+
return () => {
|
|
37
|
+
cancel = true;
|
|
38
|
+
};
|
|
39
|
+
}
|
|
26
40
|
await substrateApi.isReady;
|
|
27
41
|
const unsub = await ((_substrateApi$api$que = substrateApi.api.query.staking) === null || _substrateApi$api$que === void 0 ? void 0 : _substrateApi$api$que.currentEra(async _currentEra => {
|
|
28
42
|
var _substrateApi$api$con, _substrateApi$api$con2, _substrateApi$api$que2, _substrateApi$api$que3, _substrateApi$api$que4, _substrateApi$api$que5, _substrateApi$api$que6;
|
|
@@ -52,12 +66,13 @@ export default class RelayNativeStakingPoolHandler extends BaseNativeStakingPool
|
|
|
52
66
|
const minToHuman = formatNumber(minStake.toString(), nativeToken.decimals || 0, balanceFormatter);
|
|
53
67
|
const data = {
|
|
54
68
|
// TODO
|
|
55
|
-
...
|
|
56
|
-
description: this.description.replaceAll('{{amount}}', minToHuman),
|
|
69
|
+
...this.baseInfo,
|
|
57
70
|
type: this.type,
|
|
58
71
|
metadata: {
|
|
59
|
-
|
|
60
|
-
|
|
72
|
+
...this.metadataInfo,
|
|
73
|
+
description: this.getDescription(minToHuman)
|
|
74
|
+
},
|
|
75
|
+
statistic: {
|
|
61
76
|
maxCandidatePerFarmer: parseInt(maxNominations),
|
|
62
77
|
maxWithdrawalRequestPerFarmer: parseInt(maxUnlockingChunks),
|
|
63
78
|
// TODO recheck
|
|
@@ -69,7 +84,6 @@ export default class RelayNativeStakingPoolHandler extends BaseNativeStakingPool
|
|
|
69
84
|
totalApy: expectedReturn,
|
|
70
85
|
// TODO recheck
|
|
71
86
|
unstakingPeriod: unlockingPeriod,
|
|
72
|
-
allowCancelUnstaking: true,
|
|
73
87
|
inflation: inflation
|
|
74
88
|
}
|
|
75
89
|
};
|
|
@@ -134,7 +148,7 @@ export default class RelayNativeStakingPoolHandler extends BaseNativeStakingPool
|
|
|
134
148
|
let stakingStatus = EarningStatus.NOT_EARNING;
|
|
135
149
|
const bnActiveStake = new BN(activeStake);
|
|
136
150
|
let waitingNominationCount = 0;
|
|
137
|
-
if (bnActiveStake.gte(minStake)) {
|
|
151
|
+
if (bnActiveStake.gte(minStake) && bnActiveStake.gt(BN_ZERO)) {
|
|
138
152
|
for (const nomination of nominationList) {
|
|
139
153
|
if (nomination.status === EarningStatus.EARNING_REWARD) {
|
|
140
154
|
// only need 1 earning nomination to count
|
|
@@ -173,7 +187,7 @@ export default class RelayNativeStakingPoolHandler extends BaseNativeStakingPool
|
|
|
173
187
|
var _substrateApi$api$que19;
|
|
174
188
|
let cancel = false;
|
|
175
189
|
const substrateApi = await this.substrateApi.isReady;
|
|
176
|
-
const defaultInfo = this.
|
|
190
|
+
const defaultInfo = this.baseInfo;
|
|
177
191
|
const chainInfo = this.chainInfo;
|
|
178
192
|
const unsub = await ((_substrateApi$api$que19 = substrateApi.api.query.staking) === null || _substrateApi$api$que19 === void 0 ? void 0 : _substrateApi$api$que19.ledger.multi(useAddresses, async ledgers => {
|
|
179
193
|
if (cancel) {
|
|
@@ -225,7 +239,7 @@ export default class RelayNativeStakingPoolHandler extends BaseNativeStakingPool
|
|
|
225
239
|
const decimals = this.nativeToken.decimals || 0;
|
|
226
240
|
const chainApi = await this.substrateApi.isReady;
|
|
227
241
|
const poolInfo = await this.getPoolInfo();
|
|
228
|
-
if (!poolInfo) {
|
|
242
|
+
if (!poolInfo || !poolInfo.statistic) {
|
|
229
243
|
return Promise.reject(new TransactionError(BasicTxErrorType.INTERNAL_ERROR));
|
|
230
244
|
}
|
|
231
245
|
const _era = await chainApi.api.query.staking.currentEra();
|
|
@@ -292,13 +306,13 @@ export default class RelayNativeStakingPoolHandler extends BaseNativeStakingPool
|
|
|
292
306
|
const commission = extraInfoMap[validator.address].commission;
|
|
293
307
|
const bnValidatorStake = totalStakeMap[validator.address].div(bnDecimals);
|
|
294
308
|
if (_STAKING_CHAIN_GROUP.aleph.includes(this.chain)) {
|
|
295
|
-
validator.expectedReturn = calculateAlephZeroValidatorReturn(poolInfo.
|
|
309
|
+
validator.expectedReturn = calculateAlephZeroValidatorReturn(poolInfo.statistic.totalApy, getCommission(commission));
|
|
296
310
|
} else if (_STAKING_CHAIN_GROUP.ternoa.includes(this.chain)) {
|
|
297
311
|
const rewardPerValidator = new BN(stakingRewards.sessionExtraRewardPayout).divn(allValidators.length).div(bnDecimals);
|
|
298
312
|
const validatorStake = totalStakeMap[validator.address].div(bnDecimals).toNumber();
|
|
299
313
|
validator.expectedReturn = calculateTernoaValidatorReturn(rewardPerValidator.toNumber(), validatorStake, getCommission(commission));
|
|
300
314
|
} else {
|
|
301
|
-
validator.expectedReturn = calculateValidatorStakedReturn(poolInfo.
|
|
315
|
+
validator.expectedReturn = calculateValidatorStakedReturn(poolInfo.statistic.totalApy, bnValidatorStake, bnAvgStake, getCommission(commission));
|
|
302
316
|
}
|
|
303
317
|
validator.commission = parseFloat(commission.split('%')[0]);
|
|
304
318
|
validator.blocked = extraInfoMap[validator.address].blocked;
|
|
@@ -325,16 +339,19 @@ export default class RelayNativeStakingPoolHandler extends BaseNativeStakingPool
|
|
|
325
339
|
return Promise.resolve([new TransactionError(BasicTxErrorType.INTERNAL_ERROR)]);
|
|
326
340
|
}
|
|
327
341
|
const poolInfo = _poolInfo;
|
|
342
|
+
if (!poolInfo.statistic) {
|
|
343
|
+
return Promise.resolve([new TransactionError(BasicTxErrorType.INTERNAL_ERROR)]);
|
|
344
|
+
}
|
|
328
345
|
const errors = [];
|
|
329
346
|
let bnTotalStake = new BN(amount);
|
|
330
|
-
const bnMinStake = new BN(poolInfo.
|
|
347
|
+
const bnMinStake = new BN(poolInfo.statistic.minJoinPool);
|
|
331
348
|
const minStakeErrorMessage = getMinStakeErrorMessage(chainInfo, bnMinStake);
|
|
332
|
-
const maxValidatorErrorMessage = getMaxValidatorErrorMessage(chainInfo, poolInfo.
|
|
349
|
+
const maxValidatorErrorMessage = getMaxValidatorErrorMessage(chainInfo, poolInfo.statistic.maxCandidatePerFarmer);
|
|
333
350
|
if (!poolPosition || poolPosition.status === EarningStatus.NOT_STAKING) {
|
|
334
351
|
if (!bnTotalStake.gte(bnMinStake)) {
|
|
335
352
|
errors.push(new TransactionError(StakingTxErrorType.NOT_ENOUGH_MIN_STAKE, minStakeErrorMessage));
|
|
336
353
|
}
|
|
337
|
-
if (selectedValidators.length > poolInfo.
|
|
354
|
+
if (selectedValidators.length > poolInfo.statistic.maxCandidatePerFarmer) {
|
|
338
355
|
errors.push(new TransactionError(StakingTxErrorType.EXCEED_MAX_NOMINATIONS, maxValidatorErrorMessage));
|
|
339
356
|
}
|
|
340
357
|
return errors;
|
|
@@ -344,7 +361,7 @@ export default class RelayNativeStakingPoolHandler extends BaseNativeStakingPool
|
|
|
344
361
|
if (!bnTotalStake.gte(bnMinStake)) {
|
|
345
362
|
errors.push(new TransactionError(StakingTxErrorType.NOT_ENOUGH_MIN_STAKE, minStakeErrorMessage));
|
|
346
363
|
}
|
|
347
|
-
if (selectedValidators.length > poolInfo.
|
|
364
|
+
if (selectedValidators.length > poolInfo.statistic.maxCandidatePerFarmer) {
|
|
348
365
|
errors.push(new TransactionError(StakingTxErrorType.EXCEED_MAX_NOMINATIONS, maxValidatorErrorMessage));
|
|
349
366
|
}
|
|
350
367
|
return errors;
|
|
@@ -436,7 +453,7 @@ export default class RelayNativeStakingPoolHandler extends BaseNativeStakingPool
|
|
|
436
453
|
const errors = [];
|
|
437
454
|
const poolInfo = await this.getPoolInfo();
|
|
438
455
|
const poolPosition = await this.getPoolPosition(address);
|
|
439
|
-
if (!poolInfo || !poolPosition || fastLeave) {
|
|
456
|
+
if (!poolInfo || !poolInfo.statistic || !poolPosition || fastLeave) {
|
|
440
457
|
return [new TransactionError(BasicTxErrorType.INTERNAL_ERROR)];
|
|
441
458
|
}
|
|
442
459
|
if (fastLeave) {
|
|
@@ -444,8 +461,8 @@ export default class RelayNativeStakingPoolHandler extends BaseNativeStakingPool
|
|
|
444
461
|
}
|
|
445
462
|
const bnActiveStake = new BN(poolPosition.activeStake);
|
|
446
463
|
const bnRemainingStake = bnActiveStake.sub(new BN(amount));
|
|
447
|
-
const minStake = new BN(poolInfo.
|
|
448
|
-
const maxUnstake = poolInfo.
|
|
464
|
+
const minStake = new BN(poolInfo.statistic.minJoinPool || '0');
|
|
465
|
+
const maxUnstake = poolInfo.statistic.maxWithdrawalRequestPerFarmer;
|
|
449
466
|
if (!(bnRemainingStake.isZero() || bnRemainingStake.gte(minStake))) {
|
|
450
467
|
errors.push(new TransactionError(StakingTxErrorType.INVALID_ACTIVE_STAKE));
|
|
451
468
|
}
|
|
@@ -6,11 +6,11 @@ import { BaseYieldPositionInfo, EarningRewardItem, HandleYieldStepData, Nominati
|
|
|
6
6
|
import BasePoolHandler from '../base';
|
|
7
7
|
export default class NominationPoolHandler extends BasePoolHandler {
|
|
8
8
|
readonly type = YieldPoolType.NOMINATION_POOL;
|
|
9
|
-
protected readonly description: string;
|
|
10
9
|
protected readonly name: string;
|
|
11
10
|
protected readonly shortName: string;
|
|
12
11
|
slug: string;
|
|
13
12
|
constructor(state: KoniState, chain: string);
|
|
13
|
+
protected getDescription(amount?: string): string;
|
|
14
14
|
subscribePoolInfo(callback: (data: YieldPoolInfo) => void): Promise<VoidFunction>;
|
|
15
15
|
parsePoolMemberMetadata(substrateApi: _SubstrateApi, poolMemberInfo: PalletNominationPoolsPoolMember): Promise<Omit<YieldPositionInfo, keyof BaseYieldPositionInfo>>;
|
|
16
16
|
subscribePoolPosition(useAddresses: string[], resultCallback: (rs: YieldPositionInfo) => void): Promise<VoidFunction>;
|
|
@@ -23,7 +23,11 @@ export default class NominationPoolHandler extends BasePoolHandler {
|
|
|
23
23
|
this.slug = `${symbol}___nomination_pool___${_chainInfo.slug}`;
|
|
24
24
|
this.name = `${tokenName} Nomination Pool`;
|
|
25
25
|
this.shortName = _chainInfo.name.replaceAll(' Relay Chain', '');
|
|
26
|
-
|
|
26
|
+
}
|
|
27
|
+
getDescription(amount = '0') {
|
|
28
|
+
const _chainAsset = this.nativeToken;
|
|
29
|
+
const symbol = _chainAsset.symbol;
|
|
30
|
+
return `Start staking with just {{amount}} ${symbol}`.replace('{{amount}}', amount);
|
|
27
31
|
}
|
|
28
32
|
|
|
29
33
|
/* Subscribe pool info */
|
|
@@ -34,7 +38,21 @@ export default class NominationPoolHandler extends BasePoolHandler {
|
|
|
34
38
|
const substrateApi = this.substrateApi;
|
|
35
39
|
const chainInfo = this.chainInfo;
|
|
36
40
|
const nativeToken = this.nativeToken;
|
|
37
|
-
|
|
41
|
+
if (!this.isActive) {
|
|
42
|
+
const data = {
|
|
43
|
+
// TODO
|
|
44
|
+
...this.baseInfo,
|
|
45
|
+
type: this.type,
|
|
46
|
+
metadata: {
|
|
47
|
+
...this.metadataInfo,
|
|
48
|
+
description: this.getDescription()
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
callback(data);
|
|
52
|
+
return () => {
|
|
53
|
+
cancel = true;
|
|
54
|
+
};
|
|
55
|
+
}
|
|
38
56
|
await substrateApi.isReady;
|
|
39
57
|
const unsub = await ((_substrateApi$api$que = substrateApi.api.query.staking) === null || _substrateApi$api$que === void 0 ? void 0 : _substrateApi$api$que.currentEra(async _currentEra => {
|
|
40
58
|
var _substrateApi$api$que2, _substrateApi$api$que3, _substrateApi$api$que4;
|
|
@@ -62,12 +80,13 @@ export default class NominationPoolHandler extends BasePoolHandler {
|
|
|
62
80
|
const minToHuman = formatNumber(minPoolJoin || '0', nativeToken.decimals || 0, balanceFormatter);
|
|
63
81
|
const data = {
|
|
64
82
|
// TODO
|
|
65
|
-
...
|
|
66
|
-
description: this.description.replaceAll('{{amount}}', minToHuman),
|
|
83
|
+
...this.baseInfo,
|
|
67
84
|
type: this.type,
|
|
68
85
|
metadata: {
|
|
69
|
-
|
|
70
|
-
|
|
86
|
+
...this.metadataInfo,
|
|
87
|
+
description: this.getDescription(minToHuman)
|
|
88
|
+
},
|
|
89
|
+
statistic: {
|
|
71
90
|
maxCandidatePerFarmer: 1,
|
|
72
91
|
maxWithdrawalRequestPerFarmer: parseInt(maxUnlockingChunks),
|
|
73
92
|
// TODO recheck
|
|
@@ -80,7 +99,6 @@ export default class NominationPoolHandler extends BasePoolHandler {
|
|
|
80
99
|
totalApy: expectedReturn,
|
|
81
100
|
// TODO recheck
|
|
82
101
|
unstakingPeriod: unlockingPeriod,
|
|
83
|
-
allowCancelUnstaking: false,
|
|
84
102
|
inflation: inflation
|
|
85
103
|
}
|
|
86
104
|
};
|
|
@@ -170,7 +188,7 @@ export default class NominationPoolHandler extends BasePoolHandler {
|
|
|
170
188
|
var _substrateApi$api$que5, _substrateApi$api$que6;
|
|
171
189
|
let cancel = false;
|
|
172
190
|
const substrateApi = this.substrateApi;
|
|
173
|
-
const defaultInfo = this.
|
|
191
|
+
const defaultInfo = this.baseInfo;
|
|
174
192
|
await substrateApi.isReady;
|
|
175
193
|
const unsub = await ((_substrateApi$api$que5 = substrateApi.api.query) === null || _substrateApi$api$que5 === void 0 ? void 0 : (_substrateApi$api$que6 = _substrateApi$api$que5.nominationPools) === null || _substrateApi$api$que6 === void 0 ? void 0 : _substrateApi$api$que6.poolMembers.multi(useAddresses, async ledgers => {
|
|
176
194
|
if (cancel) {
|
|
@@ -229,7 +247,7 @@ export default class NominationPoolHandler extends BasePoolHandler {
|
|
|
229
247
|
const _unclaimedReward = await ((_substrateApi$api$cal = substrateApi.api.call) === null || _substrateApi$api$cal === void 0 ? void 0 : (_substrateApi$api$cal2 = _substrateApi$api$cal.nominationPoolsApi) === null || _substrateApi$api$cal2 === void 0 ? void 0 : _substrateApi$api$cal2.pendingRewards(address));
|
|
230
248
|
if (_unclaimedReward) {
|
|
231
249
|
callBack({
|
|
232
|
-
...this.
|
|
250
|
+
...this.baseInfo,
|
|
233
251
|
address: address,
|
|
234
252
|
type: this.type,
|
|
235
253
|
unclaimedReward: _unclaimedReward.toString(),
|
|
@@ -322,13 +340,14 @@ export default class NominationPoolHandler extends BasePoolHandler {
|
|
|
322
340
|
}, fee];
|
|
323
341
|
}
|
|
324
342
|
async validateYieldJoin(data, path) {
|
|
343
|
+
var _poolInfo$statistic;
|
|
325
344
|
const {
|
|
326
345
|
address,
|
|
327
346
|
amount,
|
|
328
347
|
selectedPool
|
|
329
348
|
} = data;
|
|
330
349
|
const _poolInfo = await this.getPoolInfo();
|
|
331
|
-
if (!_poolInfo) {
|
|
350
|
+
if (!_poolInfo || !_poolInfo.statistic) {
|
|
332
351
|
return Promise.resolve([new TransactionError(BasicTxErrorType.INTERNAL_ERROR)]);
|
|
333
352
|
}
|
|
334
353
|
const poolInfo = _poolInfo;
|
|
@@ -339,7 +358,7 @@ export default class NominationPoolHandler extends BasePoolHandler {
|
|
|
339
358
|
// amount >= min stake
|
|
340
359
|
const errors = [];
|
|
341
360
|
let bnTotalStake = new BN(amount);
|
|
342
|
-
const bnMinStake = new BN(poolInfo.
|
|
361
|
+
const bnMinStake = new BN(((_poolInfo$statistic = poolInfo.statistic) === null || _poolInfo$statistic === void 0 ? void 0 : _poolInfo$statistic.minJoinPool) || '0');
|
|
343
362
|
const minStakeErrorMessage = getMinStakeErrorMessage(chainInfo, bnMinStake);
|
|
344
363
|
const existUnstakeErrorMessage = getExistUnstakeErrorMessage(chainInfo.slug, StakingType.POOLED, true);
|
|
345
364
|
if (selectedPool.state !== 'Open') {
|
|
@@ -422,7 +441,7 @@ export default class NominationPoolHandler extends BasePoolHandler {
|
|
|
422
441
|
const errors = [];
|
|
423
442
|
const poolInfo = await this.getPoolInfo();
|
|
424
443
|
const poolPosition = await this.getPoolPosition(address);
|
|
425
|
-
if (!poolInfo || !poolPosition || fastLeave) {
|
|
444
|
+
if (!poolInfo || !poolPosition || fastLeave || !poolInfo.statistic) {
|
|
426
445
|
return [new TransactionError(BasicTxErrorType.INTERNAL_ERROR)];
|
|
427
446
|
}
|
|
428
447
|
if (fastLeave) {
|
|
@@ -430,8 +449,8 @@ export default class NominationPoolHandler extends BasePoolHandler {
|
|
|
430
449
|
}
|
|
431
450
|
const bnActiveStake = new BN(poolPosition.activeStake);
|
|
432
451
|
const bnRemainingStake = bnActiveStake.sub(new BN(amount));
|
|
433
|
-
const minStake = new BN(poolInfo.
|
|
434
|
-
const maxUnstake = poolInfo.
|
|
452
|
+
const minStake = new BN(poolInfo.statistic.minJoinPool || '0');
|
|
453
|
+
const maxUnstake = poolInfo.statistic.maxWithdrawalRequestPerFarmer;
|
|
435
454
|
if (!(bnRemainingStake.isZero() || bnRemainingStake.gte(minStake))) {
|
|
436
455
|
errors.push(new TransactionError(StakingTxErrorType.INVALID_ACTIVE_STAKE));
|
|
437
456
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { TransactionError } from '@subwallet/extension-base/background/errors/TransactionError';
|
|
2
2
|
import { ExtrinsicType } from '@subwallet/extension-base/background/KoniTypes';
|
|
3
|
-
import { BaseYieldStepDetail, HandleYieldStepData, OptimalYieldPath, OptimalYieldPathParams,
|
|
3
|
+
import { BaseYieldStepDetail, HandleYieldStepData, OptimalYieldPath, OptimalYieldPathParams, SpecialYieldPoolMetadata, SpecialYieldPoolInfo, SubmitYieldJoinData, TransactionData, UnstakingInfo, YieldPoolInfo, YieldPoolTarget, YieldPoolType, YieldStepBaseInfo, YieldTokenBaseInfo } from '@subwallet/extension-base/types';
|
|
4
4
|
import BN from 'bn.js';
|
|
5
5
|
import BasePoolHandler from './base';
|
|
6
6
|
export default abstract class BaseSpecialStakingPoolHandler extends BasePoolHandler {
|
|
@@ -9,11 +9,13 @@ export default abstract class BaseSpecialStakingPoolHandler extends BasePoolHand
|
|
|
9
9
|
protected abstract inputAsset: string;
|
|
10
10
|
protected abstract rewardAssets: string[];
|
|
11
11
|
protected abstract feeAssets: string[];
|
|
12
|
+
/** Pool's type */
|
|
13
|
+
abstract type: YieldPoolType.LIQUID_STAKING | YieldPoolType.LENDING;
|
|
12
14
|
/** Allow to create default unstake transaction */
|
|
13
15
|
protected readonly allowDefaultUnstake: boolean;
|
|
14
16
|
/** Allow to create fast unstake transaction */
|
|
15
17
|
protected readonly allowFastUnstake: boolean;
|
|
16
|
-
protected get
|
|
18
|
+
protected get metadataInfo(): Omit<SpecialYieldPoolMetadata, 'description'>;
|
|
17
19
|
get isPoolSupportAlternativeFee(): boolean;
|
|
18
20
|
get group(): string;
|
|
19
21
|
abstract getPoolStat(): Promise<SpecialYieldPoolInfo>;
|