diff --git a/apps/extension/tsconfig.json b/apps/extension/tsconfig.json index c4969b402..df5420be5 100644 --- a/apps/extension/tsconfig.json +++ b/apps/extension/tsconfig.json @@ -22,5 +22,5 @@ }, "include": ["src/**/*.ts", "src/**/*.tsx"], "exclude": ["node_modules"], - "typeRoots": ["./node_modules/@types"], + "typeRoots": ["./node_modules/@types"] } diff --git a/apps/namadillo/src/App/Staking/IncrementBonding.tsx b/apps/namadillo/src/App/Staking/IncrementBonding.tsx index b970ca2f3..380ff432e 100644 --- a/apps/namadillo/src/App/Staking/IncrementBonding.tsx +++ b/apps/namadillo/src/App/Staking/IncrementBonding.tsx @@ -7,6 +7,7 @@ import { NamCurrency } from "App/Common/NamCurrency"; import { TableRowLoading } from "App/Common/TableRowLoading"; import { TransactionFees } from "App/Common/TransactionFees"; import { accountBalanceAtom, defaultAccountAtom } from "atoms/accounts"; +import { chainParametersAtom } from "atoms/chain"; import { defaultGasConfigFamily } from "atoms/fees"; import { createNotificationId, @@ -33,6 +34,7 @@ const IncrementBonding = (): JSX.Element => { const [filter, setFilter] = useState(""); const [onlyMyValidators, setOnlyMyValidators] = useState(false); const navigate = useNavigate(); + const { data: chainParameters } = useAtomValue(chainParametersAtom); const accountBalance = useAtomValue(accountBalanceAtom); const { data: account } = useAtomValue(defaultAccountAtom); @@ -204,9 +206,9 @@ const IncrementBonding = (): JSX.Element => {

- Staking will lock and bind your assets to the TODO - unbonding schedule. To make your NAM liquid again, you - will need to unstake. + Staking will lock and bind your assets to an unbonding + schedule of {chainParameters?.unbondingPeriod}. To make + your NAM liquid again, you will need to unstake.

diff --git a/apps/namadillo/src/App/Staking/Unstake.tsx b/apps/namadillo/src/App/Staking/Unstake.tsx index 710defba4..fef33cb0b 100644 --- a/apps/namadillo/src/App/Staking/Unstake.tsx +++ b/apps/namadillo/src/App/Staking/Unstake.tsx @@ -1,6 +1,5 @@ import { ActionButton, Alert, Modal, Panel, Stack } from "@namada/components"; import { UnbondMsgValue, UnbondProps } from "@namada/types"; -import { singleUnitDurationFromInterval } from "@namada/utils/helpers"; import { AtomErrorBoundary } from "App/Common/AtomErrorBoundary"; import { Info } from "App/Common/Info"; import { ModalContainer } from "App/Common/ModalContainer"; @@ -24,19 +23,11 @@ import { useAtomValue, useSetAtom } from "jotai"; import { TransactionPair, broadcastTx } from "lib/query"; import { FormEvent, useEffect } from "react"; import { useNavigate } from "react-router-dom"; -import { EpochInfo, MyValidator } from "types"; +import { MyValidator } from "types"; import { BondingAmountOverview } from "./BondingAmountOverview"; import { UnstakeBondingTable } from "./UnstakeBondingTable"; import StakingRoutes from "./routes"; -const getUnbondPeriod = ({ - unbondingPeriodInEpochs, - minEpochDuration, -}: EpochInfo): string => { - const duration = unbondingPeriodInEpochs * minEpochDuration; - return singleUnitDurationFromInterval(0, duration); -}; - const Unstake = (): JSX.Element => { const navigate = useNavigate(); const { data: account } = useAtomValue(defaultAccountAtom); @@ -161,8 +152,7 @@ const Unstake = (): JSX.Element => { return ""; })(); - const unbondPeriod = - chainParameters ? getUnbondPeriod(chainParameters.epochInfo) : "N/A"; + const unbondPeriod = chainParameters?.unbondingPeriod; return ( diff --git a/apps/namadillo/src/atoms/chain/atoms.ts b/apps/namadillo/src/atoms/chain/atoms.ts index a770e4526..5ffc76cab 100644 --- a/apps/namadillo/src/atoms/chain/atoms.ts +++ b/apps/namadillo/src/atoms/chain/atoms.ts @@ -6,8 +6,10 @@ import { rpcUrlAtom, } from "atoms/settings"; import { queryDependentFn } from "atoms/utils"; +import BigNumber from "bignumber.js"; import { atomWithQuery } from "jotai-tanstack-query"; import { ChainParameters, ChainSettings } from "types"; +import { calculateUnbondingPeriod } from "./functions"; import { fetchChainParameters, fetchRpcUrlFromIndexer } from "./services"; export const chainAtom = atomWithQuery((get) => { @@ -30,8 +32,7 @@ export const chainAtom = atomWithQuery((get) => { bench32Prefix: namada.bech32Prefix, rpcUrl, chainId: chainParameters.data!.chainId, - unbondingPeriodInEpochs: - chainParameters.data!.epochInfo.unbondingPeriodInEpochs, + unbondingPeriod: chainParameters.data!.unbondingPeriod, nativeTokenAddress: chainParameters.data!.nativeTokenAddress, checksums: chainParameters.data!.checksums, }; @@ -70,6 +71,13 @@ export const chainParametersAtom = atomWithQuery((get) => { queryKey: ["chain-parameters", indexerUrl], staleTime: Infinity, enabled: !!indexerUrl, - queryFn: async () => fetchChainParameters(api), + queryFn: async () => { + const parameters = await fetchChainParameters(api); + return { + ...parameters, + apr: BigNumber(parameters.apr), + unbondingPeriod: calculateUnbondingPeriod(parameters), + }; + }, }; }); diff --git a/apps/namadillo/src/atoms/chain/functions.ts b/apps/namadillo/src/atoms/chain/functions.ts new file mode 100644 index 000000000..3b7f4d7de --- /dev/null +++ b/apps/namadillo/src/atoms/chain/functions.ts @@ -0,0 +1,21 @@ +import { Parameters } from "@anomaorg/namada-indexer-client"; +import { singleUnitDurationFromInterval } from "@namada/utils/helpers"; + +export const calculateUnbondingPeriod = (parameters: Parameters): string => { + const unbondingPeriodInEpochs = + Number(parameters.unbondingLength) + + Number(parameters.pipelineLength) + + // + 1 because we unbonding period starts from the next epoch + 1; + const minEpochDuration = Number(parameters.minDuration); + const maxBlockTime = Number(parameters.maxBlockTime); + const epochSwitchBlocksDelay = Number(parameters.epochSwitchBlocksDelay); + + const realMinEpochDuration = + minEpochDuration + maxBlockTime * epochSwitchBlocksDelay; + + return singleUnitDurationFromInterval( + 0, + unbondingPeriodInEpochs * realMinEpochDuration + ); +}; diff --git a/apps/namadillo/src/atoms/chain/services.ts b/apps/namadillo/src/atoms/chain/services.ts index b36025858..7a9b67bc4 100644 --- a/apps/namadillo/src/atoms/chain/services.ts +++ b/apps/namadillo/src/atoms/chain/services.ts @@ -1,6 +1,4 @@ -import { DefaultApi } from "@anomaorg/namada-indexer-client"; -import BigNumber from "bignumber.js"; -import { ChainParameters } from "types"; +import { DefaultApi, Parameters } from "@anomaorg/namada-indexer-client"; export const fetchRpcUrlFromIndexer = async ( api: DefaultApi @@ -11,24 +9,7 @@ export const fetchRpcUrlFromIndexer = async ( export const fetchChainParameters = async ( api: DefaultApi -): Promise => { +): Promise => { const parametersResponse = await api.apiV1ChainParametersGet(); - const parameters = parametersResponse.data; - return { - epochInfo: { - unbondingPeriodInEpochs: - Number(parameters.unbondingLength) + - Number(parameters.pipelineLength) + - // + 1 because we unbonding period starts from the next epoch - 1, - minEpochDuration: Number(parameters.minDuration), - minNumOfBlocks: Number(parameters.minNumOfBlocks), - maxBlockTime: Number(parameters.maxBlockTime), - epochSwitchBlocksDelay: Number(parameters.epochSwitchBlocksDelay), - }, - apr: BigNumber(parameters.apr), - chainId: parameters.chainId, - nativeTokenAddress: parameters.nativeTokenAddress, - checksums: parameters.checksums, - }; + return parametersResponse.data; }; diff --git a/apps/namadillo/src/atoms/validators/atoms.ts b/apps/namadillo/src/atoms/validators/atoms.ts index 6583e9f4c..ef409ed6b 100644 --- a/apps/namadillo/src/atoms/validators/atoms.ts +++ b/apps/namadillo/src/atoms/validators/atoms.ts @@ -58,7 +58,7 @@ export const myValidatorsAtom = atomWithQuery((get) => { bondedAmounts, unbondedAmounts, votingPower.data!, - chainParameters.data!.epochInfo, + chainParameters.data!.unbondingPeriod, chainParameters.data!.apr ); }, [account, chainParameters, votingPower]), diff --git a/apps/namadillo/src/atoms/validators/functions.ts b/apps/namadillo/src/atoms/validators/functions.ts index a458dd06f..040d9f072 100644 --- a/apps/namadillo/src/atoms/validators/functions.ts +++ b/apps/namadillo/src/atoms/validators/functions.ts @@ -7,27 +7,17 @@ import { } from "@anomaorg/namada-indexer-client"; import { singleUnitDurationFromInterval } from "@namada/utils"; import BigNumber from "bignumber.js"; -import { Address, EpochInfo, MyValidator, UnbondEntry, Validator } from "types"; +import { Address, MyValidator, UnbondEntry, Validator } from "types"; export const toValidator = ( indexerValidator: IndexerValidator, indexerVotingPower: IndexerVotingPower, - epochInfo: EpochInfo, + unbondingPeriod: string, nominalApr: BigNumber ): Validator => { const commission = BigNumber(indexerValidator.commission); const expectedApr = nominalApr.times(1 - commission.toNumber()); - // Because epoch duration is in reality longer by epochSwitchBlocksDelay we have to account for that - const realMinEpochDuration = - epochInfo.minEpochDuration + - epochInfo.maxBlockTime * epochInfo.epochSwitchBlocksDelay; - - const unbondingPeriod = singleUnitDurationFromInterval( - 0, - epochInfo.unbondingPeriodInEpochs * realMinEpochDuration - ); - return { uuid: indexerValidator.address, alias: indexerValidator.name, @@ -65,7 +55,7 @@ export const toMyValidators = ( indexerBonds: IndexerBond[] | IndexerMergedBond[], indexerUnbonds: IndexerUnbond[], totalVotingPower: IndexerVotingPower, - epochInfo: EpochInfo, + unbondingPeriod: string, apr: BigNumber ): MyValidator[] => { const myValidators: Record = {}; @@ -78,7 +68,12 @@ export const toMyValidators = ( unbondedAmount: new BigNumber(0), bondItems: [], unbondItems: [], - validator: toValidator(validator, totalVotingPower, epochInfo, apr), + validator: toValidator( + validator, + totalVotingPower, + unbondingPeriod, + apr + ), }; } }; diff --git a/apps/namadillo/src/atoms/validators/services.ts b/apps/namadillo/src/atoms/validators/services.ts index 842001c3b..6857ed7a0 100644 --- a/apps/namadillo/src/atoms/validators/services.ts +++ b/apps/namadillo/src/atoms/validators/services.ts @@ -22,7 +22,6 @@ export const fetchAllValidators = async ( chainParameters: ChainParameters, votingPower: IndexerVotingPower ): Promise => { - const epochInfo = chainParameters.epochInfo; const nominalApr = chainParameters.apr; const validatorsResponse = await api.apiV1PosValidatorAllGet([ IndexerValidatorStatus.Consensus, @@ -30,7 +29,7 @@ export const fetchAllValidators = async ( const validators = validatorsResponse.data; return validators.map((v) => - toValidator(v, votingPower, epochInfo, nominalApr) + toValidator(v, votingPower, chainParameters.unbondingPeriod, nominalApr) ); }; diff --git a/apps/namadillo/src/types.d.ts b/apps/namadillo/src/types.d.ts index 18a5ec784..4b6dae04e 100644 --- a/apps/namadillo/src/types.d.ts +++ b/apps/namadillo/src/types.d.ts @@ -33,7 +33,6 @@ export type ChainSettings = { nativeTokenAddress: Address; rpcUrl: string; chainId: string; - unbondingPeriodInEpochs: number; extensionId: ExtensionKey; checksums: Record; }; @@ -43,19 +42,11 @@ export type SettingsTomlOptions = { rpc_url?: string; }; -export type EpochInfo = { - unbondingPeriodInEpochs: number; - minEpochDuration: number; - minNumOfBlocks: number; - maxBlockTime: number; - epochSwitchBlocksDelay: number; -}; - export type ChainParameters = { apr: BigNumber; chainId: string; nativeTokenAddress: Address; - epochInfo: EpochInfo; + unbondingPeriod: string; checksums: Record; }; diff --git a/packages/sdk/examples/submitTransfer.ts b/packages/sdk/examples/submitTransfer.ts index b6c09c3e7..80a1fa3bb 100644 --- a/packages/sdk/examples/submitTransfer.ts +++ b/packages/sdk/examples/submitTransfer.ts @@ -39,15 +39,12 @@ export const submitTransfer = async ( const { cryptoMemory } = initSync(); const sdk = getSdk(cryptoMemory, nodeUrl, "storage path", nativeToken); - console.log("Building transfer transaction..."); const encodedTx = await sdk.tx.buildTransparentTransfer(wrapperTxProps, { data: [transparentTransferMsgValue], }); - console.log("Signing transaction..."); const signedTx = await sdk.signing.sign(encodedTx, signingKey); - console.log("Broadcasting transaction..."); await sdk.rpc.broadcastTx(signedTx, wrapperTxProps); process.exit(0); } catch (error) { diff --git a/packages/sdk/src/signing.ts b/packages/sdk/src/signing.ts index 4c3dcb385..ecd2a969f 100644 --- a/packages/sdk/src/signing.ts +++ b/packages/sdk/src/signing.ts @@ -15,7 +15,7 @@ export class Signing { /** * Sign Namada transaction - * @param txProps - TxProps + * @param txProps - TxProps * @param signingKey - private key * @param [chainId] - optional chain ID, will enforce validation if present * @returns signed tx bytes - Promise resolving to Uint8Array