diff --git a/src/App.tsx b/src/App.tsx index 43afa8075..50e90ef8c 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -27,21 +27,9 @@ import { PageComponent } from "./types" import { Token } from "./enums" import getLibrary from "./web3/library" import { useSubscribeToERC20TransferEvent } from "./web3/hooks/useSubscribeToERC20TransferEvent" -import { useSubscribeToStakedEvent } from "./hooks/useSubscribeToStakedEvent" -import { useSubscribeToUnstakedEvent } from "./hooks/useSubscribeToUnstakedEvent" -import { useSubscribeToToppedUpEvent } from "./hooks/useSubscribeToToppedUpEvent" import { pages } from "./pages" -import { useCheckBonusEligibility } from "./hooks/useCheckBonusEligibility" -import { useFetchStakingRewards } from "./hooks/useFetchStakingRewards" import { isSameETHAddress } from "./web3/utils" import { ThresholdProvider } from "./contexts/ThresholdContext" -import { - useSubscribeToAuthorizationIncreasedEvent, - useSubscribeToAuthorizationDecreaseApprovedEvent, - useSubscribeToAuthorizationDecreaseRequestedEvent, - useSubscribeToOperatorRegisteredEvent, - useSubscribeToOperatorStatusUpdatedEvent, -} from "./hooks/staking-applications" import { useSaveConnectedAddressToStore } from "./hooks/useSaveConnectedAddressToStore" import { usePosthog } from "./hooks/posthog" import { useSubscribeToDepositRevealedEvent } from "./hooks/tbtc/useSubsribeToDepositRevealedEvent" @@ -53,22 +41,7 @@ import { import { useSentry } from "./hooks/sentry" const Web3EventHandlerComponent = () => { - useSubscribeToERC20TransferEvent(Token.Keep) - useSubscribeToERC20TransferEvent(Token.Nu) - useSubscribeToERC20TransferEvent(Token.T) useSubscribeToERC20TransferEvent(Token.TBTCV2) - useSubscribeToStakedEvent() - useSubscribeToUnstakedEvent() - useSubscribeToToppedUpEvent() - useSubscribeToAuthorizationIncreasedEvent() - useSubscribeToAuthorizationDecreaseApprovedEvent("tbtc") - useSubscribeToAuthorizationDecreaseApprovedEvent("randomBeacon") - useSubscribeToAuthorizationDecreaseRequestedEvent("tbtc") - useSubscribeToAuthorizationDecreaseRequestedEvent("randomBeacon") - useSubscribeToOperatorRegisteredEvent("tbtc") - useSubscribeToOperatorRegisteredEvent("randomBeacon") - useSubscribeToOperatorStatusUpdatedEvent("randomBeacon") - useSubscribeToOperatorStatusUpdatedEvent("tbtc") useSubscribeToDepositRevealedEvent() useSubscribeToOptimisticMintingFinalizedEvent() useSubscribeToOptimisticMintingRequestedEvent() @@ -122,8 +95,6 @@ const AppBody = () => { }, [dispatch]) usePosthog() - useCheckBonusEligibility() - useFetchStakingRewards() useSaveConnectedAddressToStore() useSentry() diff --git a/src/components/BundledRewardsAlert/index.tsx b/src/components/BundledRewardsAlert/index.tsx deleted file mode 100644 index 4035f4a7d..000000000 --- a/src/components/BundledRewardsAlert/index.tsx +++ /dev/null @@ -1,25 +0,0 @@ -import { FC } from "react" -import { - Alert, - AlertIcon, - AlertDescription, - AlertProps, - BodyXs, -} from "@threshold-network/components" - -const defaultText = - "tBTC + Random Beacon earn bundled rewards. Authorize both apps to earn rewards." - -const BundledRewardsAlert: FC<{ text?: string } & AlertProps> = ({ - text = defaultText, - ...restProps -}) => { - return ( - - - {text} - - ) -} - -export default BundledRewardsAlert diff --git a/src/components/Forms/TokenAmountForm.tsx b/src/components/Forms/TokenAmountForm.tsx deleted file mode 100644 index bcc8a9404..000000000 --- a/src/components/Forms/TokenAmountForm.tsx +++ /dev/null @@ -1,118 +0,0 @@ -import { BodySm, Box, ButtonProps, Icon } from "@threshold-network/components" -import { FormikErrors, FormikProps, withFormik } from "formik" -import { FC, Ref } from "react" -import ThresholdCircleBrand from "../../static/icons/ThresholdCircleBrand" -import { formatTokenAmount } from "../../utils/formatAmount" -import { - DEFAULT_MIN_VALUE, - getErrorsObj, - validateAmountInRange, -} from "../../utils/forms" -import SubmitTxButton from "../SubmitTxButton" -import { Form } from "./Form" -import { FormikTokenBalanceInput } from "./FormikTokenBalanceInput" - -export type FormValues = { - tokenAmount: string -} - -export type TokenAmountFormBaseProps = { - submitButtonText: string - maxTokenAmount: string | number - label?: string | JSX.Element - helperText?: string - icon?: typeof Icon - isDisabled?: boolean - shouldValidateForm?: boolean - shouldDisplayMaxAmountInLabel?: boolean - token?: { decimals: number; symbol: string } - placeholder?: string - minTokenAmount?: string | number - submitButtonVariant?: ButtonProps["variant"] -} - -export const TokenAmountFormBase: FC< - TokenAmountFormBaseProps & FormikProps -> = ({ - submitButtonText, - maxTokenAmount, - helperText, - label = "Token Amount", - token = { decimals: 18, symbol: "T" }, - icon = ThresholdCircleBrand, - isDisabled = false, - shouldValidateForm = true, - shouldDisplayMaxAmountInLabel = false, - placeholder, - submitButtonVariant = "solid", - ...formikProps -}) => { - return ( -
- - {label} - - {maxTokenAmount - ? formatTokenAmount(maxTokenAmount, undefined, token.decimals) - : "--"}{" "} - {token.symbol} - - - ) : ( - label - ) - } - placeholder={placeholder || `${token.symbol} amount`} - icon={icon} - max={maxTokenAmount} - helperText={helperText} - isDisabled={isDisabled} - _disabled={{ bg: "gray.50", border: "none", cursor: "not-allowed" }} - /> - - - ) -} - -export type TokenAmountFormProps = { - innerRef?: Ref> - onSubmitForm: (tokenAmount: string) => void - initialTokenAmount?: string -} & TokenAmountFormBaseProps - -export const TokenAmountForm = withFormik({ - mapPropsToValues: (props) => ({ - tokenAmount: props.initialTokenAmount || "", - }), - validate: (values, props) => { - if (!props.shouldValidateForm) return {} - const errors: FormikErrors = {} - - errors.tokenAmount = validateAmountInRange( - values.tokenAmount, - props.maxTokenAmount.toString(), - props.minTokenAmount ? props.minTokenAmount.toString() : DEFAULT_MIN_VALUE - ) - return getErrorsObj(errors) - }, - handleSubmit: (values, { props }) => { - props.onSubmitForm(values.tokenAmount) - }, - displayName: "TokenAmountForm", -})(TokenAmountFormBase) - -TokenAmountForm.defaultProps = { - shouldValidateForm: true, - minTokenAmount: DEFAULT_MIN_VALUE, -} diff --git a/src/components/Forms/index.ts b/src/components/Forms/index.ts index 06c2feb72..5a48bb1fc 100644 --- a/src/components/Forms/index.ts +++ b/src/components/Forms/index.ts @@ -1,4 +1,3 @@ -export * from "./TokenAmountForm" export * from "./Form" export * from "./FormikInput" export * from "./FormikTokenBalanceInput" diff --git a/src/components/Link/SharedLinks.tsx b/src/components/Link/SharedLinks.tsx deleted file mode 100644 index 8c64b4d28..000000000 --- a/src/components/Link/SharedLinks.tsx +++ /dev/null @@ -1,30 +0,0 @@ -import { FC, ComponentProps } from "react" -import { useColorModeValue } from "@chakra-ui/react" -import { BodySm } from "@threshold-network/components" -import ViewInBlockExplorer from "../ViewInBlockExplorer" -import { useTStakingContract } from "../../web3/hooks" -import { ExplorerDataType } from "../../utils/createEtherscanLink" - -type StakingContractLearnMoreProps = ComponentProps - -export const StakingContractLearnMore: FC = ( - props -) => { - const tStakingContract = useTStakingContract() - const color = useColorModeValue("gray.500", "gray.300") - - if (tStakingContract?.address) { - return ( - - Read the{" "} - - - ) - } - - return null -} diff --git a/src/components/Link/index.tsx b/src/components/Link/index.tsx index abc31f4fc..d137432ba 100644 --- a/src/components/Link/index.tsx +++ b/src/components/Link/index.tsx @@ -47,6 +47,4 @@ const Link: FC = forwardRef( } ) -export * from "./SharedLinks" - export default Link diff --git a/src/components/Modal/ClaimingRewards/SuccessModal.tsx b/src/components/Modal/ClaimingRewards/SuccessModal.tsx deleted file mode 100644 index 0f3986dfd..000000000 --- a/src/components/Modal/ClaimingRewards/SuccessModal.tsx +++ /dev/null @@ -1,48 +0,0 @@ -import { FC } from "react" -import { HStack, BodySm, List, ListItem } from "@threshold-network/components" -import TransactionSuccessModal from "../TransactionSuccessModal" -import withBaseModal from "../withBaseModal" -import { formatTokenAmount } from "../../../utils/formatAmount" -import shortenAddress from "../../../utils/shortenAddress" -import { BaseModalProps } from "../../../types" - -interface ClaimRewardsSuccessProps extends BaseModalProps { - transactionHash: string - totalRewardsAmount: string - beneficiaries: string[] -} - -const ClaimRewardsSuccessModalBase: FC = ({ - transactionHash, - totalRewardsAmount, - beneficiaries, -}) => { - return ( - - - - Claimed Amount - {formatTokenAmount(totalRewardsAmount)} T - - - {beneficiaries.map((beneficiary) => ( - - - Beneficiary Address - {shortenAddress(beneficiary)} - - - ))} - - } - /> - ) -} - -export const ClaimRewardsSuccessModal = withBaseModal( - ClaimRewardsSuccessModalBase -) diff --git a/src/components/Modal/ClaimingRewards/index.tsx b/src/components/Modal/ClaimingRewards/index.tsx deleted file mode 100644 index a021df4e7..000000000 --- a/src/components/Modal/ClaimingRewards/index.tsx +++ /dev/null @@ -1,114 +0,0 @@ -import { FC, useCallback } from "react" -import { - BodyLg, - H5, - Button, - Divider, - ModalBody, - ModalFooter, - ModalHeader, - Stack, - useColorModeValue, - HStack, - BodySm, - List, - ListItem, -} from "@threshold-network/components" -import { useDispatch, useSelector } from "react-redux" -import { StakingContractLearnMore } from "../../Link/SharedLinks" -import InfoBox from "../../InfoBox" -import { BaseModalProps } from "../../../types" -import withBaseModal from "../withBaseModal" -import { - OnSuccessCallback, - useClaimMerkleRewardsTransaction, -} from "../../../web3/hooks" -import { - interimRewardsClaimed, - selectAccumulatedRewardsPerBeneficiary, - selectInterimRewards, -} from "../../../store/rewards" -import shortenAddress from "../../../utils/shortenAddress" -import { formatTokenAmount } from "../../../utils/formatAmount" -import { useModal } from "../../../hooks/useModal" -import { ModalType } from "../../../enums" -import ModalCloseButton from "../ModalCloseButton" - -const ClaimingRewardsBase: FC< - BaseModalProps & { - totalRewardsAmount: string - } -> = ({ closeModal, totalRewardsAmount }) => { - const dispatch = useDispatch() - const { openModal } = useModal() - const beneficiaryRewards = useSelector(selectAccumulatedRewardsPerBeneficiary) - const rewards = useSelector(selectInterimRewards) - - const onClaimSuccess = useCallback( - (receipt) => { - dispatch(interimRewardsClaimed()) - openModal(ModalType.ClaimingRewardsSuccess, { - transactionHash: receipt.transactionHash, - totalRewardsAmount, - beneficiaries: Object.keys(beneficiaryRewards), - }) - }, - [dispatch, totalRewardsAmount, openModal, beneficiaryRewards] - ) - - const { claim } = useClaimMerkleRewardsTransaction(onClaimSuccess) - - return ( - <> - Claiming Rewards - - - - -
- You are about to claim your rewards. -
- - By completing this action you will claim all the rewards you have - accrued across all your stakes. - -
- - {Object.entries(beneficiaryRewards).map( - ([beneficiary, rewardAmount]) => ( - - - Beneficiary Address - {shortenAddress(beneficiary)} - - - Reward Amount - {formatTokenAmount(rewardAmount)} T - - - ) - )} - - - -
-
- - - - - - ) -} - -export const ClaimingRewards = withBaseModal(ClaimingRewardsBase) - -export * from "./SuccessModal" diff --git a/src/components/Modal/ConfirmStakingParams/AdvancedParamsForm.tsx b/src/components/Modal/ConfirmStakingParams/AdvancedParamsForm.tsx deleted file mode 100644 index bb5848eeb..000000000 --- a/src/components/Modal/ConfirmStakingParams/AdvancedParamsForm.tsx +++ /dev/null @@ -1,125 +0,0 @@ -import { FC, Ref } from "react" -import { FormikProps, FormikErrors, withFormik } from "formik" -import { Form, FormikInput } from "../../Forms" -import { getErrorsObj, validateETHAddress } from "../../../utils/forms" -import { - Alert, - AlertIcon, - BodyXs, - useColorModeValue, -} from "@threshold-network/components" -import { useWeb3React } from "@web3-react/core" -import { isAddress, isSameETHAddress } from "../../../web3/utils" -import Link from "../../Link" - -export interface FormValues { - stakingProvider: string - beneficiary: string - authorizer: string -} - -type ComponentProps = { - formId: string -} - -const AdvancedParamsFormBase: FC> = ({ - formId, - values, -}) => { - const { authorizer } = values - const { account } = useWeb3React() - - return ( -
- - } - /> - } - /> - - } - /> - {isAddress(authorizer) && - !isSameETHAddress(authorizer, account as string) && ( - - - - Authorizer address is different than your wallet address. We - recommend you to use the same address as your wallet address. - - - )} - - ) -} - -const AddressHelper: FC<{ text: string }> = ({ text }) => { - const textColor = useColorModeValue("gray.500", "gray.300") - - return ( - - {text} Learn more. - - ) -} - -type AdvancedParamsFormProps = { - initialAddress: string - innerRef: Ref> - checkIfProviderUsed: ( - stakingProvider: string - ) => Promise<{ isProviderUsedForKeep: boolean; isProviderUsedForT: boolean }> - onSubmitForm: (values: FormValues) => void -} & ComponentProps - -const AdvancedParamsForm = withFormik({ - mapPropsToValues: ({ initialAddress }) => ({ - authorizer: initialAddress, - beneficiary: initialAddress, - stakingProvider: initialAddress, - }), - validate: async (values, props) => { - const { checkIfProviderUsed } = props - const errors: FormikErrors = {} - - errors.stakingProvider = validateETHAddress(values.stakingProvider) - if (!errors.stakingProvider) { - let validationMsg: string | undefined = "" - try { - const { isProviderUsedForKeep, isProviderUsedForT } = - await checkIfProviderUsed(values.stakingProvider) - validationMsg = - isProviderUsedForKeep || isProviderUsedForT - ? "Provider address is already in use." - : undefined - } catch (error) { - console.error("`AdvancedParamsForm` validation error.", error) - validationMsg = (error as Error)?.message - } - errors.stakingProvider = validationMsg - } - errors.beneficiary = validateETHAddress(values.beneficiary) - errors.authorizer = validateETHAddress(values.authorizer) - - return getErrorsObj(errors) - }, - handleSubmit: (values, { props }) => { - props.onSubmitForm(values) - }, - displayName: "AdvancedStakingParamsForm", -})(AdvancedParamsFormBase) - -export default AdvancedParamsForm diff --git a/src/components/Modal/ConfirmStakingParams/index.tsx b/src/components/Modal/ConfirmStakingParams/index.tsx deleted file mode 100644 index eeeec0291..000000000 --- a/src/components/Modal/ConfirmStakingParams/index.tsx +++ /dev/null @@ -1,139 +0,0 @@ -import { FC, useEffect, useRef, useState } from "react" -import { useWeb3React } from "@web3-react/core" -import { - BodyLg, - BodySm, - H5, - Alert, - AlertIcon, - Button, - Divider, - ModalBody, - ModalFooter, - ModalHeader, - List, - ListItem, - HStack, -} from "@threshold-network/components" -import { FormikProps } from "formik" -import withBaseModal from "../withBaseModal" -import { useModal } from "../../../hooks/useModal" -import { BaseModalProps } from "../../../types" -import AdvancedParamsForm, { FormValues } from "./AdvancedParamsForm" -import { useStakingState } from "../../../hooks/useStakingState" -import { ModalType } from "../../../enums" -import InfoBox from "../../InfoBox" -import { StakingContractLearnMore } from "../../Link" -import useCheckDuplicateProviderAddress from "../../../web3/hooks/useCheckDuplicateProviderAddress" -import { featureFlags } from "../../../constants" -import { useStakeTransaction } from "../../../web3/hooks/useStakeTransaction" -import { formatTokenAmount } from "../../../utils/formatAmount" -import ModalCloseButton from "../ModalCloseButton" - -const ConfirmStakingParamsModal: FC< - BaseModalProps & { stakeAmount: string } -> = ({ stakeAmount }) => { - const formRef = useRef>(null) - const { closeModal, openModal } = useModal() - const [hasBeenValidatedOnMount, setHasBeenValidatedOnMount] = useState(false) - const { account } = useWeb3React() - const { updateState } = useStakingState() - const checkIfProviderUsed = useCheckDuplicateProviderAddress() - - // stake transaction, opens success modal on success callback - // not needed once MAS is launched - const { stake } = useStakeTransaction((receipt) => { - if (featureFlags.MULTI_APP_STAKING) { - openModal(ModalType.StakeSuccess, { - transactionHash: receipt.transactionHash, - }) - } else { - openModal(ModalType.StakeSuccessOLD, { - transactionHash: receipt.transactionHash, - }) - } - }) - - useEffect(() => { - const forceFormValidation = async () => { - if (hasBeenValidatedOnMount || !formRef.current) return - setHasBeenValidatedOnMount(true) - const errors = await formRef.current.validateForm() - if (errors) { - formRef.current.setErrors(errors) - formRef.current.setTouched({ stakingProvider: true }) - } - } - forceFormValidation() - }) - - const onSubmit = ({ - stakingProvider, - beneficiary, - authorizer, - }: FormValues) => { - updateState("stakingProvider", stakingProvider) - updateState("beneficiary", beneficiary) - updateState("authorizer", authorizer) - updateState("stakeAmount", stakeAmount) - - if (featureFlags.MULTI_APP_STAKING) { - openModal(ModalType.SubmitStake) - } else { - stake({ stakingProvider, beneficiary, authorizer, amount: stakeAmount }) - } - } - - return ( - <> - -
Stake Tokens
- (Step 1) -
- - - -
- You are about to make a deposit into the T Staking Contract. -
- {featureFlags.MULTI_APP_STAKING && ( - Staking requires 2 transactions. - )} -
- - - - Staked Amount - {`${formatTokenAmount(stakeAmount)} T`} - - - - - - Take note! These addresses cannot be changed later. - - - - - - -
- - - - - - ) -} - -export default withBaseModal(ConfirmStakingParamsModal) diff --git a/src/components/Modal/DeauthorizeApplicationModal/InititateDeauthorization.tsx b/src/components/Modal/DeauthorizeApplicationModal/InititateDeauthorization.tsx deleted file mode 100644 index 195e7a3f1..000000000 --- a/src/components/Modal/DeauthorizeApplicationModal/InititateDeauthorization.tsx +++ /dev/null @@ -1,148 +0,0 @@ -import { FC } from "react" -import { - BodyLg, - BodySm, - BoxLabel, - FlowStep, - FlowStepStatus, - H5, - LineDivider, - Alert, - AlertIcon, - Button, - Flex, - ModalBody, - ModalFooter, - ModalHeader, - Stack, - useColorModeValue, - Box, -} from "@threshold-network/components" -import InfoBox from "../../InfoBox" -import StakingApplicationOperationIcon from "../../StakingApplicationOperationIcon" -import shortenAddress from "../../../utils/shortenAddress" -import TokenBalance from "../../TokenBalance" -import { StakingAppName } from "../../../store/staking-applications" -import { useInitiateDeauthorization } from "../../../hooks/staking-applications" -import { getStakingAppLabelFromAppName } from "../../../utils/getStakingAppLabel" -import ModalCloseButton from "../ModalCloseButton" -import { StakingProviderAppInfo } from "../../../threshold-ts/applications" - -const InitiateDeauthorization: FC< - { - closeModal: () => void - stakingProvider: string - decreaseAmount: string - stakingAppName: StakingAppName - } & Pick -> = ({ - closeModal, - stakingProvider, - decreaseAmount, - stakingAppName, - isOperatorInPool, - operator, -}) => { - const shouldUpdateOperatorStatusAfterInitiation = - isOperatorInPool !== undefined && !isOperatorInPool - const { sendTransaction } = useInitiateDeauthorization( - stakingAppName, - shouldUpdateOperatorStatusAfterInitiation - ) - - const handleInitiateClick = async () => { - await sendTransaction(stakingProvider, decreaseAmount, operator) - } - - return ( - <> - Initiate Deauthorization - - - -
- You're about to initiate the decrease of your{" "} - {getStakingAppLabelFromAppName(stakingAppName)} authorization. -
- - Initiation and confirmation of deauthorization is a two step action. - - {shouldUpdateOperatorStatusAfterInitiation && ( - Initiation is comprised of 2 transactions. - )} -
- - - - - Decrease amount - - - - Provider Address - {shortenAddress(stakingProvider)} - - - - Deauthorization Timeline - - - - {shouldUpdateOperatorStatusAfterInitiation ? ( - <> - 1 transaction - Deauthorization Request. - 1 transaction - Deauthorization Initiation. - - ) : ( - "This is 1 transaction." - )} - - - You must wait a 45 day cooldown to then confirm the deauthorization. - This is 1 transaction. - - - - - Take note! In this 45 day cooldown period, you cannot increase or - decrease your authorization. As a measure of security for the entire - network, in the event of slashing you will be slashed based on your - initial amount. - -
- - - - - - ) -} - -export default InitiateDeauthorization diff --git a/src/components/Modal/DeauthorizeApplicationModal/index.tsx b/src/components/Modal/DeauthorizeApplicationModal/index.tsx deleted file mode 100644 index d54f992f9..000000000 --- a/src/components/Modal/DeauthorizeApplicationModal/index.tsx +++ /dev/null @@ -1,4 +0,0 @@ -import InitiateDeauthorization from "./InititateDeauthorization" -import withBaseModal from "../withBaseModal" - -export default withBaseModal(InitiateDeauthorization) diff --git a/src/components/Modal/MapOperatorToStakingProviderConfirmationModal/index.tsx b/src/components/Modal/MapOperatorToStakingProviderConfirmationModal/index.tsx deleted file mode 100644 index 69a944d3b..000000000 --- a/src/components/Modal/MapOperatorToStakingProviderConfirmationModal/index.tsx +++ /dev/null @@ -1,169 +0,0 @@ -import { CheckCircleIcon } from "@chakra-ui/icons" -import { - Box, - BoxProps, - Button, - HStack, - ModalBody, - ModalFooter, - ModalHeader, -} from "@chakra-ui/react" -import { AddressZero } from "@ethersproject/constants" -import { BodyLg, BodyMd, H5, LabelSm } from "@threshold-network/components" -import { useWeb3React } from "@web3-react/core" -import { FC, useCallback } from "react" -import { ModalType } from "../../../enums" -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/modal" -import { BaseModalProps } from "../../../types" -import InfoBox from "../../InfoBox" -import withBaseModal from "../withBaseModal" -import { OnSuccessCallback } from "../../../web3/hooks" - -const OperatorMappingConfirmation: FC< - BoxProps & { appName: string; operator: string; stakingProvider: string } -> = ({ appName, operator, stakingProvider, ...restProps }) => { - return ( - - - - {appName} app - - - Operator address: - {operator} - - - - ) -} - -const MapOperatorToStakingProviderConfirmationModal: FC< - BaseModalProps & { - operator: string - isOperatorMappedOnlyInTbtc: boolean - isOperatorMappedOnlyInRandomBeacon: boolean - } -> = ({ - operator, - isOperatorMappedOnlyInTbtc, - isOperatorMappedOnlyInRandomBeacon, - closeModal, -}) => { - const { account } = useWeb3React() - const { registerMultipleOperators } = - useRegisterMultipleOperatorsTransaction() - const dispatch = useAppDispatch() - - const { openModal } = useModal() - const onSuccess = useCallback( - (receipt) => { - openModal(ModalType.MapOperatorToStakingProviderSuccess, { - transactions: [ - { - txHash: receipt.transactionHash, - application: { - appName: isOperatorMappedOnlyInRandomBeacon - ? "tbtc" - : "randomBeacon", - operator, - stakingProvider: account, - }, - }, - ], - }) - }, - [openModal, operator, account] - ) - - const { sendTransaction: registerOperatorTbtc } = - useRegisterOperatorTransaction("tbtc", onSuccess) - const { sendTransaction: registerOperatorRandomBeacon } = - useRegisterOperatorTransaction("randomBeacon", onSuccess) - - const submitMappingOperator = async () => { - if (isOperatorMappedOnlyInRandomBeacon) { - const tx = await registerOperatorTbtc(operator) - if (!tx) { - openModal(ModalType.TransactionFailed, { - error: new Error( - "Transaction rejected. You are required to map the Operator Address for both apps." - ), - closeModal: () => { - closeModal() - dispatch(mapOperatorToStakingProviderModalClosed()) - }, - }) - } - } else if (isOperatorMappedOnlyInTbtc) { - const tx = await registerOperatorRandomBeacon(operator) - if (!tx) { - openModal(ModalType.TransactionFailed, { - error: new Error( - "Transaction rejected. You are required to map the Operator Address for both apps." - ), - closeModal: () => { - closeModal() - dispatch(mapOperatorToStakingProviderModalClosed()) - }, - }) - } - } else { - await registerMultipleOperators(operator) - } - } - - return ( - <> - Operator Address Mapping - - -
- You are about to map Operator Addresses to your Provider Address -
- - This will require{" "} - {isOperatorMappedOnlyInRandomBeacon || isOperatorMappedOnlyInTbtc - ? "1 transaction" - : "2 transactions"} - . Each mapping is one transaction - -
- {!isOperatorMappedOnlyInTbtc && ( - - )} - {!isOperatorMappedOnlyInRandomBeacon && ( - - )} -
- - - - - - ) -} - -export default withBaseModal(MapOperatorToStakingProviderConfirmationModal) diff --git a/src/components/Modal/MapOperatorToStakingProviderModal/MapOperatorToStakingProviderForm.tsx b/src/components/Modal/MapOperatorToStakingProviderModal/MapOperatorToStakingProviderForm.tsx deleted file mode 100644 index 5ac2f4d12..000000000 --- a/src/components/Modal/MapOperatorToStakingProviderModal/MapOperatorToStakingProviderForm.tsx +++ /dev/null @@ -1,121 +0,0 @@ -import { FC, Ref } from "react" -import { FormikProps, FormikErrors, withFormik } from "formik" -import { Form, FormikInput } from "../../Forms" -import { getErrorsObj, validateETHAddress } from "../../../utils/forms" -import { isAddressZero, isSameETHAddress } from "../../../web3/utils" - -export interface MapOperatorToStakingProviderFormValues { - operator: string -} - -type ComponentProps = { - formId: string -} - -const MapOperatorToStakingProviderFormBase: FC< - ComponentProps & FormikProps -> = ({ formId, values }) => { - return ( -
- - - ) -} - -const validateInputtedOperatorAddress = async ( - operator: string, - checkIfOperatorIsMappedToAnotherStakingProvider: ( - operator: string - ) => Promise, - mappedOperatorTbtc: string, - mappedOperatorRandomBeacon: string -): Promise => { - let validationMsg: string | undefined = "" - - try { - const isOperatorMappedToAnotherStakingProvider = - await checkIfOperatorIsMappedToAnotherStakingProvider(operator) - validationMsg = undefined - if (isOperatorMappedToAnotherStakingProvider) { - validationMsg = "Operator is already mapped to another staking provider." - } - - const isOperatorMappedOnlyInTbtc = - !isAddressZero(mappedOperatorTbtc) && - isAddressZero(mappedOperatorRandomBeacon) - - const isOperatorMappedOnlyInRandomBeacon = - isAddressZero(mappedOperatorTbtc) && - !isAddressZero(mappedOperatorRandomBeacon) - - 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> - checkIfOperatorIsMappedToAnotherStakingProvider: ( - operator: string - ) => Promise - onSubmitForm: (values: MapOperatorToStakingProviderFormValues) => void -} & ComponentProps - -const MapOperatorToStakingProviderForm = withFormik< - MapOperatorToStakingProviderFormProps, - MapOperatorToStakingProviderFormValues ->({ - mapPropsToValues: ({ initialAddress }) => ({ - operator: initialAddress, - }), - validate: async (values, props) => { - const { - mappedOperatorTbtc, - mappedOperatorRandomBeacon, - checkIfOperatorIsMappedToAnotherStakingProvider, - } = props - const errors: FormikErrors = {} - - errors.operator = validateETHAddress(values.operator) - if (!errors.operator) { - errors.operator = await validateInputtedOperatorAddress( - values.operator, - checkIfOperatorIsMappedToAnotherStakingProvider, - mappedOperatorTbtc, - mappedOperatorRandomBeacon - ) - } - - return getErrorsObj(errors) - }, - handleSubmit: (values, { props }) => { - props.onSubmitForm(values) - }, - displayName: "MapOperatorToStakingProviderFor", -})(MapOperatorToStakingProviderFormBase) - -export default MapOperatorToStakingProviderForm diff --git a/src/components/Modal/MapOperatorToStakingProviderModal/index.tsx b/src/components/Modal/MapOperatorToStakingProviderModal/index.tsx deleted file mode 100644 index 74c5f72de..000000000 --- a/src/components/Modal/MapOperatorToStakingProviderModal/index.tsx +++ /dev/null @@ -1,171 +0,0 @@ -import { FC, useRef } from "react" -import { - AlertBox, - AlertIcon, - BodyLg, - BodyXs, - Box, - Button, - H5, - LabelSm, - ModalBody, - ModalFooter, - ModalHeader, -} from "@threshold-network/components" -import { BaseModalProps } from "../../../types" -import withBaseModal from "../withBaseModal" -import InfoBox from "../../InfoBox" -import MapOperatorToStakingProviderForm, { - MapOperatorToStakingProviderFormValues, -} from "./MapOperatorToStakingProviderForm" -import { FormikProps } from "formik" -import { ModalType } from "../../../enums" -import { useModal } from "../../../hooks/useModal" -import StakeAddressInfo from "../../../pages/Staking/StakeCard/StakeAddressInfo" -import { useWeb3React } from "@web3-react/core" -import { useThreshold } from "../../../contexts/ThresholdContext" -import { - isAddressZero, - isSameETHAddress, - AddressZero, -} from "../../../web3/utils" -import { selectMappedOperators } from "../../../store/account/selectors" -import { useAppSelector } from "../../../hooks/store" -import ModalCloseButton from "../ModalCloseButton" - -export interface MapOperatorToStakingProviderModalProps { - mappedOperatorTbtc: string - mappedOperatorRandomBeacon: string -} - -const MapOperatorToStakingProviderModal: FC< - BaseModalProps & MapOperatorToStakingProviderModalProps -> = () => { - const { account } = useWeb3React() - const formRef = - useRef>(null) - const { closeModal, openModal } = useModal() - const threshold = useThreshold() - - const { - mappedOperatorTbtc, - mappedOperatorRandomBeacon, - isOperatorMappedOnlyInRandomBeacon, - isOperatorMappedOnlyInTbtc, - } = useAppSelector(selectMappedOperators) - - const onSubmit = async ({ - operator, - }: MapOperatorToStakingProviderFormValues) => { - if (account) { - openModal(ModalType.MapOperatorToStakingProviderConfirmation, { - operator, - isOperatorMappedOnlyInTbtc, - isOperatorMappedOnlyInRandomBeacon, - }) - } - } - - const checkIfOperatorIsMappedToAnotherStakingProvider: ( - operator: string - ) => Promise = async (operator: string) => { - const stakingProviderMappedEcdsa = - await threshold.multiAppStaking.ecdsa.operatorToStakingProvider(operator) - const stakingProviderMappedRandomBeacon = - await threshold.multiAppStaking.randomBeacon.operatorToStakingProvider( - operator - ) - - return ( - (!isAddressZero(stakingProviderMappedEcdsa) && - !isSameETHAddress(stakingProviderMappedEcdsa, account!)) || - (!isAddressZero(stakingProviderMappedRandomBeacon) && - !isSameETHAddress(stakingProviderMappedRandomBeacon, account!)) - ) - } - - return ( - <> - Operator Address Mapping - - - - {isOperatorMappedOnlyInRandomBeacon || isOperatorMappedOnlyInTbtc ? ( -
- We noticed you've only mapped 1 application's Operator Address. -
- ) : ( -
- We’ve noticed your wallet address is the same as your Provider - Address -
- )} - - Map your Operator Address to your Provider Address to improve the - support of your hardware wallet. Mapping will require one - transaction per application. - -
- - Choose an application to map the Operator Address: - - - {isOperatorMappedOnlyInRandomBeacon ? ( - tBTC app - ) : isOperatorMappedOnlyInTbtc ? ( - random beacon app - ) : ( - tBTC + Random Beacon apps (requires 2txs) - )} - - - - - - - Take note! tBTC + Random Beacon Apps Rewards Bundle will require two - transactions, one transaction per application. - - -
- - - - - - ) -} - -export default withBaseModal(MapOperatorToStakingProviderModal) diff --git a/src/components/Modal/MapOperatorToStakingProviderSuccessModal/index.tsx b/src/components/Modal/MapOperatorToStakingProviderSuccessModal/index.tsx deleted file mode 100644 index 71d4ddc57..000000000 --- a/src/components/Modal/MapOperatorToStakingProviderSuccessModal/index.tsx +++ /dev/null @@ -1,85 +0,0 @@ -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" - -export type OperatorMappedSuccessTx = { - application: { - appName: StakingAppName - operator: string - stakingProvider: string - } - txHash: string -} - -export type MapOperatorToStakingProviderSuccessProps = BaseModalProps & { - transactions: OperatorMappedSuccessTx[] -} - -const MapOperatorToStakingProviderSuccessBase: FC< - MapOperatorToStakingProviderSuccessProps -> = ({ transactions, closeModal }) => { - return ( - - - - - Provider Address - - {shortenAddress(transactions[0].application.stakingProvider)} - - - - - - Operator Address - - {shortenAddress(transactions[0].application.operator)} - - - - - - {transactions.length === 1 ? ( - <> - {" "} - transaction on Etherscan - - ) : ( - <> - View{" "} - {transactions.map((_, index) => ( - - - {index + 1 === transactions.length ? " " : " and "} - - ))} - on Etherscan - - )} - - - } - /> - ) -} - -export const MapOperatorToStakingProviderSuccess = withBaseModal( - MapOperatorToStakingProviderSuccessBase -) diff --git a/src/components/Modal/NewAppsToAuthorizeModal/index.tsx b/src/components/Modal/NewAppsToAuthorizeModal/index.tsx deleted file mode 100644 index 3a74d890d..000000000 --- a/src/components/Modal/NewAppsToAuthorizeModal/index.tsx +++ /dev/null @@ -1,126 +0,0 @@ -import { FC, useState } from "react" -import { Link as RouterLink } from "react-router-dom" -import { - Alert, - AlertDescription, - AlertIcon, - BodyLg, - Box, - Button, - Card, - H5, - LabelSm, - Link, - ModalBody, - ModalFooter, - ModalHeader, - Radio, - RadioGroup, - Stack, -} from "@threshold-network/components" -import InfoBox from "../../InfoBox" -import StakeAddressInfo from "../../../pages/Staking/StakeCard/StakeAddressInfo" -import { BaseModalProps } from "../../../types" -import withBaseModal from "../withBaseModal" -import { useStakingState } from "../../../hooks/useStakingState" -import { getStakeTitle } from "../../../utils/getStakeTitle" -import { isAddress, isSameETHAddress } from "../../../web3/utils" -import ButtonLink from "../../ButtonLink" -import ModalCloseButton from "../ModalCloseButton" - -const NewAppsToAuthorizeModal: FC = ({ closeModal }) => { - const { stakes } = useStakingState() - - const [selectedProviderAddress, setSelectedProviderAddress] = useState("") - - return ( - <> - New Apps Available - - - -
- There are new apps available for you to authorize and earn rewards! -
- - This will allow an app to use a portion of your stake. You can - authorize 100% of your stake to all apps and change this amount at - any time. - -
- {stakes.length > 0 ? ( - <> - Choose a stake to continue: - - - {stakes.map((stake, i) => ( - - - - {getStakeTitle(stake.stakeType, i + 1)} - - - - - ))} - - - - ) : ( - - - - You have no stakes. You can start staking on the{" "} - - staking page - - . - - - )} -
- - - - Continue - - - - ) -} - -export default withBaseModal(NewAppsToAuthorizeModal) diff --git a/src/components/Modal/NewStakerAuthorizeStakingApplicationModal/NewStakerAuthorizationCard.tsx b/src/components/Modal/NewStakerAuthorizeStakingApplicationModal/NewStakerAuthorizationCard.tsx deleted file mode 100644 index ff4d710bb..000000000 --- a/src/components/Modal/NewStakerAuthorizeStakingApplicationModal/NewStakerAuthorizationCard.tsx +++ /dev/null @@ -1,145 +0,0 @@ -import { FC, useMemo } from "react" -import { - BodyMd, - BodySm, - BoxProps, - Card, - Checkbox, - FormControl, - Grid, - GridItem, - HStack, - Link, -} from "@threshold-network/components" -import { Field, FieldProps, useField } from "formik" -import { BigNumber } from "ethers" -import { - AppAuthorizationInfo, - AppAuthorizationInfoProps, -} from "../../../pages/Staking/AuthorizeStakingApps/AuthorizeApplicationsCardCheckbox/AppAuthorizationInfo" -import ThresholdCircleBrand from "../../../static/icons/ThresholdCircleBrand" -import { formatTokenAmount } from "../../../utils/formatAmount" -import { FormikTokenBalanceInput } from "../../Forms/FormikTokenBalanceInput" -import { calculatePercenteage } from "../../../utils/percentage" - -export interface NewStakerAuthorizationCardProps extends BoxProps { - max: string | number - min: string | number - inputId: string - checkBoxId: string - label: string - stakingAppName: AppAuthorizationInfoProps["stakingAppName"] -} - -export const NewStakerAuthorizationCard: FC< - NewStakerAuthorizationCardProps -> = ({ - max, - min, - inputId, - checkBoxId, - label, - stakingAppName, - ...restProps -}) => { - const [, { value: inputValue }, { setValue }] = useField(inputId) - const [, { value: checkboxValue }] = useField(checkBoxId) - - const calculateRemainingAmount = () => { - if (inputValue) { - if (BigNumber.from(inputValue).gte(BigNumber.from(max))) { - return "0" - } - return formatTokenAmount(BigNumber.from(max).sub(inputValue).toString()) - } - - return formatTokenAmount(max) - } - - const percentToBeAuthorized = calculatePercenteage(inputValue, max) - const remainingAmount = calculateRemainingAmount() - - return ( - - - - {({ field }: FieldProps) => { - const { value } = field - return ( - - - - ) - }} - - - - - Amount - - Remaining Balance: {remainingAmount} T - - - } - placeholder="Enter amount" - icon={ThresholdCircleBrand} - max={max} - helperText={ - - setValue(min)}> - Minimum - - {formatTokenAmount(min)} T for {label} - - } - _disabled={{ bg: "gray.50", border: "none" }} - /> - - - - ) -} - -export default NewStakerAuthorizationCard diff --git a/src/components/Modal/NewStakerAuthorizeStakingApplicationModal/NewStakerAuthorizationForm.tsx b/src/components/Modal/NewStakerAuthorizeStakingApplicationModal/NewStakerAuthorizationForm.tsx deleted file mode 100644 index cd49f3564..000000000 --- a/src/components/Modal/NewStakerAuthorizeStakingApplicationModal/NewStakerAuthorizationForm.tsx +++ /dev/null @@ -1,131 +0,0 @@ -import { Form } from "../../Forms" -import { FC } from "react" -import { FormikErrors, FormikProps, useField, withFormik } from "formik" -import { getErrorsObj, validateAmountInRange } from "../../../utils/forms" -import { - Alert, - AlertIcon, - Badge, - BodyMd, - BodyXs, - Box, - Button, - Card, - HStack, - LabelMd, -} from "@threshold-network/components" -import { useModal } from "../../../hooks/useModal" -import NewStakerAuthorizationCard from "./NewStakerAuthorizationCard" - -export type FormValues = { - tbtcAmountToAuthorize: string | number - isTbtcChecked: boolean - randomBeaconAmountToAuthorize: string | number - isRandomBeaconChecked: boolean -} - -export interface AuthInputConstraints { - min: string | number - max: string | number -} - -interface Props { - onSubmitForm: (values: FormValues) => void - tbtcInputConstraints: AuthInputConstraints - randomBeaconInputConstraints: AuthInputConstraints -} - -export const formikWrapper = withFormik({ - handleSubmit: (values, { props }) => { - props.onSubmitForm(values) - }, - mapPropsToValues: (props) => ({ - tbtcAmountToAuthorize: props.tbtcInputConstraints.max, - isTbtcChecked: true, - randomBeaconAmountToAuthorize: props.randomBeaconInputConstraints.max, - isRandomBeaconChecked: true, - }), - validate: (values, props) => { - const errors: FormikErrors = {} - - errors.tbtcAmountToAuthorize = validateAmountInRange( - values?.tbtcAmountToAuthorize?.toString(), - props.tbtcInputConstraints.max.toString(), - props.tbtcInputConstraints.min.toString() - ) - - errors.randomBeaconAmountToAuthorize = validateAmountInRange( - values?.randomBeaconAmountToAuthorize?.toString(), - props.randomBeaconInputConstraints.max.toString(), - props.randomBeaconInputConstraints.min.toString() - ) - return getErrorsObj(errors) - }, - displayName: "AuthorizationForm", -}) - -const NewStakerAuthorizationForm: FC> = ({ - tbtcInputConstraints, - randomBeaconInputConstraints, - handleSubmit, -}) => { - const { closeModal } = useModal() - const [, { value: isTbtcChecked }] = useField("isTbtcChecked") - const [, { value: isRandomBeaconChecked }] = useField("isRandomBeaconChecked") - const bothAppsChecked = isTbtcChecked && isRandomBeaconChecked - - return ( -
- - tBTC + Random Beacon Rewards Bundle - - - {!bothAppsChecked && ( - - - - Note that you need to authorize both apps to earn rewards. - - - )} - - - - PRE - - Authorization not required - - - - - - - -
- ) -} - -export default formikWrapper(NewStakerAuthorizationForm) diff --git a/src/components/Modal/NewStakerAuthorizeStakingApplicationModal/index.tsx b/src/components/Modal/NewStakerAuthorizeStakingApplicationModal/index.tsx deleted file mode 100644 index d4d9929a8..000000000 --- a/src/components/Modal/NewStakerAuthorizeStakingApplicationModal/index.tsx +++ /dev/null @@ -1,115 +0,0 @@ -import { FC, useMemo } from "react" -import { - BodyLg, - BodyMd, - H5, - HStack, - ModalBody, - ModalHeader, - Stack, -} from "@threshold-network/components" -import InfoBox from "../../InfoBox" -import { BaseModalProps } from "../../../types" -import withBaseModal from "../withBaseModal" -import NewStakerAuthorizationForm, { - FormValues, -} from "./NewStakerAuthorizationForm" -import { useStakingState } from "../../../hooks/useStakingState" -import TokenBalance from "../../TokenBalance" -import { - useStakingApplicationAddress, - useStakingAppMinAuthorizationAmount, -} from "../../../hooks/staking-applications" -import { ModalType } from "../../../enums" -import { useModal } from "../../../hooks/useModal" -import ModalCloseButton from "../ModalCloseButton" - -const NewStakerAuthorizeStakingApplicationModal: FC = () => { - const { openModal } = useModal() - - const { stakeAmount, stakingProvider } = useStakingState() - - const tbtcMinAuthAmount = useStakingAppMinAuthorizationAmount("tbtc") - - const randomBeaconMinAuthAmount = - useStakingAppMinAuthorizationAmount("randomBeacon") - - const tbtcInputConstraints = useMemo( - () => ({ - min: tbtcMinAuthAmount, - max: stakeAmount, - }), - [stakeAmount, tbtcMinAuthAmount] - ) - - const randomBeaconInputConstraints = useMemo( - () => ({ - min: randomBeaconMinAuthAmount, - max: stakeAmount, - }), - [stakeAmount, randomBeaconMinAuthAmount] - ) - - const tbtcAppAddress = useStakingApplicationAddress("tbtc") - const randomBeaconAppAddress = useStakingApplicationAddress("randomBeacon") - - const handleSubmit = (vals: FormValues) => { - const tbtcAppInfo = { - appName: "tbtc", - address: tbtcAppAddress, - authorizationAmount: vals.tbtcAmountToAuthorize, - } - - const randomBeaconAppInfo = { - appName: "randomBeacon", - address: randomBeaconAppAddress, - authorizationAmount: vals.randomBeaconAmountToAuthorize, - } - - const applications = [ - vals.isRandomBeaconChecked ? randomBeaconAppInfo : null, - vals.isTbtcChecked ? tbtcAppInfo : null, - ].filter(Boolean) - - openModal(ModalType.AuthorizeStakingApps, { - stakingProvider: stakingProvider, - totalInTStake: stakeAmount, - applications, - }) - } - - return ( - <> - Authorize Apps - - - -
- Please authorize Threshold apps to use your stake to earn rewards -
- - You can authorize 100% of your stake to all the apps and change this - at any time. - -
- - - Total Staked Balance - - - - -
- - ) -} - -export default withBaseModal(NewStakerAuthorizeStakingApplicationModal) diff --git a/src/components/Modal/StakingApplications/AuthorizeStakingApps.tsx b/src/components/Modal/StakingApplications/AuthorizeStakingApps.tsx deleted file mode 100644 index b4917c212..000000000 --- a/src/components/Modal/StakingApplications/AuthorizeStakingApps.tsx +++ /dev/null @@ -1,142 +0,0 @@ -import { FC } from "react" -import { - BodyLg, - Button, - Card, - H5, - ModalBody, - ModalFooter, - ModalHeader, - LabelSm, - BodyMd, - List, - ListItem, -} from "@threshold-network/components" -import { CheckCircleIcon } from "@chakra-ui/icons" -import InfoBox from "../../InfoBox" -import TokenBalance from "../../TokenBalance" -import StakeAddressInfo from "../../../pages/Staking/StakeCard/StakeAddressInfo" -import BundledRewardsAlert from "../../BundledRewardsAlert" -import withBaseModal from "../withBaseModal" -import { - calculatePercenteage, - formatPercentage, -} from "../../../utils/percentage" -import { BaseModalProps } from "../../../types" -import { useAuthorizeMultipleAppsTransaction } from "../../../hooks/staking-applications" -import { useAppSelector } from "../../../hooks/store" -import { - selectStakingAppByStakingProvider, - StakingAppName, -} from "../../../store/staking-applications" -import { getStakingAppLabelFromAppName } from "../../../utils/getStakingAppLabel" -import ModalCloseButton from "../ModalCloseButton" - -export type AuthorizeAppsProps = BaseModalProps & { - stakingProvider: string - totalInTStake: string - applications: { - appName: StakingAppName - address: string - authorizationAmount: string - }[] -} - -const AuthorizeStakingAppsBase: FC = ({ - stakingProvider, - totalInTStake, - applications, - closeModal, -}) => { - const tbtcAppAuthData = useAppSelector((state) => - selectStakingAppByStakingProvider(state, "tbtc", stakingProvider) - ) - const randomBeaconAuthData = useAppSelector((state) => - selectStakingAppByStakingProvider(state, "randomBeacon", stakingProvider) - ) - const { authorizeMultipleApps } = useAuthorizeMultipleAppsTransaction() - const onAuthorize = async () => { - await authorizeMultipleApps( - applications.map((_) => ({ - address: _.address, - amount: _.authorizationAmount, - })), - stakingProvider - ) - } - const numberOfApps = applications.length - - return ( - <> - Authorize Apps - - - -
- You are authorizing your stake for Threshold application - {numberOfApps > 1 ? "s" : ""}. -
- - This will require {numberOfApps} transaction - {numberOfApps > 1 ? "s" : ""}. You can adjust the authorization - amount at any time. - -
- - {applications.map((app) => ( - - - - ))} - - {numberOfApps === 1 && - !tbtcAppAuthData.isAuthorized && - !randomBeaconAuthData.isAuthorized && } -
- - - - - - ) -} - -const StakingApplicationToAuth: FC<{ - appName: StakingAppName - authorizationAmount: string - stakingProvider: string - totalInTStake: string -}> = ({ appName, authorizationAmount, stakingProvider, totalInTStake }) => { - const percentage = formatPercentage( - calculatePercenteage(authorizationAmount, totalInTStake), - undefined, - true - ) - - return ( - - - - {getStakingAppLabelFromAppName(appName)} app - {percentage} - - Authorization Amount - - - - ) -} - -export const AuthorizeStakingApps = withBaseModal(AuthorizeStakingAppsBase) diff --git a/src/components/Modal/StakingApplications/ConfirmDeauthorization.tsx b/src/components/Modal/StakingApplications/ConfirmDeauthorization.tsx deleted file mode 100644 index 0a4d73641..000000000 --- a/src/components/Modal/StakingApplications/ConfirmDeauthorization.tsx +++ /dev/null @@ -1,89 +0,0 @@ -import { FC } from "react" -import { - BodyLg, - Button, - H5, - ModalBody, - ModalFooter, - ModalHeader, - List, - ListItem, - Divider, - HStack, - BodySm, -} from "@threshold-network/components" -import InfoBox from "../../InfoBox" -import StakingApplicationOperationIcon from "../../StakingApplicationOperationIcon" -import shortenAddress from "../../../utils/shortenAddress" -import { formatTokenAmount } from "../../../utils/formatAmount" -import withBaseModal from "../withBaseModal" -import { StakingAppName } from "../../../store/staking-applications" -import { BaseModalProps } from "../../../types" -import { useConfirmDeatuhorizationTransaction } from "../../../hooks/staking-applications" -import ModalCloseButton from "../ModalCloseButton" - -export type ConfirmDeauthorizationProps = BaseModalProps & { - stakingProvider: string - stakingAppName: StakingAppName - decreaseAmount: string -} - -const ConfirmDeauthorizationBase: FC = ({ - stakingProvider, - stakingAppName, - decreaseAmount, - closeModal, -}) => { - const { sendTransaction } = - useConfirmDeatuhorizationTransaction(stakingAppName) - - const onDeauthorize = async () => { - await sendTransaction(stakingProvider) - } - - return ( - <> - Confirm Deauthorization - - - -
The cooldown period is complete.
- Confirm your deauthorization. -
- - - - - - Increase Amount - {formatTokenAmount(decreaseAmount)} T - - - - - Provider Address - {shortenAddress(stakingProvider)} - - - -
- - - - - - ) -} - -export const ConfirmDeauthorization = withBaseModal(ConfirmDeauthorizationBase) diff --git a/src/components/Modal/StakingApplications/DeauthorizationCompleted.tsx b/src/components/Modal/StakingApplications/DeauthorizationCompleted.tsx deleted file mode 100644 index c5de66845..000000000 --- a/src/components/Modal/StakingApplications/DeauthorizationCompleted.tsx +++ /dev/null @@ -1,79 +0,0 @@ -import { FC } from "react" -import { - HStack, - Button, - ModalBody, - ModalFooter, - ModalHeader, - List, - ListItem, - Alert, - AlertIcon, - BodySm, - Divider, -} from "@threshold-network/components" -import ViewInBlockExplorer from "../../ViewInBlockExplorer" -import withBaseModal from "../withBaseModal" -import shortenAddress from "../../../utils/shortenAddress" -import { formatTokenAmount } from "../../../utils/formatAmount" -import { ExplorerDataType } from "../../../utils/createEtherscanLink" -import { BaseModalProps } from "../../../types" -import ModalCloseButton from "../ModalCloseButton" - -export type DeauthorizationCompletedProps = BaseModalProps & { - stakingProvider: string - txHash: string - decreaseAmount: string -} - -// TODO: revisit because we have the same layout for `AuthorizationIncreased` -// success modal. Should we create a new layout for success modal? -const DeauthorizationCompletedBase: FC = ({ - stakingProvider, - txHash, - decreaseAmount, - closeModal, -}) => { - return ( - <> - Deauthorization Successful - - - - - Your deauthorization was successful! - - - - - Decrease Amount - {formatTokenAmount(decreaseAmount)} T - - - - - Provider Address - {shortenAddress(stakingProvider)} - - - - - {" "} - transaction on Etherscan - - - - - - - - ) -} - -export const DeauthorizationCompleted = withBaseModal( - DeauthorizationCompletedBase -) diff --git a/src/components/Modal/StakingApplications/DeauthorizationInitiated.tsx b/src/components/Modal/StakingApplications/DeauthorizationInitiated.tsx deleted file mode 100644 index 537dd5152..000000000 --- a/src/components/Modal/StakingApplications/DeauthorizationInitiated.tsx +++ /dev/null @@ -1,113 +0,0 @@ -import { FC } from "react" -import { - HStack, - Button, - ModalBody, - ModalFooter, - ModalHeader, - List, - ListItem, - Alert, - AlertIcon, - BodySm, - Divider, - BoxLabel, - Stack, - FlowStep, - FlowStepStatus, -} from "@threshold-network/components" -import ViewInBlockExplorer from "../../ViewInBlockExplorer" -import withBaseModal from "../withBaseModal" -import shortenAddress from "../../../utils/shortenAddress" -import { formatTokenAmount } from "../../../utils/formatAmount" -import { ExplorerDataType } from "../../../utils/createEtherscanLink" -import { BaseModalProps } from "../../../types" -import ModalCloseButton from "../ModalCloseButton" - -export type DeauthorizationInitiatedProps = BaseModalProps & { - stakingProvider: string - txHash: string - decreaseAmount: string -} - -// TODO: revisit because we have the same layout for `AuthorizationIncreased` -// success modal. Should we create a new layout for success modal? -const DeauthorizationInitiatedBase: FC = ({ - stakingProvider, - txHash, - decreaseAmount, - closeModal, -}) => { - return ( - <> - Initiation Started - - - - - Your deauthorization was initiated. Your 45 day cooldown period has - started. - - - - - Decrease Amount - {formatTokenAmount(decreaseAmount)} T - - - - - Provider Address - {shortenAddress(stakingProvider)} - - - - - Deauthorization Timeline - - - - This is 1 transaction - - - You must wait a 45 day cooldown to then confirm the deauthorization. - This is 1 transaction. - - - - - Take note! In this cooldown period, you cannot increase or decrease - your authorization. As a measure of security for the entire network, - in the event of slashing you will be slashed based on your initial - amount. - - - {" "} - transaction on Etherscan - - - - - - - - ) -} - -export const DeauthorizationInitiated = withBaseModal( - DeauthorizationInitiatedBase -) diff --git a/src/components/Modal/StakingApplications/IncreaseAuthorization.tsx b/src/components/Modal/StakingApplications/IncreaseAuthorization.tsx deleted file mode 100644 index 1a43f1087..000000000 --- a/src/components/Modal/StakingApplications/IncreaseAuthorization.tsx +++ /dev/null @@ -1,109 +0,0 @@ -import { FC, useCallback } from "react" -import { - BodyLg, - Button, - H5, - ModalBody, - ModalFooter, - ModalHeader, - List, - ListItem, - Divider, - HStack, - BodySm, -} from "@threshold-network/components" -import InfoBox from "../../InfoBox" -import { useIncreaseAuthorizationTransaction } from "../../../hooks/staking-applications" -import shortenAddress from "../../../utils/shortenAddress" -import { formatTokenAmount } from "../../../utils/formatAmount" -import withBaseModal from "../withBaseModal" -import { StakingAppName } from "../../../store/staking-applications" -import { BaseModalProps } from "../../../types" -import { ModalType } from "../../../enums" -import { useModal } from "../../../hooks/useModal" -import StakingApplicationOperationIcon from "../../StakingApplicationOperationIcon" -import ModalCloseButton from "../ModalCloseButton" -import { OnSuccessCallback } from "../../../web3/hooks" - -export type IncreaseAuthorizationProps = BaseModalProps & { - stakingProvider: string - stakingAppName: StakingAppName - increaseAmount: string -} - -const IncreaseAuthorizationBase: FC = ({ - stakingProvider, - stakingAppName, - increaseAmount, - closeModal, -}) => { - const { openModal } = useModal() - const onSuccess = useCallback( - (receipt) => { - openModal(ModalType.IncreaseAuthorizationSuccess, { - txHash: receipt.transactionHash, - stakingProvider, - increaseAmount, - }) - }, - [openModal, stakingProvider, increaseAmount] - ) - const { sendTransaction } = useIncreaseAuthorizationTransaction( - stakingAppName, - onSuccess - ) - - const onAuthorizeIncrease = useCallback(() => { - sendTransaction(stakingProvider, increaseAmount) - }, [sendTransaction, stakingProvider, increaseAmount, onSuccess]) - - return ( - <> - Authorize Increase - - - -
You are about to increase your authorization.
- - This will require 1 transaction. You can adjust the authorization - amount at any time. - -
- - - - - - Increase Amount - {formatTokenAmount(increaseAmount)} T - - - - - Provider Address - {shortenAddress(stakingProvider)} - - - - -
- - - - - - ) -} - -export const IncreaseAuthorization = withBaseModal(IncreaseAuthorizationBase) diff --git a/src/components/Modal/StakingApplications/IncreaseAuthorizationSuccess.tsx b/src/components/Modal/StakingApplications/IncreaseAuthorizationSuccess.tsx deleted file mode 100644 index 1307a2909..000000000 --- a/src/components/Modal/StakingApplications/IncreaseAuthorizationSuccess.tsx +++ /dev/null @@ -1,74 +0,0 @@ -import { FC } from "react" -import { - HStack, - Button, - ModalBody, - ModalFooter, - ModalHeader, - List, - ListItem, - Alert, - AlertIcon, - BodySm, - Divider, -} from "@threshold-network/components" -import ViewInBlockExplorer from "../../ViewInBlockExplorer" -import withBaseModal from "../withBaseModal" -import shortenAddress from "../../../utils/shortenAddress" -import { formatTokenAmount } from "../../../utils/formatAmount" -import { ExplorerDataType } from "../../../utils/createEtherscanLink" -import { BaseModalProps } from "../../../types" -import ModalCloseButton from "../ModalCloseButton" - -export type IncreaseAuthorizationSuccessProps = BaseModalProps & { - stakingProvider: string - txHash: string - increaseAmount: string -} - -const IncreaseAuthorizationSuccessBase: FC< - IncreaseAuthorizationSuccessProps -> = ({ stakingProvider, txHash, increaseAmount, closeModal }) => { - return ( - <> - Increase Successful - - - - - Your authorization increase was successful! - - - - - Increase Amount - {formatTokenAmount(increaseAmount)} T - - - - - Provider Address - {shortenAddress(stakingProvider)} - - - - - {" "} - transaction on Etherscan - - - - - - - - ) -} - -export const IncreaseAuthorizationSuccess = withBaseModal( - IncreaseAuthorizationSuccessBase -) diff --git a/src/components/Modal/StakingApplications/StakingApplicationsAuthorized.tsx b/src/components/Modal/StakingApplications/StakingApplicationsAuthorized.tsx deleted file mode 100644 index a79c88104..000000000 --- a/src/components/Modal/StakingApplications/StakingApplicationsAuthorized.tsx +++ /dev/null @@ -1,173 +0,0 @@ -import { FC, Fragment } from "react" -import { useNavigate } from "react-router-dom" -import { - HStack, - BodyLg, - Button, - H5, - ModalBody, - ModalFooter, - ModalHeader, - List, - ListItem, - Alert, - AlertIcon, - BodySm, - Divider, - FlowStepStatus, - ButtonProps, -} from "@threshold-network/components" -import InfoBox from "../../InfoBox" -import Link from "../../Link" -import ViewInBlockExplorer from "../../ViewInBlockExplorer" -import withBaseModal from "../withBaseModal" -import { useAppSelector } from "../../../hooks/store" -import { selectStakeByStakingProvider } from "../../../store/staking" -import { - calculatePercenteage, - formatPercentage, -} from "../../../utils/percentage" -import shortenAddress from "../../../utils/shortenAddress" -import { formatTokenAmount } from "../../../utils/formatAmount" -import { ExplorerDataType } from "../../../utils/createEtherscanLink" -import { ExternalHref } from "../../../enums" -import { BaseModalProps } from "../../../types" -import { getStakingAppNameFromAppAddress } from "../../../utils/getStakingAppLabel" -import StakingTimeline from "../../StakingTimeline" -import ButtonLink from "../../ButtonLink" -import ModalCloseButton from "../ModalCloseButton" - -export type StakingApplicationsAuthorizeProps = BaseModalProps & { - stakingProvider: string - authorizedStakingApplications: { - address: string - amount: string - txHash: string - }[] -} - -const StakingApplicationsAuthorizedBase: FC< - StakingApplicationsAuthorizeProps -> = ({ stakingProvider, authorizedStakingApplications, closeModal }) => { - const stake = useAppSelector((state) => - selectStakeByStakingProvider(state, stakingProvider) - ) - const navigate = useNavigate() - const onAuthorizeOtherApps = () => { - closeModal() - navigate(`/staking/${stakingProvider}/authorize`) - } - - const numberOfAuthorizedApps = authorizedStakingApplications.length - - return ( - <> - Step 2 Completed - - - - - Your authorization was successful! - - - - - Provider Address - {shortenAddress(stakingProvider)} - - - {authorizedStakingApplications.map((_) => ( - - - {`${getStakingAppNameFromAppAddress( - _.address - )} Authorization Amount`} - {`${formatTokenAmount(_.amount)} T (${formatPercentage( - calculatePercenteage(_.amount, stake?.totalInTStake) - )})`} - - - ))} - - -
- {numberOfAuthorizedApps === 2 - ? "Continue to Step 3 to set up nodes." - : "You can authorize more apps, or continue to Step 3 to set up nodes."} -
- - You can adjust the authorization amount at any time from the{" "} - Staking page. - -
- - - {numberOfAuthorizedApps === 1 ? ( - <> - {" "} - transaction on Etherscan - - ) : ( - <> - View{" "} - {authorizedStakingApplications.map((_, index) => ( - - - {index + 1 === numberOfAuthorizedApps ? " " : " and "} - - ))} - on Etherscan - - )} - - -
- - {numberOfAuthorizedApps === 2 ? ( - <> - - - - ) : ( - <> - - - - )} - - - ) -} - -const SetupNodesButton: FC<{ variant?: ButtonProps["variant"] }> = ({ - variant, -}) => { - return ( - - Node Setup Doc - - ) -} - -export const StakingApplicationsAuthorized = withBaseModal( - StakingApplicationsAuthorizedBase -) diff --git a/src/components/Modal/StakingApplications/index.ts b/src/components/Modal/StakingApplications/index.ts deleted file mode 100644 index 450a18fff..000000000 --- a/src/components/Modal/StakingApplications/index.ts +++ /dev/null @@ -1,7 +0,0 @@ -export { AuthorizeStakingApps } from "./AuthorizeStakingApps" -export { StakingApplicationsAuthorized } from "./StakingApplicationsAuthorized" -export { IncreaseAuthorization } from "./IncreaseAuthorization" -export { IncreaseAuthorizationSuccess } from "./IncreaseAuthorizationSuccess" -export { ConfirmDeauthorization } from "./ConfirmDeauthorization" -export { DeauthorizationCompleted } from "./DeauthorizationCompleted" -export { DeauthorizationInitiated } from "./DeauthorizationInitiated" diff --git a/src/components/Modal/StakingChecklistModal/index.tsx b/src/components/Modal/StakingChecklistModal/index.tsx deleted file mode 100644 index 1ba45c988..000000000 --- a/src/components/Modal/StakingChecklistModal/index.tsx +++ /dev/null @@ -1,69 +0,0 @@ -import { FC } from "react" -import { - BodyLg, - FlowStepStatus, - H5, - Alert, - AlertDescription, - AlertIcon, - Button, - Divider, - ModalBody, - ModalFooter, - ModalHeader, - useColorModeValue, -} from "@threshold-network/components" -import withBaseModal from "../withBaseModal" -import { useModal } from "../../../hooks/useModal" -import { BaseModalProps } from "../../../types" -import { ModalType } from "../../../enums" -import StakingTimeline from "../../StakingTimeline" -import InfoBox from "../../InfoBox" -import { StakingContractLearnMore } from "../../Link" -import ModalCloseButton from "../ModalCloseButton" - -const StakingChecklistModal: FC = ({ - closeModal, - stakeAmount, -}) => { - const { openModal } = useModal() - - return ( - <> - -
Staking timeline
-
- - - -
- Review the timeline carefully for an overview of the requirements. -
-
- - - - - Staking in Threshold requires running a node. - - - - -
- - - - - - ) -} - -export default withBaseModal(StakingChecklistModal) diff --git a/src/components/Modal/StakingSuccessModal/StakeSuccessOld.tsx b/src/components/Modal/StakingSuccessModal/StakeSuccessOld.tsx deleted file mode 100644 index 56983c99c..000000000 --- a/src/components/Modal/StakingSuccessModal/StakeSuccessOld.tsx +++ /dev/null @@ -1,76 +0,0 @@ -import { FC } from "react" -import { - Alert, - AlertDescription, - AlertIcon, - Button, - Divider, - ModalBody, - ModalFooter, - ModalHeader, - Stack, - useColorModeValue, -} from "@chakra-ui/react" -import { BodySm, H5 } from "@threshold-network/components" -import withBaseModal from "../withBaseModal" -import { BaseModalProps } from "../../../types" -import StakingStats from "../../StakingStats" -import { useStakingState } from "../../../hooks/useStakingState" -import ViewInBlockExplorer from "../../ViewInBlockExplorer" -import { ExplorerDataType } from "../../../utils/createEtherscanLink" -import InfoBox from "../../InfoBox" -import { PreSetupSteps } from "../../StakingTimeline" -import ModalCloseButton from "../ModalCloseButton" - -const StakeSuccessOld: FC = ({ - closeModal, - transactionHash, -}) => { - const { stakeAmount, stakingProvider, beneficiary, authorizer } = - useStakingState() - - return ( - <> - Step 1 Completed - - - - - - Your deposit was successful! - - - -
- Go through Step 2 to make sure you get Rewards -
-
- - {transactionHash && ( - - {" "} - transaction on Etherscan - - )} - -
-
- - - - - ) -} - -export default withBaseModal(StakeSuccessOld) diff --git a/src/components/Modal/StakingSuccessModal/index.tsx b/src/components/Modal/StakingSuccessModal/index.tsx deleted file mode 100644 index c8b6c829d..000000000 --- a/src/components/Modal/StakingSuccessModal/index.tsx +++ /dev/null @@ -1,119 +0,0 @@ -import { FC } from "react" -import { - Alert, - AlertDescription, - AlertIcon, - BodySm, - BoxLabel, - Button, - FlowStep, - FlowStepStatus, - H5, - ModalBody, - ModalFooter, - ModalHeader, - Stack, - useColorModeValue, -} from "@threshold-network/components" -import withBaseModal from "../withBaseModal" -import { BaseModalProps } from "../../../types" -import StakingStats from "../../StakingStats" -import { useStakingState } from "../../../hooks/useStakingState" -import ViewInBlockExplorer from "../../ViewInBlockExplorer" -import { ExplorerDataType } from "../../../utils/createEtherscanLink" -import InfoBox from "../../InfoBox" -import { useModal } from "../../../hooks/useModal" -import { ModalType } from "../../../enums" -import ModalCloseButton from "../ModalCloseButton" - -const simpleStakingTimelineFlowSteps = [ - { - preTitle: "Step 1", - title: "Stake Tokens", - status: FlowStepStatus.complete, - }, - { - preTitle: "Step 2", - title: "Authorize Apps", - status: FlowStepStatus.active, - children: - "You can authorize 100% of your stake for each app. This amount can be changed at any time.", - }, - { - preTitle: "Step 3", - title: "Set up Node", - status: FlowStepStatus.inactive, - children: "Set up and run a node for any of the applications authorized.", - }, -] - -const StakingSuccessModal: FC = ({ - closeModal, - transactionHash, -}) => { - const { stakeAmount, stakingProvider, beneficiary, authorizer } = - useStakingState() - - const { openModal } = useModal() - - const handleSubmit = () => { - openModal(ModalType.NewStakerAuthorizeStakingApplication) - } - - return ( - <> - Step 1 Completed - - - - - - Your deposit was successful! - - - -
- Next, go to Step 2 in order to authorize Threshold apps to earn - rewards. -
-
- - Staking Timeline - {simpleStakingTimelineFlowSteps.map((step, i) => ( - - ))} - -
- {transactionHash && ( - - {" "} - transaction on Etherscan - - )} -
- - - - - - ) -} - -export default withBaseModal(StakingSuccessModal) diff --git a/src/components/Modal/SubmitStake/index.tsx b/src/components/Modal/SubmitStake/index.tsx deleted file mode 100644 index 47625a2e1..000000000 --- a/src/components/Modal/SubmitStake/index.tsx +++ /dev/null @@ -1,111 +0,0 @@ -import { ChangeEventHandler, FC, useState } from "react" -import { - BodyLg, - BodySm, - BodyMd, - H5, - Button, - ModalBody, - ModalFooter, - ModalHeader, - Divider, - Checkbox, - VStack, - HStack, -} from "@threshold-network/components" -import withBaseModal from "../withBaseModal" -import { useModal } from "../../../hooks/useModal" -import { BaseModalProps } from "../../../types" -import { useStakingState } from "../../../hooks/useStakingState" -import { useStakeTransaction } from "../../../web3/hooks/useStakeTransaction" -import { ExternalHref, ModalType } from "../../../enums" -import InfoBox from "../../InfoBox" -import Link from "../../Link" -import { StakingContractLearnMore } from "../../Link" -import StakingStats from "../../StakingStats" -import ModalCloseButton from "../ModalCloseButton" - -const SubmitStakeModal: FC = () => { - const { closeModal, openModal } = useModal() - const [isAcknowledgementChecked, setIsAcknowledgementChecked] = - useState(false) - - // stake transaction, opens success modal on success callback - const { stake } = useStakeTransaction((receipt) => { - openModal(ModalType.StakeSuccess, { - transactionHash: receipt.transactionHash, - }) - }) - - const { stakingProvider, beneficiary, authorizer, stakeAmount } = - useStakingState() - - const submitStake = () => { - stake({ stakingProvider, beneficiary, authorizer, amount: stakeAmount }) - } - - const handleAcknowledgementCheckbox: ChangeEventHandler = ( - event - ) => { - const { - target: { checked }, - } = event - - setIsAcknowledgementChecked(checked) - } - - return ( - <> - -
Stake Tokens
- (Step 1) -
- - - -
- You are about to make a deposit into the T Staking Contract -
- Staking requires 2 transactions. -
- - - -
- - - - - I acknowledge that staking in Threshold requires running a node.{" "} - - Read more - - - - - - - - - - - ) -} - -export default withBaseModal(SubmitStakeModal) diff --git a/src/components/Modal/TopupTModal/LegacyTopUpModal.tsx b/src/components/Modal/TopupTModal/LegacyTopUpModal.tsx deleted file mode 100644 index 99a42482a..000000000 --- a/src/components/Modal/TopupTModal/LegacyTopUpModal.tsx +++ /dev/null @@ -1,143 +0,0 @@ -import { FC } from "react" -import { - Button, - ListItem, - ModalBody, - ModalFooter, - ModalHeader, - UnorderedList, - TabPanels, - TabPanel, - TabList, - Tab, - Tabs, - useColorModeValue, - Alert, - AlertDescription, - AlertIcon, - Link, - Divider, - H5, - BodySm, -} from "@threshold-network/components" -import InfoBox from "../../InfoBox" -import { BaseModalProps } from "../../../types" -import { - ExternalHref, - ModalType, - StakeType, - Token, - TopUpType, -} from "../../../enums" -import withBaseModal from "../withBaseModal" -import { TokenAmountForm } from "../../Forms" -import { useTokenBalance } from "../../../hooks/useTokenBalance" -import { StakingContractLearnMore } from "../../Link" -import { useModal } from "../../../hooks/useModal" -import { StakeData } from "../../../types/staking" -import ModalCloseButton from "../ModalCloseButton" - -const stakeTypeToDappHref: Record = - { - [StakeType.KEEP]: ExternalHref.keepDapp, - [StakeType.NU]: ExternalHref.nuDapp, - } - -const LegacyTopUpModal: FC = ({ - closeModal, - stake, -}) => { - const tBalance = useTokenBalance(Token.T) - const { openModal } = useModal() - // TODO find a solution to style bullets with chakra theme. - const bulletColor = useColorModeValue("gray.700", "gray.300") - const bulletColorStyle = { "::marker": { color: bulletColor } } - - const onSubmitForm = (tokenAmount: string | number) => { - openModal(ModalType.TopupT, { - stake, - amountTopUp: tokenAmount, - topUpType: TopUpType.NATIVE, - }) - } - - return ( - <> - Topping up Stake - - - -
- This is a Legacy Stake -
- Topping up a Legacy Stake can be done: - - - - You can top-up your legacy stake with liquid T tokens in this - modal - - - - - You can top-up your legacy stake with legacy tokens in the - legacy dashboard. After you do the top-up you will be required - to confirm your legacy top-up in the Threshold dashboard - - - -
- - - Top-up T - - {stake.stakeType !== StakeType.T && Top-up legacy stake} - - - - - - {stake.stakeType !== StakeType.T && ( - - - - - - After you topped-up in the legacy dashboad you will need to - confirm your top-up in the Threshold Dashboard. This action - will require one transaction. - - - - )} - - - - -
- - - - - ) -} - -export default withBaseModal(LegacyTopUpModal) diff --git a/src/components/Modal/TopupTModal/TopUpTModal.tsx b/src/components/Modal/TopupTModal/TopUpTModal.tsx deleted file mode 100644 index c15809a26..000000000 --- a/src/components/Modal/TopupTModal/TopUpTModal.tsx +++ /dev/null @@ -1,96 +0,0 @@ -import { FC, useCallback } from "react" -import { - Button, - Divider, - ModalBody, - ModalFooter, - ModalHeader, - Stack, - useColorModeValue, - BodyLg, - H5, -} from "@threshold-network/components" -import { StakingContractLearnMore } from "../../Link/SharedLinks" -import InfoBox from "../../InfoBox" -import StakingStats from "../../StakingStats" -import { useModal } from "../../../hooks/useModal" -import { useTopupTransaction } from "../../../web3/hooks/useTopupTransaction" -import { BaseModalProps } from "../../../types" -import { StakeData } from "../../../types/staking" -import { ModalType, TopUpType } from "../../../enums" -import withBaseModal from "../withBaseModal" -import ModalCloseButton from "../ModalCloseButton" -import { OnSuccessCallback } from "../../../web3/hooks" - -const TopupTModal: FC< - BaseModalProps & { - stake: StakeData - amountTopUp: string - topUpType: TopUpType - } -> = ({ stake, amountTopUp, topUpType }) => { - const { closeModal, openModal } = useModal() - - const onSuccess = useCallback( - (receipt) => { - openModal(ModalType.TopupTSuccess, { - transactionHash: receipt.transactionHash, - stakeAmount: amountTopUp, - stake, - }) - }, - [amountTopUp, stake] - ) - - const { topup } = useTopupTransaction(topUpType, onSuccess) - - return ( - <> - Topping up Stake - - - - -
- You are about to top up your stake -
- - By topping up your stake you will add a new deposit of tokens to - your initial stake. - - - If you want to put your new topped-up tokens at work, make sure to - increase the authorization to your applications. - -
- - - -
-
- - - - - - ) -} - -export default withBaseModal(TopupTModal) diff --git a/src/components/Modal/TopupTModal/index.tsx b/src/components/Modal/TopupTModal/index.tsx deleted file mode 100644 index 0c326f664..000000000 --- a/src/components/Modal/TopupTModal/index.tsx +++ /dev/null @@ -1,4 +0,0 @@ -import TopupTModal from "./TopUpTModal" -import LegacyTopUpModal from "./LegacyTopUpModal" - -export { LegacyTopUpModal, TopupTModal } diff --git a/src/components/Modal/TopupTSuccessModal/index.tsx b/src/components/Modal/TopupTSuccessModal/index.tsx deleted file mode 100644 index 1cbf515d0..000000000 --- a/src/components/Modal/TopupTSuccessModal/index.tsx +++ /dev/null @@ -1,32 +0,0 @@ -import { FC } from "react" -import withBaseModal from "../withBaseModal" -import { BaseModalProps } from "../../../types" -import TransactionSuccessModal from "../TransactionSuccessModal" -import StakingStats from "../../StakingStats" -import { StakeData } from "../../../types/staking" - -interface TopupTSuccessProps extends BaseModalProps { - transactionHash: string - stake: StakeData - stakeAmount: string | number -} - -const TopupTSuccessModal: FC = ({ - transactionHash, - stake: { beneficiary, stakingProvider, authorizer }, - stakeAmount, -}) => { - return ( - - } - /> - ) -} - -export default withBaseModal(TopupTSuccessModal) diff --git a/src/components/Modal/UnstakeSuccessModal/index.tsx b/src/components/Modal/UnstakeSuccessModal/index.tsx deleted file mode 100644 index 483298753..000000000 --- a/src/components/Modal/UnstakeSuccessModal/index.tsx +++ /dev/null @@ -1,88 +0,0 @@ -import { FC } from "react" -import TransactionSuccessModal from "../TransactionSuccessModal" -import StakingStats from "../../StakingStats" -import InfoBox from "../../InfoBox" -import { H5 } from "@threshold-network/components" -import { BaseModalProps } from "../../../types" -import { StakeData } from "../../../types/staking" -import withBaseModal from "../withBaseModal" -import { UnstakeType, ExternalHref } from "../../../enums" -import Link from "../../Link" - -interface UnstakeSuccessProps extends BaseModalProps { - transactionHash: string - stake: StakeData - unstakeAmount: string | number - unstakeType: UnstakeType -} - -type UnstakeTypeWithoutNative = - | UnstakeType.LEGACY_KEEP - | UnstakeType.LEGACY_NU - | UnstakeType.ALL - -const unstakeTypeToLegacyDappLink: Record< - UnstakeTypeWithoutNative, - JSX.Element -> = { - [UnstakeType.LEGACY_KEEP]: ( - - here - - ), - [UnstakeType.LEGACY_NU]: ( - - here - - ), - [UnstakeType.ALL]: ( - <> - - KEEP dapp - - {" or "} - - NU dapp - - - ), -} - -const UnstakingSuccessModal: FC = ({ - transactionHash, - stake, - unstakeAmount, - unstakeType, -}) => { - const { beneficiary, stakingProvider, authorizer } = stake - - return ( - - {unstakeType !== UnstakeType.NATIVE && ( - -
- Make sure you go to the legacy dashboard and undelegate your - tokens - {unstakeTypeToLegacyDappLink[unstakeType]}. -
-
- )} - - - } - /> - ) -} - -export default withBaseModal(UnstakingSuccessModal) diff --git a/src/components/Modal/UnstakeTModal/DeauthorizeInfo.tsx b/src/components/Modal/UnstakeTModal/DeauthorizeInfo.tsx deleted file mode 100644 index af3005565..000000000 --- a/src/components/Modal/UnstakeTModal/DeauthorizeInfo.tsx +++ /dev/null @@ -1,25 +0,0 @@ -import { FC } from "react" -import { BodyLg } from "@threshold-network/components" -import ButtonLink from "../../ButtonLink" - -export const DeauthorizeInfo: FC<{ stakingProvider: string }> = ({ - stakingProvider, -}) => { - return ( - <> - - Make sure you deauthorized all the applications using your stake funds. - - - - Deauthorize Applications - - - ) -} diff --git a/src/components/Modal/UnstakeTModal/Step1.tsx b/src/components/Modal/UnstakeTModal/Step1.tsx deleted file mode 100644 index c4beb6b2d..000000000 --- a/src/components/Modal/UnstakeTModal/Step1.tsx +++ /dev/null @@ -1,225 +0,0 @@ -import { FC, useState, useMemo } from "react" -import { - BodySm, - H5, - LabelSm, - LineDivider, - LineDividerCenterElement, - Button, - ModalBody, - ModalFooter, - ModalHeader, - UnorderedList, - ListItem, - Tabs, - TabPanels, - TabPanel, - TabList, - Tab, - BodyLg, -} from "@threshold-network/components" -import InfoBox from "../../InfoBox" -import { StakingContractLearnMore } from "../../Link" -import { TokenAmountForm } from "../../Forms" -import KeepCircleBrand from "../../../static/icons/KeepCircleBrand" -import NuCircleBrand from "../../..//static/icons/NuCircleBrand" -import { useModal } from "../../../hooks/useModal" -import { BaseModalProps, UpgredableToken } from "../../../types" -import { StakeData } from "../../../types/staking" -import { ModalType, Token, UnstakeType } from "../../../enums" -import withBaseModal from "../withBaseModal" -import { DeauthorizeInfo } from "./DeauthorizeInfo" -import { useAppSelector } from "../../../hooks/store" -import { selectAvailableAmountToUnstakeByStakingProvider } from "../../../store/staking" -import ModalCloseButton from "../ModalCloseButton" -import { UnstakingFormLabel } from "../../UnstakingFormLabel" - -const UnstakeTModal: FC = ({ - stake, - closeModal, -}) => { - const { openModal } = useModal() - const [unstakeType, setUnstakeType] = useState(UnstakeType.NATIVE) - - const onSubmitForm = (tokenAmount: string) => { - openModal(ModalType.UnstakeTStep2, { - stake, - amountToUnstake: tokenAmount, - unstakeType, - }) - } - - const onUnstakeAllBtn = () => { - openModal(ModalType.UnstakeTStep2, { - stake, - amountToUnstake: "0", - unstakeType: UnstakeType.ALL, - }) - } - - const hasNuStake = stake.nuInTStake !== "0" - const hasKeepStake = stake.keepInTStake !== "0" - const hasLegacyStake = hasNuStake || hasKeepStake - - const getLegacyTabTitle = (token: UpgredableToken) => { - return `Unstake legacy ${hasKeepStake && hasNuStake ? token : ""} stake` - } - - const unstakeAllBtnHelperText = useMemo(() => { - const suffix = - hasNuStake && hasKeepStake ? "KEEP + NU" : hasKeepStake ? "KEEP" : "NU" - return `Unstakes max of both native tokens and legacy tokens (${suffix} + T)` - }, [hasNuStake, hasKeepStake]) - - const availableAmountToUnstake = useAppSelector((state) => - selectAvailableAmountToUnstakeByStakingProvider( - state, - stake.stakingProvider - ) - ) - - return ( - <> - Unstake Tokens - - - -
- {hasLegacyStake - ? "This is a Legacy Stake" - : "You are about unstake your tokens"} -
- {hasLegacyStake ? ( - <> - Unstaking a Legacy Stake can be done: - - - - Partial by unstaking your legacy tokens and your T tokens in - separate transactions. Legacy tokens staked can be unstaked - only in full amount. - - - - - Total by unstaking the whole amount of T and legacy tokens - staked, in one transaction. - - - - - ) : ( - - You can partially or totally unstake depending on your needs. - - )} - -
- - - setUnstakeType(UnstakeType.NATIVE)}> - Unstake T - - {hasKeepStake && ( - setUnstakeType(UnstakeType.LEGACY_KEEP)}> - {getLegacyTabTitle(Token.Keep)} - - )} - {hasNuStake && ( - setUnstakeType(UnstakeType.LEGACY_NU)}> - {getLegacyTabTitle(Token.Nu)} - - )} - - - - - } - submitButtonText="Unstake" - maxTokenAmount={availableAmountToUnstake.t} - /> - - {hasKeepStake && ( - - - } - submitButtonText="Unstake" - maxTokenAmount={availableAmountToUnstake.keepInT} - icon={KeepCircleBrand} - helperText="The legacy tokens can be only unstaked in full amount" - isDisabled - /> - - )} - {hasNuStake && ( - - - } - submitButtonText="Unstake" - maxTokenAmount={availableAmountToUnstake.nuInT} - icon={NuCircleBrand} - /> - - )} - - - {hasLegacyStake && ( - <> - - - OR - - - - {unstakeAllBtnHelperText} - - )} - - -
- - - - - ) -} - -export default withBaseModal(UnstakeTModal) diff --git a/src/components/Modal/UnstakeTModal/Step2.tsx b/src/components/Modal/UnstakeTModal/Step2.tsx deleted file mode 100644 index f860a7280..000000000 --- a/src/components/Modal/UnstakeTModal/Step2.tsx +++ /dev/null @@ -1,135 +0,0 @@ -import { FC, useCallback } from "react" -import { - Alert, - AlertDescription, - AlertIcon, - AlertTitle, - Button, - Divider, - ModalBody, - ModalFooter, - ModalHeader, - Stack, - useColorModeValue, - BodyLg, - Box, - H5, -} from "@threshold-network/components" -import InfoBox from "../../InfoBox" -import { StakingContractLearnMore } from "../../Link" -import StakingStats from "../../StakingStats" -import { useModal } from "../../../hooks/useModal" -import useUnstakeTransaction from "../../../web3/hooks/useUnstakeTransaction" -import { BaseModalProps } from "../../../types" -import { StakeData } from "../../../types/staking" -import { ModalType, UnstakeType } from "../../../enums" -import withBaseModal from "../withBaseModal" -import { DeauthorizeInfo } from "./DeauthorizeInfo" -import ModalCloseButton from "../ModalCloseButton" -import { OnSuccessCallback } from "../../../web3/hooks" - -const UnstakeTModal: FC< - BaseModalProps & { - stake: StakeData - amountToUnstake: string - unstakeType: UnstakeType - } -> = ({ stake, amountToUnstake, unstakeType, closeModal }) => { - const { openModal } = useModal() - const _amountToUnstake = - unstakeType === UnstakeType.ALL - ? stake.totalInTStake - : unstakeType === UnstakeType.LEGACY_KEEP - ? stake.keepInTStake - : amountToUnstake - - const onSuccess = useCallback( - (receipt) => { - openModal(ModalType.UnstakeSuccess, { - transactionHash: receipt.transactionHash, - stake, - unstakeAmount: _amountToUnstake, - unstakeType, - }) - }, - [amountToUnstake, stake, openModal, unstakeType] - ) - const { unstake } = useUnstakeTransaction(unstakeType, onSuccess) - - const hasNuStake = stake.nuInTStake !== "0" - const hasKeepStake = stake.keepInTStake !== "0" - - const getStatsAmountText = () => { - let suffix = "" - if (unstakeType === UnstakeType.ALL) { - const keep = hasKeepStake ? "KEEP + " : "" - const nu = hasNuStake ? "NU + " : "" - suffix = ` (${keep}${nu}T)` - } else if ( - unstakeType === UnstakeType.LEGACY_KEEP || - unstakeType === UnstakeType.LEGACY_NU - ) { - const token = hasKeepStake ? "KEEP" : "NU" - suffix = ` (${token} stake in T)` - } - return `Unstake Amount${suffix}` - } - - return ( - <> - Unstake Tokens - - - - -
You are about to unstake your tokens
- - You can partially or totally unstake depending on your needs. - - -
- - - - - Take note! - - If you fully unstake you will not be able to use the same - Provider Address for new stakes. - - A fully unstaked stake will be shown as an inactive stake and - can be toppped up anytime in order to re-activate it. - - - - -
- - -
- - - - - - ) -} - -export default withBaseModal(UnstakeTModal) diff --git a/src/components/Modal/UnstakeTModal/index.tsx b/src/components/Modal/UnstakeTModal/index.tsx deleted file mode 100644 index 1d90a5a0a..000000000 --- a/src/components/Modal/UnstakeTModal/index.tsx +++ /dev/null @@ -1,4 +0,0 @@ -import UnstakeTStep1 from "./Step1" -import UnstakeTStep2 from "./Step2" - -export { UnstakeTStep1, UnstakeTStep2 } diff --git a/src/components/NotificationPill/index.tsx b/src/components/NotificationPill/index.tsx deleted file mode 100644 index 6f78f5d61..000000000 --- a/src/components/NotificationPill/index.tsx +++ /dev/null @@ -1,26 +0,0 @@ -import { FC } from "react" -import { Box, useStyleConfig } from "@chakra-ui/react" -import { - ThemingProps, - HTMLChakraProps, - omitThemingProps, -} from "@chakra-ui/system" - -export interface NotificationPillProps - extends HTMLChakraProps<"div">, - ThemingProps<"NotificationPill"> {} - -// Notification pill icon indicates a change in state. -const NotificationPill: FC = (props) => { - const { variant, size } = props - const styles = useStyleConfig("NotificationPill", { - variant, - size, - } as ThemingProps) - - const restProps = omitThemingProps(props as ThemingProps) - - return -} - -export default NotificationPill diff --git a/src/components/Sidebar/index.tsx b/src/components/Sidebar/index.tsx index f7443f43c..b65f31ba1 100644 --- a/src/components/Sidebar/index.tsx +++ b/src/components/Sidebar/index.tsx @@ -1,8 +1,4 @@ import { NavItemDetail } from "./NavItem" -import { - IoLockClosedOutline, - IoLockClosedSharp, -} from "react-icons/all" import { useLocation } from "react-router-dom" import { useMemo } from "react" import DesktopSidebar from "./DesktopSidebar" @@ -14,14 +10,7 @@ import { featureFlags } from "../../constants" const Sidebar = () => { const { pathname } = useLocation() const navItems: NavItemDetail[] = useMemo(() => { - const navItems = [ - { - text: "Staking", - activeIcon: IoLockClosedSharp, - passiveIcon: IoLockClosedOutline, - href: "/staking/how-it-works", - }, - ] + const navItems = [] if (featureFlags.TBTC_V2) { navItems.push({ diff --git a/src/components/StakingApplicationForms/index.tsx b/src/components/StakingApplicationForms/index.tsx deleted file mode 100644 index 0b45eebbe..000000000 --- a/src/components/StakingApplicationForms/index.tsx +++ /dev/null @@ -1,179 +0,0 @@ -import { BodyMd, BodySm } from "@threshold-network/components" -import { BigNumber } from "ethers" -import { FormikErrors, FormikProps, withFormik } from "formik" -import { FC, Ref, useEffect, useState } from "react" -import { formatTokenAmount } from "../../utils/formatAmount" -import { - defaultLessThanMessage, - defaultAmountValidationOptions, - DEFAULT_MIN_VALUE, - getErrorsObj, - validateAmountInRange, -} from "../../utils/forms" -import { - FormValues, - TokenAmountFormBase, - TokenAmountFormBaseProps, -} from "../Forms" - -type ComponentProps = { - totalStake: string - authorizedAmount: string - isAuthorization?: boolean -} & Omit - -const Label: FC<{ label: string; remainingAmount: string }> = ({ - label, - remainingAmount, -}) => { - return ( - <> - - {label} - - - Remaining Balance: {formatTokenAmount(remainingAmount)} T - - - ) -} - -const StakingApplicationFormBase: FC< - ComponentProps & FormikProps -> = ({ - totalStake, - submitButtonText, - isDisabled, - helperText, - authorizedAmount, - isAuthorization = true, - ...formikProps -}) => { - const { values } = formikProps - const { tokenAmount } = values - const [remainingAmount, setRemainingAmount] = useState("0") - const [maxAmount, setMaxAmount] = useState("0") - - useEffect(() => { - if (!isAuthorization) { - setMaxAmount(authorizedAmount || "0") - } else { - setMaxAmount( - BigNumber.from(totalStake || "0") - .sub(authorizedAmount || "0") - .toString() - ) - } - }, [authorizedAmount, totalStake, isAuthorization]) - - useEffect(() => { - const _tokenAmount = BigNumber.from(tokenAmount || "0") - const _max = BigNumber.from(maxAmount) - setRemainingAmount( - tokenAmount - ? _tokenAmount.gte(_max) - ? "0" - : _max.sub(_tokenAmount).toString() - : maxAmount - ) - }, [tokenAmount, maxAmount]) - - return ( - - } - submitButtonText={submitButtonText} - isDisabled={isDisabled} - maxTokenAmount={maxAmount} - placeholder={"Enter amount"} - helperText={helperText} - {...formikProps} - /> - ) -} - -type StakingAppFormBaseProps = { - initialAmount?: string - minimumAuthorizationAmount: string - innerRef?: Ref> - onSubmitForm: (tokenAmount: string) => void -} & ComponentProps - -const authorizationValidation = ( - values: FormValues, - props: StakingAppFormBaseProps -) => { - const errors: FormikErrors = {} - - const { tokenAmount } = values - const { authorizedAmount, totalStake, minimumAuthorizationAmount } = props - - const authorizedAmountInBN = BigNumber.from(authorizedAmount) - const max = BigNumber.from(totalStake).sub(authorizedAmountInBN) - const minimumAuthorizationAmountInBN = BigNumber.from( - minimumAuthorizationAmount - ) - - const min = authorizedAmountInBN.gt(minimumAuthorizationAmountInBN) - ? DEFAULT_MIN_VALUE - : minimumAuthorizationAmountInBN.sub(authorizedAmountInBN) - - errors.tokenAmount = validateAmountInRange( - tokenAmount, - max.toString(), - min.toString() - ) - - return getErrorsObj(errors) -} - -const deauthorizationValidation = ( - values: FormValues, - props: StakingAppFormBaseProps -) => { - const errors: FormikErrors = {} - - const { tokenAmount } = values - const { authorizedAmount, minimumAuthorizationAmount } = props - const max = BigNumber.from(authorizedAmount).sub(minimumAuthorizationAmount) - const tokenAmountInBN = BigNumber.from(tokenAmount || "0") - - if (!tokenAmountInBN.eq(authorizedAmount)) { - errors.tokenAmount = validateAmountInRange( - tokenAmount, - max.toString(), - DEFAULT_MIN_VALUE, - { - ...defaultAmountValidationOptions, - lessThanValidationMessage(amount) { - return `${defaultLessThanMessage( - amount - )} or equal to ${formatTokenAmount(authorizedAmount.toString())} T` - }, - } - ) - } - - return getErrorsObj(errors) -} - -export const StakingAppForm = withFormik({ - mapPropsToValues: ({ initialAmount }) => ({ - tokenAmount: initialAmount || "0", - }), - validate: (values, props) => { - const validationFn = props.isAuthorization - ? authorizationValidation - : deauthorizationValidation - - return validationFn(values, props) - }, - handleSubmit: (values, { props }) => { - props.onSubmitForm(values.tokenAmount) - }, - displayName: "StakingAppForm", -})(StakingApplicationFormBase) diff --git a/src/components/StakingApplicationOperationIcon/index.tsx b/src/components/StakingApplicationOperationIcon/index.tsx deleted file mode 100644 index 995d53e4b..000000000 --- a/src/components/StakingApplicationOperationIcon/index.tsx +++ /dev/null @@ -1,33 +0,0 @@ -import { FC } from "react" -import { Image, ImageProps } from "@threshold-network/components" -import randomBeaconIncrease from "../../static/images/RandomBeaconIncrease.png" -import randomBeaconDecrease from "../../static/images/RandomBeaconDecrease.png" -import tbtcIncrease from "../../static/images/TbtcIncrease.png" -import tbtcDecrease from "../../static/images/TbtcDecrease.png" -import { StakingAppName } from "../../store/staking-applications" - -type Operation = "increase" | "decrease" - -const iconMap: Record> = { - tbtc: { - increase: tbtcIncrease, - decrease: tbtcDecrease, - }, - randomBeacon: { - increase: randomBeaconIncrease, - decrease: randomBeaconDecrease, - }, -} - -const StakingApplicationOperationIcon: FC< - { - stakingApplication: StakingAppName - operation: Operation - } & ImageProps -> = ({ stakingApplication, operation, ...props }) => { - const imgSrc = iconMap[stakingApplication][operation] - - return -} - -export default StakingApplicationOperationIcon diff --git a/src/components/StakingProvidersList/index.tsx b/src/components/StakingProvidersList/index.tsx deleted file mode 100644 index 20e11a639..000000000 --- a/src/components/StakingProvidersList/index.tsx +++ /dev/null @@ -1,67 +0,0 @@ -import { FC } from "react" -import { List, ListProps } from "@threshold-network/components" -import { ExternalHref } from "../../enums" -import DetailedLinkListItem from "../DetailedLinkListItem" -import StakedLogo from "../../static/images/stakingProviders/StakedLogo.png" -import BoarLogo from "../../static/images/stakingProviders/BoarLogo.png" -import P2PValidatorLogo from "../../static/images/stakingProviders/P2PValidatorLogo.png" -import InfStonesLogo from "../../static/images/stakingProviders/InfStonesLogo.png" -import DelightLogo from "../../static/images/stakingProviders/DelightLogo.svg" - -type ProviderItem = { - name: string - email: string - link: ExternalHref - imgSrc: any -} - -const renderProviderListItem = (provider: ProviderItem) => ( - -) - -const providers: ProviderItem[] = [ - { - name: "Boar", - email: "hello@boar.network", - link: ExternalHref.boar, - imgSrc: BoarLogo, - }, - { - name: "DELIGHT", - email: "contact@delightlabs.io", - link: ExternalHref.delight, - imgSrc: DelightLogo, - }, - { - name: "InfStones", - email: "sales@infstones.com", - link: ExternalHref.infStones, - imgSrc: InfStonesLogo, - }, - { - name: "P2P", - email: "am@p2p.org", - link: ExternalHref.p2pValidator, - imgSrc: P2PValidatorLogo, - }, - { - name: "Staked", - email: "staked@staked.us", - link: ExternalHref.stakedUs, - imgSrc: StakedLogo, - }, -] - -export const AllAppsProvidersList: FC = (props) => { - return ( - - {providers.map(renderProviderListItem)} - - ) -} diff --git a/src/components/StakingStats/index.tsx b/src/components/StakingStats/index.tsx deleted file mode 100644 index 562076485..000000000 --- a/src/components/StakingStats/index.tsx +++ /dev/null @@ -1,55 +0,0 @@ -import { FC } from "react" -import TokenBalance from "../TokenBalance" -import { BodySm } from "@threshold-network/components" -import TransactionInfoTable, { TransactionInfo } from "../TransactionInfoTable" -import shortenAddress from "../../utils/shortenAddress" - -interface StakingStatsProps { - stakeAmount: string | number - amountText?: string - stakingProvider: string - beneficiary: string - authorizer: string -} - -const StakingStats: FC = ({ - stakeAmount, - stakingProvider, - beneficiary, - authorizer, - amountText = "Staked Amount", -}) => { - const transactionInfo: TransactionInfo[] = [ - { - text: amountText, - // todo: Token might not be a string, so this should be updated once we decide on the interface - value: ( - - ), - }, - { - text: "Provider Address", - value: {shortenAddress(stakingProvider)}, - }, - { - text: "Beneficiary Address", - value: {shortenAddress(beneficiary)}, - }, - { - text: "Authorizer Address", - value: {shortenAddress(authorizer)}, - }, - ] - - return -} - -export default StakingStats diff --git a/src/components/StakingTimeline/index.tsx b/src/components/StakingTimeline/index.tsx deleted file mode 100644 index a9e32a79f..000000000 --- a/src/components/StakingTimeline/index.tsx +++ /dev/null @@ -1,256 +0,0 @@ -import { FC } from "react" -import { - BodyMd, - BodySm, - BoxLabel, - ChecklistGroup, - FlowStep, - FlowStepStatus, - Stack, - useColorModeValue, - StackProps, -} from "@threshold-network/components" -import { ExternalHref } from "../../enums" -import Link from "../Link" -import { featureFlags } from "../../constants" -import { Box } from "@chakra-ui/react" - -const STAKING_PROVIDER_URL = "/staking/how-it-works/providers" -const APPLICATION_DOCS_URL = "/staking/how-it-works/applications" - -export const StakingDepositStepsNonMAS: FC = () => { - return ( - - These will be automatically set up to your wallet address. If you - want to use a Staking Provider check{" "} - - this - - - ), - }, - ]} - /> - ) -} - -export const LegacyStakesDepositSteps: FC = () => { - if (featureFlags.MULTI_APP_STAKING) { - return ( - - - - - Authorize NuCypher legacy stakes{" "} - - here - - - - Authorize Keep Network legacy stakes{" "} - - here - - - - - - - Enter the Provider, Beneficiary, and Authorizer addresses. These - will be automatically set to your wallet address. If you want to use - a Staking Provider, here is{" "} - a list. - - - - - - For each stake, there are three applications available. PRE does not - require authorization. To authorize tBTC and Random Beacon, go to - the Staking Page and select “Configure - Stake”. - - - - - You will need to run a node for applications that you have authorized - to earn rewards. If you don’t have one, learn how to do it{" "} - here or contact{" "} - a Staking Provider. - - - ) - } - - return ( - - - Authorize your NuCypher legacy stake{" "} - - here - - - ), - }, - { - itemId: "t_staking_contract_auth__1", - itemTitle: ( - - Authorize your Keep Network legacy stake{" "} - - here - - - ), - }, - ]} - /> - - - ) -} - -export const PreSetupSteps: FC = () => { - return ( - - You will need to run a PRE node to get rewards. If you don’t have - one, learn how to do it here{" "} - - here - - , or contact{" "} - - a staking provider - - - ), - }, - { - itemId: "run_a_pre_node__1", - itemTitle: "PRE Operator address", - itemSubTitle: ( - - Make sure you add your PRE Operator address{" "} - - here - {" "} - to gain rewards. - - ), - }, - ]} - /> - ) -} - -const StakingTimeline: FC<{ statuses?: FlowStepStatus[] } & StackProps> = ({ - statuses = [], - ...restProps -}) => { - if (featureFlags.MULTI_APP_STAKING) { - return ( - - Staking Timeline - - - Enter the Provider, Beneficiary, and Authorizer addresses. These - will - - be automatically set to your wallet address. If you want to use a - Staking Provider, here is{" "} - a list. - - - - For each stake, there are three applications available. PRE does not - require authorization. To authorize tBTC and Random Beacon, go to - the Staking page and select “Configure - Stake”. - - - - - You will need to run a node for applications that you have - authorized to earn rewards. If you don’t have one, learn how to do - it here or contact a{" "} - Staking Provider. - - - - ) - } - - return ( - - - - - - - - - ) -} - -export default StakingTimeline diff --git a/src/components/StatHighlightCard.tsx b/src/components/StatHighlightCard.tsx deleted file mode 100644 index 8e0a5b536..000000000 --- a/src/components/StatHighlightCard.tsx +++ /dev/null @@ -1,63 +0,0 @@ -import { - BoxProps, - Card, - H1, - HStack, - IconProps, - LabelSm, - TextProps, - VStack, -} from "@threshold-network/components" -import { FC } from "react" -import TooltipIcon from "./TooltipIcon" - -export const StatHighlightCard: FC = ({ children, ...restProps }) => { - return ( - - {children} - - ) -} - -export const StatHighlightTitle: FC<{ title: string } & TextProps> = ({ - title, - children, - ...restProps -}) => { - return ( - - - {title} - - {children} - - ) -} - -export const StatHighlightTitleTooltip: FC< - { label: string | JSX.Element } & IconProps -> = ({ label, ...restProps }) => { - return ( - - ) -} - -export const StatHighlightValue: FC<{ value: string & TextProps }> = ({ - value, - ...restProps -}) => { - return ( -

- {value} -

- ) -} diff --git a/src/components/TokenBalance.tsx b/src/components/TokenBalance.tsx index 42692c211..9150a77be 100644 --- a/src/components/TokenBalance.tsx +++ b/src/components/TokenBalance.tsx @@ -1,4 +1,4 @@ -import { ComponentType, FC, useMemo } from "react" +import { FC, useMemo } from "react" import { BodyLg, BodySm, @@ -10,11 +10,9 @@ import { useColorModeValue, Tooltip, BoxProps, - Icon, } from "@threshold-network/components" import { useWeb3React } from "@web3-react/core" import { formatTokenAmount } from "../utils/formatAmount" -import tokenIconMap, { TokenIcon } from "../static/icons/tokenIconMap" export interface TokenBalanceProps { tokenAmount: string | number @@ -23,8 +21,6 @@ export interface TokenBalanceProps { withUSDBalance?: boolean withSymbol?: boolean tokenDecimals?: number - icon?: TokenIcon | ComponentType - iconSize?: string isLarge?: boolean tokenFormat?: string withHigherPrecision?: boolean @@ -86,8 +82,6 @@ const TokenBalance: FC = ({ withUSDBalance = false, withSymbol = false, tokenDecimals, - icon, - iconSize = "32px", isLarge, tokenFormat, precision, @@ -110,12 +104,6 @@ const TokenBalance: FC = ({ return ( - {icon && ( - - )}{" "} {shouldRenderTokenAmount ? ( withHigherPrecision ? ( diff --git a/src/components/TokenBalanceCard/index.tsx b/src/components/TokenBalanceCard/index.tsx index c8e50cc26..77d718581 100644 --- a/src/components/TokenBalanceCard/index.tsx +++ b/src/components/TokenBalanceCard/index.tsx @@ -1,15 +1,12 @@ import { FC } from "react" import { Token } from "../../enums" import TokenBalanceCardTemplate from "./TokenBalanceCardTemplate" -import KeepCircleBrand from "../../static/icons/KeepCircleBrand" -import NuCircleBrand from "../../static/icons/NuCircleBrand" -import T from "../../static/icons/Ttoken" import { useToken } from "../../hooks/useToken" import { tBTCFillBlack } from "../../static/icons/tBTCFillBlack" import { TokenBalanceProps } from "../TokenBalance" export type TokenBalanceCardProps = { - token: Exclude + token: Extract title?: string | JSX.Element tokenSymbol?: string withSymbol?: boolean @@ -19,9 +16,6 @@ export type TokenBalanceCardProps = { > const tokenToIconMap = { - [Token.Keep]: KeepCircleBrand, - [Token.Nu]: NuCircleBrand, - [Token.T]: T, [Token.TBTCV2]: tBTCFillBlack, } diff --git a/src/components/TransactionInfoTable/index.tsx b/src/components/TransactionInfoTable/index.tsx deleted file mode 100644 index 092aa6dc7..000000000 --- a/src/components/TransactionInfoTable/index.tsx +++ /dev/null @@ -1,25 +0,0 @@ -import { FC } from "react" -import { HStack, Stack } from "@chakra-ui/react" -import { BodySm } from "@threshold-network/components" - -export interface TransactionInfo { - text: string - value: JSX.Element -} - -const TransactionInfoTable: FC<{ transactionInfo: TransactionInfo[] }> = ({ - transactionInfo, -}) => { - return ( - - {transactionInfo.map((info) => ( - - {info.text} - {info.value} - - ))} - - ) -} - -export default TransactionInfoTable diff --git a/src/components/Tree/Tree.tsx b/src/components/Tree/Tree.tsx deleted file mode 100644 index 908f2a370..000000000 --- a/src/components/Tree/Tree.tsx +++ /dev/null @@ -1,67 +0,0 @@ -import { FC, useEffect, useRef, useState } from "react" -import { - StylesProvider, - useMultiStyleConfig, - useStyles, - chakra, - Box, -} from "@chakra-ui/react" - -const DEFAULT_LINE_HEIGHT_TO_NODE = 10 - -export const Tree: FC = ({ children, ...props }) => { - const styles = useMultiStyleConfig("Tree", props) - - return {children} -} - -export const TreeNode: FC<{ isRoot?: boolean }> = ({ - children, - isRoot = false, -}) => { - const styles = useStyles() - const ref = useRef(null) - const [nodeLineHeight, setNodeLineHeight] = useState("100%") - - useEffect(() => { - if (isRoot) return - - const linesToNode = - ref.current?.lastElementChild?.getElementsByClassName("item-line-to-node") - if (linesToNode && linesToNode?.length > 0) { - const lineToNodeElement = linesToNode[0] as HTMLElement - const nodeLineHeight = - lineToNodeElement.offsetTop + - lineToNodeElement.offsetHeight / 2 - - DEFAULT_LINE_HEIGHT_TO_NODE - - setNodeLineHeight(`${nodeLineHeight}px`) - } - }) - - return ( - - {children} - - ) -} - -export const TreeItem: FC = ({ children }) => { - const styles = useStyles() - - return {children} -} - -export const TreeItemLineToNode: FC = ({ children }) => { - const styles = useStyles() - - return ( - - {children} - - ) -} diff --git a/src/components/Tree/index.ts b/src/components/Tree/index.ts deleted file mode 100644 index dbe79aadd..000000000 --- a/src/components/Tree/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./Tree" diff --git a/src/components/UnstakingFormLabel/index.tsx b/src/components/UnstakingFormLabel/index.tsx deleted file mode 100644 index dae3ada85..000000000 --- a/src/components/UnstakingFormLabel/index.tsx +++ /dev/null @@ -1,57 +0,0 @@ -import { FC } from "react" -import { Box, BodySm } from "@threshold-network/components" -import { TokenAmountFormBaseProps } from "../Forms/TokenAmountForm" -import { formatTokenAmount } from "../../utils/formatAmount" -import TooltipIcon from "../TooltipIcon" -import Link from "../Link" - -type Props = Pick< - TokenAmountFormBaseProps, - "token" | "maxTokenAmount" | "label" -> & { stakingProvider: string; hasAuthorizedApps: boolean } - -type TooltipLabelProps = Pick - -const TooltipLabel: FC = ({ stakingProvider }) => { - return ( - <> - If you want to unstake more T deauthorize the apps for this stake first{" "} - here. - - ) -} - -export const UnstakingFormLabel: FC = ({ - label = "Amount", - maxTokenAmount, - stakingProvider, - hasAuthorizedApps, - token = { decimals: 18, symbol: "T" }, -}) => { - return ( - <> - {label} - span": { display: "flex" } }} - > - {maxTokenAmount - ? formatTokenAmount(maxTokenAmount, undefined, token.decimals) - : "--"}{" "} - {token.symbol} - {hasAuthorizedApps && ( - } - /> - )} - - - ) -} diff --git a/src/contexts/StakeCardContext.tsx b/src/contexts/StakeCardContext.tsx deleted file mode 100644 index d8d4ecd4a..000000000 --- a/src/contexts/StakeCardContext.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import { createContext } from "react" - -interface StakeCardContext { - isInactiveStake: boolean - canTopUpKepp: boolean - canTopUpNu: boolean - hasLegacyStakes: boolean - isPRESet: boolean -} - -export const StakeCardContext = createContext( - undefined -) diff --git a/src/contexts/TokenContext.tsx b/src/contexts/TokenContext.tsx index 14cb31283..9b32329b7 100644 --- a/src/contexts/TokenContext.tsx +++ b/src/contexts/TokenContext.tsx @@ -10,7 +10,6 @@ import { useTokensBalanceCall } from "../hooks/useTokensBalanceCall" import { Token } from "../enums" import { TokenState } from "../types" import { useTBTCTokenContract } from "../web3/hooks" -import { useFetchOwnerStakes } from "../hooks/useFetchOwnerStakes" import { useTBTCv2TokenContract } from "../web3/hooks/useTBTCv2TokenContract" import { featureFlags } from "../constants" @@ -37,7 +36,6 @@ export const TokenContextProvider: React.FC = ({ children }) => { const tbtc = useTBTCTokenContract() const tbtcv2 = useTBTCv2TokenContract() const { active, chainId, account } = useWeb3React() - const fetchOwnerStakes = useFetchOwnerStakes() const { fetchTokenPriceUSD, @@ -96,11 +94,6 @@ export const TokenContextProvider: React.FC = ({ children }) => { } }, [active, chainId, account]) - // fetch user stakes when they connect their wallet - React.useEffect(() => { - fetchOwnerStakes(account!) - }, [fetchOwnerStakes, account]) - return ( { - const threshold = useThreshold() - const tbtcAppAddress = useStakingApplicationAddress("tbtc") - const randomBeaconAppAddress = useStakingApplicationAddress("randomBeacon") - const { openModal } = useModal() - - const { sendTransaction, status } = useSendTransactionFromFn( - threshold.staking.increaseAuthorization - ) - - const authorizeMultipleApps = useCallback( - async ( - applications: { - address: string - amount: string - }[], - stakingProvider: string - ) => { - try { - if (applications.length === 0) - throw new Error("No staking applications to authorize.") - - const includesOnlySupportedApps = applications.every( - (_) => - isSameETHAddress(_.address, tbtcAppAddress) || - isSameETHAddress(_.address, randomBeaconAppAddress) - ) - - if (!includesOnlySupportedApps) - throw new Error("Unsupported staking applications detected.") - - const successfullTxs: { - address: string - txHash: string - amount: string - }[] = [] - for (const stakingApp of applications) { - const receipt = await sendTransaction( - stakingProvider, - stakingApp.address, - stakingApp.amount - ) - if (receipt) { - successfullTxs.push({ - ...stakingApp, - txHash: receipt.transactionHash, - }) - } - } - if (successfullTxs.length > 0) { - openModal(ModalType.StakingApplicationsAuthorized, { - stakingProvider, - authorizedStakingApplications: successfullTxs, - }) - } - } catch (error) { - openModal(ModalType.TransactionFailed, { - error: - (error as Error)?.message || - new Error("Error: Couldn't authorize applications"), - isExpandableError: true, - }) - } - }, - [sendTransaction, randomBeaconAppAddress, tbtcAppAddress, openModal] - ) - - return { authorizeMultipleApps, status } -} diff --git a/src/hooks/staking-applications/useConfirmDeatuhorizationTransaction.ts b/src/hooks/staking-applications/useConfirmDeatuhorizationTransaction.ts deleted file mode 100644 index 9dd274dfd..000000000 --- a/src/hooks/staking-applications/useConfirmDeatuhorizationTransaction.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { useThreshold } from "../../contexts/ThresholdContext" -import { StakingAppName } from "../../store/staking-applications" -import { - OnErrorCallback, - OnSuccessCallback, - useSendTransactionFromFn, -} from "../../web3/hooks" -import { stakingAppNameToThresholdAppService } from "./useStakingAppContract" - -export const useConfirmDeatuhorizationTransaction = ( - appName: StakingAppName, - onSuccess?: OnSuccessCallback, - onError?: OnErrorCallback -) => { - const threshold = useThreshold() - - return useSendTransactionFromFn( - threshold.multiAppStaking[stakingAppNameToThresholdAppService[appName]] - .approveAuthorizationDecrease, - onSuccess, - onError - ) -} diff --git a/src/hooks/staking-applications/useIncreaseAuthorizationTransaction.ts b/src/hooks/staking-applications/useIncreaseAuthorizationTransaction.ts deleted file mode 100644 index 384d8b8e5..000000000 --- a/src/hooks/staking-applications/useIncreaseAuthorizationTransaction.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { useThreshold } from "../../contexts/ThresholdContext" -import { StakingAppName } from "../../store/staking-applications" -import { - OnErrorCallback, - OnSuccessCallback, - useSendTransactionFromFn, -} from "../../web3/hooks" -import { stakingAppNameToThresholdAppService } from "./useStakingAppContract" - -export const useIncreaseAuthorizationTransaction = ( - appName: StakingAppName, - onSuccess?: OnSuccessCallback, - onError?: OnErrorCallback -) => { - const threshold = useThreshold() - - return useSendTransactionFromFn( - threshold.multiAppStaking[stakingAppNameToThresholdAppService[appName]] - .increaseAuthorization, - onSuccess, - onError - ) -} diff --git a/src/hooks/staking-applications/useInitiateDeauthorization.ts b/src/hooks/staking-applications/useInitiateDeauthorization.ts deleted file mode 100644 index 7797eab4e..000000000 --- a/src/hooks/staking-applications/useInitiateDeauthorization.ts +++ /dev/null @@ -1,77 +0,0 @@ -import { useCallback } from "react" -import { useThreshold } from "../../contexts/ThresholdContext" -import { ModalType } from "../../enums" -import { StakingAppName } from "../../store/staking-applications" -import { - OnErrorCallback, - OnSuccessCallback, - useSendTransactionFromFn, -} from "../../web3/hooks" -import { isAddressZero } from "../../web3/utils" -import { useModal } from "../useModal" -import { stakingAppNameToThresholdAppService } from "./useStakingAppContract" -import { useUpdateOperatorStatus } from "./useUpdateOperatorStatus" - -export const useInitiateDeauthorization = ( - appName: StakingAppName, - shouldUpdateOperatorStatusAfterInitiation?: boolean, - onSuccess?: OnSuccessCallback, - onError?: OnErrorCallback -) => { - const { openModal } = useModal() - const threshold = useThreshold() - const { - sendTransaction: updateOperatorStatus, - status: updateOperatorTxStatus, - } = useUpdateOperatorStatus(appName) - - const onErrorRequestAuthorizationDecrease = useCallback( - (error) => { - onError?.(error) - openModal(ModalType.TransactionFailed, { - transactionHash: error?.transaction?.hash, - error, - isExpandableError: true, - }) - throw error - }, - [onError, openModal] - ) - - const { - sendTransaction: requestAuthorizationDecrease, - status: deauthorizationTxStatus, - } = useSendTransactionFromFn( - threshold.multiAppStaking[stakingAppNameToThresholdAppService[appName]] - .requestAuthorizationDecrease, - onSuccess, - onErrorRequestAuthorizationDecrease - ) - - const sendTransaction = useCallback( - async (stakingProvider: string, amount: string, operator?: string) => { - try { - await requestAuthorizationDecrease(stakingProvider, amount) - } catch (error) { - return - } - - if (!shouldUpdateOperatorStatusAfterInitiation) return - if (!operator || isAddressZero(operator)) - throw new Error("Operator address is required!") - - await updateOperatorStatus(operator) - }, - [ - requestAuthorizationDecrease, - updateOperatorStatus, - shouldUpdateOperatorStatusAfterInitiation, - ] - ) - - return { - sendTransaction, - status: deauthorizationTxStatus, - updateOperatorTxStatus, - } -} diff --git a/src/hooks/staking-applications/useRegisterMultipleOperatorsTransaction.ts b/src/hooks/staking-applications/useRegisterMultipleOperatorsTransaction.ts deleted file mode 100644 index 97443947c..000000000 --- a/src/hooks/staking-applications/useRegisterMultipleOperatorsTransaction.ts +++ /dev/null @@ -1,120 +0,0 @@ -import { useCallback } from "react" -import { useRegisterOperatorTransaction } from "./useRegisterOperatorTransaction" -import { useModal } from "../useModal" -import { ModalType } from "../../enums" -import { useWeb3React } from "@web3-react/core" -import { OperatorMappedSuccessTx } from "../../components/Modal/MapOperatorToStakingProviderSuccessModal" -import { mapOperatorToStakingProviderModalClosed } from "../../store/modal" -import { useAppDispatch, useAppSelector } from "../store" -import { selectMappedOperators } from "../../store/account" - -export const useRegisterMultipleOperatorsTransaction = () => { - const { - mappedOperatorTbtc, - mappedOperatorRandomBeacon, - isOperatorMappedInBothApps, - isOperatorMappedOnlyInRandomBeacon, - isOperatorMappedOnlyInTbtc, - } = useAppSelector((state) => selectMappedOperators(state)) - const { account } = useWeb3React() - const { openModal, closeModal } = useModal() - const dispatch = useAppDispatch() - - const { - sendTransaction: sendRegisterOperatorTransactionTbtc, - status: registerOperatorTbtcStatus, - } = useRegisterOperatorTransaction("tbtc") - const { - sendTransaction: sendRegisterOperatorTransactionRandomBeacon, - status: registerOperatorRandomBeaconStatus, - } = useRegisterOperatorTransaction("randomBeacon") - - const registerMultipleOperators = useCallback( - async (operator: string) => { - try { - if (!account) { - throw new Error("Connect to the staking provider account first!") - } - - if (isOperatorMappedInBothApps) - throw new Error("Both apps already have mapped operator!") - - if (isOperatorMappedOnlyInRandomBeacon) - throw new Error("Random beacon app already has mapped operator!") - - if (isOperatorMappedOnlyInTbtc) - throw new Error("Tbtc app already have mapped operator!") - - // TODO: might also add a check if the operator is already used by another staking provider - - const successfullTxs: OperatorMappedSuccessTx[] = [] - const tbtcReceipt = await sendRegisterOperatorTransactionTbtc(operator) - if (tbtcReceipt) { - successfullTxs.push({ - application: { - appName: "tbtc", - operator: operator, - stakingProvider: account, - }, - txHash: tbtcReceipt.transactionHash, - }) - } - const randomBeaconReceipt = - await sendRegisterOperatorTransactionRandomBeacon(operator) - if (randomBeaconReceipt) { - successfullTxs.push({ - application: { - appName: "randomBeacon", - operator: operator, - stakingProvider: account, - }, - txHash: randomBeaconReceipt.transactionHash, - }) - } - - if (successfullTxs.length < 2) { - openModal(ModalType.TransactionFailed, { - error: new Error( - "Transaction rejected. You are required to map the Operator Address for both apps." - ), - closeModal: () => { - closeModal() - dispatch(mapOperatorToStakingProviderModalClosed()) - }, - }) - } - - if (successfullTxs.length === 2) { - openModal(ModalType.MapOperatorToStakingProviderSuccess, { - transactions: successfullTxs, - }) - } - } catch (error) { - openModal(ModalType.TransactionFailed, { - error: - (error as Error)?.message || - new Error("Error: Couldn't map operator address"), - isExpandableError: true, - closeModal: () => { - closeModal() - dispatch(mapOperatorToStakingProviderModalClosed()) - }, - }) - } - }, - [ - account, - mappedOperatorRandomBeacon, - mappedOperatorTbtc, - sendRegisterOperatorTransactionTbtc, - sendRegisterOperatorTransactionRandomBeacon, - openModal, - ] - ) - - return { - registerMultipleOperators, - registerOperatorTbtcStatus, - registerOperatorRandomBeaconStatus, - } -} diff --git a/src/hooks/staking-applications/useRegisterOperatorTransaction.ts b/src/hooks/staking-applications/useRegisterOperatorTransaction.ts deleted file mode 100644 index cdf7b5cc5..000000000 --- a/src/hooks/staking-applications/useRegisterOperatorTransaction.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { useThreshold } from "../../contexts/ThresholdContext" -import { StakingAppName } from "../../store/staking-applications" -import { - OnErrorCallback, - OnSuccessCallback, - useSendTransactionFromFn, -} from "../../web3/hooks" -import { stakingAppNameToThresholdAppService } from "./useStakingAppContract" - -export const useRegisterOperatorTransaction = ( - appName: StakingAppName, - onSuccess?: OnSuccessCallback, - onError?: OnErrorCallback -) => { - const threshold = useThreshold() - - return useSendTransactionFromFn( - threshold.multiAppStaking[stakingAppNameToThresholdAppService[appName]] - .registerOperator, - onSuccess, - onError - ) -} diff --git a/src/hooks/staking-applications/useStakingAppContract.ts b/src/hooks/staking-applications/useStakingAppContract.ts deleted file mode 100644 index 994036910..000000000 --- a/src/hooks/staking-applications/useStakingAppContract.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { StakingAppName } from "../../store/staking-applications" -import { useThreshold } from "../../contexts/ThresholdContext" - -export const stakingAppNameToThresholdAppService: Record< - StakingAppName, - "ecdsa" | "randomBeacon" -> = { - tbtc: "ecdsa", - randomBeacon: "randomBeacon", -} - -export const useStakingAppContract = (appName: StakingAppName) => { - return useThreshold().multiAppStaking[ - stakingAppNameToThresholdAppService[appName] - ].contract -} diff --git a/src/hooks/staking-applications/useStakingAppDataByStakingProvider.ts b/src/hooks/staking-applications/useStakingAppDataByStakingProvider.ts deleted file mode 100644 index a13a049f2..000000000 --- a/src/hooks/staking-applications/useStakingAppDataByStakingProvider.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { - selectStakingAppByStakingProvider, - StakingAppName, -} from "../../store/staking-applications" -import { useAppSelector } from "../store" - -export const useStakingAppDataByStakingProvider = ( - appName: StakingAppName, - stakingProvider: string -) => { - return useAppSelector((state) => - selectStakingAppByStakingProvider(state, appName, stakingProvider) - ) -} diff --git a/src/hooks/staking-applications/useStakingAppMinAuthorizationAmount.ts b/src/hooks/staking-applications/useStakingAppMinAuthorizationAmount.ts deleted file mode 100644 index 84a462580..000000000 --- a/src/hooks/staking-applications/useStakingAppMinAuthorizationAmount.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { StakingAppName } from "../../store/staking-applications" -import { useStakingAppParameters } from "./useStakingAppParameters" - -export const useStakingAppMinAuthorizationAmount = ( - appName: StakingAppName -) => { - return useStakingAppParameters(appName).data.minimumAuthorization -} diff --git a/src/hooks/staking-applications/useStakingAppParameters.ts b/src/hooks/staking-applications/useStakingAppParameters.ts deleted file mode 100644 index 5789fb1b2..000000000 --- a/src/hooks/staking-applications/useStakingAppParameters.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { StakingAppName } from "../../store/staking-applications" -import { useStakingApplicationState } from "./useStakingApplicationState" - -export const useStakingAppParameters = (appName: StakingAppName) => { - return useStakingApplicationState(appName)?.parameters -} diff --git a/src/hooks/staking-applications/useStakingApplicationAddress.ts b/src/hooks/staking-applications/useStakingApplicationAddress.ts deleted file mode 100644 index e08df8aa3..000000000 --- a/src/hooks/staking-applications/useStakingApplicationAddress.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { useThreshold } from "../../contexts/ThresholdContext" -import { StakingAppName } from "../../store/staking-applications" -import { AddressZero } from "../../web3/utils" -import { stakingAppNameToThresholdAppService } from "./useStakingAppContract" - -export const useStakingApplicationAddress = (appName: StakingAppName) => { - return ( - useThreshold().multiAppStaking[stakingAppNameToThresholdAppService[appName]] - ?.address ?? AddressZero - ) -} diff --git a/src/hooks/staking-applications/useStakingApplicationDecreaseDelay.ts b/src/hooks/staking-applications/useStakingApplicationDecreaseDelay.ts deleted file mode 100644 index da9b045e6..000000000 --- a/src/hooks/staking-applications/useStakingApplicationDecreaseDelay.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { StakingAppName } from "../../store/staking-applications" -import { useStakingAppParameters } from "./useStakingAppParameters" - -export const useStakingApplicationDecreaseDelay = (appName: StakingAppName) => { - return useStakingAppParameters(appName)?.data?.authorizationDecreaseDelay -} diff --git a/src/hooks/staking-applications/useStakingApplicationState.ts b/src/hooks/staking-applications/useStakingApplicationState.ts deleted file mode 100644 index 065b9ed31..000000000 --- a/src/hooks/staking-applications/useStakingApplicationState.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { - StakingAppName, - selectStakingAppStateByAppName, -} from "../../store/staking-applications" -import { useAppSelector } from "../store" - -export const useStakingApplicationState = (appName: StakingAppName) => { - return useAppSelector((state) => - selectStakingAppStateByAppName(state, appName) - ) -} diff --git a/src/hooks/staking-applications/useSubscribeToAuthorizationDecreaseApprovedEvent.ts b/src/hooks/staking-applications/useSubscribeToAuthorizationDecreaseApprovedEvent.ts deleted file mode 100644 index b1ab77cc0..000000000 --- a/src/hooks/staking-applications/useSubscribeToAuthorizationDecreaseApprovedEvent.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { Event } from "@ethersproject/contracts" -import { - stakingApplicationsSlice, - StakingAppName, -} from "../../store/staking-applications" -import { useSubscribeToContractEvent } from "../../web3/hooks" -import { useAppDispatch } from "../store" -import { useStakingAppContract } from "./useStakingAppContract" - -export const useSubscribeToAuthorizationDecreaseApprovedEvent = ( - appName: StakingAppName -) => { - const contract = useStakingAppContract(appName) - const dispatch = useAppDispatch() - - useSubscribeToContractEvent( - contract, - "AuthorizationDecreaseApproved", - // @ts-ignore - async (stakingProvider: string, event: Event) => { - dispatch( - stakingApplicationsSlice.actions.authorizationDecreaseApproved({ - stakingProvider, - appName, - txHash: event.transactionHash, - }) - ) - } - ) -} diff --git a/src/hooks/staking-applications/useSubscribeToAuthorizationDecreaseRequestedEvent.ts b/src/hooks/staking-applications/useSubscribeToAuthorizationDecreaseRequestedEvent.ts deleted file mode 100644 index 17f853e56..000000000 --- a/src/hooks/staking-applications/useSubscribeToAuthorizationDecreaseRequestedEvent.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { Event } from "@ethersproject/contracts" -import { BigNumber, BigNumberish } from "ethers" -import { - stakingApplicationsSlice, - StakingAppName, -} from "../../store/staking-applications" -import { useSubscribeToContractEvent } from "../../web3/hooks" -import { useAppDispatch } from "../store" -import { useStakingAppContract } from "./useStakingAppContract" - -export const useSubscribeToAuthorizationDecreaseRequestedEvent = ( - appName: StakingAppName -) => { - const contract = useStakingAppContract(appName) - const dispatch = useAppDispatch() - - useSubscribeToContractEvent( - contract, - "AuthorizationDecreaseRequested", - // @ts-ignore - async ( - stakingProvider: string, - operator: string, - fromAmount: BigNumberish, - toAmount: BigNumberish, - decreasingAt: BigNumberish, - event: Event - ) => { - const decreaseAmount = BigNumber.from(fromAmount.toString()) - .sub(BigNumber.from(toAmount.toString())) - .toString() - - dispatch( - stakingApplicationsSlice.actions.authorizationDecreaseRequested({ - stakingProvider, - appName, - decreaseAmount, - decreasingAt: decreasingAt.toString(), - txHash: event.transactionHash, - }) - ) - } - ) -} diff --git a/src/hooks/staking-applications/useSubscribeToAuthorizationIncreasedEvent.ts b/src/hooks/staking-applications/useSubscribeToAuthorizationIncreasedEvent.ts deleted file mode 100644 index b0b5c415c..000000000 --- a/src/hooks/staking-applications/useSubscribeToAuthorizationIncreasedEvent.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { stakingApplicationsSlice } from "../../store/staking-applications" -import { getStakingAppNameFromAppAddress } from "../../utils/getStakingAppLabel" -import { - useSubscribeToContractEvent, - useTStakingContract, -} from "../../web3/hooks" -import { useAppDispatch } from "../store" - -export const useSubscribeToAuthorizationIncreasedEvent = () => { - const contract = useTStakingContract() - const dispatch = useAppDispatch() - - useSubscribeToContractEvent( - contract, - "AuthorizationIncreased", - // @ts-ignore - async (stakingProvider, application, fromAmount, toAmount) => { - const appName = getStakingAppNameFromAppAddress(application) - - dispatch( - stakingApplicationsSlice.actions.authorizationIncreased({ - stakingProvider, - toAmount: toAmount.toString(), - appName, - }) - ) - } - ) -} diff --git a/src/hooks/staking-applications/useSubscribeToOperatorRegisteredEvent.ts b/src/hooks/staking-applications/useSubscribeToOperatorRegisteredEvent.ts deleted file mode 100644 index c9b6055e9..000000000 --- a/src/hooks/staking-applications/useSubscribeToOperatorRegisteredEvent.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { useWeb3React } from "@web3-react/core" -import { operatorRegistered } from "../../store/account" -import { StakingAppName } from "../../store/staking-applications" -import { useSubscribeToContractEvent } from "../../web3/hooks" -import { isSameETHAddress } from "../../web3/utils" -import { useAppDispatch } from "../store" -import { useStakingAppContract } from "./useStakingAppContract" - -export const useSubscribeToOperatorRegisteredEvent = ( - appName: StakingAppName -) => { - const contract = useStakingAppContract(appName) - const dispatch = useAppDispatch() - const { account } = useWeb3React() - - useSubscribeToContractEvent( - contract, - "OperatorRegistered", - //@ts-ignore - async (stakingProvider: string, operator: string) => { - if (account && isSameETHAddress(stakingProvider, account)) { - dispatch( - operatorRegistered({ - appName, - operator, - }) - ) - } - }, - [account] - ) -} diff --git a/src/hooks/staking-applications/useSubscribeToOperatorStatusUpdatedEvent.ts b/src/hooks/staking-applications/useSubscribeToOperatorStatusUpdatedEvent.ts deleted file mode 100644 index e00ffd462..000000000 --- a/src/hooks/staking-applications/useSubscribeToOperatorStatusUpdatedEvent.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { Event } from "ethers" -import { - stakingApplicationsSlice, - StakingAppName, -} from "../../store/staking-applications" -import { useSubscribeToContractEvent } from "../../web3/hooks" -import { useAppDispatch } from "../store" -import { useStakingAppContract } from "./useStakingAppContract" - -export const useSubscribeToOperatorStatusUpdatedEvent = ( - appName: StakingAppName -) => { - const contract = useStakingAppContract(appName) - const dispatch = useAppDispatch() - - useSubscribeToContractEvent( - contract, - "OperatorStatusUpdated", - // @ts-ignore - async (stakingProvider: string, operator: string, event: Event) => { - const txHash = event.transactionHash - dispatch( - stakingApplicationsSlice.actions.operatorStatusUpdated({ - stakingProvider, - appName, - txHash, - }) - ) - } - ) -} diff --git a/src/hooks/staking-applications/useUpdateOperatorStatus.tsx b/src/hooks/staking-applications/useUpdateOperatorStatus.tsx deleted file mode 100644 index bb20862dc..000000000 --- a/src/hooks/staking-applications/useUpdateOperatorStatus.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import { useThreshold } from "../../contexts/ThresholdContext" -import { StakingAppName } from "../../store/staking-applications" -import { useSendTransactionFromFn } from "../../web3/hooks" -import { stakingAppNameToThresholdAppService } from "./useStakingAppContract" - -export const useUpdateOperatorStatus = (appName: StakingAppName) => { - const threshold = useThreshold() - - return useSendTransactionFromFn( - threshold.multiAppStaking[stakingAppNameToThresholdAppService[appName]] - .updateOperatorStatus - ) -} diff --git a/src/hooks/useCheckBonusEligibility.ts b/src/hooks/useCheckBonusEligibility.ts deleted file mode 100644 index 5a4008d82..000000000 --- a/src/hooks/useCheckBonusEligibility.ts +++ /dev/null @@ -1,265 +0,0 @@ -import { useEffect } from "react" -import { BigNumber, BigNumberish, Event, constants } from "ethers" -import { - PRE_DEPLOYMENT_BLOCK, - T_STAKING_CONTRACT_DEPLOYMENT_BLOCK, - usePREContract, - useTStakingContract, -} from "../web3/hooks" -import { getAddress, getContractPastEvents } from "../web3/utils" -import { BonusEligibility } from "../types" -import { calculateStakingBonusReward } from "../utils/stakingBonus" -import { stakingBonus } from "../constants" -import { - useMerkleDropContract, - DEPLOYMENT_BLOCK, -} from "../web3/hooks/useMerkleDropContract" -import { selectStakingProviders } from "../store/staking" -import { useDispatch, useSelector } from "react-redux" -import { RootState } from "../store" -import { setStakingBonus } from "../store/rewards" - -interface BonusEligibilityResult { - [address: string]: BonusEligibility -} - -export const useCheckBonusEligibility = () => { - const stakingProviders = useSelector(selectStakingProviders) - const { hasFetched, isFetching } = useSelector( - (state: RootState) => state.rewards.stakingBonus - ) - const dispatch = useDispatch() - const preContract = usePREContract() - const merkleDropContract = useMerkleDropContract() - const tStakingContract = useTStakingContract() - - useEffect(() => { - const fetch = async () => { - if ( - !stakingProviders || - stakingProviders.length === 0 || - !preContract || - !tStakingContract || - !merkleDropContract || - (hasFetched && !isFetching) - ) { - return - } - - const claimedRewards = new Set( - ( - await getContractPastEvents(merkleDropContract, { - eventName: "Claimed", - fromBlock: DEPLOYMENT_BLOCK, - filterParams: [stakingProviders], - }) - ).map((_) => getAddress(_.args?.stakingProvider as string)) - ) - - const operatorConfirmedEvents = await getContractPastEvents(preContract, { - eventName: "OperatorConfirmed", - fromBlock: PRE_DEPLOYMENT_BLOCK, - filterParams: [stakingProviders], - }) - const stakedEvents = await getContractPastEvents(tStakingContract, { - eventName: "Staked", - fromBlock: T_STAKING_CONTRACT_DEPLOYMENT_BLOCK, - filterParams: [null, null, stakingProviders], - }) - - const toppedUpEvents = await getContractPastEvents(tStakingContract, { - eventName: "ToppedUp", - fromBlock: T_STAKING_CONTRACT_DEPLOYMENT_BLOCK, - filterParams: [stakingProviders], - }) - - const unstakedEvents = await getContractPastEvents(tStakingContract, { - eventName: "Unstaked", - fromBlock: T_STAKING_CONTRACT_DEPLOYMENT_BLOCK, - filterParams: [stakingProviders], - }) - - const stakingProviderToPREConfig = getStakingProviderToPREConfig( - operatorConfirmedEvents - ) - - const stakingProviderToStakedAmount = - getStakingProviderToStakedInfo(stakedEvents) - - const stakingProviderToTopUps = getStakingProviderToTopUps(toppedUpEvents) - - const stakingProviderToUnstakedEvent = - getStakingProviderToUnstake(unstakedEvents) - - const stakingProvidersInfo: BonusEligibilityResult = {} - for (const stakingProvider of stakingProviders) { - const stakingProviderAddress = getAddress(stakingProvider) - - const hasPREConfigured = - stakingProviderToPREConfig[stakingProviderAddress] - ?.operatorConfirmedAtBlock <= - stakingBonus.BONUS_DEADLINE_BLOCK_NUMBER - - const hasActiveStake = - stakingProviderToStakedAmount[stakingProviderAddress] - ?.stakedAtBlock <= stakingBonus.BONUS_DEADLINE_BLOCK_NUMBER - - const hasUnstakeAfterBonusDeadline = - stakingProviderToUnstakedEvent[stakingProviderAddress] - ?.hasUnstakeAfterBonusDeadline - - const stakedAmount = - stakingProviderToStakedAmount[stakingProviderAddress]?.amount || "0" - const topUpAmount = - stakingProviderToTopUps[stakingProviderAddress]?.amount || "0" - const unstakeAmount = - stakingProviderToUnstakedEvent[stakingProviderAddress]?.amount || "0" - - const eligibleStakeAmount = - !hasUnstakeAfterBonusDeadline && hasActiveStake - ? BigNumber.from(stakedAmount) - .add(topUpAmount) - .sub(unstakeAmount) - .toString() - : "0" - - stakingProvidersInfo[stakingProviderAddress] = { - hasPREConfigured, - hasActiveStake, - hasUnstakeAfterBonusDeadline, - eligibleStakeAmount, - reward: calculateStakingBonusReward(eligibleStakeAmount), - isRewardClaimed: claimedRewards.has(stakingProviderAddress), - isEligible: Boolean( - hasActiveStake && !hasUnstakeAfterBonusDeadline && hasPREConfigured - ), - } - } - dispatch(setStakingBonus(stakingProvidersInfo)) - } - fetch() - }, [ - stakingProviders, - tStakingContract, - merkleDropContract, - dispatch, - hasFetched, - isFetching, - ]) -} - -interface StakingProviderToStakedInfo { - [address: string]: { - amount: BigNumberish - stakedAtBlock: number - transactionHash: string - } -} - -const getStakingProviderToStakedInfo = ( - events: Event[] -): StakingProviderToStakedInfo => { - const stakingProviderToStakedAmount: StakingProviderToStakedInfo = {} - - for (const stakedEvent of events) { - const stakingProvider = getAddress(stakedEvent.args?.stakingProvider) - - stakingProviderToStakedAmount[stakingProvider] = { - amount: stakedEvent.args?.amount as BigNumberish, - stakedAtBlock: stakedEvent.blockNumber, - transactionHash: stakedEvent.transactionHash, - } - } - return stakingProviderToStakedAmount -} - -interface StakingProviderToPREConfig { - [address: string]: { - operator: string - operatorConfirmedAtBlock: number - transactionHash: string - } -} - -const getStakingProviderToPREConfig = ( - events: Event[] -): StakingProviderToPREConfig => { - const stakingProviderToPREConfig: StakingProviderToPREConfig = {} - for (const event of events) { - const stakingProvider = getAddress(event.args?.stakingProvider) - - stakingProviderToPREConfig[stakingProvider] = { - operator: event.args?.operator, - operatorConfirmedAtBlock: event.blockNumber, - transactionHash: event.transactionHash, - } - } - - return stakingProviderToPREConfig -} - -interface StakingProviderToTopUps { - [address: string]: { - amount: BigNumberish - } -} - -const getStakingProviderToTopUps = ( - events: Event[] -): StakingProviderToTopUps => { - const stakingProviderToAmount: StakingProviderToTopUps = {} - for (const event of events) { - const stakingProvider = getAddress(event.args?.stakingProvider) - const accummulatedAmount = - stakingProviderToAmount[stakingProvider]?.amount || constants.Zero - - if (event.blockNumber > stakingBonus.BONUS_DEADLINE_BLOCK_NUMBER) { - // Break the loop if an event is emitted after the bonus deadline. - // Returned events are in ascending order. - return stakingProviderToAmount - } - stakingProviderToAmount[stakingProvider] = { - amount: BigNumber.from(accummulatedAmount).add(event.args?.amount), - } - } - - return stakingProviderToAmount -} - -interface StakingProviderToUnstake { - [address: string]: { - amount: BigNumberish - hasUnstakeAfterBonusDeadline: boolean - } -} -const getStakingProviderToUnstake = ( - events: Event[] -): StakingProviderToUnstake => { - const stakingProviderToUnstake: StakingProviderToUnstake = {} - for (const event of events) { - const stakingProvider = getAddress(event.args?.stakingProvider) - const stakingProviderInfo = stakingProviderToUnstake[stakingProvider] - if (stakingProviderInfo?.hasUnstakeAfterBonusDeadline) { - // If at least one `Unstaked` event occurred after bonus deadline, this - // provider is not eligible for bonus so we can skip it from further - // calculations. - continue - } - const accummulatedAmount = - stakingProviderToUnstake[stakingProvider]?.amount || constants.Zero - const newAmount = BigNumber.from(accummulatedAmount).add(event.args?.amount) - if (event.blockNumber > stakingBonus.BONUS_DEADLINE_BLOCK_NUMBER) { - stakingProviderToUnstake[stakingProvider] = { - amount: newAmount, - hasUnstakeAfterBonusDeadline: true, - } - } else { - stakingProviderToUnstake[stakingProvider] = { - amount: newAmount, - hasUnstakeAfterBonusDeadline: false, - } - } - } - - return stakingProviderToUnstake -} diff --git a/src/hooks/useFetchOwnerStakes.ts b/src/hooks/useFetchOwnerStakes.ts deleted file mode 100644 index e06a379f6..000000000 --- a/src/hooks/useFetchOwnerStakes.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { useCallback } from "react" -import { StakeData } from "../types/staking" -import { setStakes } from "../store/staking" -import { useFetchPreConfigData } from "./useFetchPreConfigData" -import { useThreshold } from "../contexts/ThresholdContext" -import { useAppDispatch } from "./store" - -export const useFetchOwnerStakes = () => { - const threshold = useThreshold() - const dispatch = useAppDispatch() - const fetchPreConfigData = useFetchPreConfigData() - - return useCallback( - async (address?: string): Promise => { - if (!address) { - return [] - } - - const stakes = await threshold.staking.getOwnerStakes(address) - - const stakingProviders = stakes.map((stake) => stake.stakingProvider) - const preConfigData = await fetchPreConfigData(stakingProviders) - - const _stakes: StakeData[] = stakes.map((stake) => ({ - ...stake, - nuInTStake: stake.nuInTStake.toString(), - keepInTStake: stake.keepInTStake.toString(), - tStake: stake.tStake.toString(), - totalInTStake: stake.totalInTStake.toString(), - possibleKeepTopUpInT: stake.possibleKeepTopUpInT.toString(), - possibleNuTopUpInT: stake.possibleNuTopUpInT.toString(), - preConfig: preConfigData[stake.stakingProvider], - })) - - dispatch(setStakes(_stakes)) - - return _stakes - }, - [threshold, fetchPreConfigData, dispatch] - ) -} diff --git a/src/hooks/useFetchPreConfigData.ts b/src/hooks/useFetchPreConfigData.ts deleted file mode 100644 index dd0fffdc9..000000000 --- a/src/hooks/useFetchPreConfigData.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { useCallback } from "react" -import { usePREContract } from "../web3/hooks" -import { PreConfigData } from "../types/staking" -import { useThreshold } from "../contexts/ThresholdContext" - -export const useFetchPreConfigData = (): (( - stakingProviders: string[] -) => Promise) => { - const preContract = usePREContract() - const threshold = useThreshold() - - return useCallback( - async (stakingProviders) => { - if (!stakingProviders || stakingProviders.length === 0 || !preContract) { - return {} as PreConfigData - } - - const preConfigDataRaw = await threshold.multicall.aggregate( - stakingProviders.map((stakingProvider) => { - return { - interface: preContract.interface, - address: preContract.address, - method: "stakingProviderInfo", - args: [stakingProvider], - } - }) - ) - - return preConfigDataRaw.reduce( - (finalData: PreConfigData, _, idx): PreConfigData => { - finalData[stakingProviders[idx]] = { - operator: _.operator, - isOperatorConfirmed: _.operatorConfirmed, - operatorStartTimestamp: _.operatorStartTimestamp.toString(), - } - return finalData - }, - {} - ) - }, - [preContract, threshold] - ) -} diff --git a/src/hooks/useFetchStakingRewards.ts b/src/hooks/useFetchStakingRewards.ts deleted file mode 100644 index a54259031..000000000 --- a/src/hooks/useFetchStakingRewards.ts +++ /dev/null @@ -1,100 +0,0 @@ -import { useEffect } from "react" -import { useSelector, useDispatch } from "react-redux" -import { - useMerkleDropContract, - DEPLOYMENT_BLOCK, -} from "../web3/hooks/useMerkleDropContract" -import rewardsData from "../merkle-drop/rewards.json" -import { getContractPastEvents, getAddress } from "../web3/utils" -import { RewardsJSONData } from "../types" -import { RootState } from "../store" -import { setInterimRewards } from "../store/rewards" -import { selectStakingProviders } from "../store/staking" -import { BigNumber } from "ethers" -import { Zero } from "@ethersproject/constants" - -interface StakingRewards { - [stakingProvider: string]: string -} - -export const useFetchStakingRewards = () => { - const merkleDropContract = useMerkleDropContract() - const stakingProviders = useSelector(selectStakingProviders) - const { hasFetched, isFetching } = useSelector( - (state: RootState) => state.rewards.interim - ) - const dispatch = useDispatch() - - useEffect(() => { - const fetch = async () => { - if ( - !merkleDropContract || - stakingProviders.length === 0 || - (hasFetched && !isFetching) - ) { - return - } - - const claimedEvents = await getContractPastEvents(merkleDropContract, { - eventName: "Claimed", - fromBlock: DEPLOYMENT_BLOCK, - filterParams: [stakingProviders], - }) - - const claimedAmountToStakingProvider = claimedEvents.reduce( - ( - reducer: { [stakingProvider: string]: string }, - event - ): { [stakingProvider: string]: string } => { - const stakingProvider = getAddress( - event.args?.stakingProvider as string - ) - const prevAmount = BigNumber.from(reducer[stakingProvider] || Zero) - reducer[stakingProvider] = prevAmount - .add(event.args?.amount as string) - .toString() - return reducer - }, - {} - ) - - const claimedRewardsInCurrentMerkleRoot = new Set( - claimedEvents - .filter((_) => _.args?.merkleRoot === rewardsData.merkleRoot) - .map((_) => getAddress(_.args?.stakingProvider as string)) - ) - - const stakingRewards: StakingRewards = {} - for (const stakingProvider of stakingProviders) { - if ( - !rewardsData.claims.hasOwnProperty(stakingProvider) || - claimedRewardsInCurrentMerkleRoot.has(stakingProvider) - ) { - // If the JSON file doesn't contain proofs for a given staking - // provider it means this staking provider has no rewards- we can skip - // this iteration. If the `Claimed` event exists with a current merkle - // root for a given staking provider it means that rewards have - // already been claimed- we can skip this iteration. - continue - } - - const { amount } = (rewardsData as RewardsJSONData).claims[ - stakingProvider - ] - const claimableAmount = BigNumber.from(amount).sub( - claimedAmountToStakingProvider[stakingProvider] || Zero - ) - - if (claimableAmount.lte(Zero)) { - continue - } - - stakingRewards[stakingProvider] = claimableAmount.toString() - } - - dispatch(setInterimRewards(stakingRewards)) - } - - fetch() - }, [stakingProviders, merkleDropContract, hasFetched, isFetching, dispatch]) -} diff --git a/src/hooks/useMinStakeAmount.ts b/src/hooks/useMinStakeAmount.ts deleted file mode 100644 index 3888bed64..000000000 --- a/src/hooks/useMinStakeAmount.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { useEffect, useState } from "react" -import { useDispatch } from "react-redux" -import { setMinStake } from "../store/staking" -import { useTStakingContract } from "../web3/hooks" -import { useStakingState } from "./useStakingState" - -export const useMinStakeAmount = () => { - const tStakingContract = useTStakingContract() - const { minStakeAmount } = useStakingState() - const dispatch = useDispatch() - - const [isLoading, setLoading] = useState(false) - const [hasError, setHasError] = useState(false) - - useEffect(() => { - const fetchMinStakeAmount = async () => { - setLoading(true) - try { - const minStakeAmount = await tStakingContract?.minTStakeAmount() - dispatch(setMinStake({ amount: minStakeAmount.toString() })) - setLoading(false) - setHasError(false) - } catch (error) { - setLoading(false) - setHasError(true) - console.error("Could not fetch the min stake amount: ", error) - } - } - if (minStakeAmount === undefined && tStakingContract) fetchMinStakeAmount() - }, [tStakingContract, dispatch, minStakeAmount]) - - return { minStakeAmount, isLoading, hasError } -} diff --git a/src/hooks/useModal.ts b/src/hooks/useModal.ts index 93ca410bf..82c776cfc 100644 --- a/src/hooks/useModal.ts +++ b/src/hooks/useModal.ts @@ -2,7 +2,6 @@ import { useDispatch, useSelector } from "react-redux" import { UseModal } from "../types" import { closeModal as closeModalAction, - mapOperatorToStakingProviderModalClosed, openModal as openModalAction, successfullLoginModalClosed, } from "../store/modal" @@ -25,12 +24,6 @@ export const useModal: UseModal = () => { dispatch(closeModalAction()) if (modalType === ModalType.SelectWallet) { dispatch(successfullLoginModalClosed()) - } else if ( - modalType === ModalType.MapOperatorToStakingProvider || - modalType === ModalType.MapOperatorToStakingProviderConfirmation || - modalType === ModalType.MapOperatorToStakingProviderSuccess - ) { - dispatch(mapOperatorToStakingProviderModalClosed()) } } diff --git a/src/hooks/useNextRewardsDropDate.ts b/src/hooks/useNextRewardsDropDate.ts deleted file mode 100644 index 9ddfc33d3..000000000 --- a/src/hooks/useNextRewardsDropDate.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { dateToUnixTimestamp } from "@threshold-network/components" - -export const useNextRewardsDropDate = () => { - const today = new Date() - const year = today.getFullYear() - const month = today.getMonth() - - return dateToUnixTimestamp( - month === 11 ? new Date(year + 1, 0, 1) : new Date(year, month + 1, 1) - ) -} diff --git a/src/hooks/useStakeCardContext.ts b/src/hooks/useStakeCardContext.ts deleted file mode 100644 index 7411dd55a..000000000 --- a/src/hooks/useStakeCardContext.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { useContext } from "react" -import { StakeCardContext } from "../contexts/StakeCardContext" - -export const useStakeCardContext = () => { - const stakeCardContext = useContext(StakeCardContext) - - if (!stakeCardContext) { - throw new Error("StakeCardContext used outside of the StakeCard component.") - } - - return stakeCardContext -} diff --git a/src/hooks/useStakingState.ts b/src/hooks/useStakingState.ts deleted file mode 100644 index 695725f35..000000000 --- a/src/hooks/useStakingState.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { useSelector, useDispatch } from "react-redux" -import { updateState as updateStateAction } from "../store/staking" -import { RootState } from "../store" -import { StakingStateKey, UseStakingState } from "../types/staking" - -export const useStakingState: UseStakingState = () => { - const stakingState = useSelector((state: RootState) => state.staking) - const dispatch = useDispatch() - - const updateState = (key: StakingStateKey, value: any) => - dispatch(updateStateAction({ key, value })) - - return { - ...stakingState, - updateState, - } -} diff --git a/src/hooks/useSubscribeToStakedEvent.ts b/src/hooks/useSubscribeToStakedEvent.ts deleted file mode 100644 index 6d9011b54..000000000 --- a/src/hooks/useSubscribeToStakedEvent.ts +++ /dev/null @@ -1,89 +0,0 @@ -import { useWeb3React } from "@web3-react/core" -import { useDispatch } from "react-redux" -import { Event } from "@ethersproject/contracts" -import { BigNumberish } from "@ethersproject/bignumber" -import { - providerStaked, - providerStakedForStakingProvider, -} from "../store/staking" -import { useSubscribeToContractEvent, useTStakingContract } from "../web3/hooks" - -export const useSubscribeToStakedEvent = () => { - const tStakingContract = useTStakingContract() - const { account } = useWeb3React() - const dispatch = useDispatch() - - /** - * Subsribes to the "Staked" event from the owner perspective - * - * Note: It will fire also when owner === staking provider along with the - * event below - */ - useSubscribeToContractEvent( - tStakingContract!, - "Staked", - // TODO: figure out how to type callback. - // @ts-ignore - ( - stakeType: number, - owner: string, - stakingProvider: string, - beneficiary: string, - authorizer: string, - amount: BigNumberish, - event: Event - ) => { - // TODO: open success modal here - dispatch( - providerStaked({ - stakeType, - owner, - stakingProvider, - authorizer, - beneficiary, - amount: amount.toString(), - }) - ) - }, - [null, account] - ) - - /** - * Subsribes to the "Staked" event from the staking provider perspective - * - * Note: It will fire also when staking provider === owner along with the - * event below - */ - useSubscribeToContractEvent( - tStakingContract!, - "Staked", - // TODO: figure out how to type callback. - // @ts-ignore - ( - stakeType: number, - owner: string, - stakingProvider: string, - beneficiary: string, - authorizer: string, - amount: BigNumberish, - event: Event - ) => { - // TODO: open success modal here - const { blockNumber, blockHash, transactionHash } = event - dispatch( - providerStakedForStakingProvider({ - stakeType, - owner, - stakingProvider, - authorizer, - beneficiary, - blockHash, - blockNumber, - transactionHash, - amount: amount.toString(), - }) - ) - }, - [null, null, account] - ) -} diff --git a/src/hooks/useSubscribeToToppedUpEvent.ts b/src/hooks/useSubscribeToToppedUpEvent.ts deleted file mode 100644 index 497823f7b..000000000 --- a/src/hooks/useSubscribeToToppedUpEvent.ts +++ /dev/null @@ -1,66 +0,0 @@ -import { useDispatch } from "react-redux" -import { Event, Contract } from "@ethersproject/contracts" -import { toppedUp } from "../store/staking" -import { useSubscribeToContractEvent, useTStakingContract } from "../web3/hooks" -import { TopUpType } from "../enums" - -const getTopUpTypeBasedOnTheEvent = async ( - tStakingContract: Contract, - stakingProvider: string, - amount: string, - event: Event -) => { - const topUpTTxData = tStakingContract?.interface.encodeFunctionData("topUp", [ - stakingProvider, - amount, - ]) - const topUpKEEPTxData = tStakingContract?.interface.encodeFunctionData( - "topUpKeep", - [stakingProvider] - ) - const topUpNUTxData = tStakingContract?.interface.encodeFunctionData( - "topUpNu", - [stakingProvider] - ) - - const txResponse = await event.getTransaction() - const txData = txResponse.data - - switch (txData) { - case topUpTTxData: - return TopUpType.NATIVE - case topUpKEEPTxData: - return TopUpType.LEGACY_KEEP - case topUpNUTxData: - return TopUpType.LEGACY_NU - default: - return TopUpType.NATIVE - } -} - -export const useSubscribeToToppedUpEvent = () => { - const tStakingContract = useTStakingContract() - const dispatch = useDispatch() - - useSubscribeToContractEvent( - tStakingContract!, - "ToppedUp", - // TODO: figure out how to type callback. - // @ts-ignore - async (stakingProvider, amount, event: Event) => { - const topUpType = await getTopUpTypeBasedOnTheEvent( - tStakingContract!, - stakingProvider, - amount, - event - ) - dispatch( - toppedUp({ - stakingProvider, - amount, - topUpType, - }) - ) - } - ) -} diff --git a/src/hooks/useSubscribeToUnstakedEvent.ts b/src/hooks/useSubscribeToUnstakedEvent.ts deleted file mode 100644 index 93a3cc9a8..000000000 --- a/src/hooks/useSubscribeToUnstakedEvent.ts +++ /dev/null @@ -1,75 +0,0 @@ -import { useDispatch } from "react-redux" -import { Event, Contract } from "@ethersproject/contracts" -import { unstaked } from "../store/staking" -import * as rewardsActions from "../store/rewards" -import { useSubscribeToContractEvent, useTStakingContract } from "../web3/hooks" -import { UnstakeType } from "../enums" - -const getUnstakeTypeBasedOnTheEvent = async ( - tStakingContract: Contract, - stakingProvider: string, - amount: string, - event: Event -) => { - const unstakeTTxData = tStakingContract?.interface.encodeFunctionData( - "unstakeT", - [stakingProvider, amount] - ) - const unstakeKEEPTxData = tStakingContract?.interface.encodeFunctionData( - "unstakeKeep", - [stakingProvider] - ) - const unstakeNUTxData = tStakingContract?.interface.encodeFunctionData( - "unstakeNu", - [stakingProvider, amount] - ) - const unstakeAllTxData = tStakingContract?.interface.encodeFunctionData( - "unstakeAll", - [stakingProvider] - ) - - const txResponse = await event.getTransaction() - const txData = txResponse.data - - switch (txData) { - case unstakeTTxData: - return UnstakeType.NATIVE - case unstakeKEEPTxData: - return UnstakeType.LEGACY_KEEP - case unstakeNUTxData: - return UnstakeType.LEGACY_NU - case unstakeAllTxData: - return UnstakeType.ALL - default: - return UnstakeType.NATIVE - } -} - -export const useSubscribeToUnstakedEvent = () => { - const tStakingContract = useTStakingContract() - const dispatch = useDispatch() - - useSubscribeToContractEvent( - tStakingContract!, - "Unstaked", - // TODO: figure out how to type callback. - // @ts-ignore - async (stakingProvider, amount, event: Event) => { - const unstakeType = await getUnstakeTypeBasedOnTheEvent( - tStakingContract!, - stakingProvider, - amount, - event - ) - - dispatch( - unstaked({ - stakingProvider, - amount, - unstakeType, - }) - ) - dispatch(rewardsActions.unstaked(stakingProvider)) - } - ) -} diff --git a/src/merkle-drop/rewards.json b/src/merkle-drop/rewards.json deleted file mode 100644 index 31be49abe..000000000 --- a/src/merkle-drop/rewards.json +++ /dev/null @@ -1,3926 +0,0 @@ -{ - "totalAmount": "629110104280766546988133843", - "merkleRoot": "0xc654fc90f3c89efd67d4840e6d0ba2bc932eafe494467eaa353736cd0775c17c", - "claims": { - "0x0028274B7978a09097B5D092FCc8F514d8Acf239": { - "beneficiary": "0x0028274B7978a09097B5D092FCc8F514d8Acf239", - "amount": "44180378391182044015248", - "proof": [ - "0x337fdfe3b927f8c70d6fd9ced90749d3ddf81f946b9c7c949d8c9d527614c713", - "0xbea9c9f2ed6efaf2f3345e7a9522682357322f6a3bdac3939c676319fb9081e3", - "0x81bc7e084da1245e86d4838075158c2ca1e8b55c58b230150b2b27f3bd6819c6", - "0xa4c592d588cd922c6de1781284770256d4729b6287bdc700b97a2c852ff88d0f", - "0x9065ab73e0639a7701ce0c7ea4d24dc3a352eaf86d04cfe535ea8b3b19f43923", - "0x473f914d1f1ccc5b8b5de95bc12121123181242ea06fff9c8508a358398163b5", - "0x5edc99efd052e87ec503dc802fa8b259d16a891b72bc9ac38d7bc6d7b6f2552e", - "0x64a54e2bec44cafadb050f8cad94de6f390cd69c6f8f8bf7fca200a1d0e859cf", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x009c98F5266eFE7C809f767E01087ede7273Fc20": { - "beneficiary": "0x009c98F5266eFE7C809f767E01087ede7273Fc20", - "amount": "6939490859368168811305", - "proof": [ - "0x30a678c0d823d4171736c6fc7cbc1a240051e7c03ee58ec7668c477868ccaeb1", - "0x8a83815ffaf28c15718991f1e9f06183a39128183df436a8b4268c7ed53c4b95", - "0xc39c68a7cadea313d11e8080753c76ccdf48386996f52b4d78e12b61efa43188", - "0x38d91c9958cb4cdec127466b1997494fd747e27b80a6ac39f6d4352ecc45666a", - "0xaf418cbc46d36f44acd10c35eff28186de90897d89719daa90ec8ad8f09b67b2", - "0x473f914d1f1ccc5b8b5de95bc12121123181242ea06fff9c8508a358398163b5", - "0x5edc99efd052e87ec503dc802fa8b259d16a891b72bc9ac38d7bc6d7b6f2552e", - "0x64a54e2bec44cafadb050f8cad94de6f390cd69c6f8f8bf7fca200a1d0e859cf", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x00ACA6dFd2fBCAD074A5F116bAD0B057900230D9": { - "beneficiary": "0xF9246a85Be225910db96777CcED7A9f8aa163c68", - "amount": "1209744763867057030387661", - "proof": [ - "0x4f291abe54a7e15d56fcf0cda77caf886f92c2a51766c202fae2e1ec9ca77d13", - "0x35e5ee3eecfc79480122f717bd142d97883634f8f7047297fb38b93233fc1f29", - "0x0d85cbb20a66984e7ea0d073edbbdd831f6c4e07ad01f67df4cc56efa7a01052", - "0x195bb1e416a9464545527432ff9ea60c3e6383f802a3808a4151e24087c7c24b", - "0x01add4a2b7c01143892ca3fbd9ac6e2d294563bf8fe1296e127a7f43ce54824c", - "0x062359f2025ff77d930f8f91e829b67beffb93b49ac378457b370c7980b2fc73", - "0xa9c9a42a7e408bc6103693f019c44cf312f2b867b87abdceb95d900885156c7e", - "0x64a54e2bec44cafadb050f8cad94de6f390cd69c6f8f8bf7fca200a1d0e859cf", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x012926705C8EDF332C3D41D3A8F7cd5AaeA044de": { - "beneficiary": "0x012926705C8EDF332C3D41D3A8F7cd5AaeA044de", - "amount": "22875651244514625683665291", - "proof": [ - "0x224fe88501795b16d266f442dec47727325536ff3597749c5e43c293116c31d3", - "0xa8decd9523dd5ee24082f2abddb57936e6d8c8db995982bc3a956f20e0af0891", - "0x973066e1e952aefb1059979f63e0cf94217cfadb4a6b8d31289bd65a36e64277", - "0xb768182dd2461f99365ec7ced124a86de6fe4d11bb77982ecd01f09400501e52", - "0xaf418cbc46d36f44acd10c35eff28186de90897d89719daa90ec8ad8f09b67b2", - "0x473f914d1f1ccc5b8b5de95bc12121123181242ea06fff9c8508a358398163b5", - "0x5edc99efd052e87ec503dc802fa8b259d16a891b72bc9ac38d7bc6d7b6f2552e", - "0x64a54e2bec44cafadb050f8cad94de6f390cd69c6f8f8bf7fca200a1d0e859cf", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x0154C52ec5b6a3010758dDe78079589E67526767": { - "beneficiary": "0x0154C52ec5b6a3010758dDe78079589E67526767", - "amount": "22940708887704098673782", - "proof": [ - "0x72d0c3efd975e1c62a5c4d0543539f8f833d767e4bee9e10a041ef0df4590588", - "0xe7073afb54ea4026c3737e77391dff92914f5c1507eb6b19fad2ed921a4f5231", - "0xd17bf33ca03d1f640d5bf18c7a64e6c89bae082d2feda4a735e7a087a68f85fd", - "0x75ed9565771fe8626b6ab84659ab178488320535301f990b32008cb8d6ffbf58", - "0x111fd987a5f671f7884a8783e2bebd8e1cc22bf533d05e0441bdfd228b345717", - "0xdccacd8bd107e69fd2d2c1a05f9bcc65811815f152e9f33ac433517436067435", - "0xa9c9a42a7e408bc6103693f019c44cf312f2b867b87abdceb95d900885156c7e", - "0x64a54e2bec44cafadb050f8cad94de6f390cd69c6f8f8bf7fca200a1d0e859cf", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x0245C450b89029e519eD81B3C45a0F8bb2a69a35": { - "beneficiary": "0x0245C450b89029e519eD81B3C45a0F8bb2a69a35", - "amount": "5785246683684016646550", - "proof": [ - "0x15c50aeba7a0f5cbcf43e35de0c0a60cd141ec52611fbc4ab10c25b4d1a0188b", - "0x5da792989cf5963bdc6f616fca7817330b3f36ce46864ed3edb93e1c6cc97cca", - "0xaaeb00bed52b9d925f1203df43f78fc3e6c0f32905f6b525282b6933f95c1789", - "0x8440e0d75827386a44bdad4b2918630de84d85dfe4ceb48cffc7b6440d64b8d2", - "0x59579fcafd7366cb9d52ae4c94f27332a10e08b985ba36d2846a772392ce0e75", - "0x56e2c6ad067fe01f6532e8274c819527bbc22e3d1a23f010e171e6616d445529", - "0x5edc99efd052e87ec503dc802fa8b259d16a891b72bc9ac38d7bc6d7b6f2552e", - "0x64a54e2bec44cafadb050f8cad94de6f390cd69c6f8f8bf7fca200a1d0e859cf", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x032e6A5a29b0fCcB68b4140B7833E85f5516AAa6": { - "beneficiary": "0x032e6A5a29b0fCcB68b4140B7833E85f5516AAa6", - "amount": "6049095095105993218188", - "proof": [ - "0x2ba0d9103c8eb47268ac0b994616666f8fbb24ffbd166c994ba1ddcccc32dcd5", - "0x5b4d0dbdc6eaf7ab033b804d7b9594eade6362c3e3d06e0bc3f44acf3065fb88", - "0xc39c68a7cadea313d11e8080753c76ccdf48386996f52b4d78e12b61efa43188", - "0x38d91c9958cb4cdec127466b1997494fd747e27b80a6ac39f6d4352ecc45666a", - "0xaf418cbc46d36f44acd10c35eff28186de90897d89719daa90ec8ad8f09b67b2", - "0x473f914d1f1ccc5b8b5de95bc12121123181242ea06fff9c8508a358398163b5", - "0x5edc99efd052e87ec503dc802fa8b259d16a891b72bc9ac38d7bc6d7b6f2552e", - "0x64a54e2bec44cafadb050f8cad94de6f390cd69c6f8f8bf7fca200a1d0e859cf", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x0354845b1A7cEAC8A2343Edb66303CEF5211c5Cd": { - "beneficiary": "0x0354845b1A7cEAC8A2343Edb66303CEF5211c5Cd", - "amount": "11843409237744474738023", - "proof": [ - "0x435617f5b83bf3e7d0c2200cf0ff4981a3d12625edd012afcef08bd5caf68b9f", - "0x476608e4ba9f5ea94f17fd38f239e5e1a949897ca3f9b85e91298b3764dc958d", - "0x3c77bb6a11e0fc93cfd0a17743f111aac40fdd4426716a20386d80081e3eeea8", - "0x39c2e82a79487da27ef5d8d6b31b3efb47564973a96a7f009a59ff3eee98e3d7", - "0x2aa934f8f4fd48015f3837e029a329df9889527199e2ec1ae6ebe99d0bb412b0", - "0x062359f2025ff77d930f8f91e829b67beffb93b49ac378457b370c7980b2fc73", - "0xa9c9a42a7e408bc6103693f019c44cf312f2b867b87abdceb95d900885156c7e", - "0x64a54e2bec44cafadb050f8cad94de6f390cd69c6f8f8bf7fca200a1d0e859cf", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x045E511f53DeBF55c9C0B4522f14F602f7C7cA81": { - "beneficiary": "0x18503D85DDA5c51b6DADaB8a6b75231256A4F9F7", - "amount": "3976804908161069129815536", - "proof": [ - "0xed4a5baef2734e45af5109ab84be6c86863bc79055d8b3ead2d798926b4b9a40", - "0x86bde228967be37b43235fbafd7cafbe1f65dc8c0d7064cf9953799a39550fd3", - "0x6b88df0e50560634402641f3ab4caa0207713da2cd2a158610d5498a3ab0fc81", - "0xc590ad1b557e905ed766a2bd82993040517c1d8f828e67aff3a525f0a517e61b", - "0x0c126623518999de3f92b4a74e8cae9a113108254527d72d813d7e518009dd3c", - "0x22e1c098b7010d0cf32500ff774c2cb716f2a4797330e1b587bc650ded67c423", - "0x26d3258cdc1fc284a0d39b0082465afa7e9cfb3bad44bea5374d722bdb514d7f", - "0xe88bf217a61ba2f61cf5c969f3d4f4e916964ce659327135fdd0be2e7c72ee73", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x04670E07912B3764Cc1cCf1c22ad0f35b95E9BA0": { - "beneficiary": "0x04670E07912B3764Cc1cCf1c22ad0f35b95E9BA0", - "amount": "2226993507171376322432787", - "proof": [ - "0x3fad6bc3f17b0e1cf8fb01db90527f82f41ccb0b79125ea0986fde940deba572", - "0xaf972e5167fb301122ad736c71603717d442c05bc1bc3d262a5357542ac715d6", - "0x86d67e1d319263b2cd1dcc011f5925a4e2569097aae21a6340de89adca6210b3", - "0x309156f7e96d9b52f8ddf5305643178e8482b927ee2703fff776b1c235be172f", - "0x9065ab73e0639a7701ce0c7ea4d24dc3a352eaf86d04cfe535ea8b3b19f43923", - "0x473f914d1f1ccc5b8b5de95bc12121123181242ea06fff9c8508a358398163b5", - "0x5edc99efd052e87ec503dc802fa8b259d16a891b72bc9ac38d7bc6d7b6f2552e", - "0x64a54e2bec44cafadb050f8cad94de6f390cd69c6f8f8bf7fca200a1d0e859cf", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x05015cC23df7A1B8D459517088E00Baec5fbc373": { - "beneficiary": "0x05015cC23df7A1B8D459517088E00Baec5fbc373", - "amount": "199132231807812743590684", - "proof": [ - "0x244447f5f62830b884ee3f445fb695ffbef04203ad092429c72534bc0268b003", - "0xa8decd9523dd5ee24082f2abddb57936e6d8c8db995982bc3a956f20e0af0891", - "0x973066e1e952aefb1059979f63e0cf94217cfadb4a6b8d31289bd65a36e64277", - "0xb768182dd2461f99365ec7ced124a86de6fe4d11bb77982ecd01f09400501e52", - "0xaf418cbc46d36f44acd10c35eff28186de90897d89719daa90ec8ad8f09b67b2", - "0x473f914d1f1ccc5b8b5de95bc12121123181242ea06fff9c8508a358398163b5", - "0x5edc99efd052e87ec503dc802fa8b259d16a891b72bc9ac38d7bc6d7b6f2552e", - "0x64a54e2bec44cafadb050f8cad94de6f390cd69c6f8f8bf7fca200a1d0e859cf", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x07C9a8f8264221906b7b8958951Ce4753D39628B": { - "beneficiary": "0x18503D85DDA5c51b6DADaB8a6b75231256A4F9F7", - "amount": "442677284436708274574942", - "proof": [ - "0xc03be718405881c4f400d8c7ca6d4dc85535fe7c317d7b2c321d3f8623276c1f", - "0xd2ad46c50374c69c09a28eb50174015705d060240821bd540d6cce4d8b18bc5d", - "0x83774133fe53d4d0273d7005c97bc8f6ab37833c73ee07bea46a4c91a37ce4bb", - "0x071de73c7fdc53109dd4ff69b8fb3b2621edb92a109a6fc37c6481cb671605de", - "0x59a158af3ffa2849a033594affad303fb5e11aeecbdde0a878c909168e58d612", - "0x97d9146e9833b3fdeba7c55987d17f362c03e476d0731aa6eda14684628e6b80", - "0x26d3258cdc1fc284a0d39b0082465afa7e9cfb3bad44bea5374d722bdb514d7f", - "0xe88bf217a61ba2f61cf5c969f3d4f4e916964ce659327135fdd0be2e7c72ee73", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x0Ace6419dbDAb7f9330568258B9dDB37A295b677": { - "beneficiary": "0x1E183d6337a8353994Aaf327bE00829990818095", - "amount": "901810743190254382390048", - "proof": [ - "0x5f5834a3687f45dac04f04d502387ba8633d3e752735d853b6918e6976c11e6f", - "0xfc11ec3f4c15e6ad454c6a01847bdecb9cddce3254bab9f7555decdefcd172dc", - "0xe2469697f1b831d6635fddc64f2d541b1101565b1a61fa0742050530e161d913", - "0x797edd017f4003c1285ab77462d72a225c5599c94f0de400975080271269fef0", - "0x0c99d2be5d1dbc03058e95802f469f1f3a0ebd66724ffe9b43624f26e1d9ab49", - "0xdccacd8bd107e69fd2d2c1a05f9bcc65811815f152e9f33ac433517436067435", - "0xa9c9a42a7e408bc6103693f019c44cf312f2b867b87abdceb95d900885156c7e", - "0x64a54e2bec44cafadb050f8cad94de6f390cd69c6f8f8bf7fca200a1d0e859cf", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x0C19A07242755b3F107cfB4C74d236a18548541F": { - "beneficiary": "0x0C19A07242755b3F107cfB4C74d236a18548541F", - "amount": "951747668871829630779153", - "proof": [ - "0x775ce394dd6c3ed84c842933b4e52e322a40f6fb980eec4cbcf71de9dbec5f2c", - "0x61871f95e32aade0a2e74c055d51f858b1f8d026785b68dc8602423b378797dd", - "0x96d0e3cff76ea9fb76e7194dc1aa4e152b4ce4e16c25045e71d316f12e556976", - "0xeab42a7f7084e021a91d743173e7d8d1a35b408ed9f715b7f36249a621338a21", - "0x8ba5b958e3d50463abb92bcbd342d11326e4d7c366ee018c2d461fbb1df561b5", - "0x68dbcd1cbf24dfe8761794f995bcb03a39b7b92828d8898f64ee8ee429e9eb95", - "0x0616b8a8fdf6a22d755f3735640770bdb2f6e7df4a6e1b23ed3647e9c3778bf6", - "0xe88bf217a61ba2f61cf5c969f3d4f4e916964ce659327135fdd0be2e7c72ee73", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x0C635dC500222aF8a12072922C6aC5a4fc536faC": { - "beneficiary": "0x0C635dC500222aF8a12072922C6aC5a4fc536faC", - "amount": "110022766162898323355897", - "proof": [ - "0x58cf07aa81415a10c6e3386106f22c1b38478a5db78565d822d52fac24ae5a50", - "0x4b88e0bb017d9b6f0912a044d228d6326bd02b86aff7ff69ad07a0055902ef7c", - "0xef535b2ff4fcea89acbf67534166da85ab154c659b4e2848dd95abdb87090654", - "0xd2ea19db53b4fc2b4b69c5c7337ab4b3eeb8e32ad07e477402839a2d22673a61", - "0x01add4a2b7c01143892ca3fbd9ac6e2d294563bf8fe1296e127a7f43ce54824c", - "0x062359f2025ff77d930f8f91e829b67beffb93b49ac378457b370c7980b2fc73", - "0xa9c9a42a7e408bc6103693f019c44cf312f2b867b87abdceb95d900885156c7e", - "0x64a54e2bec44cafadb050f8cad94de6f390cd69c6f8f8bf7fca200a1d0e859cf", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x0f35c836864875C8E9392DA147F41300aB538091": { - "beneficiary": "0x0f35c836864875C8E9392DA147F41300aB538091", - "amount": "293094157609114046066784", - "proof": [ - "0x8c6bc23ce302a3d6b3f21e7c7d4f6f5da41cba5d7d2454950add7d5db0514628", - "0x0106b8f812079d4cb2e3efbe1b0334ca94cc689522b57a08d058bf946a720d2c", - "0x9be544b29d6b0c3b286ba9d45fde21291f9fb32a1867dea2c0d25c557d1c004f", - "0x194ef47b96e0a314e70a2b8ce7439810c6bdee32118026f58b3ecf62e628911f", - "0x8ba5b958e3d50463abb92bcbd342d11326e4d7c366ee018c2d461fbb1df561b5", - "0x68dbcd1cbf24dfe8761794f995bcb03a39b7b92828d8898f64ee8ee429e9eb95", - "0x0616b8a8fdf6a22d755f3735640770bdb2f6e7df4a6e1b23ed3647e9c3778bf6", - "0xe88bf217a61ba2f61cf5c969f3d4f4e916964ce659327135fdd0be2e7c72ee73", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x108977FE1Cfd10f27D9591C33b8FE9733FD83D2C": { - "beneficiary": "0x108977FE1Cfd10f27D9591C33b8FE9733FD83D2C", - "amount": "116709270218968157396145", - "proof": [ - "0xc2c836599a0f8741f1a15e479e4eb009936673fe6f227e7a571a9e3678acbceb", - "0x8f9e31b224fa095855042185d0adf59c42c1388eb25c164b73f522f01a435384", - "0x82a69a5e365b8c4cf4726a556e0993944e21f51bd9f4553a905be3f6ae1bfd84", - "0xde4766412d1ecc2449d097e3b6b2b5bea1d00c24806fe806e0aee38702c19eef", - "0x59a158af3ffa2849a033594affad303fb5e11aeecbdde0a878c909168e58d612", - "0x97d9146e9833b3fdeba7c55987d17f362c03e476d0731aa6eda14684628e6b80", - "0x26d3258cdc1fc284a0d39b0082465afa7e9cfb3bad44bea5374d722bdb514d7f", - "0xe88bf217a61ba2f61cf5c969f3d4f4e916964ce659327135fdd0be2e7c72ee73", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x1147ccFB4AEFc6e587a23b78724Ef20Ec6e474D4": { - "beneficiary": "0xbE93d14C5dEFb8F41aF8FB092F58e3C71C712b85", - "amount": "69710633393051164435478", - "proof": [ - "0xc826c639a5022b2e76b2441390fea42047ce40ce6631b5f249f36cb9b5ab56f0", - "0x3e8259ce8ba8cb3c6d74f279557d6c2bfc14e0bb987ddcded29ab85255d91b1b", - "0xb707eda71755ca61ec5cb9a12abf6ecdfb688d2c5a8bdd3a525e3df7c576b4c3", - "0xde4766412d1ecc2449d097e3b6b2b5bea1d00c24806fe806e0aee38702c19eef", - "0x59a158af3ffa2849a033594affad303fb5e11aeecbdde0a878c909168e58d612", - "0x97d9146e9833b3fdeba7c55987d17f362c03e476d0731aa6eda14684628e6b80", - "0x26d3258cdc1fc284a0d39b0082465afa7e9cfb3bad44bea5374d722bdb514d7f", - "0xe88bf217a61ba2f61cf5c969f3d4f4e916964ce659327135fdd0be2e7c72ee73", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x12639Aa10ea8eda62Bc6FE3ff0a089580c7eC435": { - "beneficiary": "0x12639Aa10ea8eda62Bc6FE3ff0a089580c7eC435", - "amount": "5935756902774653605399", - "proof": [ - "0x9d8806b13c1ace6bb2365a287eada08b6b1f295d54fb1c68ee35ef51064fbc27", - "0xdff6554f72c7cc7ee084b526d8be1934f30f75da59022f386d7cce82d45054e2", - "0x7f18f34ee97e41e65206090a3b370166a5805110f67886a6c7b5e8d3a8dc0feb", - "0x8e0a201871d267e73e63f23088bd1e9d8c9a8b763ee4dfe53afad4a412370179", - "0xe4b02fad2ca92c21c555a2c6107ae084366477f8bf346a4fc1ddfe404454ce24", - "0x68dbcd1cbf24dfe8761794f995bcb03a39b7b92828d8898f64ee8ee429e9eb95", - "0x0616b8a8fdf6a22d755f3735640770bdb2f6e7df4a6e1b23ed3647e9c3778bf6", - "0xe88bf217a61ba2f61cf5c969f3d4f4e916964ce659327135fdd0be2e7c72ee73", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x13F75113842BD3C3c79735F1a908FA1AD835f813": { - "beneficiary": "0x13F75113842BD3C3c79735F1a908FA1AD835f813", - "amount": "25178687146832830660425", - "proof": [ - "0x415a247f85f475541725bb4f3c21a625bb3526951095b211e23d48c3ed47dc34", - "0xaf972e5167fb301122ad736c71603717d442c05bc1bc3d262a5357542ac715d6", - "0x86d67e1d319263b2cd1dcc011f5925a4e2569097aae21a6340de89adca6210b3", - "0x309156f7e96d9b52f8ddf5305643178e8482b927ee2703fff776b1c235be172f", - "0x9065ab73e0639a7701ce0c7ea4d24dc3a352eaf86d04cfe535ea8b3b19f43923", - "0x473f914d1f1ccc5b8b5de95bc12121123181242ea06fff9c8508a358398163b5", - "0x5edc99efd052e87ec503dc802fa8b259d16a891b72bc9ac38d7bc6d7b6f2552e", - "0x64a54e2bec44cafadb050f8cad94de6f390cd69c6f8f8bf7fca200a1d0e859cf", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x17eDe21b60c44A0139968E0d1D9a001D2bdC8f85": { - "beneficiary": "0x17eDe21b60c44A0139968E0d1D9a001D2bdC8f85", - "amount": "302397473079857091497029", - "proof": [ - "0x455b19cc78bf3ed15d5daa07ce4ef1c879ec1111c3a25fa58b72781c1f25dba0", - "0x7cd05cb74d958b06be9f9b5b40c270342ccc68b84c6a6585bfb730374c7a91b4", - "0x64672ed0234009a704f607178ffa0f8075aa32ba2d1bfccaeb4c240165175042", - "0x415ffea8e37ea074902c88356b1cda00766d9d007bfeafa3b419755ff21c4b40", - "0x2aa934f8f4fd48015f3837e029a329df9889527199e2ec1ae6ebe99d0bb412b0", - "0x062359f2025ff77d930f8f91e829b67beffb93b49ac378457b370c7980b2fc73", - "0xa9c9a42a7e408bc6103693f019c44cf312f2b867b87abdceb95d900885156c7e", - "0x64a54e2bec44cafadb050f8cad94de6f390cd69c6f8f8bf7fca200a1d0e859cf", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x1c72F1EaC2Cef0517ec587d8ECA523c61345648a": { - "beneficiary": "0x1c72F1EaC2Cef0517ec587d8ECA523c61345648a", - "amount": "21847972316676424375151", - "proof": [ - "0xd9f089b73c95c476e4051acf05d49544fdf545ab8b84ca4d8f8fc2217b63604a", - "0x23c1a9211c3f451087193ccf6e8202cfa23dfd27b48f4ed759b2c2c1ce9c629c", - "0x09c06ef10072c2bc0fb9b31d06661c0358b2c8e3316f3444d4e31e18929a488c", - "0x5c0e7f3ab44620fd21c2b93779b413a382833d74590f2ee16fb86cc3453a2561", - "0x2b33811bfbf525e09903057070381317c6e8580a978357fafa1f43ff94acc3cc", - "0x22e1c098b7010d0cf32500ff774c2cb716f2a4797330e1b587bc650ded67c423", - "0x26d3258cdc1fc284a0d39b0082465afa7e9cfb3bad44bea5374d722bdb514d7f", - "0xe88bf217a61ba2f61cf5c969f3d4f4e916964ce659327135fdd0be2e7c72ee73", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x1d2DfcE7F23669dCAFaA376314fa0ae938C8641C": { - "beneficiary": "0x1d2DfcE7F23669dCAFaA376314fa0ae938C8641C", - "amount": "92303913394364927206745", - "proof": [ - "0x105cb2168f83fe683841db5ccd99361411dde29fcfbb55b33bfe437f0d50084b", - "0x442ff12e11e945657f0ec6f1c082bd163acb92712856654696b491433898b76e", - "0x8bca85e7e99b46a34b8e46abc4c002ac730b9a980ef52d5c0f92c967c38b7d96", - "0x81e6adfcd37f44c1b0d192e02239acfdaa6943691bce8c4f017c99a8c59c17a7", - "0x59579fcafd7366cb9d52ae4c94f27332a10e08b985ba36d2846a772392ce0e75", - "0x56e2c6ad067fe01f6532e8274c819527bbc22e3d1a23f010e171e6616d445529", - "0x5edc99efd052e87ec503dc802fa8b259d16a891b72bc9ac38d7bc6d7b6f2552e", - "0x64a54e2bec44cafadb050f8cad94de6f390cd69c6f8f8bf7fca200a1d0e859cf", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x1ff6daf48807564a5799214D98E6DF5f54Ccf621": { - "beneficiary": "0x1ff6daf48807564a5799214D98E6DF5f54Ccf621", - "amount": "585690267153777852421164", - "proof": [ - "0x5b7f26390ae32c54998fcbd0404607e6426bf9ea320e34ecf8879232d6b4089c", - "0x4b88e0bb017d9b6f0912a044d228d6326bd02b86aff7ff69ad07a0055902ef7c", - "0xef535b2ff4fcea89acbf67534166da85ab154c659b4e2848dd95abdb87090654", - "0xd2ea19db53b4fc2b4b69c5c7337ab4b3eeb8e32ad07e477402839a2d22673a61", - "0x01add4a2b7c01143892ca3fbd9ac6e2d294563bf8fe1296e127a7f43ce54824c", - "0x062359f2025ff77d930f8f91e829b67beffb93b49ac378457b370c7980b2fc73", - "0xa9c9a42a7e408bc6103693f019c44cf312f2b867b87abdceb95d900885156c7e", - "0x64a54e2bec44cafadb050f8cad94de6f390cd69c6f8f8bf7fca200a1d0e859cf", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x220e6203C74EAD0a5fB9558C777af99D18b9F20D": { - "beneficiary": "0xCBC433413383c0c7665ef13dC46a4Fc2a080D293", - "amount": "14109059840684382593319", - "proof": [ - "0x42810c68f6dc5228a997b57071201a3e853dc657d90606dbde74f40a629bccab", - "0xca287a1db73f28f0bc0277fe0744e3ea71b31f3d0271a17dd3041374f18fef62", - "0x3c77bb6a11e0fc93cfd0a17743f111aac40fdd4426716a20386d80081e3eeea8", - "0x39c2e82a79487da27ef5d8d6b31b3efb47564973a96a7f009a59ff3eee98e3d7", - "0x2aa934f8f4fd48015f3837e029a329df9889527199e2ec1ae6ebe99d0bb412b0", - "0x062359f2025ff77d930f8f91e829b67beffb93b49ac378457b370c7980b2fc73", - "0xa9c9a42a7e408bc6103693f019c44cf312f2b867b87abdceb95d900885156c7e", - "0x64a54e2bec44cafadb050f8cad94de6f390cd69c6f8f8bf7fca200a1d0e859cf", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x2215a197a32834ef93C4D1029551bB8D3B924DCc": { - "beneficiary": "0x2215a197a32834ef93C4D1029551bB8D3B924DCc", - "amount": "46107922326443504934683", - "proof": [ - "0xd9f56189e588d10d3b141f524543f00accb2b237396acfd85804ecaac05fe74c", - "0x23c1a9211c3f451087193ccf6e8202cfa23dfd27b48f4ed759b2c2c1ce9c629c", - "0x09c06ef10072c2bc0fb9b31d06661c0358b2c8e3316f3444d4e31e18929a488c", - "0x5c0e7f3ab44620fd21c2b93779b413a382833d74590f2ee16fb86cc3453a2561", - "0x2b33811bfbf525e09903057070381317c6e8580a978357fafa1f43ff94acc3cc", - "0x22e1c098b7010d0cf32500ff774c2cb716f2a4797330e1b587bc650ded67c423", - "0x26d3258cdc1fc284a0d39b0082465afa7e9cfb3bad44bea5374d722bdb514d7f", - "0xe88bf217a61ba2f61cf5c969f3d4f4e916964ce659327135fdd0be2e7c72ee73", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x25d9bbb4Eccbf3A5e6d6BBCE9813302E508f321D": { - "beneficiary": "0x25d9bbb4Eccbf3A5e6d6BBCE9813302E508f321D", - "amount": "1239061434275150094469199", - "proof": [ - "0xf9692dfbd46f78cbbfc65ecaca524e0898319abbfb924a8c49c39cee3a689114", - "0x3499defca13555f14421994e01f71359da3c510231b19ea371a5ca3389572def", - "0x36834ec872fd40586a2c210d54c4dafea7ebadc78d2a655820a96518671dfc03", - "0x7375f825f0f31d047b6de1d51bf149632c6b6f51debb555d434075ee545fc9fb", - "0x0c126623518999de3f92b4a74e8cae9a113108254527d72d813d7e518009dd3c", - "0x22e1c098b7010d0cf32500ff774c2cb716f2a4797330e1b587bc650ded67c423", - "0x26d3258cdc1fc284a0d39b0082465afa7e9cfb3bad44bea5374d722bdb514d7f", - "0xe88bf217a61ba2f61cf5c969f3d4f4e916964ce659327135fdd0be2e7c72ee73", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x2aa70D73b8A3f55AD483261CF8378205bdc94a61": { - "beneficiary": "0x2aa70D73b8A3f55AD483261CF8378205bdc94a61", - "amount": "173143263334603981670433", - "proof": [ - "0x608eb515a4f2bd1745d1d7e8fac6bb957ca59fe29470bd4cc21550da12591724", - "0x2a2f9a9ddda719374b9fd9bad206a07719973d0b906cc59551ff65bd00f9607b", - "0x3425029c00bb6dd5db0e9be696fed0ad583aa55eb07da6d730411aeeb2d82870", - "0x8480db728010621a6968b7aa3634f14b1865f27ddec19c5d9479b58ed9b93f2f", - "0x0c99d2be5d1dbc03058e95802f469f1f3a0ebd66724ffe9b43624f26e1d9ab49", - "0xdccacd8bd107e69fd2d2c1a05f9bcc65811815f152e9f33ac433517436067435", - "0xa9c9a42a7e408bc6103693f019c44cf312f2b867b87abdceb95d900885156c7e", - "0x64a54e2bec44cafadb050f8cad94de6f390cd69c6f8f8bf7fca200a1d0e859cf", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x2BAF3650263348f3304c18900A674bB0BF830801": { - "beneficiary": "0x773a3210aa5E94bf2d713F67FB99A8e89D0782E2", - "amount": "46571301451704113725991", - "proof": [ - "0x30369edd7b20e9f8974df40482cee3b3e5e5ebbd9ecbc37ada072ade9dc3b146", - "0x8a83815ffaf28c15718991f1e9f06183a39128183df436a8b4268c7ed53c4b95", - "0xc39c68a7cadea313d11e8080753c76ccdf48386996f52b4d78e12b61efa43188", - "0x38d91c9958cb4cdec127466b1997494fd747e27b80a6ac39f6d4352ecc45666a", - "0xaf418cbc46d36f44acd10c35eff28186de90897d89719daa90ec8ad8f09b67b2", - "0x473f914d1f1ccc5b8b5de95bc12121123181242ea06fff9c8508a358398163b5", - "0x5edc99efd052e87ec503dc802fa8b259d16a891b72bc9ac38d7bc6d7b6f2552e", - "0x64a54e2bec44cafadb050f8cad94de6f390cd69c6f8f8bf7fca200a1d0e859cf", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x2cD8F299c4ab002E486037e0bb43D276a8955696": { - "beneficiary": "0x2cD8F299c4ab002E486037e0bb43D276a8955696", - "amount": "765036063079836437706359", - "proof": [ - "0x65acea83b28a7476e4d32cbbf82d6868b6421ff5f1362fe99a208b144b6a8456", - "0x56ef3310d0b2e36f1580215a1089fa85c627d1e00584bfc79958874499ffb5bf", - "0xf9b57c1951dfbf293193b50bf24af02d2d09c43d662e743c9fb018b7ad3af2ea", - "0x8480db728010621a6968b7aa3634f14b1865f27ddec19c5d9479b58ed9b93f2f", - "0x0c99d2be5d1dbc03058e95802f469f1f3a0ebd66724ffe9b43624f26e1d9ab49", - "0xdccacd8bd107e69fd2d2c1a05f9bcc65811815f152e9f33ac433517436067435", - "0xa9c9a42a7e408bc6103693f019c44cf312f2b867b87abdceb95d900885156c7e", - "0x64a54e2bec44cafadb050f8cad94de6f390cd69c6f8f8bf7fca200a1d0e859cf", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x2eBE08379f4fD866E871A9b9E1d5C695154C6A9F": { - "beneficiary": "0x0B2c18DA4c9E1C93B514d442eef5D45190BFA2Da", - "amount": "1288136528293481209221948", - "proof": [ - "0xade0d295119b8713db272255c3f7c6e65ec9127575c3e3661f0f75f219f0a669", - "0xd1af37812cb2ef553cb937298e6bbb223c04c5323e62680bc86d08744291c7b8", - "0x5d1e6444d5b809d1c96451c89399d489ded4a1f1f3a9e40ca1bddaf56048ecec", - "0x7f1c6ca19ff3cad4f632f6e3686736e3e262e7581772ab7d210d2cd01fd6a7c8", - "0xc93e047f67535414778dfc6856cfd4414899e769239825a687683ea6a63e3e10", - "0x0051d7a32a1cc939dea0060ee90745718a7b84019b2411e1b966c49089e00273", - "0x0616b8a8fdf6a22d755f3735640770bdb2f6e7df4a6e1b23ed3647e9c3778bf6", - "0xe88bf217a61ba2f61cf5c969f3d4f4e916964ce659327135fdd0be2e7c72ee73", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x341154298aB7ca86278DF9665fB2B8610b92214D": { - "beneficiary": "0x8Cf8DE3f9330943A864764C417F65125BE5e6D16", - "amount": "207061287306092567630138", - "proof": [ - "0xff0255d1283419b243089875360894d03f76f1c398d16d80e3160af8b8e579c8", - "0x1f303fd3bab63853e5f4db5c2cdd964cdaba210d57de2c0c411cb4839ce3f844", - "0x64da9595801ee748af5f9eea5084d398f08477627ec51013a220c80e367c8449", - "0x4310adee41342f5a15a53ffbfe9522206c39076254ea7b34d6ea33b6a9398bde" - ] - }, - "0x36efDC29c776c35B55D08E657bF3048eDf65b1dD": { - "beneficiary": "0x36efDC29c776c35B55D08E657bF3048eDf65b1dD", - "amount": "76709611988538975339024", - "proof": [ - "0x41c009dcd4f6d845d9d4282eab6299afe8014dc1514499fb40059e75dcfa53cc", - "0xca287a1db73f28f0bc0277fe0744e3ea71b31f3d0271a17dd3041374f18fef62", - "0x3c77bb6a11e0fc93cfd0a17743f111aac40fdd4426716a20386d80081e3eeea8", - "0x39c2e82a79487da27ef5d8d6b31b3efb47564973a96a7f009a59ff3eee98e3d7", - "0x2aa934f8f4fd48015f3837e029a329df9889527199e2ec1ae6ebe99d0bb412b0", - "0x062359f2025ff77d930f8f91e829b67beffb93b49ac378457b370c7980b2fc73", - "0xa9c9a42a7e408bc6103693f019c44cf312f2b867b87abdceb95d900885156c7e", - "0x64a54e2bec44cafadb050f8cad94de6f390cd69c6f8f8bf7fca200a1d0e859cf", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x378C89b5B93667A005856822e1b65e2d7C076373": { - "beneficiary": "0x378C89b5B93667A005856822e1b65e2d7C076373", - "amount": "374088348504733262334300", - "proof": [ - "0xe98b7c82006b4e274653ce242b1c0a5fe1d51d85a58a6957131a800a6c9adc60", - "0x4af20ff56ca577f653fad31bdfd609dc92767bf6d05bac0e62dd62fc54fa253c", - "0x587d0e9f4f3b1121f7066b827323a7df794a2089782fc9769cab118f4a9c32f0", - "0xc590ad1b557e905ed766a2bd82993040517c1d8f828e67aff3a525f0a517e61b", - "0x0c126623518999de3f92b4a74e8cae9a113108254527d72d813d7e518009dd3c", - "0x22e1c098b7010d0cf32500ff774c2cb716f2a4797330e1b587bc650ded67c423", - "0x26d3258cdc1fc284a0d39b0082465afa7e9cfb3bad44bea5374d722bdb514d7f", - "0xe88bf217a61ba2f61cf5c969f3d4f4e916964ce659327135fdd0be2e7c72ee73", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x3B9e5ae72d068448bB96786989c0d86FBC0551D1": { - "beneficiary": "0x8Cf316B4FEeD10eF10B03f70687050B8BAc3ABe4", - "amount": "310760340806147806733547", - "proof": [ - "0xdd2ef47f18f0da0e1b461764fc765f52ea6d0582e33a2ff1cc68aa23cf129d92", - "0xaa993af55b923f77409249a8992c000121f56422c04013a75278fba38fbadd28", - "0x8db0c0a94e75a9e911f330627e557f5d2ef598dd6acb14c7611693655912539e", - "0x5c0e7f3ab44620fd21c2b93779b413a382833d74590f2ee16fb86cc3453a2561", - "0x2b33811bfbf525e09903057070381317c6e8580a978357fafa1f43ff94acc3cc", - "0x22e1c098b7010d0cf32500ff774c2cb716f2a4797330e1b587bc650ded67c423", - "0x26d3258cdc1fc284a0d39b0082465afa7e9cfb3bad44bea5374d722bdb514d7f", - "0xe88bf217a61ba2f61cf5c969f3d4f4e916964ce659327135fdd0be2e7c72ee73", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x42D2875a71Cb25DDcF05Dbed55490cB905498Bac": { - "beneficiary": "0x42D2875a71Cb25DDcF05Dbed55490cB905498Bac", - "amount": "21237812911867452781393237", - "proof": [ - "0xc3dcf699bdad002c0e1d2c8c8f28d7d916852c460c14e5f5e84a597ee80e2769", - "0x32c1b870b581a3f8be23b50550a775b2359193ea7d92fc564b068f4eb1007355", - "0x82a69a5e365b8c4cf4726a556e0993944e21f51bd9f4553a905be3f6ae1bfd84", - "0xde4766412d1ecc2449d097e3b6b2b5bea1d00c24806fe806e0aee38702c19eef", - "0x59a158af3ffa2849a033594affad303fb5e11aeecbdde0a878c909168e58d612", - "0x97d9146e9833b3fdeba7c55987d17f362c03e476d0731aa6eda14684628e6b80", - "0x26d3258cdc1fc284a0d39b0082465afa7e9cfb3bad44bea5374d722bdb514d7f", - "0xe88bf217a61ba2f61cf5c969f3d4f4e916964ce659327135fdd0be2e7c72ee73", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x439AFfE0ad65205ed669321f9B4242c2c36Bc971": { - "beneficiary": "0xA527C7Eb8E119D6eF46975A2607C495748DA7A85", - "amount": "88348543592770123724352", - "proof": [ - "0xc1952a2a383b6396bd947d4e7b8e181fe029243ffb4bc77eba3b7f0f9e79f4e1", - "0x8f9e31b224fa095855042185d0adf59c42c1388eb25c164b73f522f01a435384", - "0x82a69a5e365b8c4cf4726a556e0993944e21f51bd9f4553a905be3f6ae1bfd84", - "0xde4766412d1ecc2449d097e3b6b2b5bea1d00c24806fe806e0aee38702c19eef", - "0x59a158af3ffa2849a033594affad303fb5e11aeecbdde0a878c909168e58d612", - "0x97d9146e9833b3fdeba7c55987d17f362c03e476d0731aa6eda14684628e6b80", - "0x26d3258cdc1fc284a0d39b0082465afa7e9cfb3bad44bea5374d722bdb514d7f", - "0xe88bf217a61ba2f61cf5c969f3d4f4e916964ce659327135fdd0be2e7c72ee73", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x43e17eEcaC8812B8E96E89B6075C5de63680d194": { - "beneficiary": "0xafEACcE4AD8B3b863eF72A7B7AA9d0E84Ca71DFb", - "amount": "12722873787848266517970303", - "proof": [ - "0x3f20881131d1832d35d2e058ebade9d41d6604685eb6ca9c0deb9fe85a0d7f10", - "0x64086648e58ab7820c646458b5c20cda5905aee5325ab33f70d7e0efcc35a9a1", - "0x86d67e1d319263b2cd1dcc011f5925a4e2569097aae21a6340de89adca6210b3", - "0x309156f7e96d9b52f8ddf5305643178e8482b927ee2703fff776b1c235be172f", - "0x9065ab73e0639a7701ce0c7ea4d24dc3a352eaf86d04cfe535ea8b3b19f43923", - "0x473f914d1f1ccc5b8b5de95bc12121123181242ea06fff9c8508a358398163b5", - "0x5edc99efd052e87ec503dc802fa8b259d16a891b72bc9ac38d7bc6d7b6f2552e", - "0x64a54e2bec44cafadb050f8cad94de6f390cd69c6f8f8bf7fca200a1d0e859cf", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x4553dAA29662971ff6f1cA59390287E8Bc25825F": { - "beneficiary": "0x4553dAA29662971ff6f1cA59390287E8Bc25825F", - "amount": "238657203442388413684128", - "proof": [ - "0x0af7333dd3cdcc26963cbb7546ea9bf3b9444b8dcb34d065518f0b7f665036b9", - "0x5d0513cad5d98c8ca0bd7bb234d9e4bddb73d68d01b9d817e7515ed963be59f1", - "0x192914324518265c3199e67a4976766b68529dd3d1460d0b729921238672069e", - "0x81e6adfcd37f44c1b0d192e02239acfdaa6943691bce8c4f017c99a8c59c17a7", - "0x59579fcafd7366cb9d52ae4c94f27332a10e08b985ba36d2846a772392ce0e75", - "0x56e2c6ad067fe01f6532e8274c819527bbc22e3d1a23f010e171e6616d445529", - "0x5edc99efd052e87ec503dc802fa8b259d16a891b72bc9ac38d7bc6d7b6f2552e", - "0x64a54e2bec44cafadb050f8cad94de6f390cd69c6f8f8bf7fca200a1d0e859cf", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x456D643CD97b058Fd3bBBEB76f04B1DE3679bc6A": { - "beneficiary": "0x456D643CD97b058Fd3bBBEB76f04B1DE3679bc6A", - "amount": "124355176896238606682865", - "proof": [ - "0xa26f7cc818624cf47f1d66d6c230f9f36375bdd06bab94ca4c55ca22bb453afd", - "0x3f7ade5133384ef974db220d451c7418f7c63122b47f994900baa51590dbea43", - "0xabc336cf0e705edfee5b63228a4e00e84a07a2cae7399bbb3e1239086ce6dc5b", - "0x58cf8a54810bc5371dbd254fdd1d17b9bdf629c32dcc26ae5ed527df75fb8b4e", - "0xdaae4d08c4b45294e520ad0f82a9cb506546db0d8fe3ec7c0e13d56d0f8c39d6", - "0x0051d7a32a1cc939dea0060ee90745718a7b84019b2411e1b966c49089e00273", - "0x0616b8a8fdf6a22d755f3735640770bdb2f6e7df4a6e1b23ed3647e9c3778bf6", - "0xe88bf217a61ba2f61cf5c969f3d4f4e916964ce659327135fdd0be2e7c72ee73", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x492Af9a0B99FED66dce727bB96Ad133dB83CdAf6": { - "beneficiary": "0x492Af9a0B99FED66dce727bB96Ad133dB83CdAf6", - "amount": "166379496757744500343160", - "proof": [ - "0xccb6740f6a5ba856c0cf5a25b561517e9bc5e13468d360df377ed1180c90663e", - "0x3eba2c9647b080367924c8ba757a3b3bfd3361084f361ed5c83873a161495471", - "0xda5bc1b52ee4e176a2b5b47730aad20d7eae55bd368950063bd03bf13d5a53aa", - "0x8ae93be8304ef13b7e153cfe03598869b3fe1e0c5405174fd8150ee7c3c37df7", - "0xa66a31c956515e2b9d52e14019df281b7b65cb788fe21437b8ddacc320e2517e", - "0x97d9146e9833b3fdeba7c55987d17f362c03e476d0731aa6eda14684628e6b80", - "0x26d3258cdc1fc284a0d39b0082465afa7e9cfb3bad44bea5374d722bdb514d7f", - "0xe88bf217a61ba2f61cf5c969f3d4f4e916964ce659327135fdd0be2e7c72ee73", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x4Ba8205D83e32051dd01a9F357DF539b62d8F2c9": { - "beneficiary": "0x4Ba8205D83e32051dd01a9F357DF539b62d8F2c9", - "amount": "3859171332895281583176", - "proof": [ - "0xf9ba4fabad6a3970225b46376665474fc8936b4c7cad18878fdf49c8960761b2", - "0x39bf6126aa344558af5bf0bdf6b3dee9c408f3cb9a8188a73f6e515367902525", - "0xb1df75fb8fb0b20c38c83448e01848ccbff4039efb40291cc907eb04faac03ef", - "0x4310adee41342f5a15a53ffbfe9522206c39076254ea7b34d6ea33b6a9398bde" - ] - }, - "0x4bFa10B1538E8E765E995688D8EEc39C717B6797": { - "beneficiary": "0x335A725164a2CD487dD420019a15262b7bBC0b8F", - "amount": "383122645654682600520843", - "proof": [ - "0xae811ade9d4d043ce4ed7e68ec364cc4fee00ff929ae05979d3dab561ba8ce1b", - "0xc4fa371aa4d07949fe863a19a480acc202d155fe9f04cb79378fb457e032a295", - "0x5d1e6444d5b809d1c96451c89399d489ded4a1f1f3a9e40ca1bddaf56048ecec", - "0x7f1c6ca19ff3cad4f632f6e3686736e3e262e7581772ab7d210d2cd01fd6a7c8", - "0xc93e047f67535414778dfc6856cfd4414899e769239825a687683ea6a63e3e10", - "0x0051d7a32a1cc939dea0060ee90745718a7b84019b2411e1b966c49089e00273", - "0x0616b8a8fdf6a22d755f3735640770bdb2f6e7df4a6e1b23ed3647e9c3778bf6", - "0xe88bf217a61ba2f61cf5c969f3d4f4e916964ce659327135fdd0be2e7c72ee73", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x4c496f9903450Aa2092a39efe722E6971D8fAb49": { - "beneficiary": "0x4c496f9903450Aa2092a39efe722E6971D8fAb49", - "amount": "418028585045455536506246", - "proof": [ - "0xfeb6bce303beac511042641596b8b6ab8fb99c08caf4585229dc3e107e42bfa3", - "0xf99d5b3475d009f68c0e1f5cd8b5a8a47a8e8d90b2129f5abc187cf217297b9c", - "0x64da9595801ee748af5f9eea5084d398f08477627ec51013a220c80e367c8449", - "0x4310adee41342f5a15a53ffbfe9522206c39076254ea7b34d6ea33b6a9398bde" - ] - }, - "0x4CcA7d94AE28F39e6456Dd733eECd1B82e9887Dd": { - "beneficiary": "0x13f953FF0A90bB7515532B896444805DB5bf9beB", - "amount": "126649219160142875422851", - "proof": [ - "0xed2d3f7007ea82dda45d0609f33442f97e2ca4a49e789122377b1fc159ec224c", - "0xf1df73373aa4f27e49513792c493c7b8c7c5dd74a7c310f24a2d039ffb8ef0c3", - "0x6b88df0e50560634402641f3ab4caa0207713da2cd2a158610d5498a3ab0fc81", - "0xc590ad1b557e905ed766a2bd82993040517c1d8f828e67aff3a525f0a517e61b", - "0x0c126623518999de3f92b4a74e8cae9a113108254527d72d813d7e518009dd3c", - "0x22e1c098b7010d0cf32500ff774c2cb716f2a4797330e1b587bc650ded67c423", - "0x26d3258cdc1fc284a0d39b0082465afa7e9cfb3bad44bea5374d722bdb514d7f", - "0xe88bf217a61ba2f61cf5c969f3d4f4e916964ce659327135fdd0be2e7c72ee73", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x4CFF511301c6859b074Cf89D17Ec23b8537a5576": { - "beneficiary": "0x4CFF511301c6859b074Cf89D17Ec23b8537a5576", - "amount": "17579811352838455763730", - "proof": [ - "0xb6a77849dee753bea4c8e91a72e390b610d6a134bde9e895b5f4a3141e8117dc", - "0xc38d0ab87d3e916f50867b0f445c2af42a6bc597a28d46d922fab2da22c28406", - "0x3f3d7c9d71f69628bc227b472d3a972115ced96bce6647491a6aef22dbe8410c", - "0xe8725478de68bb2f70f03cdae0b58fb5de3d665ba62705d4d326ed9b5c097b79", - "0xc93e047f67535414778dfc6856cfd4414899e769239825a687683ea6a63e3e10", - "0x0051d7a32a1cc939dea0060ee90745718a7b84019b2411e1b966c49089e00273", - "0x0616b8a8fdf6a22d755f3735640770bdb2f6e7df4a6e1b23ed3647e9c3778bf6", - "0xe88bf217a61ba2f61cf5c969f3d4f4e916964ce659327135fdd0be2e7c72ee73", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x4d3c343D4BD676E4098336EF75f1d717149623A1": { - "beneficiary": "0x4d3c343D4BD676E4098336EF75f1d717149623A1", - "amount": "705452992034219129666096", - "proof": [ - "0x070fb58aeec1fb141ad8119642405583bf68efb773827eb681ba5bf7f773f812", - "0x294dd8ca5d2080f4ebec287b41a53bc8ff713b38c8990c0ee0cd251c208b1e5f", - "0x712cad967bfab73d3fedf0d4822868a1a8b0bde786ed4122b9e1fa5e9fee77f6", - "0xb9473c113468ef16d11e686668d79ec90e821e951c0387ac41ae0d97e3f5a0a3", - "0xde4d448a9d734de96d9aad546aff27580bbca08f960e04097175f5f07e34f665", - "0x56e2c6ad067fe01f6532e8274c819527bbc22e3d1a23f010e171e6616d445529", - "0x5edc99efd052e87ec503dc802fa8b259d16a891b72bc9ac38d7bc6d7b6f2552e", - "0x64a54e2bec44cafadb050f8cad94de6f390cd69c6f8f8bf7fca200a1d0e859cf", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x4e09614836C96324689103998B4283461c203F40": { - "beneficiary": "0x4e09614836C96324689103998B4283461c203F40", - "amount": "6864303296473347050272", - "proof": [ - "0x51e973cc0e434d4f99766edfde5c63974ea71e0755371ec221275ce34a41e98c", - "0xbffcef99057b94c157df6fe076719e17e1d92429c29ab5e0eaf443401c3de467", - "0x228a2482fb9d68fee941f2a2d25527f20eb0a908482483549f9fdefcc5d93f88", - "0x195bb1e416a9464545527432ff9ea60c3e6383f802a3808a4151e24087c7c24b", - "0x01add4a2b7c01143892ca3fbd9ac6e2d294563bf8fe1296e127a7f43ce54824c", - "0x062359f2025ff77d930f8f91e829b67beffb93b49ac378457b370c7980b2fc73", - "0xa9c9a42a7e408bc6103693f019c44cf312f2b867b87abdceb95d900885156c7e", - "0x64a54e2bec44cafadb050f8cad94de6f390cd69c6f8f8bf7fca200a1d0e859cf", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x4F4f0D0dfd93513B3f4Cb116Fe9d0A005466F725": { - "beneficiary": "0x8b055ac1c4dd287E2a46D4a52d61FE76FB551bD0", - "amount": "2002994211668087516564088", - "proof": [ - "0xa02ddf2973bac55cf0e5ad731aba077542d0f04e7f59fd948bf3527b85303889", - "0x7eb7210d32069f58b997139929bfa062cb45b0a8460719b0c0ae87ef97ebd69f", - "0xabc336cf0e705edfee5b63228a4e00e84a07a2cae7399bbb3e1239086ce6dc5b", - "0x58cf8a54810bc5371dbd254fdd1d17b9bdf629c32dcc26ae5ed527df75fb8b4e", - "0xdaae4d08c4b45294e520ad0f82a9cb506546db0d8fe3ec7c0e13d56d0f8c39d6", - "0x0051d7a32a1cc939dea0060ee90745718a7b84019b2411e1b966c49089e00273", - "0x0616b8a8fdf6a22d755f3735640770bdb2f6e7df4a6e1b23ed3647e9c3778bf6", - "0xe88bf217a61ba2f61cf5c969f3d4f4e916964ce659327135fdd0be2e7c72ee73", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x50740bEcEe506cdc0567FD4B3ea04249Fb8c8676": { - "beneficiary": "0x50740bEcEe506cdc0567FD4B3ea04249Fb8c8676", - "amount": "123276721687759202482811", - "proof": [ - "0x77db33040cff244c275ac0799f3c957a4bbe560b878c3c58a42d8667608f0544", - "0xee0fa184b35c45e87904df131d0be4bae57aa3f900e4532d054e3aa59b02ed85", - "0x96d0e3cff76ea9fb76e7194dc1aa4e152b4ce4e16c25045e71d316f12e556976", - "0xeab42a7f7084e021a91d743173e7d8d1a35b408ed9f715b7f36249a621338a21", - "0x8ba5b958e3d50463abb92bcbd342d11326e4d7c366ee018c2d461fbb1df561b5", - "0x68dbcd1cbf24dfe8761794f995bcb03a39b7b92828d8898f64ee8ee429e9eb95", - "0x0616b8a8fdf6a22d755f3735640770bdb2f6e7df4a6e1b23ed3647e9c3778bf6", - "0xe88bf217a61ba2f61cf5c969f3d4f4e916964ce659327135fdd0be2e7c72ee73", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x53Fd56C8507d15E36E961470c5f52664E06064B9": { - "beneficiary": "0x53Fd56C8507d15E36E961470c5f52664E06064B9", - "amount": "6474013952596067881637", - "proof": [ - "0x5417859317dfc6d378bb1e92671f6ed9002ca10d97d3892d0de6154208235291", - "0x6f6dff5f2394a57178bf43554389ca0f6ae2be28836b79fc1a99dd3c0dc7a193", - "0x228a2482fb9d68fee941f2a2d25527f20eb0a908482483549f9fdefcc5d93f88", - "0x195bb1e416a9464545527432ff9ea60c3e6383f802a3808a4151e24087c7c24b", - "0x01add4a2b7c01143892ca3fbd9ac6e2d294563bf8fe1296e127a7f43ce54824c", - "0x062359f2025ff77d930f8f91e829b67beffb93b49ac378457b370c7980b2fc73", - "0xa9c9a42a7e408bc6103693f019c44cf312f2b867b87abdceb95d900885156c7e", - "0x64a54e2bec44cafadb050f8cad94de6f390cd69c6f8f8bf7fca200a1d0e859cf", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x56C968857EF4919c67d151b56E7073065994c97a": { - "beneficiary": "0x56C968857EF4919c67d151b56E7073065994c97a", - "amount": "1174339068378289152814639", - "proof": [ - "0x0058ecaf8eadb51f7bba8cb4335a829f65431215583f53857996e07c825b69be", - "0xae3574d032512b8cc07d724e747bb057d2d3a44751a0195d6572b6004b8b0d6d", - "0x3a3475312892ff2f8bc9b732274d6c756387fcecb200614270a377eb2634e436", - "0x4c5007a8d6e515ed558b22a1e3df53f27975e71b334407ce8c34529d3336513b", - "0xde4d448a9d734de96d9aad546aff27580bbca08f960e04097175f5f07e34f665", - "0x56e2c6ad067fe01f6532e8274c819527bbc22e3d1a23f010e171e6616d445529", - "0x5edc99efd052e87ec503dc802fa8b259d16a891b72bc9ac38d7bc6d7b6f2552e", - "0x64a54e2bec44cafadb050f8cad94de6f390cd69c6f8f8bf7fca200a1d0e859cf", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x5838636dCDd92113998FEcbcDeDf5B0d8bEB4920": { - "beneficiary": "0x6950c4C7E97c7d2e6b5bffEC4634f841DB2A5f3D", - "amount": "20155787892274363545333276", - "proof": [ - "0x1bf657dd737b4c7b1395b9861d548087c6baa74c7ce9d279e02ec9520ce62813", - "0x0e78b5e8f80e7684fc6fb87aef7a5008cc62b17f2962d53291c10e935310f5c2", - "0xaaeb00bed52b9d925f1203df43f78fc3e6c0f32905f6b525282b6933f95c1789", - "0x8440e0d75827386a44bdad4b2918630de84d85dfe4ceb48cffc7b6440d64b8d2", - "0x59579fcafd7366cb9d52ae4c94f27332a10e08b985ba36d2846a772392ce0e75", - "0x56e2c6ad067fe01f6532e8274c819527bbc22e3d1a23f010e171e6616d445529", - "0x5edc99efd052e87ec503dc802fa8b259d16a891b72bc9ac38d7bc6d7b6f2552e", - "0x64a54e2bec44cafadb050f8cad94de6f390cd69c6f8f8bf7fca200a1d0e859cf", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x5AAdFEc6A407f6730A4CFaC54B472B23D42a718D": { - "beneficiary": "0x5AAdFEc6A407f6730A4CFaC54B472B23D42a718D", - "amount": "22981597559469167182392", - "proof": [ - "0x7d92dc8bd13fcc361c2854737d69d9a8ee15bf2336742b83db409612975402d5", - "0x67da8cdddc99afe6cba81d7a1b02962dcfc280fc1624d4a4c5c96f667c6ed805", - "0xbc8bbd3bf840accfe3028f77db7ff9d42c92b810abdacce3210a0eab351623fa", - "0xeab42a7f7084e021a91d743173e7d8d1a35b408ed9f715b7f36249a621338a21", - "0x8ba5b958e3d50463abb92bcbd342d11326e4d7c366ee018c2d461fbb1df561b5", - "0x68dbcd1cbf24dfe8761794f995bcb03a39b7b92828d8898f64ee8ee429e9eb95", - "0x0616b8a8fdf6a22d755f3735640770bdb2f6e7df4a6e1b23ed3647e9c3778bf6", - "0xe88bf217a61ba2f61cf5c969f3d4f4e916964ce659327135fdd0be2e7c72ee73", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x5c2De03aD7c5c927E580a70dd1D44D3e27146780": { - "beneficiary": "0x5c2De03aD7c5c927E580a70dd1D44D3e27146780", - "amount": "1433476258728347857194353", - "proof": [ - "0xa69fb9b6a111789e777af9468131aca50c146e515cb12c0b9ba3a39ba28bf62e", - "0xabc75c952ee72c6d5222f4d41cbd22c2ca2376100368d5b5e5e9c9212bf51043", - "0xa5858748f647690bd3608a8de80dfb90d16e8f0bc064dcb606ea9aa1f35cb8e9", - "0x58cf8a54810bc5371dbd254fdd1d17b9bdf629c32dcc26ae5ed527df75fb8b4e", - "0xdaae4d08c4b45294e520ad0f82a9cb506546db0d8fe3ec7c0e13d56d0f8c39d6", - "0x0051d7a32a1cc939dea0060ee90745718a7b84019b2411e1b966c49089e00273", - "0x0616b8a8fdf6a22d755f3735640770bdb2f6e7df4a6e1b23ed3647e9c3778bf6", - "0xe88bf217a61ba2f61cf5c969f3d4f4e916964ce659327135fdd0be2e7c72ee73", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x5cF1703A1c99A4b42Eb056535840e93118177232": { - "beneficiary": "0x5cF1703A1c99A4b42Eb056535840e93118177232", - "amount": "17110484578015126556417593", - "proof": [ - "0x92a291dbcbd0f080694e909f01e429386542d1260b9b4dac2e821170c4a6fe25", - "0x25d445f71ae73da4ae70d6e67f875ec17225f2bb4b089eccaa29d3a5aa724e47", - "0x0547516dacc2694fc61c2fef1c2bd36e8192020f4c8189615b9cdaca041fdd02", - "0xa947248fcc5a7ae879736246946a77fa43401f91d467acd89a1208f3cbd604b9", - "0xe4b02fad2ca92c21c555a2c6107ae084366477f8bf346a4fc1ddfe404454ce24", - "0x68dbcd1cbf24dfe8761794f995bcb03a39b7b92828d8898f64ee8ee429e9eb95", - "0x0616b8a8fdf6a22d755f3735640770bdb2f6e7df4a6e1b23ed3647e9c3778bf6", - "0xe88bf217a61ba2f61cf5c969f3d4f4e916964ce659327135fdd0be2e7c72ee73", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x606c9936A8B5C70061b3464424ab7d45302eF9b7": { - "beneficiary": "0x606c9936A8B5C70061b3464424ab7d45302eF9b7", - "amount": "595637550435511768518180", - "proof": [ - "0x571be30a624e101de93033bb7bbfe66d74deeb44b758244627ae519cc419eabd", - "0x2e76aa9e893447a7def5f07a45c1aa8c0200ad4b1f3f9e88235387e8804004a1", - "0xbabfec64d5720d4e9e78f58b00b56aa86f1ea2b5129ca4db0c315adcedaab965", - "0xd2ea19db53b4fc2b4b69c5c7337ab4b3eeb8e32ad07e477402839a2d22673a61", - "0x01add4a2b7c01143892ca3fbd9ac6e2d294563bf8fe1296e127a7f43ce54824c", - "0x062359f2025ff77d930f8f91e829b67beffb93b49ac378457b370c7980b2fc73", - "0xa9c9a42a7e408bc6103693f019c44cf312f2b867b87abdceb95d900885156c7e", - "0x64a54e2bec44cafadb050f8cad94de6f390cd69c6f8f8bf7fca200a1d0e859cf", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x6317647bf38Bcb14912Bf88000430fDA30632C09": { - "beneficiary": "0x6317647bf38Bcb14912Bf88000430fDA30632C09", - "amount": "6248197814429301932822", - "proof": [ - "0x975d6a7b47280a2a40ebd6effa6b5d5e4862c4c6ea34fc7e5ced89016d8d4db9", - "0x046b299c7d385f399878f74ba836cd0b13cae4324df79962d8e627d69856b3ec", - "0x08386d2f8bb88fd2e59c782888ffcd6c4e14cfc4af0c16b1147aa7df717d953b", - "0x8e0a201871d267e73e63f23088bd1e9d8c9a8b763ee4dfe53afad4a412370179", - "0xe4b02fad2ca92c21c555a2c6107ae084366477f8bf346a4fc1ddfe404454ce24", - "0x68dbcd1cbf24dfe8761794f995bcb03a39b7b92828d8898f64ee8ee429e9eb95", - "0x0616b8a8fdf6a22d755f3735640770bdb2f6e7df4a6e1b23ed3647e9c3778bf6", - "0xe88bf217a61ba2f61cf5c969f3d4f4e916964ce659327135fdd0be2e7c72ee73", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x650A9eD18Df873cad98C88dcaC8170531cAD2399": { - "beneficiary": "0x18503D85DDA5c51b6DADaB8a6b75231256A4F9F7", - "amount": "7232633500358973444279933", - "proof": [ - "0xb635523a6af8f9b10ad131f26cea389dd43429727cee526c436b655e0471b10a", - "0xc38d0ab87d3e916f50867b0f445c2af42a6bc597a28d46d922fab2da22c28406", - "0x3f3d7c9d71f69628bc227b472d3a972115ced96bce6647491a6aef22dbe8410c", - "0xe8725478de68bb2f70f03cdae0b58fb5de3d665ba62705d4d326ed9b5c097b79", - "0xc93e047f67535414778dfc6856cfd4414899e769239825a687683ea6a63e3e10", - "0x0051d7a32a1cc939dea0060ee90745718a7b84019b2411e1b966c49089e00273", - "0x0616b8a8fdf6a22d755f3735640770bdb2f6e7df4a6e1b23ed3647e9c3778bf6", - "0xe88bf217a61ba2f61cf5c969f3d4f4e916964ce659327135fdd0be2e7c72ee73", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x65Dd518e9D5486273CA810f8b9951FE20F512555": { - "beneficiary": "0x455a2a1c15B566dbFFFb626B866f49e89c98838F", - "amount": "891331542824590562446471", - "proof": [ - "0x135d9ea3ad9ace85e769218b0eb13ad055a1c261891e6df77b70110bc7af4e3a", - "0xe45b13c8abea205b8a99e052553c1bb7cbdaf42a67a211a23647907d4d17c415", - "0x2536cb3d4c792ff51ebbbe47b81a1bc64d310ec892ecf7535f57b19d45b59aec", - "0x8440e0d75827386a44bdad4b2918630de84d85dfe4ceb48cffc7b6440d64b8d2", - "0x59579fcafd7366cb9d52ae4c94f27332a10e08b985ba36d2846a772392ce0e75", - "0x56e2c6ad067fe01f6532e8274c819527bbc22e3d1a23f010e171e6616d445529", - "0x5edc99efd052e87ec503dc802fa8b259d16a891b72bc9ac38d7bc6d7b6f2552e", - "0x64a54e2bec44cafadb050f8cad94de6f390cd69c6f8f8bf7fca200a1d0e859cf", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x6a2829A6B7186c62E2b4c7bb6434E880daF2B4C4": { - "beneficiary": "0x6a2829A6B7186c62E2b4c7bb6434E880daF2B4C4", - "amount": "80883301917125402860685", - "proof": [ - "0x0188ec4b56d05dca176c371faf8625ad805ac9e9980e6c6f52d7bc62114b9ee1", - "0x5662fa220c8ee1a83a2d332862889e7dddfefe3cb7121df0a558e0f77ee15168", - "0x409d28f2187aa20196f7e88689dfe27d40d76efa9726b55b953b5eaed00166a0", - "0x4c5007a8d6e515ed558b22a1e3df53f27975e71b334407ce8c34529d3336513b", - "0xde4d448a9d734de96d9aad546aff27580bbca08f960e04097175f5f07e34f665", - "0x56e2c6ad067fe01f6532e8274c819527bbc22e3d1a23f010e171e6616d445529", - "0x5edc99efd052e87ec503dc802fa8b259d16a891b72bc9ac38d7bc6d7b6f2552e", - "0x64a54e2bec44cafadb050f8cad94de6f390cd69c6f8f8bf7fca200a1d0e859cf", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x6dAfE16b14c95eB99c64e8d4E5435F7574B2825c": { - "beneficiary": "0xcE1663cB67f034FeDf41ec4597Ac272582142d74", - "amount": "556156654531066588867817", - "proof": [ - "0x6ebae13b8c7aa9883df6bbf0c841346ed5c0f1a2072d3c67606d2875391fba20", - "0x9174575460bf2d25b28cd4295d9b5ff7e24b0d509d0ebc9cc4fd88577cfa2c9c", - "0x8960e3adadc2c6e4c5d362f30d21564d88866e2a95977c7e2a5bc268b827d5bc", - "0x2636c723e4b0313d34aacb26a0c7d73dd94ed5f08ae04281a362b14207b628e2", - "0x111fd987a5f671f7884a8783e2bebd8e1cc22bf533d05e0441bdfd228b345717", - "0xdccacd8bd107e69fd2d2c1a05f9bcc65811815f152e9f33ac433517436067435", - "0xa9c9a42a7e408bc6103693f019c44cf312f2b867b87abdceb95d900885156c7e", - "0x64a54e2bec44cafadb050f8cad94de6f390cd69c6f8f8bf7fca200a1d0e859cf", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x6dEE1fd2b29e2214a4f9aB9Ba5f3D17C8Cb56D11": { - "beneficiary": "0x6950c4C7E97c7d2e6b5bffEC4634f841DB2A5f3D", - "amount": "20708030892974725646261970", - "proof": [ - "0xbb1b944f0617b697f6357ace1b576332fcd7c848b50ac01a300d1eecf117f576", - "0x9e8f667a34c847f97e4342a1d15027d53bbdd1a2672e4f723ccb92c460e30847", - "0x3f3d7c9d71f69628bc227b472d3a972115ced96bce6647491a6aef22dbe8410c", - "0xe8725478de68bb2f70f03cdae0b58fb5de3d665ba62705d4d326ed9b5c097b79", - "0xc93e047f67535414778dfc6856cfd4414899e769239825a687683ea6a63e3e10", - "0x0051d7a32a1cc939dea0060ee90745718a7b84019b2411e1b966c49089e00273", - "0x0616b8a8fdf6a22d755f3735640770bdb2f6e7df4a6e1b23ed3647e9c3778bf6", - "0xe88bf217a61ba2f61cf5c969f3d4f4e916964ce659327135fdd0be2e7c72ee73", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x6F653c3ab0a9eF866e4ba99Ce40340129Ce2cC4c": { - "beneficiary": "0x6F653c3ab0a9eF866e4ba99Ce40340129Ce2cC4c", - "amount": "214808416958317664669375", - "proof": [ - "0xa8a16623e6666caa30f742841da2ac6f68a49562e897c5b4adcdcffc34e8e0cb", - "0x7bf6523c1271d4a2f093c8445131a535d649e86647be2df907a91a0d69666620", - "0x494640bb4e5d1873e085d9d5e29edc405575596861c8dc0a6c2e7dac55286e1d", - "0xf27c91795a530d7278a5dbfe1a56dccc1f214ed024d0ed7b115853a29f7b3f5a", - "0xdaae4d08c4b45294e520ad0f82a9cb506546db0d8fe3ec7c0e13d56d0f8c39d6", - "0x0051d7a32a1cc939dea0060ee90745718a7b84019b2411e1b966c49089e00273", - "0x0616b8a8fdf6a22d755f3735640770bdb2f6e7df4a6e1b23ed3647e9c3778bf6", - "0xe88bf217a61ba2f61cf5c969f3d4f4e916964ce659327135fdd0be2e7c72ee73", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x700277dEaf138c6af9B3177F83918B6a3544F27F": { - "beneficiary": "0x700277dEaf138c6af9B3177F83918B6a3544F27F", - "amount": "606140121451480645827916", - "proof": [ - "0xfbf32d74597bcbd58bfd9f881003feb06349d0c7682f9474c756060eef4c9caa", - "0xfd5be5dffa076c9910a1e04a91e83a6cddd9c241835c6b232020aaac771aec3c", - "0xb1df75fb8fb0b20c38c83448e01848ccbff4039efb40291cc907eb04faac03ef", - "0x4310adee41342f5a15a53ffbfe9522206c39076254ea7b34d6ea33b6a9398bde" - ] - }, - "0x78B7082625281921880D999CD9e4cfcD8AaB6c5e": { - "beneficiary": "0x78B7082625281921880D999CD9e4cfcD8AaB6c5e", - "amount": "137663069861959318874268", - "proof": [ - "0x03d19d259349da8522332592120e4f97ea706dac3533465cdc39c4279c559590", - "0x702bee33c3bf25713f8e181d43ae17b515ebf78328248c04b8c18d9d0056e33a", - "0x44c197d64d894c349573d2595162ecc3e2eac1c260689dc68d2a5ee03c2e2e3e", - "0xb9473c113468ef16d11e686668d79ec90e821e951c0387ac41ae0d97e3f5a0a3", - "0xde4d448a9d734de96d9aad546aff27580bbca08f960e04097175f5f07e34f665", - "0x56e2c6ad067fe01f6532e8274c819527bbc22e3d1a23f010e171e6616d445529", - "0x5edc99efd052e87ec503dc802fa8b259d16a891b72bc9ac38d7bc6d7b6f2552e", - "0x64a54e2bec44cafadb050f8cad94de6f390cd69c6f8f8bf7fca200a1d0e859cf", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x78EDaA9375250aF6237d708Ef70eaa0d0ED5970C": { - "beneficiary": "0xc5b53300aF952D23F587bf9a89E685A951D99315", - "amount": "953186714511308950739181", - "proof": [ - "0x6075171c8b189328c7ce42a50161bde1b532cdca0857482e32e4a2bfc6b3eb6b", - "0xfc11ec3f4c15e6ad454c6a01847bdecb9cddce3254bab9f7555decdefcd172dc", - "0xe2469697f1b831d6635fddc64f2d541b1101565b1a61fa0742050530e161d913", - "0x797edd017f4003c1285ab77462d72a225c5599c94f0de400975080271269fef0", - "0x0c99d2be5d1dbc03058e95802f469f1f3a0ebd66724ffe9b43624f26e1d9ab49", - "0xdccacd8bd107e69fd2d2c1a05f9bcc65811815f152e9f33ac433517436067435", - "0xa9c9a42a7e408bc6103693f019c44cf312f2b867b87abdceb95d900885156c7e", - "0x64a54e2bec44cafadb050f8cad94de6f390cd69c6f8f8bf7fca200a1d0e859cf", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x80e8D031a3Bbd4EB04Cd19fd02cF4038344a42C5": { - "beneficiary": "0x80e8D031a3Bbd4EB04Cd19fd02cF4038344a42C5", - "amount": "142441899232977571578875", - "proof": [ - "0x91ec1010ffbc40e878f9524938a9e2632dd0f599663504606db9275246a4299b", - "0x25d445f71ae73da4ae70d6e67f875ec17225f2bb4b089eccaa29d3a5aa724e47", - "0x0547516dacc2694fc61c2fef1c2bd36e8192020f4c8189615b9cdaca041fdd02", - "0xa947248fcc5a7ae879736246946a77fa43401f91d467acd89a1208f3cbd604b9", - "0xe4b02fad2ca92c21c555a2c6107ae084366477f8bf346a4fc1ddfe404454ce24", - "0x68dbcd1cbf24dfe8761794f995bcb03a39b7b92828d8898f64ee8ee429e9eb95", - "0x0616b8a8fdf6a22d755f3735640770bdb2f6e7df4a6e1b23ed3647e9c3778bf6", - "0xe88bf217a61ba2f61cf5c969f3d4f4e916964ce659327135fdd0be2e7c72ee73", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x817adcB8Ac1185E60f8c455eDCa822494a94C7EB": { - "beneficiary": "0x817adcB8Ac1185E60f8c455eDCa822494a94C7EB", - "amount": "261108147666487559570066", - "proof": [ - "0x5d6c125cdb0c490ba9acbe01c8c89af4aa36016ccf04e890336797ca306b17ed", - "0x5d35bcc3b76af92c81c20ef15a7075e358b619771db7c95cc8ca9bbe9ed3aeb6", - "0x72bd8f01249b9820f99ef97fbf7f6a7cdd350a3e7a3e5a1089c9b988b87ba7e2", - "0x797edd017f4003c1285ab77462d72a225c5599c94f0de400975080271269fef0", - "0x0c99d2be5d1dbc03058e95802f469f1f3a0ebd66724ffe9b43624f26e1d9ab49", - "0xdccacd8bd107e69fd2d2c1a05f9bcc65811815f152e9f33ac433517436067435", - "0xa9c9a42a7e408bc6103693f019c44cf312f2b867b87abdceb95d900885156c7e", - "0x64a54e2bec44cafadb050f8cad94de6f390cd69c6f8f8bf7fca200a1d0e859cf", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x83237bA2B7D0Bf23090196FcCbfb2Be1eF21580D": { - "beneficiary": "0x83237bA2B7D0Bf23090196FcCbfb2Be1eF21580D", - "amount": "3316735902165479461725633", - "proof": [ - "0xcd7ce7843c0a55bd91d3267e6135481f523068cae17821a3dea7c61c98db8e8e", - "0x22893474698fa0a3cf2b2a276036f6eb93bf3768c189f5c5d6fb0c481c38a8b9", - "0xda5bc1b52ee4e176a2b5b47730aad20d7eae55bd368950063bd03bf13d5a53aa", - "0x8ae93be8304ef13b7e153cfe03598869b3fe1e0c5405174fd8150ee7c3c37df7", - "0xa66a31c956515e2b9d52e14019df281b7b65cb788fe21437b8ddacc320e2517e", - "0x97d9146e9833b3fdeba7c55987d17f362c03e476d0731aa6eda14684628e6b80", - "0x26d3258cdc1fc284a0d39b0082465afa7e9cfb3bad44bea5374d722bdb514d7f", - "0xe88bf217a61ba2f61cf5c969f3d4f4e916964ce659327135fdd0be2e7c72ee73", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x8c4d058eC1ed52fd75FbBF04c6c625289b47733b": { - "beneficiary": "0x8c4d058eC1ed52fd75FbBF04c6c625289b47733b", - "amount": "6993801490252500545346", - "proof": [ - "0x063708d9ea631fe5612fabcb0eb59257dd70cefb33d82239a47f9b99917663b4", - "0x3472c291fca8f61a147b7599a4981a0f66ea0a76fc733af0a28a24a9f9b7bf9f", - "0x44c197d64d894c349573d2595162ecc3e2eac1c260689dc68d2a5ee03c2e2e3e", - "0xb9473c113468ef16d11e686668d79ec90e821e951c0387ac41ae0d97e3f5a0a3", - "0xde4d448a9d734de96d9aad546aff27580bbca08f960e04097175f5f07e34f665", - "0x56e2c6ad067fe01f6532e8274c819527bbc22e3d1a23f010e171e6616d445529", - "0x5edc99efd052e87ec503dc802fa8b259d16a891b72bc9ac38d7bc6d7b6f2552e", - "0x64a54e2bec44cafadb050f8cad94de6f390cd69c6f8f8bf7fca200a1d0e859cf", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x8CC46611beC3217D058D92fD234A8ed7D205e0D2": { - "beneficiary": "0x8Cf8DE3f9330943A864764C417F65125BE5e6D16", - "amount": "110432686563249369402741", - "proof": [ - "0x0e7f5586e4d34b43fc7a019b80a2054d29e7402df35398139a760574abdc5e40", - "0x7c8b8af27300c4a6a8507001809f5d303e21f578438c2be2822660124664d17c", - "0x192914324518265c3199e67a4976766b68529dd3d1460d0b729921238672069e", - "0x81e6adfcd37f44c1b0d192e02239acfdaa6943691bce8c4f017c99a8c59c17a7", - "0x59579fcafd7366cb9d52ae4c94f27332a10e08b985ba36d2846a772392ce0e75", - "0x56e2c6ad067fe01f6532e8274c819527bbc22e3d1a23f010e171e6616d445529", - "0x5edc99efd052e87ec503dc802fa8b259d16a891b72bc9ac38d7bc6d7b6f2552e", - "0x64a54e2bec44cafadb050f8cad94de6f390cd69c6f8f8bf7fca200a1d0e859cf", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x8D06f731E86082B1922Afa9002F164e1622bb011": { - "beneficiary": "0x8D06f731E86082B1922Afa9002F164e1622bb011", - "amount": "98471658844306883698654", - "proof": [ - "0x68df08d60b7fefb45e3de8418501e4b5b07a5792ee1325def6c974f0e714caeb", - "0x1cac74bc6810eddddc2f0d895a472ad61d0c68931e00771139a58ebad1779f0d", - "0xcd21419563c765aad45b01547db78474bac0b5a5c9598ae1dd039405201b46cc", - "0x2636c723e4b0313d34aacb26a0c7d73dd94ed5f08ae04281a362b14207b628e2", - "0x111fd987a5f671f7884a8783e2bebd8e1cc22bf533d05e0441bdfd228b345717", - "0xdccacd8bd107e69fd2d2c1a05f9bcc65811815f152e9f33ac433517436067435", - "0xa9c9a42a7e408bc6103693f019c44cf312f2b867b87abdceb95d900885156c7e", - "0x64a54e2bec44cafadb050f8cad94de6f390cd69c6f8f8bf7fca200a1d0e859cf", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x8d0B183B68cc93b9f9E1490c85B4A4965ef5Cd3b": { - "beneficiary": "0x8d0B183B68cc93b9f9E1490c85B4A4965ef5Cd3b", - "amount": "5606665118928750576823867", - "proof": [ - "0x18468b227a7eca3700c772635d3bb9f0c94db4cfc8ae864b27785b016b81eb86", - "0x5da792989cf5963bdc6f616fca7817330b3f36ce46864ed3edb93e1c6cc97cca", - "0xaaeb00bed52b9d925f1203df43f78fc3e6c0f32905f6b525282b6933f95c1789", - "0x8440e0d75827386a44bdad4b2918630de84d85dfe4ceb48cffc7b6440d64b8d2", - "0x59579fcafd7366cb9d52ae4c94f27332a10e08b985ba36d2846a772392ce0e75", - "0x56e2c6ad067fe01f6532e8274c819527bbc22e3d1a23f010e171e6616d445529", - "0x5edc99efd052e87ec503dc802fa8b259d16a891b72bc9ac38d7bc6d7b6f2552e", - "0x64a54e2bec44cafadb050f8cad94de6f390cd69c6f8f8bf7fca200a1d0e859cf", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x913fC1644376dA7e125cBb87a010e7Dd3b34D67c": { - "beneficiary": "0x913fC1644376dA7e125cBb87a010e7Dd3b34D67c", - "amount": "32156665369295234238120", - "proof": [ - "0x61dc9cda6e39430241a581acf28aff9fa1e59dfe5eb23421f091efe553328f29", - "0x3bec8905719afd60e98cf82818723b45e6dcaf8079450b370ad166c4212ba00f", - "0xf9b57c1951dfbf293193b50bf24af02d2d09c43d662e743c9fb018b7ad3af2ea", - "0x8480db728010621a6968b7aa3634f14b1865f27ddec19c5d9479b58ed9b93f2f", - "0x0c99d2be5d1dbc03058e95802f469f1f3a0ebd66724ffe9b43624f26e1d9ab49", - "0xdccacd8bd107e69fd2d2c1a05f9bcc65811815f152e9f33ac433517436067435", - "0xa9c9a42a7e408bc6103693f019c44cf312f2b867b87abdceb95d900885156c7e", - "0x64a54e2bec44cafadb050f8cad94de6f390cd69c6f8f8bf7fca200a1d0e859cf", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x93EC08943257DC1abeFb46875C7AAF92aeE0ecC6": { - "beneficiary": "0x93EC08943257DC1abeFb46875C7AAF92aeE0ecC6", - "amount": "20983979982532071001248363", - "proof": [ - "0x114f9a8607e04dd1467e01c006e856724850596c2362681d9dac9799f8e71743", - "0x442ff12e11e945657f0ec6f1c082bd163acb92712856654696b491433898b76e", - "0x8bca85e7e99b46a34b8e46abc4c002ac730b9a980ef52d5c0f92c967c38b7d96", - "0x81e6adfcd37f44c1b0d192e02239acfdaa6943691bce8c4f017c99a8c59c17a7", - "0x59579fcafd7366cb9d52ae4c94f27332a10e08b985ba36d2846a772392ce0e75", - "0x56e2c6ad067fe01f6532e8274c819527bbc22e3d1a23f010e171e6616d445529", - "0x5edc99efd052e87ec503dc802fa8b259d16a891b72bc9ac38d7bc6d7b6f2552e", - "0x64a54e2bec44cafadb050f8cad94de6f390cd69c6f8f8bf7fca200a1d0e859cf", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x956a3999F4b9F9E4E46B96418121D4871082552A": { - "beneficiary": "0x956a3999F4b9F9E4E46B96418121D4871082552A", - "amount": "58794363250810819868269", - "proof": [ - "0xe9bcc3b4103639383ec902ec9c4cc07e2933f20138f7c73129e846acc7181040", - "0xf2fc9d2c97054a786c02923f8acab9038b0ddd8daac195998bb9e88b70491efa", - "0x587d0e9f4f3b1121f7066b827323a7df794a2089782fc9769cab118f4a9c32f0", - "0xc590ad1b557e905ed766a2bd82993040517c1d8f828e67aff3a525f0a517e61b", - "0x0c126623518999de3f92b4a74e8cae9a113108254527d72d813d7e518009dd3c", - "0x22e1c098b7010d0cf32500ff774c2cb716f2a4797330e1b587bc650ded67c423", - "0x26d3258cdc1fc284a0d39b0082465afa7e9cfb3bad44bea5374d722bdb514d7f", - "0xe88bf217a61ba2f61cf5c969f3d4f4e916964ce659327135fdd0be2e7c72ee73", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x969DE568df4cec02e682acf75d7ED9F048de3AbA": { - "beneficiary": "0x969DE568df4cec02e682acf75d7ED9F048de3AbA", - "amount": "129741661841805741469974", - "proof": [ - "0x5c534393f75aad73f6ecbbfa9f0c5e9dfe60cc47f13d649db86d11d051cfb1b3", - "0x5ae6aa3bf87b71a3b3321ad33b6af54abc4bda93b86f11432e6800381d54050a", - "0xef535b2ff4fcea89acbf67534166da85ab154c659b4e2848dd95abdb87090654", - "0xd2ea19db53b4fc2b4b69c5c7337ab4b3eeb8e32ad07e477402839a2d22673a61", - "0x01add4a2b7c01143892ca3fbd9ac6e2d294563bf8fe1296e127a7f43ce54824c", - "0x062359f2025ff77d930f8f91e829b67beffb93b49ac378457b370c7980b2fc73", - "0xa9c9a42a7e408bc6103693f019c44cf312f2b867b87abdceb95d900885156c7e", - "0x64a54e2bec44cafadb050f8cad94de6f390cd69c6f8f8bf7fca200a1d0e859cf", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x9709173Ed6F194a953a77204359DbFD0e88a54D0": { - "beneficiary": "0x9709173Ed6F194a953a77204359DbFD0e88a54D0", - "amount": "244082381612326173512660", - "proof": [ - "0x7b671c839b5ec6e1e829d9e208a7b06f2a9b76f2ac04cbcf318a32d341f46224", - "0x95a40bfb62f83cc1db638bd41e73f0a220059eb6a80f4c6f62ab96ba07597d63", - "0xbc8bbd3bf840accfe3028f77db7ff9d42c92b810abdacce3210a0eab351623fa", - "0xeab42a7f7084e021a91d743173e7d8d1a35b408ed9f715b7f36249a621338a21", - "0x8ba5b958e3d50463abb92bcbd342d11326e4d7c366ee018c2d461fbb1df561b5", - "0x68dbcd1cbf24dfe8761794f995bcb03a39b7b92828d8898f64ee8ee429e9eb95", - "0x0616b8a8fdf6a22d755f3735640770bdb2f6e7df4a6e1b23ed3647e9c3778bf6", - "0xe88bf217a61ba2f61cf5c969f3d4f4e916964ce659327135fdd0be2e7c72ee73", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x9767795d399E86fCc0F600dB6F302F5C0692e0cF": { - "beneficiary": "0x8b055ac1c4dd287E2a46D4a52d61FE76FB551bD0", - "amount": "1823368795533663554086737", - "proof": [ - "0xe995b3136c74c6b61fdbc4023ad9da7adf42c727423e6c5c0beeb39d1ced49a8", - "0x4af20ff56ca577f653fad31bdfd609dc92767bf6d05bac0e62dd62fc54fa253c", - "0x587d0e9f4f3b1121f7066b827323a7df794a2089782fc9769cab118f4a9c32f0", - "0xc590ad1b557e905ed766a2bd82993040517c1d8f828e67aff3a525f0a517e61b", - "0x0c126623518999de3f92b4a74e8cae9a113108254527d72d813d7e518009dd3c", - "0x22e1c098b7010d0cf32500ff774c2cb716f2a4797330e1b587bc650ded67c423", - "0x26d3258cdc1fc284a0d39b0082465afa7e9cfb3bad44bea5374d722bdb514d7f", - "0xe88bf217a61ba2f61cf5c969f3d4f4e916964ce659327135fdd0be2e7c72ee73", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x9919C9f5CbBAA42CB3bEA153E14E16F85fEA5b5D": { - "beneficiary": "0x9919C9f5CbBAA42CB3bEA153E14E16F85fEA5b5D", - "amount": "1140270451336948331052897", - "proof": [ - "0x47d0fb7b64a918d7ecb2e3875949d80bf91d3f959c059a0b18e1fec22b1632e7", - "0x7cd05cb74d958b06be9f9b5b40c270342ccc68b84c6a6585bfb730374c7a91b4", - "0x64672ed0234009a704f607178ffa0f8075aa32ba2d1bfccaeb4c240165175042", - "0x415ffea8e37ea074902c88356b1cda00766d9d007bfeafa3b419755ff21c4b40", - "0x2aa934f8f4fd48015f3837e029a329df9889527199e2ec1ae6ebe99d0bb412b0", - "0x062359f2025ff77d930f8f91e829b67beffb93b49ac378457b370c7980b2fc73", - "0xa9c9a42a7e408bc6103693f019c44cf312f2b867b87abdceb95d900885156c7e", - "0x64a54e2bec44cafadb050f8cad94de6f390cd69c6f8f8bf7fca200a1d0e859cf", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x99997edFDA5580d32F470cb9db82898169EeeDaa": { - "beneficiary": "0x99997edFDA5580d32F470cb9db82898169EeeDaa", - "amount": "24291944883757553938353", - "proof": [ - "0xe4ad1e3b0c14bb8d9f3083140c449f5208ace41311acce880c2d48ac65d9c07c", - "0x117ed41e3b1d06a464e0acfa1a53d5e9327593baab14363dc98af9950ad77770", - "0x374dd84638a2a3636a82f1150c48f186293928c4491d9d2515966ffe82017628", - "0xa49f8baaa05c9a49015d13c2cb5a475342d4cb3ba2a697b0667d22289fefe496", - "0x2b33811bfbf525e09903057070381317c6e8580a978357fafa1f43ff94acc3cc", - "0x22e1c098b7010d0cf32500ff774c2cb716f2a4797330e1b587bc650ded67c423", - "0x26d3258cdc1fc284a0d39b0082465afa7e9cfb3bad44bea5374d722bdb514d7f", - "0xe88bf217a61ba2f61cf5c969f3d4f4e916964ce659327135fdd0be2e7c72ee73", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x9Af604deA9cC90da70cA242B8B2F577BfF23c2c8": { - "beneficiary": "0x738e68cCF1B64D6fdF5a165eFe3149B712fF2e62", - "amount": "14876443400249682020050", - "proof": [ - "0x44515fe80de49063ff707f6471c9e46a8043a9289df39fcfa8249979830b141e", - "0xe9585d509b3d13830d0c95ab6526a3d7bd2b70289190507d9968344d72fe856e", - "0x0d1317bfede4b34dc2ab4a555179e25432816cfd8da26a6c597311119308eb29", - "0x39c2e82a79487da27ef5d8d6b31b3efb47564973a96a7f009a59ff3eee98e3d7", - "0x2aa934f8f4fd48015f3837e029a329df9889527199e2ec1ae6ebe99d0bb412b0", - "0x062359f2025ff77d930f8f91e829b67beffb93b49ac378457b370c7980b2fc73", - "0xa9c9a42a7e408bc6103693f019c44cf312f2b867b87abdceb95d900885156c7e", - "0x64a54e2bec44cafadb050f8cad94de6f390cd69c6f8f8bf7fca200a1d0e859cf", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x9B50Ef882CD1c08c0ae07EC68f69013e94cAA782": { - "beneficiary": "0x9B50Ef882CD1c08c0ae07EC68f69013e94cAA782", - "amount": "159669209635843418834006", - "proof": [ - "0x2007d4dd6e350686e90ee951e3793ff4def59ddfdd2f350734ae0d3cb888237a", - "0x70de7bb6098ed6026073cbe572610aaacd6d50dc181ba81389cee005ef5c04f6", - "0xde616a8e64bec6de1b5d50337791cbe0ce0170f85a24dc66af7e637234bbc77d", - "0xb768182dd2461f99365ec7ced124a86de6fe4d11bb77982ecd01f09400501e52", - "0xaf418cbc46d36f44acd10c35eff28186de90897d89719daa90ec8ad8f09b67b2", - "0x473f914d1f1ccc5b8b5de95bc12121123181242ea06fff9c8508a358398163b5", - "0x5edc99efd052e87ec503dc802fa8b259d16a891b72bc9ac38d7bc6d7b6f2552e", - "0x64a54e2bec44cafadb050f8cad94de6f390cd69c6f8f8bf7fca200a1d0e859cf", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x9b911649c6465e1F32D9b5465DCd34A395763C72": { - "beneficiary": "0x9b911649c6465e1F32D9b5465DCd34A395763C72", - "amount": "6135958631987749589748", - "proof": [ - "0xb4dc0c9f69197a7012a6658021efe0cc572b3053c0fa23167f27d0600b7c4553", - "0x9922d48a0bed2a2e3eab8cf776e755689b37be0568e4698785263f815c499ffc", - "0x52737961fc571d488330ffc563e960be948184ef4c4b65007117df97db388d06", - "0xe8725478de68bb2f70f03cdae0b58fb5de3d665ba62705d4d326ed9b5c097b79", - "0xc93e047f67535414778dfc6856cfd4414899e769239825a687683ea6a63e3e10", - "0x0051d7a32a1cc939dea0060ee90745718a7b84019b2411e1b966c49089e00273", - "0x0616b8a8fdf6a22d755f3735640770bdb2f6e7df4a6e1b23ed3647e9c3778bf6", - "0xe88bf217a61ba2f61cf5c969f3d4f4e916964ce659327135fdd0be2e7c72ee73", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x9C7c2B00Ea7800fbe32FD50d844645Db07C27a74": { - "beneficiary": "0x9C7c2B00Ea7800fbe32FD50d844645Db07C27a74", - "amount": "147595763341574936964337", - "proof": [ - "0xd306eea6eaa54bb7e8738697052dc09d2b8eb5ccd1ba012421aa5563eb8ea505", - "0xa54c2a140d8d720a17d191dca93f34778929e8a2a2790ff31bef8c0029a5c771", - "0x38f20aebf7710d3da6781cf3270423d9d3e412dc4aacce73b21f02aff8b94d62", - "0x8ae93be8304ef13b7e153cfe03598869b3fe1e0c5405174fd8150ee7c3c37df7", - "0xa66a31c956515e2b9d52e14019df281b7b65cb788fe21437b8ddacc320e2517e", - "0x97d9146e9833b3fdeba7c55987d17f362c03e476d0731aa6eda14684628e6b80", - "0x26d3258cdc1fc284a0d39b0082465afa7e9cfb3bad44bea5374d722bdb514d7f", - "0xe88bf217a61ba2f61cf5c969f3d4f4e916964ce659327135fdd0be2e7c72ee73", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x9F615eB8a55d8C23b2b5d38B16bD1c1B0fBC331A": { - "beneficiary": "0x9F615eB8a55d8C23b2b5d38B16bD1c1B0fBC331A", - "amount": "10063123427240178369827388", - "proof": [ - "0x5040599227736aaca0a510a2aff43e5aecc2fef9b2a7bcd7b54b6efb2065acf7", - "0xd5b655ac2f3bcaab1c975653acfaa8d14c9528faf6f4c809e7be9e74a5644985", - "0x0d85cbb20a66984e7ea0d073edbbdd831f6c4e07ad01f67df4cc56efa7a01052", - "0x195bb1e416a9464545527432ff9ea60c3e6383f802a3808a4151e24087c7c24b", - "0x01add4a2b7c01143892ca3fbd9ac6e2d294563bf8fe1296e127a7f43ce54824c", - "0x062359f2025ff77d930f8f91e829b67beffb93b49ac378457b370c7980b2fc73", - "0xa9c9a42a7e408bc6103693f019c44cf312f2b867b87abdceb95d900885156c7e", - "0x64a54e2bec44cafadb050f8cad94de6f390cd69c6f8f8bf7fca200a1d0e859cf", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x9F8Cc80D7F5125AD725293686Ac656a7c52f6F11": { - "beneficiary": "0x2dA47Fc911d817669e7A99a6f9AFD7EbBB8edd19", - "amount": "456978936596279711510364", - "proof": [ - "0xb702ea5bdc00438cf25cc2b521845bda0281844af0cb58dfeefdbfcf339c751f", - "0x9e8f667a34c847f97e4342a1d15027d53bbdd1a2672e4f723ccb92c460e30847", - "0x3f3d7c9d71f69628bc227b472d3a972115ced96bce6647491a6aef22dbe8410c", - "0xe8725478de68bb2f70f03cdae0b58fb5de3d665ba62705d4d326ed9b5c097b79", - "0xc93e047f67535414778dfc6856cfd4414899e769239825a687683ea6a63e3e10", - "0x0051d7a32a1cc939dea0060ee90745718a7b84019b2411e1b966c49089e00273", - "0x0616b8a8fdf6a22d755f3735640770bdb2f6e7df4a6e1b23ed3647e9c3778bf6", - "0xe88bf217a61ba2f61cf5c969f3d4f4e916964ce659327135fdd0be2e7c72ee73", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0xa2e44666BAB3ED3be4F87b7c18eD2ffB911c0bEf": { - "beneficiary": "0xa2e44666BAB3ED3be4F87b7c18eD2ffB911c0bEf", - "amount": "693792901763934804124154", - "proof": [ - "0xb06071415c0776c938fa1afb49f70c82641a25a5daa28acc8b2593ebe6b4225c", - "0x3d54958737b9c33e06b9893d10602a79535ebacbe662a6a7ec4260e85324f43f", - "0xd469028315cc5dcbcd4636e77c5d1bb3741a41dcd5d84359e167fe06a089770e", - "0x7f1c6ca19ff3cad4f632f6e3686736e3e262e7581772ab7d210d2cd01fd6a7c8", - "0xc93e047f67535414778dfc6856cfd4414899e769239825a687683ea6a63e3e10", - "0x0051d7a32a1cc939dea0060ee90745718a7b84019b2411e1b966c49089e00273", - "0x0616b8a8fdf6a22d755f3735640770bdb2f6e7df4a6e1b23ed3647e9c3778bf6", - "0xe88bf217a61ba2f61cf5c969f3d4f4e916964ce659327135fdd0be2e7c72ee73", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0xA4166C3E14cbDd6D4494945A99616f1C73aD9699": { - "beneficiary": "0xbCdffff120C4e2f1199317A9448e99Eb02771496", - "amount": "103530643653046283815069", - "proof": [ - "0x0273c20a933481f786b1b2a9b4fa2e5002359b4317071edadca788a5d7e0dda5", - "0x733be643477f4dee85ddad2511e30f4a7aadf4d5031e198440d405931b7329a8", - "0x409d28f2187aa20196f7e88689dfe27d40d76efa9726b55b953b5eaed00166a0", - "0x4c5007a8d6e515ed558b22a1e3df53f27975e71b334407ce8c34529d3336513b", - "0xde4d448a9d734de96d9aad546aff27580bbca08f960e04097175f5f07e34f665", - "0x56e2c6ad067fe01f6532e8274c819527bbc22e3d1a23f010e171e6616d445529", - "0x5edc99efd052e87ec503dc802fa8b259d16a891b72bc9ac38d7bc6d7b6f2552e", - "0x64a54e2bec44cafadb050f8cad94de6f390cd69c6f8f8bf7fca200a1d0e859cf", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0xa5a2a83a5e229e84423dD18e3b30f36fe5251340": { - "beneficiary": "0xdE838879444d5825d46e62700107F459298fD05E", - "amount": "19315689980438549211817", - "proof": [ - "0xcae7e6ddc81abb0c0d6a1b709a7f958da75d26cdb2b64572781cae3441c90af7", - "0x3eba2c9647b080367924c8ba757a3b3bfd3361084f361ed5c83873a161495471", - "0xda5bc1b52ee4e176a2b5b47730aad20d7eae55bd368950063bd03bf13d5a53aa", - "0x8ae93be8304ef13b7e153cfe03598869b3fe1e0c5405174fd8150ee7c3c37df7", - "0xa66a31c956515e2b9d52e14019df281b7b65cb788fe21437b8ddacc320e2517e", - "0x97d9146e9833b3fdeba7c55987d17f362c03e476d0731aa6eda14684628e6b80", - "0x26d3258cdc1fc284a0d39b0082465afa7e9cfb3bad44bea5374d722bdb514d7f", - "0xe88bf217a61ba2f61cf5c969f3d4f4e916964ce659327135fdd0be2e7c72ee73", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0xA5f6822ef1A7DF72628259f9D1dc17eb2BCb2385": { - "beneficiary": "0x9bC8d30d971C9e74298112803036C05db07D73e3", - "amount": "256427394711504393221503", - "proof": [ - "0x446bf5ca2857bd1f49763ef5fb8f242f6f787963dd6507bb1d6e1ad1534891b3", - "0xa02bfc200112b5dacf87f53442da990e098c6b9b3fcf0d0f03beecb904427fc1", - "0x64672ed0234009a704f607178ffa0f8075aa32ba2d1bfccaeb4c240165175042", - "0x415ffea8e37ea074902c88356b1cda00766d9d007bfeafa3b419755ff21c4b40", - "0x2aa934f8f4fd48015f3837e029a329df9889527199e2ec1ae6ebe99d0bb412b0", - "0x062359f2025ff77d930f8f91e829b67beffb93b49ac378457b370c7980b2fc73", - "0xa9c9a42a7e408bc6103693f019c44cf312f2b867b87abdceb95d900885156c7e", - "0x64a54e2bec44cafadb050f8cad94de6f390cd69c6f8f8bf7fca200a1d0e859cf", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0xA6A2aE15F74F1e3f574F419a8853f0c9B095bc48": { - "beneficiary": "0xA6A2aE15F74F1e3f574F419a8853f0c9B095bc48", - "amount": "3959387573172254325450441", - "proof": [ - "0x3444d2b04d4a8932d5cee88b0f369531abb42004bba913ad2cb07922b944f259", - "0xbea9c9f2ed6efaf2f3345e7a9522682357322f6a3bdac3939c676319fb9081e3", - "0x81bc7e084da1245e86d4838075158c2ca1e8b55c58b230150b2b27f3bd6819c6", - "0xa4c592d588cd922c6de1781284770256d4729b6287bdc700b97a2c852ff88d0f", - "0x9065ab73e0639a7701ce0c7ea4d24dc3a352eaf86d04cfe535ea8b3b19f43923", - "0x473f914d1f1ccc5b8b5de95bc12121123181242ea06fff9c8508a358398163b5", - "0x5edc99efd052e87ec503dc802fa8b259d16a891b72bc9ac38d7bc6d7b6f2552e", - "0x64a54e2bec44cafadb050f8cad94de6f390cd69c6f8f8bf7fca200a1d0e859cf", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0xa7baCa5A92842689359Fb1782e75D6eFF59152e6": { - "beneficiary": "0x71596327C075Fa2e9ae820c1036D8d9B94bf6AE2", - "amount": "4715997776156330333172568", - "proof": [ - "0x3b42ab47263d1951840cf7043bca0e83b162f6565c1f678c1d0746bb93d52c7b", - "0x5725e9905d2285497682068979c922227433e6d92ab7e149a5311d20e981227e", - "0x367ed10aa31c53c2f7ab417139c6060d5de223aeb60b78fbfc5687a74b48c391", - "0xa4c592d588cd922c6de1781284770256d4729b6287bdc700b97a2c852ff88d0f", - "0x9065ab73e0639a7701ce0c7ea4d24dc3a352eaf86d04cfe535ea8b3b19f43923", - "0x473f914d1f1ccc5b8b5de95bc12121123181242ea06fff9c8508a358398163b5", - "0x5edc99efd052e87ec503dc802fa8b259d16a891b72bc9ac38d7bc6d7b6f2552e", - "0x64a54e2bec44cafadb050f8cad94de6f390cd69c6f8f8bf7fca200a1d0e859cf", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0xA829c2E33907Ab03d27d5dBb39eFFd8386112789": { - "beneficiary": "0xA829c2E33907Ab03d27d5dBb39eFFd8386112789", - "amount": "1698701504305317448431724", - "proof": [ - "0x899eccee3b0a90dac8d0d89a0bb4fd3add609a7104517b8e4335b13797f43ff0", - "0xe5c52839f369296dfcce8315eae477810a255c61b33bd94eecc6a42ff4e553c4", - "0x9be544b29d6b0c3b286ba9d45fde21291f9fb32a1867dea2c0d25c557d1c004f", - "0x194ef47b96e0a314e70a2b8ce7439810c6bdee32118026f58b3ecf62e628911f", - "0x8ba5b958e3d50463abb92bcbd342d11326e4d7c366ee018c2d461fbb1df561b5", - "0x68dbcd1cbf24dfe8761794f995bcb03a39b7b92828d8898f64ee8ee429e9eb95", - "0x0616b8a8fdf6a22d755f3735640770bdb2f6e7df4a6e1b23ed3647e9c3778bf6", - "0xe88bf217a61ba2f61cf5c969f3d4f4e916964ce659327135fdd0be2e7c72ee73", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0xAAFc71044C2B832dDDFcedb0AE99695B0367dC57": { - "beneficiary": "0x6950c4C7E97c7d2e6b5bffEC4634f841DB2A5f3D", - "amount": "19973628274052348518332765", - "proof": [ - "0xc15bf731ebcf82b43569051732d9b26239206e413eaf765c7869cafa1f0584fc", - "0x411cb569ab7b97cf9964902b0a1fe62d7166fa2895fac3f1e2e4471e8693b9e6", - "0x39b4a530ba57d463674facbaf8187b67879856a3dd362d8b3b9e155d18137146", - "0x071de73c7fdc53109dd4ff69b8fb3b2621edb92a109a6fc37c6481cb671605de", - "0x59a158af3ffa2849a033594affad303fb5e11aeecbdde0a878c909168e58d612", - "0x97d9146e9833b3fdeba7c55987d17f362c03e476d0731aa6eda14684628e6b80", - "0x26d3258cdc1fc284a0d39b0082465afa7e9cfb3bad44bea5374d722bdb514d7f", - "0xe88bf217a61ba2f61cf5c969f3d4f4e916964ce659327135fdd0be2e7c72ee73", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0xACAf9ED03045BE08e7B1CB4fFEA8A7F87aE73e25": { - "beneficiary": "0xACAf9ED03045BE08e7B1CB4fFEA8A7F87aE73e25", - "amount": "87041565563029840738773", - "proof": [ - "0x21565bcbe3d3440329aba174f49aac112383188651b993b64a466179494875ca", - "0x659f7778982d717b2be4038b524772ae6ac57828a32c12b20b8e46f6b6320ba5", - "0x973066e1e952aefb1059979f63e0cf94217cfadb4a6b8d31289bd65a36e64277", - "0xb768182dd2461f99365ec7ced124a86de6fe4d11bb77982ecd01f09400501e52", - "0xaf418cbc46d36f44acd10c35eff28186de90897d89719daa90ec8ad8f09b67b2", - "0x473f914d1f1ccc5b8b5de95bc12121123181242ea06fff9c8508a358398163b5", - "0x5edc99efd052e87ec503dc802fa8b259d16a891b72bc9ac38d7bc6d7b6f2552e", - "0x64a54e2bec44cafadb050f8cad94de6f390cd69c6f8f8bf7fca200a1d0e859cf", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0xaEa619D02dcF7299FB24dB2F60A08BFC8FB2dbcf": { - "beneficiary": "0xbCdffff120C4e2f1199317A9448e99Eb02771496", - "amount": "103530643653046283815069", - "proof": [ - "0xd960e041274090b517dd87381eec308421a02c543ad665e7cabe09a6aa19a80d", - "0xe4b4bafb44dc02bae3d893ba78600406340da5d79aaecffd3050488d5c634c0c", - "0xc7402bdfbb1133115f7b63033ec3bdf028ef7b9e89e84ef195e6a3e2ee3bf9c8", - "0xbee8645048977858a49c6a102da3ab08464842ef912df9d4e292488756727cbd", - "0xa66a31c956515e2b9d52e14019df281b7b65cb788fe21437b8ddacc320e2517e", - "0x97d9146e9833b3fdeba7c55987d17f362c03e476d0731aa6eda14684628e6b80", - "0x26d3258cdc1fc284a0d39b0082465afa7e9cfb3bad44bea5374d722bdb514d7f", - "0xe88bf217a61ba2f61cf5c969f3d4f4e916964ce659327135fdd0be2e7c72ee73", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0xb011b6794F271B1d8D2328eDf332535343CB4D44": { - "beneficiary": "0xb011b6794F271B1d8D2328eDf332535343CB4D44", - "amount": "150403837878384003359484", - "proof": [ - "0x76bcb887a74a57a872ae380a64541620fd43c51d8237216cd5d8be31c4f6ef92", - "0x11091b50d697b3cea2618d4354aa643240b01612022bd864e387ce33081cd15b", - "0xd17bf33ca03d1f640d5bf18c7a64e6c89bae082d2feda4a735e7a087a68f85fd", - "0x75ed9565771fe8626b6ab84659ab178488320535301f990b32008cb8d6ffbf58", - "0x111fd987a5f671f7884a8783e2bebd8e1cc22bf533d05e0441bdfd228b345717", - "0xdccacd8bd107e69fd2d2c1a05f9bcc65811815f152e9f33ac433517436067435", - "0xa9c9a42a7e408bc6103693f019c44cf312f2b867b87abdceb95d900885156c7e", - "0x64a54e2bec44cafadb050f8cad94de6f390cd69c6f8f8bf7fca200a1d0e859cf", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0xb0151D256ee16d847F080691C3529F316b2D54b3": { - "beneficiary": "0xb0151D256ee16d847F080691C3529F316b2D54b3", - "amount": "14452693929993489797765", - "proof": [ - "0x150675a9a591b84a7a4e4e8edccfb2ea61b6af7dfbba354d7c394fd8deb351d7", - "0x9522ecf19dea0e5bb7ffb7923722d2cda2f5dfe7c09f2c39838ecbd873d02966", - "0x2536cb3d4c792ff51ebbbe47b81a1bc64d310ec892ecf7535f57b19d45b59aec", - "0x8440e0d75827386a44bdad4b2918630de84d85dfe4ceb48cffc7b6440d64b8d2", - "0x59579fcafd7366cb9d52ae4c94f27332a10e08b985ba36d2846a772392ce0e75", - "0x56e2c6ad067fe01f6532e8274c819527bbc22e3d1a23f010e171e6616d445529", - "0x5edc99efd052e87ec503dc802fa8b259d16a891b72bc9ac38d7bc6d7b6f2552e", - "0x64a54e2bec44cafadb050f8cad94de6f390cd69c6f8f8bf7fca200a1d0e859cf", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0xB04FcDF9327f65AB0107Ea95b78BB200C07FA752": { - "beneficiary": "0xB04FcDF9327f65AB0107Ea95b78BB200C07FA752", - "amount": "9255143298287647729248767", - "proof": [ - "0x1f6a89400062d9dd433c926e8a158c3934740e8f40bc0c533f8d904bcb8aa0e8", - "0x02c4fc7f0d72d338a6e802336babd05bb434f00d8b9a15048dd6f545c2e75b1d", - "0xde616a8e64bec6de1b5d50337791cbe0ce0170f85a24dc66af7e637234bbc77d", - "0xb768182dd2461f99365ec7ced124a86de6fe4d11bb77982ecd01f09400501e52", - "0xaf418cbc46d36f44acd10c35eff28186de90897d89719daa90ec8ad8f09b67b2", - "0x473f914d1f1ccc5b8b5de95bc12121123181242ea06fff9c8508a358398163b5", - "0x5edc99efd052e87ec503dc802fa8b259d16a891b72bc9ac38d7bc6d7b6f2552e", - "0x64a54e2bec44cafadb050f8cad94de6f390cd69c6f8f8bf7fca200a1d0e859cf", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0xb260931b73b0C9E7e408be744B290A6806580892": { - "beneficiary": "0xc0d6E904ADf6A55511B67907B0917D769F38c5Dd", - "amount": "648447424504385785516664", - "proof": [ - "0x56c162d4816bfa08bcd5b92fe44450cd9fd3718ac48f7ba3e34663dd34ee6775", - "0x2e76aa9e893447a7def5f07a45c1aa8c0200ad4b1f3f9e88235387e8804004a1", - "0xbabfec64d5720d4e9e78f58b00b56aa86f1ea2b5129ca4db0c315adcedaab965", - "0xd2ea19db53b4fc2b4b69c5c7337ab4b3eeb8e32ad07e477402839a2d22673a61", - "0x01add4a2b7c01143892ca3fbd9ac6e2d294563bf8fe1296e127a7f43ce54824c", - "0x062359f2025ff77d930f8f91e829b67beffb93b49ac378457b370c7980b2fc73", - "0xa9c9a42a7e408bc6103693f019c44cf312f2b867b87abdceb95d900885156c7e", - "0x64a54e2bec44cafadb050f8cad94de6f390cd69c6f8f8bf7fca200a1d0e859cf", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0xB55DA62EDb32D914eF5E08B622aF5567b8620e43": { - "beneficiary": "0xB55DA62EDb32D914eF5E08B622aF5567b8620e43", - "amount": "12342607813708149626355", - "proof": [ - "0x722442c725d6cd1216c7e34e0dcbdd8cbada10592727822021ea9f5e761200d6", - "0x66b3ef3defd8105ad9f76781fa45f10021742152be7af549ae6d8119bb27ad8a", - "0x02e26529c74d0e96999098660fb96d10e16e8f4b21b426cebfd43ccf388efcd0", - "0x75ed9565771fe8626b6ab84659ab178488320535301f990b32008cb8d6ffbf58", - "0x111fd987a5f671f7884a8783e2bebd8e1cc22bf533d05e0441bdfd228b345717", - "0xdccacd8bd107e69fd2d2c1a05f9bcc65811815f152e9f33ac433517436067435", - "0xa9c9a42a7e408bc6103693f019c44cf312f2b867b87abdceb95d900885156c7e", - "0x64a54e2bec44cafadb050f8cad94de6f390cd69c6f8f8bf7fca200a1d0e859cf", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0xb70AA6A5E459bEc8F56a36727B97B1D4277437F7": { - "beneficiary": "0xb70AA6A5E459bEc8F56a36727B97B1D4277437F7", - "amount": "513270699493389927315146", - "proof": [ - "0x00bdcc9edf0e828f899277322e3b016da93ef08d0508c55871cec244eb967c7e", - "0x6e0efa05d1e3e5a104c7be5caed5aeba8893ccb899827a968b5f1aede976e0de", - "0x3a3475312892ff2f8bc9b732274d6c756387fcecb200614270a377eb2634e436", - "0x4c5007a8d6e515ed558b22a1e3df53f27975e71b334407ce8c34529d3336513b", - "0xde4d448a9d734de96d9aad546aff27580bbca08f960e04097175f5f07e34f665", - "0x56e2c6ad067fe01f6532e8274c819527bbc22e3d1a23f010e171e6616d445529", - "0x5edc99efd052e87ec503dc802fa8b259d16a891b72bc9ac38d7bc6d7b6f2552e", - "0x64a54e2bec44cafadb050f8cad94de6f390cd69c6f8f8bf7fca200a1d0e859cf", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0xb70c8D55D397aA5d76f96c64b3E4084DB95c739E": { - "beneficiary": "0xb70c8D55D397aA5d76f96c64b3E4084DB95c739E", - "amount": "1494348460498122238129028", - "proof": [ - "0x8c027acf4ffa778c5e1e91dbe0a95641015ba3a5283c9aff0b65986f441167f1", - "0x0106b8f812079d4cb2e3efbe1b0334ca94cc689522b57a08d058bf946a720d2c", - "0x9be544b29d6b0c3b286ba9d45fde21291f9fb32a1867dea2c0d25c557d1c004f", - "0x194ef47b96e0a314e70a2b8ce7439810c6bdee32118026f58b3ecf62e628911f", - "0x8ba5b958e3d50463abb92bcbd342d11326e4d7c366ee018c2d461fbb1df561b5", - "0x68dbcd1cbf24dfe8761794f995bcb03a39b7b92828d8898f64ee8ee429e9eb95", - "0x0616b8a8fdf6a22d755f3735640770bdb2f6e7df4a6e1b23ed3647e9c3778bf6", - "0xe88bf217a61ba2f61cf5c969f3d4f4e916964ce659327135fdd0be2e7c72ee73", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0xB78e50576a03E0B2C776d35bAbaC9395fD9e3524": { - "beneficiary": "0xB78e50576a03E0B2C776d35bAbaC9395fD9e3524", - "amount": "993702699104166666666668", - "proof": [ - "0xab3d067c28cca218cbde4aefd0ffa9b8d2dc811f234e8c729329996d19a7a2a5", - "0x3f6c576d8fab79863cb9216ffec9c9138fdb4b6f5d10fd642d8fadaec8e91206", - "0x14a604fd723fbad977e58a30212fed06207ccb02347c83c52e6732f994daaf0d", - "0xf27c91795a530d7278a5dbfe1a56dccc1f214ed024d0ed7b115853a29f7b3f5a", - "0xdaae4d08c4b45294e520ad0f82a9cb506546db0d8fe3ec7c0e13d56d0f8c39d6", - "0x0051d7a32a1cc939dea0060ee90745718a7b84019b2411e1b966c49089e00273", - "0x0616b8a8fdf6a22d755f3735640770bdb2f6e7df4a6e1b23ed3647e9c3778bf6", - "0xe88bf217a61ba2f61cf5c969f3d4f4e916964ce659327135fdd0be2e7c72ee73", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0xb8C1CB376292d21ff1Aa517DECC6157756A69789": { - "beneficiary": "0x2eFbD5eB2d01Ec971c3384cA217ec542932e7AdB", - "amount": "6902042910203085587672", - "proof": [ - "0xfb743d713e2fefa6a21c9e1690f1ac8bc61b0fffb0bc4d9c2cfac0aca2908ef6", - "0xfd5be5dffa076c9910a1e04a91e83a6cddd9c241835c6b232020aaac771aec3c", - "0xb1df75fb8fb0b20c38c83448e01848ccbff4039efb40291cc907eb04faac03ef", - "0x4310adee41342f5a15a53ffbfe9522206c39076254ea7b34d6ea33b6a9398bde" - ] - }, - "0xb8CA929E2Bd96548cABcabC56CFc9A5147cef0ff": { - "beneficiary": "0xb8CA929E2Bd96548cABcabC56CFc9A5147cef0ff", - "amount": "9864484647061722051987", - "proof": [ - "0x743483885c63bc78281a810d6b112d22d668b7d45bf6e595a0320b012baf121f", - "0x11091b50d697b3cea2618d4354aa643240b01612022bd864e387ce33081cd15b", - "0xd17bf33ca03d1f640d5bf18c7a64e6c89bae082d2feda4a735e7a087a68f85fd", - "0x75ed9565771fe8626b6ab84659ab178488320535301f990b32008cb8d6ffbf58", - "0x111fd987a5f671f7884a8783e2bebd8e1cc22bf533d05e0441bdfd228b345717", - "0xdccacd8bd107e69fd2d2c1a05f9bcc65811815f152e9f33ac433517436067435", - "0xa9c9a42a7e408bc6103693f019c44cf312f2b867b87abdceb95d900885156c7e", - "0x64a54e2bec44cafadb050f8cad94de6f390cd69c6f8f8bf7fca200a1d0e859cf", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0xB8Ee380FD71eaCCB4948dd7CEE5B6FCB822Fc4fc": { - "beneficiary": "0xB8Ee380FD71eaCCB4948dd7CEE5B6FCB822Fc4fc", - "amount": "39489552737544177651936", - "proof": [ - "0x43ce73e20eb788542ce06acbe1553b7ee2724ba5a3dbf5b6227c94c8c03cf3dd", - "0xccdfde8d2d1be35ea5c53ec73471d5489ab57e9e758a6083d17a240e8cc73823", - "0x0d1317bfede4b34dc2ab4a555179e25432816cfd8da26a6c597311119308eb29", - "0x39c2e82a79487da27ef5d8d6b31b3efb47564973a96a7f009a59ff3eee98e3d7", - "0x2aa934f8f4fd48015f3837e029a329df9889527199e2ec1ae6ebe99d0bb412b0", - "0x062359f2025ff77d930f8f91e829b67beffb93b49ac378457b370c7980b2fc73", - "0xa9c9a42a7e408bc6103693f019c44cf312f2b867b87abdceb95d900885156c7e", - "0x64a54e2bec44cafadb050f8cad94de6f390cd69c6f8f8bf7fca200a1d0e859cf", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0xB99f5EbC5F61120515F67FbB9aB9693605FbaB06": { - "beneficiary": "0x461aa63A98e6f8BdAa19CA3f2258670E794FFF34", - "amount": "16702158081504272916946024", - "proof": [ - "0x62afcec7bb515ffc77924885474ecbe42285191458c49ff01b8255fbcd2ab8a1", - "0x3bec8905719afd60e98cf82818723b45e6dcaf8079450b370ad166c4212ba00f", - "0xf9b57c1951dfbf293193b50bf24af02d2d09c43d662e743c9fb018b7ad3af2ea", - "0x8480db728010621a6968b7aa3634f14b1865f27ddec19c5d9479b58ed9b93f2f", - "0x0c99d2be5d1dbc03058e95802f469f1f3a0ebd66724ffe9b43624f26e1d9ab49", - "0xdccacd8bd107e69fd2d2c1a05f9bcc65811815f152e9f33ac433517436067435", - "0xa9c9a42a7e408bc6103693f019c44cf312f2b867b87abdceb95d900885156c7e", - "0x64a54e2bec44cafadb050f8cad94de6f390cd69c6f8f8bf7fca200a1d0e859cf", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0xBa03E5e2fD41092c36354435FeFAE25A322AA838": { - "beneficiary": "0xBa03E5e2fD41092c36354435FeFAE25A322AA838", - "amount": "112031252446850758249721", - "proof": [ - "0x5cd8ba07fae7902bf80f62de1051293f8858bb01b9b0945b6ea41647f0c89113", - "0x442f98a434796637bcb0b2d110c4f1ccd54db9521378180322592e025103c2bf", - "0x72bd8f01249b9820f99ef97fbf7f6a7cdd350a3e7a3e5a1089c9b988b87ba7e2", - "0x797edd017f4003c1285ab77462d72a225c5599c94f0de400975080271269fef0", - "0x0c99d2be5d1dbc03058e95802f469f1f3a0ebd66724ffe9b43624f26e1d9ab49", - "0xdccacd8bd107e69fd2d2c1a05f9bcc65811815f152e9f33ac433517436067435", - "0xa9c9a42a7e408bc6103693f019c44cf312f2b867b87abdceb95d900885156c7e", - "0x64a54e2bec44cafadb050f8cad94de6f390cd69c6f8f8bf7fca200a1d0e859cf", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0xba272bd02Ce23a3490B14d6Af5782faa6b5cE0c4": { - "beneficiary": "0xbdA6Ba3Ad624582495C55451A1840e563fc16389", - "amount": "4105973689089318074556173", - "proof": [ - "0xc83040a210c036ced774360324c7434104c5cfd0129a342ad7175df61470a254", - "0xfbb10c034b0fd1f0b0f78110de56b13d67e3ee75cab43fdfec5942c6aa7939d7", - "0xb707eda71755ca61ec5cb9a12abf6ecdfb688d2c5a8bdd3a525e3df7c576b4c3", - "0xde4766412d1ecc2449d097e3b6b2b5bea1d00c24806fe806e0aee38702c19eef", - "0x59a158af3ffa2849a033594affad303fb5e11aeecbdde0a878c909168e58d612", - "0x97d9146e9833b3fdeba7c55987d17f362c03e476d0731aa6eda14684628e6b80", - "0x26d3258cdc1fc284a0d39b0082465afa7e9cfb3bad44bea5374d722bdb514d7f", - "0xe88bf217a61ba2f61cf5c969f3d4f4e916964ce659327135fdd0be2e7c72ee73", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0xBb863b43823A4B01A5526C00a3DE57cc530643c7": { - "beneficiary": "0xBb863b43823A4B01A5526C00a3DE57cc530643c7", - "amount": "311077909739037085684207", - "proof": [ - "0xd86711f38177a58c48b6e0e390dc43098458f055bfeeb5b9b54605a8654fb34e", - "0xab55ead12137ce536119cf1d56cc22470da025262b4843b81154cb2b03b2772e", - "0xc7402bdfbb1133115f7b63033ec3bdf028ef7b9e89e84ef195e6a3e2ee3bf9c8", - "0xbee8645048977858a49c6a102da3ab08464842ef912df9d4e292488756727cbd", - "0xa66a31c956515e2b9d52e14019df281b7b65cb788fe21437b8ddacc320e2517e", - "0x97d9146e9833b3fdeba7c55987d17f362c03e476d0731aa6eda14684628e6b80", - "0x26d3258cdc1fc284a0d39b0082465afa7e9cfb3bad44bea5374d722bdb514d7f", - "0xe88bf217a61ba2f61cf5c969f3d4f4e916964ce659327135fdd0be2e7c72ee73", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0xBe9D12fc853b67CFdaaE134e5B8178B9667bd2fB": { - "beneficiary": "0xbd8089304c78AA865B84870f62c4C43D6f3F34F9", - "amount": "3868964943830247977889210", - "proof": [ - "0xcf29d6edb261153ae4f1c957e3048283a89ade369853e2a410c466ce036edb1d", - "0x22893474698fa0a3cf2b2a276036f6eb93bf3768c189f5c5d6fb0c481c38a8b9", - "0xda5bc1b52ee4e176a2b5b47730aad20d7eae55bd368950063bd03bf13d5a53aa", - "0x8ae93be8304ef13b7e153cfe03598869b3fe1e0c5405174fd8150ee7c3c37df7", - "0xa66a31c956515e2b9d52e14019df281b7b65cb788fe21437b8ddacc320e2517e", - "0x97d9146e9833b3fdeba7c55987d17f362c03e476d0731aa6eda14684628e6b80", - "0x26d3258cdc1fc284a0d39b0082465afa7e9cfb3bad44bea5374d722bdb514d7f", - "0xe88bf217a61ba2f61cf5c969f3d4f4e916964ce659327135fdd0be2e7c72ee73", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0xbeE416E10a873975e2258ddBB85286B8677311E6": { - "beneficiary": "0xbeE416E10a873975e2258ddBB85286B8677311E6", - "amount": "147978719491197059968859", - "proof": [ - "0xdcab5425a21ff061ee392b5e6285e3a434c58931c22d4e301514dbcb52d62e94", - "0xaa993af55b923f77409249a8992c000121f56422c04013a75278fba38fbadd28", - "0x8db0c0a94e75a9e911f330627e557f5d2ef598dd6acb14c7611693655912539e", - "0x5c0e7f3ab44620fd21c2b93779b413a382833d74590f2ee16fb86cc3453a2561", - "0x2b33811bfbf525e09903057070381317c6e8580a978357fafa1f43ff94acc3cc", - "0x22e1c098b7010d0cf32500ff774c2cb716f2a4797330e1b587bc650ded67c423", - "0x26d3258cdc1fc284a0d39b0082465afa7e9cfb3bad44bea5374d722bdb514d7f", - "0xe88bf217a61ba2f61cf5c969f3d4f4e916964ce659327135fdd0be2e7c72ee73", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0xC120Ab7977BdDa3b57F191DBF41A1Af7DA794bAa": { - "beneficiary": "0xC120Ab7977BdDa3b57F191DBF41A1Af7DA794bAa", - "amount": "641879309862242686042462", - "proof": [ - "0x514b970d8970a895905d737c6393d3a3f8b4b4fa9f6092c2a90ea2849dd3c584", - "0xbffcef99057b94c157df6fe076719e17e1d92429c29ab5e0eaf443401c3de467", - "0x228a2482fb9d68fee941f2a2d25527f20eb0a908482483549f9fdefcc5d93f88", - "0x195bb1e416a9464545527432ff9ea60c3e6383f802a3808a4151e24087c7c24b", - "0x01add4a2b7c01143892ca3fbd9ac6e2d294563bf8fe1296e127a7f43ce54824c", - "0x062359f2025ff77d930f8f91e829b67beffb93b49ac378457b370c7980b2fc73", - "0xa9c9a42a7e408bc6103693f019c44cf312f2b867b87abdceb95d900885156c7e", - "0x64a54e2bec44cafadb050f8cad94de6f390cd69c6f8f8bf7fca200a1d0e859cf", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0xC23F4F463c779Dd27c08939dC495b8b35C952c89": { - "beneficiary": "0xC23F4F463c779Dd27c08939dC495b8b35C952c89", - "amount": "29004642752420753766974764", - "proof": [ - "0x9b455da3f1114d740818098747ff46787c748de028aed5d7f6340c00b360c1fa", - "0x9ad32dbf55f5d81e1ff907278e52991cfc54af16dd21ad98eea1338b91c992cd", - "0x08386d2f8bb88fd2e59c782888ffcd6c4e14cfc4af0c16b1147aa7df717d953b", - "0x8e0a201871d267e73e63f23088bd1e9d8c9a8b763ee4dfe53afad4a412370179", - "0xe4b02fad2ca92c21c555a2c6107ae084366477f8bf346a4fc1ddfe404454ce24", - "0x68dbcd1cbf24dfe8761794f995bcb03a39b7b92828d8898f64ee8ee429e9eb95", - "0x0616b8a8fdf6a22d755f3735640770bdb2f6e7df4a6e1b23ed3647e9c3778bf6", - "0xe88bf217a61ba2f61cf5c969f3d4f4e916964ce659327135fdd0be2e7c72ee73", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0xC24CACfAe6E5D0177E294a89486AfdDF2144f20F": { - "beneficiary": "0xC24CACfAe6E5D0177E294a89486AfdDF2144f20F", - "amount": "559907541672718491787568", - "proof": [ - "0x1fcc942732a2d1951ce00a455ec22bf768eb020c8fb6b0517ad795d06ce61a5f", - "0x70de7bb6098ed6026073cbe572610aaacd6d50dc181ba81389cee005ef5c04f6", - "0xde616a8e64bec6de1b5d50337791cbe0ce0170f85a24dc66af7e637234bbc77d", - "0xb768182dd2461f99365ec7ced124a86de6fe4d11bb77982ecd01f09400501e52", - "0xaf418cbc46d36f44acd10c35eff28186de90897d89719daa90ec8ad8f09b67b2", - "0x473f914d1f1ccc5b8b5de95bc12121123181242ea06fff9c8508a358398163b5", - "0x5edc99efd052e87ec503dc802fa8b259d16a891b72bc9ac38d7bc6d7b6f2552e", - "0x64a54e2bec44cafadb050f8cad94de6f390cd69c6f8f8bf7fca200a1d0e859cf", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0xC4f03E31BF9677b4c76315931a2cbCF40C6dB1be": { - "beneficiary": "0xC4f03E31BF9677b4c76315931a2cbCF40C6dB1be", - "amount": "64997812830879468749513887", - "proof": [ - "0xc08761a7263755532e50f7d26d8250e513e7f6dcdb9390507f90496d66cfda13", - "0xf020d056522ab7c188c6113ba4659031d1af7417b9a0bd3cc9ed7de9f777bb2e", - "0x39b4a530ba57d463674facbaf8187b67879856a3dd362d8b3b9e155d18137146", - "0x071de73c7fdc53109dd4ff69b8fb3b2621edb92a109a6fc37c6481cb671605de", - "0x59a158af3ffa2849a033594affad303fb5e11aeecbdde0a878c909168e58d612", - "0x97d9146e9833b3fdeba7c55987d17f362c03e476d0731aa6eda14684628e6b80", - "0x26d3258cdc1fc284a0d39b0082465afa7e9cfb3bad44bea5374d722bdb514d7f", - "0xe88bf217a61ba2f61cf5c969f3d4f4e916964ce659327135fdd0be2e7c72ee73", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0xc5795fa1EADF77FCDa0C6D9F9B340D634C2ba546": { - "beneficiary": "0x8b055ac1c4dd287E2a46D4a52d61FE76FB551bD0", - "amount": "1828529421504135222064256", - "proof": [ - "0x72d33c17af5220cabfae5dea2befcc2671908e5a4a2f579c46c07f049e0db559", - "0xe7073afb54ea4026c3737e77391dff92914f5c1507eb6b19fad2ed921a4f5231", - "0xd17bf33ca03d1f640d5bf18c7a64e6c89bae082d2feda4a735e7a087a68f85fd", - "0x75ed9565771fe8626b6ab84659ab178488320535301f990b32008cb8d6ffbf58", - "0x111fd987a5f671f7884a8783e2bebd8e1cc22bf533d05e0441bdfd228b345717", - "0xdccacd8bd107e69fd2d2c1a05f9bcc65811815f152e9f33ac433517436067435", - "0xa9c9a42a7e408bc6103693f019c44cf312f2b867b87abdceb95d900885156c7e", - "0x64a54e2bec44cafadb050f8cad94de6f390cd69c6f8f8bf7fca200a1d0e859cf", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0xc7B1bb9F98F7aE67336391A900402eb25C8fC0e7": { - "beneficiary": "0x9596172eD6E9641CaAd2C232D92049F9ad94C632", - "amount": "99155232722957714599427", - "proof": [ - "0x6d076b68c556db6f2115c8a76588ac6017d80dedb8ce2bb3de607ebe9adee418", - "0x9174575460bf2d25b28cd4295d9b5ff7e24b0d509d0ebc9cc4fd88577cfa2c9c", - "0x8960e3adadc2c6e4c5d362f30d21564d88866e2a95977c7e2a5bc268b827d5bc", - "0x2636c723e4b0313d34aacb26a0c7d73dd94ed5f08ae04281a362b14207b628e2", - "0x111fd987a5f671f7884a8783e2bebd8e1cc22bf533d05e0441bdfd228b345717", - "0xdccacd8bd107e69fd2d2c1a05f9bcc65811815f152e9f33ac433517436067435", - "0xa9c9a42a7e408bc6103693f019c44cf312f2b867b87abdceb95d900885156c7e", - "0x64a54e2bec44cafadb050f8cad94de6f390cd69c6f8f8bf7fca200a1d0e859cf", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0xC7E344a3CbAfE25385Bf80e14F6e8078442eC02e": { - "beneficiary": "0x06f2e9Ce84d5e686428d361D91b437dC589a5163", - "amount": "13420194648459206089477", - "proof": [ - "0xe2c3fb3ba720a78e6afb1a287c975f412bf6e3226dd474aa61141415a1e5f547", - "0xde9398445032d943acf9e55aa02a843e5b7870c6ee93202f3855b01464602072", - "0x374dd84638a2a3636a82f1150c48f186293928c4491d9d2515966ffe82017628", - "0xa49f8baaa05c9a49015d13c2cb5a475342d4cb3ba2a697b0667d22289fefe496", - "0x2b33811bfbf525e09903057070381317c6e8580a978357fafa1f43ff94acc3cc", - "0x22e1c098b7010d0cf32500ff774c2cb716f2a4797330e1b587bc650ded67c423", - "0x26d3258cdc1fc284a0d39b0082465afa7e9cfb3bad44bea5374d722bdb514d7f", - "0xe88bf217a61ba2f61cf5c969f3d4f4e916964ce659327135fdd0be2e7c72ee73", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0xC82Bed104c3D5785FeCeBf906e5B1747a1BCE681": { - "beneficiary": "0xC82Bed104c3D5785FeCeBf906e5B1747a1BCE681", - "amount": "10674048595025900823003", - "proof": [ - "0xa5439e7147efeebd3e80d86bdfb9dd32c681d1666b8fca78e632f3ec58a1af1a", - "0xabc75c952ee72c6d5222f4d41cbd22c2ca2376100368d5b5e5e9c9212bf51043", - "0xa5858748f647690bd3608a8de80dfb90d16e8f0bc064dcb606ea9aa1f35cb8e9", - "0x58cf8a54810bc5371dbd254fdd1d17b9bdf629c32dcc26ae5ed527df75fb8b4e", - "0xdaae4d08c4b45294e520ad0f82a9cb506546db0d8fe3ec7c0e13d56d0f8c39d6", - "0x0051d7a32a1cc939dea0060ee90745718a7b84019b2411e1b966c49089e00273", - "0x0616b8a8fdf6a22d755f3735640770bdb2f6e7df4a6e1b23ed3647e9c3778bf6", - "0xe88bf217a61ba2f61cf5c969f3d4f4e916964ce659327135fdd0be2e7c72ee73", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0xc8A6Bfe0834FB99340a0Df253d79B7CaE25053b8": { - "beneficiary": "0xc8A6Bfe0834FB99340a0Df253d79B7CaE25053b8", - "amount": "19607783750185819277041", - "proof": [ - "0x4d7994751b0a17cb4203bcce4e4bc167abbbeda58ae40be0278f9ba4da2ba230", - "0x183d876e7bcea20db46c6a6a1ed7c9608f9c30a026816833b4a7863e49254db5", - "0xe5e7b64550ae2e510642b0ea2b10d90ee0615686ec19ad71eb429db97f369216", - "0x415ffea8e37ea074902c88356b1cda00766d9d007bfeafa3b419755ff21c4b40", - "0x2aa934f8f4fd48015f3837e029a329df9889527199e2ec1ae6ebe99d0bb412b0", - "0x062359f2025ff77d930f8f91e829b67beffb93b49ac378457b370c7980b2fc73", - "0xa9c9a42a7e408bc6103693f019c44cf312f2b867b87abdceb95d900885156c7e", - "0x64a54e2bec44cafadb050f8cad94de6f390cd69c6f8f8bf7fca200a1d0e859cf", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0xC8c36fA036244658920bc78D316efa4C9d98f306": { - "beneficiary": "0xC8c36fA036244658920bc78D316efa4C9d98f306", - "amount": "2612620351464655062147994", - "proof": [ - "0xcf5cec3edb941561868bb22e08a270857f8a6391a0b56603ee04cd646177ba2a", - "0x8cad50481e8fb2b8111923a0a70033a5ecc9f212834da02173a20a2a65332997", - "0x38f20aebf7710d3da6781cf3270423d9d3e412dc4aacce73b21f02aff8b94d62", - "0x8ae93be8304ef13b7e153cfe03598869b3fe1e0c5405174fd8150ee7c3c37df7", - "0xa66a31c956515e2b9d52e14019df281b7b65cb788fe21437b8ddacc320e2517e", - "0x97d9146e9833b3fdeba7c55987d17f362c03e476d0731aa6eda14684628e6b80", - "0x26d3258cdc1fc284a0d39b0082465afa7e9cfb3bad44bea5374d722bdb514d7f", - "0xe88bf217a61ba2f61cf5c969f3d4f4e916964ce659327135fdd0be2e7c72ee73", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0xcA1064Bbc007ea6943A13Bea049590646893F4D2": { - "beneficiary": "0xcA1064Bbc007ea6943A13Bea049590646893F4D2", - "amount": "7205111207460996900503", - "proof": [ - "0xb4e0cb754113fabea8b2989d7b243f1d2a42ab4b3f47d2179a940a00ed19d32b", - "0x9922d48a0bed2a2e3eab8cf776e755689b37be0568e4698785263f815c499ffc", - "0x52737961fc571d488330ffc563e960be948184ef4c4b65007117df97db388d06", - "0xe8725478de68bb2f70f03cdae0b58fb5de3d665ba62705d4d326ed9b5c097b79", - "0xc93e047f67535414778dfc6856cfd4414899e769239825a687683ea6a63e3e10", - "0x0051d7a32a1cc939dea0060ee90745718a7b84019b2411e1b966c49089e00273", - "0x0616b8a8fdf6a22d755f3735640770bdb2f6e7df4a6e1b23ed3647e9c3778bf6", - "0xe88bf217a61ba2f61cf5c969f3d4f4e916964ce659327135fdd0be2e7c72ee73", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0xcA5Ac1b59796bE580820e9C66d395977d4F7c3C0": { - "beneficiary": "0x7Ecd7B098935Ed7e72b893a68F82198C27aacBd4", - "amount": "5735487419902407823098727", - "proof": [ - "0x9bfb67a8c992d5e6a4744a3cb2d754376d6fca5379116e02d45f7c4cc8cd4447", - "0xeece2ce98a250afc7f3879f2808df46fa4e4bf1ca319aac58804059be36c0aa1", - "0x7f18f34ee97e41e65206090a3b370166a5805110f67886a6c7b5e8d3a8dc0feb", - "0x8e0a201871d267e73e63f23088bd1e9d8c9a8b763ee4dfe53afad4a412370179", - "0xe4b02fad2ca92c21c555a2c6107ae084366477f8bf346a4fc1ddfe404454ce24", - "0x68dbcd1cbf24dfe8761794f995bcb03a39b7b92828d8898f64ee8ee429e9eb95", - "0x0616b8a8fdf6a22d755f3735640770bdb2f6e7df4a6e1b23ed3647e9c3778bf6", - "0xe88bf217a61ba2f61cf5c969f3d4f4e916964ce659327135fdd0be2e7c72ee73", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0xca70feA021359778daeC479b97D0cD2eFE1Ad099": { - "beneficiary": "0xbCdffff120C4e2f1199317A9448e99Eb02771496", - "amount": "138040858204061711753427", - "proof": [ - "0x3b3cabf854b4a64d21dbe7a9bd84a238b31f88d1b9288d54923f399252b24965", - "0x6c5c51855f4771f1b50d8787c4369ee0ea8dd342a5445f2d506762f0516c1517", - "0x367ed10aa31c53c2f7ab417139c6060d5de223aeb60b78fbfc5687a74b48c391", - "0xa4c592d588cd922c6de1781284770256d4729b6287bdc700b97a2c852ff88d0f", - "0x9065ab73e0639a7701ce0c7ea4d24dc3a352eaf86d04cfe535ea8b3b19f43923", - "0x473f914d1f1ccc5b8b5de95bc12121123181242ea06fff9c8508a358398163b5", - "0x5edc99efd052e87ec503dc802fa8b259d16a891b72bc9ac38d7bc6d7b6f2552e", - "0x64a54e2bec44cafadb050f8cad94de6f390cd69c6f8f8bf7fca200a1d0e859cf", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0xcBB734bBa70c6462a9F22C2b481346ebEf3CFAd3": { - "beneficiary": "0x64C83375e019835433F832C07Fee3c77284654dA", - "amount": "274435721528435269775450", - "proof": [ - "0xe6ccfc487f1c90db79984761cee8161e04c0ae770eab2fca45eb769efcc7d62a", - "0xbe6c4165de0cb5171b47cce41baa0f3ba6f2df2064a059b5133ac464d2c053f5", - "0xf5d221ebb809dc8317010cac306191773446b161afd53bd03d0cb41031b99735", - "0xa49f8baaa05c9a49015d13c2cb5a475342d4cb3ba2a697b0667d22289fefe496", - "0x2b33811bfbf525e09903057070381317c6e8580a978357fafa1f43ff94acc3cc", - "0x22e1c098b7010d0cf32500ff774c2cb716f2a4797330e1b587bc650ded67c423", - "0x26d3258cdc1fc284a0d39b0082465afa7e9cfb3bad44bea5374d722bdb514d7f", - "0xe88bf217a61ba2f61cf5c969f3d4f4e916964ce659327135fdd0be2e7c72ee73", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0xcd087a44ED8EE2aCe79F497c803005Ff79A64A94": { - "beneficiary": "0xcd087a44ED8EE2aCe79F497c803005Ff79A64A94", - "amount": "1064932219067752715888901", - "proof": [ - "0xca8be76c9463362767f9f528c1506beead94f0eaecb4f8e86f5d1cc48e52b81e", - "0xfbb10c034b0fd1f0b0f78110de56b13d67e3ee75cab43fdfec5942c6aa7939d7", - "0xb707eda71755ca61ec5cb9a12abf6ecdfb688d2c5a8bdd3a525e3df7c576b4c3", - "0xde4766412d1ecc2449d097e3b6b2b5bea1d00c24806fe806e0aee38702c19eef", - "0x59a158af3ffa2849a033594affad303fb5e11aeecbdde0a878c909168e58d612", - "0x97d9146e9833b3fdeba7c55987d17f362c03e476d0731aa6eda14684628e6b80", - "0x26d3258cdc1fc284a0d39b0082465afa7e9cfb3bad44bea5374d722bdb514d7f", - "0xe88bf217a61ba2f61cf5c969f3d4f4e916964ce659327135fdd0be2e7c72ee73", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0xCE4407dF6ae8A92EB69412bD6a8ec49A9B9b40dD": { - "beneficiary": "0xCE4407dF6ae8A92EB69412bD6a8ec49A9B9b40dD", - "amount": "865117836751953280124067", - "proof": [ - "0x6c379795b697299b5f789b3a76ed2eafb9fdae1a1472b32814aa2c25e3abf9fd", - "0xcc81637c025b155bffc642a5f98c9d73032003c87865ec8e6f53b9ef05a91a07", - "0x8960e3adadc2c6e4c5d362f30d21564d88866e2a95977c7e2a5bc268b827d5bc", - "0x2636c723e4b0313d34aacb26a0c7d73dd94ed5f08ae04281a362b14207b628e2", - "0x111fd987a5f671f7884a8783e2bebd8e1cc22bf533d05e0441bdfd228b345717", - "0xdccacd8bd107e69fd2d2c1a05f9bcc65811815f152e9f33ac433517436067435", - "0xa9c9a42a7e408bc6103693f019c44cf312f2b867b87abdceb95d900885156c7e", - "0x64a54e2bec44cafadb050f8cad94de6f390cd69c6f8f8bf7fca200a1d0e859cf", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0xd01560684190dA9541bDAD9EAD32D19384D72410": { - "beneficiary": "0xEbaeCD22304445A471630600708A197A311daB7F", - "amount": "6171777945380574903884024", - "proof": [ - "0x43aeb0ce0d9e1686862351054e7f22040f88d36140400e10c908b1d5228320fd", - "0x476608e4ba9f5ea94f17fd38f239e5e1a949897ca3f9b85e91298b3764dc958d", - "0x3c77bb6a11e0fc93cfd0a17743f111aac40fdd4426716a20386d80081e3eeea8", - "0x39c2e82a79487da27ef5d8d6b31b3efb47564973a96a7f009a59ff3eee98e3d7", - "0x2aa934f8f4fd48015f3837e029a329df9889527199e2ec1ae6ebe99d0bb412b0", - "0x062359f2025ff77d930f8f91e829b67beffb93b49ac378457b370c7980b2fc73", - "0xa9c9a42a7e408bc6103693f019c44cf312f2b867b87abdceb95d900885156c7e", - "0x64a54e2bec44cafadb050f8cad94de6f390cd69c6f8f8bf7fca200a1d0e859cf", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0xD0908B1E0f6e64e3097c663BF95E2E9c040dd40d": { - "beneficiary": "0xD0908B1E0f6e64e3097c663BF95E2E9c040dd40d", - "amount": "566904185324433555018986", - "proof": [ - "0x93373ff38cff9d1b8982ab02b681bf464e74b6e73f81fbe4ef49279cca3fca27", - "0xa3719a320fe218c9729935e69c512b9e69342d68a2879fab4c1f31d1dd08f365", - "0x0547516dacc2694fc61c2fef1c2bd36e8192020f4c8189615b9cdaca041fdd02", - "0xa947248fcc5a7ae879736246946a77fa43401f91d467acd89a1208f3cbd604b9", - "0xe4b02fad2ca92c21c555a2c6107ae084366477f8bf346a4fc1ddfe404454ce24", - "0x68dbcd1cbf24dfe8761794f995bcb03a39b7b92828d8898f64ee8ee429e9eb95", - "0x0616b8a8fdf6a22d755f3735640770bdb2f6e7df4a6e1b23ed3647e9c3778bf6", - "0xe88bf217a61ba2f61cf5c969f3d4f4e916964ce659327135fdd0be2e7c72ee73", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0xd517479ACAef258Baa3ba6A351e9C714a79d597e": { - "beneficiary": "0xd517479ACAef258Baa3ba6A351e9C714a79d597e", - "amount": "437895100682392190247005", - "proof": [ - "0x06fb161a97c94bb6a38b61c1e88e5e0d7ab6fa8b986138a14fabcad7cea66fd5", - "0x294dd8ca5d2080f4ebec287b41a53bc8ff713b38c8990c0ee0cd251c208b1e5f", - "0x712cad967bfab73d3fedf0d4822868a1a8b0bde786ed4122b9e1fa5e9fee77f6", - "0xb9473c113468ef16d11e686668d79ec90e821e951c0387ac41ae0d97e3f5a0a3", - "0xde4d448a9d734de96d9aad546aff27580bbca08f960e04097175f5f07e34f665", - "0x56e2c6ad067fe01f6532e8274c819527bbc22e3d1a23f010e171e6616d445529", - "0x5edc99efd052e87ec503dc802fa8b259d16a891b72bc9ac38d7bc6d7b6f2552e", - "0x64a54e2bec44cafadb050f8cad94de6f390cd69c6f8f8bf7fca200a1d0e859cf", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0xd55c4261145EA1752662faA0485AfBC8C431b0CA": { - "beneficiary": "0xd55c4261145EA1752662faA0485AfBC8C431b0CA", - "amount": "5771917808219178082192", - "proof": [ - "0xa24b4a001ef81e72b6154a20ea3722edb35f45f4953f9e491359849f1947aa6d", - "0x3f7ade5133384ef974db220d451c7418f7c63122b47f994900baa51590dbea43", - "0xabc336cf0e705edfee5b63228a4e00e84a07a2cae7399bbb3e1239086ce6dc5b", - "0x58cf8a54810bc5371dbd254fdd1d17b9bdf629c32dcc26ae5ed527df75fb8b4e", - "0xdaae4d08c4b45294e520ad0f82a9cb506546db0d8fe3ec7c0e13d56d0f8c39d6", - "0x0051d7a32a1cc939dea0060ee90745718a7b84019b2411e1b966c49089e00273", - "0x0616b8a8fdf6a22d755f3735640770bdb2f6e7df4a6e1b23ed3647e9c3778bf6", - "0xe88bf217a61ba2f61cf5c969f3d4f4e916964ce659327135fdd0be2e7c72ee73", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0xD680B01503CF95A489010dA7409980060991D096": { - "beneficiary": "0xD680B01503CF95A489010dA7409980060991D096", - "amount": "818108635596260391984733", - "proof": [ - "0x272d42f69bd033a82b9bb47eb5c7eead1e1a8dc03cae72baab1179db806d6b6f", - "0x5b4d0dbdc6eaf7ab033b804d7b9594eade6362c3e3d06e0bc3f44acf3065fb88", - "0xc39c68a7cadea313d11e8080753c76ccdf48386996f52b4d78e12b61efa43188", - "0x38d91c9958cb4cdec127466b1997494fd747e27b80a6ac39f6d4352ecc45666a", - "0xaf418cbc46d36f44acd10c35eff28186de90897d89719daa90ec8ad8f09b67b2", - "0x473f914d1f1ccc5b8b5de95bc12121123181242ea06fff9c8508a358398163b5", - "0x5edc99efd052e87ec503dc802fa8b259d16a891b72bc9ac38d7bc6d7b6f2552e", - "0x64a54e2bec44cafadb050f8cad94de6f390cd69c6f8f8bf7fca200a1d0e859cf", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0xD6edf0bc0C19f87eCEf67632BFCd212ce8324aB9": { - "beneficiary": "0xD6edf0bc0C19f87eCEf67632BFCd212ce8324aB9", - "amount": "1609923974577409552111647", - "proof": [ - "0xa1d7686e546b811d978f4c243f7f27ed585062501b38a62474f96779b9d6b43d", - "0x7eb7210d32069f58b997139929bfa062cb45b0a8460719b0c0ae87ef97ebd69f", - "0xabc336cf0e705edfee5b63228a4e00e84a07a2cae7399bbb3e1239086ce6dc5b", - "0x58cf8a54810bc5371dbd254fdd1d17b9bdf629c32dcc26ae5ed527df75fb8b4e", - "0xdaae4d08c4b45294e520ad0f82a9cb506546db0d8fe3ec7c0e13d56d0f8c39d6", - "0x0051d7a32a1cc939dea0060ee90745718a7b84019b2411e1b966c49089e00273", - "0x0616b8a8fdf6a22d755f3735640770bdb2f6e7df4a6e1b23ed3647e9c3778bf6", - "0xe88bf217a61ba2f61cf5c969f3d4f4e916964ce659327135fdd0be2e7c72ee73", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0xd6Fc4e95E0622DdedAD3289dF7873d8136645E8d": { - "beneficiary": "0x461aa63A98e6f8BdAa19CA3f2258670E794FFF34", - "amount": "2595816828295450323857533", - "proof": [ - "0x06ebe6163d5255a71f19a8e341676278029ae7453089e3756c5b9b0a0d9f0684", - "0x3472c291fca8f61a147b7599a4981a0f66ea0a76fc733af0a28a24a9f9b7bf9f", - "0x44c197d64d894c349573d2595162ecc3e2eac1c260689dc68d2a5ee03c2e2e3e", - "0xb9473c113468ef16d11e686668d79ec90e821e951c0387ac41ae0d97e3f5a0a3", - "0xde4d448a9d734de96d9aad546aff27580bbca08f960e04097175f5f07e34f665", - "0x56e2c6ad067fe01f6532e8274c819527bbc22e3d1a23f010e171e6616d445529", - "0x5edc99efd052e87ec503dc802fa8b259d16a891b72bc9ac38d7bc6d7b6f2552e", - "0x64a54e2bec44cafadb050f8cad94de6f390cd69c6f8f8bf7fca200a1d0e859cf", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0xd7c6DcFC25Ff4e0c76D7753db848E38F90E056e4": { - "beneficiary": "0xd7c6DcFC25Ff4e0c76D7753db848E38F90E056e4", - "amount": "135891521467882286775333", - "proof": [ - "0x3d702a1b545eff4700fbf4c511b4f8c1ad9cbe7397af0d09fa5f5e793febc4a2", - "0x4ae7adbacf0fd8de874129de31e322abc7f2d4183e5ff3c87a3060d417afd68b", - "0x837e79da682db653355e2733fb4ee6be6faf8b206c8181748e8264cbb6620b36", - "0x309156f7e96d9b52f8ddf5305643178e8482b927ee2703fff776b1c235be172f", - "0x9065ab73e0639a7701ce0c7ea4d24dc3a352eaf86d04cfe535ea8b3b19f43923", - "0x473f914d1f1ccc5b8b5de95bc12121123181242ea06fff9c8508a358398163b5", - "0x5edc99efd052e87ec503dc802fa8b259d16a891b72bc9ac38d7bc6d7b6f2552e", - "0x64a54e2bec44cafadb050f8cad94de6f390cd69c6f8f8bf7fca200a1d0e859cf", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0xD903636293da47B66861BE87B360C795fda43F5f": { - "beneficiary": "0xD903636293da47B66861BE87B360C795fda43F5f", - "amount": "6095246033446889609804", - "proof": [ - "0x8019cda73cd9fd946e147063cbccf7bfdaae82a2190d51855d24aa9d0b56c512", - "0x67da8cdddc99afe6cba81d7a1b02962dcfc280fc1624d4a4c5c96f667c6ed805", - "0xbc8bbd3bf840accfe3028f77db7ff9d42c92b810abdacce3210a0eab351623fa", - "0xeab42a7f7084e021a91d743173e7d8d1a35b408ed9f715b7f36249a621338a21", - "0x8ba5b958e3d50463abb92bcbd342d11326e4d7c366ee018c2d461fbb1df561b5", - "0x68dbcd1cbf24dfe8761794f995bcb03a39b7b92828d8898f64ee8ee429e9eb95", - "0x0616b8a8fdf6a22d755f3735640770bdb2f6e7df4a6e1b23ed3647e9c3778bf6", - "0xe88bf217a61ba2f61cf5c969f3d4f4e916964ce659327135fdd0be2e7c72ee73", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0xd977144724Bc77FaeFAe219F958AE3947205d0b5": { - "beneficiary": "0x18503D85DDA5c51b6DADaB8a6b75231256A4F9F7", - "amount": "8416348340331723862202558", - "proof": [ - "0x0db4b749ecc8d79c562f64403ae7519584115e9cfb47121b94ede80242466292", - "0x7c8b8af27300c4a6a8507001809f5d303e21f578438c2be2822660124664d17c", - "0x192914324518265c3199e67a4976766b68529dd3d1460d0b729921238672069e", - "0x81e6adfcd37f44c1b0d192e02239acfdaa6943691bce8c4f017c99a8c59c17a7", - "0x59579fcafd7366cb9d52ae4c94f27332a10e08b985ba36d2846a772392ce0e75", - "0x56e2c6ad067fe01f6532e8274c819527bbc22e3d1a23f010e171e6616d445529", - "0x5edc99efd052e87ec503dc802fa8b259d16a891b72bc9ac38d7bc6d7b6f2552e", - "0x64a54e2bec44cafadb050f8cad94de6f390cd69c6f8f8bf7fca200a1d0e859cf", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0xDcd4199e22d09248cA2583cBDD2759b2acD22381": { - "beneficiary": "0x6fcC96a003546603C4368fE6E41e6e2f31B845B9", - "amount": "288242829155800299551672", - "proof": [ - "0xf86cc0a56f84e8231646adf4cb957d5bb8b1e4962fef831c32df165b13cf511f", - "0x7195c6ddef739166be7222bbf70a0956ca7a4ad5d4dee5d3064e1baf117e7cde", - "0x07db8cb3073df87fa6a9435d3941acf63e8a49876612e167a3f1dbfba76566c9", - "0x7375f825f0f31d047b6de1d51bf149632c6b6f51debb555d434075ee545fc9fb", - "0x0c126623518999de3f92b4a74e8cae9a113108254527d72d813d7e518009dd3c", - "0x22e1c098b7010d0cf32500ff774c2cb716f2a4797330e1b587bc650ded67c423", - "0x26d3258cdc1fc284a0d39b0082465afa7e9cfb3bad44bea5374d722bdb514d7f", - "0xe88bf217a61ba2f61cf5c969f3d4f4e916964ce659327135fdd0be2e7c72ee73", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0xdDca0a903F6b17a7B785af31b9749F6F95ED86B1": { - "beneficiary": "0xdDca0a903F6b17a7B785af31b9749F6F95ED86B1", - "amount": "1339140826684823784322609", - "proof": [ - "0x0373a0c6583e30f1cabba4b496815c491d7afd1124ae88e8470be912ab0ae4fe", - "0x733be643477f4dee85ddad2511e30f4a7aadf4d5031e198440d405931b7329a8", - "0x409d28f2187aa20196f7e88689dfe27d40d76efa9726b55b953b5eaed00166a0", - "0x4c5007a8d6e515ed558b22a1e3df53f27975e71b334407ce8c34529d3336513b", - "0xde4d448a9d734de96d9aad546aff27580bbca08f960e04097175f5f07e34f665", - "0x56e2c6ad067fe01f6532e8274c819527bbc22e3d1a23f010e171e6616d445529", - "0x5edc99efd052e87ec503dc802fa8b259d16a891b72bc9ac38d7bc6d7b6f2552e", - "0x64a54e2bec44cafadb050f8cad94de6f390cd69c6f8f8bf7fca200a1d0e859cf", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0xe01Be841B1E192390949E9ea1779b1897E105802": { - "beneficiary": "0xe9E1800219c7667d2ac4f52A3b58ab1AB82Ad303", - "amount": "814239941946879600867704", - "proof": [ - "0x3b9538832c88f44c0902ca97f4d85af6218ffdeff37f4f0d5c9f9675aaccdff9", - "0x5725e9905d2285497682068979c922227433e6d92ab7e149a5311d20e981227e", - "0x367ed10aa31c53c2f7ab417139c6060d5de223aeb60b78fbfc5687a74b48c391", - "0xa4c592d588cd922c6de1781284770256d4729b6287bdc700b97a2c852ff88d0f", - "0x9065ab73e0639a7701ce0c7ea4d24dc3a352eaf86d04cfe535ea8b3b19f43923", - "0x473f914d1f1ccc5b8b5de95bc12121123181242ea06fff9c8508a358398163b5", - "0x5edc99efd052e87ec503dc802fa8b259d16a891b72bc9ac38d7bc6d7b6f2552e", - "0x64a54e2bec44cafadb050f8cad94de6f390cd69c6f8f8bf7fca200a1d0e859cf", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0xE12Fac6A7C966e31c5C2CD5932d3a39a2d7fC755": { - "beneficiary": "0x6af2Ff42aE2f05faEEC001c3b63844D34027c42E", - "amount": "3979460961282343987823441", - "proof": [ - "0x55cbc0c69b3a4218c462ea917ee2b8642e82f4db6fd59892c9e4d05629936dd0", - "0x6f6dff5f2394a57178bf43554389ca0f6ae2be28836b79fc1a99dd3c0dc7a193", - "0x228a2482fb9d68fee941f2a2d25527f20eb0a908482483549f9fdefcc5d93f88", - "0x195bb1e416a9464545527432ff9ea60c3e6383f802a3808a4151e24087c7c24b", - "0x01add4a2b7c01143892ca3fbd9ac6e2d294563bf8fe1296e127a7f43ce54824c", - "0x062359f2025ff77d930f8f91e829b67beffb93b49ac378457b370c7980b2fc73", - "0xa9c9a42a7e408bc6103693f019c44cf312f2b867b87abdceb95d900885156c7e", - "0x64a54e2bec44cafadb050f8cad94de6f390cd69c6f8f8bf7fca200a1d0e859cf", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0xe26E2d93Bbc8fde0e1E3B290Fc927Fb374E7e34e": { - "beneficiary": "0x44e4465E243c3734Cc3302473b39d954d4A47F4a", - "amount": "2973377557997207167942088", - "proof": [ - "0x5df6c9f59a9d3da43be54bdb2f5bdc19f544c69c5452330637df7210273cc983", - "0x9a38f3c5b67f8195249f6fe8964cfdb5618c367c69de5c69829213277f00ae2e", - "0xe2469697f1b831d6635fddc64f2d541b1101565b1a61fa0742050530e161d913", - "0x797edd017f4003c1285ab77462d72a225c5599c94f0de400975080271269fef0", - "0x0c99d2be5d1dbc03058e95802f469f1f3a0ebd66724ffe9b43624f26e1d9ab49", - "0xdccacd8bd107e69fd2d2c1a05f9bcc65811815f152e9f33ac433517436067435", - "0xa9c9a42a7e408bc6103693f019c44cf312f2b867b87abdceb95d900885156c7e", - "0x64a54e2bec44cafadb050f8cad94de6f390cd69c6f8f8bf7fca200a1d0e859cf", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0xE29dcD83466ddC28Ca23da41ac44E63512071265": { - "beneficiary": "0x737E3f4175525331BC0e3dFdF1C6b56510281918", - "amount": "288302276594024732446560", - "proof": [ - "0x6616bbc30754f0f38c8cd54344fc929872f23a0b7be71347f0c17fda7ebf438d", - "0xbf93856b430bcc096052e33f829cc8c12453e723315fb5495f7994e9186efe53", - "0xcd21419563c765aad45b01547db78474bac0b5a5c9598ae1dd039405201b46cc", - "0x2636c723e4b0313d34aacb26a0c7d73dd94ed5f08ae04281a362b14207b628e2", - "0x111fd987a5f671f7884a8783e2bebd8e1cc22bf533d05e0441bdfd228b345717", - "0xdccacd8bd107e69fd2d2c1a05f9bcc65811815f152e9f33ac433517436067435", - "0xa9c9a42a7e408bc6103693f019c44cf312f2b867b87abdceb95d900885156c7e", - "0x64a54e2bec44cafadb050f8cad94de6f390cd69c6f8f8bf7fca200a1d0e859cf", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0xe3a2d16dA142E6B190A5d9F7e0C07cc460B58A5F": { - "beneficiary": "0x875f8fFCDDeD63B5d8Cf54be4E4b82FE6c6E249C", - "amount": "26853190453526293297458", - "proof": [ - "0x3f7287717e5a8ce5d0affda9c07fa21dad0f6706568b4d2ccadfd501ffebb69c", - "0x64086648e58ab7820c646458b5c20cda5905aee5325ab33f70d7e0efcc35a9a1", - "0x86d67e1d319263b2cd1dcc011f5925a4e2569097aae21a6340de89adca6210b3", - "0x309156f7e96d9b52f8ddf5305643178e8482b927ee2703fff776b1c235be172f", - "0x9065ab73e0639a7701ce0c7ea4d24dc3a352eaf86d04cfe535ea8b3b19f43923", - "0x473f914d1f1ccc5b8b5de95bc12121123181242ea06fff9c8508a358398163b5", - "0x5edc99efd052e87ec503dc802fa8b259d16a891b72bc9ac38d7bc6d7b6f2552e", - "0x64a54e2bec44cafadb050f8cad94de6f390cd69c6f8f8bf7fca200a1d0e859cf", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0xE4A3492c8b085aB5eDB6FDAE329f172056f6b04e": { - "beneficiary": "0x0cCbCE598D5663b7B8c2809405f2D5A666E5d62F", - "amount": "2710236623356903494717486", - "proof": [ - "0xae296998f604b3a6b15142bd5265312b443c0940e369f19a9d2443def0fd096c", - "0xd1af37812cb2ef553cb937298e6bbb223c04c5323e62680bc86d08744291c7b8", - "0x5d1e6444d5b809d1c96451c89399d489ded4a1f1f3a9e40ca1bddaf56048ecec", - "0x7f1c6ca19ff3cad4f632f6e3686736e3e262e7581772ab7d210d2cd01fd6a7c8", - "0xc93e047f67535414778dfc6856cfd4414899e769239825a687683ea6a63e3e10", - "0x0051d7a32a1cc939dea0060ee90745718a7b84019b2411e1b966c49089e00273", - "0x0616b8a8fdf6a22d755f3735640770bdb2f6e7df4a6e1b23ed3647e9c3778bf6", - "0xe88bf217a61ba2f61cf5c969f3d4f4e916964ce659327135fdd0be2e7c72ee73", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0xE6166176Ca5bdD8C40c02312c26f5A8B4AC4C08f": { - "beneficiary": "0x17e87D44a5E2bB4afAAa0B39CB91a047B09ec28e", - "amount": "269067401416921519427469", - "proof": [ - "0x0074361d6fac8fd4e9c9f7c772139da7ab7f96c8871a875e3d0432eb37d10d5f", - "0xae3574d032512b8cc07d724e747bb057d2d3a44751a0195d6572b6004b8b0d6d", - "0x3a3475312892ff2f8bc9b732274d6c756387fcecb200614270a377eb2634e436", - "0x4c5007a8d6e515ed558b22a1e3df53f27975e71b334407ce8c34529d3336513b", - "0xde4d448a9d734de96d9aad546aff27580bbca08f960e04097175f5f07e34f665", - "0x56e2c6ad067fe01f6532e8274c819527bbc22e3d1a23f010e171e6616d445529", - "0x5edc99efd052e87ec503dc802fa8b259d16a891b72bc9ac38d7bc6d7b6f2552e", - "0x64a54e2bec44cafadb050f8cad94de6f390cd69c6f8f8bf7fca200a1d0e859cf", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0xE6b636575DE648cEA5e217Ad26e32C01534e7ae4": { - "beneficiary": "0xE6b636575DE648cEA5e217Ad26e32C01534e7ae4", - "amount": "348607966122495003668208", - "proof": [ - "0x98931d59c19b36ccaba67784942fa09f9a4cc854330e49b7fa2019a10debf541", - "0x046b299c7d385f399878f74ba836cd0b13cae4324df79962d8e627d69856b3ec", - "0x08386d2f8bb88fd2e59c782888ffcd6c4e14cfc4af0c16b1147aa7df717d953b", - "0x8e0a201871d267e73e63f23088bd1e9d8c9a8b763ee4dfe53afad4a412370179", - "0xe4b02fad2ca92c21c555a2c6107ae084366477f8bf346a4fc1ddfe404454ce24", - "0x68dbcd1cbf24dfe8761794f995bcb03a39b7b92828d8898f64ee8ee429e9eb95", - "0x0616b8a8fdf6a22d755f3735640770bdb2f6e7df4a6e1b23ed3647e9c3778bf6", - "0xe88bf217a61ba2f61cf5c969f3d4f4e916964ce659327135fdd0be2e7c72ee73", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0xE6d1B933501556F3e8E935A2Fb68FeD9B4593a98": { - "beneficiary": "0xE6d1B933501556F3e8E935A2Fb68FeD9B4593a98", - "amount": "19038469946406481537969200", - "proof": [ - "0x35e79b8905b7c8ffb45678cac87428d0015890f5c984f68b6c7c079bbb50cb99", - "0x5a0ed99f74ffcdb7cf881d645337a7665c1f82e888875f339c68eaf0dcaa46e4", - "0x81bc7e084da1245e86d4838075158c2ca1e8b55c58b230150b2b27f3bd6819c6", - "0xa4c592d588cd922c6de1781284770256d4729b6287bdc700b97a2c852ff88d0f", - "0x9065ab73e0639a7701ce0c7ea4d24dc3a352eaf86d04cfe535ea8b3b19f43923", - "0x473f914d1f1ccc5b8b5de95bc12121123181242ea06fff9c8508a358398163b5", - "0x5edc99efd052e87ec503dc802fa8b259d16a891b72bc9ac38d7bc6d7b6f2552e", - "0x64a54e2bec44cafadb050f8cad94de6f390cd69c6f8f8bf7fca200a1d0e859cf", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0xEd3Ac0B60e8eA4d344A90e1069A601b1c297BBCF": { - "beneficiary": "0xEd3Ac0B60e8eA4d344A90e1069A601b1c297BBCF", - "amount": "72586093878344691923034", - "proof": [ - "0x584b76468a439f5f064d17b56d7dbe8c77198eae041ae3cffdd2d67411cd5a5b", - "0x0610d39f957e2c2a01d1e9b7faf85cf4ff9529d16838309435c7fc3c486c8ab7", - "0xbabfec64d5720d4e9e78f58b00b56aa86f1ea2b5129ca4db0c315adcedaab965", - "0xd2ea19db53b4fc2b4b69c5c7337ab4b3eeb8e32ad07e477402839a2d22673a61", - "0x01add4a2b7c01143892ca3fbd9ac6e2d294563bf8fe1296e127a7f43ce54824c", - "0x062359f2025ff77d930f8f91e829b67beffb93b49ac378457b370c7980b2fc73", - "0xa9c9a42a7e408bc6103693f019c44cf312f2b867b87abdceb95d900885156c7e", - "0x64a54e2bec44cafadb050f8cad94de6f390cd69c6f8f8bf7fca200a1d0e859cf", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0xF2962794EbE69fc88F8dB441c1CD13b9F90B1Fe7": { - "beneficiary": "0xF2962794EbE69fc88F8dB441c1CD13b9F90B1Fe7", - "amount": "5660151059567312492658581", - "proof": [ - "0x43d5d88c8652f0ef5180a2641a87c107063a4465c9d7269f84f599bd73bd5f31", - "0xe9585d509b3d13830d0c95ab6526a3d7bd2b70289190507d9968344d72fe856e", - "0x0d1317bfede4b34dc2ab4a555179e25432816cfd8da26a6c597311119308eb29", - "0x39c2e82a79487da27ef5d8d6b31b3efb47564973a96a7f009a59ff3eee98e3d7", - "0x2aa934f8f4fd48015f3837e029a329df9889527199e2ec1ae6ebe99d0bb412b0", - "0x062359f2025ff77d930f8f91e829b67beffb93b49ac378457b370c7980b2fc73", - "0xa9c9a42a7e408bc6103693f019c44cf312f2b867b87abdceb95d900885156c7e", - "0x64a54e2bec44cafadb050f8cad94de6f390cd69c6f8f8bf7fca200a1d0e859cf", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0xF2f5E0a3365c385A3ADCA4F614eD0984dFff52a3": { - "beneficiary": "0xC12661aD6A710508A11D56D10ce9C071853B3704", - "amount": "163921477889095026094074", - "proof": [ - "0xeae4858b2f83115d796e786c4abdad3d883e55af86364b2fefcd02798ee5e638", - "0xf2fc9d2c97054a786c02923f8acab9038b0ddd8daac195998bb9e88b70491efa", - "0x587d0e9f4f3b1121f7066b827323a7df794a2089782fc9769cab118f4a9c32f0", - "0xc590ad1b557e905ed766a2bd82993040517c1d8f828e67aff3a525f0a517e61b", - "0x0c126623518999de3f92b4a74e8cae9a113108254527d72d813d7e518009dd3c", - "0x22e1c098b7010d0cf32500ff774c2cb716f2a4797330e1b587bc650ded67c423", - "0x26d3258cdc1fc284a0d39b0082465afa7e9cfb3bad44bea5374d722bdb514d7f", - "0xe88bf217a61ba2f61cf5c969f3d4f4e916964ce659327135fdd0be2e7c72ee73", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0xF425A57Ec73a25A3B1A08eA7F88A5c9e080c9ed4": { - "beneficiary": "0xF425A57Ec73a25A3B1A08eA7F88A5c9e080c9ed4", - "amount": "38539706937254391079389", - "proof": [ - "0x00b1ed0878eca839816d8da358e079069db7ac3d61cc64abed3ff7ac0b28d363", - "0x6e0efa05d1e3e5a104c7be5caed5aeba8893ccb899827a968b5f1aede976e0de", - "0x3a3475312892ff2f8bc9b732274d6c756387fcecb200614270a377eb2634e436", - "0x4c5007a8d6e515ed558b22a1e3df53f27975e71b334407ce8c34529d3336513b", - "0xde4d448a9d734de96d9aad546aff27580bbca08f960e04097175f5f07e34f665", - "0x56e2c6ad067fe01f6532e8274c819527bbc22e3d1a23f010e171e6616d445529", - "0x5edc99efd052e87ec503dc802fa8b259d16a891b72bc9ac38d7bc6d7b6f2552e", - "0x64a54e2bec44cafadb050f8cad94de6f390cd69c6f8f8bf7fca200a1d0e859cf", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0xf569A5868BC1d5c44Fe41198a6e9f199c9A60d42": { - "beneficiary": "0xf569A5868BC1d5c44Fe41198a6e9f199c9A60d42", - "amount": "182508878751335567686755", - "proof": [ - "0x60f54c33276e9996e0ecea26fb9e42aba79a55e51bb20eb4ad08806fd0bdecc1", - "0x2a2f9a9ddda719374b9fd9bad206a07719973d0b906cc59551ff65bd00f9607b", - "0x3425029c00bb6dd5db0e9be696fed0ad583aa55eb07da6d730411aeeb2d82870", - "0x8480db728010621a6968b7aa3634f14b1865f27ddec19c5d9479b58ed9b93f2f", - "0x0c99d2be5d1dbc03058e95802f469f1f3a0ebd66724ffe9b43624f26e1d9ab49", - "0xdccacd8bd107e69fd2d2c1a05f9bcc65811815f152e9f33ac433517436067435", - "0xa9c9a42a7e408bc6103693f019c44cf312f2b867b87abdceb95d900885156c7e", - "0x64a54e2bec44cafadb050f8cad94de6f390cd69c6f8f8bf7fca200a1d0e859cf", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0xf5Dbd1E1068c820B3d3BF5C7aDccCdef31148fEc": { - "beneficiary": "0xf5Dbd1E1068c820B3d3BF5C7aDccCdef31148fEc", - "amount": "38419185646987857490788", - "proof": [ - "0xb34b1bf4f016631efd72ccff37a0d8e84e2f118f875dafc308e59d805f794786", - "0xa01456766d8825696428909f6c3e941dcf5de191654537e0136fd697021b490d", - "0x52737961fc571d488330ffc563e960be948184ef4c4b65007117df97db388d06", - "0xe8725478de68bb2f70f03cdae0b58fb5de3d665ba62705d4d326ed9b5c097b79", - "0xc93e047f67535414778dfc6856cfd4414899e769239825a687683ea6a63e3e10", - "0x0051d7a32a1cc939dea0060ee90745718a7b84019b2411e1b966c49089e00273", - "0x0616b8a8fdf6a22d755f3735640770bdb2f6e7df4a6e1b23ed3647e9c3778bf6", - "0xe88bf217a61ba2f61cf5c969f3d4f4e916964ce659327135fdd0be2e7c72ee73", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0xf66201810dC33d20707E31d981cA088128f04616": { - "beneficiary": "0x52232F6b7600953036EA8A596EeC22C2597eC2e9", - "amount": "285682083668451121186326", - "proof": [ - "0x1942352ff98572f7527aa221896fb80028eeafc5155c2933aa536a9a95a9180a", - "0x0e78b5e8f80e7684fc6fb87aef7a5008cc62b17f2962d53291c10e935310f5c2", - "0xaaeb00bed52b9d925f1203df43f78fc3e6c0f32905f6b525282b6933f95c1789", - "0x8440e0d75827386a44bdad4b2918630de84d85dfe4ceb48cffc7b6440d64b8d2", - "0x59579fcafd7366cb9d52ae4c94f27332a10e08b985ba36d2846a772392ce0e75", - "0x56e2c6ad067fe01f6532e8274c819527bbc22e3d1a23f010e171e6616d445529", - "0x5edc99efd052e87ec503dc802fa8b259d16a891b72bc9ac38d7bc6d7b6f2552e", - "0x64a54e2bec44cafadb050f8cad94de6f390cd69c6f8f8bf7fca200a1d0e859cf", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0xF9283aC13aEc8a2B60a56A82F1f5E4dA1742CCf8": { - "beneficiary": "0xF9283aC13aEc8a2B60a56A82F1f5E4dA1742CCf8", - "amount": "886411289617709608580276", - "proof": [ - "0xaf4d8aa760652154fd293b7802134188c00a1f6e6fd9b54506534e0398dadeca", - "0xc4fa371aa4d07949fe863a19a480acc202d155fe9f04cb79378fb457e032a295", - "0x5d1e6444d5b809d1c96451c89399d489ded4a1f1f3a9e40ca1bddaf56048ecec", - "0x7f1c6ca19ff3cad4f632f6e3686736e3e262e7581772ab7d210d2cd01fd6a7c8", - "0xc93e047f67535414778dfc6856cfd4414899e769239825a687683ea6a63e3e10", - "0x0051d7a32a1cc939dea0060ee90745718a7b84019b2411e1b966c49089e00273", - "0x0616b8a8fdf6a22d755f3735640770bdb2f6e7df4a6e1b23ed3647e9c3778bf6", - "0xe88bf217a61ba2f61cf5c969f3d4f4e916964ce659327135fdd0be2e7c72ee73", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0xfc97a906c715587b56c2c65a07ce731ba80339de": { - "beneficiary": "0x075Aaa32756dAF39A437eF03e58F2Cb65cdA5Eb7", - "amount": "287310515940475555859966", - "proof": [ - "0x89935e18c24bc155fafa7846bc5fab5fb96b4053bbcbe9126b12b9f0f8c546bd", - "0x5b3ea2bc76c737619590f5f442f8f288fcbee4049e0ba2fb68a4630a23679b81", - "0x8a4f5f8748f65b9aca048bb60e6bd1461e8c2b1413ee4d491c6614791a0c7559", - "0x194ef47b96e0a314e70a2b8ce7439810c6bdee32118026f58b3ecf62e628911f", - "0x8ba5b958e3d50463abb92bcbd342d11326e4d7c366ee018c2d461fbb1df561b5", - "0x68dbcd1cbf24dfe8761794f995bcb03a39b7b92828d8898f64ee8ee429e9eb95", - "0x0616b8a8fdf6a22d755f3735640770bdb2f6e7df4a6e1b23ed3647e9c3778bf6", - "0xe88bf217a61ba2f61cf5c969f3d4f4e916964ce659327135fdd0be2e7c72ee73", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0xfD771E3e34A93E19CAaD4C11c3Be16c70d5ec2Fd": { - "beneficiary": "0xfD771E3e34A93E19CAaD4C11c3Be16c70d5ec2Fd", - "amount": "2143475729653184830637994", - "proof": [ - "0x4ce130fed9bc175dd58a250b67a690e470efae763b04e85f6d688f842f734845", - "0xe1fdbcd4f6cd94765e8c99188062eeb004d4da9d073094e4645895a4d37cd2d7", - "0xe5e7b64550ae2e510642b0ea2b10d90ee0615686ec19ad71eb429db97f369216", - "0x415ffea8e37ea074902c88356b1cda00766d9d007bfeafa3b419755ff21c4b40", - "0x2aa934f8f4fd48015f3837e029a329df9889527199e2ec1ae6ebe99d0bb412b0", - "0x062359f2025ff77d930f8f91e829b67beffb93b49ac378457b370c7980b2fc73", - "0xa9c9a42a7e408bc6103693f019c44cf312f2b867b87abdceb95d900885156c7e", - "0x64a54e2bec44cafadb050f8cad94de6f390cd69c6f8f8bf7fca200a1d0e859cf", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0xFEf6503A2cf17DB14fae5d5874A50522677cFcEc": { - "beneficiary": "0xFEf6503A2cf17DB14fae5d5874A50522677cFcEc", - "amount": "1288508357539534893605689", - "proof": [ - "0xd50273c7b10ade612007f32128e237ad837d16f945357f2b4e0ef8c4b6e097be", - "0x939d5a29d46451f27b2510df1d1da1c51df1631f56e41f260dc4922d89a68e89", - "0xdceadff0d0d92b8c9bd0df826f1edd9420485b6a91a4b8e02fc9008faeffb8e9", - "0xbee8645048977858a49c6a102da3ab08464842ef912df9d4e292488756727cbd", - "0xa66a31c956515e2b9d52e14019df281b7b65cb788fe21437b8ddacc320e2517e", - "0x97d9146e9833b3fdeba7c55987d17f362c03e476d0731aa6eda14684628e6b80", - "0x26d3258cdc1fc284a0d39b0082465afa7e9cfb3bad44bea5374d722bdb514d7f", - "0xe88bf217a61ba2f61cf5c969f3d4f4e916964ce659327135fdd0be2e7c72ee73", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0xfffE75557E73eAF670174d7B5fE348E31071b5c6": { - "beneficiary": "0xfffE75557E73eAF670174d7B5fE348E31071b5c6", - "amount": "32231366897095332168459", - "proof": [ - "0xd0eaa0966dfd39d84806296402d0ed5239128b6b29d3403d43459da977fe66fa", - "0x8cad50481e8fb2b8111923a0a70033a5ecc9f212834da02173a20a2a65332997", - "0x38f20aebf7710d3da6781cf3270423d9d3e412dc4aacce73b21f02aff8b94d62", - "0x8ae93be8304ef13b7e153cfe03598869b3fe1e0c5405174fd8150ee7c3c37df7", - "0xa66a31c956515e2b9d52e14019df281b7b65cb788fe21437b8ddacc320e2517e", - "0x97d9146e9833b3fdeba7c55987d17f362c03e476d0731aa6eda14684628e6b80", - "0x26d3258cdc1fc284a0d39b0082465afa7e9cfb3bad44bea5374d722bdb514d7f", - "0xe88bf217a61ba2f61cf5c969f3d4f4e916964ce659327135fdd0be2e7c72ee73", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x02A527084F5E73AF7781846762c8753aCD096461": { - "beneficiary": "0x02A527084F5E73AF7781846762c8753aCD096461", - "amount": "11367443079997980873133", - "proof": [ - "0x268650895965b2f7a7acd947fadf3f93783016f690ec9abc0f70b446fe0236bf", - "0x51059d9196b0974e948c5bf477fc73360ea09080231f43067e5f4761117514ea", - "0x383b36572a244d646eac259e00c109105527c9dab66204f3de807dcf9be25655", - "0x38d91c9958cb4cdec127466b1997494fd747e27b80a6ac39f6d4352ecc45666a", - "0xaf418cbc46d36f44acd10c35eff28186de90897d89719daa90ec8ad8f09b67b2", - "0x473f914d1f1ccc5b8b5de95bc12121123181242ea06fff9c8508a358398163b5", - "0x5edc99efd052e87ec503dc802fa8b259d16a891b72bc9ac38d7bc6d7b6f2552e", - "0x64a54e2bec44cafadb050f8cad94de6f390cd69c6f8f8bf7fca200a1d0e859cf", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x38190BA5080871CAD638Ba91b9D8dCb49576186B": { - "beneficiary": "0x38190BA5080871CAD638Ba91b9D8dCb49576186B", - "amount": "14297497871528200900668", - "proof": [ - "0xbf1b8f7175cc85c8367ba554cdcec90a7d1fa679abd24af519258d6f8f1fee78", - "0xd2ad46c50374c69c09a28eb50174015705d060240821bd540d6cce4d8b18bc5d", - "0x83774133fe53d4d0273d7005c97bc8f6ab37833c73ee07bea46a4c91a37ce4bb", - "0x071de73c7fdc53109dd4ff69b8fb3b2621edb92a109a6fc37c6481cb671605de", - "0x59a158af3ffa2849a033594affad303fb5e11aeecbdde0a878c909168e58d612", - "0x97d9146e9833b3fdeba7c55987d17f362c03e476d0731aa6eda14684628e6b80", - "0x26d3258cdc1fc284a0d39b0082465afa7e9cfb3bad44bea5374d722bdb514d7f", - "0xe88bf217a61ba2f61cf5c969f3d4f4e916964ce659327135fdd0be2e7c72ee73", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0xE257ced69027A245cB776850EA2B9A33Fe8C7D62": { - "beneficiary": "0xE257ced69027A245cB776850EA2B9A33Fe8C7D62", - "amount": "4640126400385493108886", - "proof": [ - "0x8ef86cbfc297fd1689f650a0f1bbda3edb4dcbc877536eecb1490a80f454427c", - "0xfcc35ed0415ef040a66472474250bc3b3511f8fdf78087d3d26f344992621a6c", - "0x381f45670d552b067a903a998529b7d17b0eeeb68f0737d7a6808123cfd20990", - "0xa947248fcc5a7ae879736246946a77fa43401f91d467acd89a1208f3cbd604b9", - "0xe4b02fad2ca92c21c555a2c6107ae084366477f8bf346a4fc1ddfe404454ce24", - "0x68dbcd1cbf24dfe8761794f995bcb03a39b7b92828d8898f64ee8ee429e9eb95", - "0x0616b8a8fdf6a22d755f3735640770bdb2f6e7df4a6e1b23ed3647e9c3778bf6", - "0xe88bf217a61ba2f61cf5c969f3d4f4e916964ce659327135fdd0be2e7c72ee73", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0xd0106457F2c82D13203347a65c739c0161D10601": { - "beneficiary": "0x7fff551249D223f723557a96a0e1a469C79cC934", - "amount": "1282372620879713679719415", - "proof": [ - "0xc76cafaae43191d2b7ae110294ea9479ce9892f261e8593199a9489ce4f6b950", - "0x3e8259ce8ba8cb3c6d74f279557d6c2bfc14e0bb987ddcded29ab85255d91b1b", - "0xb707eda71755ca61ec5cb9a12abf6ecdfb688d2c5a8bdd3a525e3df7c576b4c3", - "0xde4766412d1ecc2449d097e3b6b2b5bea1d00c24806fe806e0aee38702c19eef", - "0x59a158af3ffa2849a033594affad303fb5e11aeecbdde0a878c909168e58d612", - "0x97d9146e9833b3fdeba7c55987d17f362c03e476d0731aa6eda14684628e6b80", - "0x26d3258cdc1fc284a0d39b0082465afa7e9cfb3bad44bea5374d722bdb514d7f", - "0xe88bf217a61ba2f61cf5c969f3d4f4e916964ce659327135fdd0be2e7c72ee73", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x963371e9b74B098d20bdA9d2041Df178D9Bcc5A9": { - "beneficiary": "0xeB2C5b37431Ab1E687E79AF5480c7A558e0113cd", - "amount": "18856083952216267359624", - "proof": [ - "0x4935798e7743fd2668e634a15081505b7cea17c0dcda14bd6760619916dc5c10", - "0xe1fdbcd4f6cd94765e8c99188062eeb004d4da9d073094e4645895a4d37cd2d7", - "0xe5e7b64550ae2e510642b0ea2b10d90ee0615686ec19ad71eb429db97f369216", - "0x415ffea8e37ea074902c88356b1cda00766d9d007bfeafa3b419755ff21c4b40", - "0x2aa934f8f4fd48015f3837e029a329df9889527199e2ec1ae6ebe99d0bb412b0", - "0x062359f2025ff77d930f8f91e829b67beffb93b49ac378457b370c7980b2fc73", - "0xa9c9a42a7e408bc6103693f019c44cf312f2b867b87abdceb95d900885156c7e", - "0x64a54e2bec44cafadb050f8cad94de6f390cd69c6f8f8bf7fca200a1d0e859cf", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0xBC0Bf5f1d367259Cd381Ba77b219B8c3FbA9385d": { - "beneficiary": "0x8b5A788e821b16A7a6D7e7cC0875e0b91A05035B", - "amount": "448317683847710309011176", - "proof": [ - "0x257587197e5ce9a78c28efb6e7ad9872c93ff0c6cd68351aba1dfda47acb28e9", - "0x2891b963b2202af4a0bf730e50caf11504eb21b01ac288fde7833af5876145e9", - "0x383b36572a244d646eac259e00c109105527c9dab66204f3de807dcf9be25655", - "0x38d91c9958cb4cdec127466b1997494fd747e27b80a6ac39f6d4352ecc45666a", - "0xaf418cbc46d36f44acd10c35eff28186de90897d89719daa90ec8ad8f09b67b2", - "0x473f914d1f1ccc5b8b5de95bc12121123181242ea06fff9c8508a358398163b5", - "0x5edc99efd052e87ec503dc802fa8b259d16a891b72bc9ac38d7bc6d7b6f2552e", - "0x64a54e2bec44cafadb050f8cad94de6f390cd69c6f8f8bf7fca200a1d0e859cf", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x15514c33387eA753dA3B79083Dd17cA5E0B4d6A5": { - "beneficiary": "0x15514c33387eA753dA3B79083Dd17cA5E0B4d6A5", - "amount": "102272995785267234077", - "proof": [ - "0xece175c6e4fdd8a1e51487474d6b3627e60be1097851a57a6c9167d87ce8dacd", - "0xf1df73373aa4f27e49513792c493c7b8c7c5dd74a7c310f24a2d039ffb8ef0c3", - "0x6b88df0e50560634402641f3ab4caa0207713da2cd2a158610d5498a3ab0fc81", - "0xc590ad1b557e905ed766a2bd82993040517c1d8f828e67aff3a525f0a517e61b", - "0x0c126623518999de3f92b4a74e8cae9a113108254527d72d813d7e518009dd3c", - "0x22e1c098b7010d0cf32500ff774c2cb716f2a4797330e1b587bc650ded67c423", - "0x26d3258cdc1fc284a0d39b0082465afa7e9cfb3bad44bea5374d722bdb514d7f", - "0xe88bf217a61ba2f61cf5c969f3d4f4e916964ce659327135fdd0be2e7c72ee73", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x7C03E777742340cC9Bf8741dBaC8F2Bb349F1011": { - "beneficiary": "0x580d408aed344065A8F143404C1aC657FAd47185", - "amount": "157327844689700291376224", - "proof": [ - "0xd8ead7310b457a499dcb18aefa56d4f550276c5fff2168678e1afd4fa398ec99", - "0xe4b4bafb44dc02bae3d893ba78600406340da5d79aaecffd3050488d5c634c0c", - "0xc7402bdfbb1133115f7b63033ec3bdf028ef7b9e89e84ef195e6a3e2ee3bf9c8", - "0xbee8645048977858a49c6a102da3ab08464842ef912df9d4e292488756727cbd", - "0xa66a31c956515e2b9d52e14019df281b7b65cb788fe21437b8ddacc320e2517e", - "0x97d9146e9833b3fdeba7c55987d17f362c03e476d0731aa6eda14684628e6b80", - "0x26d3258cdc1fc284a0d39b0082465afa7e9cfb3bad44bea5374d722bdb514d7f", - "0xe88bf217a61ba2f61cf5c969f3d4f4e916964ce659327135fdd0be2e7c72ee73", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0xccF343eeF0c5f2590EE30EFc9F564B33AEb3C7E6": { - "beneficiary": "0xccF343eeF0c5f2590EE30EFc9F564B33AEb3C7E6", - "amount": "161848459751589635654490", - "proof": [ - "0xf583a5315a88c05e6733d4ca8840e771feba18cdff987746657e9fa3edb881e3", - "0xf6fa8677e49d70fec24e272b65a0ce7f477274b23d37e4f75c20950509f9a3f6", - "0x07db8cb3073df87fa6a9435d3941acf63e8a49876612e167a3f1dbfba76566c9", - "0x7375f825f0f31d047b6de1d51bf149632c6b6f51debb555d434075ee545fc9fb", - "0x0c126623518999de3f92b4a74e8cae9a113108254527d72d813d7e518009dd3c", - "0x22e1c098b7010d0cf32500ff774c2cb716f2a4797330e1b587bc650ded67c423", - "0x26d3258cdc1fc284a0d39b0082465afa7e9cfb3bad44bea5374d722bdb514d7f", - "0xe88bf217a61ba2f61cf5c969f3d4f4e916964ce659327135fdd0be2e7c72ee73", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x8d34285C047D5D8757551BAA45E471e62e72f468": { - "beneficiary": "0x8d34285C047D5D8757551BAA45E471e62e72f468", - "amount": "1409529762977597341208612", - "proof": [ - "0x8a76b1ce0bc191263e28b03b8c1a7ee54df35bee5ff27e8923ec9185346a3d15", - "0xe5c52839f369296dfcce8315eae477810a255c61b33bd94eecc6a42ff4e553c4", - "0x9be544b29d6b0c3b286ba9d45fde21291f9fb32a1867dea2c0d25c557d1c004f", - "0x194ef47b96e0a314e70a2b8ce7439810c6bdee32118026f58b3ecf62e628911f", - "0x8ba5b958e3d50463abb92bcbd342d11326e4d7c366ee018c2d461fbb1df561b5", - "0x68dbcd1cbf24dfe8761794f995bcb03a39b7b92828d8898f64ee8ee429e9eb95", - "0x0616b8a8fdf6a22d755f3735640770bdb2f6e7df4a6e1b23ed3647e9c3778bf6", - "0xe88bf217a61ba2f61cf5c969f3d4f4e916964ce659327135fdd0be2e7c72ee73", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0xB2e1515Dfe9BdE106299C33529C582e5388D195D": { - "beneficiary": "0xB2e1515Dfe9BdE106299C33529C582e5388D195D", - "amount": "119472245594680653773040", - "proof": [ - "0x5062e8654a405bef4b46cd97615abaaec93b4d6dd4ab1d6cc1e2788a9eade5fe", - "0xd5b655ac2f3bcaab1c975653acfaa8d14c9528faf6f4c809e7be9e74a5644985", - "0x0d85cbb20a66984e7ea0d073edbbdd831f6c4e07ad01f67df4cc56efa7a01052", - "0x195bb1e416a9464545527432ff9ea60c3e6383f802a3808a4151e24087c7c24b", - "0x01add4a2b7c01143892ca3fbd9ac6e2d294563bf8fe1296e127a7f43ce54824c", - "0x062359f2025ff77d930f8f91e829b67beffb93b49ac378457b370c7980b2fc73", - "0xa9c9a42a7e408bc6103693f019c44cf312f2b867b87abdceb95d900885156c7e", - "0x64a54e2bec44cafadb050f8cad94de6f390cd69c6f8f8bf7fca200a1d0e859cf", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x546568F389582c0f9B8fBe86FE6Ad00c145A891b": { - "beneficiary": "0x944BAf84ffb75b25Aa56af23f69F439A08Fa114d", - "amount": "35647082795969243706627", - "proof": [ - "0xa4dafb1a9add66cd1c98d0004552fc6f376380567633c25d662f1dcd3b06810d", - "0xb72f46ecd0e1fd4028ed54267b70ffed5facefff1fc4fdc634614045676cb450", - "0xa5858748f647690bd3608a8de80dfb90d16e8f0bc064dcb606ea9aa1f35cb8e9", - "0x58cf8a54810bc5371dbd254fdd1d17b9bdf629c32dcc26ae5ed527df75fb8b4e", - "0xdaae4d08c4b45294e520ad0f82a9cb506546db0d8fe3ec7c0e13d56d0f8c39d6", - "0x0051d7a32a1cc939dea0060ee90745718a7b84019b2411e1b966c49089e00273", - "0x0616b8a8fdf6a22d755f3735640770bdb2f6e7df4a6e1b23ed3647e9c3778bf6", - "0xe88bf217a61ba2f61cf5c969f3d4f4e916964ce659327135fdd0be2e7c72ee73", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0xBE9f25CA8F7db753387751a2625893aA871a129c": { - "beneficiary": "0xbF0904B1F5D14D50D09C2CB2DA204C58157e0A6c", - "amount": "242314822447036986989410", - "proof": [ - "0x20c3a21dfb2958a175672dffe2e99f082263e42fea593401f352a6bcd3fb562f", - "0x659f7778982d717b2be4038b524772ae6ac57828a32c12b20b8e46f6b6320ba5", - "0x973066e1e952aefb1059979f63e0cf94217cfadb4a6b8d31289bd65a36e64277", - "0xb768182dd2461f99365ec7ced124a86de6fe4d11bb77982ecd01f09400501e52", - "0xaf418cbc46d36f44acd10c35eff28186de90897d89719daa90ec8ad8f09b67b2", - "0x473f914d1f1ccc5b8b5de95bc12121123181242ea06fff9c8508a358398163b5", - "0x5edc99efd052e87ec503dc802fa8b259d16a891b72bc9ac38d7bc6d7b6f2552e", - "0x64a54e2bec44cafadb050f8cad94de6f390cd69c6f8f8bf7fca200a1d0e859cf", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0xA85cBB2742AF43f7579c232A0d326ea060Af55fD": { - "beneficiary": "0xA85cBB2742AF43f7579c232A0d326ea060Af55fD", - "amount": "8637064914056624411492", - "proof": [ - "0xf93be832ed3d963cbca0274aa3d5a61f5ba7e5f1e7d176116154b87f07d40db4", - "0x3499defca13555f14421994e01f71359da3c510231b19ea371a5ca3389572def", - "0x36834ec872fd40586a2c210d54c4dafea7ebadc78d2a655820a96518671dfc03", - "0x7375f825f0f31d047b6de1d51bf149632c6b6f51debb555d434075ee545fc9fb", - "0x0c126623518999de3f92b4a74e8cae9a113108254527d72d813d7e518009dd3c", - "0x22e1c098b7010d0cf32500ff774c2cb716f2a4797330e1b587bc650ded67c423", - "0x26d3258cdc1fc284a0d39b0082465afa7e9cfb3bad44bea5374d722bdb514d7f", - "0xe88bf217a61ba2f61cf5c969f3d4f4e916964ce659327135fdd0be2e7c72ee73", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0xbFe9adD6a77Adf1b4a0C55e77E5b521E40374728": { - "beneficiary": "0x461C01b68a205F4A9cc5d5dad628B25DE47B109B", - "amount": "167791088070180811215754", - "proof": [ - "0x3c361e9513fc7dd07473d7dbc8578c2193c25721eb17180f240fb02235cd574e", - "0x3ed33b029f56ad79c125231ebbeb87bddd3c51f579e716c8ca19b1094547b58d", - "0x837e79da682db653355e2733fb4ee6be6faf8b206c8181748e8264cbb6620b36", - "0x309156f7e96d9b52f8ddf5305643178e8482b927ee2703fff776b1c235be172f", - "0x9065ab73e0639a7701ce0c7ea4d24dc3a352eaf86d04cfe535ea8b3b19f43923", - "0x473f914d1f1ccc5b8b5de95bc12121123181242ea06fff9c8508a358398163b5", - "0x5edc99efd052e87ec503dc802fa8b259d16a891b72bc9ac38d7bc6d7b6f2552e", - "0x64a54e2bec44cafadb050f8cad94de6f390cd69c6f8f8bf7fca200a1d0e859cf", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0xc485339dBeaBdE28084F6c79d3311f90B7396BEE": { - "beneficiary": "0x68139393612209919Ed9E19Afb1200A40f1b3C17", - "amount": "7586374476339118239450", - "proof": [ - "0x088976f72d59dc30f691e97d227fcc626dad0baf3d5807b60c14da617e489573", - "0xfccad6d3d80491e4aa1b52336abb4d7efbb888a7aaf4daa00a237cbbdf98fda7", - "0x712cad967bfab73d3fedf0d4822868a1a8b0bde786ed4122b9e1fa5e9fee77f6", - "0xb9473c113468ef16d11e686668d79ec90e821e951c0387ac41ae0d97e3f5a0a3", - "0xde4d448a9d734de96d9aad546aff27580bbca08f960e04097175f5f07e34f665", - "0x56e2c6ad067fe01f6532e8274c819527bbc22e3d1a23f010e171e6616d445529", - "0x5edc99efd052e87ec503dc802fa8b259d16a891b72bc9ac38d7bc6d7b6f2552e", - "0x64a54e2bec44cafadb050f8cad94de6f390cd69c6f8f8bf7fca200a1d0e859cf", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0xe3B1C5653D520E8e8c60fE76dbC61f0e2259A376": { - "beneficiary": "0xe3B1C5653D520E8e8c60fE76dbC61f0e2259A376", - "amount": "52282516245615971210460", - "proof": [ - "0xa91a53d56f03af0e7278f800bfa99e5ffbe874369867dd47094d9f82b869a28b", - "0x4fb01e2f1afebb9983ba101908e9c7546fad346457a9a13418cb7ecb7415ad99", - "0x494640bb4e5d1873e085d9d5e29edc405575596861c8dc0a6c2e7dac55286e1d", - "0xf27c91795a530d7278a5dbfe1a56dccc1f214ed024d0ed7b115853a29f7b3f5a", - "0xdaae4d08c4b45294e520ad0f82a9cb506546db0d8fe3ec7c0e13d56d0f8c39d6", - "0x0051d7a32a1cc939dea0060ee90745718a7b84019b2411e1b966c49089e00273", - "0x0616b8a8fdf6a22d755f3735640770bdb2f6e7df4a6e1b23ed3647e9c3778bf6", - "0xe88bf217a61ba2f61cf5c969f3d4f4e916964ce659327135fdd0be2e7c72ee73", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x9FE9aA2e1b4686cA92a0bdC750E5467DFbeF4A31": { - "beneficiary": "0xb102542e2c8De8adD1d2dF9FB7A91052da7fE8e1", - "amount": "1161282998678199774083935", - "proof": [ - "0xf00a116c158e6fc5af1efc27788c6d33ff06eea1a06008e865e5e352c5fe9f33", - "0x86bde228967be37b43235fbafd7cafbe1f65dc8c0d7064cf9953799a39550fd3", - "0x6b88df0e50560634402641f3ab4caa0207713da2cd2a158610d5498a3ab0fc81", - "0xc590ad1b557e905ed766a2bd82993040517c1d8f828e67aff3a525f0a517e61b", - "0x0c126623518999de3f92b4a74e8cae9a113108254527d72d813d7e518009dd3c", - "0x22e1c098b7010d0cf32500ff774c2cb716f2a4797330e1b587bc650ded67c423", - "0x26d3258cdc1fc284a0d39b0082465afa7e9cfb3bad44bea5374d722bdb514d7f", - "0xe88bf217a61ba2f61cf5c969f3d4f4e916964ce659327135fdd0be2e7c72ee73", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x5f3Fa734CA6dfcE889a183DA90FFFF1Cd0ab08c8": { - "beneficiary": "0x5f3Fa734CA6dfcE889a183DA90FFFF1Cd0ab08c8", - "amount": "29769458249533265330760", - "proof": [ - "0x09f96d339f5d14bc2465f504d86b8844d6b32330e9e2f5f1f5a70b3558f639df", - "0x5d0513cad5d98c8ca0bd7bb234d9e4bddb73d68d01b9d817e7515ed963be59f1", - "0x192914324518265c3199e67a4976766b68529dd3d1460d0b729921238672069e", - "0x81e6adfcd37f44c1b0d192e02239acfdaa6943691bce8c4f017c99a8c59c17a7", - "0x59579fcafd7366cb9d52ae4c94f27332a10e08b985ba36d2846a772392ce0e75", - "0x56e2c6ad067fe01f6532e8274c819527bbc22e3d1a23f010e171e6616d445529", - "0x5edc99efd052e87ec503dc802fa8b259d16a891b72bc9ac38d7bc6d7b6f2552e", - "0x64a54e2bec44cafadb050f8cad94de6f390cd69c6f8f8bf7fca200a1d0e859cf", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x3D1677c20E7E0d20B4361FA9D361dbF2da5891a1": { - "beneficiary": "0xD8691A563CceaeD45126c5801AFf51Dd7E4bDB99", - "amount": "93533474608200549304426", - "proof": [ - "0x4e5407c54785ca4b242f1e8b2d0d8d7525b512505e0368cc38e3bbff77d9fae5", - "0x183d876e7bcea20db46c6a6a1ed7c9608f9c30a026816833b4a7863e49254db5", - "0xe5e7b64550ae2e510642b0ea2b10d90ee0615686ec19ad71eb429db97f369216", - "0x415ffea8e37ea074902c88356b1cda00766d9d007bfeafa3b419755ff21c4b40", - "0x2aa934f8f4fd48015f3837e029a329df9889527199e2ec1ae6ebe99d0bb412b0", - "0x062359f2025ff77d930f8f91e829b67beffb93b49ac378457b370c7980b2fc73", - "0xa9c9a42a7e408bc6103693f019c44cf312f2b867b87abdceb95d900885156c7e", - "0x64a54e2bec44cafadb050f8cad94de6f390cd69c6f8f8bf7fca200a1d0e859cf", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x8ea9ab079eACa83f3Ab9e1Aa0D62A60a3fa8e163": { - "beneficiary": "0x8ea9ab079eACa83f3Ab9e1Aa0D62A60a3fa8e163", - "amount": "10165213089300719055213", - "proof": [ - "0xd4b41fed3ad79de203f0bf5ad19f5ba4c5b706fc9f2210fe93eeed3dad40ff15", - "0xf87080b802ad4a114d20169feb6d3de815f622bca7db0211e7f28f30f4cd200a", - "0xdceadff0d0d92b8c9bd0df826f1edd9420485b6a91a4b8e02fc9008faeffb8e9", - "0xbee8645048977858a49c6a102da3ab08464842ef912df9d4e292488756727cbd", - "0xa66a31c956515e2b9d52e14019df281b7b65cb788fe21437b8ddacc320e2517e", - "0x97d9146e9833b3fdeba7c55987d17f362c03e476d0731aa6eda14684628e6b80", - "0x26d3258cdc1fc284a0d39b0082465afa7e9cfb3bad44bea5374d722bdb514d7f", - "0xe88bf217a61ba2f61cf5c969f3d4f4e916964ce659327135fdd0be2e7c72ee73", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x65694581f19089C2cbd285f98c65b93ba3AC4105": { - "beneficiary": "0x523Bb2155ac57032065ec7a6d80E6F74D5d74E0e", - "amount": "3989904916791181506849315", - "proof": [ - "0x15a699f3dbd7f0bcc33fa399ef26c7d625c49107a9a0f0125567dc71cf5f79bd", - "0x9522ecf19dea0e5bb7ffb7923722d2cda2f5dfe7c09f2c39838ecbd873d02966", - "0x2536cb3d4c792ff51ebbbe47b81a1bc64d310ec892ecf7535f57b19d45b59aec", - "0x8440e0d75827386a44bdad4b2918630de84d85dfe4ceb48cffc7b6440d64b8d2", - "0x59579fcafd7366cb9d52ae4c94f27332a10e08b985ba36d2846a772392ce0e75", - "0x56e2c6ad067fe01f6532e8274c819527bbc22e3d1a23f010e171e6616d445529", - "0x5edc99efd052e87ec503dc802fa8b259d16a891b72bc9ac38d7bc6d7b6f2552e", - "0x64a54e2bec44cafadb050f8cad94de6f390cd69c6f8f8bf7fca200a1d0e859cf", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0xecE5148Dc2Ec7031C2171959bAd71e9a3bB06DF5": { - "beneficiary": "0xecE5148Dc2Ec7031C2171959bAd71e9a3bB06DF5", - "amount": "163779911706886928070092", - "proof": [ - "0xdfbfce2f3e25993e8c68d6a6ca4273b3f0162c2945c63c1e0bd8be77be4ebcb1", - "0xc047522e9a8755e7637e1d62456a0be56802ba5086c1f711b383e406c678eb93", - "0x8db0c0a94e75a9e911f330627e557f5d2ef598dd6acb14c7611693655912539e", - "0x5c0e7f3ab44620fd21c2b93779b413a382833d74590f2ee16fb86cc3453a2561", - "0x2b33811bfbf525e09903057070381317c6e8580a978357fafa1f43ff94acc3cc", - "0x22e1c098b7010d0cf32500ff774c2cb716f2a4797330e1b587bc650ded67c423", - "0x26d3258cdc1fc284a0d39b0082465afa7e9cfb3bad44bea5374d722bdb514d7f", - "0xe88bf217a61ba2f61cf5c969f3d4f4e916964ce659327135fdd0be2e7c72ee73", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0xB6Ea680F5B94798522Ede503fAf413722f5510EE": { - "beneficiary": "0xdc780AaC63683D9bd1E5be8dd8453d03F802ED85", - "amount": "1211386932791095890411", - "proof": [ - "0x6f61756c7021b4d95afd063b66f4622a63bca81a96c9b7ee30933904e1acac19", - "0x2fd1dad04d3202fc08ac18ea7442c6481ef866779a6e1f6f962e76eae01504bc", - "0x02e26529c74d0e96999098660fb96d10e16e8f4b21b426cebfd43ccf388efcd0", - "0x75ed9565771fe8626b6ab84659ab178488320535301f990b32008cb8d6ffbf58", - "0x111fd987a5f671f7884a8783e2bebd8e1cc22bf533d05e0441bdfd228b345717", - "0xdccacd8bd107e69fd2d2c1a05f9bcc65811815f152e9f33ac433517436067435", - "0xa9c9a42a7e408bc6103693f019c44cf312f2b867b87abdceb95d900885156c7e", - "0x64a54e2bec44cafadb050f8cad94de6f390cd69c6f8f8bf7fca200a1d0e859cf", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0xC8ed4e8fC8cb5021e50422234a228aE4ACDcBb7A": { - "beneficiary": "0xC8ed4e8fC8cb5021e50422234a228aE4ACDcBb7A", - "amount": "9752487280885217486137", - "proof": [ - "0x719bdc03f23d9c3d849394e94e5c751e03cbdccb1497d3cc92a3ecd9e588c372", - "0x66b3ef3defd8105ad9f76781fa45f10021742152be7af549ae6d8119bb27ad8a", - "0x02e26529c74d0e96999098660fb96d10e16e8f4b21b426cebfd43ccf388efcd0", - "0x75ed9565771fe8626b6ab84659ab178488320535301f990b32008cb8d6ffbf58", - "0x111fd987a5f671f7884a8783e2bebd8e1cc22bf533d05e0441bdfd228b345717", - "0xdccacd8bd107e69fd2d2c1a05f9bcc65811815f152e9f33ac433517436067435", - "0xa9c9a42a7e408bc6103693f019c44cf312f2b867b87abdceb95d900885156c7e", - "0x64a54e2bec44cafadb050f8cad94de6f390cd69c6f8f8bf7fca200a1d0e859cf", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x229BeEaa51590c3abBc628aF55283B73Ed2DbF9d": { - "beneficiary": "0x229BeEaa51590c3abBc628aF55283B73Ed2DbF9d", - "amount": "162265141371172671206578", - "proof": [ - "0x8cedcebf17b2327caf3c325ff192b50260107221f8af148ae1526df675b25626", - "0xb8c88dc8b8383d63ec0c04a43009cf5aa9dae72e2c6f7b02f56e6446a8a86bfe", - "0x381f45670d552b067a903a998529b7d17b0eeeb68f0737d7a6808123cfd20990", - "0xa947248fcc5a7ae879736246946a77fa43401f91d467acd89a1208f3cbd604b9", - "0xe4b02fad2ca92c21c555a2c6107ae084366477f8bf346a4fc1ddfe404454ce24", - "0x68dbcd1cbf24dfe8761794f995bcb03a39b7b92828d8898f64ee8ee429e9eb95", - "0x0616b8a8fdf6a22d755f3735640770bdb2f6e7df4a6e1b23ed3647e9c3778bf6", - "0xe88bf217a61ba2f61cf5c969f3d4f4e916964ce659327135fdd0be2e7c72ee73", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x6051545df463E7982Bd375BEe83fc0Cfb6b731d2": { - "beneficiary": "0x6051545df463E7982Bd375BEe83fc0Cfb6b731d2", - "amount": "18452225592819609687931", - "proof": [ - "0xa48c3efe6eb5c0ae6903e03fdef978c9b270ce8f4525d85812c93d797961b3bd", - "0xb72f46ecd0e1fd4028ed54267b70ffed5facefff1fc4fdc634614045676cb450", - "0xa5858748f647690bd3608a8de80dfb90d16e8f0bc064dcb606ea9aa1f35cb8e9", - "0x58cf8a54810bc5371dbd254fdd1d17b9bdf629c32dcc26ae5ed527df75fb8b4e", - "0xdaae4d08c4b45294e520ad0f82a9cb506546db0d8fe3ec7c0e13d56d0f8c39d6", - "0x0051d7a32a1cc939dea0060ee90745718a7b84019b2411e1b966c49089e00273", - "0x0616b8a8fdf6a22d755f3735640770bdb2f6e7df4a6e1b23ed3647e9c3778bf6", - "0xe88bf217a61ba2f61cf5c969f3d4f4e916964ce659327135fdd0be2e7c72ee73", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x7c0b37aC444F09f40A1F89B49dc53bEf6829F8D0": { - "beneficiary": "0x69Ea7E674612D8CF84b464AdD12a31b08bf697B9", - "amount": "364132269594185493629509", - "proof": [ - "0xabac33653fb2480f35d23b538b885bf06c7637f7fdb07412807d442c0e4bfe9f", - "0xff8831a308aa3855ef9ad3ea45728ad8cf767651a634e9cc35a4035c0d2d7208", - "0x14a604fd723fbad977e58a30212fed06207ccb02347c83c52e6732f994daaf0d", - "0xf27c91795a530d7278a5dbfe1a56dccc1f214ed024d0ed7b115853a29f7b3f5a", - "0xdaae4d08c4b45294e520ad0f82a9cb506546db0d8fe3ec7c0e13d56d0f8c39d6", - "0x0051d7a32a1cc939dea0060ee90745718a7b84019b2411e1b966c49089e00273", - "0x0616b8a8fdf6a22d755f3735640770bdb2f6e7df4a6e1b23ed3647e9c3778bf6", - "0xe88bf217a61ba2f61cf5c969f3d4f4e916964ce659327135fdd0be2e7c72ee73", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0xDC09db6e5DA859eDeb7FC7bDCf47545056dC35F7": { - "beneficiary": "0xfeef177E6168F9b7fd59e6C5b6c2d87FF398c6FD", - "amount": "3131746761355648249619485", - "proof": [ - "0x3b07938011b971bdc4b77c05138f4b11c5b7d2b069a4bcae06a39a12ee19b1bd", - "0x6c5c51855f4771f1b50d8787c4369ee0ea8dd342a5445f2d506762f0516c1517", - "0x367ed10aa31c53c2f7ab417139c6060d5de223aeb60b78fbfc5687a74b48c391", - "0xa4c592d588cd922c6de1781284770256d4729b6287bdc700b97a2c852ff88d0f", - "0x9065ab73e0639a7701ce0c7ea4d24dc3a352eaf86d04cfe535ea8b3b19f43923", - "0x473f914d1f1ccc5b8b5de95bc12121123181242ea06fff9c8508a358398163b5", - "0x5edc99efd052e87ec503dc802fa8b259d16a891b72bc9ac38d7bc6d7b6f2552e", - "0x64a54e2bec44cafadb050f8cad94de6f390cd69c6f8f8bf7fca200a1d0e859cf", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0xdA08C16C86B78cD56CB10FDc0370EFc549d8638B": { - "beneficiary": "0x5cF1703A1c99A4b42Eb056535840e93118177232", - "amount": "5637144170440166849315066", - "proof": [ - "0xf8c16f6c33a5fd555d8d6c35a02b34f360530b570e5d8ac5da634fcaf179259b", - "0xc771def9e8457346951f9121e64171227b73d797ed53dbe1f08b3acad7849c59", - "0x36834ec872fd40586a2c210d54c4dafea7ebadc78d2a655820a96518671dfc03", - "0x7375f825f0f31d047b6de1d51bf149632c6b6f51debb555d434075ee545fc9fb", - "0x0c126623518999de3f92b4a74e8cae9a113108254527d72d813d7e518009dd3c", - "0x22e1c098b7010d0cf32500ff774c2cb716f2a4797330e1b587bc650ded67c423", - "0x26d3258cdc1fc284a0d39b0082465afa7e9cfb3bad44bea5374d722bdb514d7f", - "0xe88bf217a61ba2f61cf5c969f3d4f4e916964ce659327135fdd0be2e7c72ee73", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0xC0B851DCBf00bA59D8B1f490aF93dEC4275cFFcC": { - "beneficiary": "0x5cF1703A1c99A4b42Eb056535840e93118177232", - "amount": "5637231064230161849315066", - "proof": [ - "0xb1f7faccef08b824b014dbb3ccf3b12f69410664f0792700de60c4b5a2ff15d7", - "0xc35a17d70ca0050a1a8304e66b3a8be3b70c070587843c59e2ed7e63aea87302", - "0xd469028315cc5dcbcd4636e77c5d1bb3741a41dcd5d84359e167fe06a089770e", - "0x7f1c6ca19ff3cad4f632f6e3686736e3e262e7581772ab7d210d2cd01fd6a7c8", - "0xc93e047f67535414778dfc6856cfd4414899e769239825a687683ea6a63e3e10", - "0x0051d7a32a1cc939dea0060ee90745718a7b84019b2411e1b966c49089e00273", - "0x0616b8a8fdf6a22d755f3735640770bdb2f6e7df4a6e1b23ed3647e9c3778bf6", - "0xe88bf217a61ba2f61cf5c969f3d4f4e916964ce659327135fdd0be2e7c72ee73", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x372626FF774573E82eb7D4545EE96F68F75aaFF6": { - "beneficiary": "0x5cF1703A1c99A4b42Eb056535840e93118177232", - "amount": "5637426298323836849315066", - "proof": [ - "0xa8b0e7e4faa8f54c538a676159b9c0c266311b1e885bbeba98ce0b4d8754d5d6", - "0x4fb01e2f1afebb9983ba101908e9c7546fad346457a9a13418cb7ecb7415ad99", - "0x494640bb4e5d1873e085d9d5e29edc405575596861c8dc0a6c2e7dac55286e1d", - "0xf27c91795a530d7278a5dbfe1a56dccc1f214ed024d0ed7b115853a29f7b3f5a", - "0xdaae4d08c4b45294e520ad0f82a9cb506546db0d8fe3ec7c0e13d56d0f8c39d6", - "0x0051d7a32a1cc939dea0060ee90745718a7b84019b2411e1b966c49089e00273", - "0x0616b8a8fdf6a22d755f3735640770bdb2f6e7df4a6e1b23ed3647e9c3778bf6", - "0xe88bf217a61ba2f61cf5c969f3d4f4e916964ce659327135fdd0be2e7c72ee73", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0xB88A62417eb9e6320AF7620BE0CFBE2dddd435A5": { - "beneficiary": "0x5cF1703A1c99A4b42Eb056535840e93118177232", - "amount": "5636975671902146849315066", - "proof": [ - "0x14cd8ad7a6e445376df7e05ee1cf35ae1d462c74a4e9e2ea1911c9dac887d69a", - "0xe45b13c8abea205b8a99e052553c1bb7cbdaf42a67a211a23647907d4d17c415", - "0x2536cb3d4c792ff51ebbbe47b81a1bc64d310ec892ecf7535f57b19d45b59aec", - "0x8440e0d75827386a44bdad4b2918630de84d85dfe4ceb48cffc7b6440d64b8d2", - "0x59579fcafd7366cb9d52ae4c94f27332a10e08b985ba36d2846a772392ce0e75", - "0x56e2c6ad067fe01f6532e8274c819527bbc22e3d1a23f010e171e6616d445529", - "0x5edc99efd052e87ec503dc802fa8b259d16a891b72bc9ac38d7bc6d7b6f2552e", - "0x64a54e2bec44cafadb050f8cad94de6f390cd69c6f8f8bf7fca200a1d0e859cf", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0xb78F9EFE4F713feEFcAB466d2ee41972a0E45205": { - "beneficiary": "0x5cF1703A1c99A4b42Eb056535840e93118177232", - "amount": "5623292181525701849315066", - "proof": [ - "0x7cc2ffa7d6ea08b264043f953ba5afc98733fb9b798d2a35d6d8b04daef0d9ca", - "0x95a40bfb62f83cc1db638bd41e73f0a220059eb6a80f4c6f62ab96ba07597d63", - "0xbc8bbd3bf840accfe3028f77db7ff9d42c92b810abdacce3210a0eab351623fa", - "0xeab42a7f7084e021a91d743173e7d8d1a35b408ed9f715b7f36249a621338a21", - "0x8ba5b958e3d50463abb92bcbd342d11326e4d7c366ee018c2d461fbb1df561b5", - "0x68dbcd1cbf24dfe8761794f995bcb03a39b7b92828d8898f64ee8ee429e9eb95", - "0x0616b8a8fdf6a22d755f3735640770bdb2f6e7df4a6e1b23ed3647e9c3778bf6", - "0xe88bf217a61ba2f61cf5c969f3d4f4e916964ce659327135fdd0be2e7c72ee73", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x88C28632cB5B74dC6aEF60B98b4660Ef76bEe730": { - "beneficiary": "0xAc5036FE71ce0270c68d0B06Fe3A367cd6F73Ec4", - "amount": "175324561580236962393235", - "proof": [ - "0x1225a87ce563d769af549e7ce4016736768dfed4781b9327dd57e9a028b6845e", - "0x88116c84c9c6bfa1b48e4a636fda11a12d198997d3040da1348ff63a5563f1d9", - "0x8bca85e7e99b46a34b8e46abc4c002ac730b9a980ef52d5c0f92c967c38b7d96", - "0x81e6adfcd37f44c1b0d192e02239acfdaa6943691bce8c4f017c99a8c59c17a7", - "0x59579fcafd7366cb9d52ae4c94f27332a10e08b985ba36d2846a772392ce0e75", - "0x56e2c6ad067fe01f6532e8274c819527bbc22e3d1a23f010e171e6616d445529", - "0x5edc99efd052e87ec503dc802fa8b259d16a891b72bc9ac38d7bc6d7b6f2552e", - "0x64a54e2bec44cafadb050f8cad94de6f390cd69c6f8f8bf7fca200a1d0e859cf", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x86B9Cd2a05015c176adD9A650a9F53A7927F18Cf": { - "beneficiary": "0xfFd22b84fB1d46ef74Ed6530b2635BE61340f347", - "amount": "110912787171803652968037", - "proof": [ - "0x9978a237d641b2925afee9cf1a262b932808c541095100860f451d975a170980", - "0x9ad32dbf55f5d81e1ff907278e52991cfc54af16dd21ad98eea1338b91c992cd", - "0x08386d2f8bb88fd2e59c782888ffcd6c4e14cfc4af0c16b1147aa7df717d953b", - "0x8e0a201871d267e73e63f23088bd1e9d8c9a8b763ee4dfe53afad4a412370179", - "0xe4b02fad2ca92c21c555a2c6107ae084366477f8bf346a4fc1ddfe404454ce24", - "0x68dbcd1cbf24dfe8761794f995bcb03a39b7b92828d8898f64ee8ee429e9eb95", - "0x0616b8a8fdf6a22d755f3735640770bdb2f6e7df4a6e1b23ed3647e9c3778bf6", - "0xe88bf217a61ba2f61cf5c969f3d4f4e916964ce659327135fdd0be2e7c72ee73", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0xCcBF76580832b7eba3dbD1ea2A0e7cBcBA3eC7E8": { - "beneficiary": "0x846A301D6143b9260753374B225e8D68cA37005C", - "amount": "317558728842204710886328", - "proof": [ - "0x4fd2250be431013b20e99e1559efd505b916e2c31ac07bf060ed6dfff8443da0", - "0x35e5ee3eecfc79480122f717bd142d97883634f8f7047297fb38b93233fc1f29", - "0x0d85cbb20a66984e7ea0d073edbbdd831f6c4e07ad01f67df4cc56efa7a01052", - "0x195bb1e416a9464545527432ff9ea60c3e6383f802a3808a4151e24087c7c24b", - "0x01add4a2b7c01143892ca3fbd9ac6e2d294563bf8fe1296e127a7f43ce54824c", - "0x062359f2025ff77d930f8f91e829b67beffb93b49ac378457b370c7980b2fc73", - "0xa9c9a42a7e408bc6103693f019c44cf312f2b867b87abdceb95d900885156c7e", - "0x64a54e2bec44cafadb050f8cad94de6f390cd69c6f8f8bf7fca200a1d0e859cf", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x797Dfc15938338BD595933A8bE9C2ff3018d67A1": { - "beneficiary": "0x797Dfc15938338BD595933A8bE9C2ff3018d67A1", - "amount": "32804256031589596416382", - "proof": [ - "0x5c06961720f39755b2f8bba4b6aa3a73fcb23fa930524f4cd5287fc39f551aac", - "0x5ae6aa3bf87b71a3b3321ad33b6af54abc4bda93b86f11432e6800381d54050a", - "0xef535b2ff4fcea89acbf67534166da85ab154c659b4e2848dd95abdb87090654", - "0xd2ea19db53b4fc2b4b69c5c7337ab4b3eeb8e32ad07e477402839a2d22673a61", - "0x01add4a2b7c01143892ca3fbd9ac6e2d294563bf8fe1296e127a7f43ce54824c", - "0x062359f2025ff77d930f8f91e829b67beffb93b49ac378457b370c7980b2fc73", - "0xa9c9a42a7e408bc6103693f019c44cf312f2b867b87abdceb95d900885156c7e", - "0x64a54e2bec44cafadb050f8cad94de6f390cd69c6f8f8bf7fca200a1d0e859cf", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x70A2ce2d0b66061B44FEf41d3EcF89b5a9e7522A": { - "beneficiary": "0x70A2ce2d0b66061B44FEf41d3EcF89b5a9e7522A", - "amount": "68510451973325566543039", - "proof": [ - "0xbe4a13291834b097ac4eab8cddadf4fe602e8fc70648bf0f81667a327c21f18d", - "0x637be3596a99e9ce4244841b5d1517b124a958123a3a43efee4cea18474b7bb6", - "0x83774133fe53d4d0273d7005c97bc8f6ab37833c73ee07bea46a4c91a37ce4bb", - "0x071de73c7fdc53109dd4ff69b8fb3b2621edb92a109a6fc37c6481cb671605de", - "0x59a158af3ffa2849a033594affad303fb5e11aeecbdde0a878c909168e58d612", - "0x97d9146e9833b3fdeba7c55987d17f362c03e476d0731aa6eda14684628e6b80", - "0x26d3258cdc1fc284a0d39b0082465afa7e9cfb3bad44bea5374d722bdb514d7f", - "0xe88bf217a61ba2f61cf5c969f3d4f4e916964ce659327135fdd0be2e7c72ee73", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x24a278d2873879dcC8a17f504A75BFfcD4A3153a": { - "beneficiary": "0x6950c4C7E97c7d2e6b5bffEC4634f841DB2A5f3D", - "amount": "7665210495840985302310551", - "proof": [ - "0xfa1bc899c727446a92037d01d878d51cb5e3b6cdd6c700cb4bbb917edcdef207", - "0x39bf6126aa344558af5bf0bdf6b3dee9c408f3cb9a8188a73f6e515367902525", - "0xb1df75fb8fb0b20c38c83448e01848ccbff4039efb40291cc907eb04faac03ef", - "0x4310adee41342f5a15a53ffbfe9522206c39076254ea7b34d6ea33b6a9398bde" - ] - }, - "0x58F197D2647C1f45d7308fd20157aaEaF5040Faa": { - "beneficiary": "0x6950c4C7E97c7d2e6b5bffEC4634f841DB2A5f3D", - "amount": "7665655471150818720178425", - "proof": [ - "0xa95cc6bd98ab4ec4f31ab88266a65dbc565b20dac5eda9b72540fba40acde979", - "0x3f6c576d8fab79863cb9216ffec9c9138fdb4b6f5d10fd642d8fadaec8e91206", - "0x14a604fd723fbad977e58a30212fed06207ccb02347c83c52e6732f994daaf0d", - "0xf27c91795a530d7278a5dbfe1a56dccc1f214ed024d0ed7b115853a29f7b3f5a", - "0xdaae4d08c4b45294e520ad0f82a9cb506546db0d8fe3ec7c0e13d56d0f8c39d6", - "0x0051d7a32a1cc939dea0060ee90745718a7b84019b2411e1b966c49089e00273", - "0x0616b8a8fdf6a22d755f3735640770bdb2f6e7df4a6e1b23ed3647e9c3778bf6", - "0xe88bf217a61ba2f61cf5c969f3d4f4e916964ce659327135fdd0be2e7c72ee73", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x6184C57B7B87EbBf7fa9eB6933682a781777f81D": { - "beneficiary": "0x6950c4C7E97c7d2e6b5bffEC4634f841DB2A5f3D", - "amount": "7665897568210013519873391", - "proof": [ - "0x00cd940514b848be069a12a51c25f852e953219a87d0534cb9828175b88adc67", - "0x5662fa220c8ee1a83a2d332862889e7dddfefe3cb7121df0a558e0f77ee15168", - "0x409d28f2187aa20196f7e88689dfe27d40d76efa9726b55b953b5eaed00166a0", - "0x4c5007a8d6e515ed558b22a1e3df53f27975e71b334407ce8c34529d3336513b", - "0xde4d448a9d734de96d9aad546aff27580bbca08f960e04097175f5f07e34f665", - "0x56e2c6ad067fe01f6532e8274c819527bbc22e3d1a23f010e171e6616d445529", - "0x5edc99efd052e87ec503dc802fa8b259d16a891b72bc9ac38d7bc6d7b6f2552e", - "0x64a54e2bec44cafadb050f8cad94de6f390cd69c6f8f8bf7fca200a1d0e859cf", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0xb42543Aa1C4a75e1B317b752b82E64513989fEA6": { - "beneficiary": "0x6950c4C7E97c7d2e6b5bffEC4634f841DB2A5f3D", - "amount": "7665772974232236770263577", - "proof": [ - "0x62faa1e9bf94f570db0313905e61b817445d26b822670765debdf83f4f61d5b4", - "0x56ef3310d0b2e36f1580215a1089fa85c627d1e00584bfc79958874499ffb5bf", - "0xf9b57c1951dfbf293193b50bf24af02d2d09c43d662e743c9fb018b7ad3af2ea", - "0x8480db728010621a6968b7aa3634f14b1865f27ddec19c5d9479b58ed9b93f2f", - "0x0c99d2be5d1dbc03058e95802f469f1f3a0ebd66724ffe9b43624f26e1d9ab49", - "0xdccacd8bd107e69fd2d2c1a05f9bcc65811815f152e9f33ac433517436067435", - "0xa9c9a42a7e408bc6103693f019c44cf312f2b867b87abdceb95d900885156c7e", - "0x64a54e2bec44cafadb050f8cad94de6f390cd69c6f8f8bf7fca200a1d0e859cf", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0xEd2A484d48F7782047c2De930D236Ef2A18eE195": { - "beneficiary": "0x6950c4C7E97c7d2e6b5bffEC4634f841DB2A5f3D", - "amount": "7664990767734632821863385", - "proof": [ - "0x1234fe710eab6e44b14f3e499a30368ebfba40aa4a4bfb09ac8b4dbfb5fb7d03", - "0x88116c84c9c6bfa1b48e4a636fda11a12d198997d3040da1348ff63a5563f1d9", - "0x8bca85e7e99b46a34b8e46abc4c002ac730b9a980ef52d5c0f92c967c38b7d96", - "0x81e6adfcd37f44c1b0d192e02239acfdaa6943691bce8c4f017c99a8c59c17a7", - "0x59579fcafd7366cb9d52ae4c94f27332a10e08b985ba36d2846a772392ce0e75", - "0x56e2c6ad067fe01f6532e8274c819527bbc22e3d1a23f010e171e6616d445529", - "0x5edc99efd052e87ec503dc802fa8b259d16a891b72bc9ac38d7bc6d7b6f2552e", - "0x64a54e2bec44cafadb050f8cad94de6f390cd69c6f8f8bf7fca200a1d0e859cf", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x1274b1Fb60bDB94a4DDDcac9c918930cafc95078": { - "beneficiary": "0x6950c4C7E97c7d2e6b5bffEC4634f841DB2A5f3D", - "amount": "7665116176741711762847495", - "proof": [ - "0xe4aa34175d8030814bfc70c6f713cdd8734ac3a00abd2a06a974166dd764365f", - "0x117ed41e3b1d06a464e0acfa1a53d5e9327593baab14363dc98af9950ad77770", - "0x374dd84638a2a3636a82f1150c48f186293928c4491d9d2515966ffe82017628", - "0xa49f8baaa05c9a49015d13c2cb5a475342d4cb3ba2a697b0667d22289fefe496", - "0x2b33811bfbf525e09903057070381317c6e8580a978357fafa1f43ff94acc3cc", - "0x22e1c098b7010d0cf32500ff774c2cb716f2a4797330e1b587bc650ded67c423", - "0x26d3258cdc1fc284a0d39b0082465afa7e9cfb3bad44bea5374d722bdb514d7f", - "0xe88bf217a61ba2f61cf5c969f3d4f4e916964ce659327135fdd0be2e7c72ee73", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0xF4F55133da27351844792C19D0c85c57F45CbAD6": { - "beneficiary": "0x6950c4C7E97c7d2e6b5bffEC4634f841DB2A5f3D", - "amount": "7666007847696141756033630", - "proof": [ - "0x82eb6d1e767eacb8255e2690281af0085ce5cc88dc310e8758505e14929f1a3f", - "0xd2b32edda7ef5bcce7f8983f00725fc53dabb90e901853a211537c2e2b5b0805", - "0x8a4f5f8748f65b9aca048bb60e6bd1461e8c2b1413ee4d491c6614791a0c7559", - "0x194ef47b96e0a314e70a2b8ce7439810c6bdee32118026f58b3ecf62e628911f", - "0x8ba5b958e3d50463abb92bcbd342d11326e4d7c366ee018c2d461fbb1df561b5", - "0x68dbcd1cbf24dfe8761794f995bcb03a39b7b92828d8898f64ee8ee429e9eb95", - "0x0616b8a8fdf6a22d755f3735640770bdb2f6e7df4a6e1b23ed3647e9c3778bf6", - "0xe88bf217a61ba2f61cf5c969f3d4f4e916964ce659327135fdd0be2e7c72ee73", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x16fCc54E027a342F0683263eb43Cd9af1BD72169": { - "beneficiary": "0x2F4D70234651eCC8Ce28dACaBfC3ebD0993eb548", - "amount": "4908379616742295102637203", - "proof": [ - "0xa83260accabae3cd10294699caadde5a09def71efade5f3b3a6ea5aa4967cee2", - "0x7bf6523c1271d4a2f093c8445131a535d649e86647be2df907a91a0d69666620", - "0x494640bb4e5d1873e085d9d5e29edc405575596861c8dc0a6c2e7dac55286e1d", - "0xf27c91795a530d7278a5dbfe1a56dccc1f214ed024d0ed7b115853a29f7b3f5a", - "0xdaae4d08c4b45294e520ad0f82a9cb506546db0d8fe3ec7c0e13d56d0f8c39d6", - "0x0051d7a32a1cc939dea0060ee90745718a7b84019b2411e1b966c49089e00273", - "0x0616b8a8fdf6a22d755f3735640770bdb2f6e7df4a6e1b23ed3647e9c3778bf6", - "0xe88bf217a61ba2f61cf5c969f3d4f4e916964ce659327135fdd0be2e7c72ee73", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0xCC957f683a7e3093388946d03193Eee10086b900": { - "beneficiary": "0x2F4D70234651eCC8Ce28dACaBfC3ebD0993eb548", - "amount": "4906403481648544580949018", - "proof": [ - "0xd66a19aad7327216f26e53b30f92f491694cb32a89c6069fd2b95a2c7a7bb69c", - "0x939d5a29d46451f27b2510df1d1da1c51df1631f56e41f260dc4922d89a68e89", - "0xdceadff0d0d92b8c9bd0df826f1edd9420485b6a91a4b8e02fc9008faeffb8e9", - "0xbee8645048977858a49c6a102da3ab08464842ef912df9d4e292488756727cbd", - "0xa66a31c956515e2b9d52e14019df281b7b65cb788fe21437b8ddacc320e2517e", - "0x97d9146e9833b3fdeba7c55987d17f362c03e476d0731aa6eda14684628e6b80", - "0x26d3258cdc1fc284a0d39b0082465afa7e9cfb3bad44bea5374d722bdb514d7f", - "0xe88bf217a61ba2f61cf5c969f3d4f4e916964ce659327135fdd0be2e7c72ee73", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0xEAE5790C6eE3b6425f39D3Fd33644a7cb90C75A5": { - "beneficiary": "0x2F4D70234651eCC8Ce28dACaBfC3ebD0993eb548", - "amount": "4550415675925445716456954", - "proof": [ - "0xf58da138109636c34966fe3a911eb3468c938a1bcaa06221d15bc57e868d8cdd", - "0xf6fa8677e49d70fec24e272b65a0ce7f477274b23d37e4f75c20950509f9a3f6", - "0x07db8cb3073df87fa6a9435d3941acf63e8a49876612e167a3f1dbfba76566c9", - "0x7375f825f0f31d047b6de1d51bf149632c6b6f51debb555d434075ee545fc9fb", - "0x0c126623518999de3f92b4a74e8cae9a113108254527d72d813d7e518009dd3c", - "0x22e1c098b7010d0cf32500ff774c2cb716f2a4797330e1b587bc650ded67c423", - "0x26d3258cdc1fc284a0d39b0082465afa7e9cfb3bad44bea5374d722bdb514d7f", - "0xe88bf217a61ba2f61cf5c969f3d4f4e916964ce659327135fdd0be2e7c72ee73", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x02faA4286eF91247f8D09F36618D4694717F76bB": { - "beneficiary": "0x2F4D70234651eCC8Ce28dACaBfC3ebD0993eb548", - "amount": "4550638523057942121031499", - "proof": [ - "0x610a9196d36b9d7af8fb761a73229f8a628041987768133ec1f8af29ab9a4bc3", - "0xdc9197716a65292572fa51f1463f6128091d2d80707c2f08cdc7a1da5f2ff1e4", - "0x3425029c00bb6dd5db0e9be696fed0ad583aa55eb07da6d730411aeeb2d82870", - "0x8480db728010621a6968b7aa3634f14b1865f27ddec19c5d9479b58ed9b93f2f", - "0x0c99d2be5d1dbc03058e95802f469f1f3a0ebd66724ffe9b43624f26e1d9ab49", - "0xdccacd8bd107e69fd2d2c1a05f9bcc65811815f152e9f33ac433517436067435", - "0xa9c9a42a7e408bc6103693f019c44cf312f2b867b87abdceb95d900885156c7e", - "0x64a54e2bec44cafadb050f8cad94de6f390cd69c6f8f8bf7fca200a1d0e859cf", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0xBa1Ac67539c09AdDe63335635869c86f8e463514": { - "beneficiary": "0x2F4D70234651eCC8Ce28dACaBfC3ebD0993eb548", - "amount": "4905272506214281560216979", - "proof": [ - "0x3c107943db0de02681dd1e545850d76d1579e130c0d21ffe645793a11fe70fc9", - "0x3ed33b029f56ad79c125231ebbeb87bddd3c51f579e716c8ca19b1094547b58d", - "0x837e79da682db653355e2733fb4ee6be6faf8b206c8181748e8264cbb6620b36", - "0x309156f7e96d9b52f8ddf5305643178e8482b927ee2703fff776b1c235be172f", - "0x9065ab73e0639a7701ce0c7ea4d24dc3a352eaf86d04cfe535ea8b3b19f43923", - "0x473f914d1f1ccc5b8b5de95bc12121123181242ea06fff9c8508a358398163b5", - "0x5edc99efd052e87ec503dc802fa8b259d16a891b72bc9ac38d7bc6d7b6f2552e", - "0x64a54e2bec44cafadb050f8cad94de6f390cd69c6f8f8bf7fca200a1d0e859cf", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0xa6E3A08FaE33898fC31C4f6C7a584827D809352D": { - "beneficiary": "0xa6E3A08FaE33898fC31C4f6C7a584827D809352D", - "amount": "2725270433108623107640522", - "proof": [ - "0xe76fffac5bd5c4c37392bc79eba11ba1704ba9a9d0de12b7fe71368305d5ce72", - "0x39968c4f258a473b7ad8119e03f26baaadb8ee9701f1ca3a69e0f082aaaa9b30", - "0xf5d221ebb809dc8317010cac306191773446b161afd53bd03d0cb41031b99735", - "0xa49f8baaa05c9a49015d13c2cb5a475342d4cb3ba2a697b0667d22289fefe496", - "0x2b33811bfbf525e09903057070381317c6e8580a978357fafa1f43ff94acc3cc", - "0x22e1c098b7010d0cf32500ff774c2cb716f2a4797330e1b587bc650ded67c423", - "0x26d3258cdc1fc284a0d39b0082465afa7e9cfb3bad44bea5374d722bdb514d7f", - "0xe88bf217a61ba2f61cf5c969f3d4f4e916964ce659327135fdd0be2e7c72ee73", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x4FD06c3B1AbF62bbcC395745224591c89ebceea8": { - "beneficiary": "0x4FD06c3B1AbF62bbcC395745224591c89ebceea8", - "amount": "1041502515427272748303808", - "proof": [ - "0x44c52af9b2eb7271c0076fcd60917cd73aa93a3f60f61bfa6e8eabfbf4d4a4e0", - "0xa02bfc200112b5dacf87f53442da990e098c6b9b3fcf0d0f03beecb904427fc1", - "0x64672ed0234009a704f607178ffa0f8075aa32ba2d1bfccaeb4c240165175042", - "0x415ffea8e37ea074902c88356b1cda00766d9d007bfeafa3b419755ff21c4b40", - "0x2aa934f8f4fd48015f3837e029a329df9889527199e2ec1ae6ebe99d0bb412b0", - "0x062359f2025ff77d930f8f91e829b67beffb93b49ac378457b370c7980b2fc73", - "0xa9c9a42a7e408bc6103693f019c44cf312f2b867b87abdceb95d900885156c7e", - "0x64a54e2bec44cafadb050f8cad94de6f390cd69c6f8f8bf7fca200a1d0e859cf", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x90995f26f874AcEb98f12E09E057FBD2E546B1Ea": { - "beneficiary": "0xeaf047aDfF888526210B95e2F1F9D10f5053574C", - "amount": "10192214846002431941643837", - "proof": [ - "0x9d6f16f2c4faba477509fa2ca1b5712dd7d3f8093b446d28a6678167433fe6e6", - "0xdff6554f72c7cc7ee084b526d8be1934f30f75da59022f386d7cce82d45054e2", - "0x7f18f34ee97e41e65206090a3b370166a5805110f67886a6c7b5e8d3a8dc0feb", - "0x8e0a201871d267e73e63f23088bd1e9d8c9a8b763ee4dfe53afad4a412370179", - "0xe4b02fad2ca92c21c555a2c6107ae084366477f8bf346a4fc1ddfe404454ce24", - "0x68dbcd1cbf24dfe8761794f995bcb03a39b7b92828d8898f64ee8ee429e9eb95", - "0x0616b8a8fdf6a22d755f3735640770bdb2f6e7df4a6e1b23ed3647e9c3778bf6", - "0xe88bf217a61ba2f61cf5c969f3d4f4e916964ce659327135fdd0be2e7c72ee73", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x4c92Fd5cA03F9700dB0Ca90B130B768c5E75A2DE": { - "beneficiary": "0x4c92Fd5cA03F9700dB0Ca90B130B768c5E75A2DE", - "amount": "674516120297993673897", - "proof": [ - "0xdf894f521fd4744be624112b8831fd2a40689f8b840f6b2e330ccd9a88348892", - "0xc047522e9a8755e7637e1d62456a0be56802ba5086c1f711b383e406c678eb93", - "0x8db0c0a94e75a9e911f330627e557f5d2ef598dd6acb14c7611693655912539e", - "0x5c0e7f3ab44620fd21c2b93779b413a382833d74590f2ee16fb86cc3453a2561", - "0x2b33811bfbf525e09903057070381317c6e8580a978357fafa1f43ff94acc3cc", - "0x22e1c098b7010d0cf32500ff774c2cb716f2a4797330e1b587bc650ded67c423", - "0x26d3258cdc1fc284a0d39b0082465afa7e9cfb3bad44bea5374d722bdb514d7f", - "0xe88bf217a61ba2f61cf5c969f3d4f4e916964ce659327135fdd0be2e7c72ee73", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x7CB5ee216032C527732bce22b409aC764207eF28": { - "beneficiary": "0x7CB5ee216032C527732bce22b409aC764207eF28", - "amount": "12332234143918572502928", - "proof": [ - "0x6a896318f0fd39d9dbfe8fdfdc0532e3b202227e6bd95ec99fa3c06b976665e3", - "0x1cac74bc6810eddddc2f0d895a472ad61d0c68931e00771139a58ebad1779f0d", - "0xcd21419563c765aad45b01547db78474bac0b5a5c9598ae1dd039405201b46cc", - "0x2636c723e4b0313d34aacb26a0c7d73dd94ed5f08ae04281a362b14207b628e2", - "0x111fd987a5f671f7884a8783e2bebd8e1cc22bf533d05e0441bdfd228b345717", - "0xdccacd8bd107e69fd2d2c1a05f9bcc65811815f152e9f33ac433517436067435", - "0xa9c9a42a7e408bc6103693f019c44cf312f2b867b87abdceb95d900885156c7e", - "0x64a54e2bec44cafadb050f8cad94de6f390cd69c6f8f8bf7fca200a1d0e859cf", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x422FcafA2f3E23B52AC34E6A94909467480155af": { - "beneficiary": "0x422FcafA2f3E23B52AC34E6A94909467480155af", - "amount": "1078090071001498584394980", - "proof": [ - "0xc1920825bb306847eb7c54f4630021fb78b661f9899ef030de42446340d43cf5", - "0x411cb569ab7b97cf9964902b0a1fe62d7166fa2895fac3f1e2e4471e8693b9e6", - "0x39b4a530ba57d463674facbaf8187b67879856a3dd362d8b3b9e155d18137146", - "0x071de73c7fdc53109dd4ff69b8fb3b2621edb92a109a6fc37c6481cb671605de", - "0x59a158af3ffa2849a033594affad303fb5e11aeecbdde0a878c909168e58d612", - "0x97d9146e9833b3fdeba7c55987d17f362c03e476d0731aa6eda14684628e6b80", - "0x26d3258cdc1fc284a0d39b0082465afa7e9cfb3bad44bea5374d722bdb514d7f", - "0xe88bf217a61ba2f61cf5c969f3d4f4e916964ce659327135fdd0be2e7c72ee73", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0xE9f73E649bE50EA458400cE97552c9a681d54475": { - "beneficiary": "0xeaf047aDfF888526210B95e2F1F9D10f5053574C", - "amount": "9632629834479006158942583", - "proof": [ - "0xc467ef502d3afb3f6c52f244814d87c0c90e462eba0bc7a2a90f683ff397fbd3", - "0x32c1b870b581a3f8be23b50550a775b2359193ea7d92fc564b068f4eb1007355", - "0x82a69a5e365b8c4cf4726a556e0993944e21f51bd9f4553a905be3f6ae1bfd84", - "0xde4766412d1ecc2449d097e3b6b2b5bea1d00c24806fe806e0aee38702c19eef", - "0x59a158af3ffa2849a033594affad303fb5e11aeecbdde0a878c909168e58d612", - "0x97d9146e9833b3fdeba7c55987d17f362c03e476d0731aa6eda14684628e6b80", - "0x26d3258cdc1fc284a0d39b0082465afa7e9cfb3bad44bea5374d722bdb514d7f", - "0xe88bf217a61ba2f61cf5c969f3d4f4e916964ce659327135fdd0be2e7c72ee73", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x4Ba2ee531B06f730970fAc6B2539529298842a5e": { - "beneficiary": "0x56aAAfA2689d2E934Aea427b1bCAFe781B838965", - "amount": "6098788060564454694551", - "proof": [ - "0xd3cff45075fe3de09a7a77643650c1a710414e9d215ddfa13a74db62054449e3", - "0xf87080b802ad4a114d20169feb6d3de815f622bca7db0211e7f28f30f4cd200a", - "0xdceadff0d0d92b8c9bd0df826f1edd9420485b6a91a4b8e02fc9008faeffb8e9", - "0xbee8645048977858a49c6a102da3ab08464842ef912df9d4e292488756727cbd", - "0xa66a31c956515e2b9d52e14019df281b7b65cb788fe21437b8ddacc320e2517e", - "0x97d9146e9833b3fdeba7c55987d17f362c03e476d0731aa6eda14684628e6b80", - "0x26d3258cdc1fc284a0d39b0082465afa7e9cfb3bad44bea5374d722bdb514d7f", - "0xe88bf217a61ba2f61cf5c969f3d4f4e916964ce659327135fdd0be2e7c72ee73", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0xaB734877012cAD14d2473970bf46D491387939a3": { - "beneficiary": "0xaB734877012cAD14d2473970bf46D491387939a3", - "amount": "212113225220062115399319", - "proof": [ - "0x8d52dc1acd2cdfd0fce88422734af5893cfc6c89a767a0b86de2e097b2ce4ece", - "0xb8c88dc8b8383d63ec0c04a43009cf5aa9dae72e2c6f7b02f56e6446a8a86bfe", - "0x381f45670d552b067a903a998529b7d17b0eeeb68f0737d7a6808123cfd20990", - "0xa947248fcc5a7ae879736246946a77fa43401f91d467acd89a1208f3cbd604b9", - "0xe4b02fad2ca92c21c555a2c6107ae084366477f8bf346a4fc1ddfe404454ce24", - "0x68dbcd1cbf24dfe8761794f995bcb03a39b7b92828d8898f64ee8ee429e9eb95", - "0x0616b8a8fdf6a22d755f3735640770bdb2f6e7df4a6e1b23ed3647e9c3778bf6", - "0xe88bf217a61ba2f61cf5c969f3d4f4e916964ce659327135fdd0be2e7c72ee73", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x400Fb37317C022f481d22d27Bc81E911A77d44d0": { - "beneficiary": "0xdD6Be8d99F13efC13AF09f32eC07dC0451E23B69", - "amount": "4025079087664287935652021", - "proof": [ - "0x6ec6d41f41fc109e35443613e8f17270752d9860902858c29b0653549bfc82de", - "0x2fd1dad04d3202fc08ac18ea7442c6481ef866779a6e1f6f962e76eae01504bc", - "0x02e26529c74d0e96999098660fb96d10e16e8f4b21b426cebfd43ccf388efcd0", - "0x75ed9565771fe8626b6ab84659ab178488320535301f990b32008cb8d6ffbf58", - "0x111fd987a5f671f7884a8783e2bebd8e1cc22bf533d05e0441bdfd228b345717", - "0xdccacd8bd107e69fd2d2c1a05f9bcc65811815f152e9f33ac433517436067435", - "0xa9c9a42a7e408bc6103693f019c44cf312f2b867b87abdceb95d900885156c7e", - "0x64a54e2bec44cafadb050f8cad94de6f390cd69c6f8f8bf7fca200a1d0e859cf", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x5046d05fF04172ECEf276d60294f8F16d70b1d27": { - "beneficiary": "0x85d2AD1eBa67FC0bf872fed79E848Fe3E2027725", - "amount": "3493332860463076554712889", - "proof": [ - "0xdc00c84806468aa8c335530daae737a6cb7de92fd33d337871f0bc43c3065960", - "0x717cb6e417d06f467adb4591d77e01ff6cc416adaee515d92315f9354deace95", - "0x09c06ef10072c2bc0fb9b31d06661c0358b2c8e3316f3444d4e31e18929a488c", - "0x5c0e7f3ab44620fd21c2b93779b413a382833d74590f2ee16fb86cc3453a2561", - "0x2b33811bfbf525e09903057070381317c6e8580a978357fafa1f43ff94acc3cc", - "0x22e1c098b7010d0cf32500ff774c2cb716f2a4797330e1b587bc650ded67c423", - "0x26d3258cdc1fc284a0d39b0082465afa7e9cfb3bad44bea5374d722bdb514d7f", - "0xe88bf217a61ba2f61cf5c969f3d4f4e916964ce659327135fdd0be2e7c72ee73", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x954EC27718De1444a56227199086a0aC710d73A3": { - "beneficiary": "0xdD6Be8d99F13efC13AF09f32eC07dC0451E23B69", - "amount": "4433010840170348732209534", - "proof": [ - "0xfd0487358d1bf833d99b867e1c0fbcc46114ee32dd4ac5ce99a780997db9da36", - "0xf99d5b3475d009f68c0e1f5cd8b5a8a47a8e8d90b2129f5abc187cf217297b9c", - "0x64da9595801ee748af5f9eea5084d398f08477627ec51013a220c80e367c8449", - "0x4310adee41342f5a15a53ffbfe9522206c39076254ea7b34d6ea33b6a9398bde" - ] - }, - "0x97d065B567cc4543D20dffaa7009f9aDe64d7E26": { - "beneficiary": "0x85d2AD1eBa67FC0bf872fed79E848Fe3E2027725", - "amount": "3843433501198819397245518", - "proof": [ - "0x249f4f6cc8ea1b88671851240ecebec8aefa61f8a7731ef05bf611c44754230a", - "0x2891b963b2202af4a0bf730e50caf11504eb21b01ac288fde7833af5876145e9", - "0x383b36572a244d646eac259e00c109105527c9dab66204f3de807dcf9be25655", - "0x38d91c9958cb4cdec127466b1997494fd747e27b80a6ac39f6d4352ecc45666a", - "0xaf418cbc46d36f44acd10c35eff28186de90897d89719daa90ec8ad8f09b67b2", - "0x473f914d1f1ccc5b8b5de95bc12121123181242ea06fff9c8508a358398163b5", - "0x5edc99efd052e87ec503dc802fa8b259d16a891b72bc9ac38d7bc6d7b6f2552e", - "0x64a54e2bec44cafadb050f8cad94de6f390cd69c6f8f8bf7fca200a1d0e859cf", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0xA19693259CFf37Ea4e29D3B1AB4176F52f01d2E2": { - "beneficiary": "0xdD6Be8d99F13efC13AF09f32eC07dC0451E23B69", - "amount": "4433327222559607562533804", - "proof": [ - "0x84a736ac065711601e1d12d606ea9fa9c80c65621332713b39b79410d3579c80", - "0xd2b32edda7ef5bcce7f8983f00725fc53dabb90e901853a211537c2e2b5b0805", - "0x8a4f5f8748f65b9aca048bb60e6bd1461e8c2b1413ee4d491c6614791a0c7559", - "0x194ef47b96e0a314e70a2b8ce7439810c6bdee32118026f58b3ecf62e628911f", - "0x8ba5b958e3d50463abb92bcbd342d11326e4d7c366ee018c2d461fbb1df561b5", - "0x68dbcd1cbf24dfe8761794f995bcb03a39b7b92828d8898f64ee8ee429e9eb95", - "0x0616b8a8fdf6a22d755f3735640770bdb2f6e7df4a6e1b23ed3647e9c3778bf6", - "0xe88bf217a61ba2f61cf5c969f3d4f4e916964ce659327135fdd0be2e7c72ee73", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0xAc4af8Ced85fb5eecfFCa71005566C8de9B7B6b4": { - "beneficiary": "0x85d2AD1eBa67FC0bf872fed79E848Fe3E2027725", - "amount": "3843598386192656940930396", - "proof": [ - "0x5ed2e201cfaa5f143580694c132becac15f8b0a106c2fef60a850bab12f23e7f", - "0x9a38f3c5b67f8195249f6fe8964cfdb5618c367c69de5c69829213277f00ae2e", - "0xe2469697f1b831d6635fddc64f2d541b1101565b1a61fa0742050530e161d913", - "0x797edd017f4003c1285ab77462d72a225c5599c94f0de400975080271269fef0", - "0x0c99d2be5d1dbc03058e95802f469f1f3a0ebd66724ffe9b43624f26e1d9ab49", - "0xdccacd8bd107e69fd2d2c1a05f9bcc65811815f152e9f33ac433517436067435", - "0xa9c9a42a7e408bc6103693f019c44cf312f2b867b87abdceb95d900885156c7e", - "0x64a54e2bec44cafadb050f8cad94de6f390cd69c6f8f8bf7fca200a1d0e859cf", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0xc1268db05E7bD38BD85b2C3Fef80F8968a2c933A": { - "beneficiary": "0xdD6Be8d99F13efC13AF09f32eC07dC0451E23B69", - "amount": "4413307986224050249698271", - "proof": [ - "0x5daabeae8861c76e05dab7545dd41891a6420bbe7fa56b9f17286b895f5cdb6a", - "0x5d35bcc3b76af92c81c20ef15a7075e358b619771db7c95cc8ca9bbe9ed3aeb6", - "0x72bd8f01249b9820f99ef97fbf7f6a7cdd350a3e7a3e5a1089c9b988b87ba7e2", - "0x797edd017f4003c1285ab77462d72a225c5599c94f0de400975080271269fef0", - "0x0c99d2be5d1dbc03058e95802f469f1f3a0ebd66724ffe9b43624f26e1d9ab49", - "0xdccacd8bd107e69fd2d2c1a05f9bcc65811815f152e9f33ac433517436067435", - "0xa9c9a42a7e408bc6103693f019c44cf312f2b867b87abdceb95d900885156c7e", - "0x64a54e2bec44cafadb050f8cad94de6f390cd69c6f8f8bf7fca200a1d0e859cf", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0xcd329faEF4aC1bEE655134f86cE2e5a8C9919Fd5": { - "beneficiary": "0x85d2AD1eBa67FC0bf872fed79E848Fe3E2027725", - "amount": "3843359941794700143588574", - "proof": [ - "0xf93190a7c9510396ef8d82b4610b9bf46dfff065471d5ba516e390ff8d54e58c", - "0xc771def9e8457346951f9121e64171227b73d797ed53dbe1f08b3acad7849c59", - "0x36834ec872fd40586a2c210d54c4dafea7ebadc78d2a655820a96518671dfc03", - "0x7375f825f0f31d047b6de1d51bf149632c6b6f51debb555d434075ee545fc9fb", - "0x0c126623518999de3f92b4a74e8cae9a113108254527d72d813d7e518009dd3c", - "0x22e1c098b7010d0cf32500ff774c2cb716f2a4797330e1b587bc650ded67c423", - "0x26d3258cdc1fc284a0d39b0082465afa7e9cfb3bad44bea5374d722bdb514d7f", - "0xe88bf217a61ba2f61cf5c969f3d4f4e916964ce659327135fdd0be2e7c72ee73", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0xe32077EFe851D1CbeA7cC282c93a749E7B90BC23": { - "beneficiary": "0x85d2AD1eBa67FC0bf872fed79E848Fe3E2027725", - "amount": "3843791649567977171432853", - "proof": [ - "0x43bc0a4e5630bba66609ec5015e3188878ea20de797967a11e4ea25dc4c3cb7d", - "0xccdfde8d2d1be35ea5c53ec73471d5489ab57e9e758a6083d17a240e8cc73823", - "0x0d1317bfede4b34dc2ab4a555179e25432816cfd8da26a6c597311119308eb29", - "0x39c2e82a79487da27ef5d8d6b31b3efb47564973a96a7f009a59ff3eee98e3d7", - "0x2aa934f8f4fd48015f3837e029a329df9889527199e2ec1ae6ebe99d0bb412b0", - "0x062359f2025ff77d930f8f91e829b67beffb93b49ac378457b370c7980b2fc73", - "0xa9c9a42a7e408bc6103693f019c44cf312f2b867b87abdceb95d900885156c7e", - "0x64a54e2bec44cafadb050f8cad94de6f390cd69c6f8f8bf7fca200a1d0e859cf", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x1Bb5948D3901F8418A8C7815dA7F3A03785C2F96": { - "beneficiary": "0x846A301D6143b9260753374B225e8D68cA37005C", - "amount": "351354963720671812405757", - "proof": [ - "0x3ee5c77c4c617a52951668ae4de6e62e43338b4cf80eb198a5e5ea4a367fd722", - "0x4ae7adbacf0fd8de874129de31e322abc7f2d4183e5ff3c87a3060d417afd68b", - "0x837e79da682db653355e2733fb4ee6be6faf8b206c8181748e8264cbb6620b36", - "0x309156f7e96d9b52f8ddf5305643178e8482b927ee2703fff776b1c235be172f", - "0x9065ab73e0639a7701ce0c7ea4d24dc3a352eaf86d04cfe535ea8b3b19f43923", - "0x473f914d1f1ccc5b8b5de95bc12121123181242ea06fff9c8508a358398163b5", - "0x5edc99efd052e87ec503dc802fa8b259d16a891b72bc9ac38d7bc6d7b6f2552e", - "0x64a54e2bec44cafadb050f8cad94de6f390cd69c6f8f8bf7fca200a1d0e859cf", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x862746864abe96DccFE7B87D476131417AF6105E": { - "beneficiary": "0xEbaeCD22304445A471630600708A197A311daB7F", - "amount": "1996763495745537206901021", - "proof": [ - "0xe6e6b3486fb8c8440794a97a1bb925e7d16d9236d1e876b5b1671ea52cedac60", - "0xbe6c4165de0cb5171b47cce41baa0f3ba6f2df2064a059b5133ac464d2c053f5", - "0xf5d221ebb809dc8317010cac306191773446b161afd53bd03d0cb41031b99735", - "0xa49f8baaa05c9a49015d13c2cb5a475342d4cb3ba2a697b0667d22289fefe496", - "0x2b33811bfbf525e09903057070381317c6e8580a978357fafa1f43ff94acc3cc", - "0x22e1c098b7010d0cf32500ff774c2cb716f2a4797330e1b587bc650ded67c423", - "0x26d3258cdc1fc284a0d39b0082465afa7e9cfb3bad44bea5374d722bdb514d7f", - "0xe88bf217a61ba2f61cf5c969f3d4f4e916964ce659327135fdd0be2e7c72ee73", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x1273eF0D368a2e32e4913252E9463E3916691DCE": { - "beneficiary": "0x1273eF0D368a2e32e4913252E9463E3916691DCE", - "amount": "723840460156331044419", - "proof": [ - "0xf5e95ba5b5a78e6c1ecda00f1d8b9aebc7f1965042181fa888954e6d1e06e800", - "0x7195c6ddef739166be7222bbf70a0956ca7a4ad5d4dee5d3064e1baf117e7cde", - "0x07db8cb3073df87fa6a9435d3941acf63e8a49876612e167a3f1dbfba76566c9", - "0x7375f825f0f31d047b6de1d51bf149632c6b6f51debb555d434075ee545fc9fb", - "0x0c126623518999de3f92b4a74e8cae9a113108254527d72d813d7e518009dd3c", - "0x22e1c098b7010d0cf32500ff774c2cb716f2a4797330e1b587bc650ded67c423", - "0x26d3258cdc1fc284a0d39b0082465afa7e9cfb3bad44bea5374d722bdb514d7f", - "0xe88bf217a61ba2f61cf5c969f3d4f4e916964ce659327135fdd0be2e7c72ee73", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x4bC6B29F272048b32BD833797a70049C3885225b": { - "beneficiary": "0x4bC6B29F272048b32BD833797a70049C3885225b", - "amount": "1169682442975416581228", - "proof": [ - "0x904d918c3d94247d35dcde92e8431ac024fb4f31d242e40df095de0b8e44828a", - "0xfcc35ed0415ef040a66472474250bc3b3511f8fdf78087d3d26f344992621a6c", - "0x381f45670d552b067a903a998529b7d17b0eeeb68f0737d7a6808123cfd20990", - "0xa947248fcc5a7ae879736246946a77fa43401f91d467acd89a1208f3cbd604b9", - "0xe4b02fad2ca92c21c555a2c6107ae084366477f8bf346a4fc1ddfe404454ce24", - "0x68dbcd1cbf24dfe8761794f995bcb03a39b7b92828d8898f64ee8ee429e9eb95", - "0x0616b8a8fdf6a22d755f3735640770bdb2f6e7df4a6e1b23ed3647e9c3778bf6", - "0xe88bf217a61ba2f61cf5c969f3d4f4e916964ce659327135fdd0be2e7c72ee73", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x3070f20f86fDa706Ac380F5060D256028a46eC29": { - "beneficiary": "0x3070f20f86fDa706Ac380F5060D256028a46eC29", - "amount": "7276210732704112648956", - "proof": [ - "0x66e02913af785e04216c24f3b33459c237e84c6d572f3c06fa411cb45d3841f8", - "0xbf93856b430bcc096052e33f829cc8c12453e723315fb5495f7994e9186efe53", - "0xcd21419563c765aad45b01547db78474bac0b5a5c9598ae1dd039405201b46cc", - "0x2636c723e4b0313d34aacb26a0c7d73dd94ed5f08ae04281a362b14207b628e2", - "0x111fd987a5f671f7884a8783e2bebd8e1cc22bf533d05e0441bdfd228b345717", - "0xdccacd8bd107e69fd2d2c1a05f9bcc65811815f152e9f33ac433517436067435", - "0xa9c9a42a7e408bc6103693f019c44cf312f2b867b87abdceb95d900885156c7e", - "0x64a54e2bec44cafadb050f8cad94de6f390cd69c6f8f8bf7fca200a1d0e859cf", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0xb5193Ff9121445f25330d60A54831DBF8960A79e": { - "beneficiary": "0xb5193Ff9121445f25330d60A54831DBF8960A79e", - "amount": "928302408342077174749", - "proof": [ - "0x5882f64053c857e6ba87091cdfe98430a8ca5cec687c67afb72e92dd80429fa3", - "0x0610d39f957e2c2a01d1e9b7faf85cf4ff9529d16838309435c7fc3c486c8ab7", - "0xbabfec64d5720d4e9e78f58b00b56aa86f1ea2b5129ca4db0c315adcedaab965", - "0xd2ea19db53b4fc2b4b69c5c7337ab4b3eeb8e32ad07e477402839a2d22673a61", - "0x01add4a2b7c01143892ca3fbd9ac6e2d294563bf8fe1296e127a7f43ce54824c", - "0x062359f2025ff77d930f8f91e829b67beffb93b49ac378457b370c7980b2fc73", - "0xa9c9a42a7e408bc6103693f019c44cf312f2b867b87abdceb95d900885156c7e", - "0x64a54e2bec44cafadb050f8cad94de6f390cd69c6f8f8bf7fca200a1d0e859cf", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x02B44C2250F5A2EaDd2415D23629f38CFc71F25C": { - "beneficiary": "0xdD6Be8d99F13efC13AF09f32eC07dC0451E23B69", - "amount": "3947716992033024696197273", - "proof": [ - "0x25c9fd950625c1c81332b79e90b27e7c7757b0cb0bc245bf24386235cfe0a5f3", - "0x51059d9196b0974e948c5bf477fc73360ea09080231f43067e5f4761117514ea", - "0x383b36572a244d646eac259e00c109105527c9dab66204f3de807dcf9be25655", - "0x38d91c9958cb4cdec127466b1997494fd747e27b80a6ac39f6d4352ecc45666a", - "0xaf418cbc46d36f44acd10c35eff28186de90897d89719daa90ec8ad8f09b67b2", - "0x473f914d1f1ccc5b8b5de95bc12121123181242ea06fff9c8508a358398163b5", - "0x5edc99efd052e87ec503dc802fa8b259d16a891b72bc9ac38d7bc6d7b6f2552e", - "0x64a54e2bec44cafadb050f8cad94de6f390cd69c6f8f8bf7fca200a1d0e859cf", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x42BF5fF61279eDDa10A6e8268A30640eD710a866": { - "beneficiary": "0x42BF5fF61279eDDa10A6e8268A30640eD710a866", - "amount": "287332665487367244909176", - "proof": [ - "0xff22d062b494ad79fb4beedb6e8d11784d2f9adccd52360bcb8b4747d3a620c2", - "0x1f303fd3bab63853e5f4db5c2cdd964cdaba210d57de2c0c411cb4839ce3f844", - "0x64da9595801ee748af5f9eea5084d398f08477627ec51013a220c80e367c8449", - "0x4310adee41342f5a15a53ffbfe9522206c39076254ea7b34d6ea33b6a9398bde" - ] - }, - "0xeb0b91452E77335c18Dee21467331dadAa77DA8D": { - "beneficiary": "0xcD326Fb405184cDa42A0D4a6D01199A83bed2862", - "amount": "368332553229719385466887", - "proof": [ - "0x1ee15f01df113da183cfef006ae270b9cbb24a6810ff4a4bf101bef2f84304af", - "0x02c4fc7f0d72d338a6e802336babd05bb434f00d8b9a15048dd6f545c2e75b1d", - "0xde616a8e64bec6de1b5d50337791cbe0ce0170f85a24dc66af7e637234bbc77d", - "0xb768182dd2461f99365ec7ced124a86de6fe4d11bb77982ecd01f09400501e52", - "0xaf418cbc46d36f44acd10c35eff28186de90897d89719daa90ec8ad8f09b67b2", - "0x473f914d1f1ccc5b8b5de95bc12121123181242ea06fff9c8508a358398163b5", - "0x5edc99efd052e87ec503dc802fa8b259d16a891b72bc9ac38d7bc6d7b6f2552e", - "0x64a54e2bec44cafadb050f8cad94de6f390cd69c6f8f8bf7fca200a1d0e859cf", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x735dcf0cAf62cd1bC8E763e43Bb1aA11DBC56025": { - "beneficiary": "0x3e4A71578B13bf8921C5B7750B0BfA0D3b4c6c3E", - "amount": "1150485327721009463414298", - "proof": [ - "0xbf139ec470be9cbd272db1a50b033893272cd32b1eb22416943c7f6ab6ece83d", - "0x637be3596a99e9ce4244841b5d1517b124a958123a3a43efee4cea18474b7bb6", - "0x83774133fe53d4d0273d7005c97bc8f6ab37833c73ee07bea46a4c91a37ce4bb", - "0x071de73c7fdc53109dd4ff69b8fb3b2621edb92a109a6fc37c6481cb671605de", - "0x59a158af3ffa2849a033594affad303fb5e11aeecbdde0a878c909168e58d612", - "0x97d9146e9833b3fdeba7c55987d17f362c03e476d0731aa6eda14684628e6b80", - "0x26d3258cdc1fc284a0d39b0082465afa7e9cfb3bad44bea5374d722bdb514d7f", - "0xe88bf217a61ba2f61cf5c969f3d4f4e916964ce659327135fdd0be2e7c72ee73", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x5270BA998643bE976c106298C08C46947c5Bf774": { - "beneficiary": "0x0B76598e9Ddd53237Fa1632ddbFC8Db1a2C7D897", - "amount": "50907046354908158219221", - "proof": [ - "0xc104ec480e8f7835a1a35cf2eb9f6fe923139667f14ddc7e0a43eac9cf969d3c", - "0xf020d056522ab7c188c6113ba4659031d1af7417b9a0bd3cc9ed7de9f777bb2e", - "0x39b4a530ba57d463674facbaf8187b67879856a3dd362d8b3b9e155d18137146", - "0x071de73c7fdc53109dd4ff69b8fb3b2621edb92a109a6fc37c6481cb671605de", - "0x59a158af3ffa2849a033594affad303fb5e11aeecbdde0a878c909168e58d612", - "0x97d9146e9833b3fdeba7c55987d17f362c03e476d0731aa6eda14684628e6b80", - "0x26d3258cdc1fc284a0d39b0082465afa7e9cfb3bad44bea5374d722bdb514d7f", - "0xe88bf217a61ba2f61cf5c969f3d4f4e916964ce659327135fdd0be2e7c72ee73", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x1f2490Ad8FBDA9376A6f20A6C5915bb72Ee519c6": { - "beneficiary": "0x882e39D6711A149A5441b093D9323fEf6f9E94C6", - "amount": "70353547080978499955606", - "proof": [ - "0xb08b096450403e975d5df6a4bbb9cd28876df0c37ede93a94db62c87dbbece23", - "0xc35a17d70ca0050a1a8304e66b3a8be3b70c070587843c59e2ed7e63aea87302", - "0xd469028315cc5dcbcd4636e77c5d1bb3741a41dcd5d84359e167fe06a089770e", - "0x7f1c6ca19ff3cad4f632f6e3686736e3e262e7581772ab7d210d2cd01fd6a7c8", - "0xc93e047f67535414778dfc6856cfd4414899e769239825a687683ea6a63e3e10", - "0x0051d7a32a1cc939dea0060ee90745718a7b84019b2411e1b966c49089e00273", - "0x0616b8a8fdf6a22d755f3735640770bdb2f6e7df4a6e1b23ed3647e9c3778bf6", - "0xe88bf217a61ba2f61cf5c969f3d4f4e916964ce659327135fdd0be2e7c72ee73", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x49992Bd16f7D6e19c74fF251137b2CF93F0C3E2D": { - "beneficiary": "0xE098612D8C62c1CDfE91F56B55a9cd84142Fe7ED", - "amount": "47092873768811644537265", - "proof": [ - "0x890cecb9e2a1cc051e8020280813ff3f9ec19006e6b9ea3a297f7d9551cf34a2", - "0x5b3ea2bc76c737619590f5f442f8f288fcbee4049e0ba2fb68a4630a23679b81", - "0x8a4f5f8748f65b9aca048bb60e6bd1461e8c2b1413ee4d491c6614791a0c7559", - "0x194ef47b96e0a314e70a2b8ce7439810c6bdee32118026f58b3ecf62e628911f", - "0x8ba5b958e3d50463abb92bcbd342d11326e4d7c366ee018c2d461fbb1df561b5", - "0x68dbcd1cbf24dfe8761794f995bcb03a39b7b92828d8898f64ee8ee429e9eb95", - "0x0616b8a8fdf6a22d755f3735640770bdb2f6e7df4a6e1b23ed3647e9c3778bf6", - "0xe88bf217a61ba2f61cf5c969f3d4f4e916964ce659327135fdd0be2e7c72ee73", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0xA6a4240bD20D8b62ba16eDC8BAA05d46A134E4C6": { - "beneficiary": "0x3A00C59c3BB8360fAE3C83a24F4b5FA557F44Fdd", - "amount": "38764437857240953741522", - "proof": [ - "0xb26834bafa59e349ac7a09ce0e26606a76737c977fc256e9fe5625447123442e", - "0xa01456766d8825696428909f6c3e941dcf5de191654537e0136fd697021b490d", - "0x52737961fc571d488330ffc563e960be948184ef4c4b65007117df97db388d06", - "0xe8725478de68bb2f70f03cdae0b58fb5de3d665ba62705d4d326ed9b5c097b79", - "0xc93e047f67535414778dfc6856cfd4414899e769239825a687683ea6a63e3e10", - "0x0051d7a32a1cc939dea0060ee90745718a7b84019b2411e1b966c49089e00273", - "0x0616b8a8fdf6a22d755f3735640770bdb2f6e7df4a6e1b23ed3647e9c3778bf6", - "0xe88bf217a61ba2f61cf5c969f3d4f4e916964ce659327135fdd0be2e7c72ee73", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x8e57F002866706FcfbDf78756dC45F93841dc783": { - "beneficiary": "0x8e57F002866706FcfbDf78756dC45F93841dc783", - "amount": "42497056078142022893384", - "proof": [ - "0x774ed81f3b2cbaa87811e7ad27f4e1248978fc3b459c6fc844f6ea3de78a3133", - "0x61871f95e32aade0a2e74c055d51f858b1f8d026785b68dc8602423b378797dd", - "0x96d0e3cff76ea9fb76e7194dc1aa4e152b4ce4e16c25045e71d316f12e556976", - "0xeab42a7f7084e021a91d743173e7d8d1a35b408ed9f715b7f36249a621338a21", - "0x8ba5b958e3d50463abb92bcbd342d11326e4d7c366ee018c2d461fbb1df561b5", - "0x68dbcd1cbf24dfe8761794f995bcb03a39b7b92828d8898f64ee8ee429e9eb95", - "0x0616b8a8fdf6a22d755f3735640770bdb2f6e7df4a6e1b23ed3647e9c3778bf6", - "0xe88bf217a61ba2f61cf5c969f3d4f4e916964ce659327135fdd0be2e7c72ee73", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x064ae11966cd24ae08ad5282C9027836E2D1c47d": { - "beneficiary": "0x064ae11966cd24ae08ad5282C9027836E2D1c47d", - "amount": "1528814239869095249348", - "proof": [ - "0xb07952dccd56e7c6c8acd9909f3b318a2a2936e78b175601a929ce4b86bb530a", - "0x3d54958737b9c33e06b9893d10602a79535ebacbe662a6a7ec4260e85324f43f", - "0xd469028315cc5dcbcd4636e77c5d1bb3741a41dcd5d84359e167fe06a089770e", - "0x7f1c6ca19ff3cad4f632f6e3686736e3e262e7581772ab7d210d2cd01fd6a7c8", - "0xc93e047f67535414778dfc6856cfd4414899e769239825a687683ea6a63e3e10", - "0x0051d7a32a1cc939dea0060ee90745718a7b84019b2411e1b966c49089e00273", - "0x0616b8a8fdf6a22d755f3735640770bdb2f6e7df4a6e1b23ed3647e9c3778bf6", - "0xe88bf217a61ba2f61cf5c969f3d4f4e916964ce659327135fdd0be2e7c72ee73", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x77ED29B8e69F26B318ADF74ecCb90AE549bBAA4C": { - "beneficiary": "0xfa25B71A5dA4003c5F4B6688D742B69A23849D7D", - "amount": "3364292348645484304624189", - "proof": [ - "0x9472e37d8f3bfcb732cff918134c7e318f814edad2c1c4b5745349902f020967", - "0xa3719a320fe218c9729935e69c512b9e69342d68a2879fab4c1f31d1dd08f365", - "0x0547516dacc2694fc61c2fef1c2bd36e8192020f4c8189615b9cdaca041fdd02", - "0xa947248fcc5a7ae879736246946a77fa43401f91d467acd89a1208f3cbd604b9", - "0xe4b02fad2ca92c21c555a2c6107ae084366477f8bf346a4fc1ddfe404454ce24", - "0x68dbcd1cbf24dfe8761794f995bcb03a39b7b92828d8898f64ee8ee429e9eb95", - "0x0616b8a8fdf6a22d755f3735640770bdb2f6e7df4a6e1b23ed3647e9c3778bf6", - "0xe88bf217a61ba2f61cf5c969f3d4f4e916964ce659327135fdd0be2e7c72ee73", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x07FAc54A901409Fe10E56c899Be3dCF2471ae321": { - "beneficiary": "0x07FAc54A901409Fe10E56c899Be3dCF2471ae321", - "amount": "12107914537671232876713", - "proof": [ - "0xd16b13d8c3b9f381096f02f27287de093f8aae3568b99f2024da2243e65ad019", - "0xa54c2a140d8d720a17d191dca93f34778929e8a2a2790ff31bef8c0029a5c771", - "0x38f20aebf7710d3da6781cf3270423d9d3e412dc4aacce73b21f02aff8b94d62", - "0x8ae93be8304ef13b7e153cfe03598869b3fe1e0c5405174fd8150ee7c3c37df7", - "0xa66a31c956515e2b9d52e14019df281b7b65cb788fe21437b8ddacc320e2517e", - "0x97d9146e9833b3fdeba7c55987d17f362c03e476d0731aa6eda14684628e6b80", - "0x26d3258cdc1fc284a0d39b0082465afa7e9cfb3bad44bea5374d722bdb514d7f", - "0xe88bf217a61ba2f61cf5c969f3d4f4e916964ce659327135fdd0be2e7c72ee73", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x70D5cCC14a1a264c05Ff48B3ec6751b0959541aA": { - "beneficiary": "0x70D5cCC14a1a264c05Ff48B3ec6751b0959541aA", - "amount": "106122173213848557570134", - "proof": [ - "0x071441d2fbfb1763728e2a07980f263e171e1018ee9a240e726764fb75a781a3", - "0xfccad6d3d80491e4aa1b52336abb4d7efbb888a7aaf4daa00a237cbbdf98fda7", - "0x712cad967bfab73d3fedf0d4822868a1a8b0bde786ed4122b9e1fa5e9fee77f6", - "0xb9473c113468ef16d11e686668d79ec90e821e951c0387ac41ae0d97e3f5a0a3", - "0xde4d448a9d734de96d9aad546aff27580bbca08f960e04097175f5f07e34f665", - "0x56e2c6ad067fe01f6532e8274c819527bbc22e3d1a23f010e171e6616d445529", - "0x5edc99efd052e87ec503dc802fa8b259d16a891b72bc9ac38d7bc6d7b6f2552e", - "0x64a54e2bec44cafadb050f8cad94de6f390cd69c6f8f8bf7fca200a1d0e859cf", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0xB31eF182b807E5276b91250208422F8d75316e70": { - "beneficiary": "0xB31eF182b807E5276b91250208422F8d75316e70", - "amount": "282389467949433064441", - "proof": [ - "0xab85c4655c6a96e0e473a584547b54fa886a1cf3f3ab3f27e65f7eb285ab4171", - "0xff8831a308aa3855ef9ad3ea45728ad8cf767651a634e9cc35a4035c0d2d7208", - "0x14a604fd723fbad977e58a30212fed06207ccb02347c83c52e6732f994daaf0d", - "0xf27c91795a530d7278a5dbfe1a56dccc1f214ed024d0ed7b115853a29f7b3f5a", - "0xdaae4d08c4b45294e520ad0f82a9cb506546db0d8fe3ec7c0e13d56d0f8c39d6", - "0x0051d7a32a1cc939dea0060ee90745718a7b84019b2411e1b966c49089e00273", - "0x0616b8a8fdf6a22d755f3735640770bdb2f6e7df4a6e1b23ed3647e9c3778bf6", - "0xe88bf217a61ba2f61cf5c969f3d4f4e916964ce659327135fdd0be2e7c72ee73", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x2dE8481F08e5c2fe88c653A64AE42CA00B20E98D": { - "beneficiary": "0x1A93C2A3BF308bf9208fF4B6C93CEfCb59404d7b", - "amount": "76484493964694852189078", - "proof": [ - "0xdaa53dd03985e405e83a15fc0a8adfecdb0f64ab13f46f8c152f746724de057c", - "0x717cb6e417d06f467adb4591d77e01ff6cc416adaee515d92315f9354deace95", - "0x09c06ef10072c2bc0fb9b31d06661c0358b2c8e3316f3444d4e31e18929a488c", - "0x5c0e7f3ab44620fd21c2b93779b413a382833d74590f2ee16fb86cc3453a2561", - "0x2b33811bfbf525e09903057070381317c6e8580a978357fafa1f43ff94acc3cc", - "0x22e1c098b7010d0cf32500ff774c2cb716f2a4797330e1b587bc650ded67c423", - "0x26d3258cdc1fc284a0d39b0082465afa7e9cfb3bad44bea5374d722bdb514d7f", - "0xe88bf217a61ba2f61cf5c969f3d4f4e916964ce659327135fdd0be2e7c72ee73", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x322651850ff9783A3eeD042Fad6Dc8eA4bd44F28": { - "beneficiary": "0xC119251c2783DD29Ab52AB3d2fCd07bf80100997", - "amount": "28128155482210905479300", - "proof": [ - "0xd886ef463ad990f7c2efb1b4d7926b3b3d3ca17d0768b3816c5eb91d1074a0cd", - "0xab55ead12137ce536119cf1d56cc22470da025262b4843b81154cb2b03b2772e", - "0xc7402bdfbb1133115f7b63033ec3bdf028ef7b9e89e84ef195e6a3e2ee3bf9c8", - "0xbee8645048977858a49c6a102da3ab08464842ef912df9d4e292488756727cbd", - "0xa66a31c956515e2b9d52e14019df281b7b65cb788fe21437b8ddacc320e2517e", - "0x97d9146e9833b3fdeba7c55987d17f362c03e476d0731aa6eda14684628e6b80", - "0x26d3258cdc1fc284a0d39b0082465afa7e9cfb3bad44bea5374d722bdb514d7f", - "0xe88bf217a61ba2f61cf5c969f3d4f4e916964ce659327135fdd0be2e7c72ee73", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x3B8FeB29eFb63A7609D5351b3A6AdDaed3c1C7eD": { - "beneficiary": "0x25D22cf95Cfb891aa88F5a9317F8bac1D6913e34", - "amount": "461137394386571565184507", - "proof": [ - "0x61aad5c5363d182c019f55743187448a2842c284f394af3cd0334902d642a455", - "0xdc9197716a65292572fa51f1463f6128091d2d80707c2f08cdc7a1da5f2ff1e4", - "0x3425029c00bb6dd5db0e9be696fed0ad583aa55eb07da6d730411aeeb2d82870", - "0x8480db728010621a6968b7aa3634f14b1865f27ddec19c5d9479b58ed9b93f2f", - "0x0c99d2be5d1dbc03058e95802f469f1f3a0ebd66724ffe9b43624f26e1d9ab49", - "0xdccacd8bd107e69fd2d2c1a05f9bcc65811815f152e9f33ac433517436067435", - "0xa9c9a42a7e408bc6103693f019c44cf312f2b867b87abdceb95d900885156c7e", - "0x64a54e2bec44cafadb050f8cad94de6f390cd69c6f8f8bf7fca200a1d0e859cf", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0xE8316911b0F9EdD928d58B63fF619888077aD713": { - "beneficiary": "0xE8316911b0F9EdD928d58B63fF619888077aD713", - "amount": "1702548453588326293760", - "proof": [ - "0x6c7106f177a917c0170f486e8aeb5a5d1bf97fd3f07365fb1bc5506fef393da4", - "0xcc81637c025b155bffc642a5f98c9d73032003c87865ec8e6f53b9ef05a91a07", - "0x8960e3adadc2c6e4c5d362f30d21564d88866e2a95977c7e2a5bc268b827d5bc", - "0x2636c723e4b0313d34aacb26a0c7d73dd94ed5f08ae04281a362b14207b628e2", - "0x111fd987a5f671f7884a8783e2bebd8e1cc22bf533d05e0441bdfd228b345717", - "0xdccacd8bd107e69fd2d2c1a05f9bcc65811815f152e9f33ac433517436067435", - "0xa9c9a42a7e408bc6103693f019c44cf312f2b867b87abdceb95d900885156c7e", - "0x64a54e2bec44cafadb050f8cad94de6f390cd69c6f8f8bf7fca200a1d0e859cf", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x744c0c06f172F4aD4443536AaE81BF3c36d37e2A": { - "beneficiary": "0xAB68b967026913c4A4D8314F915A49DB7B0B2939", - "amount": "5473038500570776255707", - "proof": [ - "0x78efd6ddec2cd2afa6c70517762e32303b909ff8d7e76e3efe0abd0ed9666e04", - "0xee0fa184b35c45e87904df131d0be4bae57aa3f900e4532d054e3aa59b02ed85", - "0x96d0e3cff76ea9fb76e7194dc1aa4e152b4ce4e16c25045e71d316f12e556976", - "0xeab42a7f7084e021a91d743173e7d8d1a35b408ed9f715b7f36249a621338a21", - "0x8ba5b958e3d50463abb92bcbd342d11326e4d7c366ee018c2d461fbb1df561b5", - "0x68dbcd1cbf24dfe8761794f995bcb03a39b7b92828d8898f64ee8ee429e9eb95", - "0x0616b8a8fdf6a22d755f3735640770bdb2f6e7df4a6e1b23ed3647e9c3778bf6", - "0xe88bf217a61ba2f61cf5c969f3d4f4e916964ce659327135fdd0be2e7c72ee73", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x915F4982Be76BEcAC16C2A2715584903e52A11Ae": { - "beneficiary": "0x915F4982Be76BEcAC16C2A2715584903e52A11Ae", - "amount": "3060031987252663622527", - "proof": [ - "0x9bf96449267f36672c3a82f95dc4f7d7dc7d5dfa3fe3c4321d0fbd32801dc5e7", - "0xeece2ce98a250afc7f3879f2808df46fa4e4bf1ca319aac58804059be36c0aa1", - "0x7f18f34ee97e41e65206090a3b370166a5805110f67886a6c7b5e8d3a8dc0feb", - "0x8e0a201871d267e73e63f23088bd1e9d8c9a8b763ee4dfe53afad4a412370179", - "0xe4b02fad2ca92c21c555a2c6107ae084366477f8bf346a4fc1ddfe404454ce24", - "0x68dbcd1cbf24dfe8761794f995bcb03a39b7b92828d8898f64ee8ee429e9eb95", - "0x0616b8a8fdf6a22d755f3735640770bdb2f6e7df4a6e1b23ed3647e9c3778bf6", - "0xe88bf217a61ba2f61cf5c969f3d4f4e916964ce659327135fdd0be2e7c72ee73", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x7e15F9B79eb5bE562bb8cf17885Fc0c32e4Fdde9": { - "beneficiary": "0x05cEB20f181B67969C311D882A9DBE2BD17e45ac", - "amount": "39225700498884726601731", - "proof": [ - "0xe7a4f2e3437d0b01fd3da6c379fbef6cf73c2e98c3a507259fbe18ed5a0e0764", - "0x39968c4f258a473b7ad8119e03f26baaadb8ee9701f1ca3a69e0f082aaaa9b30", - "0xf5d221ebb809dc8317010cac306191773446b161afd53bd03d0cb41031b99735", - "0xa49f8baaa05c9a49015d13c2cb5a475342d4cb3ba2a697b0667d22289fefe496", - "0x2b33811bfbf525e09903057070381317c6e8580a978357fafa1f43ff94acc3cc", - "0x22e1c098b7010d0cf32500ff774c2cb716f2a4797330e1b587bc650ded67c423", - "0x26d3258cdc1fc284a0d39b0082465afa7e9cfb3bad44bea5374d722bdb514d7f", - "0xe88bf217a61ba2f61cf5c969f3d4f4e916964ce659327135fdd0be2e7c72ee73", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0xC1d2fddF9AbE7b3B56d97729139D1f46bD0DA530": { - "beneficiary": "0x29e39Fe02A19748Da5De584D7F8C165b4Cae97ab", - "amount": "615019659639735703261", - "proof": [ - "0x5d469b35fe5c25fb446b8a94b7b2ac219e2c15e5df46732dedce0319871d85a4", - "0x442f98a434796637bcb0b2d110c4f1ccd54db9521378180322592e025103c2bf", - "0x72bd8f01249b9820f99ef97fbf7f6a7cdd350a3e7a3e5a1089c9b988b87ba7e2", - "0x797edd017f4003c1285ab77462d72a225c5599c94f0de400975080271269fef0", - "0x0c99d2be5d1dbc03058e95802f469f1f3a0ebd66724ffe9b43624f26e1d9ab49", - "0xdccacd8bd107e69fd2d2c1a05f9bcc65811815f152e9f33ac433517436067435", - "0xa9c9a42a7e408bc6103693f019c44cf312f2b867b87abdceb95d900885156c7e", - "0x64a54e2bec44cafadb050f8cad94de6f390cd69c6f8f8bf7fca200a1d0e859cf", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0x6FbE6EaB3053fEF0DA871807346B0B40E989840f": { - "beneficiary": "0x6FbE6EaB3053fEF0DA871807346B0B40E989840f", - "amount": "127543339567063174379", - "proof": [ - "0xe01816f83211590d5b46ff9c5c364693052baa2dd83f366ced538dac2c2cb042", - "0xde9398445032d943acf9e55aa02a843e5b7870c6ee93202f3855b01464602072", - "0x374dd84638a2a3636a82f1150c48f186293928c4491d9d2515966ffe82017628", - "0xa49f8baaa05c9a49015d13c2cb5a475342d4cb3ba2a697b0667d22289fefe496", - "0x2b33811bfbf525e09903057070381317c6e8580a978357fafa1f43ff94acc3cc", - "0x22e1c098b7010d0cf32500ff774c2cb716f2a4797330e1b587bc650ded67c423", - "0x26d3258cdc1fc284a0d39b0082465afa7e9cfb3bad44bea5374d722bdb514d7f", - "0xe88bf217a61ba2f61cf5c969f3d4f4e916964ce659327135fdd0be2e7c72ee73", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0xABBb9Eb2512904123f9d372f26e2390a190d8550": { - "beneficiary": "0xABBb9Eb2512904123f9d372f26e2390a190d8550", - "amount": "18988765294573103923050", - "proof": [ - "0x05b2d1643acf5dae6628943137a031f4555894961a7987edc946ff6c793f11a5", - "0x702bee33c3bf25713f8e181d43ae17b515ebf78328248c04b8c18d9d0056e33a", - "0x44c197d64d894c349573d2595162ecc3e2eac1c260689dc68d2a5ee03c2e2e3e", - "0xb9473c113468ef16d11e686668d79ec90e821e951c0387ac41ae0d97e3f5a0a3", - "0xde4d448a9d734de96d9aad546aff27580bbca08f960e04097175f5f07e34f665", - "0x56e2c6ad067fe01f6532e8274c819527bbc22e3d1a23f010e171e6616d445529", - "0x5edc99efd052e87ec503dc802fa8b259d16a891b72bc9ac38d7bc6d7b6f2552e", - "0x64a54e2bec44cafadb050f8cad94de6f390cd69c6f8f8bf7fca200a1d0e859cf", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - }, - "0xbAd0EF0810a014Cb9370fd2d39f44Fed80025FEa": { - "beneficiary": "0x7a036990903cD93f55Fad3054DC82730E6C80318", - "amount": "2568445070163324094869", - "proof": [ - "0x358e4c4b0a95c1769ec4a11b071c82a39e213a57addf9168404669f1364c0a8b", - "0x5a0ed99f74ffcdb7cf881d645337a7665c1f82e888875f339c68eaf0dcaa46e4", - "0x81bc7e084da1245e86d4838075158c2ca1e8b55c58b230150b2b27f3bd6819c6", - "0xa4c592d588cd922c6de1781284770256d4729b6287bdc700b97a2c852ff88d0f", - "0x9065ab73e0639a7701ce0c7ea4d24dc3a352eaf86d04cfe535ea8b3b19f43923", - "0x473f914d1f1ccc5b8b5de95bc12121123181242ea06fff9c8508a358398163b5", - "0x5edc99efd052e87ec503dc802fa8b259d16a891b72bc9ac38d7bc6d7b6f2552e", - "0x64a54e2bec44cafadb050f8cad94de6f390cd69c6f8f8bf7fca200a1d0e859cf", - "0xd9ae8db701cca4c0f2914cd7f05707cbabf7e873704058d10436d6e6509fe7e8" - ] - } - } -} diff --git a/src/pages/Staking/AuthorizeStakingApps/AuthorizeApplicationsCardCheckbox/AppAuthorizationInfo.tsx b/src/pages/Staking/AuthorizeStakingApps/AuthorizeApplicationsCardCheckbox/AppAuthorizationInfo.tsx deleted file mode 100644 index cc1588bf1..000000000 --- a/src/pages/Staking/AuthorizeStakingApps/AuthorizeApplicationsCardCheckbox/AppAuthorizationInfo.tsx +++ /dev/null @@ -1,136 +0,0 @@ -import { CheckCircleIcon } from "@chakra-ui/icons" -import { - LabelSm, - VStack, - HStack, - Badge, - StackProps, - BodyMd, - BodyLg, - H3, -} from "@threshold-network/components" -import { FC } from "react" -import { formatPercentage } from "../../../../utils/percentage" -import InfoBox from "../../../../components/InfoBox" -import { formatTokenAmount } from "../../../../utils/formatAmount" -import { StakingAppName } from "../../../../store/staking-applications" -import TooltipIcon from "../../../../components/TooltipIcon" -import Link from "../../../../components/Link" -import { AuthorizationStatus } from "../../../../types" - -interface CommonProps { - label: string - percentageAuthorized: number - stakingAppName: StakingAppName | "pre" -} - -type ConditionalProps = - | { - status?: Extract - authorizedStake?: never - } - | { - status: Extract - authorizedStake?: never - } - | { - status: Exclude - authorizedStake: string - } - -const TooltipLearnMoreLink = () => { - return here -} - -const tooltipText: Record = { - tbtc: ( - <> - The tBTC application is the first decentralized bridge from Bitcoin to - Ethereum. Learn more . - - ), - randomBeacon: ( - <> - The Random Beacon application generates randomness for staker group - selection. Learn more . - - ), - pre: ( - <> - The PRE application is cryptographic middleware for developing - privacy-preserving applications. Learn more . . - - ), -} - -export type AppAuthorizationInfoProps = CommonProps & - ConditionalProps & - StackProps - -const statusToBadge: Record< - Exclude, - { props: any; label: string } -> = { - "authorization-not-required": { - props: { - colorScheme: "gray", - color: "gray.500", - }, - label: "authorization not required", - }, - authorized: { - props: { - colorScheme: "green", - }, - label: "authorized", - }, - "pending-deauthorization": { - props: { - colorScheme: "yellow", - }, - label: "pending deauthorization", - }, - "deauthorization-initiation-needed": { - props: { - colorScheme: "red", - }, - label: "deauthorization initiation needed", - }, -} - -export const AppAuthorizationInfo: FC = ({ - label, - percentageAuthorized, - authorizedStake, - stakingAppName, - status, - ...restProps -}) => { - return ( - - - {status === "authorized" && } - - {label} App -{" "} - {formatPercentage(percentageAuthorized, undefined, true)} - {" "} - - {status && status !== "to-authorize" && ( - - {statusToBadge[status].label} - - )} - - {authorizedStake && authorizedStake !== "0" && ( - <> - Total Authorized Balance - -

- {formatTokenAmount(authorizedStake!)} T -

-
- - )} -
- ) -} diff --git a/src/pages/Staking/AuthorizeStakingApps/AuthorizeApplicationsCardCheckbox/index.tsx b/src/pages/Staking/AuthorizeStakingApps/AuthorizeApplicationsCardCheckbox/index.tsx deleted file mode 100644 index 4c6b530e2..000000000 --- a/src/pages/Staking/AuthorizeStakingApps/AuthorizeApplicationsCardCheckbox/index.tsx +++ /dev/null @@ -1,528 +0,0 @@ -import { - BoxProps, - Card, - Checkbox, - FilterTab, - FilterTabs, - Grid, - GridItem, - BodyMd, - BodyLg, - H5, - Box, - BodySm, - Button, - useBoolean, - Progress, - HStack, -} from "@threshold-network/components" -import { InfoIcon } from "@chakra-ui/icons" -import { FC, RefObject, useCallback, useEffect } from "react" -import { FormValues } from "../../../../components/Forms" -import { AppAuthorizationInfo } from "./AppAuthorizationInfo" -import { formatTokenAmount } from "../../../../utils/formatAmount" -import { useModal } from "../../../../hooks/useModal" -import { ModalType } from "../../../../enums" -import { StakingAppName } from "../../../../store/staking-applications" -import { FormikProps } from "formik" -import { - useStakingApplicationAddress, - useStakingApplicationDecreaseDelay, - useUpdateOperatorStatus, -} from "../../../../hooks/staking-applications" -import InfoBox from "../../../../components/InfoBox" -import { formatDate } from "../../../../utils/date" -import { calculatePercenteage } from "../../../../utils/percentage" -import { StakingAppForm } from "../../../../components/StakingApplicationForms" -import { AuthorizationStatus } from "../../../../types" - -interface CommonProps { - stakingAppId: StakingAppName | "pre" - label: string -} - -type StakingAppAuthDataBaseProps = { - status: Exclude - authorizedStake: string - percentage: number - pendingAuthorizationDecrease: string - isDeauthorizationReqestActive: boolean - /** - * Timestamp when the deauthorization request was created. Takes an - * `undefined` value if it cannot be estimated. - */ - deauthorizationCreatedAt?: string - /** - * Time in seconds until the deauthorization can be completed. - */ - remainingAuthorizationDecreaseDelay: string - isOperatorInPool: boolean | undefined - operator: string -} - -type AppAuthDataConditionalProps = - | { - status?: Extract - authorizedStake?: never - percentage?: never - pendingAuthorizationDecrease?: never - isDeauthorizationReqestActive?: never - /** - * Timestamp when the deauthorization request was created. - */ - deauthorizationCreatedAt?: never - /** - * Time in seconds until the deauthorization can be completed. - */ - remainingAuthorizationDecreaseDelay?: never - isOperatorInPool?: never - operator?: never - } - | StakingAppAuthDataBaseProps - -export type AppAuthDataProps = CommonProps & AppAuthDataConditionalProps -export type StakingAuthDataProps = CommonProps & StakingAppAuthDataBaseProps - -export interface AuthorizeApplicationsCardCheckboxBaseProps extends BoxProps { - appAuthData: StakingAuthDataProps - stakingProvider: string - totalInTStake: string - onCheckboxClick: (app: StakingAuthDataProps, isChecked: boolean) => void - isSelected: boolean - maxAuthAmount: string - minAuthAmount: string - canSubmitForm?: boolean - formRef?: RefObject> -} - -export interface AuthorizeApplicationsCardCheckboxProps - extends Omit { - appAuthData: AppAuthDataProps -} - -const gridTemplate = { - base: { - base: ` - "checkbox checkbox" - "app-info app-info" - "filter-tabs filter-tabs" - "token-amount-form token-amount-form" - `, - sm: ` - "checkbox app-info" - "checkbox filter-tabs" - "checkbox token-amount-form" - `, - md: ` - "checkbox app-info filter-tabs " - "checkbox app-info _ " - "checkbox token-amount-form token-amount-form" - "checkbox token-amount-form token-amount-form" - `, - }, - authorized: { - base: ` - "app-info app-info" - "filter-tabs filter-tabs" - "token-amount-form token-amount-form" - `, - sm: ` - "app-info app-info" - "filter-tabs filter-tabs" - "token-amount-form token-amount-form" - `, - md: ` - "app-info app-info filter-tabs " - "app-info app-info _ " - "token-amount-form token-amount-form token-amount-form" - "token-amount-form token-amount-form token-amount-form" - `, - }, -} - -const authStatusToAppCardBordColor: Record< - Exclude, - string | undefined -> = { - authorized: "green.400", - "pending-deauthorization": "yellow.400", - "deauthorization-initiation-needed": "red.400", - "to-authorize": undefined, -} - -export const AuthorizeApplicationsCardCheckboxBase: FC< - AuthorizeApplicationsCardCheckboxBaseProps -> = ({ - appAuthData, - onCheckboxClick, - isSelected, - maxAuthAmount, - minAuthAmount, - stakingProvider, - totalInTStake, - formRef, - canSubmitForm = true, - ...restProps -}) => { - const [isIncreaseAction, actionCallbacks] = useBoolean(true) - - const { openModal } = useModal() - const stakingAppAddress = useStakingApplicationAddress( - appAuthData.stakingAppId as StakingAppName - ) - const stakingAppAuthDecreaseDelay = useStakingApplicationDecreaseDelay( - appAuthData.stakingAppId as StakingAppName - ) - - const { sendTransaction: sendUpdateOperatorStatus } = useUpdateOperatorStatus( - appAuthData.stakingAppId as StakingAppName - ) - - const updateOperatorStatus = async () => { - await sendUpdateOperatorStatus(appAuthData.operator!) - } - - const status = appAuthData.status - - const hasPendingDeauthorization = status === "pending-deauthorization" - const shouldActivateDeatuhorizationRequest = - status === "deauthorization-initiation-needed" - const pendingAuthorizationDecrease = - appAuthData.pendingAuthorizationDecrease || "0" - const deauthorizationCreatedAt = appAuthData.deauthorizationCreatedAt - const remainingAuthorizationDecreaseDelay = - appAuthData.remainingAuthorizationDecreaseDelay - const authorizedStake = appAuthData.authorizedStake - const canDecrease = authorizedStake !== "0" - - useEffect(() => { - if (hasPendingDeauthorization || shouldActivateDeatuhorizationRequest) { - actionCallbacks.off() - } else { - actionCallbacks.on() - } - }, [ - hasPendingDeauthorization, - shouldActivateDeatuhorizationRequest, - actionCallbacks, - ]) - - const onFilterTabClick = useCallback( - (tabId: string) => { - if (tabId === "increase" && !hasPendingDeauthorization) { - actionCallbacks.on() - formRef?.current?.resetForm() - } else if (tabId === "decrease" && authorizedStake !== "0") { - actionCallbacks.off() - formRef?.current?.resetForm() - } - }, - [actionCallbacks, authorizedStake, hasPendingDeauthorization] - ) - - const onAuthorizeApp = async (tokenAmount: string) => { - if (status === "to-authorize") { - // We want to display different modals for the authroization and for the - // increase aturhoziation. - openModal(ModalType.AuthorizeStakingApps, { - stakingProvider, - totalInTStake, - applications: [ - { - appName: appAuthData.label, - authorizationAmount: tokenAmount, - address: stakingAppAddress, - }, - ], - }) - } else { - openModal(ModalType.IncreaseAuthorization, { - stakingProvider, - increaseAmount: tokenAmount, - stakingAppName: appAuthData.stakingAppId, - }) - } - } - - const onInitiateDeauthorization = async (tokenAmount: string) => { - openModal(ModalType.DeauthorizeApplication, { - stakingProvider: stakingProvider, - decreaseAmount: tokenAmount, - stakingAppName: appAuthData.stakingAppId, - operator: appAuthData.operator, - isOperatorInPool: appAuthData.isOperatorInPool, - }) - } - - const onSubmitForm = (tokenAmount: string) => { - if (isIncreaseAction) onAuthorizeApp(tokenAmount) - else onInitiateDeauthorization(tokenAmount) - } - - const onConfirmDeauthorization = () => { - openModal(ModalType.ConfirmDeauthorization, { - stakingProvider, - stakingAppName: appAuthData.stakingAppId, - decreaseAmount: appAuthData.pendingAuthorizationDecrease, - }) - } - - return ( - - - {status === "to-authorize" && ( - { - onCheckboxClick(appAuthData, e.target.checked) - }} - /> - )} - - - - Increase - - - Decrease - - - {status !== "pending-deauthorization" && - status !== "deauthorization-initiation-needed" && ( - - - - )} - - {(hasPendingDeauthorization || shouldActivateDeatuhorizationRequest) && ( - - )} - - ) -} - -const Deauthorization: FC<{ - pendingAuthorizationDecrease: string - remainingAuthorizationDecreaseDelay: string - deauthorizationCreatedAt: string | undefined - stakingAppAuthDecreaseDelay: string - onConfirmDeauthorization: () => void - onActivateDeauthorizationRequest: () => void - status: AuthorizationStatus -}> = ({ - pendingAuthorizationDecrease, - remainingAuthorizationDecreaseDelay, - deauthorizationCreatedAt, - stakingAppAuthDecreaseDelay, - onConfirmDeauthorization, - onActivateDeauthorizationRequest, - status, -}) => { - const progressBarValue = - remainingAuthorizationDecreaseDelay === "0" - ? 100 - : status === "deauthorization-initiation-needed" - ? 0 - : calculatePercenteage( - +stakingAppAuthDecreaseDelay - +remainingAuthorizationDecreaseDelay, - stakingAppAuthDecreaseDelay - ) - - return ( - <> - Pending Deauthorization - -
- {formatTokenAmount(pendingAuthorizationDecrease)}{" "} - T -
- - <> - - - {status === "deauthorization-initiation-needed" && ( - <> - Available:{" "} - - --/--/-- - - - )} - {status === "pending-deauthorization" && - remainingAuthorizationDecreaseDelay === "0" && - "Completed"} - - {status === "pending-deauthorization" && - remainingAuthorizationDecreaseDelay !== "0" && - deauthorizationCreatedAt !== undefined && ( - <> - Available:{" "} - - {formatDate( - +deauthorizationCreatedAt + +stakingAppAuthDecreaseDelay - )} - - - )} - - - - {status === "pending-deauthorization" && ( - - )} - {status === "deauthorization-initiation-needed" && ( - - )} -
- - - - Increasing or decreasing the authorization amount is suspended until - the pending deauthorization is confirmed. - - - - ) -} - -export const AuthorizeApplicationsCardCheckbox: FC< - AuthorizeApplicationsCardCheckboxProps -> = ({ - appAuthData, - onCheckboxClick, - isSelected, - maxAuthAmount, - minAuthAmount, - stakingProvider, - totalInTStake, - formRef, - canSubmitForm = true, - ...restProps -}) => { - const status = appAuthData.status - - if (!status || status === "authorization-not-required") { - return ( - - - - ) - } - - return ( - - ) -} - -export default AuthorizeApplicationsCardCheckbox diff --git a/src/pages/Staking/AuthorizeStakingApps/index.tsx b/src/pages/Staking/AuthorizeStakingApps/index.tsx deleted file mode 100644 index a3de75461..000000000 --- a/src/pages/Staking/AuthorizeStakingApps/index.tsx +++ /dev/null @@ -1,326 +0,0 @@ -import { - AlertBox, - AlertDescription, - Badge, - BodyLg, - Button, - Card, - H5, - HStack, - LineDivider, - useColorModeValue, -} from "@threshold-network/components" -import { BigNumber } from "ethers" -import { useSelector } from "react-redux" -import { useNavigate, useParams } from "react-router-dom" -import { RootState } from "../../../store" -import { StakeData } from "../../../types" -import { AddressZero, isSameETHAddress, isAddress } from "../../../web3/utils" -import { StakeCardHeaderTitle } from "../StakeCard/Header/HeaderTitle" -import AuthorizeApplicationsCardCheckbox, { - AppAuthDataProps, -} from "./AuthorizeApplicationsCardCheckbox" -import { FC, useEffect, useRef, useState, RefObject } from "react" -import { - requestStakeByStakingProvider, - selectStakeByStakingProvider, -} from "../../../store/staking" -import { useWeb3React } from "@web3-react/core" -import { - useStakingAppDataByStakingProvider, - useStakingApplicationAddress, - useStakingAppMinAuthorizationAmount, -} from "../../../hooks/staking-applications" -import { useModal } from "../../../hooks/useModal" -import { ModalType } from "../../../enums" -import { FormikProps } from "formik" -import { FormValues } from "../../../components/Forms" -import { useAppDispatch } from "../../../hooks/store" -import { stakingApplicationsSlice } from "../../../store/staking-applications" -import BundledRewardsAlert from "../../../components/BundledRewardsAlert" - -const AuthorizeStakingAppsPage: FC = () => { - const { stakingProviderAddress } = useParams() - const { account, active } = useWeb3React() - const navigate = useNavigate() - const { openModal } = useModal() - const tbtcAppFormRef = useRef>(null) - const randomBeaconAppFormRef = useRef>(null) - const preAppFormRef = useRef>(null) - const stakinAppNameToFormRef: Record< - AppAuthDataProps["stakingAppId"], - RefObject> - > = { - tbtc: tbtcAppFormRef, - randomBeacon: randomBeaconAppFormRef, - pre: preAppFormRef, - } - - const dispatch = useAppDispatch() - - const tbtcAppAddress = useStakingApplicationAddress("tbtc") - const randomBeaconAddress = useStakingApplicationAddress("randomBeacon") - const stakinAppNameToAddress: Record< - AppAuthDataProps["stakingAppId"], - string - > = { - tbtc: tbtcAppAddress, - randomBeacon: randomBeaconAddress, - pre: AddressZero, - } - - useEffect(() => { - if (!isAddress(stakingProviderAddress!)) navigate(`/staking`) - }, [stakingProviderAddress, navigate]) - - useEffect(() => { - dispatch( - requestStakeByStakingProvider({ stakingProvider: stakingProviderAddress }) - ) - }, [stakingProviderAddress, account, dispatch]) - - useEffect(() => { - dispatch(stakingApplicationsSlice.actions.getSupportedApps({})) - }, [dispatch, account]) - - const tbtcApp = useStakingAppDataByStakingProvider( - "tbtc", - stakingProviderAddress || AddressZero - ) - const randomBeaconApp = useStakingAppDataByStakingProvider( - "randomBeacon", - stakingProviderAddress || AddressZero - ) - - const appsAuthData: { - [appName: string]: AppAuthDataProps & { address?: string } - } = { - tbtc: { - ...tbtcApp, - stakingAppId: "tbtc", - address: tbtcAppAddress, - label: "tBTC", - }, - randomBeacon: { - ...randomBeaconApp, - stakingAppId: "randomBeacon", - address: randomBeaconAddress, - label: "Random Beacon", - }, - pre: { - stakingAppId: "pre", - label: "PRE", - status: "authorization-not-required", - }, - } - - const isFullyAuthorized = Object.values(appsAuthData).every( - ({ status, percentage }) => - (status === "authorized" && percentage === 100) || - status === "authorization-not-required" - ) - - useEffect(() => { - if (tbtcApp.isAuthorized) { - setSelectedApps((selectedApps) => - selectedApps.filter(({ stakingAppId }) => stakingAppId !== "tbtc") - ) - } - - if (randomBeaconApp.isAuthorized) { - setSelectedApps((selectedApps) => - selectedApps.filter( - ({ stakingAppId }) => stakingAppId !== "randomBeacon" - ) - ) - } - }, [tbtcApp.isAuthorized, randomBeaconApp.isAuthorized]) - - const tbtcMinAuthAmount = useStakingAppMinAuthorizationAmount("tbtc") - const randomBeaconMinAuthAmount = - useStakingAppMinAuthorizationAmount("randomBeacon") - - const stake = useSelector((state: RootState) => - selectStakeByStakingProvider(state, stakingProviderAddress!) - ) as StakeData - - const isLoggedInAsAuthorizer = - stake && account ? isSameETHAddress(stake.authorizer, account) : false - - const isInactiveStake = stake - ? BigNumber.from(stake?.totalInTStake).isZero() - : false - - const isAppSelected = (stakingAppName: AppAuthDataProps["stakingAppId"]) => { - return selectedApps.map((app) => app.stakingAppId).includes(stakingAppName) - } - - const onAuthorizeApps = async () => { - const isTbtcSelected = isAppSelected("tbtc") - const isRandomBeaconSelected = isAppSelected("randomBeacon") - - if (isTbtcSelected) { - await tbtcAppFormRef.current?.validateForm() - tbtcAppFormRef.current?.setTouched({ tokenAmount: true }, false) - } - if (isRandomBeaconSelected) { - await randomBeaconAppFormRef.current?.validateForm() - randomBeaconAppFormRef.current?.setTouched({ tokenAmount: true }, false) - } - if ( - (isRandomBeaconSelected && - isTbtcSelected && - tbtcAppFormRef.current?.isValid && - randomBeaconAppFormRef.current?.isValid) || - (isTbtcSelected && - !isRandomBeaconSelected && - tbtcAppFormRef.current?.isValid) || - (isRandomBeaconSelected && - !isTbtcSelected && - randomBeaconAppFormRef.current?.isValid) - ) { - openModal(ModalType.AuthorizeStakingApps, { - stakingProvider: stakingProviderAddress!, - totalInTStake: stake.totalInTStake, - applications: selectedApps.map((_) => ({ - appName: _.stakingAppId, - address: stakinAppNameToAddress[_.stakingAppId], - authorizationAmount: - stakinAppNameToFormRef[_.stakingAppId].current?.values.tokenAmount, - })), - }) - } - } - - const [selectedApps, setSelectedApps] = useState([]) - - const onCheckboxClick = (app: AppAuthDataProps, isChecked: boolean) => { - if (isChecked) { - setSelectedApps([...selectedApps, app]) - } else { - setSelectedApps(selectedApps.filter(({ label }) => label !== app.label)) - } - } - - const shouldRenderBundledRewardsAlert = () => { - const isTbtcSelected = isAppSelected("tbtc") - const isRandomBeaconSelected = isAppSelected("randomBeacon") - - // If one of the app is selected and the other one is either selected or - // authorized. - return Boolean( - (!tbtcApp.isAuthorized && - !isTbtcSelected && - (isRandomBeaconSelected || randomBeaconApp.isAuthorized)) || - (!randomBeaconApp.isAuthorized && - !isRandomBeaconSelected && - (isTbtcSelected || tbtcApp.isAuthorized)) - ) - } - - const alertTextColor = useColorModeValue("gray.900", "white") - - if (active && !stake) - return ( - No stake found for address: {stakingProviderAddress} - ) - - return active ? ( - <> - - -
Authorize Applications
- - - {isInactiveStake ? "inactive" : "active"} - - - -
- - {stake && !isLoggedInAsAuthorizer && ( - - - Only the authorizer can authorize staking applications. Please - connect your wallet as an authorizer of this stake. - - - )} - - {!isFullyAuthorized && ( - - - In order to earn rewards, please authorize Threshold apps to use - your stake. Note that you can authorize 100% of your stake for all - of the apps. You can change this amount at any time. - - - )} - - {stake === undefined ? ( - - Loading stake data... - - ) : ( - <> - - {shouldRenderBundledRewardsAlert() && } - - - - )} - {(!tbtcApp.isAuthorized || !randomBeaconApp.isAuthorized) && ( - - )} -
- - ) : ( -
{`Please connect your wallet.`}
- ) -} - -export default AuthorizeStakingAppsPage diff --git a/src/pages/Staking/HowItWorks/StakingApplications/ApplicationDetailsCard.tsx b/src/pages/Staking/HowItWorks/StakingApplications/ApplicationDetailsCard.tsx deleted file mode 100644 index de0852689..000000000 --- a/src/pages/Staking/HowItWorks/StakingApplications/ApplicationDetailsCard.tsx +++ /dev/null @@ -1,82 +0,0 @@ -import { FC } from "react" -import { MdCheckCircle } from "react-icons/all" -import { - BodyMd, - Box, - Card, - H5, - HStack, - Icon, - Image, - LabelSm, - Stack, - useColorModeValue, - List, - ListItem, - Grid, -} from "@threshold-network/components" -import InfoBox from "../../../../components/InfoBox" - -interface Props { - preTitle: string - title: string - description: string - imgSrc: any - ctaButtons: JSX.Element - rewardSteps: string[] -} - -const ApplicationDetailsCard: FC = ({ - preTitle, - title, - description, - imgSrc, - ctaButtons, - rewardSteps, -}) => { - const infoBoxBg = useColorModeValue("gray.50", "blackAlpha.300") - - return ( - - {preTitle} - - -
{title}
- {description} - - - -
- - {ctaButtons} - How to earn rewards - - {rewardSteps.map((step) => { - return ( - - - {step} - - ) - })} - - -
-
- ) -} - -export default ApplicationDetailsCard diff --git a/src/pages/Staking/HowItWorks/StakingApplications/index.tsx b/src/pages/Staking/HowItWorks/StakingApplications/index.tsx deleted file mode 100644 index f9a00bbbe..000000000 --- a/src/pages/Staking/HowItWorks/StakingApplications/index.tsx +++ /dev/null @@ -1,198 +0,0 @@ -import { - BodyMd, - BodyXs, - Card, - Divider, - H5, - HStack, - Image, - Stack, - VStack, -} from "@threshold-network/components" -import ApplicationDetailsCard from "./ApplicationDetailsCard" -import tbtcAppIllustrationLight from "../../../../static/images/tbtcAppIllustrationLight.svg" -import tbtcAppIllustrationDark from "../../../../static/images/tbtcAppIllustrationDark.svg" -import randomBeaconAppIllustrationLight from "../../../../static/images/randomBeaconAppIllustrationLight.png" -import randomBeaconAppIllustrationDark from "../../../../static/images/randomBeaconAppIllustrationDark.png" -import preAppIllustrationLight from "../../../../static/images/preAppIllustrationLight.png" -import preAppIllustrationDark from "../../../../static/images/preAppIllustrationDark.png" -import listIconStarLight from "../../../../static/images/ListIconStarLight.png" -import listIconStarDark from "../../../../static/images/ListIconStarDark.png" -import listIconStockLight from "../../../../static/images/ListIconStockLight.png" -import listIconStockDark from "../../../../static/images/ListIconStockDark.png" -import listIconArrowsLight from "../../../../static/images/ListIconArrowsLight.png" -import listIconArrowsDark from "../../../../static/images/ListIconArrowsDark.png" -import stakingApplicationsIllustrationLight from "../../../../static/images/StakingApplicationsIllustrationLight.png" -import stakingApplicationsIllustrationDark from "../../../../static/images/StakingApplicationsIllustrationDark.png" -import { PageComponent } from "../../../../types" -import { ExternalHref } from "../../../../enums" -import { featureFlags } from "../../../../constants" -import { Link as RouterLink } from "react-router-dom" -import { ColorMode, List, ListItem, useColorMode } from "@chakra-ui/react" -import ButtonLink from "../../../../components/ButtonLink" - -const preNodeSteps = ["Run a PRE node", "Have a staked balance"] -const randomBeaconNodeSteps = [ - "Run a Random Beacon node", - "Authorize a portion of your stake to Random Beacon", - "Have a staked balance", -] -const tbtcNodeSteps = [ - "Run a tBTC node", - "Authorize a portion of your stake to tBTC", - "Have a staked balance", -] - -const iconMap: { [iconName: string]: Record } = { - star: { light: listIconStarLight, dark: listIconStarDark }, - stock: { light: listIconStockLight, dark: listIconStockDark }, - arrows: { light: listIconArrowsLight, dark: listIconArrowsDark }, - stakingApps: { - light: stakingApplicationsIllustrationLight, - dark: stakingApplicationsIllustrationDark, - }, - tbtc: { - light: tbtcAppIllustrationLight, - dark: tbtcAppIllustrationDark, - }, - pre: { - light: preAppIllustrationLight, - dark: preAppIllustrationDark, - }, - randomBeacon: { - light: randomBeaconAppIllustrationLight, - dark: randomBeaconAppIllustrationDark, - }, -} - -const StakingApplications: PageComponent = () => { - const { colorMode } = useColorMode() - - return ( - -
Staking Applications
- - - - - Authorization allows you to authorize a portion or all of your stake - to be used by Threshold apps. - - - - - - Earn rewards by authorizing apps. - - - - - - - - - Authorize 100% of your stake for all apps for the most rewards - opportunity. - - - - - - - - - - Change your authorized amount at any time. - - There is a deauthorization cooldown period of 45 days. - - - - - - - - - - - - Authorize tBTC - - - tBTC Node Docs - - - } - rewardSteps={tbtcNodeSteps} - /> - - - Authorize Random Beacon - - - Random Beacon Node Docs - - - } - rewardSteps={randomBeaconNodeSteps} - /> - - PRE Node Docs - - } - rewardSteps={preNodeSteps} - /> - -
- ) -} - -StakingApplications.route = { - path: "applications", - index: false, - isPageEnabled: featureFlags.MULTI_APP_STAKING, -} - -export default StakingApplications diff --git a/src/pages/Staking/HowItWorks/StakingOverview/AboutAddressesCard.tsx b/src/pages/Staking/HowItWorks/StakingOverview/AboutAddressesCard.tsx deleted file mode 100644 index 1c4694c1e..000000000 --- a/src/pages/Staking/HowItWorks/StakingOverview/AboutAddressesCard.tsx +++ /dev/null @@ -1,50 +0,0 @@ -import { FC, ComponentProps } from "react" -import { List, ListItem } from "@chakra-ui/react" -import { LabelSm, BodyMd, BoxLabel, Card } from "@threshold-network/components" - -export const AboutAddressesCard: FC> = (props) => { - return ( - - about the Addresses you need to provide - - {aboutAddresses.map((action) => ( - - - {action.sectionName} - - - {action.items.map((item, index) => ( - - {item} - - ))} - - - ))} - - - ) -} - -const aboutAddresses = [ - { - sectionName: "Provider Address", - items: [ - "This address will be used to set up your nodes. There can only be one unique Provider address per stake, and this address cannot be reused", - ], - }, - { - sectionName: "Beneficiary Address", - items: [ - "This is the address where your rewards will be sent when claimed. You can have the same Beneficiary Address for multiple stakes.", - ], - }, - - { - sectionName: "Authorizer Address", - items: [ - "This address authorizes which applications can use the funds from your staking pool. It can be the same as your Beneficiary Address. You can have the same Authorizer Address for multiple stakes.", - "We recommend that the authorizer address matches your connected wallet.", - ], - }, -] diff --git a/src/pages/Staking/HowItWorks/StakingOverview/AuthorizingApplicationsCard.tsx b/src/pages/Staking/HowItWorks/StakingOverview/AuthorizingApplicationsCard.tsx deleted file mode 100644 index be6609a53..000000000 --- a/src/pages/Staking/HowItWorks/StakingOverview/AuthorizingApplicationsCard.tsx +++ /dev/null @@ -1,70 +0,0 @@ -import { ComponentProps, FC } from "react" -import { - BodyMd, - BoxLabel, - Card, - FlowStep, - FlowStepStatus, - LabelSm, - Image, - Stack, - useColorModeValue, -} from "@threshold-network/components" - -import AuthorizingApplicationsIllustrationLight from "../../../../static/images/AuthorizingApplicationsIllustrationLight.png" -import AuthorizingApplicationsIllustrationDark from "../../../../static/images/AuthorizingApplicationsIllustrationDark.png" -import Link from "../../../../components/Link" - -export const AuthorizingApplicationsCard: FC> = ( - props -) => { - const authorizingApplicationsIllustration = useColorModeValue( - AuthorizingApplicationsIllustrationLight, - AuthorizingApplicationsIllustrationDark - ) - - return ( - - Authorizing Applications - - In order to earn rewards, you can authorize Threshold applications to - use your stake. You can read more about the applications{" "} - here. Note that you - can authorize 100% of your stake for all of the apps. - - - - If you want to decrease your authorization, refer to the timeline below - for deauthorization of some or all of your stake from an application. - - - Deauthorization Timeline - - - - This is 1 transaction - - - You must wait a 45 day cooldown to then confirm the deauthorization. - This is 1 transaction. - - - - ) -} diff --git a/src/pages/Staking/HowItWorks/StakingOverview/LegacyStakesCard.tsx b/src/pages/Staking/HowItWorks/StakingOverview/LegacyStakesCard.tsx deleted file mode 100644 index 8e64b13ab..000000000 --- a/src/pages/Staking/HowItWorks/StakingOverview/LegacyStakesCard.tsx +++ /dev/null @@ -1,31 +0,0 @@ -import { ComponentProps, FC } from "react" -import { BodyMd, BoxLabel, Card, LabelSm } from "@threshold-network/components" -import ViewInBlockExplorer from "../../../../components/ViewInBlockExplorer" -import { ExplorerDataType } from "../../../../utils/createEtherscanLink" -import { LegacyStakesDepositSteps } from "../../../../components/StakingTimeline" - -export const LegacyStakesCard: FC< - ComponentProps & { - tStakingContractAddress: string - } -> = ({ tStakingContractAddress, ...props }) => { - return ( - - legacy stakes - - If you have an active stake on NuCypher or on Keep Network you can - authorize the{" "} - {" "} - on the legacy dashboards. - - - Staking Timeline - - - - ) -} diff --git a/src/pages/Staking/HowItWorks/StakingOverview/NewTStakesCard.tsx b/src/pages/Staking/HowItWorks/StakingOverview/NewTStakesCard.tsx deleted file mode 100644 index 4ca40f16a..000000000 --- a/src/pages/Staking/HowItWorks/StakingOverview/NewTStakesCard.tsx +++ /dev/null @@ -1,27 +0,0 @@ -import { FC, ComponentProps } from "react" -import { - BodyMd, - LabelSm, - Card, - FlowStepStatus, -} from "@threshold-network/components" -import StakingChecklist from "../../../../components/StakingTimeline" - -export const NewTStakesCard: FC> = (props) => { - return ( - - new threshold stakes - - Before you start staking on Threshold Network, make sure you are aware - of the following requirements: - - - - ) -} diff --git a/src/pages/Staking/HowItWorks/StakingOverview/StakingActionsCard.tsx b/src/pages/Staking/HowItWorks/StakingOverview/StakingActionsCard.tsx deleted file mode 100644 index a7a4ba963..000000000 --- a/src/pages/Staking/HowItWorks/StakingOverview/StakingActionsCard.tsx +++ /dev/null @@ -1,48 +0,0 @@ -import { FC, ComponentProps } from "react" -import { List, ListItem } from "@chakra-ui/react" -import { LabelSm, BodyMd, BoxLabel, Card } from "@threshold-network/components" - -export const StakingActionsCard: FC> = (props) => { - return ( - - staking actions - - {stakingActions.map((action) => ( - - - {action.sectionName} - - - {action.items.map((item, index) => ( - - {item} - - ))} - - - ))} - - - ) -} - -const stakingActions = [ - { - sectionName: "Rewards", - items: ["T rewards are released monthly."], - }, - { - sectionName: "Stake Top-ups", - items: [ - "You can top up your stake with more T tokens via the staking page.", - "If you want to top up your Legacy stake with Legacy tokens you have to go to the Legacy dashboard in order to do that.", - ], - }, - - { - sectionName: "Unstaking", - items: [ - "Unstaking can be total or partial. For a total unstake you will not be able to use the same Staking Provider Address for new stakes. This unstaked stake becomes an inactive stake and can be topped up anytime you want.", - ], - }, -] diff --git a/src/pages/Staking/HowItWorks/StakingOverview/ThresholdStakesCard.tsx b/src/pages/Staking/HowItWorks/StakingOverview/ThresholdStakesCard.tsx deleted file mode 100644 index 336b591b2..000000000 --- a/src/pages/Staking/HowItWorks/StakingOverview/ThresholdStakesCard.tsx +++ /dev/null @@ -1,39 +0,0 @@ -import { FC, ComponentProps } from "react" -import { UnorderedList, ListItem, useColorModeValue } from "@chakra-ui/react" -import { BodyMd, LabelSm, Card } from "@threshold-network/components" -import ViewInBlockExplorer from "../../../../components/ViewInBlockExplorer" -import { ExplorerDataType } from "../../../../utils/createEtherscanLink" - -export const ThresholdStakesCard: FC< - ComponentProps & { tStakingContractAddress: string } -> = ({ tStakingContractAddress, ...props }) => { - const bulletColor = useColorModeValue("gray.700", "gray.300") - const bulletColorStyle = { "::marker": { color: bulletColor } } - - return ( - - threshold stakes - - Either you are a new staker, a legacy NU staker or a legacy KEEP staker - we have a role and a place for everyone. - - - The{" "} - {" "} - supports two types of stakes: - - - - Legacy Stakes (NuCypher and Keep Network stakes) - - - New T Stakes - - - - ) -} diff --git a/src/pages/Staking/HowItWorks/StakingOverview/index.tsx b/src/pages/Staking/HowItWorks/StakingOverview/index.tsx deleted file mode 100644 index e95ade0cd..000000000 --- a/src/pages/Staking/HowItWorks/StakingOverview/index.tsx +++ /dev/null @@ -1,83 +0,0 @@ -import { Grid } from "@chakra-ui/react" -import { ThresholdStakesCard } from "./ThresholdStakesCard" -import { NewTStakesCard } from "./NewTStakesCard" -import { LegacyStakesCard } from "./LegacyStakesCard" -import { StakingActionsCard } from "./StakingActionsCard" -import { AboutAddressesCard } from "./AboutAddressesCard" -import { useTStakingContract } from "../../../../web3/hooks" -import { AuthorizingApplicationsCard } from "./AuthorizingApplicationsCard" -import { PageComponent } from "../../../../types" -import { featureFlags } from "../../../../constants" - -const gridTemplate = featureFlags.MULTI_APP_STAKING - ? { - base: ` - "t-stakes" - "legacy-stakes" - "new-t-stakes" - "authorizing-apps" - "staking-actions" - "addresses" - `, - xl: ` - "t-stakes legacy-stakes" - "new-t-stakes legacy-stakes" - "new-t-stakes authorizing-apps" - "new-t-stakes authorizing-apps" - "staking-actions authorizing-apps" - "addresses authorizing-apps" - `, - } - : { - base: ` - "t-stakes" - "legacy-stakes" - "new-t-stakes" - "staking-actions" - "addresses" - "providers-card-non-mas" - `, - xl: ` - "t-stakes new-t-stakes" - "legacy-stakes new-t-stakes" - "legacy-stakes staking-actions" - "addresses staking-actions" - "addresses staking-actions" - "addresses providers-card-non-mas" - `, - } - -const StakingOverview: PageComponent = () => { - const tStakingContract = useTStakingContract() - return ( - - - - - {featureFlags.MULTI_APP_STAKING && ( - - )} - - - - ) -} - -StakingOverview.route = { - path: "overview", - index: false, - isPageEnabled: true, -} - -export default StakingOverview diff --git a/src/pages/Staking/HowItWorks/StakingProviders/index.tsx b/src/pages/Staking/HowItWorks/StakingProviders/index.tsx deleted file mode 100644 index f47299b9f..000000000 --- a/src/pages/Staking/HowItWorks/StakingProviders/index.tsx +++ /dev/null @@ -1,49 +0,0 @@ -import { - BoxLabel, - Divider, - Grid, - Card, - BodyMd, - H5, -} from "@threshold-network/components" -import { PageComponent } from "../../../../types" -import { featureFlags } from "../../../../constants" -import { AllAppsProvidersList } from "../../../../components/StakingProvidersList" - -const StakingProviders: PageComponent = () => { - return ( - -
Staking Providers
- - - You can delegate running an application node to one of the - node-as-a-service Staking Providers listed below. Please note that these - staking providers are not vetted or endorsed by Threshold. Use your - judgement when selecting a provider. - - - - - - -
- ) -} - -StakingProviders.route = { - path: "providers", - index: false, - isPageEnabled: featureFlags.MULTI_APP_STAKING, -} - -export default StakingProviders diff --git a/src/pages/Staking/HowItWorks/index.tsx b/src/pages/Staking/HowItWorks/index.tsx deleted file mode 100644 index fc580ede6..000000000 --- a/src/pages/Staking/HowItWorks/index.tsx +++ /dev/null @@ -1,90 +0,0 @@ -import React, { useEffect, useMemo } from "react" -import { - Box, - FilterTabs, - FilterTab, - useColorModeValue, -} from "@threshold-network/components" -import StakingOverview from "./StakingOverview" -import StakingApplications from "./StakingApplications" -import StakingProviders from "./StakingProviders" -import AnnouncementBanner from "../../../components/AnnouncementBanner" -import stakingHowItWorksIllustrationLight from "../../../static/images/StakingHowItWorksIllustrationLight.png" -import stakingHowItWorksIllustrationDark from "../../../static/images/StakingHowItWorksIllustrationDark.png" -import { PageComponent } from "../../../types" -import { - Link as RouterLink, - Outlet, - useLocation, - useNavigate, -} from "react-router-dom" -import { featureFlags } from "../../../constants" - -const HowItWorksPage: PageComponent = () => { - const { pathname } = useLocation() - const navigate = useNavigate() - - const howItWorksIllustration = useColorModeValue( - stakingHowItWorksIllustrationLight, - stakingHowItWorksIllustrationDark - ) - - useEffect(() => { - if (pathname === "/staking/how-it-works") { - navigate("/staking/how-it-works/overview") - } - }, [pathname, navigate]) - - const selectedTabId = useMemo(() => { - const basePath = `/staking/how-it-works` - switch (pathname) { - case `${basePath}/overview`: - return "1" - case `${basePath}/applications`: - return "2" - case `${basePath}/providers`: - return "3" - } - return "1" - }, [pathname]) - - return ( - - - {featureFlags.MULTI_APP_STAKING && ( - - - Overview - - - Applications - - - Providers - - - )} - - - ) -} - -HowItWorksPage.route = { - path: "how-it-works", - pathOverride: "how-it-works/*", - index: false, - pages: [StakingOverview, StakingApplications, StakingProviders], - title: "How it works", - isPageEnabled: true, -} - -export default HowItWorksPage diff --git a/src/pages/Staking/NewStakeCard.tsx b/src/pages/Staking/NewStakeCard.tsx deleted file mode 100644 index 41079048d..000000000 --- a/src/pages/Staking/NewStakeCard.tsx +++ /dev/null @@ -1,51 +0,0 @@ -import { Card, LabelSm } from "@threshold-network/components" -import { ComponentProps, FC, useMemo } from "react" -import { StakingContractLearnMore } from "../../components/Link" -import { TokenAmountForm } from "../../components/Forms" -import { Token, ModalType } from "../../enums" -import { useMinStakeAmount } from "../../hooks/useMinStakeAmount" -import { useModal } from "../../hooks/useModal" -import { useTokenBalance } from "../../hooks/useTokenBalance" -import { formatTokenAmount } from "../../utils/formatAmount" -import { useWeb3React } from "@web3-react/core" - -const NewStakeCard: FC> = () => { - const { openModal } = useModal() - const tBalance = useTokenBalance(Token.T) - const { minStakeAmount, isLoading, hasError } = useMinStakeAmount() - const { active } = useWeb3React() - - const openStakingModal = async (stakeAmount: string) => { - openModal(ModalType.StakingChecklist, { stakeAmount }) - } - - const placeholder = useMemo(() => { - if (hasError) { - return "Error fetching min stake" - } - - return `Minimum stake ${ - isLoading || minStakeAmount === undefined - ? "loading..." - : `${formatTokenAmount(minStakeAmount)} T` - }` - }, [isLoading, hasError, minStakeAmount]) - - return ( - - New Stake - - - - ) -} - -export default NewStakeCard diff --git a/src/pages/Staking/OperatorAddressMappingCard.tsx b/src/pages/Staking/OperatorAddressMappingCard.tsx deleted file mode 100644 index 47e738ab3..000000000 --- a/src/pages/Staking/OperatorAddressMappingCard.tsx +++ /dev/null @@ -1,124 +0,0 @@ -import { Icon } from "@chakra-ui/icons" -import { - Alert, - AlertIcon, - Badge, - BodyMd, - BodyXs, - Box, - BoxLabel, - Button, - Card, - HStack, - LabelSm, - LineDivider, - Tooltip, - useColorModeValue, -} from "@threshold-network/components" -import { FC } from "react" -import { ModalType } from "../../enums" -import { useAppSelector } from "../../hooks/store" -import { useModal } from "../../hooks/useModal" -import { selectMappedOperators } from "../../store/account/selectors" -import shortenAddress from "../../utils/shortenAddress" -import { isAddressZero } from "../../web3/utils" -import { FcCheckmark, FiLink2 } from "react-icons/all" -import { getStakingAppLabelFromAppName } from "../../utils/getStakingAppLabel" -import { StakingAppName } from "../../store/staking-applications" - -const OperatorAddressMappingCard: FC<{ stakingProvider: string }> = ({ - stakingProvider, -}) => { - const { openModal } = useModal() - const { - mappedOperatorTbtc, - mappedOperatorRandomBeacon, - isOneOfTheAppsNotMapped, - } = useAppSelector(selectMappedOperators) - - const shoudlDisplaySuccessState = - !isAddressZero(mappedOperatorTbtc) && - !isAddressZero(mappedOperatorRandomBeacon) - - const onStartMappingClick = () => { - openModal(ModalType.MapOperatorToStakingProvider) - } - - const mappedOperators = { - tbtc: mappedOperatorTbtc, - randomBeacon: mappedOperatorRandomBeacon, - } - - return ( - - - Operator Address Mapping - - Node operators only - - - {shoudlDisplaySuccessState ? ( - Object.entries(mappedOperators).map(([appName, operator]) => { - return ( - - - - {getStakingAppLabelFromAppName(appName as StakingAppName)} App - - - - {" "} - Operator Mapped - - - - - - Provider - - - - {shortenAddress(stakingProvider)} - - - - - Operator - - - - {shortenAddress(operator)} - - - - {Object.keys(mappedOperators)[ - Object.keys(mappedOperators).length - 1 - ] !== appName && } - - ) - }) - ) : ( - <> - - - - {isOneOfTheAppsNotMapped - ? "One application from the tBTC + Random Beacon Rewards Bundle Suite requires the Operator Address mapped." - : "This section is for Staking Providers and self-operating stakers only. Map your Operator Address to your Provider Address for a better support for your hardware wallet in the node setup."} - - - - - )} - - ) -} - -export default OperatorAddressMappingCard diff --git a/src/pages/Staking/RewardsCard.tsx b/src/pages/Staking/RewardsCard.tsx deleted file mode 100644 index e04008e69..000000000 --- a/src/pages/Staking/RewardsCard.tsx +++ /dev/null @@ -1,100 +0,0 @@ -import { FC } from "react" -import { Button, useColorModeValue, VStack } from "@chakra-ui/react" -import { useWeb3React } from "@web3-react/core" -import { - BodyMd, - BodyLg, - H5, - LabelSm, - Card, - HStack, - Badge, - useCountdown, -} from "@threshold-network/components" -import InfoBox from "../../components/InfoBox" -import { useModal } from "../../hooks/useModal" -import { ModalType } from "../../enums" -import { formatTokenAmount } from "../../utils/formatAmount" -import { BigNumber } from "ethers" -import { useNextRewardsDropDate } from "../../hooks/useNextRewardsDropDate" - -const RewardsCard: FC<{ - totalRewardsBalance: string - totalBonusBalance: string -}> = ({ totalRewardsBalance, totalBonusBalance }) => { - const { active } = useWeb3React() - const { openModal } = useModal() - - const dropTimestamp = useNextRewardsDropDate() - const { days, hours, minutes, seconds } = useCountdown(dropTimestamp, true) - - const hasBonusRewards = BigNumber.from(totalBonusBalance).gt(0) - const hasRewards = BigNumber.from(totalRewardsBalance).gt(0) - - const timerColor = useColorModeValue("brand.500", "brand.300") - - return ( - - - Rewards - {hasBonusRewards ? ( - - staking bonus - - ) : ( - - Next emission - {`${days}d : ${hours}h : ${minutes}m : ${seconds}s`} - - )} - - Total Rewards - - {active ? ( - <> -
- {formatTokenAmount(totalRewardsBalance)} - T -
- {hasBonusRewards && ( - - {formatTokenAmount(totalBonusBalance)} T - - )} - - ) : ( - - Monthly staking rewards are distributed retroactively by the - Threshold Council and are claimable on or about the beginning of the - subsequent month. - - )} -
- - -
- ) -} - -export default RewardsCard diff --git a/src/pages/Staking/StakeCard/Header/HeaderTitle.tsx b/src/pages/Staking/StakeCard/Header/HeaderTitle.tsx deleted file mode 100644 index 47d4d913e..000000000 --- a/src/pages/Staking/StakeCard/Header/HeaderTitle.tsx +++ /dev/null @@ -1,18 +0,0 @@ -import { FC } from "react" -import NotificationPill from "../../../../components/NotificationPill" -import { LabelSm } from "@threshold-network/components" -import { getStakeTitle } from "../../../../utils/getStakeTitle" -import { StakeType } from "../../../../enums" - -export const StakeCardHeaderTitle: FC<{ stakeType?: StakeType }> = ({ - stakeType, -}) => { - return ( - <> - - - {getStakeTitle(stakeType)} - - - ) -} diff --git a/src/pages/Staking/StakeCard/Header/index.tsx b/src/pages/Staking/StakeCard/Header/index.tsx deleted file mode 100644 index fdf12b087..000000000 --- a/src/pages/Staking/StakeCard/Header/index.tsx +++ /dev/null @@ -1,47 +0,0 @@ -import { FC } from "react" -import { - Badge, - FilterTabs, - FilterTab, - Flex, -} from "@threshold-network/components" -import { StakeCardHeaderTitle } from "./HeaderTitle" -import { useStakeCardContext } from "../../../../hooks/useStakeCardContext" -import { StakeType } from "../../../../enums" - -export interface StakeCardHeaderProps { - stakeType?: StakeType - onTabClick: () => void -} - -const StakeCardHeader: FC = ({ - stakeType, - onTabClick, -}) => { - const { isInactiveStake } = useStakeCardContext() - - return ( - - - {isInactiveStake ? "inactive" : "active"} - - - - Stake - Unstake - - - ) -} - -export default StakeCardHeader diff --git a/src/pages/Staking/StakeCard/StakeAddressInfo/index.tsx b/src/pages/Staking/StakeCard/StakeAddressInfo/index.tsx deleted file mode 100644 index 26c3cb8a8..000000000 --- a/src/pages/Staking/StakeCard/StakeAddressInfo/index.tsx +++ /dev/null @@ -1,19 +0,0 @@ -import { FC } from "react" -import { BoxLabel, Flex, FlexProps } from "@threshold-network/components" -import { CopyAddressToClipboard } from "../../../../components/CopyToClipboard" - -const StakeAddressInfo: FC = ({ - stakingProvider, - ...restProps -}) => { - return ( - - - Provider Address - - - - ) -} - -export default StakeAddressInfo diff --git a/src/pages/Staking/StakeCard/StakeApplications/AuthorizeApplicationRow.tsx b/src/pages/Staking/StakeCard/StakeApplications/AuthorizeApplicationRow.tsx deleted file mode 100644 index 8fc89fe4a..000000000 --- a/src/pages/Staking/StakeCard/StakeApplications/AuthorizeApplicationRow.tsx +++ /dev/null @@ -1,67 +0,0 @@ -import { FC } from "react" -import { - BoxLabel, - BodySm, - HStack, - Progress, - StackProps, - useColorModeValue, -} from "@threshold-network/components" -import { CheckCircleIcon } from "@chakra-ui/icons" -import { formatPercentage } from "../../../../utils/percentage" -import ButtonLink from "../../../../components/ButtonLink" - -export interface AuthorizeApplicationRowProps extends StackProps { - label: string - isAuthorized: boolean - percentage: number - stakingProvider: string -} - -const AuthorizeApplicationRow: FC = ({ - label, - isAuthorized, - percentage, - stakingProvider, - ...restProps -}) => { - const iconColor = useColorModeValue("green.500", "green.300") - - return ( - - - ) : null - } - > - {label} App - - {isAuthorized ? ( - - - {formatPercentage(percentage, undefined, true)} - - ) : ( - - Authorize Application - - )} - - ) -} - -export default AuthorizeApplicationRow diff --git a/src/pages/Staking/StakeCard/StakeApplications/index.tsx b/src/pages/Staking/StakeCard/StakeApplications/index.tsx deleted file mode 100644 index d0bd89c43..000000000 --- a/src/pages/Staking/StakeCard/StakeApplications/index.tsx +++ /dev/null @@ -1,67 +0,0 @@ -import { FC } from "react" -import { BodyMd, Box, List } from "@threshold-network/components" -import AuthorizeApplicationRow from "./AuthorizeApplicationRow" -import BundledRewardsAlert from "../../../../components/BundledRewardsAlert" -import { useStakingAppDataByStakingProvider } from "../../../../hooks/staking-applications" -import { useAppSelector } from "../../../../hooks/store" -import { useStakeCardContext } from "../../../../hooks/useStakeCardContext" -import ButtonLink from "../../../../components/ButtonLink" - -const StakeApplications: FC<{ stakingProvider: string }> = ({ - stakingProvider, -}) => { - const tbtcApp = useStakingAppDataByStakingProvider("tbtc", stakingProvider) - const randomBeaconApp = useStakingAppDataByStakingProvider( - "randomBeacon", - stakingProvider - ) - const isTbtcFetching = useAppSelector( - (state) => state.applications.tbtc.stakingProviders.isFetching - ) - const isRandomBeaconFetching = useAppSelector( - (state) => state.applications.randomBeacon.stakingProviders.isFetching - ) - - const { isInactiveStake } = useStakeCardContext() - - return ( - - Applications - {(!tbtcApp.isAuthorized || !randomBeaconApp.isAuthorized) && - !isTbtcFetching && - !isRandomBeaconFetching && } - - - - - - - Configure Apps - - - ) -} - -export default StakeApplications diff --git a/src/pages/Staking/StakeCard/StakeBalance/LegacyStakeBalances/BalanceTreeItem.tsx b/src/pages/Staking/StakeCard/StakeBalance/LegacyStakeBalances/BalanceTreeItem.tsx deleted file mode 100644 index 1875c542e..000000000 --- a/src/pages/Staking/StakeCard/StakeBalance/LegacyStakeBalances/BalanceTreeItem.tsx +++ /dev/null @@ -1,26 +0,0 @@ -import { FC, Fragment, ReactElement } from "react" -import { BodyMd } from "@threshold-network/components" -import { TreeItem, TreeItemLineToNode } from "../../../../../components/Tree" -import InfoBox from "../../../../../components/InfoBox" -import TokenBalance from "../../../../../components/TokenBalance" - -export const BalanceTreeItem: FC<{ - label: string | ReactElement - value: string - isRoot?: boolean -}> = ({ label, value, children, isRoot = false }) => { - const LineComponent = isRoot ? Fragment : TreeItemLineToNode - return ( - - - {label} - - - - - - - {children} - - ) -} diff --git a/src/pages/Staking/StakeCard/StakeBalance/LegacyStakeBalances/index.tsx b/src/pages/Staking/StakeCard/StakeBalance/LegacyStakeBalances/index.tsx deleted file mode 100644 index 941f7e44f..000000000 --- a/src/pages/Staking/StakeCard/StakeBalance/LegacyStakeBalances/index.tsx +++ /dev/null @@ -1,52 +0,0 @@ -import { FC } from "react" -import { Icon, Tooltip } from "@chakra-ui/react" -import { InfoIcon } from "@chakra-ui/icons" -import { Tree, TreeNode } from "../../../../../components/Tree" -import { BalanceTreeItem } from "./BalanceTreeItem" - -const LegacyStakeBalances: FC<{ - nuInTStake: string - keepInTStake: string - tStake: string - totalInTStake: string -}> = ({ nuInTStake, keepInTStake, tStake, totalInTStake }) => { - return ( - - - - Total Staked Balance{" "} - - - - - } - value={totalInTStake} - > - - - {keepInTStake !== "0" && ( - - )} - {nuInTStake !== "0" && ( - - )} - - - - - ) -} - -export default LegacyStakeBalances diff --git a/src/pages/Staking/StakeCard/StakeBalance/index.tsx b/src/pages/Staking/StakeCard/StakeBalance/index.tsx deleted file mode 100644 index cb5f21785..000000000 --- a/src/pages/Staking/StakeCard/StakeBalance/index.tsx +++ /dev/null @@ -1,35 +0,0 @@ -import { FC, useContext } from "react" -import { BodyMd } from "@threshold-network/components" -import InfoBox from "../../../../components/InfoBox" -import TokenBalance from "../../../../components/TokenBalance" -import LegacyStakeBalances from "./LegacyStakeBalances" -import { useStakeCardContext } from "../../../../hooks/useStakeCardContext" - -const StakeBalance: FC<{ - nuInTStake: string - keepInTStake: string - tStake: string - totalInTStake: string -}> = ({ nuInTStake, keepInTStake, tStake, totalInTStake }) => { - const { hasLegacyStakes } = useStakeCardContext() - - return hasLegacyStakes ? ( - - ) : ( - <> - - Total Staked Balance - - - - - - ) -} - -export default StakeBalance diff --git a/src/pages/Staking/StakeCard/StakeRewards/index.tsx b/src/pages/Staking/StakeCard/StakeRewards/index.tsx deleted file mode 100644 index 6ad9c16c9..000000000 --- a/src/pages/Staking/StakeCard/StakeRewards/index.tsx +++ /dev/null @@ -1,39 +0,0 @@ -import { FC } from "react" -import { - Box, - Flex, - Badge, - BodyLg, - BodyMd, - HStack, -} from "@threshold-network/components" -import TokenBalance from "../../../../components/TokenBalance" -import { formatTokenAmount } from "../../../../utils/formatAmount" -import { useSelector } from "react-redux" -import { RootState } from "../../../../store" -import { selectRewardsByStakingProvider } from "../../../../store/rewards" - -const StakeRewards: FC<{ stakingProvider: string }> = ({ stakingProvider }) => { - const { total, bonus } = useSelector((state: RootState) => - selectRewardsByStakingProvider(state, stakingProvider) - ) - - return ( - - - Total Rewards - {bonus !== "0" && ( - - staking bonus - - )} - - - - {bonus !== "0" && {formatTokenAmount(bonus)} T} - - - ) -} - -export default StakeRewards diff --git a/src/pages/Staking/StakeCard/index.tsx b/src/pages/Staking/StakeCard/index.tsx deleted file mode 100644 index 048b1b7a5..000000000 --- a/src/pages/Staking/StakeCard/index.tsx +++ /dev/null @@ -1,197 +0,0 @@ -import { FC, useRef, useCallback } from "react" -import { FormikProps } from "formik" -import { BigNumber } from "@ethersproject/bignumber" -import { - Card, - LineDivider, - Button, - useBoolean, - Alert, - AlertDescription, - BodySm, - AlertIcon, - useColorModeValue, -} from "@threshold-network/components" -import { TokenAmountForm, FormValues } from "../../../components/Forms" -import { useTokenBalance } from "../../../hooks/useTokenBalance" -import { useModal } from "../../../hooks/useModal" -import { StakeData } from "../../../types/staking" -import { - ModalType, - StakeType, - Token, - TopUpType, - UnstakeType, -} from "../../../enums" -import { AddressZero, isAddressZero } from "../../../web3/utils" -import StakeApplications from "./StakeApplications" -import StakeCardHeader from "./Header" -import StakeRewards from "./StakeRewards" -import StakeBalance from "./StakeBalance" -import StakeAddressInfo from "./StakeAddressInfo" -import { featureFlags } from "../../../constants" -import { StakeCardContext } from "../../../contexts/StakeCardContext" -import { useStakeCardContext } from "../../../hooks/useStakeCardContext" -import { isSameETHAddress } from "../../../threshold-ts/utils" -import { useWeb3React } from "@web3-react/core" -import { useAppSelector } from "../../../hooks/store" -import { selectAvailableAmountToUnstakeByStakingProvider } from "../../../store/staking" -import { UnstakingFormLabel } from "../../../components/UnstakingFormLabel" - -const StakeCardProvider: FC<{ stake: StakeData }> = ({ stake }) => { - const isInactiveStake = BigNumber.from(stake.totalInTStake).isZero() - const canTopUpKepp = BigNumber.from(stake.possibleKeepTopUpInT).gt(0) - const canTopUpNu = BigNumber.from(stake.possibleNuTopUpInT).gt(0) - const hasLegacyStakes = stake.nuInTStake !== "0" || stake.keepInTStake !== "0" - const isPRESet = - !isAddressZero(stake.preConfig.operator) && - stake.preConfig.isOperatorConfirmed - - return ( - - - - ) -} - -const StakeCard: FC<{ stake: StakeData }> = ({ stake }) => { - const formRef = useRef>(null) - const [isStakeAction, setFlag] = useBoolean(true) - const tBalance = useTokenBalance(Token.T) - const { openModal } = useModal() - const { isInactiveStake, canTopUpKepp, canTopUpNu, isPRESet } = - useStakeCardContext() - const { account } = useWeb3React() - const availableAmountToUnstake = useAppSelector((state) => - selectAvailableAmountToUnstakeByStakingProvider( - state, - stake.stakingProvider - ) - ) - - const isOwner = isSameETHAddress(account ?? AddressZero, stake.owner) - - const submitButtonText = !isStakeAction ? "Unstake" : "Top-up" - - const onTabClick = useCallback(() => { - formRef.current?.resetForm() - setFlag.toggle() - }, [setFlag.toggle]) - - const onSubmitTopUp = ( - tokenAmount: string | number, - topUpType: TopUpType - ) => { - openModal(ModalType.TopupT, { stake, amountTopUp: tokenAmount, topUpType }) - } - - const onSubmitUnstakeOrTopupBtn = () => { - if (isStakeAction) { - openModal(ModalType.TopupLegacyStake, { stake }) - } else { - openModal(ModalType.UnstakeT, { stake }) - } - } - - const onSubmitForm = (tokenAmount: string | number) => { - if (isStakeAction) { - onSubmitTopUp(tokenAmount, TopUpType.NATIVE) - } else { - // We display the unstake form for stakes that only contains T liquid - // stake in the `StakeCard` directly. So we can go straight to the step 2 - // of the unstaking flow and force the unstake type to `native`. - openModal(ModalType.UnstakeTStep2, { - stake, - amountToUnstake: tokenAmount, - unstakeType: UnstakeType.NATIVE, - }) - } - } - const dividerColor = useColorModeValue("gray.300", "gray.700") - - return ( - - - - - {featureFlags.MULTI_APP_STAKING && ( - <> - - - - )} - {!isOwner && ( - - - - You are not the owner of this stake. - - - )} - - - {(canTopUpNu || canTopUpKepp) && isStakeAction ? ( - - ) : stake.stakeType === StakeType.T ? ( - - ) - } - submitButtonText={submitButtonText} - maxTokenAmount={isStakeAction ? tBalance : availableAmountToUnstake.t} - shouldDisplayMaxAmountInLabel={isStakeAction} - isDisabled={!isOwner} - submitButtonVariant="outline" - /> - ) : ( - - )} - - ) -} - -export default StakeCardProvider diff --git a/src/pages/Staking/StakeDetailsPage/NodeStatusLabel.tsx b/src/pages/Staking/StakeDetailsPage/NodeStatusLabel.tsx deleted file mode 100644 index 988d317d7..000000000 --- a/src/pages/Staking/StakeDetailsPage/NodeStatusLabel.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import React, { FC } from "react" -import { Alert, AlertIcon, BodyXs } from "@threshold-network/components" - -const NodeStatusLabel: FC<{ isAuthorized: boolean }> = ({ isAuthorized }) => { - return ( - - - {isAuthorized ? "" : "Not"} Authorized - - ) -} - -export default NodeStatusLabel diff --git a/src/pages/Staking/StakeDetailsPage/StakeDetailRow.tsx b/src/pages/Staking/StakeDetailsPage/StakeDetailRow.tsx deleted file mode 100644 index 0ac3420b6..000000000 --- a/src/pages/Staking/StakeDetailsPage/StakeDetailRow.tsx +++ /dev/null @@ -1,43 +0,0 @@ -import { FC } from "react" -import { BoxLabel, HStack } from "@threshold-network/components" -import { CopyAddressToClipboard } from "../../../components/CopyToClipboard" - -type CommonProps = { - label: string - isPrimary?: boolean -} -type ConditionalProps = - | { - isAddress?: false - address?: never - } - | { - isAddress: true - address: string - } - -type Props = CommonProps & ConditionalProps - -const StakeDetailRow: FC = ({ - label, - isAddress, - address, - isPrimary, - children, -}) => { - return ( - - {label} - {isAddress ? ( - - ) : ( - children - )} - - ) -} - -export default StakeDetailRow diff --git a/src/pages/Staking/StakeDetailsPage/index.tsx b/src/pages/Staking/StakeDetailsPage/index.tsx deleted file mode 100644 index cdb638b85..000000000 --- a/src/pages/Staking/StakeDetailsPage/index.tsx +++ /dev/null @@ -1,154 +0,0 @@ -import { StakeData } from "../../../types" -import { FC, useEffect } from "react" -import { - Badge, - BodyLg, - BodyMd, - Box, - Card, - Flex, - H5, - HStack, - LineDivider, - SimpleGrid, - Stack, -} from "@threshold-network/components" -import { BigNumber } from "ethers" -import InfoBox from "../../../components/InfoBox" -import TokenBalance from "../../../components/TokenBalance" -import StakeDetailRow from "./StakeDetailRow" -import { StakeCardHeaderTitle } from "../StakeCard/Header/HeaderTitle" -import { useNavigate, useParams } from "react-router-dom" -import { - requestStakeByStakingProvider, - selectStakeByStakingProvider, -} from "../../../store/staking" -import { selectRewardsByStakingProvider } from "../../../store/rewards" -import NodeStatusLabel from "./NodeStatusLabel" -import { useStakingAppDataByStakingProvider } from "../../../hooks/staking-applications" -import { useAppDispatch, useAppSelector } from "../../../hooks/store" -import { useWeb3React } from "@web3-react/core" -import { AddressZero } from "@ethersproject/constants" -import { isAddress } from "../../../web3/utils" - -const StakeDetailsPage: FC = () => { - const { stakingProviderAddress } = useParams() - const { account, active } = useWeb3React() - const navigate = useNavigate() - const dispatch = useAppDispatch() - - useEffect(() => { - if (!isAddress(stakingProviderAddress!)) navigate(`/staking`) - }, [stakingProviderAddress, navigate]) - - useEffect(() => { - dispatch( - requestStakeByStakingProvider({ stakingProvider: stakingProviderAddress }) - ) - }, [stakingProviderAddress, account, dispatch]) - - const stake = useAppSelector((state) => - selectStakeByStakingProvider(state, stakingProviderAddress!) - ) as StakeData - - const tbtcApp = useStakingAppDataByStakingProvider( - "tbtc", - stakingProviderAddress || AddressZero - ) - - const randomBeaconApp = useStakingAppDataByStakingProvider( - "randomBeacon", - stakingProviderAddress || AddressZero - ) - - const isInActiveStake = BigNumber.from(stake?.totalInTStake ?? "0").isZero() - - const { total: rewardsForStake } = useAppSelector((state) => - selectRewardsByStakingProvider(state, stakingProviderAddress!) - ) - - if (active && !stake) - return No Stake found for address: {stakingProviderAddress} - - return active ? ( - - -
Stake Details
- - - {isInActiveStake ? "inactive" : "active"} - - - -
- - - - - Total Staked Balance - - - - - - Total Rewards - - - - - - - - - - - - - - - - - - - - -
- ) : ( -
{`Please connect your wallet.`}
- ) -} - -export default StakeDetailsPage diff --git a/src/pages/Staking/StakedPortfolioCard.tsx b/src/pages/Staking/StakedPortfolioCard.tsx deleted file mode 100644 index aa1f483aa..000000000 --- a/src/pages/Staking/StakedPortfolioCard.tsx +++ /dev/null @@ -1,44 +0,0 @@ -import { ComponentProps, FC } from "react" -import { HStack } from "@chakra-ui/react" -import { - BodyLg, - BodyMd, - LabelSm, - Card, - BoxLabel, -} from "@threshold-network/components" -import InfoBox from "../../components/InfoBox" -import TokenBalance from "../../components/TokenBalance" -import { useStakingState } from "../../hooks/useStakingState" -import { useTokenBalance } from "../../hooks/useTokenBalance" -import { Token } from "../../enums" -import { formatTokenAmount } from "../../utils/formatAmount" - -const StakedPortfolioCard: FC> = (props) => { - const tBalance = useTokenBalance(Token.T) - - const { stakedBalance } = useStakingState() - - return ( - - - Staked Portfolio - - Staked Balance - - - - - Wallet - {formatTokenAmount(tBalance)} T - - - ) -} - -export default StakedPortfolioCard diff --git a/src/pages/Staking/StakingTvlCard.tsx b/src/pages/Staking/StakingTvlCard.tsx deleted file mode 100644 index fbf7b94ca..000000000 --- a/src/pages/Staking/StakingTvlCard.tsx +++ /dev/null @@ -1,36 +0,0 @@ -import { FC } from "react" -import { H1, LabelSm, Card, BoxProps } from "@threshold-network/components" -import { formatFiatCurrencyAmount } from "../../utils/formatAmount" -import { - StatHighlightCard, - StatHighlightTitle, - StatHighlightValue, -} from "../../components/StatHighlightCard" - -export interface StakingTvlCardProps extends BoxProps { - stakingTvl: string -} - -const StakingTvlCard: FC = ({ - stakingTvl, - ...restProps -}) => { - const formattedStakingTvl = formatFiatCurrencyAmount(stakingTvl) - - return ( - - - - - ) - return ( - - - staking tvl - -

{formatFiatCurrencyAmount(stakingTvl)}

-
- ) -} - -export default StakingTvlCard diff --git a/src/pages/Staking/index.tsx b/src/pages/Staking/index.tsx deleted file mode 100644 index c80a79641..000000000 --- a/src/pages/Staking/index.tsx +++ /dev/null @@ -1,228 +0,0 @@ -import { useEffect, useMemo } from "react" -import StakingTvlCard from "./StakingTvlCard" -import StakedPortfolioCard from "./StakedPortfolioCard" -import PageLayout from "../PageLayout" -import StakeCard from "./StakeCard" -import RewardsCard from "./RewardsCard" -import { useFetchTvl } from "../../hooks/useFetchTvl" -import { useStakingState } from "../../hooks/useStakingState" -import { PageComponent } from "../../types" -import HowItWorksPage from "./HowItWorks" -import { useDispatch, useSelector } from "react-redux" -import { - selectTotalBonusBalance, - selectTotalRewardsBalance, -} from "../../store/rewards" -import AuthorizeStakingAppsPage from "./AuthorizeStakingApps" -import { - FilterTabs, - FilterTab, - H4, - Breadcrumb, - BreadcrumbItem, - BreadcrumbLink, - HStack, - VStack, - useColorModeValue, -} from "@threshold-network/components" -import { - Link as RouterLink, - Outlet, - useLocation, - useParams, -} from "react-router-dom" -import { stakingApplicationsSlice } from "../../store/staking-applications/slice" -import StakeDetailsPage from "./StakeDetailsPage" -import NewStakeCard from "./NewStakeCard" -import OperatorAddressMappingCard from "./OperatorAddressMappingCard" -import { isAddressZero } from "../../web3/utils" -import { useAppSelector } from "../../hooks/store" - -const StakingPage: PageComponent = (props) => { - const [data, fetchtTvlData] = useFetchTvl() - const dispatch = useDispatch() - - useEffect(() => { - dispatch(stakingApplicationsSlice.actions.getSupportedApps({})) - }, [dispatch]) - - useEffect(() => { - fetchtTvlData() - }, [fetchtTvlData]) - const { stakes } = useStakingState() - const totalRewardsBalance = useSelector(selectTotalRewardsBalance) - const totalBonusBalance = useSelector(selectTotalBonusBalance) - const hasStakes = stakes.length > 0 - - const { - address, - isStakingProvider, - operatorMapping: { - isInitialFetchDone: isOperatorMappingInitialFetchDone, - data: mappedOperators, - }, - } = useAppSelector((state) => state.account) - - return ( - - - -

- Your Stake -

- {address && - isStakingProvider && - isOperatorMappingInitialFetchDone && - (isAddressZero(mappedOperators.tbtc) || - isAddressZero(mappedOperators.randomBeacon)) && ( - - )} - {hasStakes ? ( - stakes.map((stake) => ( - - )) - ) : ( - - )} - {address && - isStakingProvider && - isOperatorMappingInitialFetchDone && - !isAddressZero(mappedOperators.tbtc) && - !isAddressZero(mappedOperators.randomBeacon) && ( - - )} -
- -

- Overview -

- - - - {hasStakes && } -
-
-
- ) -} - -const StakingProviderDetails: PageComponent = (props) => { - const { stakingProviderAddress } = useParams() - const { pathname } = useLocation() - const lastElementOfTheUrl = pathname.split("/").at(-1) - - const selectedTabId = useMemo(() => { - if (pathname.includes("details")) { - return "1" - } - if (pathname.includes("authorize")) { - return "2" - } - }, [pathname]) - - const breadcrumbColor = useColorModeValue("gray.700", "gray.300") - - return ( - <> - - - - Staking - - - - - {lastElementOfTheUrl === "authorize" - ? "Authorize Applications" - : "Stake Details"} - - - - - - Stake Details - - - Authorize Applications - - - - - ) -} - -const Details: PageComponent = () => { - return -} - -const Auth: PageComponent = () => { - return -} - -const MainStakingPage: PageComponent = (props) => { - return ( - - ) -} - -StakingProviderDetails.route = { - path: ":stakingProviderAddress", - index: false, - pages: [Details, Auth], - isPageEnabled: true, -} - -Details.route = { - path: "details", - index: true, - isPageEnabled: true, -} - -Auth.route = { - path: "authorize", - index: false, - isPageEnabled: true, -} - -StakingPage.route = { - path: "", - index: false, - pathOverride: "*", - title: "Staking", - isPageEnabled: true, -} - -MainStakingPage.route = { - path: "staking", - index: true, - pages: [HowItWorksPage, StakingPage, StakingProviderDetails], - title: "Staking", - isPageEnabled: true, -} - -export default MainStakingPage diff --git a/src/pages/index.ts b/src/pages/index.ts index 8b42e29bd..779b570f0 100644 --- a/src/pages/index.ts +++ b/src/pages/index.ts @@ -1,4 +1,3 @@ -import Staking from "./Staking" import TBTC from "./tBTC" -export const pages = [Staking, TBTC] \ No newline at end of file +export const pages = [TBTC] diff --git a/src/pages/tBTC/Bridge/Unmint.tsx b/src/pages/tBTC/Bridge/Unmint.tsx index 2892e0046..155f6b5e4 100644 --- a/src/pages/tBTC/Bridge/Unmint.tsx +++ b/src/pages/tBTC/Bridge/Unmint.tsx @@ -160,8 +160,6 @@ const UnmintFormBase: FC = ({ Amount diff --git a/src/static/icons/KeepCircleBrand.tsx b/src/static/icons/KeepCircleBrand.tsx deleted file mode 100644 index 54d9ed2ab..000000000 --- a/src/static/icons/KeepCircleBrand.tsx +++ /dev/null @@ -1,17 +0,0 @@ -import { createIcon } from "@chakra-ui/icons" - -const KeepCircleBrand = createIcon({ - displayName: "KeepCircleBrand", - viewBox: "0 0 32 32", - path: ( - - - - - ), -}) - -export default KeepCircleBrand diff --git a/src/static/icons/NuCircleBrand.tsx b/src/static/icons/NuCircleBrand.tsx deleted file mode 100644 index 9c35240bd..000000000 --- a/src/static/icons/NuCircleBrand.tsx +++ /dev/null @@ -1,23 +0,0 @@ -import { createIcon } from "@chakra-ui/icons" - -const NuCircleBrand = createIcon({ - displayName: "NuCircleBrand", - viewBox: "0 0 32 32", - path: ( - - - - - ), -}) - -export default NuCircleBrand diff --git a/src/static/icons/ThresholdCircleBrand.tsx b/src/static/icons/ThresholdCircleBrand.tsx deleted file mode 100644 index bb3318ee2..000000000 --- a/src/static/icons/ThresholdCircleBrand.tsx +++ /dev/null @@ -1,35 +0,0 @@ -import { createIcon } from "@chakra-ui/icons" - -const ThresholdCircleBrand = createIcon({ - displayName: "ThresholdCircleBrand", - viewBox: "0 0 33 33", - path: ( - - - - - - - - - - - - ), -}) - -export default ThresholdCircleBrand diff --git a/src/static/icons/tokenIconMap.ts b/src/static/icons/tokenIconMap.ts deleted file mode 100644 index 3e0c4d042..000000000 --- a/src/static/icons/tokenIconMap.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { ComponentType } from "react" -import KeepCircleBrand from "./KeepCircleBrand" -import NuCircleBrand from "./NuCircleBrand" -import ThresholdCircleBrand from "./ThresholdCircleBrand" - -const tokenIcons = [ - "KEEP_CIRCLE_BRAND", - "NU_CIRCLE_BRAND", - "T_CIRCLE_BRAND", -] as const - -export type TokenIcon = typeof tokenIcons[number] - -const tokenIconMap: Record = { - KEEP_CIRCLE_BRAND: KeepCircleBrand, - NU_CIRCLE_BRAND: NuCircleBrand, - T_CIRCLE_BRAND: ThresholdCircleBrand, -} - -export default tokenIconMap diff --git a/src/static/images/AuthorizingApplicationsIllustrationDark.png b/src/static/images/AuthorizingApplicationsIllustrationDark.png deleted file mode 100644 index c0b19df74..000000000 Binary files a/src/static/images/AuthorizingApplicationsIllustrationDark.png and /dev/null differ diff --git a/src/static/images/AuthorizingApplicationsIllustrationLight.png b/src/static/images/AuthorizingApplicationsIllustrationLight.png deleted file mode 100644 index 3dcdd009e..000000000 Binary files a/src/static/images/AuthorizingApplicationsIllustrationLight.png and /dev/null differ diff --git a/src/static/images/ListIconArrowsDark.png b/src/static/images/ListIconArrowsDark.png deleted file mode 100644 index 78300cfe9..000000000 Binary files a/src/static/images/ListIconArrowsDark.png and /dev/null differ diff --git a/src/static/images/ListIconArrowsLight.png b/src/static/images/ListIconArrowsLight.png deleted file mode 100644 index 662c54523..000000000 Binary files a/src/static/images/ListIconArrowsLight.png and /dev/null differ diff --git a/src/static/images/ListIconStarDark.png b/src/static/images/ListIconStarDark.png deleted file mode 100644 index 4bbbf98ad..000000000 Binary files a/src/static/images/ListIconStarDark.png and /dev/null differ diff --git a/src/static/images/ListIconStarLight.png b/src/static/images/ListIconStarLight.png deleted file mode 100644 index 391c88172..000000000 Binary files a/src/static/images/ListIconStarLight.png and /dev/null differ diff --git a/src/static/images/ListIconStockDark.png b/src/static/images/ListIconStockDark.png deleted file mode 100644 index d9aeb7ddb..000000000 Binary files a/src/static/images/ListIconStockDark.png and /dev/null differ diff --git a/src/static/images/ListIconStockLight.png b/src/static/images/ListIconStockLight.png deleted file mode 100644 index 58f2e11e9..000000000 Binary files a/src/static/images/ListIconStockLight.png and /dev/null differ diff --git a/src/static/images/RandomBeaconDecrease.png b/src/static/images/RandomBeaconDecrease.png deleted file mode 100644 index 7a4cd4dfe..000000000 Binary files a/src/static/images/RandomBeaconDecrease.png and /dev/null differ diff --git a/src/static/images/RandomBeaconIncrease.png b/src/static/images/RandomBeaconIncrease.png deleted file mode 100644 index 3db472ab3..000000000 Binary files a/src/static/images/RandomBeaconIncrease.png and /dev/null differ diff --git a/src/static/images/StakingApplicationsIllustrationDark.png b/src/static/images/StakingApplicationsIllustrationDark.png deleted file mode 100644 index f78b4154b..000000000 Binary files a/src/static/images/StakingApplicationsIllustrationDark.png and /dev/null differ diff --git a/src/static/images/StakingApplicationsIllustrationLight.png b/src/static/images/StakingApplicationsIllustrationLight.png deleted file mode 100644 index ccf1354c3..000000000 Binary files a/src/static/images/StakingApplicationsIllustrationLight.png and /dev/null differ diff --git a/src/static/images/StakingHowItWorksIllustrationDark.png b/src/static/images/StakingHowItWorksIllustrationDark.png deleted file mode 100644 index d84fb25a9..000000000 Binary files a/src/static/images/StakingHowItWorksIllustrationDark.png and /dev/null differ diff --git a/src/static/images/StakingHowItWorksIllustrationLight.png b/src/static/images/StakingHowItWorksIllustrationLight.png deleted file mode 100644 index 683e69bd8..000000000 Binary files a/src/static/images/StakingHowItWorksIllustrationLight.png and /dev/null differ diff --git a/src/static/images/TbtcDecrease.png b/src/static/images/TbtcDecrease.png deleted file mode 100644 index f20c5e823..000000000 Binary files a/src/static/images/TbtcDecrease.png and /dev/null differ diff --git a/src/static/images/TbtcIncrease.png b/src/static/images/TbtcIncrease.png deleted file mode 100644 index 69fc31770..000000000 Binary files a/src/static/images/TbtcIncrease.png and /dev/null differ diff --git a/src/static/images/preAppIllustrationDark.png b/src/static/images/preAppIllustrationDark.png deleted file mode 100644 index e05b0b168..000000000 Binary files a/src/static/images/preAppIllustrationDark.png and /dev/null differ diff --git a/src/static/images/preAppIllustrationLight.png b/src/static/images/preAppIllustrationLight.png deleted file mode 100644 index 78307fc52..000000000 Binary files a/src/static/images/preAppIllustrationLight.png and /dev/null differ diff --git a/src/static/images/randomBeaconAppIllustrationDark.png b/src/static/images/randomBeaconAppIllustrationDark.png deleted file mode 100644 index c85eceefb..000000000 Binary files a/src/static/images/randomBeaconAppIllustrationDark.png and /dev/null differ diff --git a/src/static/images/randomBeaconAppIllustrationLight.png b/src/static/images/randomBeaconAppIllustrationLight.png deleted file mode 100644 index bdac8d17c..000000000 Binary files a/src/static/images/randomBeaconAppIllustrationLight.png and /dev/null differ diff --git a/src/static/images/stakingProviders/BoarLogo.png b/src/static/images/stakingProviders/BoarLogo.png deleted file mode 100644 index 4a1c081dc..000000000 Binary files a/src/static/images/stakingProviders/BoarLogo.png and /dev/null differ diff --git a/src/static/images/stakingProviders/DelightLogo.svg b/src/static/images/stakingProviders/DelightLogo.svg deleted file mode 100644 index 2fd7af3ec..000000000 --- a/src/static/images/stakingProviders/DelightLogo.svg +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - diff --git a/src/static/images/stakingProviders/InfStonesLogo.png b/src/static/images/stakingProviders/InfStonesLogo.png deleted file mode 100644 index eb47e38ac..000000000 Binary files a/src/static/images/stakingProviders/InfStonesLogo.png and /dev/null differ diff --git a/src/static/images/stakingProviders/P2PValidatorLogo.png b/src/static/images/stakingProviders/P2PValidatorLogo.png deleted file mode 100644 index 53305bbae..000000000 Binary files a/src/static/images/stakingProviders/P2PValidatorLogo.png and /dev/null differ diff --git a/src/static/images/stakingProviders/StakedLogo.png b/src/static/images/stakingProviders/StakedLogo.png deleted file mode 100644 index 15eeb6cb8..000000000 Binary files a/src/static/images/stakingProviders/StakedLogo.png and /dev/null differ diff --git a/src/store/account/effects.ts b/src/store/account/effects.ts deleted file mode 100644 index a4f23ecbc..000000000 --- a/src/store/account/effects.ts +++ /dev/null @@ -1,64 +0,0 @@ -import { StakeData } from "../../types" -import { isAddressZero, isSameETHAddress } from "../../web3/utils" -import { AppListenerEffectAPI } from "../listener" -import { setStakes } from "../staking" -import { - accountUsedAsStakingProvider, - accountSlice, - fetchingOperatorMapping, - setMappedOperators, -} from "./slice" - -export const getStakingProviderOperatorInfo = async ( - action: ReturnType, - listenerApi: AppListenerEffectAPI -) => { - try { - const { account } = listenerApi.getState() - const { address } = account - const stakes = action.payload - - const stake = stakes.find((_: StakeData) => - isSameETHAddress(_.stakingProvider, address) - ) - - let isStakingProvider = false - - if (stake) { - isStakingProvider = true - } else { - const { owner, authorizer, beneficiary } = - await listenerApi.extra.threshold.staking.rolesOf(address) - - isStakingProvider = - !isAddressZero(owner) && - !isAddressZero(authorizer) && - !isAddressZero(beneficiary) - } - - if (!isStakingProvider) return - - listenerApi.dispatch(fetchingOperatorMapping()) - - listenerApi.dispatch(accountUsedAsStakingProvider()) - - const mappedOperators = - await listenerApi.extra.threshold.multiAppStaking.getMappedOperatorsForStakingProvider( - address - ) - - listenerApi.dispatch( - setMappedOperators({ - tbtc: mappedOperators.tbtc, - randomBeacon: mappedOperators.randomBeacon, - }) - ) - } catch (error: any) { - listenerApi.dispatch( - accountSlice.actions.setOperatorMappingError({ - error, - }) - ) - throw new Error("Could not load staking provider's operator info: " + error) - } -} diff --git a/src/store/account/selectors.ts b/src/store/account/selectors.ts index 9cb2fdc85..50ec1ee5e 100644 --- a/src/store/account/selectors.ts +++ b/src/store/account/selectors.ts @@ -1,28 +1,3 @@ -import { createSelector } from "@reduxjs/toolkit" import { RootState } from ".." -import { isAddressZero } from "../../web3/utils" -import { AccountState } from "./slice" export const selectAccountState = (state: RootState) => state.account - -export const selectMappedOperators = createSelector( - [selectAccountState], - (accountState: AccountState) => { - const { randomBeacon, tbtc } = accountState.operatorMapping.data - const isOperatorMappedOnlyInTbtc = - !isAddressZero(tbtc) && isAddressZero(randomBeacon) - const isOperatorMappedOnlyInRandomBeacon = - isAddressZero(tbtc) && !isAddressZero(randomBeacon) - - return { - mappedOperatorTbtc: tbtc, - mappedOperatorRandomBeacon: randomBeacon, - isOperatorMappedOnlyInTbtc, - isOperatorMappedOnlyInRandomBeacon, - isOneOfTheAppsNotMapped: - isOperatorMappedOnlyInRandomBeacon || isOperatorMappedOnlyInTbtc, - isOperatorMappedInBothApps: - !isAddressZero(randomBeacon) && !isAddressZero(tbtc), - } - } -) diff --git a/src/store/account/slice.ts b/src/store/account/slice.ts index 570f397f8..8869fa0c5 100644 --- a/src/store/account/slice.ts +++ b/src/store/account/slice.ts @@ -1,115 +1,19 @@ -import { AddressZero } from "@ethersproject/constants" -import { AnyAction, createSlice, PayloadAction } from "@reduxjs/toolkit" -import { featureFlags } from "../../constants" -import { FetchingState } from "../../types" -import { isSameETHAddress } from "../../web3/utils" -import { startAppListening } from "../listener" -import { - providerStaked, - providerStakedForStakingProvider, - setStakes, -} from "../staking" -import { StakingAppName } from "../staking-applications" -import { getStakingProviderOperatorInfo } from "./effects" +import { createSlice, PayloadAction } from "@reduxjs/toolkit" export interface AccountState { address: string - isStakingProvider: boolean - operatorMapping: FetchingState> } export const accountSlice = createSlice({ name: "account", initialState: { address: "", - isStakingProvider: false, - operatorMapping: { - data: { - tbtc: AddressZero, - randomBeacon: AddressZero, - }, - isFetching: false, - isInitialFetchDone: false, - }, } as AccountState, reducers: { walletConnected: (state: AccountState, action: PayloadAction) => { state.address = action.payload }, - accountUsedAsStakingProvider: ( - state: AccountState, - action: PayloadAction - ) => { - state.isStakingProvider = true - }, - setMappedOperators: ( - state: AccountState, - action: PayloadAction<{ - tbtc: string - randomBeacon: string - }> - ) => { - const { tbtc, randomBeacon } = action.payload - state.operatorMapping.data.tbtc = tbtc - state.operatorMapping.data.randomBeacon = randomBeacon - state.operatorMapping.isFetching = false - state.operatorMapping.isInitialFetchDone = true - state.operatorMapping.error = "" - }, - fetchingOperatorMapping: (state: AccountState) => { - state.operatorMapping.isFetching = true - }, - setOperatorMappingError: ( - state: AccountState, - action: PayloadAction<{ error: string }> - ) => { - const { error } = action.payload - state.operatorMapping.isFetching = false - state.operatorMapping.error = error - }, - operatorRegistered: ( - state: AccountState, - action: PayloadAction<{ - appName: StakingAppName - operator: string - }> - ) => { - const { appName, operator } = action.payload - state.operatorMapping.data[appName] = operator - }, - }, - extraReducers: (builder) => { - builder.addMatcher( - (action: AnyAction) => - action.type.match(providerStakedForStakingProvider), - (state, action: ReturnType) => { - const { stakingProvider } = action.payload - - const { address } = state - - if (isSameETHAddress(stakingProvider, address)) { - state.isStakingProvider = true - } - } - ) }, }) -export const registerAccountListeners = () => { - if (featureFlags.MULTI_APP_STAKING) { - startAppListening({ - actionCreator: setStakes, - effect: getStakingProviderOperatorInfo, - }) - } -} -registerAccountListeners() - -export const { - walletConnected, - accountUsedAsStakingProvider, - setMappedOperators, - fetchingOperatorMapping, - setOperatorMappingError, - operatorRegistered, -} = accountSlice.actions +export const { walletConnected } = accountSlice.actions diff --git a/src/store/index.ts b/src/store/index.ts index 27b09e448..6ceb2c0cf 100644 --- a/src/store/index.ts +++ b/src/store/index.ts @@ -8,16 +8,11 @@ import { modalSlice } from "./modal" import { tokenSlice } from "./tokens" import { sidebarSlice } from "./sidebar" import { transactionSlice } from "./transactions" -import { registerStakingListeners, stakingSlice } from "./staking" import { ethSlice } from "./eth" import { rewardsSlice } from "./rewards" import { tbtcSlice, registerTBTCListeners } from "./tbtc" -import { - registerStakingAppsListeners, - stakingApplicationsSlice, -} from "./staking-applications/slice" import { listenerMiddleware } from "./listener" -import { accountSlice, registerAccountListeners } from "./account" +import { accountSlice } from "./account" const combinedReducer = combineReducers({ account: accountSlice.reducer, @@ -25,11 +20,9 @@ const combinedReducer = combineReducers({ token: tokenSlice.reducer, sidebar: sidebarSlice.reducer, transaction: transactionSlice.reducer, - staking: stakingSlice.reducer, eth: ethSlice.reducer, tbtc: tbtcSlice.reducer, rewards: rewardsSlice.reducer, - applications: stakingApplicationsSlice.reducer, }) const APP_RESET_STORE = "app/reset_store" @@ -41,9 +34,6 @@ export const resetStoreAction = () => ({ const rootReducer: Reducer = (state: RootState, action: AnyAction) => { if (action.type === APP_RESET_STORE) { listenerMiddleware.clearListeners() - registerStakingListeners() - registerStakingAppsListeners() - registerAccountListeners() registerTBTCListeners() state = { eth: { ...state.eth }, @@ -54,13 +44,11 @@ const rootReducer: Reducer = (state: RootState, action: AnyAction) => { TBTC: { ...state.token.TBTC, balance: 0 }, TBTCV2: { ...state.token.TBTCV2, balance: 0 }, }, - // we don't display successful login modal when changin account so we are - // setting the isSuccessfulLoginModalClosed flag to true and also - // isMappingOperatorToStakingProviderModalClosed flag back to false + // We don't display successful login modal when changing account so we are + // setting the isSuccessfulLoginModalClosed flag to true. modal: { modalQueue: { isSuccessfulLoginModalClosed: true, - isMappingOperatorToStakingProviderModalClosed: false, }, }, } as RootState @@ -75,21 +63,9 @@ const store = configureStore({ getDefaultMiddleware({ serializableCheck: { // Ignore these action types - ignoredActions: [ - "modal/openModal", - "staking/unstaked", - "staking/toppepUp", - ], + ignoredActions: ["modal/openModal"], // Ignore these field paths in all actions - ignoredPaths: [ - "staking.stakedBalance", - "modal.props.setStakingProvider", - "modal.props.setBeneficiary", - "modal.props.setAuthorizer", - "modal.props.onSubmit", - "modal.props.setAmountToStake", - "payload.props.setAmountToStake", - ], + ignoredPaths: ["modal.props.onSubmit"], }, }).prepend(listenerMiddleware.middleware), }) diff --git a/src/store/modal/modalSlice.ts b/src/store/modal/modalSlice.ts index 91d1e00ad..34800bf69 100644 --- a/src/store/modal/modalSlice.ts +++ b/src/store/modal/modalSlice.ts @@ -3,7 +3,6 @@ import { ModalType } from "../../enums" export interface ModalQueueState { isSuccessfulLoginModalClosed: boolean - isMappingOperatorToStakingProviderModalClosed: boolean } export interface ModalState { @@ -19,7 +18,6 @@ export const modalSlice = createSlice({ props: {}, modalQueue: { isSuccessfulLoginModalClosed: false, - isMappingOperatorToStakingProviderModalClosed: false, }, } as ModalState, reducers: { @@ -37,15 +35,8 @@ export const modalSlice = createSlice({ successfullLoginModalClosed: (state: ModalState) => { state.modalQueue.isSuccessfulLoginModalClosed = true }, - mapOperatorToStakingProviderModalClosed: (state: ModalState) => { - state.modalQueue.isMappingOperatorToStakingProviderModalClosed = true - }, }, }) -export const { - openModal, - closeModal, - successfullLoginModalClosed, - mapOperatorToStakingProviderModalClosed, -} = modalSlice.actions +export const { openModal, closeModal, successfullLoginModalClosed } = + modalSlice.actions diff --git a/src/store/rewards/selectors.ts b/src/store/rewards/selectors.ts index a4a4e9917..837a639bd 100644 --- a/src/store/rewards/selectors.ts +++ b/src/store/rewards/selectors.ts @@ -2,7 +2,6 @@ import { createSelector } from "@reduxjs/toolkit" import { BigNumber } from "ethers" import { RootState } from ".." import { BonusEligibility } from "../../types" -import { selectStakes } from "../staking" export const selectTotalRewardsBalance = (state: RootState) => state.rewards.totalRewardsBalance @@ -46,20 +45,10 @@ export const selectRewardsByStakingProvider = createSelector( ) export const selectAccumulatedRewardsPerBeneficiary = createSelector( - [selectInterimRewards, selectStakes], - (rewards, stakes) => { - const beneficiaryRewards: { [beneficiary: string]: string } = {} - for (const stake of stakes) { - if (!rewards[stake.stakingProvider]) { - continue - } - const reward = rewards[stake.stakingProvider] - const prevAmount = BigNumber.from( - beneficiaryRewards[stake.beneficiary] || "0" - ) - beneficiaryRewards[stake.beneficiary] = prevAmount.add(reward).toString() + [selectInterimRewards, () => {}], + () => { + return { + aaa: "bbb", // TODO: Temporary solution, remove in the future } - - return beneficiaryRewards } ) diff --git a/src/store/staking-applications/effects.ts b/src/store/staking-applications/effects.ts deleted file mode 100644 index a37840f95..000000000 --- a/src/store/staking-applications/effects.ts +++ /dev/null @@ -1,356 +0,0 @@ -import { AnyAction } from "@reduxjs/toolkit" -import { stakingApplicationsSlice, StakingAppName } from "./slice" -import { AppListenerEffectAPI } from "../listener" -import { - selectStakeByStakingProvider, - selectStakingProviders, - setStakes, -} from "../staking" -import { - mapOperatorToStakingProviderModalClosed, - modalSlice, - openModal, -} from "../modal" -import { - IApplication, - StakingProviderAppInfo, -} from "../../threshold-ts/applications" -import { ModalType } from "../../enums" -import { RootState } from ".." -import { - selectStakingAppByStakingProvider, - selectStakingAppStateByAppName, -} from "./selectors" -import { isAddressZero } from "../../web3/utils" -import { BigNumber } from "ethers" -import { MAX_UINT64 } from "../../threshold-ts/utils" - -export const getSupportedAppsEffect = async ( - action: ReturnType, - listenerApi: AppListenerEffectAPI -) => { - try { - listenerApi.unsubscribe() - listenerApi.dispatch( - stakingApplicationsSlice.actions.fetchingAppParameters({ - appName: "tbtc", - }) - ) - listenerApi.dispatch( - stakingApplicationsSlice.actions.fetchingAppParameters({ - appName: "randomBeacon", - }) - ) - const data = - await listenerApi.extra.threshold.multiAppStaking.getSupportedAppsAuthParameters() - // one-off listener - const payload = { - tbtc: { - minimumAuthorization: data.tbtc.minimumAuthorization.toString(), - - authorizationDecreaseDelay: - data.tbtc.authorizationDecreaseDelay.toString(), - - authorizationDecreaseChangePeriod: - data.tbtc.authorizationDecreaseChangePeriod.toString(), - }, - randomBeacon: { - minimumAuthorization: data.randomBeacon.minimumAuthorization.toString(), - - authorizationDecreaseDelay: - data.randomBeacon.authorizationDecreaseDelay.toString(), - - authorizationDecreaseChangePeriod: - data.randomBeacon.authorizationDecreaseChangePeriod.toString(), - }, - } - listenerApi.dispatch( - stakingApplicationsSlice.actions.setAppParameters({ - appName: "randomBeacon", - parameters: payload.randomBeacon, - }) - ) - listenerApi.dispatch( - stakingApplicationsSlice.actions.setAppParameters({ - appName: "tbtc", - parameters: payload.tbtc, - }) - ) - } catch (error) { - const errorMessage = (error as Error).toString() - listenerApi.dispatch( - stakingApplicationsSlice.actions.setAppParametersError({ - appName: "randomBeacon", - error: errorMessage, - }) - ) - listenerApi.dispatch( - stakingApplicationsSlice.actions.setAppParametersError({ - appName: "tbtc", - error: errorMessage, - }) - ) - console.log("Could not fetch supported apps auth parameters", error) - listenerApi.subscribe() - } -} - -export const getSupportedAppsStakingProvidersData = async ( - action: ReturnType, - listenerApi: AppListenerEffectAPI -) => { - try { - const stakingProviders = selectStakingProviders(listenerApi.getState()) - if (stakingProviders.length === 0) return - // one-off listener - listenerApi.unsubscribe() - - await getKeepStakingAppStakingProvidersData( - stakingProviders, - listenerApi.extra.threshold.multiAppStaking.ecdsa, - "tbtc", - listenerApi - ) - await getKeepStakingAppStakingProvidersData( - stakingProviders, - listenerApi.extra.threshold.multiAppStaking.randomBeacon, - "randomBeacon", - listenerApi - ) - } catch (error) { - console.log("Could not fetch apps data for staking providers ", error) - listenerApi.subscribe() - } -} - -const getKeepStakingAppStakingProvidersData = async ( - stakingProviders: string[], - application: IApplication, - appName: StakingAppName, - listenerApi: AppListenerEffectAPI -) => { - try { - listenerApi.dispatch( - stakingApplicationsSlice.actions.fetchingStakingProvidersAppData({ - appName, - }) - ) - const appData = await Promise.all( - stakingProviders.map(application.getStakingProviderAppInfo) - ) - const appDataByStakingProvider = stakingProviders.reduce( - (reducer, stakingProvider, index) => { - const _appData = appData[index] - reducer[stakingProvider] = { - ..._appData, - authorizedStake: _appData.authorizedStake.toString(), - pendingAuthorizationDecrease: - _appData.pendingAuthorizationDecrease.toString(), - remainingAuthorizationDecreaseDelay: - _appData.remainingAuthorizationDecreaseDelay.toString(), - isDeauthorizationReqestActive: _appData.isDeauthorizationReqestActive, - deauthorizationCreatedAt: - _appData.deauthorizationCreatedAt?.toString(), - } - return reducer - }, - {} as { [stakingProvider: string]: StakingProviderAppInfo } - ) - listenerApi.dispatch( - stakingApplicationsSlice.actions.setStakingProvidersAppData({ - appName, - data: appDataByStakingProvider, - }) - ) - } catch (error) { - listenerApi.dispatch( - stakingApplicationsSlice.actions.setStakingProvidersAppDataError({ - appName, - error: (error as Error).toString(), - }) - ) - throw error - } -} - -export const displayMapOperatorToStakingProviderModalEffect = async ( - action: AnyAction, - listenerApi: AppListenerEffectAPI -) => { - const { - modal: { modalQueue }, - } = listenerApi.getState() - const { account } = listenerApi.getState() - if (!modalQueue.isSuccessfulLoginModalClosed) { - await listenerApi.condition((action, currentState) => { - return currentState.modal.modalQueue.isSuccessfulLoginModalClosed - }) - } - const { address } = account - if (!address) return - - listenerApi.unsubscribe() - try { - const { isStakingProvider } = account - - const { - tbtc: mappedOperatorTbtc, - randomBeacon: mappedOperatorRandomBeacon, - } = action.payload - - if ( - isStakingProvider && - (isAddressZero(mappedOperatorTbtc) || - isAddressZero(mappedOperatorRandomBeacon)) - ) { - listenerApi.dispatch( - openModal({ - modalType: ModalType.MapOperatorToStakingProvider, - props: { - address, - mappedOperatorTbtc: mappedOperatorTbtc, - mappedOperatorRandomBeacon: mappedOperatorRandomBeacon, - }, - }) - ) - } else { - listenerApi.dispatch(mapOperatorToStakingProviderModalClosed()) - } - } catch (error) { - console.log( - "Could not fetch info about mapped operators for given staking provider:", - error - ) - listenerApi.subscribe() - } -} - -export const displayNewAppsToAuthorizeModalEffect = async ( - action: AnyAction, - listenerApi: AppListenerEffectAPI -) => { - listenerApi.unsubscribe() - const hasAnyUnauthorizedStakes = Object.values( - selectStakingAppStateByAppName(listenerApi.getState(), "tbtc") - .stakingProviders.data - ) - .concat( - Object.values( - selectStakingAppStateByAppName(listenerApi.getState(), "randomBeacon") - .stakingProviders.data - ) - ) - .some( - (stakingProviderAppInfo) => - stakingProviderAppInfo.authorizedStake && - stakingProviderAppInfo.authorizedStake === "0" - ) - - if (hasAnyUnauthorizedStakes) { - listenerApi.dispatch(openModal({ modalType: ModalType.NewAppsToAuthorize })) - } -} - -export const shouldDisplayNewAppsToAuthorizeModal = ( - action: AnyAction, - currentState: RootState, - previousState: RootState -) => { - return ( - currentState.modal.modalQueue.isSuccessfulLoginModalClosed && - currentState.modal.modalQueue - .isMappingOperatorToStakingProviderModalClosed && - Object.values( - currentState.applications.randomBeacon.stakingProviders.data ?? {} - ).length > 0 && - Object.values(currentState.applications.tbtc.stakingProviders.data ?? {}) - .length > 0 - ) -} - -export const displayDeauthrizationCompletedModalEffect = ( - action: ReturnType< - typeof stakingApplicationsSlice.actions.authorizationDecreaseApproved - >, - listenerApi: AppListenerEffectAPI -) => { - const { stakingProvider, appName, txHash } = action.payload - - const stake = selectStakeByStakingProvider( - listenerApi.getOriginalState(), - stakingProvider - ) - if (!stake) return - - const stakingProviderAppData = selectStakingAppByStakingProvider( - listenerApi.getOriginalState(), - appName, - stakingProvider - ) - - listenerApi.dispatch( - modalSlice.actions.openModal({ - modalType: ModalType.DeauthorizationCompleted, - props: { - stakingProvider, - txHash, - decreaseAmount: stakingProviderAppData.pendingAuthorizationDecrease, - }, - }) - ) -} - -export const displayDeauthrizationInitiatedModalEffect = ( - action: ReturnType< - | typeof stakingApplicationsSlice.actions.authorizationDecreaseRequested - | typeof stakingApplicationsSlice.actions.operatorStatusUpdated - >, - listenerApi: AppListenerEffectAPI -) => { - const { stakingProvider, txHash, appName } = action.payload - - const stake = selectStakeByStakingProvider( - listenerApi.getOriginalState(), - stakingProvider - ) - if (!stake) return - - const appData = selectStakingAppByStakingProvider( - listenerApi.getOriginalState(), - appName, - stakingProvider - ) - - const isAuthorizationDecreaseRequestedAction = - stakingApplicationsSlice.actions.authorizationDecreaseRequested.match( - action - ) - - const decreasingAt = isAuthorizationDecreaseRequestedAction - ? action.payload.decreasingAt - : undefined - - if ( - isAuthorizationDecreaseRequestedAction && - !appData.isOperatorInPool && - decreasingAt && - BigNumber.from(decreasingAt).eq(MAX_UINT64) - ) { - return - } - - const decreaseAmount = isAuthorizationDecreaseRequestedAction - ? action.payload.decreaseAmount - : appData.pendingAuthorizationDecrease - - listenerApi.dispatch( - modalSlice.actions.openModal({ - modalType: ModalType.DeauthorizationInitiated, - props: { - stakingProvider, - txHash, - decreaseAmount, - }, - }) - ) -} diff --git a/src/store/staking-applications/index.ts b/src/store/staking-applications/index.ts deleted file mode 100644 index e27a75bd2..000000000 --- a/src/store/staking-applications/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export * from "./slice" -export * from "./effects" -export * from "./selectors" diff --git a/src/store/staking-applications/selectors.ts b/src/store/staking-applications/selectors.ts deleted file mode 100644 index 964ffd731..000000000 --- a/src/store/staking-applications/selectors.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { createSelector } from "@reduxjs/toolkit" -import { RootState } from ".." -import { - StakingApplicationsState, - StakingApplicationState, - StakingAppName, -} from "./slice" -import { selectStakeByStakingProvider } from "../staking" -import { AuthorizationStatus, StakeData } from "../../types" -import { calculatePercenteage } from "../../utils/percentage" -import { BigNumber } from "ethers" -import { Zero } from "@ethersproject/constants" - -export const selectStakingAppState = (state: RootState) => state.applications - -export const selectStakingAppStateByAppName = createSelector( - [selectStakingAppState, (_: RootState, appName: StakingAppName) => appName], - (applicationState: StakingApplicationsState, appName: StakingAppName) => { - return applicationState[appName] - } -) - -export const selectStakingAppByStakingProvider = createSelector( - [ - (state: RootState, appName: StakingAppName, stakingProvider: string) => - selectStakingAppStateByAppName(state, appName), - (_: RootState, appName: StakingAppName, stakingProvider: string) => - stakingProvider, - (state: RootState, appName: StakingAppName, stakingProvider: string) => - selectStakeByStakingProvider(state, stakingProvider), - ], - ( - appState: StakingApplicationState, - stakingProvider: string, - stake: StakeData | undefined - ) => { - const authData = appState.stakingProviders.data[stakingProvider] || {} - const minAuth = appState.parameters.data.minimumAuthorization - - const isAuthorized = BigNumber.from(authData?.authorizedStake || "0").gte( - BigNumber.from(minAuth || 0) - ) - - const hasPendingDeauthorization = Boolean( - authData.pendingAuthorizationDecrease && - BigNumber.from(authData.pendingAuthorizationDecrease).gt(Zero) - ) - - let status: AuthorizationStatus = "to-authorize" - if (isAuthorized && !hasPendingDeauthorization) { - status = "authorized" - } else if ( - hasPendingDeauthorization && - !authData?.isDeauthorizationReqestActive && - authData.isOperatorInPool !== undefined && - !authData.isOperatorInPool - ) { - status = "deauthorization-initiation-needed" - } else if (hasPendingDeauthorization) { - status = "pending-deauthorization" - } - - return { - ...authData, - isAuthorized, - percentage: calculatePercenteage( - authData?.authorizedStake, - stake?.totalInTStake - ), - hasPendingDeauthorization, - status, - } - } -) diff --git a/src/store/staking-applications/slice.ts b/src/store/staking-applications/slice.ts deleted file mode 100644 index a7aa48883..000000000 --- a/src/store/staking-applications/slice.ts +++ /dev/null @@ -1,326 +0,0 @@ -import { - AnyAction, - createSlice, - isAnyOf, - PayloadAction, -} from "@reduxjs/toolkit" -import { BigNumber } from "ethers" -import { featureFlags } from "../../constants" -import { - StakingProviderAppInfo, - AuthorizationParameters, -} from "../../threshold-ts/applications" -import { AddressZero, MAX_UINT64 } from "../../threshold-ts/utils" -import { FetchingState } from "../../types" -import { startAppListening } from "../listener" -import { providerStaked, setStakes } from "../staking" -import { - getSupportedAppsStakingProvidersData, - getSupportedAppsEffect, - displayMapOperatorToStakingProviderModalEffect, - shouldDisplayNewAppsToAuthorizeModal, - displayNewAppsToAuthorizeModalEffect, - displayDeauthrizationCompletedModalEffect, - displayDeauthrizationInitiatedModalEffect, -} from "./effects" -import { setMappedOperators } from "../account" -import { dateToUnixTimestamp } from "../../utils/date" - -type StakingApplicationDataByStakingProvider = { - [stakingProvider: string]: StakingProviderAppInfo -} - -export type StakingApplicationState = { - parameters: FetchingState> - stakingProviders: FetchingState -} - -export interface StakingApplicationsState { - tbtc: StakingApplicationState - randomBeacon: StakingApplicationState -} - -export type StakingAppName = "tbtc" | "randomBeacon" - -export const stakingApplicationsSlice = createSlice({ - name: "staking-applications", - initialState: { - tbtc: { - parameters: { - isFetching: false, - error: "", - data: { - authorizationDecreaseChangePeriod: "0", - minimumAuthorization: "0", - authorizationDecreaseDelay: "0", - }, - }, - stakingProviders: { - isFetching: false, - error: "", - data: {}, - }, - }, - randomBeacon: { - parameters: { - isFetching: false, - error: "", - data: { - authorizationDecreaseChangePeriod: "0", - minimumAuthorization: "0", - authorizationDecreaseDelay: "0", - }, - }, - stakingProviders: { - isFetching: false, - error: "", - data: {}, - }, - }, - } as StakingApplicationsState, - reducers: { - getSupportedApps: (state: StakingApplicationsState, action) => {}, - setAppParameters: ( - state: StakingApplicationsState, - action: PayloadAction<{ - appName: StakingAppName - parameters: AuthorizationParameters - }> - ) => { - const { appName, parameters } = action.payload - state[appName].parameters = { - data: { ...parameters }, - isFetching: false, - error: "", - } - }, - setAppParametersError: ( - state: StakingApplicationsState, - action: PayloadAction<{ appName: StakingAppName; error: string }> - ) => { - const { appName, error } = action.payload - state[appName].parameters.isFetching = false - state[appName].parameters.error = error - }, - fetchingAppParameters: ( - state: StakingApplicationsState, - action: PayloadAction<{ appName: StakingAppName }> - ) => { - const { appName } = action.payload - state[appName].parameters.isFetching = true - }, - setStakingProvidersAppData: ( - state: StakingApplicationsState, - action: PayloadAction<{ - appName: StakingAppName - data: StakingApplicationDataByStakingProvider - }> - ) => { - const { appName, data } = action.payload - state[appName].stakingProviders = { - isFetching: false, - error: "", - data, - } - }, - fetchingStakingProvidersAppData: ( - state: StakingApplicationsState, - action: PayloadAction<{ - appName: StakingAppName - }> - ) => { - const { appName } = action.payload - state[appName].stakingProviders.isFetching = true - }, - setStakingProvidersAppDataError: ( - state: StakingApplicationsState, - action: PayloadAction<{ - appName: StakingAppName - error: string - }> - ) => { - const { appName, error } = action.payload - state[appName].stakingProviders.isFetching = false - state[appName].stakingProviders.error = error - }, - authorizationIncreased: ( - state: StakingApplicationsState, - action: PayloadAction<{ - stakingProvider: string - toAmount: string - appName: StakingAppName - }> - ) => { - const { stakingProvider, toAmount, appName } = action.payload - - const stakingProviderData = - state[appName]?.stakingProviders.data[stakingProvider] - - if (!stakingProviderData) return - - state[appName].stakingProviders.data[stakingProvider].authorizedStake = - toAmount - }, - authorizationDecreaseApproved: ( - state: StakingApplicationsState, - action: PayloadAction<{ - stakingProvider: string - appName: StakingAppName - txHash: string - }> - ) => { - const { stakingProvider, appName } = action.payload - const stakingProviderData = - state[appName].stakingProviders.data[stakingProvider] - - if (!stakingProviderData) return - - const authorizedStake = BigNumber.from( - stakingProviderData.authorizedStake - ) - .sub(stakingProviderData.pendingAuthorizationDecrease) - .toString() - - state[appName].stakingProviders.data[stakingProvider] = { - ...stakingProviderData, - authorizedStake, - pendingAuthorizationDecrease: "0", - remainingAuthorizationDecreaseDelay: "0", - } - }, - authorizationDecreaseRequested: ( - state: StakingApplicationsState, - action: PayloadAction<{ - stakingProvider: string - appName: StakingAppName - decreaseAmount: string - decreasingAt: string - txHash: string - }> - ) => { - const { stakingProvider, appName, decreaseAmount, decreasingAt } = - action.payload - const stakingProviderData = - state[appName].stakingProviders.data[stakingProvider] - - if (!stakingProviderData) return - - // There are only two possible scenarios: - // 1. When the operator is not known- the application contract sets - // `decreasingAt` to current block timestamp. It means an authorizer - // can approve authorization decrease immediately because that operator - // was never in the sortition pool. - // 2. When the operator is known- the application contract sets - // `decreasingAt` to `MAX_UINT64`. It means that this operator is or - // was in the sortition pool. Before authorization decrease delay - // starts, the operator needs to update the state of the sortition pool - // with a call to `joinSortitionPool` or `updateOperatorStatus`. - const isDeauthorizationReqestActive = - !BigNumber.from(decreasingAt).eq(MAX_UINT64) - - state[appName].stakingProviders.data[stakingProvider] = { - ...stakingProviderData, - isDeauthorizationReqestActive, - pendingAuthorizationDecrease: decreaseAmount, - remainingAuthorizationDecreaseDelay: isDeauthorizationReqestActive - ? "0" - : MAX_UINT64.toString(), - deauthorizationCreatedAt: undefined, - } - }, - operatorStatusUpdated: ( - state: StakingApplicationsState, - action: PayloadAction<{ - stakingProvider: string - appName: StakingAppName - txHash: string - }> - ) => { - const { stakingProvider, appName } = action.payload - const stakingProviderData = - state[appName].stakingProviders.data[stakingProvider] - - if (!stakingProviderData) return - - const deauthorizationCreatedAt = - !stakingProviderData.isDeauthorizationReqestActive - ? dateToUnixTimestamp().toString() - : stakingProviderData.deauthorizationCreatedAt - - state[appName].stakingProviders.data[stakingProvider] = { - ...stakingProviderData, - remainingAuthorizationDecreaseDelay: - state[appName].parameters.data.authorizationDecreaseDelay, - isDeauthorizationReqestActive: true, - deauthorizationCreatedAt, - } - }, - }, - extraReducers: (builder) => { - builder.addMatcher( - (action: AnyAction) => action.type.match(providerStaked), - (state, action: ReturnType) => { - const { stakingProvider } = action.payload - - const defaultAuthData: StakingProviderAppInfo = { - authorizedStake: "0", - pendingAuthorizationDecrease: "0", - remainingAuthorizationDecreaseDelay: "0", - isDeauthorizationReqestActive: false, - deauthorizationCreatedAt: undefined, - isOperatorInPool: undefined, - operator: AddressZero, - } - - state.randomBeacon.stakingProviders.data[stakingProvider] = { - ...defaultAuthData, - } - state.tbtc.stakingProviders.data[stakingProvider] = { - ...defaultAuthData, - } - } - ) - }, -}) - -export const registerStakingAppsListeners = () => { - if (featureFlags.MULTI_APP_STAKING) { - startAppListening({ - actionCreator: stakingApplicationsSlice.actions.getSupportedApps, - effect: getSupportedAppsEffect, - }) - - startAppListening({ - actionCreator: setStakes, - effect: getSupportedAppsStakingProvidersData, - }) - - startAppListening({ - predicate: shouldDisplayNewAppsToAuthorizeModal, - effect: displayNewAppsToAuthorizeModalEffect, - }) - - startAppListening({ - actionCreator: - stakingApplicationsSlice.actions.authorizationDecreaseApproved, - effect: displayDeauthrizationCompletedModalEffect, - }) - - startAppListening({ - // @ts-ignore - matcher: isAnyOf( - stakingApplicationsSlice.actions.authorizationDecreaseRequested, - stakingApplicationsSlice.actions.operatorStatusUpdated - ), - // @ts-ignore - effect: displayDeauthrizationInitiatedModalEffect, - }) - - startAppListening({ - actionCreator: setMappedOperators, - effect: displayMapOperatorToStakingProviderModalEffect, - }) - } -} - -registerStakingAppsListeners() diff --git a/src/store/staking/effects.ts b/src/store/staking/effects.ts deleted file mode 100644 index 97dc954ef..000000000 --- a/src/store/staking/effects.ts +++ /dev/null @@ -1,84 +0,0 @@ -import { StakeData } from "../../types" -import { AddressZero, isAddress, isAddressZero } from "../../web3/utils" -import { AppListenerEffectAPI } from "../listener" -import { selectStakeByStakingProvider } from "./selectors" -import { requestStakeByStakingProvider, setStakes } from "./stakingSlice" - -export const fetchStakeByStakingProviderEffect = async ( - actionCreator: ReturnType, - listenerApi: AppListenerEffectAPI -) => { - const { stakingProvider } = actionCreator.payload - - if ( - !stakingProvider || - !isAddress(stakingProvider) || - isAddressZero(stakingProvider) - ) - return - - const stake = selectStakeByStakingProvider( - listenerApi.getState(), - stakingProvider - ) - - // If the stake exitst in the store we don't need to fetch data. - if (stake) return - - const result = await listenerApi.take(setStakes.match, 10000) - // If a timeout is provided and expires first, the promise resolves to - // null. - if (result === null) { - await fetchStake(stakingProvider, listenerApi) - return - } - - // Check again if the stake exists after dispatching `setStakes` action. - const [action, currentState, previousState] = result - const stakeAfterDispatchingSetStakes = selectStakeByStakingProvider( - currentState, - stakingProvider - ) - // Stakes exists for a current logged account- there is no need to fetch data - // by the staking provider address. - if (stakeAfterDispatchingSetStakes) return - - await fetchStake(stakingProvider, listenerApi) -} - -const fetchStake = async ( - stakingProvider: string, - listenerApi: AppListenerEffectAPI -) => { - const stake = - await listenerApi.extra.threshold.staking.getStakeByStakingProvider( - stakingProvider - ) - - if ( - isAddressZero(stake.owner) || - isAddressZero(stake.beneficiary) || - isAddressZero(stake.authorizer) - ) { - return - } - - listenerApi.dispatch( - setStakes([ - { - ...stake, - tStake: stake.tStake.toString(), - keepInTStake: stake.keepInTStake.toString(), - nuInTStake: stake.nuInTStake.toString(), - totalInTStake: stake.totalInTStake.toString(), - preConfig: { - operator: AddressZero, - isOperatorConfirmed: false, - operatorStartTimestamp: "0", - }, - possibleKeepTopUpInT: "0", - possibleNuTopUpInT: "0", - } as StakeData, - ]) - ) -} diff --git a/src/store/staking/index.ts b/src/store/staking/index.ts deleted file mode 100644 index 621fb431a..000000000 --- a/src/store/staking/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from "./stakingSlice" -export * from "./selectors" diff --git a/src/store/staking/selectors.ts b/src/store/staking/selectors.ts deleted file mode 100644 index 6704c3180..000000000 --- a/src/store/staking/selectors.ts +++ /dev/null @@ -1,99 +0,0 @@ -import { createSelector } from "@reduxjs/toolkit" -import { BigNumber } from "ethers" -import { ZERO, max } from "../../threshold-ts/utils" -import { RootState } from ".." -import { StakeData } from "../../types/staking" -import { isSameETHAddress } from "../../web3/utils" -import { selectStakingAppByStakingProvider } from "../staking-applications/selectors" - -export const selectStakes = (state: RootState) => state.staking.stakes - -export const selectStakingProviders = createSelector(selectStakes, (stakes) => - stakes.map((_) => _.stakingProvider) -) -export const selectStakeByStakingProvider = createSelector( - [selectStakes, (_: RootState, stakingProvider: string) => stakingProvider], - (stakes: StakeData[], stakingProvider: string) => - stakes.find((_) => isSameETHAddress(_.stakingProvider, stakingProvider)) -) - -// This selector returns available amount to unstake for T, KEEP and NU in T -// denomination. The maximum unstake amount depends on the authorized apps for -// example suppose the given staking provider has 10T, 20T worth of KEEP and 30 -// T worth of NU- all staked. The maximum application authorization is 40 T, -// then the maximum available amount to unstake is: -// - 10T from T stake because: 10T(T stake) - max(0, 40T(authorization) - -// 20T(KEEP stake) - 30T(NU stake)) = 10, -// - 20T from KEEP stake because: 20T(KEEP stake) - max(0, 40T(authorization) - -// 30T(NU stake) - 10T(T stake)) = 20, -// - 20T from NU stake because: 30T(NU stake) - max(0, 40T(authorization) - -// 20T(KEEP stake) -10T(T stake)) = 20, -// - An owner can't unstake all stake(KEEP+NU+T) because has authorized -// applications. To unstake all the staking provider cannot have any -// authorized apps. -// In other words, the minimum stake amount for the specified stake type is the -// minimum amount of stake of the given type needed to satisfy the maximum -// application authorization given the staked amounts of the other stake types -// for that staking provider. -export const selectAvailableAmountToUnstakeByStakingProvider = createSelector( - [ - (state: RootState, stakingProvider: string) => - selectStakeByStakingProvider(state, stakingProvider), - (state: RootState, stakingProvider: string) => - selectStakingAppByStakingProvider(state, "tbtc", stakingProvider), - (state: RootState, stakingProvider: string) => - selectStakingAppByStakingProvider(state, "randomBeacon", stakingProvider), - ], - ( - stake: StakeData | undefined, - tbtcAppData: ReturnType, - randomBeaconAppData: ReturnType - ) => { - if (stake === undefined) { - return { - nuInT: "0", - keepInT: "0", - t: "0", - canUnstakeAll: false, - } - } - - const maxAuthorization = max( - tbtcAppData.authorizedStake || ZERO, - randomBeaconAppData.authorizedStake || ZERO - ) - - const isZeroAuthorization = maxAuthorization.isZero() - - const nuInTMinStake = max( - ZERO, - maxAuthorization.sub(stake.tStake).sub(stake.keepInTStake).toString() - ) - - const tMinStake = max( - ZERO, - maxAuthorization.sub(stake.nuInTStake).sub(stake.keepInTStake).toString() - ) - - const keepInTMinStake = max( - ZERO, - maxAuthorization.sub(stake.nuInTStake).sub(stake.tStake).toString() - ) - - return { - nuInT: isZeroAuthorization - ? stake.nuInTStake - : BigNumber.from(stake.nuInTStake).sub(nuInTMinStake).toString(), - keepInT: - isZeroAuthorization || BigNumber.from(keepInTMinStake).isZero() - ? stake.keepInTStake - : "0", - t: isZeroAuthorization - ? stake.tStake - : BigNumber.from(stake.tStake).sub(tMinStake).toString(), - // You can unstake all (T + KEEP + NU) only if there are no - // authorized apps. - canUnstakeAll: isZeroAuthorization, - } - } -) diff --git a/src/store/staking/stakingSlice.ts b/src/store/staking/stakingSlice.ts deleted file mode 100644 index c2d7a006a..000000000 --- a/src/store/staking/stakingSlice.ts +++ /dev/null @@ -1,196 +0,0 @@ -import { createSlice, createAction } from "@reduxjs/toolkit" -import { PayloadAction } from "@reduxjs/toolkit/dist/createAction" -import { BigNumber, BigNumberish } from "@ethersproject/bignumber" -import { - ProviderStakedActionPayload, - StakeData, - StakingStateKey, - UnstakedActionPayload, - ToppedUpActionPayload, -} from "../../types/staking" -import { StakeType, TopUpType, UnstakeType } from "../../enums" -import { AddressZero } from "../../web3/utils" -import { UpdateStateActionPayload } from "../../types/state" -import { startAppListening } from "../listener" -import { fetchStakeByStakingProviderEffect } from "./effects" - -interface StakingState { - stakingProvider: string - beneficiary: string - authorizer: string - stakeAmount: string - stakes: StakeData[] - stakedBalance: BigNumberish - minStakeAmount: string | undefined -} - -const calculateStakedBalance = (stakes: StakeData[]): BigNumberish => { - return stakes.reduce( - (balance, stake) => - BigNumber.from(balance).add(BigNumber.from(stake.totalInTStake)), - BigNumber.from(0) - ) -} - -export const stakingSlice = createSlice({ - name: "staking", - initialState: { - stakingProvider: "", - beneficiary: "", - authorizer: "", - stakeAmount: "0", - stakes: [], - stakedBalance: 0, - minStakeAmount: undefined, - } as StakingState, - reducers: { - updateState: ( - state, - action: PayloadAction> - ) => { - // @ts-ignore - state[action.payload.key] = action.payload.value - }, - setStakes: (state, action) => { - state.stakes = action.payload - state.stakedBalance = calculateStakedBalance(action.payload) - }, - providerStaked: ( - state, - action: PayloadAction - ) => { - const eventData = action.payload - const { amount, stakeType, ...restData } = eventData - const _amount = amount.toString() - const newStake = { ...restData } as StakeData - newStake.stakeType = stakeType - newStake.nuInTStake = stakeType === StakeType.NU ? _amount : "0" - newStake.keepInTStake = stakeType === StakeType.KEEP ? _amount : "0" - newStake.tStake = stakeType === StakeType.T ? _amount : "0" - newStake.totalInTStake = _amount - newStake.possibleKeepTopUpInT = "0" - newStake.possibleNuTopUpInT = "0" - - newStake.preConfig = { - operator: AddressZero, - isOperatorConfirmed: false, - operatorStartTimestamp: "0", - } - - state.stakes = [newStake, ...state.stakes] - state.stakedBalance = calculateStakedBalance(state.stakes) - }, - providerStakedForStakingProvider: (state: StakingState, action) => {}, - toppedUp: ( - state: StakingState, - action: PayloadAction - ) => { - const { stakingProvider, amount, topUpType } = action.payload - - const stakes = state.stakes - const stakeIdxToUpdate = stakes.findIndex( - (stake: StakeData) => stake.stakingProvider === stakingProvider - ) - - if (stakeIdxToUpdate < 0) return - - const stake = stakes[stakeIdxToUpdate] - - if (topUpType === TopUpType.LEGACY_KEEP) { - stakes[stakeIdxToUpdate].possibleKeepTopUpInT = "0" - } else if (topUpType === TopUpType.LEGACY_NU) { - stakes[stakeIdxToUpdate].possibleNuTopUpInT = "0" - } - - const fieldName = - topUpType === TopUpType.NATIVE - ? "tStake" - : topUpType === TopUpType.LEGACY_KEEP - ? "keepInTStake" - : "nuInTStake" - - stakes[stakeIdxToUpdate][fieldName] = BigNumber.from( - stakes[stakeIdxToUpdate][fieldName] - ) - .add(amount) - .toString() - - const totalInTStake = BigNumber.from(stake.totalInTStake) - .add(amount) - .toString() - - stakes[stakeIdxToUpdate].totalInTStake = totalInTStake - - state.stakedBalance = calculateStakedBalance(state.stakes) - }, - unstaked: (state, action: PayloadAction) => { - const { stakingProvider, amount, unstakeType } = action.payload - - const stakes = state.stakes - const stakeIdxToUpdate = stakes.findIndex( - (stake) => stake.stakingProvider === stakingProvider - ) - - if (stakeIdxToUpdate < 0) return - - if (unstakeType === UnstakeType.ALL) { - stakes[stakeIdxToUpdate].tStake = "0" - stakes[stakeIdxToUpdate].keepInTStake = "0" - stakes[stakeIdxToUpdate].nuInTStake = "0" - } else if (unstakeType === UnstakeType.LEGACY_KEEP) { - // The `TTokenStaking` allows only to unstake all KEEP tokens so we can - // set `keepInTStake` to `0`. - stakes[stakeIdxToUpdate].keepInTStake = "0" - } else if ( - unstakeType === UnstakeType.LEGACY_NU || - unstakeType === UnstakeType.NATIVE - ) { - const fieldName = - unstakeType === UnstakeType.LEGACY_NU ? "nuInTStake" : "tStake" - const originalNuStakeAmount = BigNumber.from( - stakes[stakeIdxToUpdate][fieldName] - ) - stakes[stakeIdxToUpdate][fieldName] = originalNuStakeAmount - .sub(amount) - .toString() - } - - const totalStaked = state.stakes[stakeIdxToUpdate].totalInTStake - const newTotalStakedAmount = BigNumber.from(totalStaked) - .sub(amount) - .toString() - state.stakes[stakeIdxToUpdate].totalInTStake = newTotalStakedAmount - - state.stakedBalance = calculateStakedBalance(state.stakes) - }, - setMinStake: ( - state: StakingState, - action: PayloadAction<{ amount: string }> - ) => { - state.minStakeAmount = action.payload.amount - }, - }, -}) - -export const requestStakeByStakingProvider = createAction<{ - stakingProvider: string | undefined -}>("staking/request-stake-by-staking-provider") - -export const { - updateState, - setStakes, - providerStaked, - providerStakedForStakingProvider, - toppedUp, - unstaked, - setMinStake, -} = stakingSlice.actions - -export const registerStakingListeners = () => { - startAppListening({ - actionCreator: requestStakeByStakingProvider, - effect: fetchStakeByStakingProviderEffect, - }) -} - -registerStakingListeners() diff --git a/src/theme/NotificationPill.ts b/src/theme/NotificationPill.ts deleted file mode 100644 index a04c865bd..000000000 --- a/src/theme/NotificationPill.ts +++ /dev/null @@ -1,70 +0,0 @@ -import type { - SystemStyleFunction, - SystemStyleObject, -} from "@chakra-ui/theme-tools" -import { ThemeUtils } from "@threshold-network/components" - -const baseStyle: SystemStyleObject = { - borderRadius: "100%", -} - -const sizes: Record = { - lg: { - h: "24px", - w: "24px", - }, - md: { - h: "16px", - w: "16px", - }, - sm: { - h: "8px", - w: "8px", - }, -} - -const variantDisabled: SystemStyleFunction = (props) => { - const { colorScheme } = props - - return { - bg: `${colorScheme}.100`, - } -} - -const variantSolid: SystemStyleFunction = (props) => { - const { colorScheme } = props - - const colorWeight = colorScheme === "grey" ? 800 : 500 - - return { - bg: `${colorScheme}.${colorWeight}`, - } -} - -const variantGradient: SystemStyleFunction = (props) => { - const from = ThemeUtils.getColorFromProps(props, 600) - const to = ThemeUtils.getColorFromProps(props, 500) - - return { - bg: `linear-gradient(120.19deg, ${from} 3.32%, ${to} 95.02%)`, - } -} - -const variants = { - solid: variantSolid, - gradient: variantGradient, - disabled: variantDisabled, -} - -const defaultProps = { - size: "md", - variant: "solid", - colorScheme: "brand", -} - -export const NotificationPill = { - baseStyle, - sizes, - variants, - defaultProps, -} diff --git a/src/theme/Tree.ts b/src/theme/Tree.ts deleted file mode 100644 index b3e459613..000000000 --- a/src/theme/Tree.ts +++ /dev/null @@ -1,66 +0,0 @@ -import { - getColor, - mode, - PartsStyleFunction, - anatomy, - SystemStyleObject, - SystemStyleFunction, -} from "@chakra-ui/theme-tools" - -const parts = anatomy("tree").parts("node", "item", "treeItemLineToNode") - -const spaceBetweenNodeLineAndItem = 5 - -const baseStyleNode: SystemStyleFunction = (props) => { - const borderColor = mode("gray.500", "whiteAlpha.300")(props) - - return { - listStyle: "none", - margin: 0, - padding: 0, - ul: { - pl: spaceBetweenNodeLineAndItem, - ml: 3, - position: "relative", - _before: { - position: "absolute", - content: '""', - left: 0, - borderLeft: `1px dashed ${getColor(props.theme, borderColor)}`, - }, - }, - } -} - -const baseStyleItem: SystemStyleObject = {} - -const baseStyleTreeItemLineToNode: SystemStyleFunction = (props) => { - const borderColor = mode("gray.500", "whiteAlpha.300")(props) - const border = `1px dashed ${getColor(props.theme, borderColor)}` - - return { - position: "relative", - _before: { - position: "absolute", - content: '""', - bottom: "50%", - right: "100%", - width: spaceBetweenNodeLineAndItem, - height: "10px", - borderLeft: border, - borderBottom: border, - borderBottomLeftRadius: "0.75rem", - }, - } -} - -const baseStyle: PartsStyleFunction = (props) => ({ - node: baseStyleNode(props), - item: baseStyleItem, - treeItemLineToNode: baseStyleTreeItemLineToNode(props), -}) - -export const Tree = { - parts: parts.keys, - baseStyle, -} diff --git a/src/theme/index.ts b/src/theme/index.ts index e053ea3c4..f03ee464f 100644 --- a/src/theme/index.ts +++ b/src/theme/index.ts @@ -2,8 +2,6 @@ import { extendTheme } from "@chakra-ui/react" import { mode } from "@chakra-ui/theme-tools" import { defaultTheme } from "@threshold-network/components" import { InfoBox } from "./InfoBox" -import { NotificationPill } from "./NotificationPill" -import { Tree } from "./Tree" import { Tabs } from "./Tabs" import { Badge } from "./Badge" import { DetailedLinkListItem } from "./DetailedLinkListItem" @@ -37,8 +35,6 @@ const index = extendTheme({ ...defaultTheme.components, AnnouncementBanner, InfoBox, - NotificationPill, - Tree, Tabs, Badge, DetailedLinkListItem, diff --git a/src/types/index.ts b/src/types/index.ts index 991293093..8e91b7a90 100644 --- a/src/types/index.ts +++ b/src/types/index.ts @@ -6,8 +6,6 @@ export * from "./token" export * from "./eth" export * from "./page" export * from "./rewards" -export * from "./staking" -export * from "./staking-applications" export * from "./tbtc" export type FetchingState = { diff --git a/src/types/modal.ts b/src/types/modal.ts index dfed23574..445251579 100644 --- a/src/types/modal.ts +++ b/src/types/modal.ts @@ -6,39 +6,8 @@ import { TransactionIsPending, TransactionIsWaitingForConfirmation, } from "../components/Modal/TransactionModal" -import StakingSuccessModal from "../components/Modal/StakingSuccessModal" -import StakeSuccessOldModal from "../components/Modal/StakingSuccessModal/StakeSuccessOld" -import ConfirmStakingParams from "../components/Modal/ConfirmStakingParams" -import StakingChecklistModal from "../components/Modal/StakingChecklistModal" -import UnstakingSuccessModal from "../components/Modal/UnstakeSuccessModal" -import { - UnstakeTStep1 as UnstakeTModalStep1, - UnstakeTStep2 as UnstakeTModalStep2, -} from "../components/Modal/UnstakeTModal" -import { LegacyTopUpModal, TopupTModal } from "../components/Modal/TopupTModal" -import TopupTSuccessModal from "../components/Modal/TopupTSuccessModal" -import { - ClaimingRewards, - ClaimRewardsSuccessModal, -} from "../components/Modal/ClaimingRewards" -import NewAppsToAuthorizeModal from "../components/Modal/NewAppsToAuthorizeModal" import TbtcRecoveryFileModalModal from "../components/Modal/TbtcRecoveryFileModal" import TbtcMintingConfirmationModal from "../components/Modal/TbtcMintingConfirmationModal" -import DeauthorizeApplicationModal from "../components/Modal/DeauthorizeApplicationModal" -import { - AuthorizeStakingApps, - StakingApplicationsAuthorized, - IncreaseAuthorization, - IncreaseAuthorizationSuccess, - ConfirmDeauthorization, - DeauthorizationCompleted, - DeauthorizationInitiated, -} from "../components/Modal/StakingApplications" -import SubmitStakeModal from "../components/Modal/SubmitStake" -import NewStakerAuthorizeStakingApplicationModal from "../components/Modal/NewStakerAuthorizeStakingApplicationModal" -import MapOperatorToStakingProviderModal from "../components/Modal/MapOperatorToStakingProviderModal" -import MapOperatorToStakingProviderConfirmationModal from "../components/Modal/MapOperatorToStakingProviderConfirmationModal" -import { MapOperatorToStakingProviderSuccess } from "../components/Modal/MapOperatorToStakingProviderSuccessModal" import { GenerateNewDepositAddress, InitiateUnminting, @@ -51,38 +20,8 @@ export const MODAL_TYPES: Record = { [ModalType.TransactionIsWaitingForConfirmation]: TransactionIsWaitingForConfirmation, [ModalType.TransactionFailed]: TransactionFailed, - [ModalType.ConfirmStakingParams]: ConfirmStakingParams, - [ModalType.StakeSuccess]: StakingSuccessModal, - [ModalType.StakeSuccessOLD]: StakeSuccessOldModal, - [ModalType.UnstakeSuccess]: UnstakingSuccessModal, - [ModalType.UnstakeT]: UnstakeTModalStep1, - [ModalType.UnstakeTStep2]: UnstakeTModalStep2, - [ModalType.StakingChecklist]: StakingChecklistModal, - [ModalType.TopupT]: TopupTModal, - [ModalType.TopupLegacyStake]: LegacyTopUpModal, - [ModalType.TopupTSuccess]: TopupTSuccessModal, - [ModalType.ClaimingRewards]: ClaimingRewards, - [ModalType.ClaimingRewardsSuccess]: ClaimRewardsSuccessModal, - [ModalType.NewAppsToAuthorize]: NewAppsToAuthorizeModal, [ModalType.TbtcRecoveryJson]: TbtcRecoveryFileModalModal, [ModalType.TbtcMintingConfirmation]: TbtcMintingConfirmationModal, - [ModalType.DeauthorizeApplication]: DeauthorizeApplicationModal, - [ModalType.SubmitStake]: SubmitStakeModal, - [ModalType.MapOperatorToStakingProvider]: MapOperatorToStakingProviderModal, - [ModalType.MapOperatorToStakingProviderConfirmation]: - MapOperatorToStakingProviderConfirmationModal, - [ModalType.MapOperatorToStakingProviderSuccess]: - MapOperatorToStakingProviderSuccess, - [ModalType.AuthorizeStakingApps]: AuthorizeStakingApps, - [ModalType.StakingApplicationsAuthorized]: StakingApplicationsAuthorized, - [ModalType.IncreaseAuthorization]: IncreaseAuthorization, - [ModalType.IncreaseAuthorizationSuccess]: IncreaseAuthorizationSuccess, - [ModalType.SubmitStake]: SubmitStakeModal, - [ModalType.NewStakerAuthorizeStakingApplication]: - NewStakerAuthorizeStakingApplicationModal, - [ModalType.ConfirmDeauthorization]: ConfirmDeauthorization, - [ModalType.DeauthorizationCompleted]: DeauthorizationCompleted, - [ModalType.DeauthorizationInitiated]: DeauthorizationInitiated, [ModalType.NewTBTCApp]: NewTBTCApp, [ModalType.GenerateNewDepositAddress]: GenerateNewDepositAddress, [ModalType.InitiateUnminting]: InitiateUnminting, diff --git a/src/types/rewards.ts b/src/types/rewards.ts index 342f4776d..42125e833 100644 --- a/src/types/rewards.ts +++ b/src/types/rewards.ts @@ -1,15 +1,3 @@ -export interface RewardsJSONData { - totalAmount: string - merkleRoot: string - claims: { - [stakingProvider: string]: { - amount: string - proof: string[] - beneficiary: string - } - } -} - export interface BonusEligibility { hasPREConfigured: boolean hasActiveStake: boolean diff --git a/src/types/staking-applications.ts b/src/types/staking-applications.ts deleted file mode 100644 index d9dc8599c..000000000 --- a/src/types/staking-applications.ts +++ /dev/null @@ -1,6 +0,0 @@ -export type AuthorizationStatus = - | "authorization-not-required" - | "to-authorize" - | "authorized" - | "pending-deauthorization" - | "deauthorization-initiation-needed" diff --git a/src/types/staking.ts b/src/types/staking.ts deleted file mode 100644 index c859719d0..000000000 --- a/src/types/staking.ts +++ /dev/null @@ -1,77 +0,0 @@ -import { BigNumberish } from "@ethersproject/bignumber" -import { StakeType, TopUpType, UnstakeType } from "../enums" -import { Stake } from "../threshold-ts/staking" -import { UpdateStateActionPayload } from "./state" - -export type StakingStateKey = - | "authorizer" - | "beneficiary" - | "stakingProvider" - | "stakeAmount" - -export interface UpdateStakingState { - payload: UpdateStateActionPayload -} - -export interface UseStakingState { - (): { - stakedBalance: BigNumberish - stakes: StakeData[] - stakeAmount: string | number - stakingProvider: string - beneficiary: string - authorizer: string - updateState: (key: StakingStateKey, value: any) => UpdateStakingState - minStakeAmount: string | undefined - } -} - -export interface PreConfig { - operator: string - isOperatorConfirmed: boolean - operatorStartTimestamp: string -} - -export interface PreConfigData { - [stakingProvider: string]: PreConfig -} - -export interface StakeData extends Stake { - preConfig: PreConfig -} - -export interface ProviderStakedEvent { - stakeType: number - owner: string - stakingProvider: string - beneficiary: string - authorizer: string - amount: BigNumberish -} - -export type ProviderStakedActionPayload = ProviderStakedEvent & - Omit< - StakeData, - | "stakeType" - | "nuInTStake" - | "keepInTStake" - | "tStake" - | "amount" - | "totalInTStake" - | "preConfig" - | "possibleKeepTopUpInT" - | "possibleNuTopUpInT" - > - -export type UpdateStakeAmountActionPayload = { - stakingProvider: string - amount: string | number -} - -export type UnstakedActionPayload = UpdateStakeAmountActionPayload & { - unstakeType: UnstakeType -} - -export type ToppedUpActionPayload = UpdateStakeAmountActionPayload & { - topUpType: TopUpType -} diff --git a/src/types/token.ts b/src/types/token.ts index 4ee04aa8e..5e2605293 100644 --- a/src/types/token.ts +++ b/src/types/token.ts @@ -1,12 +1,11 @@ import { Contract } from "@ethersproject/contracts" import { Token } from "../enums" import { TransactionType } from "../enums/transactionType" -import { TokenIcon } from "../static/icons/tokenIconMap" export interface TokenState { loading: boolean text: string - icon: TokenIcon + icon: any balance: number | string usdConversion: number usdBalance: string diff --git a/src/utils/__tests__/getStakingAppLabel.test.ts b/src/utils/__tests__/getStakingAppLabel.test.ts deleted file mode 100644 index 8629a2bdc..000000000 --- a/src/utils/__tests__/getStakingAppLabel.test.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { - getStakingAppLabelFromAppAddress, - getStakingAppLabelFromAppName, - getStakingAppNameFromAppAddress, -} from "../getStakingAppLabel" -import { StakingAppName } from "../../store/staking-applications" -import { getThresholdLib } from "../getThresholdLib" - -const mockAddresses: Record = { - tbtc: getThresholdLib().multiAppStaking.ecdsa.address, - randomBeacon: getThresholdLib().multiAppStaking.randomBeacon.address, -} -const mockLabels: Record = { - tbtc: "tBTC", - randomBeacon: "Random Beacon", -} -const mockAppNames: StakingAppName[] = ["tbtc", "randomBeacon"] - -describe("Staking app label utils tests", () => { - const [tbtcName, randomBeaconName] = mockAppNames - const tbtcAddress = mockAddresses[tbtcName] - const randomBeaconAddress = mockAddresses[randomBeaconName] - - it("returns correct app label if app address is given", () => { - const resultTbtcLabel = getStakingAppLabelFromAppAddress(tbtcAddress) - const resultRandomBeaconLabel = - getStakingAppLabelFromAppAddress(randomBeaconAddress) - - expect(resultTbtcLabel).toBe(mockLabels[tbtcName]) - expect(resultRandomBeaconLabel).toBe(mockLabels[randomBeaconName]) - }) - - it("returns correct app label if app name is given", () => { - const resultTbtcLabel = getStakingAppLabelFromAppName(tbtcName) - const resultRandomBeaconLabel = - getStakingAppLabelFromAppName(randomBeaconName) - - expect(resultTbtcLabel).toBe(mockLabels[tbtcName]) - expect(resultRandomBeaconLabel).toBe(mockLabels[randomBeaconName]) - }) - - it("returns correct app name if address is given", () => { - const resultTbtcName = getStakingAppNameFromAppAddress(tbtcAddress) - const resultRandomBeaconName = - getStakingAppNameFromAppAddress(randomBeaconAddress) - - expect(resultTbtcName).toBe(tbtcName) - expect(resultRandomBeaconName).toBe(randomBeaconName) - }) - - it("returns fallback value if address is unexpected", () => { - const resultName = getStakingAppLabelFromAppAddress("0xun3xp3c73d400r3s5") - - expect(resultName).toBe("App") - }) -}) diff --git a/src/utils/date.ts b/src/utils/date.ts index d6e2a3d9a..0a5db3679 100644 --- a/src/utils/date.ts +++ b/src/utils/date.ts @@ -23,16 +23,6 @@ export const dateAs = (targetUnix: number) => { return { days, hours, minutes, seconds } } -export const formatDate = ( - timestamp: string | number, - locales: Intl.LocalesArgument = "en-gb", - options?: Intl.DateTimeFormatOptions -) => - new Date(+timestamp * ONE_SEC_IN_MILISECONDS).toLocaleDateString( - locales, - options - ) - // unit, max diff, divisor const unitsToDivisor: [Intl.RelativeTimeFormatUnit, number, number][] = [ ["second", ONE_MINUTE_IN_SECONDS, 1], diff --git a/src/utils/getStakeTitle.ts b/src/utils/getStakeTitle.ts deleted file mode 100644 index 9730ffb00..000000000 --- a/src/utils/getStakeTitle.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { StakeType } from "../enums" - -export const getStakeTitle = ( - stakeType?: StakeType, - id?: number | string -): string => { - const stakeTitleMain = "stake" - const stakeTitleId = id ? ` ${id.toString()}` : "" - const stakeTitleType = !stakeType - ? "" - : stakeType === (StakeType.NU as StakeType) || - stakeType === (StakeType.KEEP as StakeType) - ? ` - legacy ${StakeType[stakeType]}` - : " - native" - return stakeTitleMain + stakeTitleId + stakeTitleType -} diff --git a/src/utils/getStakingAppLabel.ts b/src/utils/getStakingAppLabel.ts deleted file mode 100644 index 90587750e..000000000 --- a/src/utils/getStakingAppLabel.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { threshold } from "./getThresholdLib" -import { StakingAppName } from "../store/staking-applications" - -const stakingAppNameToAppLabel: Record = { - tbtc: "tBTC", - randomBeacon: "Random Beacon", -} - -const stakingAppAddressToAppName: Record = { - [threshold.multiAppStaking.ecdsa.address]: "tbtc", - [threshold.multiAppStaking.randomBeacon.address]: "randomBeacon", -} - -export const getStakingAppNameFromAppAddress = (stakingAppAddress: string) => { - return stakingAppAddressToAppName[stakingAppAddress] -} - -export const getStakingAppLabelFromAppName = ( - stakingAppName: StakingAppName -) => { - return stakingAppNameToAppLabel[stakingAppName] -} - -export const getStakingAppLabelFromAppAddress = (address: string) => { - const appName = getStakingAppNameFromAppAddress(address) - return getStakingAppLabelFromAppName(appName) || "App" -} diff --git a/src/utils/percentage.ts b/src/utils/percentage.ts index 13171725f..50748b7f5 100644 --- a/src/utils/percentage.ts +++ b/src/utils/percentage.ts @@ -1,23 +1,3 @@ -import { BigNumber, BigNumberish, FixedNumber } from "ethers" - -export const calculatePercenteage = ( - amount: BigNumberish | undefined, - totalAmount: BigNumberish | undefined -) => { - if ( - !amount || - BigNumber.from(amount).isZero() || - !totalAmount || - BigNumber.from(totalAmount).isZero() - ) - return 0 - - return FixedNumber.fromString(amount.toString()) - .divUnsafe(FixedNumber.fromString(totalAmount.toString())) - .mulUnsafe(FixedNumber.fromString("100")) - .toUnsafeFloat() -} - export const formatPercentage = ( percentage: number, decimalPlaces = 0, diff --git a/src/utils/stakingBonus.ts b/src/utils/stakingBonus.ts index 109843aee..5d50ba553 100644 --- a/src/utils/stakingBonus.ts +++ b/src/utils/stakingBonus.ts @@ -1,16 +1,6 @@ -import { FixedNumber } from "@ethersproject/bignumber" import { stakingBonus as stakingBonusConstants } from "../constants" import { dateToUnixTimestamp } from "./date" -export const calculateStakingBonusReward = (eligibleStakeAmount: string) => - FixedNumber.fromString(eligibleStakeAmount) - .mulUnsafe( - FixedNumber.fromString(stakingBonusConstants.STAKING_BONUS_MULTIPLIER) - ) - .toString() - // Remove `.` to return an integer. - .split(".")[0] - export const isBeforeOrEqualBonusDeadline = (date: Date = new Date()) => dateToUnixTimestamp(date) <= stakingBonusConstants.BONUS_DEADLINE_TIMESTAMP diff --git a/src/web3/abi/CumulativeMerkleDrop.json b/src/web3/abi/CumulativeMerkleDrop.json deleted file mode 100644 index 7229836d0..000000000 --- a/src/web3/abi/CumulativeMerkleDrop.json +++ /dev/null @@ -1,248 +0,0 @@ -[ - { - "inputs": [ - { "internalType": "address", "name": "token_", "type": "address" }, - { - "internalType": "address", - "name": "rewardsHolder_", - "type": "address" - }, - { "internalType": "address", "name": "newOwner", "type": "address" } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "stakingProvider", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "amount", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "address", - "name": "beneficiary", - "type": "address" - }, - { - "indexed": false, - "internalType": "bytes32", - "name": "merkleRoot", - "type": "bytes32" - } - ], - "name": "Claimed", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "bytes32", - "name": "oldMerkleRoot", - "type": "bytes32" - }, - { - "indexed": false, - "internalType": "bytes32", - "name": "newMerkleRoot", - "type": "bytes32" - } - ], - "name": "MerkelRootUpdated", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "previousOwner", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "newOwner", - "type": "address" - } - ], - "name": "OwnershipTransferred", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "address", - "name": "oldRewardsHolder", - "type": "address" - }, - { - "indexed": false, - "internalType": "address", - "name": "newRewardsHolder", - "type": "address" - } - ], - "name": "RewardsHolderUpdated", - "type": "event" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "expectedMerkleRoot", - "type": "bytes32" - }, - { - "components": [ - { - "internalType": "address", - "name": "stakingProvider", - "type": "address" - }, - { - "internalType": "address", - "name": "beneficiary", - "type": "address" - }, - { "internalType": "uint256", "name": "amount", "type": "uint256" }, - { "internalType": "bytes32[]", "name": "proof", "type": "bytes32[]" } - ], - "internalType": "struct CumulativeMerkleDrop.Claim[]", - "name": "Claims", - "type": "tuple[]" - } - ], - "name": "batchClaim", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "stakingProvider", - "type": "address" - }, - { "internalType": "address", "name": "beneficiary", "type": "address" }, - { - "internalType": "uint256", - "name": "cumulativeAmount", - "type": "uint256" - }, - { - "internalType": "bytes32", - "name": "expectedMerkleRoot", - "type": "bytes32" - }, - { - "internalType": "bytes32[]", - "name": "merkleProof", - "type": "bytes32[]" - } - ], - "name": "claim", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [{ "internalType": "address", "name": "", "type": "address" }], - "name": "cumulativeClaimed", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "merkleRoot", - "outputs": [{ "internalType": "bytes32", "name": "", "type": "bytes32" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "owner", - "outputs": [{ "internalType": "address", "name": "", "type": "address" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "renounceOwnership", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "rewardsHolder", - "outputs": [{ "internalType": "address", "name": "", "type": "address" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "bytes32", "name": "merkleRoot_", "type": "bytes32" } - ], - "name": "setMerkleRoot", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "rewardsHolder_", "type": "address" } - ], - "name": "setRewardsHolder", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "token", - "outputs": [{ "internalType": "address", "name": "", "type": "address" }], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { "internalType": "address", "name": "newOwner", "type": "address" } - ], - "name": "transferOwnership", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32[]", - "name": "merkleProof", - "type": "bytes32[]" - }, - { "internalType": "bytes32", "name": "root", "type": "bytes32" }, - { "internalType": "bytes32", "name": "leaf", "type": "bytes32" } - ], - "name": "verify", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], - "stateMutability": "pure", - "type": "function" - } -] diff --git a/src/web3/hooks/index.ts b/src/web3/hooks/index.ts index 4041e89ee..370ea9756 100644 --- a/src/web3/hooks/index.ts +++ b/src/web3/hooks/index.ts @@ -14,6 +14,4 @@ export * from "./useKeepAssetPoolContract" export * from "./useTBTCTokenContract" export * from "./useTStakingContract" export * from "./useKeepTokenStakingContract" -export * from "./usePREContract" -export * from "./useClaimMerkleRewardsTransaction" export * from "./useGetBlock" diff --git a/src/web3/hooks/useApproval.ts b/src/web3/hooks/useApproval.ts deleted file mode 100644 index 6744d3b16..000000000 --- a/src/web3/hooks/useApproval.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { useSendTransaction } from "./useSendTransaction" -import { useTokenAllowance } from "./useTokenAllowance" -import { MaxUint256 } from "@ethersproject/constants" -import { BigNumber } from "ethers" -import { Contract } from "@ethersproject/contracts" - -const useApproval = ( - tokenContract?: Contract, - spender?: string, - onSuccess?: () => void | Promise -) => { - const { sendTransaction, status } = useSendTransaction( - tokenContract!, - "approve", - onSuccess - ) - - const allowance = useTokenAllowance(tokenContract, spender) - - const approve = async (amountToApprove = MaxUint256.toString()) => { - if (BigNumber.from(amountToApprove).gte(BigNumber.from(allowance))) { - await sendTransaction(spender, amountToApprove) - } - } - - return { approve, status } -} - -export default useApproval diff --git a/src/web3/hooks/useApproveTStaking.ts b/src/web3/hooks/useApproveTStaking.ts deleted file mode 100644 index 38f2ec03e..000000000 --- a/src/web3/hooks/useApproveTStaking.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { useToken } from "../../hooks/useToken" -import { Token } from "../../enums" -import { useTStakingContract } from "./useTStakingContract" -import useApproval from "./useApproval" - -export const useApproveTStaking = (onSuccess?: () => Promise | void) => { - const tToken = useToken(Token.T) - const tStakingContract = useTStakingContract() - return useApproval(tToken.contract!, tStakingContract?.address, onSuccess) -} diff --git a/src/web3/hooks/useCheckDuplicateProviderAddress.ts b/src/web3/hooks/useCheckDuplicateProviderAddress.ts deleted file mode 100644 index fa79883c7..000000000 --- a/src/web3/hooks/useCheckDuplicateProviderAddress.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { useCallback } from "react" -import { BigNumber } from "ethers" -import { useTStakingContract } from "./useTStakingContract" -import { useKeepTokenStakingContract } from "./useKeepTokenStakingContract" -import { isAddressZero } from "../../web3/utils" -import { useThreshold } from "../../contexts/ThresholdContext" - -const useCheckDuplicateProviderAddress = (): (( - stakingProvider: string -) => Promise<{ - isProviderUsedForKeep: boolean - isProviderUsedForT: boolean -}>) => { - const tStakingContract = useTStakingContract() - const keepStakingContract = useKeepTokenStakingContract() - const threshold = useThreshold() - - const checkIfProviderUsed = useCallback( - async (stakingProvider) => { - if (!tStakingContract || !keepStakingContract) { - throw new Error( - "The request cannot be executed because the contract instances do not exist." - ) - } - - const [{ owner }, [, createdAt]] = await threshold.multicall.aggregate([ - { - interface: tStakingContract.interface, - address: tStakingContract.address, - method: "rolesOf", - args: [stakingProvider], - }, - { - interface: keepStakingContract.interface, - address: keepStakingContract.address, - method: "getDelegationInfo", - args: [stakingProvider], - }, - ]) - - const isProviderUsedForKeep = createdAt.gt(BigNumber.from(0)) - const isProviderUsedForT = !isAddressZero(owner) - - return { isProviderUsedForKeep, isProviderUsedForT } - }, - [tStakingContract, keepStakingContract, threshold] - ) - - return checkIfProviderUsed -} - -export default useCheckDuplicateProviderAddress diff --git a/src/web3/hooks/useClaimMerkleRewardsTransaction.ts b/src/web3/hooks/useClaimMerkleRewardsTransaction.ts deleted file mode 100644 index 371b25b71..000000000 --- a/src/web3/hooks/useClaimMerkleRewardsTransaction.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { useCallback } from "react" -import { useMerkleDropContract } from "./useMerkleDropContract" -import rewardsData from "../../merkle-drop/rewards.json" -import { OnSuccessCallback, useSendTransaction } from "./useSendTransaction" -import { RewardsJSONData } from "../../types" - -export const useClaimMerkleRewardsTransaction = ( - onSuccess?: OnSuccessCallback -) => { - const merkleDropContract = useMerkleDropContract() - const { sendTransaction, status } = useSendTransaction( - merkleDropContract!, - "batchClaim", - onSuccess - ) - - const claim = useCallback( - (stakingProviders: string[]) => { - if (!stakingProviders || stakingProviders.length === 0) { - throw new Error("Staking providers not found.") - } - const availableRewardsToClaim = [] - - for (const stakingProvider of stakingProviders) { - if (!rewardsData.claims.hasOwnProperty(stakingProvider)) continue - - const { amount, beneficiary, proof } = (rewardsData as RewardsJSONData) - .claims[stakingProvider] - availableRewardsToClaim.push([ - stakingProvider, - beneficiary, - amount, - proof, - ]) - } - - if (availableRewardsToClaim.length === 0) { - throw new Error("No rewards to claim.") - } - - const { merkleRoot } = rewardsData - sendTransaction(merkleRoot, availableRewardsToClaim) - }, - [merkleDropContract] - ) - - return { claim, status } -} diff --git a/src/web3/hooks/useMerkleDropContract.ts b/src/web3/hooks/useMerkleDropContract.ts deleted file mode 100644 index 5fd7f30cb..000000000 --- a/src/web3/hooks/useMerkleDropContract.ts +++ /dev/null @@ -1,25 +0,0 @@ -import CumulativeMerkleDropABI from "../abi/CumulativeMerkleDrop.json" -import { useContract } from "./useContract" -import { supportedChainId } from "../../utils/getEnvVariable" -import { ChainID } from "../../enums" -import { AddressZero } from "../utils" - -export const DEPLOYMENT_BLOCK = supportedChainId === "1" ? 15146501 : 0 - -const CONTRACT_ADDRESSESS = { - // https://etherscan.io/address/0xea7ca290c7811d1cc2e79f8d706bd05d8280bd37 - [ChainID.Ethereum.valueOf().toString()]: - "0xeA7CA290c7811d1cC2e79f8d706bD05d8280BD37", - // https://goerli.etherscan.io/address/0x55F836777302CE096CC7770142a8262A2627E2e9 - [ChainID.Goerli.valueOf().toString()]: - "0x55F836777302CE096CC7770142a8262A2627E2e9", - // TODO: Set local address- how to resolve it in local network? - [ChainID.Localhost.valueOf().toString()]: AddressZero, -} as Record - -export const useMerkleDropContract = () => { - return useContract( - CONTRACT_ADDRESSESS[supportedChainId], - CumulativeMerkleDropABI - ) -} diff --git a/src/web3/hooks/useNuStakingEscrowContract.ts b/src/web3/hooks/useNuStakingEscrowContract.ts deleted file mode 100644 index df0755000..000000000 --- a/src/web3/hooks/useNuStakingEscrowContract.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { useThreshold } from "../../contexts/ThresholdContext" - -export const useNuStakingEscrowContract = () => { - const threshold = useThreshold() - - return threshold.staking.legacyNuStakingContract -} diff --git a/src/web3/hooks/usePREContract.ts b/src/web3/hooks/usePREContract.ts deleted file mode 100644 index 16de6d4c0..000000000 --- a/src/web3/hooks/usePREContract.ts +++ /dev/null @@ -1,28 +0,0 @@ -import SimplePREApplicationABI from "../abi/SimplePreApplication.json" -import { useContract } from "./useContract" -import { supportedChainId } from "../../utils/getEnvVariable" -import { ChainID } from "../../enums" -import { AddressZero } from "../utils" - -export const PRE_DEPLOYMENT_BLOCK = supportedChainId === "1" ? 14141140 : 0 - -const PRE_ADDRESSESS = { - // https://etherscan.io/address/0x7E01c9c03FD3737294dbD7630a34845B0F70E5Dd - [ChainID.Ethereum.valueOf().toString()]: - "0x7E01c9c03FD3737294dbD7630a34845B0F70E5Dd", - // https://goerli.etherscan.io/address/0x829fdCDf6Be747FEA37518fBd83dF70EE371fCf2 - // As NuCypher hasn't depoyed the `SimplePreApplication` contract on Goerli, - // we're using a stub contract. - [ChainID.Goerli.valueOf().toString()]: - "0x829fdCDf6Be747FEA37518fBd83dF70EE371fCf2", - // Set the correct `SimplePREApplication` contract address. If you deployed - // the `@threshold-network/solidity-contracts` to your local chain and linked - // package using `yarn link @threshold-network/solidity-contracts` you can - // find the contract address at - // `node_modules/@threshold-network/solidity-contracts/artifacts/SimplePREApplication.json`. - [ChainID.Localhost.valueOf().toString()]: AddressZero, -} as Record - -export const usePREContract = () => { - return useContract(PRE_ADDRESSESS[supportedChainId], SimplePREApplicationABI) -} diff --git a/src/web3/hooks/useStakeTransaction.ts b/src/web3/hooks/useStakeTransaction.ts deleted file mode 100644 index f3c2c6261..000000000 --- a/src/web3/hooks/useStakeTransaction.ts +++ /dev/null @@ -1,67 +0,0 @@ -import { useCallback } from "react" -import { OnSuccessCallback, useSendTransaction } from "./useSendTransaction" -import { useTStakingContract } from "./useTStakingContract" -import { ModalType } from "../../enums" -import { useModal } from "../../hooks/useModal" -import { useApproveTStaking } from "./useApproveTStaking" -import { BigNumber } from "ethers" -import { useTStakingAllowance } from "./useTStakingAllowance" -import doesErrorInclude from "../utils/doesErrorInclude" - -interface StakeRequest { - amount: string | number - stakingProvider: string - beneficiary: string - authorizer: string -} - -enum CommonStakingErrors { - ProviderInUse = "Provider is already in use", -} - -export const useStakeTransaction = (onSuccess: OnSuccessCallback) => { - const stakingContract = useTStakingContract() - const { openModal } = useModal() - const { approve } = useApproveTStaking() - - const onError = (error: any) => { - if (doesErrorInclude(error, CommonStakingErrors.ProviderInUse)) { - // send the user back to the first staking step, but with validated form fields - openModal(ModalType.ConfirmStakingParams, { - stakingProviderInUse: true, - }) - } else { - openModal(ModalType.TransactionFailed, { - error, - isExpandableError: true, - }) - } - } - - const { sendTransaction, status } = useSendTransaction( - stakingContract!, - "stake", - onSuccess, - onError - ) - - const allowance = useTStakingAllowance() - - const stake = useCallback( - async ({ - amount, - stakingProvider, - beneficiary, - authorizer, - }: StakeRequest) => { - const isApprovedForAmount = BigNumber.from(amount).lte(allowance) - if (!isApprovedForAmount) { - await approve(amount.toString()) - } - await sendTransaction(stakingProvider, beneficiary, authorizer, amount) - }, - [sendTransaction, stakingContract?.address, allowance, approve] - ) - - return { stake, status } -} diff --git a/src/web3/hooks/useTStakingAllowance.ts b/src/web3/hooks/useTStakingAllowance.ts deleted file mode 100644 index fcd2b4f90..000000000 --- a/src/web3/hooks/useTStakingAllowance.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { useToken } from "../../hooks/useToken" -import { Token } from "../../enums" -import { useTStakingContract } from "./useTStakingContract" -import { useTokenAllowance } from "./useTokenAllowance" - -export const useTStakingAllowance = () => { - const { contract: TTokenContract } = useToken(Token.T) - const tStakingContract = useTStakingContract() - return useTokenAllowance(TTokenContract!, tStakingContract?.address) -} diff --git a/src/web3/hooks/useTokenAllowance.ts b/src/web3/hooks/useTokenAllowance.ts deleted file mode 100644 index 726464c1c..000000000 --- a/src/web3/hooks/useTokenAllowance.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { useEffect, useState } from "react" -import { useWeb3React } from "@web3-react/core" -import { Contract } from "@ethersproject/contracts" - -export const useTokenAllowance = ( - tokenContract?: Contract, - spender?: string -) => { - const { account } = useWeb3React() - const [allowance, setAllowance] = useState(0) - - useEffect(() => { - const checkAllowance = async () => { - setAllowance(await tokenContract?.allowance(account, spender)) - } - - if (tokenContract?.allowance && account && spender) { - checkAllowance() - } - }, [account, tokenContract, spender]) - - return allowance -} diff --git a/src/web3/hooks/useTopupTransaction.ts b/src/web3/hooks/useTopupTransaction.ts deleted file mode 100644 index b7410f461..000000000 --- a/src/web3/hooks/useTopupTransaction.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { useCallback } from "react" -import { OnSuccessCallback, useSendTransaction } from "./useSendTransaction" -import { useTStakingContract } from "./useTStakingContract" -import { useApproveTStaking } from "./useApproveTStaking" -import { BigNumber } from "ethers" -import { useTStakingAllowance } from "./useTStakingAllowance" -import { TopUpType } from "../../enums" - -interface TopupRequest { - amount: string | number - stakingProvider: string -} -const topUpTypeToContractFunctionName: Record = { - [TopUpType.NATIVE]: "topUp", - [TopUpType.LEGACY_KEEP]: "topUpKeep", - [TopUpType.LEGACY_NU]: "topUpNu", -} - -export const useTopupTransaction = ( - type: TopUpType, - onSuccess: OnSuccessCallback -) => { - const stakingContract = useTStakingContract() - const { approve } = useApproveTStaking() - - const { sendTransaction, status } = useSendTransaction( - stakingContract!, - topUpTypeToContractFunctionName[type], - onSuccess - ) - - const allowance = useTStakingAllowance() - - const topup = useCallback( - async ({ amount, stakingProvider }: TopupRequest) => { - const isApprovedForAmount = BigNumber.from(amount).lte(allowance) - if (type === TopUpType.NATIVE && !isApprovedForAmount) { - await approve(amount.toString()) - } - const args = - type === TopUpType.NATIVE - ? [stakingProvider, amount] - : [stakingProvider] - - await sendTransaction(...args) - }, - [sendTransaction, allowance, approve, type] - ) - - return { topup, status } -} diff --git a/src/web3/hooks/useUnstakeTransaction.ts b/src/web3/hooks/useUnstakeTransaction.ts deleted file mode 100644 index efc1d335d..000000000 --- a/src/web3/hooks/useUnstakeTransaction.ts +++ /dev/null @@ -1,69 +0,0 @@ -import { useCallback } from "react" -import { OnSuccessCallback, useSendTransaction } from "./useSendTransaction" -import { useTStakingContract } from "./useTStakingContract" -import { useModal } from "../../hooks/useModal" -import doesErrorInclude from "../utils/doesErrorInclude" -import { ModalType, UnstakeType } from "../../enums" - -interface UnstakeRequest { - amount: string | number - stakingProvider: string -} - -enum CommonUnStakingErrors { - tooEarly = "unstake earlier than 24h", -} - -const unstakeTypeToContractFunctionName: Record = { - [UnstakeType.NATIVE]: "unstakeT", - [UnstakeType.LEGACY_KEEP]: "unstakeKeep", - [UnstakeType.LEGACY_NU]: "unstakeNu", - [UnstakeType.ALL]: "unstakeAll", -} - -const useUnstakeTransaction = ( - type: UnstakeType, - onSuccess: OnSuccessCallback -) => { - const { openModal } = useModal() - - const stakingContract = useTStakingContract() - - const onError = (error: any) => { - if (doesErrorInclude(error, CommonUnStakingErrors.tooEarly)) { - openModal(ModalType.TransactionFailed, { - error: new Error( - "Your stake is locked for 24 hours after deposit. Please check back after if you would like to unstake" - ), - }) - } else { - openModal(ModalType.TransactionFailed, { - error, - isExpandableError: true, - }) - } - } - - const { sendTransaction, status } = useSendTransaction( - stakingContract!, - unstakeTypeToContractFunctionName[type], - onSuccess, - onError - ) - - const unstake = useCallback( - async ({ amount, stakingProvider }: UnstakeRequest) => { - const args = - type === UnstakeType.NATIVE || type == UnstakeType.LEGACY_NU - ? [stakingProvider, amount] - : [stakingProvider] - - await sendTransaction(...args) - }, - [sendTransaction, type] - ) - - return { unstake, status } -} - -export default useUnstakeTransaction