diff --git a/apps/contracts/src/BioVerifyV3.sol b/apps/contracts/src/BioVerifyV3.sol index f71029b..b860172 100644 --- a/apps/contracts/src/BioVerifyV3.sol +++ b/apps/contracts/src/BioVerifyV3.sol @@ -71,8 +71,7 @@ error BioVerify_NotAMember(); error BioVerify_InvalidPublicationId(uint256 pubId); error BioVerify_ClaimTooMuch(); error BioVerify_ClaimFailTransferTo(address member, uint256 amount); -error BioVerify_InsufficientPublisherFee(); -error BioVerify_MustPayPublisherStake(); +error BioVerify_InsufficientPayment(); error BioVerify_MustPayReviewerStake(); error BioVerify_AlreadyInReview(uint256 pubId); error BioVerify_CanNotSettle(uint256 pubId, PublicationStatus from, PublicationStatus to); @@ -245,15 +244,18 @@ contract BioVerifyV3 is VRFConsumerBaseV2Plus, ReentrancyGuard { } /** - * @notice Submits a new research publication and locks the publisher's stake. + * @notice Submits a new research publication and locks the publisher's fixed protocol stake. + * @dev The stake is always `I_PUBLISHER_STAKE`. The submission fee is derived from `msg.value` + * as `msg.value - I_PUBLISHER_STAKE`, allowing callers to overpay the fee (e.g. to cover VRF + * cost spikes) while enforcing a minimum fee via `I_PUBLISHER_MIN_FEE`. * @param _cid The IPFS content identifier of the publication. - * @param _paidSubmissionFee The fee paid to cover VRF and AI processing costs. */ - function submitPublication(string calldata _cid, uint256 _paidSubmissionFee) external payable { + function submitPublication(string calldata _cid) external payable { // Check - uint256 stake = msg.value - _paidSubmissionFee; - if (_paidSubmissionFee < I_PUBLISHER_MIN_FEE) revert BioVerify_InsufficientPublisherFee(); - if (msg.value != I_PUBLISHER_STAKE + _paidSubmissionFee) revert BioVerify_MustPayPublisherStake(); + if (msg.value < I_PUBLISHER_STAKE + I_PUBLISHER_MIN_FEE) revert BioVerify_InsufficientPayment(); + + uint256 stake = I_PUBLISHER_STAKE; + uint256 paidFee = msg.value - stake; // Effect uint256 pubId = nextPubId; @@ -262,7 +264,7 @@ contract BioVerifyV3 is VRFConsumerBaseV2Plus, ReentrancyGuard { pub.id = pubId; pub.publisher = msg.sender; pub.cid = _cid; - pub.paidSubmissionFee = _paidSubmissionFee; + pub.paidSubmissionFee = paidFee; pub.status = PublicationStatus.SUBMITTED; emit NewPublicationStatus(pubId, PublicationStatus.SUBMITTED); @@ -278,7 +280,7 @@ contract BioVerifyV3 is VRFConsumerBaseV2Plus, ReentrancyGuard { // Lock publisher stake on pubId. _lockStake(msg.sender, pubId, stake); - emit SubmitPublication(msg.sender, pubId, _cid, _paidSubmissionFee); + emit SubmitPublication(msg.sender, pubId, _cid, paidFee); nextPubId++; } diff --git a/apps/contracts/test/01_Helpers.t.sol b/apps/contracts/test/01_Helpers.t.sol index 9e7ca4b..fa985da 100644 --- a/apps/contracts/test/01_Helpers.t.sol +++ b/apps/contracts/test/01_Helpers.t.sol @@ -189,7 +189,7 @@ contract TestHelpers is BaseTest { function _submitDefaultPub() internal { vm.deal(publisher, 1 ether); vm.prank(publisher); - bioVerify.submitPublication{value: validPaidPublisherAmount}(FAKE_CID, publisherMinFee); + bioVerify.submitPublication{value: validPaidPublisherAmount}(FAKE_CID); } // Helpers to fill the reviewer pool before testing pickReviewers diff --git a/apps/contracts/test/04_SubmitPublication.t.sol b/apps/contracts/test/04_SubmitPublication.t.sol index 445aec1..d0a0098 100644 --- a/apps/contracts/test/04_SubmitPublication.t.sol +++ b/apps/contracts/test/04_SubmitPublication.t.sol @@ -5,8 +5,7 @@ import {TestHelpers} from "./01_Helpers.t.sol"; import { // errors - BioVerify_MustPayPublisherStake, - BioVerify_InsufficientPublisherFee, + BioVerify_InsufficientPayment, // enum PublicationStatus @@ -27,55 +26,29 @@ contract SubmitPublicationTest is TestHelpers { // 3. Execute vm.prank(publisher); - bioVerify.submitPublication{value: validValue}(FAKE_CID, publisherMinFee); + bioVerify.submitPublication{value: validValue}(FAKE_CID); } // ===== unhappy path - function test_RevertIf_StakeTooLow() public { - uint256 stakeTooLow = publisherStake - 1; - uint256 wrongTotal = publisherMinFee + stakeTooLow; + function test_RevertIf_InsufficientPayment() public { + // Anything below stake + min fee should revert. + uint256 insufficientTotal = publisherStake + publisherMinFee - 1; vm.deal(publisher, 1 ether); vm.prank(publisher); - vm.expectRevert(abi.encodeWithSelector(BioVerify_MustPayPublisherStake.selector)); - bioVerify.submitPublication{value: wrongTotal}(FAKE_CID, publisherMinFee); - } - - function test_RevertIf_StakeTooHigh() public { - uint256 stakeTooHigh = publisherStake + 1; - uint256 wrongTotal = publisherMinFee + stakeTooHigh; - - vm.deal(publisher, 1 ether); - vm.prank(publisher); - - vm.expectRevert(abi.encodeWithSelector(BioVerify_MustPayPublisherStake.selector)); - bioVerify.submitPublication{value: wrongTotal}(FAKE_CID, publisherMinFee); - } - - function test_RevertIf_InsufficientFee() public { - uint256 invalidFee = publisherMinFee - 1; - uint256 validTotal = publisherStake + publisherMinFee; - - vm.deal(publisher, 1 ether); - vm.prank(publisher); - - vm.expectRevert(abi.encodeWithSelector(BioVerify_InsufficientPublisherFee.selector)); - bioVerify.submitPublication{value: validTotal}(FAKE_CID, invalidFee); + vm.expectRevert(abi.encodeWithSelector(BioVerify_InsufficientPayment.selector)); + bioVerify.submitPublication{value: insufficientTotal}(FAKE_CID); } } contract FuzzSubmit is TestHelpers { - function testFuzz_SubmitPublication(uint256 fee, uint256 stake) public { - // Bound the inputs to realistic values to avoid overflow in test math - fee = bound(fee, publisherMinFee, 100 ether); - stake = bound(stake, publisherStake, publisherStake); - - uint256 total = fee + stake; + function testFuzz_SubmitPublication(uint256 total) public { + total = bound(total, publisherStake + publisherMinFee, 100 ether); vm.deal(publisher, total); vm.prank(publisher); - bioVerify.submitPublication{value: total}(FAKE_CID, fee); + bioVerify.submitPublication{value: total}(FAKE_CID); // Invariant: Contract balance must have increased by exactly 'total' assertEq(address(bioVerify).balance, DEPLOY_VALUE + total); diff --git a/apps/contracts/test/06_PickReviewers.t.sol b/apps/contracts/test/06_PickReviewers.t.sol index cc79bcc..979b051 100644 --- a/apps/contracts/test/06_PickReviewers.t.sol +++ b/apps/contracts/test/06_PickReviewers.t.sol @@ -72,7 +72,7 @@ contract PickReviewersTest is TestHelpers { // Submit publication vm.deal(publisher, 1 ether); vm.prank(publisher); - poorContract.submitPublication{value: validPaidPublisherAmount}(FAKE_CID, publisherMinFee); + poorContract.submitPublication{value: validPaidPublisherAmount}(FAKE_CID); // Fill reviewers pool for (uint256 i = 0; i < validMinReviewersPoolSize; ++i) { diff --git a/apps/contracts/test/07_FullfillVRF.t.sol b/apps/contracts/test/07_FullfillVRF.t.sol index 0716a15..68a4f23 100644 --- a/apps/contracts/test/07_FullfillVRF.t.sol +++ b/apps/contracts/test/07_FullfillVRF.t.sol @@ -201,8 +201,8 @@ contract FulfillVRFTest is TestHelpers { // 2. Submit 2 publications vm.deal(publisher, 2 ether); vm.startPrank(publisher); - poorContract.submitPublication{value: validPaidPublisherAmount}(FAKE_CID, publisherMinFee); - poorContract.submitPublication{value: validPaidPublisherAmount}(FAKE_CID, publisherMinFee); + poorContract.submitPublication{value: validPaidPublisherAmount}(FAKE_CID); + poorContract.submitPublication{value: validPaidPublisherAmount}(FAKE_CID); vm.stopPrank(); // 3. Fill reviewers pool diff --git a/apps/contracts/test/12_PoolManagement.t.sol b/apps/contracts/test/12_PoolManagement.t.sol index e578de5..7454f61 100644 --- a/apps/contracts/test/12_PoolManagement.t.sol +++ b/apps/contracts/test/12_PoolManagement.t.sol @@ -77,7 +77,7 @@ contract PoolManagementTest is TestHelpers { // Setup submit publication vm.deal(publisher, 1 ether); vm.prank(publisher); - bioVerifyWithRejectorTreasury.submitPublication{value: validPaidPublisherAmount}(FAKE_CID, publisherMinFee); + bioVerifyWithRejectorTreasury.submitPublication{value: validPaidPublisherAmount}(FAKE_CID); // Early slash publication to get publisherStake into slashPool vm.prank(aiAgentAddress); diff --git a/apps/fe/_config/viem/ws-clients.ts b/apps/fe/_config/viem/ws-clients.ts index a02b4f3..f2d8e82 100644 --- a/apps/fe/_config/viem/ws-clients.ts +++ b/apps/fe/_config/viem/ws-clients.ts @@ -10,13 +10,13 @@ import { baseSepolia, sepolia } from "viem/chains" */ export const createBaseSepoliaWsClient = () => - createPublicClient({ - chain: baseSepolia, - transport: webSocket(env.NEXT_PUBLIC_ALCHEMY_BASE_SEPOLIA_WSS), - }) + createPublicClient({ + chain: baseSepolia, + transport: webSocket(env.NEXT_PUBLIC_ALCHEMY_BASE_SEPOLIA_WSS), + }) export const createEthSepoliaWsClient = () => - createPublicClient({ - chain: sepolia, - transport: webSocket(env.NEXT_PUBLIC_ALCHEMY_ETH_SEPOLIA_WSS), - }) + createPublicClient({ + chain: sepolia, + transport: webSocket(env.NEXT_PUBLIC_ALCHEMY_ETH_SEPOLIA_WSS), + }) diff --git a/apps/fe/_config/wagmi/wagmi-config.ts b/apps/fe/_config/wagmi/wagmi-config.ts index 4e117fb..e898c15 100644 --- a/apps/fe/_config/wagmi/wagmi-config.ts +++ b/apps/fe/_config/wagmi/wagmi-config.ts @@ -1,6 +1,6 @@ /** * @title Wagmi & Reown Configuration - * @notice This file configures the Web3 provider layer, handling multi-chain + * @notice This file configures the Web3 provider layer, handling multi-chain * connectivity, replay protection, and server-side state hydration. * * High-Reliability Features: * 1. EIP-155 Replay Protection: Ensures transactions are chain-specific. @@ -15,7 +15,8 @@ import { cookieStorage, createStorage } from "@wagmi/core" import { http } from "wagmi" // --- Alchemy Configuration --- -const ALCHEMY_BASE_SEPOLIA_RPC_URL = env.NEXT_PUBLIC_ALCHEMY_BASE_SEPOLIA_RPC_URL +const ALCHEMY_BASE_SEPOLIA_RPC_URL = + env.NEXT_PUBLIC_ALCHEMY_BASE_SEPOLIA_RPC_URL const ALCHEMY_ETH_SEPOLIA_RPC_URL = env.NEXT_PUBLIC_ALCHEMY_ETH_SEPOLIA_RPC_URL const RAINBOWKIT_PROJECT_ID = env.NEXT_PUBLIC_RAINBOWKIT_PROJECT_ID || "" @@ -24,10 +25,10 @@ const networks = [sepolia, baseSepolia] /** * @notice Custom RPC Map using CAIP-2 (Chain Agnostic Improvement Proposals) * @dev CAIP-2 uses a `namespace:reference` format (e.g., "eip155:84532"). - * * Namespace (eip155): Identifies the EVM ecosystem based on EIP-155 standards, - * which prevent replay attacks by incorporating the Chain ID into the $v$ + * * Namespace (eip155): Identifies the EVM ecosystem based on EIP-155 standards, + * which prevent replay attacks by incorporating the Chain ID into the $v$ * value of the ECDSA signature. - * * Mapping these here ensures the Reown/AppKit Modal uses our dedicated Alchemy + * * Mapping these here ensures the Reown/AppKit Modal uses our dedicated Alchemy * nodes for balance checks instead of slower public RPCs. */ export const customRpcUrls = { @@ -46,7 +47,7 @@ export const customRpcUrls = { * @dev This adapter bridges Wagmi hooks with the Reown (formerly WalletConnect) AppKit. * * SSR & Storage: * - `ssr: true`: Enables hydration-safe rendering. - * - `cookieStorage`: Persists session state in HTTP headers, allowing the server + * - `cookieStorage`: Persists session state in HTTP headers, allowing the server * to recognize the user's wallet before the JS bundle loads, preventing UI flicker. * * Transports: * - HTTP-only via Alchemy. Real-time event subscriptions (WebSocket) are handled @@ -67,4 +68,4 @@ export const wagmiAdapter = new WagmiAdapter({ }, }) -export const reownConfig = wagmiAdapter.wagmiConfig \ No newline at end of file +export const reownConfig = wagmiAdapter.wagmiConfig diff --git a/apps/fe/_hooks/cqrs/commands/use-submit-publication.ts b/apps/fe/_hooks/cqrs/commands/use-submit-publication.ts index fd7bb9e..1ca980a 100644 --- a/apps/fe/_hooks/cqrs/commands/use-submit-publication.ts +++ b/apps/fe/_hooks/cqrs/commands/use-submit-publication.ts @@ -1,16 +1,15 @@ "use client" +import { reownConfig } from "@/_config/wagmi/wagmi-config" import { useMutation, useQueryClient } from "@tanstack/react-query" import { waitForTransactionReceipt, writeContract } from "@wagmi/core" import { toast } from "sonner" -import { reownConfig } from "@/_config/wagmi/wagmi-config" import { useContractConfig } from "../../use-contract-config" import { publicationsKeys } from "../query-keys/publications-keys" type PublicationArgs = { cid: string totalWeiValue: bigint - submissionFeeWeiValue: bigint } export const useSubmitPublication = () => { @@ -19,13 +18,13 @@ export const useSubmitPublication = () => { return useMutation({ mutationFn: async (args: PublicationArgs) => { - const { cid, totalWeiValue, submissionFeeWeiValue } = args + const { cid, totalWeiValue } = args // Trigger Wallet const hash = await writeContract(reownConfig, { ...contractConfig, functionName: "submitPublication", - args: [cid, submissionFeeWeiValue], + args: [cid], value: totalWeiValue, }) diff --git a/apps/fe/_hooks/websockets/use-watch-new-publication-status-event.ts b/apps/fe/_hooks/websockets/use-watch-new-publication-status-event.ts index 88cbfdc..5978bab 100644 --- a/apps/fe/_hooks/websockets/use-watch-new-publication-status-event.ts +++ b/apps/fe/_hooks/websockets/use-watch-new-publication-status-event.ts @@ -41,8 +41,7 @@ const INVALIDATION_DELAY_MS = 3_000 const baseSepoliaConfig = BioVerifyContractConfig[NetworkSchema.enum.base_sepolia] -const ethSepoliaConfig = - BioVerifyContractConfig[NetworkSchema.enum.eth_sepolia] +const ethSepoliaConfig = BioVerifyContractConfig[NetworkSchema.enum.eth_sepolia] export const useWatchNewPublicationStatusEvent = () => { const queryClient = useQueryClient() @@ -80,9 +79,7 @@ export const useWatchNewPublicationStatusEvent = () => { }) if (process.env.NODE_ENV === "development") { - console.log( - `[WS] Cache invalidated for pubIds: ${pubIds.join(", ")}`, - ) + console.log(`[WS] Cache invalidated for pubIds: ${pubIds.join(", ")}`) } }, INVALIDATION_DELAY_MS) }, diff --git a/apps/fe/app/(routes)/publications/new/_components/fee-calculator.tsx b/apps/fe/app/(routes)/publications/new/_components/fee-calculator.tsx index e91a490..193c67b 100644 --- a/apps/fe/app/(routes)/publications/new/_components/fee-calculator.tsx +++ b/apps/fe/app/(routes)/publications/new/_components/fee-calculator.tsx @@ -1,40 +1,26 @@ "use client" +import { TypographyP, TypographySmall } from "@/app/_components/typography" +import { Card, CardContent } from "@/components/ui/card" +import { Skeleton } from "@/components/ui/skeleton" import { AlertCircleIcon, FuelIcon, LandmarkIcon, WalletIcon, } from "lucide-react" -import { type FC, useMemo } from "react" -import { formatEther, parseEther } from "viem" -import { TypographyP, TypographySmall } from "@/app/_components/typography" -import { Card, CardContent } from "@/components/ui/card" -import { Skeleton } from "@/components/ui/skeleton" +import type { FC } from "react" +import { formatEther } from "viem" type Props = { - userStakeInput: string - minStakeWei: bigint | null // From Server Component + stakeWei: bigint | null // From protocol config effectiveFeeWei: bigint | null // From custom hook } -export const FeeCalculator: FC = ({ - userStakeInput, - minStakeWei, - effectiveFeeWei, -}) => { - const isLoading = minStakeWei === null || effectiveFeeWei === null +export const FeeCalculator: FC = ({ stakeWei, effectiveFeeWei }) => { + const isLoading = stakeWei === null || effectiveFeeWei === null - const stakeWei = useMemo(() => { - try { - return parseEther(userStakeInput || "0") - } catch { - return 0n - } - }, [userStakeInput]) - - const totalWei = !isLoading ? stakeWei + (effectiveFeeWei ?? 0n) : 0n - const isInsufficient = !isLoading && stakeWei < (minStakeWei ?? 0n) + const totalWei = !isLoading ? (stakeWei ?? 0n) + (effectiveFeeWei ?? 0n) : 0n return ( @@ -42,14 +28,10 @@ export const FeeCalculator: FC = ({ Submission Audit - {isInsufficient && ( -
- - - Below Min Stake - -
- )} +
+ + Fixed stake +
@@ -75,33 +57,35 @@ export const FeeCalculator: FC = ({ )} - {/* Requirement 2: The Stake */} + {/* Requirement 2: The Stake (fixed) */}
- Your Research Stake + Publisher Stake
- Minimum required: + Protocol-defined: {isLoading ? ( ) : ( - {minStakeWei ? formatEther(minStakeWei) : "0"} ETH + {stakeWei ? formatEther(stakeWei) : "0"} ETH )}
- - {userStakeInput || "0.00"} ETH - + {isLoading ? ( + + ) : ( + + {formatEther(stakeWei ?? 0n)} ETH + + )}
{/* The Final msg.value */} diff --git a/apps/fe/app/(routes)/publications/new/_components/stake-amount-input.tsx b/apps/fe/app/(routes)/publications/new/_components/stake-amount-input.tsx deleted file mode 100644 index 6bf3244..0000000 --- a/apps/fe/app/(routes)/publications/new/_components/stake-amount-input.tsx +++ /dev/null @@ -1,65 +0,0 @@ -"use client" - -import { Coins } from "lucide-react" -import type { FC } from "react" -import { Controller, useFormContext } from "react-hook-form" -import { formatEther } from "viem" -import { - Field, - FieldDescription, - FieldError, - FieldLabel, -} from "@/components/ui/field" -import { Input } from "@/components/ui/input" - -type Props = { - minStakeWei: bigint -} - -export const StakeAmountInput: FC = (props) => { - const { minStakeWei } = props - - const { control } = useFormContext() - const minStakeEth = formatEther(minStakeWei) - - return ( - ( - -
- - - Research Stake (ETH) * - -
- -
- -
- ETH -
-
- - - Minimum required stake for this publication is{" "} - {minStakeEth} ETH. This amount is locked in the - protocol and returned upon successful validation. - - - {fieldState.invalid && } -
- )} - /> - ) -} diff --git a/apps/fe/app/(routes)/publications/new/_components/submit-publication-form.tsx b/apps/fe/app/(routes)/publications/new/_components/submit-publication-form.tsx index 1781b55..ef0ad29 100644 --- a/apps/fe/app/(routes)/publications/new/_components/submit-publication-form.tsx +++ b/apps/fe/app/(routes)/publications/new/_components/submit-publication-form.tsx @@ -45,7 +45,6 @@ import { FeeCalculator } from "./fee-calculator" import { FileInput } from "./file-input" import { LicenseInput } from "./license-input" import { ManuscriptInput } from "./manuscript-input" -import { StakeAmountInput } from "./stake-amount-input" import { TitleInput } from "./title-input" const defaultAuthorWallet = (): NonNullable< @@ -67,7 +66,6 @@ const DEFAULT_VALUES: DefaultValues = { }, ], files: [], - stakeAmount: "", } const emptyContributorAuthor = @@ -103,8 +101,7 @@ export const SubmitPublicationForm: FC = (props) => { defaultValues: DEFAULT_VALUES, mode: "onChange", // for real-time FeeCalculator updates }) - - const stakeAmount = form.watch("stakeAmount") + const publisherStakeWei = parseEther(publisherStake) const isIpfsUploading = form.formState.isSubmitting const isDisabled = isTransactionPending || isIpfsUploading @@ -142,13 +139,11 @@ export const SubmitPublicationForm: FC = (props) => { } // 2. Blockchain Transaction - const totalWeiValueSent = - parseEther(payload.stakeAmount) + effectiveSubmissionFeeWei + const totalWeiValueSent = publisherStakeWei + effectiveSubmissionFeeWei await mutateAsync({ cid: rootCid, totalWeiValue: totalWeiValueSent, - submissionFeeWeiValue: effectiveSubmissionFeeWei, }) // 3. Success -> Redirect @@ -162,7 +157,7 @@ export const SubmitPublicationForm: FC = (props) => { console.error("Form submission error:", e) } }, - [mutateAsync, effectiveSubmissionFeeWei, router], + [mutateAsync, effectiveSubmissionFeeWei, publisherStakeWei, router], ) return ( @@ -249,7 +244,10 @@ export const SubmitPublicationForm: FC = (props) => { 5. Protocol Economics - + + The publisher stake is fixed by the protocol. Your wallet will + prompt the exact amount (stake + fee). +
@@ -268,8 +266,7 @@ export const SubmitPublicationForm: FC = (props) => { } /> diff --git a/apps/fe/app/(routes)/publications/new/_schemas/submit-publication-form.ts b/apps/fe/app/(routes)/publications/new/_schemas/submit-publication-form.ts index 94e63d2..98021ae 100644 --- a/apps/fe/app/(routes)/publications/new/_schemas/submit-publication-form.ts +++ b/apps/fe/app/(routes)/publications/new/_schemas/submit-publication-form.ts @@ -1,10 +1,8 @@ -import { EthAmountSchema, IpfsPublicationSchema } from "@packages/schema" +import { IpfsPublicationSchema } from "@packages/schema" import type { z } from "zod" // Submit Publication Form Schema -export const SubmitPublicationFormSchema = IpfsPublicationSchema.extend({ - stakeAmount: EthAmountSchema, -}) +export const SubmitPublicationFormSchema = IpfsPublicationSchema export type SubmitPublicationFormT = z.infer /** Use for `react-hook-form` values; avoids output-only brands (e.g. `0x${string}`) on `address`. */ diff --git a/packages/utils/protocol/bioverfiy-contract-config.ts b/packages/utils/protocol/bioverfiy-contract-config.ts index 2140f71..517643d 100644 --- a/packages/utils/protocol/bioverfiy-contract-config.ts +++ b/packages/utils/protocol/bioverfiy-contract-config.ts @@ -426,11 +426,6 @@ export const bioVerifyAbi = [ type: "string", internalType: "string", }, - { - name: "_paidSubmissionFee", - type: "uint256", - internalType: "uint256", - }, ], outputs: [], stateMutability: "payable", @@ -987,7 +982,7 @@ export const bioVerifyAbi = [ }, { type: "error", - name: "BioVerify_InsufficientPublisherFee", + name: "BioVerify_InsufficientPayment", inputs: [], }, { @@ -1066,11 +1061,6 @@ export const bioVerifyAbi = [ }, ], }, - { - type: "error", - name: "BioVerify_MustPayPublisherStake", - inputs: [], - }, { type: "error", name: "BioVerify_MustPayReviewerStake", @@ -1136,12 +1126,12 @@ export const bioVerifyAbi = [ ] const bioVerifyConfigBaseSepolia: ContractConfig = { - address: "0x76654c2cdadcf869e78928f0785797b6be20f11b", + address: "0xf569d7b5016de6ef0f16fcae82d85d61249df31d", abi: bioVerifyAbi as Abi, } const bioVerifyConfigEthSepolia: ContractConfig = { - address: "0x7d52170db31be4ab3d0166fbba937a031dc6e1ff", + address: "0xfce6990d551a60f8640a498b6bc34a15822ba3e3", abi: bioVerifyAbi as Abi, }