From eea02a0f750a3d69ed8ac79b4282cd12bf42a8dc Mon Sep 17 00:00:00 2001 From: abefernan <44572727+abefernan@users.noreply.github.com> Date: Thu, 27 Apr 2023 16:32:47 +0200 Subject: [PATCH] Add MsgDelegateForm --- .../CreateTxForm/MsgForm/MsgDelegateForm.tsx | 104 ++++++++++++++++++ 1 file changed, 104 insertions(+) create mode 100644 components/forms/CreateTxForm/MsgForm/MsgDelegateForm.tsx diff --git a/components/forms/CreateTxForm/MsgForm/MsgDelegateForm.tsx b/components/forms/CreateTxForm/MsgForm/MsgDelegateForm.tsx new file mode 100644 index 0000000..c3cc638 --- /dev/null +++ b/components/forms/CreateTxForm/MsgForm/MsgDelegateForm.tsx @@ -0,0 +1,104 @@ +import { Decimal } from "@cosmjs/math"; +import { assert } from "@cosmjs/utils"; +import { Dispatch, SetStateAction, useCallback, useEffect, useState } from "react"; +import { useAppContext } from "../../../../context/AppContext"; +import { checkAddress, exampleAddress } from "../../../../lib/displayHelpers"; +import { TxMsg, TxMsgDelegate } from "../../../../types/txMsg"; +import Input from "../../../inputs/Input"; + +interface MsgDelegateFormProps { + readonly delegatorAddress: string; + readonly setCheckAndGetMsg: Dispatch TxMsg | null) | undefined>>; +} + +const MsgDelegateForm = ({ delegatorAddress, setCheckAndGetMsg }: MsgDelegateFormProps) => { + const { state } = useAppContext(); + assert(state.chain.addressPrefix, "addressPrefix missing"); + + const [validatorAddress, setValidatorAddress] = useState(""); + const [amount, setAmount] = useState("0"); + + const [validatorAddressError, setValidatorAddressError] = useState(""); + const [amountError, setAmountError] = useState(""); + + const checkAndGetMsg = useCallback(() => { + assert(state.chain.addressPrefix, "addressPrefix missing"); + assert(state.chain.denom, "denom missing"); + + const addressErrorMsg = checkAddress(validatorAddress, state.chain.addressPrefix); + if (addressErrorMsg) { + setValidatorAddressError( + `Invalid address for network ${state.chain.chainId}: ${addressErrorMsg}`, + ); + return null; + } + + if (!amount || Number(amount) <= 0) { + setAmountError("Amount must be greater than 0"); + return null; + } + + const amountInAtomics = Decimal.fromUserInput( + amount, + Number(state.chain.displayDenomExponent), + ).atomics; + + const msg: TxMsgDelegate = { + typeUrl: "/cosmos.staking.v1beta1.MsgDelegate", + value: { + delegatorAddress, + validatorAddress, + amount: [{ amount: amountInAtomics, denom: state.chain.denom }], + }, + }; + + return msg; + }, [ + amount, + delegatorAddress, + state.chain.addressPrefix, + state.chain.chainId, + state.chain.denom, + state.chain.displayDenomExponent, + validatorAddress, + ]); + + useEffect(() => { + setCheckAndGetMsg(() => checkAndGetMsg); + }, [checkAndGetMsg, setCheckAndGetMsg]); + + return ( + <> +
+ setValidatorAddress(target.value)} + error={validatorAddressError} + placeholder={`E.g. ${exampleAddress(0, state.chain.addressPrefix)}`} + /> +
+
+ setAmount(target.value)} + error={amountError} + /> +
+ + + ); +}; + +export default MsgDelegateForm;