diff --git a/components/EntropyDeploymentTable.tsx b/components/EntropyDeploymentTable.tsx index a2548408..9f1838f8 100644 --- a/components/EntropyDeploymentTable.tsx +++ b/components/EntropyDeploymentTable.tsx @@ -1,6 +1,110 @@ +import React, { useEffect, useState } from "react"; +import { ethers } from "ethers"; import { EntropyDeployment } from "./EntropyDeployments"; import { StyledTd } from "./Table"; +const ENTROPY_V2_ABI = [ + { + inputs: [], + name: "getDefaultProvider", + outputs: [ + { + internalType: "address", + name: "provider", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "provider", + type: "address", + }, + ], + name: "getProviderInfoV2", + outputs: [ + { + components: [ + { + internalType: "uint128", + name: "feeInWei", + type: "uint128", + }, + { + internalType: "uint128", + name: "accruedFeesInWei", + type: "uint128", + }, + { + internalType: "bytes32", + name: "originalCommitment", + type: "bytes32", + }, + { + internalType: "uint64", + name: "originalCommitmentSequenceNumber", + type: "uint64", + }, + { + internalType: "bytes", + name: "commitmentMetadata", + type: "bytes", + }, + { + internalType: "bytes", + name: "uri", + type: "bytes", + }, + { + internalType: "uint64", + name: "endSequenceNumber", + type: "uint64", + }, + { + internalType: "uint64", + name: "sequenceNumber", + type: "uint64", + }, + { + internalType: "bytes32", + name: "currentCommitment", + type: "bytes32", + }, + { + internalType: "uint64", + name: "currentCommitmentSequenceNumber", + type: "uint64", + }, + { + internalType: "address", + name: "feeManager", + type: "address", + }, + { + internalType: "bool", + name: "withCallback", + type: "bool", + }, + { + internalType: "uint32", + name: "defaultGasLimit", + type: "uint32", + }, + ], + internalType: "struct EntropyStructsV2.ProviderInfo", + name: "info", + type: "tuple", + }, + ], + stateMutability: "view", + type: "function", + }, +]; + const EntropyDeploymentTable = ({ deployments, showReveal, @@ -8,6 +112,52 @@ const EntropyDeploymentTable = ({ deployments: Record; showReveal: boolean; }) => { + const [gasLimits, setGasLimits] = useState>({}); + + useEffect(() => { + for (const [name, deployment] of Object.entries(deployments)) { + if (deployment.rpc) { + try { + const contract = new ethers.Contract( + deployment.address, + ENTROPY_V2_ABI, + ethers.getDefaultProvider(deployment.rpc) + ); + contract + .getDefaultProvider() + .then((defaultProvider: string) => { + contract + .getProviderInfoV2(defaultProvider) + .then((providerInfo: any) => { + const gasLimit = providerInfo.defaultGasLimit; + const formattedGasLimit = gasLimit.toString(); + setGasLimits((prev) => ({ + ...prev, + [name]: formattedGasLimit, + })); + }) + .catch(() => { + setGasLimits((prev) => ({ + ...prev, + [name]: deployment.gasLimit, + })); + }); + }) + .catch(() => { + setGasLimits((prev) => ({ + ...prev, + [name]: deployment.gasLimit, + })); + }); + } catch { + setGasLimits((prev) => ({ ...prev, [name]: deployment.gasLimit })); + } + } else { + setGasLimits((prev) => ({ ...prev, [name]: deployment.gasLimit })); + } + } + }, [deployments]); + const sortedDeployments = Object.entries(deployments).sort(); return ( @@ -44,7 +194,9 @@ const EntropyDeploymentTable = ({ {showReveal && {deployment.delay}} - {deployment.gasLimit} + + {gasLimits[name] === undefined ? "Loading..." : gasLimits[name]} + ))}