Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
43 commits
Select commit Hold shift + click to select a range
5822c8d
Refactor mapping to not use redux store
michalsmiarowski Oct 2, 2022
3dc60ea
Fix display operator mapping effect
michalsmiarowski Oct 2, 2022
b09cf35
Fix displaying modal when changing accounts
michalsmiarowski Oct 2, 2022
ca8a09b
Add operatorMappingData to the store
michalsmiarowski Oct 2, 2022
c1694a0
Fix displaying OperatorAddressMappingCard
michalsmiarowski Oct 2, 2022
6b98f55
Rename and move operatorMapped event
michalsmiarowski Oct 2, 2022
000ef3d
Remove unused prop
michalsmiarowski Oct 2, 2022
04e6e42
Use mappedOperators data from the store
michalsmiarowski Oct 2, 2022
2d66a01
Fix displaying OperatorAddressMappingCard
michalsmiarowski Oct 4, 2022
007f883
Refactor modalQueue state
michalsmiarowski Oct 4, 2022
73490d2
Refactor map operator success modal
michalsmiarowski Oct 5, 2022
008179b
Fix imports
michalsmiarowski Oct 5, 2022
2e665b4
Use useAppDispatch and useAppSelector hooks
michalsmiarowski Oct 5, 2022
2cf5d87
Fix displaying modals when changing accounts
michalsmiarowski Oct 5, 2022
497617a
Fix `isFetching` prop for operator address mapping
michalsmiarowski Oct 5, 2022
e381413
Update comment
michalsmiarowski Oct 5, 2022
4f160ef
Merge branch 'main' into operator-mapping-code-cleaning
michalsmiarowski Oct 5, 2022
8860313
Simplify if statement
michalsmiarowski Oct 7, 2022
530837e
Remove unnecessary type
michalsmiarowski Oct 7, 2022
45c0b72
Simplify another if statement
michalsmiarowski Oct 7, 2022
4fd84b4
Use useAppSelector hook instead of useSelector
michalsmiarowski Oct 7, 2022
369c9c9
Clean imports
michalsmiarowski Oct 7, 2022
cdf3180
Simplify key for the fragment
michalsmiarowski Oct 7, 2022
ae4231d
Fix Id of the ViewInExplorer
michalsmiarowski Oct 10, 2022
a1810ef
Fix error message
michalsmiarowski Oct 10, 2022
45a5009
Fix typo
michalsmiarowski Oct 10, 2022
0de4912
Clean up success modal
michalsmiarowski Oct 10, 2022
08e6e15
Remove unnecessary TODO
michalsmiarowski Oct 10, 2022
d35e967
Fix typo
michalsmiarowski Oct 10, 2022
d3c637b
Improvde getStakingProviderOperatorInfo effect
michalsmiarowski Oct 10, 2022
47639bf
Rename connected account to account
michalsmiarowski Oct 10, 2022
eae8d07
Merge branch 'main' into operator-mapping-code-cleaning
michalsmiarowski Oct 10, 2022
64677b3
Update text
michalsmiarowski Oct 11, 2022
7ed1d17
Simplify MapOperatorToStakingProviderForm
michalsmiarowski Oct 16, 2022
009344d
Fix isAddressZero import
michalsmiarowski Oct 17, 2022
c5453fd
Change `setAccountAddress` action name
michalsmiarowski Oct 17, 2022
2fd7154
Remove unnecessary variables
michalsmiarowski Oct 17, 2022
676058f
Remove unnecessary keys from ListItem
michalsmiarowski Oct 17, 2022
f754bc4
Rename isUsedAsStakingProvider prop in store
michalsmiarowski Oct 19, 2022
390eaea
Remove `mappedOperators` from store
michalsmiarowski Oct 19, 2022
7cf4736
Refactor setMappingOperator reducer
michalsmiarowski Oct 19, 2022
111117d
Remove setFetchingOperatorMapping
michalsmiarowski Oct 19, 2022
96105de
Fix validation in OperatorToStakingProvider form
michalsmiarowski Oct 19, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -9,25 +9,19 @@ import {
ModalHeader,
} from "@chakra-ui/react"
import { AddressZero } from "@ethersproject/constants"
import {
BodyLg,
BodyMd,
BodySm,
H5,
LabelSm,
} from "@threshold-network/components"
import { BodyLg, BodyMd, H5, LabelSm } from "@threshold-network/components"
import { useWeb3React } from "@web3-react/core"
import { ContractTransaction } from "ethers"
import { FC, useCallback } from "react"
import { useDispatch } from "react-redux"
import { ModalType } from "../../../enums"
import { useOperatorMappedtoStakingProviderHelpers } from "../../../hooks/staking-applications/useOperatorMappedToStakingProviderHelpers"
import { useRegisterMultipleOperatorsTransaction } from "../../../hooks/staking-applications/useRegisterMultipleOperatorsTransaction"
import { useRegisterOperatorTransaction } from "../../../hooks/staking-applications/useRegisterOperatorTransaction"
import { useAppDispatch } from "../../../hooks/store"
import { useModal } from "../../../hooks/useModal"
import StakeAddressInfo from "../../../pages/Staking/StakeCard/StakeAddressInfo"
import { mapOperatorToStakingProviderModalClosed } from "../../../store/modalQueue"
import { mapOperatorToStakingProviderModalClosed } from "../../../store/modal"
import { BaseModalProps } from "../../../types"
import { isAddressZero } from "../../../web3/utils"
import InfoBox from "../../InfoBox"
import withBaseModal from "../withBaseModal"

Expand Down Expand Up @@ -60,17 +54,27 @@ const OperatorMappingConfirmation: FC<
const MapOperatorToStakingProviderConfirmationModal: FC<
BaseModalProps & {
operator: string
mappedOperatorTbtc: string
mappedOperatorRandomBeacon: string
}
> = ({ operator, closeModal }) => {
> = ({
operator,
mappedOperatorTbtc,
mappedOperatorRandomBeacon,
closeModal,
}) => {
const { account } = useWeb3React()
const { registerMultipleOperators } =
useRegisterMultipleOperatorsTransaction()
const dispatch = useDispatch()
const dispatch = useAppDispatch()

const isOperatorMappedOnlyInTbtc =
!isAddressZero(mappedOperatorTbtc) &&
isAddressZero(mappedOperatorRandomBeacon)

const operatorMappedToStakingProviderHelpers =
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

why remove this helper hook? seems like it saved some duplicate code. What if we added the tbtc & random beacon addresses as parameters so we don't have to rewrite the logic?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This will be addressed in #278

useOperatorMappedtoStakingProviderHelpers()
const { isOperatorMappedOnlyInRandomBeacon, isOperatorMappedOnlyInTbtc } =
operatorMappedToStakingProviderHelpers
const isOperatorMappedOnlyInRandomBeacon =
isAddressZero(mappedOperatorTbtc) &&
!isAddressZero(mappedOperatorRandomBeacon)

const { openModal } = useModal()
const onSuccess = useCallback(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import { FC, Ref } from "react"
import { FormikProps, FormikErrors, withFormik } from "formik"
import { Form, FormikInput } from "../../Forms"
import { getErrorsObj, validateETHAddress } from "../../../utils/forms"
import { OperatorMappedToStakingProviderHelpers } from "../../../hooks/staking-applications/useOperatorMappedToStakingProviderHelpers"
import { isAddressZero, isSameETHAddress } from "../../../web3/utils"

export interface MapOperatorToStakingProviderFormValues {
operator: string
Expand All @@ -26,10 +26,58 @@ const MapOperatorToStakingProviderFormBase: FC<
)
}

const validateInputtedOperatorAddress = async (
operator: string,
checkIfOperatorIsMappedToAnotherStakingProvider: (
operator: string
) => Promise<boolean>,
mappedOperatorRandomBeacon: string,
mappedOperatorTbtc: string
): Promise<string | undefined> => {
let validationMsg: string | undefined = ""

const isOperatorMappedOnlyInTbtc =
!isAddressZero(mappedOperatorTbtc) &&
isAddressZero(mappedOperatorRandomBeacon)

const isOperatorMappedOnlyInRandomBeacon =
isAddressZero(mappedOperatorTbtc) &&
!isAddressZero(mappedOperatorRandomBeacon)

try {
const isOperatorMappedToAnotherStakingProvider =
await checkIfOperatorIsMappedToAnotherStakingProvider(operator)
validationMsg = undefined
if (isOperatorMappedToAnotherStakingProvider) {
validationMsg = "Operator is already mapped to another staking provider."
}
if (
isOperatorMappedOnlyInRandomBeacon &&
!isSameETHAddress(operator, mappedOperatorRandomBeacon)
) {
validationMsg =
"The operator address doesn't match the one used in random beacon app"
}
if (
isOperatorMappedOnlyInTbtc &&
!isSameETHAddress(operator, mappedOperatorTbtc)
) {
validationMsg =
"The operator address doesn't match the one used in tbtc app"
}
} catch (error) {
console.error("`MapOperatorToStakingProviderForm` validation error.", error)
validationMsg = (error as Error)?.message
}

return validationMsg
}

type MapOperatorToStakingProviderFormProps = {
initialAddress: string
mappedOperatorTbtc: string
mappedOperatorRandomBeacon: string
innerRef: Ref<FormikProps<MapOperatorToStakingProviderFormValues>>
operatorMappedToStakingProviderHelpers: OperatorMappedToStakingProviderHelpers
checkIfOperatorIsMappedToAnotherStakingProvider: (
operator: string
) => Promise<boolean>
Expand All @@ -45,50 +93,20 @@ const MapOperatorToStakingProviderForm = withFormik<
}),
validate: async (values, props) => {
const {
mappedOperatorTbtc,
mappedOperatorRandomBeacon,
checkIfOperatorIsMappedToAnotherStakingProvider,
operatorMappedToStakingProviderHelpers,
} = props
const {
operatorMappedRandomBeacon,
operatorMappedTbtc,
isOperatorMappedOnlyInRandomBeacon,
isOperatorMappedOnlyInTbtc,
} = operatorMappedToStakingProviderHelpers
const errors: FormikErrors<MapOperatorToStakingProviderFormValues> = {}

errors.operator = validateETHAddress(values.operator)
if (!errors.operator) {
let validationMsg: string | undefined = ""
try {
const isOperatorMappedToAnotherStakingProvider =
await checkIfOperatorIsMappedToAnotherStakingProvider(values.operator)
validationMsg = undefined
if (isOperatorMappedToAnotherStakingProvider) {
validationMsg =
"Operator is already mapped to another staking provider."
}
if (
isOperatorMappedOnlyInRandomBeacon &&
values.operator !== operatorMappedRandomBeacon
) {
validationMsg =
"The operator address doesn't match the one used in tbtc app"
}
if (
isOperatorMappedOnlyInTbtc &&
values.operator !== operatorMappedTbtc
) {
validationMsg =
"The operator address doesn't match the one used in random beacon app"
}
} catch (error) {
console.error(
"`MapOperatorToStakingProviderForm` validation error.",
error
)
validationMsg = (error as Error)?.message
}
errors.operator = validationMsg
errors.operator = await validateInputtedOperatorAddress(
values.operator,
checkIfOperatorIsMappedToAnotherStakingProvider,
mappedOperatorRandomBeacon,
mappedOperatorTbtc
)
}

return getErrorsObj(errors)
Expand Down
52 changes: 31 additions & 21 deletions src/components/Modal/MapOperatorToStakingProviderModal/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ import {
Box,
Button,
H5,
HStack,
LabelSm,
ModalBody,
ModalCloseButton,
Expand All @@ -25,32 +24,43 @@ import { ModalType } from "../../../enums"
import { useModal } from "../../../hooks/useModal"
import StakeAddressInfo from "../../../pages/Staking/StakeCard/StakeAddressInfo"
import { useWeb3React } from "@web3-react/core"
import { AddressZero } from "@ethersproject/constants"
import { useThreshold } from "../../../contexts/ThresholdContext"
import { isAddressZero, isSameETHAddress } from "../../../web3/utils"
import { useOperatorMappedtoStakingProviderHelpers } from "../../../hooks/staking-applications/useOperatorMappedToStakingProviderHelpers"
import {
isAddressZero,
isSameETHAddress,
AddressZero,
} from "../../../web3/utils"

export interface MapOperatorToStakingProviderModalProps {
mappedOperatorTbtc: string
mappedOperatorRandomBeacon: string
}

const MapOperatorToStakingProviderModal: FC<BaseModalProps> = () => {
const MapOperatorToStakingProviderModal: FC<
BaseModalProps & MapOperatorToStakingProviderModalProps
> = ({ mappedOperatorTbtc, mappedOperatorRandomBeacon }) => {
const { account } = useWeb3React()
const operatorMappedToStakingProviderHelpers =
useOperatorMappedtoStakingProviderHelpers()
const {
isOperatorMappedOnlyInRandomBeacon,
isOperatorMappedOnlyInTbtc,
operatorMappedRandomBeacon,
operatorMappedTbtc,
} = operatorMappedToStakingProviderHelpers
const formRef =
useRef<FormikProps<MapOperatorToStakingProviderFormValues>>(null)
const { closeModal, openModal } = useModal()
const threshold = useThreshold()

const isOperatorMappedOnlyInTbtc =
!isAddressZero(mappedOperatorTbtc) &&
isAddressZero(mappedOperatorRandomBeacon)

const isOperatorMappedOnlyInRandomBeacon =
isAddressZero(mappedOperatorTbtc) &&
!isAddressZero(mappedOperatorRandomBeacon)

const onSubmit = async ({
operator,
}: MapOperatorToStakingProviderFormValues) => {
if (account) {
openModal(ModalType.MapOperatorToStakingProviderConfirmation, {
operator,
mappedOperatorTbtc,
mappedOperatorRandomBeacon,
})
}
}
Expand Down Expand Up @@ -85,13 +95,14 @@ const MapOperatorToStakingProviderModal: FC<BaseModalProps> = () => {
</H5>
) : (
<H5>
We’ve noticed your wallet address is the same with your Provider
We’ve noticed your wallet address is the same as your Provider
Address
</H5>
)}
<BodyLg mt="4">
Would you like to map your Operator Address? Mapping an Operator
Address will require one transaction per application.
Map your Operator Address to your Provider Address to improve the
support of your hardware wallet. Mapping will require one
transaction per application.
</BodyLg>
</InfoBox>
<BodyLg mt={"10"}>
Expand All @@ -118,18 +129,17 @@ const MapOperatorToStakingProviderModal: FC<BaseModalProps> = () => {
formId="map-operator-to-staking-provider-form"
initialAddress={
isOperatorMappedOnlyInRandomBeacon
? operatorMappedRandomBeacon
? mappedOperatorRandomBeacon
: isOperatorMappedOnlyInTbtc
? operatorMappedTbtc
? mappedOperatorTbtc
: ""
}
onSubmitForm={onSubmit}
checkIfOperatorIsMappedToAnotherStakingProvider={
checkIfOperatorIsMappedToAnotherStakingProvider
}
operatorMappedToStakingProviderHelpers={
operatorMappedToStakingProviderHelpers
}
mappedOperatorTbtc={mappedOperatorTbtc}
mappedOperatorRandomBeacon={mappedOperatorRandomBeacon}
/>
</Box>
<AlertBox
Expand Down
Original file line number Diff line number Diff line change
@@ -1,19 +1,12 @@
import { FC } from "react"
import {
BodyMd,
BodySm,
HStack,
List,
ListItem,
} from "@threshold-network/components"
import { FC, Fragment } from "react"
import { BodySm, HStack, List, ListItem } from "@threshold-network/components"
import withBaseModal from "../withBaseModal"
import { BaseModalProps } from "../../../types"
import { StakingAppName } from "../../../store/staking-applications"
import TransactionSuccessModal from "../TransactionSuccessModal"
import shortenAddress from "../../../utils/shortenAddress"
import { ExplorerDataType } from "../../../utils/createEtherscanLink"
import ViewInBlockExplorer from "../../ViewInBlockExplorer"
import { camelCaseToNormal } from "../../../utils/text"

export type OperatorMappedSuccessTx = {
application: {
Expand All @@ -36,44 +29,51 @@ const MapOperatorToStakingProviderSuccessBase: FC<
subTitle="You successfully mapped your Operator Address."
body={
<>
<List spacing="2" mb={"4rem"}>
<ListItem key="map_operator_succes_modal__operator">
<List spacing="2" mb={"16"}>
<ListItem>
<HStack justify="space-between">
<BodySm>Operator</BodySm>
<BodySm>Provider Address</BodySm>
<BodySm>
{shortenAddress(transactions[0].application.operator)}
{shortenAddress(transactions[0].application.stakingProvider)}
</BodySm>
</HStack>
</ListItem>
<ListItem key="map_operator_succes_modal__staking_provider">
<ListItem>
<HStack justify="space-between">
<BodySm>Staking Provider</BodySm>
<BodySm>Operator Address</BodySm>
<BodySm>
{shortenAddress(transactions[0].application.stakingProvider)}
{shortenAddress(transactions[0].application.operator)}
</BodySm>
</HStack>
</ListItem>
</List>
{transactions.map((transaction, i) => {
const text = `${camelCaseToNormal(
transaction.application.appName
)} transaction`
return (
<BodySm
align="center"
mt={1}
key={`map_operator_transaction_${i}`}
>
View{" "}
<BodySm align="center" mt={"1"}>
{transactions.length === 1 ? (
<>
<ViewInBlockExplorer
text={text}
id={transaction.txHash}
text="View"
id={transactions[0].txHash}
type={ExplorerDataType.TRANSACTION}
/>{" "}
transaction on Etherscan
</>
) : (
<>
View{" "}
{transactions.map((_, index) => (
<Fragment key={_.txHash}>
<ViewInBlockExplorer
text={`transaction ${index + 1}`}
id={_.txHash}
type={ExplorerDataType.TRANSACTION}
/>
{index + 1 === transactions.length ? " " : " and "}
</Fragment>
))}
on Etherscan
</BodySm>
)
})}
</>
)}
</BodySm>
</>
}
/>
Expand Down
1 change: 0 additions & 1 deletion src/hooks/staking-applications/index.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
export * from "./useOperatorsMappedToStakingProvider"
export * from "./useStakingAppContract"
export * from "./useStakingAppDataByStakingProvider"
export * from "./useStakingApplicationState"
Expand Down
Loading