diff --git a/modules/blockChain/contractAddresses.ts b/modules/blockChain/contractAddresses.ts index 07c4ab7c..fc033a7a 100644 --- a/modules/blockChain/contractAddresses.ts +++ b/modules/blockChain/contractAddresses.ts @@ -130,6 +130,7 @@ export const RewardsShareProgramRegistry: ChainAddressMap = { } export const SDVTRegistry: ChainAddressMap = { + [CHAINS.Mainnet]: '0xaE7B191A31f627b4eB1d4DaC64eaB9976995b433', [CHAINS.Goerli]: '0x6370FA71b9Fd83aFC4196ee189a0d348C90E93b0', [CHAINS.Holesky]: '0x11a93807078f8BB880c1BD0ee4C387537de4b4b6', } diff --git a/modules/motions/evmAddresses.ts b/modules/motions/evmAddresses.ts index 839328b8..0a510bff 100644 --- a/modules/motions/evmAddresses.ts +++ b/modules/motions/evmAddresses.ts @@ -49,6 +49,22 @@ export const EvmAddressesByChain: EvmAddresses = { [MotionType.PmlStablesTopUp]: '0x92a27C4e5e35cFEa112ACaB53851Ec70e2D99a8D', [MotionType.AtcStablesTopUp]: '0x1843Bc35d1fD15AbE1913b9f72852a79457C42Ab', [MotionType.LegoStablesTopUp]: '0x6AB39a8Be67D9305799c3F8FdFc95Caf3150d17c', + [MotionType.SDVTNodeOperatorsAdd]: + '0xcAa3AF7460E83E665EEFeC73a7a542E5005C9639', + [MotionType.SDVTNodeOperatorsActivate]: + '0xCBb418F6f9BFd3525CE6aADe8F74ECFEfe2DB5C8', + [MotionType.SDVTNodeOperatorsDeactivate]: + '0x8B82C1546D47330335a48406cc3a50Da732672E7', + [MotionType.SDVTVettedValidatorsLimitsSet]: + '0xD75778b855886Fc5e1eA7D6bFADA9EB68b35C19D', + [MotionType.SDVTTargetValidatorLimitsUpdate]: + '0x41CF3DbDc939c5115823Fba1432c4EC5E7bD226C', + [MotionType.SDVTNodeOperatorRewardAddressesSet]: + '0x589e298964b9181D9938B84bB034C3BB9024E2C0', + [MotionType.SDVTNodeOperatorNamesSet]: + '0x7d509BFF310d9460b1F613e4e40d342201a83Ae4', + [MotionType.SDVTNodeOperatorManagerChange]: + '0xE31A0599A6772BCf9b2bFc9e25cf941e793c9a7D', // next motion factories are @deprecated // we are keeping them here to display history data diff --git a/modules/motions/types.ts b/modules/motions/types.ts index 8e2c7966..2586567b 100644 --- a/modules/motions/types.ts +++ b/modules/motions/types.ts @@ -120,6 +120,7 @@ export type Motion = { enacted_at?: number canceled_at?: number rejected_at?: number + isOnChain: boolean } export type RawMotionOnchain = PromiseValue< diff --git a/modules/motions/ui/MotionDescription/DescSDVTNodeOperatorNamesSet.tsx b/modules/motions/ui/MotionDescription/DescSDVTNodeOperatorNamesSet.tsx index 1443a338..bbfc018c 100644 --- a/modules/motions/ui/MotionDescription/DescSDVTNodeOperatorNamesSet.tsx +++ b/modules/motions/ui/MotionDescription/DescSDVTNodeOperatorNamesSet.tsx @@ -5,6 +5,7 @@ import { useSDVTNodeOperatorsList } from 'modules/motions/hooks/useSDVTNodeOpera // SetNodeOperatorNames export function DescSDVTNodeOperatorNamesSet({ callData, + isOnChain, }: NestProps) { const { data: nodeOperatorsList } = useSDVTNodeOperatorsList() return ( @@ -14,8 +15,9 @@ export function DescSDVTNodeOperatorNamesSet({ const nodeOperator = nodeOperatorsList?.[nodeOperatorId] return (
- Change Node Operator {nodeOperator ? nodeOperator.name : ''}{' '} - (id: {nodeOperatorId}) name to {item.name} + Change Node Operator{' '} + {nodeOperator && isOnChain ? nodeOperator.name : ''} (id:{' '} + {nodeOperatorId}) name to {item.name} {index === callData.length - 1 ? '.' : '; '}
) diff --git a/modules/motions/ui/MotionDescription/DescSDVTNodeOperatorRewardAddressesSet.tsx b/modules/motions/ui/MotionDescription/DescSDVTNodeOperatorRewardAddressesSet.tsx index 310a801d..39c6c6d2 100644 --- a/modules/motions/ui/MotionDescription/DescSDVTNodeOperatorRewardAddressesSet.tsx +++ b/modules/motions/ui/MotionDescription/DescSDVTNodeOperatorRewardAddressesSet.tsx @@ -6,6 +6,7 @@ import { AddressInlineWithPop } from 'modules/shared/ui/Common/AddressInlineWith // SetNodeOperatorRewardAddresses export function DescSDVTNodeOperatorRewardAddressesSet({ callData, + isOnChain, }: NestProps) { const { data: nodeOperatorsList } = useSDVTNodeOperatorsList() return ( @@ -18,7 +19,7 @@ export function DescSDVTNodeOperatorRewardAddressesSet({ Change reward address of Node Operator{' '} {nodeOperator ? nodeOperator.name : ''} (id: {nodeOperatorId} ) - {nodeOperator?.rewardAddress ? ( + {nodeOperator?.rewardAddress && isOnChain ? ( <> {' '} from{' '} diff --git a/modules/motions/ui/MotionDescription/DescSDVTTargetValidatorLimitsUpdate.tsx b/modules/motions/ui/MotionDescription/DescSDVTTargetValidatorLimitsUpdate.tsx index 3cc8a81a..fecb135e 100644 --- a/modules/motions/ui/MotionDescription/DescSDVTTargetValidatorLimitsUpdate.tsx +++ b/modules/motions/ui/MotionDescription/DescSDVTTargetValidatorLimitsUpdate.tsx @@ -5,6 +5,7 @@ import { useSDVTNodeOperatorsList } from 'modules/motions/hooks/useSDVTNodeOpera // UpdateTargetValidatorLimits export function DescSDVTTargetValidatorLimitsUpdate({ callData, + isOnChain, }: NestProps) { const { data: nodeOperatorsList } = useSDVTNodeOperatorsList({ withSummary: true, @@ -22,6 +23,7 @@ export function DescSDVTTargetValidatorLimitsUpdate({
Disable target validator limit for Node Operator{' '} {nodeOperatorName} (id: {nodeOperatorId}) + {index === callData.length - 1 ? '.' : '; '}
) } @@ -30,7 +32,10 @@ export function DescSDVTTargetValidatorLimitsUpdate({
Set target validator limit for Node Operator{' '} {nodeOperatorName} (id: {nodeOperatorId}){' '} - {`from ${nodeOperator?.targetValidatorsCount} to ${item.targetLimit}`} + {nodeOperator && isOnChain + ? `from ${nodeOperator.targetValidatorsCount} ` + : ''} + {`to ${item.targetLimit}`} {index === callData.length - 1 ? '.' : '; '}
) diff --git a/modules/motions/ui/MotionDescription/DescSDVTVettedValidatorsLimitsSet.tsx b/modules/motions/ui/MotionDescription/DescSDVTVettedValidatorsLimitsSet.tsx index 8f37f433..f8a906e2 100644 --- a/modules/motions/ui/MotionDescription/DescSDVTVettedValidatorsLimitsSet.tsx +++ b/modules/motions/ui/MotionDescription/DescSDVTVettedValidatorsLimitsSet.tsx @@ -5,6 +5,7 @@ import { useSDVTNodeOperatorsList } from 'modules/motions/hooks/useSDVTNodeOpera // SetVettedValidatorsLimits export function DescSDVTVettedValidatorsLimitsSet({ callData, + isOnChain, }: NestProps) { const { data: nodeOperatorsList } = useSDVTNodeOperatorsList({ withSummary: true, @@ -18,7 +19,10 @@ export function DescSDVTVettedValidatorsLimitsSet({
Set Node Operator {nodeOperator ? nodeOperator.name : ''}{' '} (id: {nodeOperatorId}) vetted validators limit{' '} - {`from ${nodeOperator?.totalVettedValidators} to ${item.stakingLimit}`} + {nodeOperator && isOnChain + ? `from ${nodeOperator.totalVettedValidators} ` + : ''} + {`to ${item.stakingLimit}`}
) })} diff --git a/modules/motions/ui/MotionDescription/MotionDescription.tsx b/modules/motions/ui/MotionDescription/MotionDescription.tsx index b2a41647..bd6bc1d0 100644 --- a/modules/motions/ui/MotionDescription/MotionDescription.tsx +++ b/modules/motions/ui/MotionDescription/MotionDescription.tsx @@ -59,6 +59,7 @@ type DescNodeOperatorIncreaseLimitProps = NestProps< > type GenericDescProps = { + isOnChain?: boolean callData: any } @@ -325,7 +326,7 @@ export function MotionDescription({ motion }: Props) { return ( - + ) } diff --git a/modules/motions/ui/MotionDescription/types.ts b/modules/motions/ui/MotionDescription/types.ts index dedb76f1..1c383844 100644 --- a/modules/motions/ui/MotionDescription/types.ts +++ b/modules/motions/ui/MotionDescription/types.ts @@ -2,4 +2,5 @@ import { UnpackedPromise } from 'modules/shared/utils/utilTypes' export type NestProps Promise> = { callData: UnpackedPromise> + isOnChain?: boolean } diff --git a/modules/motions/ui/MotionFormStartNew/Parts/StartNewTopUpWithLimitsAndCustomToken.tsx b/modules/motions/ui/MotionFormStartNew/Parts/StartNewTopUpWithLimitsAndCustomToken.tsx index 828a9bae..b7d929d2 100644 --- a/modules/motions/ui/MotionFormStartNew/Parts/StartNewTopUpWithLimitsAndCustomToken.tsx +++ b/modules/motions/ui/MotionFormStartNew/Parts/StartNewTopUpWithLimitsAndCustomToken.tsx @@ -139,6 +139,7 @@ export const formParts = ({ const { watch, setValue, trigger } = useFormContext() const selectedPrograms: Program[] = watch(fieldNames.programs) const selectedTokenAddress: string = watch(fieldNames.tokenAddress) + const selectedTokenDecimals: number = watch(fieldNames.tokenDecimals) const selectedTokenLabel = useMemo(() => { if (!selectedTokenAddress || !allowedTokens?.length) { @@ -295,7 +296,10 @@ export const formParts = ({ rules={{ required: 'Field is required', validate: value => { - const tokenError = validateToken(value) + const tokenError = validateToken( + value, + selectedTokenDecimals, + ) if (tokenError) { return tokenError } diff --git a/modules/motions/utils/formatMotionDataOnchain.ts b/modules/motions/utils/formatMotionDataOnchain.ts index a1be8751..f99631cf 100644 --- a/modules/motions/utils/formatMotionDataOnchain.ts +++ b/modules/motions/utils/formatMotionDataOnchain.ts @@ -26,6 +26,7 @@ export function formatMotionDataOnchain(rawMotion: RawMotionOnchain): Motion { objectionsThreshold: Number(rawMotion.objectionsThreshold), objectionsAmount: rawMotion.objectionsAmount, evmScriptHash: rawMotion.evmScriptHash, + isOnChain: true, } return { diff --git a/modules/motions/utils/formatMotionDataSubgraph.ts b/modules/motions/utils/formatMotionDataSubgraph.ts index 3b688567..4b754ec8 100644 --- a/modules/motions/utils/formatMotionDataSubgraph.ts +++ b/modules/motions/utils/formatMotionDataSubgraph.ts @@ -17,5 +17,6 @@ export function formatMotionDataSubgraph(rawMotion: RawMotionSubgraph): Motion { rejected_at: rawMotion.rejected_at ? Number(rawMotion.rejected_at) : undefined, + isOnChain: false, } } diff --git a/modules/tokens/utils/validateToken.ts b/modules/tokens/utils/validateToken.ts index 7ac70d54..04b78020 100644 --- a/modules/tokens/utils/validateToken.ts +++ b/modules/tokens/utils/validateToken.ts @@ -1,13 +1,14 @@ import { utils } from 'ethers' +import { DEFAULT_DECIMALS } from 'modules/blockChain/constants' -export const validateToken = (value: string) => { +export const validateToken = (value: string, decimals = DEFAULT_DECIMALS) => { if (Number(value) <= 0) { - return 'Must be positive' + return 'Value must be positive' } try { - utils.parseEther(value) + utils.parseUnits(value, decimals) return null } catch (_) { - return 'Unable to parse' + return 'Unable to parse value' } }