From ac9df2060bcbfd099fed782ec507a9017938e4a5 Mon Sep 17 00:00:00 2001 From: Mateusz Jasiuk Date: Mon, 3 Mar 2025 10:02:07 +0100 Subject: [PATCH] feat: validators msr endpoint + atom + calc --- apps/namadillo/package.json | 2 +- .../src/App/Staking/AllValidatorsTable.tsx | 4 +-- apps/namadillo/src/atoms/chain/atoms.ts | 6 ++++ apps/namadillo/src/atoms/validators/atoms.ts | 36 ++++++++++++++++++- apps/namadillo/src/types.ts | 3 ++ yarn.lock | 10 +++--- 6 files changed, 52 insertions(+), 9 deletions(-) diff --git a/apps/namadillo/package.json b/apps/namadillo/package.json index eb262f915c..f74bd785a6 100644 --- a/apps/namadillo/package.json +++ b/apps/namadillo/package.json @@ -11,7 +11,7 @@ "@cosmjs/encoding": "^0.32.3", "@keplr-wallet/types": "^0.12.136", "@namada/chain-registry": "^1.0.0", - "@namada/indexer-client": "2.2.0", + "@namada/indexer-client": "../../../namada-indexer-client", "@tailwindcss/container-queries": "^0.1.1", "@tanstack/query-core": "^5.40.0", "@tanstack/react-query": "^5.40.0", diff --git a/apps/namadillo/src/App/Staking/AllValidatorsTable.tsx b/apps/namadillo/src/App/Staking/AllValidatorsTable.tsx index 498b78006b..e5039ac618 100644 --- a/apps/namadillo/src/App/Staking/AllValidatorsTable.tsx +++ b/apps/namadillo/src/App/Staking/AllValidatorsTable.tsx @@ -7,7 +7,7 @@ import { TableRowLoading } from "App/Common/TableRowLoading"; import { WalletAddress } from "App/Common/WalletAddress"; import { routes } from "App/routes"; import { atomsAreLoading, atomsAreNotInitialized } from "atoms/utils"; -import { allValidatorsAtom } from "atoms/validators"; +import { allValidatorsWithMSRAtom } from "atoms/validators"; import BigNumber from "bignumber.js"; import { useUserHasAccount } from "hooks/useIsAuthenticated"; import { useValidatorFilter } from "hooks/useValidatorFilter"; @@ -28,7 +28,7 @@ export const AllValidatorsTable = ({ resultsPerPage = 100, initialPage = 0, }: AllValidatorsProps): JSX.Element => { - const validators = useAtomValue(allValidatorsAtom); + const validators = useAtomValue(allValidatorsWithMSRAtom); const [searchTerm, setSearchTerm] = useState(""); const userHasAccount = useUserHasAccount(); diff --git a/apps/namadillo/src/atoms/chain/atoms.ts b/apps/namadillo/src/atoms/chain/atoms.ts index dc3cca01ff..b10a7fb1e6 100644 --- a/apps/namadillo/src/atoms/chain/atoms.ts +++ b/apps/namadillo/src/atoms/chain/atoms.ts @@ -127,6 +127,12 @@ export const chainParametersAtom = atomWithQuery((get) => { ...parameters, apr: BigNumber(parameters.apr), unbondingPeriod: calculateUnbondingPeriod(parameters), + duplicateVoteMinSlashRate: BigNumber( + parameters.duplicateVoteMinSlashRate + ), + lightClientAttackMinSlashRate: BigNumber( + parameters.lightClientAttackMinSlashRate + ), }; }, }; diff --git a/apps/namadillo/src/atoms/validators/atoms.ts b/apps/namadillo/src/atoms/validators/atoms.ts index bcc63e463d..432955a90d 100644 --- a/apps/namadillo/src/atoms/validators/atoms.ts +++ b/apps/namadillo/src/atoms/validators/atoms.ts @@ -3,8 +3,9 @@ import { indexerApiAtom } from "atoms/api"; import { chainParametersAtom } from "atoms/chain"; import { shouldUpdateBalanceAtom } from "atoms/etc"; import { queryDependentFn } from "atoms/utils"; +import BigNumber from "bignumber.js"; import { atomWithQuery } from "jotai-tanstack-query"; -import { MyValidator, Validator } from "types"; +import { MyValidator, Validator, ValidatorWithMSR } from "types"; import { toMyValidators } from "./functions"; import { fetchAllValidators, @@ -33,6 +34,39 @@ export const allValidatorsAtom = atomWithQuery((get) => { }; }); +export const allValidatorsWithMSRAtom = atomWithQuery((get) => { + const validators = get(allValidatorsAtom); + const totalVotingPower = get(votingPowerAtom); + const params = get(chainParametersAtom); + + return { + queryKey: ["all-validators"], + ...queryDependentFn(async (): Promise => { + const { duplicateVoteMinSlashRate, lightClientAttackMinSlashRate } = + params.data!; + const minSlashRateParam = BigNumber.min( + duplicateVoteMinSlashRate, + lightClientAttackMinSlashRate + ); + + return validators.data!.map((v) => { + const votingPower = BigNumber(v.votingPowerInNAM || 0); + const slashRateParam = BigNumber(9).times( + votingPower.div(totalVotingPower.data!.totalVotingPower).pow(2) + ); + + // Slash rate should not exceed 100% + const minSlashRate = BigNumber.min( + BigNumber(1), + BigNumber.max(minSlashRateParam, slashRateParam) + ); + + return { ...v, msr: minSlashRate }; + }); + }, [validators, params, totalVotingPower]), + }; +}); + // eslint-disable-next-line export const myValidatorsAtom = atomWithQuery((get) => { const account = get(defaultAccountAtom); diff --git a/apps/namadillo/src/types.ts b/apps/namadillo/src/types.ts index 103a1ea1fa..924558d9f0 100644 --- a/apps/namadillo/src/types.ts +++ b/apps/namadillo/src/types.ts @@ -76,6 +76,8 @@ export type ChainParameters = { nativeTokenAddress: Address; unbondingPeriod: string; checksums: Record; + duplicateVoteMinSlashRate: BigNumber; + lightClientAttackMinSlashRate: BigNumber; }; export type SettingsStorage = { @@ -106,6 +108,7 @@ export type Validator = Unique & { status: ValidatorStatus; }; +export type ValidatorWithMSR = Validator & { msr: BigNumber }; export type ValidatorFilterOptions = "all" | "active" | ValidatorStatus; export type UnbondEntry = { diff --git a/yarn.lock b/yarn.lock index 5780b4d2df..7bf28937ec 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3831,12 +3831,12 @@ __metadata: languageName: unknown linkType: soft -"@namada/indexer-client@npm:2.2.0": - version: 2.2.0 - resolution: "@namada/indexer-client@npm:2.2.0" +"@namada/indexer-client@file:../../../namada-indexer-client::locator=%40namada%2Fnamadillo%40workspace%3Aapps%2Fnamadillo": + version: 1.5.1 + resolution: "@namada/indexer-client@file:../../../namada-indexer-client#../../../namada-indexer-client::hash=54f384&locator=%40namada%2Fnamadillo%40workspace%3Aapps%2Fnamadillo" dependencies: axios: "npm:^1.6.1" - checksum: 10c0/146740e9291170e8efad519b83988939a4e86f3506913a3ec25d2a6780281e92775e640782e0554c83e494b444d89909194d68de749b42dfca255712bfcc32e6 + checksum: 10c0/e6dc4f4633cfdae1d8c06a10c7044f66cd0e5ee9d5bfcf5997aa5a3e744a24b7cfef58332edebdfe08805144ed71280669c5028989ff964bafaf48fce9c9e17b languageName: node linkType: hard @@ -3878,7 +3878,7 @@ __metadata: "@eslint/js": "npm:^9.9.1" "@keplr-wallet/types": "npm:^0.12.136" "@namada/chain-registry": "npm:^1.0.0" - "@namada/indexer-client": "npm:2.2.0" + "@namada/indexer-client": ../../../namada-indexer-client "@playwright/test": "npm:^1.24.1" "@svgr/webpack": "npm:^6.5.1" "@tailwindcss/container-queries": "npm:^0.1.1"