Skip to content

Commit 2e65ae8

Browse files
authored
feat: update unbonding period calculation (#1034)
1 parent 9d8711e commit 2e65ae8

File tree

12 files changed

+56
-72
lines changed

12 files changed

+56
-72
lines changed

apps/extension/tsconfig.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,5 +22,5 @@
2222
},
2323
"include": ["src/**/*.ts", "src/**/*.tsx"],
2424
"exclude": ["node_modules"],
25-
"typeRoots": ["./node_modules/@types"],
25+
"typeRoots": ["./node_modules/@types"]
2626
}

apps/namadillo/src/App/Staking/IncrementBonding.tsx

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import { NamCurrency } from "App/Common/NamCurrency";
77
import { TableRowLoading } from "App/Common/TableRowLoading";
88
import { TransactionFees } from "App/Common/TransactionFees";
99
import { accountBalanceAtom, defaultAccountAtom } from "atoms/accounts";
10+
import { chainParametersAtom } from "atoms/chain";
1011
import { defaultGasConfigFamily } from "atoms/fees";
1112
import {
1213
createNotificationId,
@@ -33,6 +34,7 @@ const IncrementBonding = (): JSX.Element => {
3334
const [filter, setFilter] = useState<string>("");
3435
const [onlyMyValidators, setOnlyMyValidators] = useState(false);
3536
const navigate = useNavigate();
37+
const { data: chainParameters } = useAtomValue(chainParametersAtom);
3638
const accountBalance = useAtomValue(accountBalanceAtom);
3739

3840
const { data: account } = useAtomValue(defaultAccountAtom);
@@ -204,9 +206,9 @@ const IncrementBonding = (): JSX.Element => {
204206
<GoAlert />
205207
</i>
206208
<p className="text-balance">
207-
Staking will lock and bind your assets to the TODO
208-
unbonding schedule. To make your NAM liquid again, you
209-
will need to unstake.
209+
Staking will lock and bind your assets to an unbonding
210+
schedule of {chainParameters?.unbondingPeriod}. To make
211+
your NAM liquid again, you will need to unstake.
210212
</p>
211213
</div>
212214
</Alert>

apps/namadillo/src/App/Staking/Unstake.tsx

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import { ActionButton, Alert, Modal, Panel, Stack } from "@namada/components";
22
import { UnbondMsgValue, UnbondProps } from "@namada/types";
3-
import { singleUnitDurationFromInterval } from "@namada/utils/helpers";
43
import { AtomErrorBoundary } from "App/Common/AtomErrorBoundary";
54
import { Info } from "App/Common/Info";
65
import { ModalContainer } from "App/Common/ModalContainer";
@@ -24,19 +23,11 @@ import { useAtomValue, useSetAtom } from "jotai";
2423
import { TransactionPair, broadcastTx } from "lib/query";
2524
import { FormEvent, useEffect } from "react";
2625
import { useNavigate } from "react-router-dom";
27-
import { EpochInfo, MyValidator } from "types";
26+
import { MyValidator } from "types";
2827
import { BondingAmountOverview } from "./BondingAmountOverview";
2928
import { UnstakeBondingTable } from "./UnstakeBondingTable";
3029
import StakingRoutes from "./routes";
3130

32-
const getUnbondPeriod = ({
33-
unbondingPeriodInEpochs,
34-
minEpochDuration,
35-
}: EpochInfo): string => {
36-
const duration = unbondingPeriodInEpochs * minEpochDuration;
37-
return singleUnitDurationFromInterval(0, duration);
38-
};
39-
4031
const Unstake = (): JSX.Element => {
4132
const navigate = useNavigate();
4233
const { data: account } = useAtomValue(defaultAccountAtom);
@@ -161,8 +152,7 @@ const Unstake = (): JSX.Element => {
161152
return "";
162153
})();
163154

164-
const unbondPeriod =
165-
chainParameters ? getUnbondPeriod(chainParameters.epochInfo) : "N/A";
155+
const unbondPeriod = chainParameters?.unbondingPeriod;
166156

167157
return (
168158
<Modal onClose={onCloseModal}>

apps/namadillo/src/atoms/chain/atoms.ts

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,10 @@ import {
66
rpcUrlAtom,
77
} from "atoms/settings";
88
import { queryDependentFn } from "atoms/utils";
9+
import BigNumber from "bignumber.js";
910
import { atomWithQuery } from "jotai-tanstack-query";
1011
import { ChainParameters, ChainSettings } from "types";
12+
import { calculateUnbondingPeriod } from "./functions";
1113
import { fetchChainParameters, fetchRpcUrlFromIndexer } from "./services";
1214

1315
export const chainAtom = atomWithQuery<ChainSettings>((get) => {
@@ -30,8 +32,7 @@ export const chainAtom = atomWithQuery<ChainSettings>((get) => {
3032
bench32Prefix: namada.bech32Prefix,
3133
rpcUrl,
3234
chainId: chainParameters.data!.chainId,
33-
unbondingPeriodInEpochs:
34-
chainParameters.data!.epochInfo.unbondingPeriodInEpochs,
35+
unbondingPeriod: chainParameters.data!.unbondingPeriod,
3536
nativeTokenAddress: chainParameters.data!.nativeTokenAddress,
3637
checksums: chainParameters.data!.checksums,
3738
};
@@ -70,6 +71,13 @@ export const chainParametersAtom = atomWithQuery<ChainParameters>((get) => {
7071
queryKey: ["chain-parameters", indexerUrl],
7172
staleTime: Infinity,
7273
enabled: !!indexerUrl,
73-
queryFn: async () => fetchChainParameters(api),
74+
queryFn: async () => {
75+
const parameters = await fetchChainParameters(api);
76+
return {
77+
...parameters,
78+
apr: BigNumber(parameters.apr),
79+
unbondingPeriod: calculateUnbondingPeriod(parameters),
80+
};
81+
},
7482
};
7583
});
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import { Parameters } from "@anomaorg/namada-indexer-client";
2+
import { singleUnitDurationFromInterval } from "@namada/utils/helpers";
3+
4+
export const calculateUnbondingPeriod = (parameters: Parameters): string => {
5+
const unbondingPeriodInEpochs =
6+
Number(parameters.unbondingLength) +
7+
Number(parameters.pipelineLength) +
8+
// + 1 because we unbonding period starts from the next epoch
9+
1;
10+
const minEpochDuration = Number(parameters.minDuration);
11+
const maxBlockTime = Number(parameters.maxBlockTime);
12+
const epochSwitchBlocksDelay = Number(parameters.epochSwitchBlocksDelay);
13+
14+
const realMinEpochDuration =
15+
minEpochDuration + maxBlockTime * epochSwitchBlocksDelay;
16+
17+
return singleUnitDurationFromInterval(
18+
0,
19+
unbondingPeriodInEpochs * realMinEpochDuration
20+
);
21+
};
Lines changed: 3 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
1-
import { DefaultApi } from "@anomaorg/namada-indexer-client";
2-
import BigNumber from "bignumber.js";
3-
import { ChainParameters } from "types";
1+
import { DefaultApi, Parameters } from "@anomaorg/namada-indexer-client";
42

53
export const fetchRpcUrlFromIndexer = async (
64
api: DefaultApi
@@ -11,24 +9,7 @@ export const fetchRpcUrlFromIndexer = async (
119

1210
export const fetchChainParameters = async (
1311
api: DefaultApi
14-
): Promise<ChainParameters> => {
12+
): Promise<Parameters> => {
1513
const parametersResponse = await api.apiV1ChainParametersGet();
16-
const parameters = parametersResponse.data;
17-
return {
18-
epochInfo: {
19-
unbondingPeriodInEpochs:
20-
Number(parameters.unbondingLength) +
21-
Number(parameters.pipelineLength) +
22-
// + 1 because we unbonding period starts from the next epoch
23-
1,
24-
minEpochDuration: Number(parameters.minDuration),
25-
minNumOfBlocks: Number(parameters.minNumOfBlocks),
26-
maxBlockTime: Number(parameters.maxBlockTime),
27-
epochSwitchBlocksDelay: Number(parameters.epochSwitchBlocksDelay),
28-
},
29-
apr: BigNumber(parameters.apr),
30-
chainId: parameters.chainId,
31-
nativeTokenAddress: parameters.nativeTokenAddress,
32-
checksums: parameters.checksums,
33-
};
14+
return parametersResponse.data;
3415
};

apps/namadillo/src/atoms/validators/atoms.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ export const myValidatorsAtom = atomWithQuery((get) => {
5858
bondedAmounts,
5959
unbondedAmounts,
6060
votingPower.data!,
61-
chainParameters.data!.epochInfo,
61+
chainParameters.data!.unbondingPeriod,
6262
chainParameters.data!.apr
6363
);
6464
}, [account, chainParameters, votingPower]),

apps/namadillo/src/atoms/validators/functions.ts

Lines changed: 9 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -7,27 +7,17 @@ import {
77
} from "@anomaorg/namada-indexer-client";
88
import { singleUnitDurationFromInterval } from "@namada/utils";
99
import BigNumber from "bignumber.js";
10-
import { Address, EpochInfo, MyValidator, UnbondEntry, Validator } from "types";
10+
import { Address, MyValidator, UnbondEntry, Validator } from "types";
1111

1212
export const toValidator = (
1313
indexerValidator: IndexerValidator,
1414
indexerVotingPower: IndexerVotingPower,
15-
epochInfo: EpochInfo,
15+
unbondingPeriod: string,
1616
nominalApr: BigNumber
1717
): Validator => {
1818
const commission = BigNumber(indexerValidator.commission);
1919
const expectedApr = nominalApr.times(1 - commission.toNumber());
2020

21-
// Because epoch duration is in reality longer by epochSwitchBlocksDelay we have to account for that
22-
const realMinEpochDuration =
23-
epochInfo.minEpochDuration +
24-
epochInfo.maxBlockTime * epochInfo.epochSwitchBlocksDelay;
25-
26-
const unbondingPeriod = singleUnitDurationFromInterval(
27-
0,
28-
epochInfo.unbondingPeriodInEpochs * realMinEpochDuration
29-
);
30-
3121
return {
3222
uuid: indexerValidator.address,
3323
alias: indexerValidator.name,
@@ -65,7 +55,7 @@ export const toMyValidators = (
6555
indexerBonds: IndexerBond[] | IndexerMergedBond[],
6656
indexerUnbonds: IndexerUnbond[],
6757
totalVotingPower: IndexerVotingPower,
68-
epochInfo: EpochInfo,
58+
unbondingPeriod: string,
6959
apr: BigNumber
7060
): MyValidator[] => {
7161
const myValidators: Record<Address, MyValidator> = {};
@@ -78,7 +68,12 @@ export const toMyValidators = (
7868
unbondedAmount: new BigNumber(0),
7969
bondItems: [],
8070
unbondItems: [],
81-
validator: toValidator(validator, totalVotingPower, epochInfo, apr),
71+
validator: toValidator(
72+
validator,
73+
totalVotingPower,
74+
unbondingPeriod,
75+
apr
76+
),
8277
};
8378
}
8479
};

apps/namadillo/src/atoms/validators/services.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,15 +22,14 @@ export const fetchAllValidators = async (
2222
chainParameters: ChainParameters,
2323
votingPower: IndexerVotingPower
2424
): Promise<Validator[]> => {
25-
const epochInfo = chainParameters.epochInfo;
2625
const nominalApr = chainParameters.apr;
2726
const validatorsResponse = await api.apiV1PosValidatorAllGet([
2827
IndexerValidatorStatus.Consensus,
2928
]);
3029

3130
const validators = validatorsResponse.data;
3231
return validators.map((v) =>
33-
toValidator(v, votingPower, epochInfo, nominalApr)
32+
toValidator(v, votingPower, chainParameters.unbondingPeriod, nominalApr)
3433
);
3534
};
3635

apps/namadillo/src/types.d.ts

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@ export type ChainSettings = {
3333
nativeTokenAddress: Address;
3434
rpcUrl: string;
3535
chainId: string;
36-
unbondingPeriodInEpochs: number;
3736
extensionId: ExtensionKey;
3837
checksums: Record<string, string>;
3938
};
@@ -43,19 +42,11 @@ export type SettingsTomlOptions = {
4342
rpc_url?: string;
4443
};
4544

46-
export type EpochInfo = {
47-
unbondingPeriodInEpochs: number;
48-
minEpochDuration: number;
49-
minNumOfBlocks: number;
50-
maxBlockTime: number;
51-
epochSwitchBlocksDelay: number;
52-
};
53-
5445
export type ChainParameters = {
5546
apr: BigNumber;
5647
chainId: string;
5748
nativeTokenAddress: Address;
58-
epochInfo: EpochInfo;
49+
unbondingPeriod: string;
5950
checksums: Record<string, string>;
6051
};
6152

0 commit comments

Comments
 (0)