From 40758e138b29b77ec1a3a75e9593da1990d98d2d Mon Sep 17 00:00:00 2001 From: Corantin Date: Sat, 30 Nov 2024 13:47:49 -0500 Subject: [PATCH 1/2] Use bigint for allocation computations to avoid number conversion error --- apps/web/components/PoolGovernance.tsx | 6 +- apps/web/components/ProposalCard.tsx | 35 +++++---- apps/web/components/Proposals.tsx | 98 ++++++++++++++------------ apps/web/utils/numbers.ts | 32 ++++----- 4 files changed, 89 insertions(+), 82 deletions(-) diff --git a/apps/web/components/PoolGovernance.tsx b/apps/web/components/PoolGovernance.tsx index a7f31cab2..17fe7218d 100644 --- a/apps/web/components/PoolGovernance.tsx +++ b/apps/web/components/PoolGovernance.tsx @@ -17,14 +17,14 @@ import { } from "@/components/"; export type PoolGovernanceProps = { - memberPoolWeight: number; + memberPoolWeight: number | undefined; tokenDecimals: number; strategy: Pick & { registryCommunity: { garden: Pick }; config: Pick; }; communityAddress: Address; - memberTokensInCommunity: number; + memberTokensInCommunity: bigint; isMemberCommunity: boolean; memberActivatedStrategy: boolean; }; @@ -89,7 +89,7 @@ export const PoolGovernance: React.FC = ({

Your voting weight:

- {memberPoolWeight.toFixed(2)} % + {memberPoolWeight?.toFixed(2)} %

)} diff --git a/apps/web/components/ProposalCard.tsx b/apps/web/components/ProposalCard.tsx index e46806558..5c62c0495 100644 --- a/apps/web/components/ProposalCard.tsx +++ b/apps/web/components/ProposalCard.tsx @@ -26,7 +26,10 @@ import { } from "@/hooks/useConvictionRead"; import { useMetadataIpfsFetch } from "@/hooks/useIpfsFetch"; import { PoolTypes, ProposalStatus } from "@/types"; -import { calculatePercentage } from "@/utils/numbers"; +import { + calculatePercentage, + calculatePercentageBigInt, +} from "@/utils/numbers"; import { prettyTimestamp } from "@/utils/text"; export type ProposalCardProps = { @@ -45,13 +48,13 @@ export type ProposalCardProps = { stakedFilter: ProposalInputItem; poolToken?: FetchTokenResult; isAllocationView: boolean; - memberActivatedPoints: number; + memberActivatedPoints: bigint; memberPoolWeight: number; executeDisabled: boolean; tokenDecimals: number; alloInfo: Allo; tokenData: Parameters[0]["tokenData"]; - inputHandler: (proposalId: string, value: number) => void; + inputHandler: (proposalId: string, value: bigint) => void; }; export function ProposalCard({ @@ -92,12 +95,13 @@ export function ProposalCard({ strategyConfig, tokenData, }); - const inputValue = - inputData ? calculatePercentage(inputData.value, memberActivatedPoints) : 0; + inputData ? + calculatePercentageBigInt(inputData.value, memberActivatedPoints) + : 0; const poolWeightAllocatedInProposal = ( - (inputValue * memberPoolWeight) / + (inputValue * Number(memberPoolWeight)) / 100 ).toFixed(2); @@ -215,13 +219,16 @@ export function ProposalCard({ - inputHandler(proposalData.id, Number(e.target.value)) - } + step={Number(memberActivatedPoints / 100n)} + onChange={(e) => { + inputHandler( + proposalData.id, + BigInt(Math.floor(Number(e.target.value))), + ); + }} disabled={isProposalEnded} /> @@ -235,11 +242,11 @@ export function ProposalCard({ - {isProposalEnded && inputData?.value != 0 && ( + {isProposalEnded && inputData?.value != 0n && (