Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add Taco application to dashboard #625

Merged
merged 122 commits into from
Dec 19, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
122 commits
Select commit Hold shift + click to select a range
4f04771
chore: Add .env to .gitignore and add example env
theref Sep 1, 2023
b5ce308
Add Dockerfile
theref Jul 19, 2023
eda47fa
Switch to debian image to avoid memory issues
theref Jul 20, 2023
8c72e44
docs: Update local docker development instruction in README
theref Aug 24, 2023
1e3bf52
Converts docker usage into docker compose and use a bind mount to ref…
KPrasch Sep 18, 2023
9f10d90
automated linting
KPrasch Sep 18, 2023
60448f3
chore: update readme from docker to docker-compose command
theref Oct 5, 2023
c270215
chore: update docker-compose command
theref Oct 11, 2023
568f7ba
Update README.md
theref Oct 11, 2023
15b8097
Add Dockerfile
theref Jul 19, 2023
3bc1066
Switch to debian image to avoid memory issues
theref Jul 20, 2023
b4be54b
docs: Update local docker development instruction in README
theref Aug 24, 2023
18471bd
Converts docker usage into docker compose and use a bind mount to ref…
KPrasch Sep 18, 2023
0cc9dae
Update README with new package versions for local dev
theref Oct 17, 2023
2dcefdb
Replace pre with taco on varioius pages
theref Sep 1, 2023
f56e6e7
Continue replacing PRE with TACo
theref Sep 5, 2023
493cbdd
Update staking application authorization form
theref Sep 11, 2023
e6d1661
Apply wording change
theref Sep 14, 2023
12161b8
Apply review wording change
theref Sep 14, 2023
a44ecb1
Update documentation urls
theref Sep 14, 2023
8badd87
automated linting
KPrasch Sep 18, 2023
439ef88
feat(store): add taco to operator info
theref Sep 18, 2023
515b272
feat: Update labels and add TACo app mapping
theref Sep 18, 2023
6fcd7b7
refactor: Rename variable TACoApp to tacoApp
theref Sep 18, 2023
069d9e6
feat: Add support for authorizing Taco app
theref Sep 18, 2023
2995f0c
feat: Add mapping of operator address to TACo app
theref Sep 19, 2023
680036f
feat: Add Taco Application abi and goerli address
theref Sep 19, 2023
68a0d6d
Add some todos and export the Taco contract const
theref Sep 19, 2023
1b3c67d
Use the Taco Contract within MultiAppStaking
theref Sep 19, 2023
ca9ddf9
linting fixes, fix small typo.
KPrasch Sep 19, 2023
7a78b8a
Use a static deployment artifact registry for TacoApplication.
KPrasch Sep 19, 2023
be06a85
Use nucypher-contracts package for TACo abi and address
theref Oct 9, 2023
fcdff8e
feat(utils): add taco mapping for address and app label after rebase
theref Oct 10, 2023
b2855ce
Update yarn.lock after adding @nucypher/nucypher-contracts dependency
cygnusv Oct 11, 2023
6348951
Update src/components/Modal/MapOperatorToStakingProviderConfirmationM…
theref Oct 11, 2023
24b8df1
chore: Add dashboard network to .env files
theref Oct 11, 2023
8d1c6d7
style: fix typo in TACo node and TACo app names
theref Oct 12, 2023
daabbf5
fix(mas): update environment variable name
theref Oct 12, 2023
e6ed4cf
Add TACo app to testing
theref Oct 12, 2023
a2450c0
Bump version of @nucypher/nucypher-contracts
theref Oct 17, 2023
a2b47c9
Update docs links for TACo node setup and staking providers
theref Oct 19, 2023
136dc4d
Remove reference to PRE in bonus eligibility
theref Oct 19, 2023
bf394cc
Remove remaining references to PRE
theref Oct 19, 2023
3cd9e43
Fix bug with taco min auth amount
theref Oct 23, 2023
a1c544e
Update Operator-StakingProvider mapping function for TACo app contract
theref Oct 23, 2023
fef0f04
Upgrade node to 18 within the dockerfile
theref Oct 31, 2023
261d017
Update nucypher-contracts version and add bondOperator to interface
theref Nov 21, 2023
d6aec7c
Fix Dockerfile after rebase
theref Nov 27, 2023
c8f6617
Update Dockerfile, nucypher-contracts version, and TACo domain to sup…
theref Nov 27, 2023
c4c9327
More sepolia Taco improvements
theref Nov 28, 2023
b4acb56
Include TACo in NewAppsToAuthorizeModal
theref Nov 29, 2023
9205701
Add optional _minimumAuthorization for AuthorizationParameters
theref Dec 4, 2023
029f4a1
chore: remove redundant image from docker-compose file
piotr-roslaniec Dec 5, 2023
dcdeb0b
Initial Taco commitment work
theref Dec 4, 2023
aa66a98
Fix file type
theref Dec 4, 2023
531b663
Add basics of button and new card
theref Dec 4, 2023
91f7b8b
Add table of choices to Commitment modal
theref Dec 4, 2023
7acd519
Send commitment tx successfully!
theref Dec 5, 2023
7b77303
Update images used for TACo increase/decrease authorizations.
derekpierre Dec 4, 2023
544ef27
Update images used for showing Authorized Apps.
derekpierre Dec 4, 2023
0cca3e4
Update StakingApp illustrations to include TACo instead of PRE.
derekpierre Dec 4, 2023
65d795c
Update increase/decrease auth images text to use Inter.
derekpierre Dec 4, 2023
f67bb4c
Update yarn.lock.
derekpierre Dec 5, 2023
6386dd8
Update TACo commitment modal wording
theref Dec 5, 2023
992abfe
Catch isOperatorInPool error for TACo application
theref Dec 5, 2023
4af591b
Add extra commitment options
theref Dec 5, 2023
5fb7459
Pin react-icons to v4.4.0
cygnusv Dec 5, 2023
e7876f3
Clarify deauthorization cooldown periods
cygnusv Dec 5, 2023
fbb1ec2
Reorder app cards
cygnusv Dec 5, 2023
93ed57b
add links to staking apps docs
piotr-roslaniec Dec 5, 2023
bce82c4
Remove trailing whitespace
cygnusv Dec 6, 2023
8aa5445
Restore react-icons to ^4.3.1 in package.json
cygnusv Dec 6, 2023
0a2b0af
Add extra card for Operator mapping
theref Dec 6, 2023
05dab49
Define transactions for submitting Taco operator or TBTC+RB
theref Dec 6, 2023
1a2b067
Submit correct info when bonding operator
theref Dec 7, 2023
5861227
Display correct address in Operator mapping confirmation modal
theref Dec 7, 2023
3a02f37
Use validateForm instead of onSubmit for multiple operator mappings
theref Dec 8, 2023
3827e24
Refactor checkIfOperatorIsMappedToAnotherStakingProvider to use appName
theref Dec 8, 2023
f30f3e1
Use application array in MapOperatorToStakingProviderConfirmationModal
theref Dec 8, 2023
3eda822
Fix isOperatorMappedToAnotherStakingProvider
theref Dec 8, 2023
8911814
Await all form validations in one promise
theref Dec 11, 2023
abdeb7e
Update commitment lengths and bonuses
theref Dec 11, 2023
b18fa9f
feat: update cooldown period and related text dynamically
theref Dec 12, 2023
0b73f9f
refactor: improve conditional rendering and code organization in Stak…
theref Dec 12, 2023
aa9ac93
Revert to using withFormik for operator mapping
theref Dec 12, 2023
2621558
Attempt to pass innerRef around more
theref Dec 12, 2023
d4df82f
Fix submitMapping function for Operator Mapping modal
theref Dec 13, 2023
3627ab6
Add StakingProvider to OperatorMappingConfirmation Modal
theref Dec 14, 2023
29a2384
Update commitment modal wording
theref Dec 14, 2023
e68140b
Show current Authorized amount on TACo commitment modal
theref Dec 14, 2023
018b336
Show commitment endDate in modal
theref Dec 14, 2023
992c5b1
Improve error handling
theref Dec 14, 2023
7c8ce9f
Update src/pages/Staking/HowItWorks/StakingApplications/index.tsx
theref Dec 14, 2023
08afb29
Update src/pages/Staking/HowItWorks/StakingApplications/index.tsx
theref Dec 14, 2023
d8c6262
Update src/utils/__tests__/getStakingAppLabel.test.ts
theref Dec 14, 2023
e16016e
Update src/components/StakingTimeline/index.tsx
theref Dec 15, 2023
9af8301
Update src/hooks/staking-applications/useRegisterMultipleOperatorsTra…
theref Dec 15, 2023
1e87b55
Update src/hooks/staking-applications/useRegisterMultipleOperatorsTra…
theref Dec 15, 2023
f3421d2
refactor: remove redundant code in validateInputtedOperatorAddress
theref Dec 15, 2023
2fc1aa1
fix: handle errors in isOperatorInPool method
theref Dec 15, 2023
cc8f779
refactor: remove console.log in getSupportedAppsEffect
theref Dec 15, 2023
8e7cdbe
refactor: remove duuplicated SubmitStakeModal from MODAL_TYPES
theref Dec 15, 2023
ab10f35
refactor: remove unused SelectedApp type and selectedApps state
theref Dec 15, 2023
c9b7f6b
refactor: use formRef assignments in validity check of Operator mapping
theref Dec 15, 2023
dd1aeab
refactor: update mapping variables for different app names
theref Dec 15, 2023
2328f32
refactor: improve conditional rendering using isEmptyOrZeroAddress
theref Dec 15, 2023
180fb0d
Apply code review suggestion comparing tbtc and rb operator
theref Dec 15, 2023
4a21f1b
Combine RandomBeacon and tBTC OperatorMapping forms
theref Dec 15, 2023
917ac03
refactor: improve form validation logic for staking app authorization
theref Dec 15, 2023
c8cd164
Address UI improvements in TACo commitment modal
theref Dec 18, 2023
e2c8e4b
Move TBTC+RB alert inside conditional statement and improve condition
theref Dec 18, 2023
769fa45
Reset validateInputtedOperatorAddress to match main
theref Dec 18, 2023
ef47fdb
Redo OperatorMapping logic to handle variety of apps
theref Dec 18, 2023
4356900
Update src/components/Modal/MapOperatorToStakingProviderModal/index.tsx
theref Dec 18, 2023
a26ec0d
Update src/components/Modal/MapOperatorToStakingProviderModal/index.tsx
theref Dec 18, 2023
0874145
Fix logical comparison for tbtc and rb
theref Dec 18, 2023
6409c6c
Fix conditional rendering of tbtc and rb label
theref Dec 18, 2023
e1a53ca
Add success modal to TACo commitment
theref Dec 18, 2023
c62b5aa
Show TACo commitment button only if TACo isAuthorized
theref Dec 18, 2023
69c9ad4
Refactor variable for assessing which apps have operator mapped
theref Dec 18, 2023
46e0a12
Update src/components/Modal/MapOperatorToStakingProviderModal/index.tsx
theref Dec 18, 2023
a188adf
Update src/components/Modal/MapOperatorToStakingProviderModal/index.tsx
theref Dec 18, 2023
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion .env → .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -18,4 +18,6 @@ REACT_APP_ELECTRUM_HOST=$ELECTRUM_HOST
REACT_APP_ELECTRUM_PORT=$ELECTRUM_PORT
REACT_APP_MOCK_BITCOIN_CLIENT=true

REACT_APP_WALLET_CONNECT_PROJECT_ID=$WALLET_CONNECT_PROJECT_ID
REACT_APP_WALLET_CONNECT_PROJECT_ID=$WALLET_CONNECT_PROJECT_ID

REACT_APP_TACO_DOMAIN=dashboard
1 change: 1 addition & 0 deletions .env.production
Original file line number Diff line number Diff line change
Expand Up @@ -20,3 +20,4 @@ REACT_APP_ELECTRUM_PORT=$ELECTRUM_PORT
REACT_APP_MOCK_BITCOIN_CLIENT=false

REACT_APP_WALLET_CONNECT_PROJECT_ID=$WALLET_CONNECT_PROJECT_ID
REACT_APP_TACO_DOMAIN=mainnet
theref marked this conversation as resolved.
Show resolved Hide resolved
1 change: 1 addition & 0 deletions .env.test
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
REACT_APP_SUPPORTED_CHAIN_ID=1337
REACT_APP_MULTICALL_ADDRESS=0x086813525A7dC7dafFf015Cdf03896Fd276eab60
REACT_APP_TACO_DOMAIN=dashboard
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -21,3 +21,5 @@ cypress/plugins
# Yarn
node_modules/
yarn-error.log
.env
.cosine/
33 changes: 33 additions & 0 deletions Dockerfile.dev
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
# Use the specified image
FROM node:18-buster-slim

# Set the working directory
WORKDIR /app

# Install dependencies
RUN apt-get update && apt-get install -y python3 make g++ git openssh-client ca-certificates && \
git config --global url."https://".insteadOf git:// && \
rm -rf /var/lib/apt/lists/* && \
apt-get clean

# Set the environment variables
ENV PYTHON=/usr/bin/python3
ENV NODE_OPTIONS=--max_old_space_size=3072

# Copy package files and install node modules
COPY package*.json yarn.lock ./
RUN npm install -g node-gyp
RUN yarn install --ignore-scripts
RUN yarn upgrade @keep-network/coverage-pools@sepolia \
@keep-network/ecdsa@sepolia \
@keep-network/keep-core@sepolia \
@keep-network/keep-ecdsa@sepolia \
@keep-network/random-beacon@sepolia \
@keep-network/tbtc@sepolia \
@keep-network/tbtc-v2@sepolia \
@threshold-network/coverage-pools@npm:@keep-network/coverage-pools@sepolia \
@threshold-network/solidity-contracts@sepolia
RUN yarn run postinstall

# Expose port 3000
EXPOSE 3000
34 changes: 34 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -112,3 +112,37 @@ The following procedure allows to deploy T token dashboard to production:
approval of someone else from the development team.
5. Once the release action is approved, the new version is automatically
deployed to `dashboard.threshold.network`.

## Local Development

Update `.env` to contain:

```
REACT_APP_SUPPORTED_CHAIN_ID=11155111
REACT_APP_ETH_HOSTNAME_HTTP=https://sepolia.infura.io/v3/<your API key here>
REACT_APP_ETH_HOSTNAME_WS=wss://sepolia.infura.io/v3/<your API key here>
REACT_APP_MULTICALL_ADDRESS=$MULTICALL_ADDRESS

REACT_APP_FEATURE_FLAG_TBTC_V2=true
REACT_APP_FEATURE_FLAG_TBTC_V2_REDEMPTION=true
REACT_APP_FEATURE_FLAG_MULTI_APP_STAKING=true
REACT_APP_FEATURE_FLAG_FEEDBACK_MODULE=false
REACT_APP_FEATURE_FLAG_POSTHOG=false
REACT_APP_FEATURE_FLAG_SENTRY=$SENTRY_SUPPORT
REACT_APP_SENTRY_DSN=$SENTRY_DSN

REACT_APP_ELECTRUM_PROTOCOL=wss
REACT_APP_ELECTRUM_HOST=electrumx-server.test.tbtc.network
REACT_APP_ELECTRUM_PORT=8443
REACT_APP_MOCK_BITCOIN_CLIENT=false

REACT_APP_WALLET_CONNECT_PROJECT_ID=$WALLET_CONNECT_PROJECT_ID

REACT_APP_TACO_DOMAIN=dashboard
```

Then build the docker container and run the dashboard:

```bash
docker-compose up --build
```
18 changes: 18 additions & 0 deletions docker-compose.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
version: "3.8"

services:
threshold-dashboard:
container_name: threshold-dashboard
working_dir: /app
environment:
- PYTHON=/usr/bin/python3
- NODE_OPTIONS=--max_old_space_size=3072
ports:
- "3000:3000"
volumes:
- .:/app # Bind mount the current directory to /app in the container
- /app/node_modules # This will prevent node_modules from being overwritten by the local volume
command: bash -c "yarn format:fix && yarn start"
theref marked this conversation as resolved.
Show resolved Hide resolved
build:
context: .
dockerfile: Dockerfile.dev
1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
"@ledgerhq/wallet-api-client-react": "^1.1.1",
"@reduxjs/toolkit": "^1.6.1",
"@rehooks/local-storage": "^2.4.4",
"@nucypher/nucypher-contracts": "0.13.0",
theref marked this conversation as resolved.
Show resolved Hide resolved
"@sentry/react": "^7.33.0",
"@sentry/tracing": "^7.33.0",
"@testing-library/jest-dom": "^5.11.4",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -119,20 +119,24 @@ const InitiateDeauthorization: FC<
</FlowStep>
<FlowStep
preTitle="Step 2"
title="45 day cooldown"
title={
stakingAppName === "taco" ? "6 month cooldown" : "45 day cooldown"
Copy link
Contributor

Choose a reason for hiding this comment

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

Non-blocking:

The cooldown is repeteadly used in several places in this file. We could extract the cooldown to a separate variable. Eg appCooldownLabel that return either 6 month or 45 day

}
status={FlowStepStatus.inactive}
size="sm"
>
You must wait a 45 day cooldown to then confirm the deauthorization.
This is 1 transaction.
You must wait a {stakingAppName === "taco" ? "6 month" : "45 day"}{" "}
cooldown to then confirm the deauthorization. This is 1 transaction.
</FlowStep>
</Stack>
<Alert status="warning">
<AlertIcon />
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.
Take note! In this {stakingAppName === "taco"
? "6 month"
: "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.
</Alert>
</ModalBody>
<ModalFooter>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,10 @@ import {
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 { FC, useCallback, useState } from "react"
import { ModalType } from "../../../enums"
import { useRegisterMultipleOperatorsTransaction } from "../../../hooks/staking-applications/useRegisterMultipleOperatorsTransaction"
import { useBondOperatorTransaction } from "../../../hooks/staking-applications/useBondOperatorTransaction"
import { useRegisterOperatorTransaction } from "../../../hooks/staking-applications/useRegisterOperatorTransaction"
import { useAppDispatch } from "../../../hooks/store"
import { useModal } from "../../../hooks/useModal"
Expand All @@ -23,6 +24,7 @@ import { BaseModalProps } from "../../../types"
import InfoBox from "../../InfoBox"
import withBaseModal from "../withBaseModal"
import { OnSuccessCallback } from "../../../web3/hooks"
import { ApplicationForOperatorMapping } from "../MapOperatorToStakingProviderModal"

const OperatorMappingConfirmation: FC<
BoxProps & { appName: string; operator: string; stakingProvider: string }
Expand Down Expand Up @@ -52,16 +54,9 @@ const OperatorMappingConfirmation: FC<

const MapOperatorToStakingProviderConfirmationModal: FC<
BaseModalProps & {
operator: string
isOperatorMappedOnlyInTbtc: boolean
isOperatorMappedOnlyInRandomBeacon: boolean
applications: ApplicationForOperatorMapping[]
}
> = ({
operator,
isOperatorMappedOnlyInTbtc,
isOperatorMappedOnlyInRandomBeacon,
closeModal,
}) => {
> = ({ applications, closeModal }) => {
const { account } = useWeb3React()
const { registerMultipleOperators } =
useRegisterMultipleOperatorsTransaction()
Expand All @@ -71,57 +66,77 @@ const MapOperatorToStakingProviderConfirmationModal: FC<
const onSuccess = useCallback<OnSuccessCallback>(
(receipt) => {
openModal(ModalType.MapOperatorToStakingProviderSuccess, {
transactions: [
{
txHash: receipt.transactionHash,
application: {
appName: isOperatorMappedOnlyInRandomBeacon
? "tbtc"
: "randomBeacon",
operator,
stakingProvider: account,
},
transactions: applications.map((app) => ({
txHash: receipt.transactionHash,
application: {
appName: app.appName,
operator: app.operator,
stakingProvider: app.stakingProvider,
},
],
})),
})
},
[openModal, operator, account]
[openModal, applications]
)
const [errorMessage, setErrorMessage] = useState("")
const onError = useCallback((error: Error) => {
setErrorMessage(error.message)
}, [])

const { sendTransaction: registerOperatorTbtc } =
useRegisterOperatorTransaction("tbtc", onSuccess)
useRegisterOperatorTransaction(
"tbtc",
(receipt) => onSuccess(receipt),
onError
)
const { sendTransaction: registerOperatorRandomBeacon } =
useRegisterOperatorTransaction("randomBeacon", onSuccess)
useRegisterOperatorTransaction(
"randomBeacon",
(receipt) => onSuccess(receipt),
onError
)
const { sendTransaction: registerOperatorTaco } = useBondOperatorTransaction(
"taco",
(receipt) => onSuccess(receipt),
onError
)

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())
},
})
if (!account) {
throw new Error(`Wallet not connected`)
}
const transactions = []
for (const app of applications) {
let transaction
switch (app.appName) {
case "tbtc":
transaction = await registerOperatorTbtc(app.operator)
break
case "randomBeacon":
transaction = await registerOperatorRandomBeacon(app.operator)
break
case "taco":
transaction = await registerOperatorTaco(account, app.operator)
break
michalsmiarowski marked this conversation as resolved.
Show resolved Hide resolved
default:
throw new Error(`Unsupported app name: ${app.appName}`)
}
} else if (isOperatorMappedOnlyInTbtc) {
const tx = await registerOperatorRandomBeacon(operator)
if (!tx) {
if (!transaction) {
openModal(ModalType.TransactionFailed, {
error: new Error(
"Transaction rejected. You are required to map the Operator Address for both apps."
errorMessage
? `Transaction rejected with error: ${errorMessage}`
: `Transaction rejected. You are required to map the Operator Address for ${app.appName}.`
),
isExpandableError: true,
closeModal: () => {
closeModal()
dispatch(mapOperatorToStakingProviderModalClosed())
},
})
return
}
} else {
await registerMultipleOperators(operator)
transactions.push(transaction)
}
}

Expand All @@ -135,26 +150,19 @@ const MapOperatorToStakingProviderConfirmationModal: FC<
</H5>
<BodyLg mt="4">
This will require{" "}
{isOperatorMappedOnlyInRandomBeacon || isOperatorMappedOnlyInTbtc
? "1 transaction"
: "2 transactions"}
{applications.filter((app) => app.operator).length +
" transaction(s)"}
. Each mapping is one transaction
</BodyLg>
</InfoBox>
{!isOperatorMappedOnlyInTbtc && (
<OperatorMappingConfirmation
appName="tbtc"
operator={operator}
stakingProvider={account ? account : AddressZero}
/>
)}
{!isOperatorMappedOnlyInRandomBeacon && (
{applications.map((app, index) => (
<OperatorMappingConfirmation
appName="random beacon"
operator={operator}
key={index}
appName={app.appName}
operator={app.operator}
stakingProvider={account ? account : AddressZero}
/>
)}
))}
</ModalBody>
<ModalFooter>
<Button onClick={closeModal} variant="outline" mr={2}>
Expand Down
Loading
Loading