diff --git a/examples/CRISP/.env.example b/examples/CRISP/.env.example new file mode 100644 index 0000000000..39a8d1ac53 --- /dev/null +++ b/examples/CRISP/.env.example @@ -0,0 +1,9 @@ +# This is mostly for testing if we want to setup multiple ciphernodes on a single machine for a testnet such as sepolia + +# These are hardhat's default accounts' private keys +PRIVATE_KEY_AG="0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80" +PRIVATE_KEY_CN1="0x59c6995e998f97a5a0044966f0945389dc9e86dae88c7a8412f4603b6b78690d" +PRIVATE_KEY_CN2="0x5de4111afa1a4b94908f83103eb1f1706367c2e68ca870fc3fb9a804cdab365a" +PRIVATE_KEY_CN3="0x7c852118294e51e653712a81e05800f419141751be58f605c371e15141b007a6" +PRIVATE_KEY_CN4="0x47e179ec197488593b187f80a00eb0da91f1b9d0b13f8733639f19c30a34926a" +PRIVATE_KEY_CN5="0x8b3a350cf5c34c9194ca85829a2df0ec3153be0318b5e2d3348e872092edffba" diff --git a/examples/CRISP/package.json b/examples/CRISP/package.json index b289ea149f..c474e5e7fd 100644 --- a/examples/CRISP/package.json +++ b/examples/CRISP/package.json @@ -16,6 +16,8 @@ "test:e2e": "bash ./scripts/test_e2e.sh", "compile:contracts": "pnpm -C packages/crisp-contracts compile", "ciphernode:add": "pnpm -C packages/crisp-contracts ciphernode:add", + "ciphernode:mint:tokens": "pnpm -C packages/crisp-contracts ciphernode:mint:tokens", + "ciphernode:add:self": "pnpm -C packages/crisp-contracts ciphernode:add:self", "test": "pnpm test:e2e", "test:circuits:inputs": "node --test test/governanceCircuit.test.ts", "test:circuits": "cd circuits && nargo test", @@ -23,7 +25,8 @@ "test:sdk": "cd sdk && pnpm test", "release:sdk": "cd sdk && pnpm release", "report": "playwright show-report", - "publish:packages": "tsx scripts/publish.ts" + "publish:packages": "tsx scripts/publish.ts", + "setup:testnet": "bash ./scripts/setup_testnet.sh" }, "devDependencies": { "@playwright/test": "1.52.0", diff --git a/examples/CRISP/packages/crisp-contracts/deployed_contracts.json b/examples/CRISP/packages/crisp-contracts/deployed_contracts.json index c0188da069..4c548def6f 100644 --- a/examples/CRISP/packages/crisp-contracts/deployed_contracts.json +++ b/examples/CRISP/packages/crisp-contracts/deployed_contracts.json @@ -1,233 +1,122 @@ { - "mainnet": { - "RiscZeroGroth16Verifier": { - "address": "0x8EaB2D97Dfce405A1692a21b3ff3A172d593D319" - } - }, "sepolia": { - "RiscZeroGroth16Verifier": { - "address": "0x925d8331ddc0a1F0d96E68CF073DFE1d92b69187" - }, - "PoseidonT3": { - "blockNumber": 9473284, - "address": "0x3333333C0A88F9BE4fd23ed0536F9B6c427e3B93" - }, - "Enclave": { - "constructorArgs": { - "owner": "0x4f1f3a157073A35515C4fC4A8af2F1Af088f0676", - "registry": "0x0000000000000000000000000000000000000001", - "maxDuration": "2592000", - "params": [ - "0x000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000fc00100000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000003fffffff000001" - ] - }, - "blockNumber": 9473285, - "address": "0xeF857ba8231E4B8ea4E5DC9CC0891D70BC8E35B8" - }, - "CiphernodeRegistryOwnable": { - "constructorArgs": { - "owner": "0x4f1f3a157073A35515C4fC4A8af2F1Af088f0676", - "enclaveAddress": "0xeF857ba8231E4B8ea4E5DC9CC0891D70BC8E35B8" - }, - "blockNumber": 9473286, - "address": "0x9c45A278A1C36B50fF1687C8DFdb123d2214BE34" - }, - "NaiveRegistryFilter": { - "constructorArgs": { - "owner": "0x4f1f3a157073A35515C4fC4A8af2F1Af088f0676", - "ciphernodeRegistryAddress": "0x9c45A278A1C36B50fF1687C8DFdb123d2214BE34" - }, - "blockNumber": 9473287, - "address": "0xbbdF6af7EBe4Ad730C726af2f40dAa867B2C0D35" - }, - "MockComputeProvider": { - "blockNumber": 9473289, - "address": "0x6C0cE8865D822803E072486D7ea0c5dEC076a066" - }, - "MockDecryptionVerifier": { - "blockNumber": 9473290, - "address": "0x3E6a993EE75C73dA0BAF5a86a9716190d2b0920f" - }, - "MockInputValidator": { - "blockNumber": 9473291, - "address": "0x4F1c2BBfE0a827EAF4A7CA912f51DdAd2281819F" - }, - "MockE3Program": { - "constructorArgs": { - "mockInputValidator": "0x4F1c2BBfE0a827EAF4A7CA912f51DdAd2281819F" - }, - "blockNumber": 9473292, - "address": "0xf69076Aa814a6206C3f049Ea8D1217495793AABa" - }, - "MockRISC0Verifier": { - "address": "0xb9384e2b88A69E69149554F31288a8c305859463" - }, - "CRISPInputValidatorFactory": { - "address": "0x20e599457c864241F46A38550ba3dCAAbeC20B48", - "constructorArgs": { - "inputValidator": "0x4F1c2BBfE0a827EAF4A7CA912f51DdAd2281819F" - } - }, - "HonkVerifier": { - "address": "0xD3c89CD0B492f55F49203A0Da25d7ca744298B8d" - }, - "CRISPProgram": { - "address": "0x26fd7066b28C0e18db3Bbfb7163f16e58597C273", - "constructorArgs": { - "enclave": "0xeF857ba8231E4B8ea4E5DC9CC0891D70BC8E35B8", - "verifierAddress": "0xb9384e2b88A69E69149554F31288a8c305859463", - "inputValidatorAddress": "0x4F1c2BBfE0a827EAF4A7CA912f51DdAd2281819F", - "honkVerifierAddress": "0xD3c89CD0B492f55F49203A0Da25d7ca744298B8d", - "imageId": "0x23734b77b0f76e85623a88d7a82f24c34c94834f2501964ea123b7a2027013a2" - } - } - }, - "undefined": { - "RiscZeroGroth16Verifier": { - "address": "0x5FbDB2315678afecb367f032d93F642f64180aa3" - }, - "CRISPInputValidator": { - "address": "0x5FbDB2315678afecb367f032d93F642f64180aa3" - }, - "PoseidonT3": { - "blockNumber": 3, - "address": "0x3333333C0A88F9BE4fd23ed0536F9B6c427e3B93" - } - }, - "default": { - "MockUSDC": { - "constructorArgs": { - "initialSupply": "1000000" - }, - "blockNumber": 1, - "address": "0x5FbDB2315678afecb367f032d93F642f64180aa3" - }, - "EnclaveToken": { - "constructorArgs": { - "owner": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266" - }, - "blockNumber": 1, - "address": "0x5FbDB2315678afecb367f032d93F642f64180aa3" - } - }, - "localhost": { "PoseidonT3": { - "blockNumber": 3, + "blockNumber": 9614015, "address": "0x3333333C0A88F9BE4fd23ed0536F9B6c427e3B93" }, "MockUSDC": { "constructorArgs": { "initialSupply": "1000000" }, - "blockNumber": 4, - "address": "0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0" + "blockNumber": 9614016, + "address": "0x8363d6fE06BDF6ff8F06738f4e25b94AF7Fa211e" }, "EnclaveToken": { "constructorArgs": { - "owner": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266" + "owner": "0x4f1f3a157073A35515C4fC4A8af2F1Af088f0676" }, - "blockNumber": 5, - "address": "0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9" + "blockNumber": 9614017, + "address": "0xD3186014A42a3eD26521e87FFADe7c7a6A314D44" }, "EnclaveTicketToken": { "constructorArgs": { - "baseToken": "0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0", + "baseToken": "0x8363d6fE06BDF6ff8F06738f4e25b94AF7Fa211e", "registry": "0x0000000000000000000000000000000000000001", - "owner": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266" + "owner": "0x4f1f3a157073A35515C4fC4A8af2F1Af088f0676" }, - "blockNumber": 7, - "address": "0x5FC8d32690cc91D4c39d9d3abcBD16989F875707" + "blockNumber": 9614018, + "address": "0xD581Dd5716A1775571e0Bd886429f84b3018231c" }, "SlashingManager": { "constructorArgs": { - "admin": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "admin": "0x4f1f3a157073A35515C4fC4A8af2F1Af088f0676", "bondingRegistry": "0x0000000000000000000000000000000000000001" }, - "blockNumber": 8, - "address": "0x0165878A594ca255338adfa4d48449f69242Eb8F" + "blockNumber": 9614019, + "address": "0x588551C640F602BF6Cad5367C0651018F375bA3D" }, "BondingRegistry": { "constructorArgs": { - "owner": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", - "ticketToken": "0x5FC8d32690cc91D4c39d9d3abcBD16989F875707", - "licenseToken": "0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9", + "owner": "0x4f1f3a157073A35515C4fC4A8af2F1Af088f0676", + "ticketToken": "0xD581Dd5716A1775571e0Bd886429f84b3018231c", + "licenseToken": "0xD3186014A42a3eD26521e87FFADe7c7a6A314D44", "registry": "0x0000000000000000000000000000000000000001", - "slashedFundsTreasury": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "slashedFundsTreasury": "0x4f1f3a157073A35515C4fC4A8af2F1Af088f0676", "ticketPrice": "10000000", "licenseRequiredBond": "100000000000000000000", "minTicketBalance": "1", "exitDelay": "604800" }, - "blockNumber": 8, - "address": "0x2279B7A0a67DB372996a5FaB50D91eAA73d2eBe6", - "implementationAddress": "0xa513E6E4b8f2a923D98304ec87F64353C4D5C853" + "blockNumber": 9614019, + "address": "0x0dEF7a61373998067B7d4C61659328F7296A18ad", + "implementationAddress": "0x1958d52f4534B5881B06011Bc5f68aeE9a31D90B" }, "CiphernodeRegistryOwnable": { "constructorArgs": { - "owner": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "owner": "0x4f1f3a157073A35515C4fC4A8af2F1Af088f0676", "enclaveAddress": "0x0000000000000000000000000000000000000001", "submissionWindow": "10" }, - "blockNumber": 11, - "address": "0x610178dA211FEF7D417bC0e6FeD39F05609AD788", - "implementationAddress": "0x8A791620dd6260079BF849Dc5567aDC3F2FdC318" + "blockNumber": 9614022, + "address": "0xa31da59c60a221CFd7C4d2080D7BBfF5F9739c4d", + "implementationAddress": "0x81BBcC759C558F7dCb234fEb20Fbd7dEa7247D0f" }, "Enclave": { "constructorArgs": { - "owner": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", - "registry": "0x610178dA211FEF7D417bC0e6FeD39F05609AD788", - "bondingRegistry": "0x2279B7A0a67DB372996a5FaB50D91eAA73d2eBe6", - "feeToken": "0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0", + "owner": "0x4f1f3a157073A35515C4fC4A8af2F1Af088f0676", + "registry": "0xa31da59c60a221CFd7C4d2080D7BBfF5F9739c4d", + "bondingRegistry": "0x0dEF7a61373998067B7d4C61659328F7296A18ad", + "feeToken": "0x8363d6fE06BDF6ff8F06738f4e25b94AF7Fa211e", "maxDuration": "2592000", "params": [ "0x000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000fc00100000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000003fffffff000001" ] }, - "blockNumber": 13, - "address": "0xA51c1fc2f0D1a1b8494Ed1FE312d7C3a78Ed91C0", - "implementationAddress": "0xB7f8BC63BbcaD18155201308C8f3540b07f84F5e" + "blockNumber": 9614024, + "address": "0xafF0BCfF301fB4635bEA961DA49612aCfC79A8Cb", + "implementationAddress": "0xB0E546Db661408EB6Be21d8958dD7B87fb77b1F5" }, "MockComputeProvider": { - "blockNumber": 23, - "address": "0x59b670e9fA9D0A427751Af201D676719a970857b" + "blockNumber": 9614031, + "address": "0x4a0431fF900B959dd0080C6AAFc94B73fB5Cf1B7" }, "MockDecryptionVerifier": { - "blockNumber": 24, - "address": "0x4ed7c70F96B99c776995fB64377f0d4aB3B0e1C1" + "blockNumber": 9614032, + "address": "0x46a5cF0d9FaaE667FB596E3bfAb2B3aE8433A890" }, "MockInputValidator": { - "blockNumber": 25, - "address": "0x322813Fd9A801c5507c9de605d63CEA4f2CE6c44" + "blockNumber": 9614033, + "address": "0xBdaFF5aD8a00d05a4ECeE946f3721286d312681a" }, "MockE3Program": { "constructorArgs": { - "mockInputValidator": "0x322813Fd9A801c5507c9de605d63CEA4f2CE6c44" + "mockInputValidator": "0xBdaFF5aD8a00d05a4ECeE946f3721286d312681a" }, - "blockNumber": 26, - "address": "0xa85233C63b9Ee964Add6F2cffe00Fd84eb32338f" + "blockNumber": 9614034, + "address": "0x33BBadcf70d843Cd074Ff8D151211f647e219e7A" }, "MockRISC0Verifier": { - "address": "0x09635F643e140090A9A8Dcd712eD6285858ceBef" + "address": "0x6c39658221603adBd02f956574efdb3c75822F0f" }, - "CRISPInputValidator": { - "address": "0xc5a5C42992dECbae36851359345FE25997F5C42d" + "MockCRISPInputValidator": { + "address": "0x1D396BC1334900c9B1b62672B34127A1A127c718" }, "CRISPInputValidatorFactory": { - "address": "0x67d269191c92Caf3cD7723F116c85e6E9bf55933", + "address": "0xfD39C325D7914d48eAB591e511079E1CdBf32217", "constructorArgs": { - "inputValidator": "0xc5a5C42992dECbae36851359345FE25997F5C42d" + "inputValidator": "0x1D396BC1334900c9B1b62672B34127A1A127c718" } }, "HonkVerifier": { - "address": "0xE6E340D132b5f46d1e472DebcD681B2aBc16e57E" + "address": "0x2Db157578d13116bF7668bA7c5E0F50f2CD29e07" }, "CRISPProgram": { - "address": "0xc3e53F4d16Ae77Db1c982e75a937B9f60FE63690", + "address": "0x68EB7F4482BD7331c54fa5EbDBA145C37D42Ff26", "constructorArgs": { - "enclave": "0xA51c1fc2f0D1a1b8494Ed1FE312d7C3a78Ed91C0", - "verifierAddress": "0x09635F643e140090A9A8Dcd712eD6285858ceBef", - "inputValidatorAddress": "0xc5a5C42992dECbae36851359345FE25997F5C42d", - "honkVerifierAddress": "0xE6E340D132b5f46d1e472DebcD681B2aBc16e57E", + "enclave": "0xafF0BCfF301fB4635bEA961DA49612aCfC79A8Cb", + "verifierAddress": "0x6c39658221603adBd02f956574efdb3c75822F0f", + "inputValidatorAddress": "0x1D396BC1334900c9B1b62672B34127A1A127c718", + "honkVerifierAddress": "0x2Db157578d13116bF7668bA7c5E0F50f2CD29e07", "imageId": "0x23734b77b0f76e85623a88d7a82f24c34c94834f2501964ea123b7a2027013a2" } } diff --git a/examples/CRISP/packages/crisp-contracts/hardhat.config.ts b/examples/CRISP/packages/crisp-contracts/hardhat.config.ts index 1875a830b1..f7ea54a076 100644 --- a/examples/CRISP/packages/crisp-contracts/hardhat.config.ts +++ b/examples/CRISP/packages/crisp-contracts/hardhat.config.ts @@ -9,6 +9,7 @@ import { cleanDeploymentsTask } from "@enclave-e3/contracts/tasks/utils"; import { ciphernodeAdd, ciphernodeAdminAdd, + ciphernodeMintTokens, } from "@enclave-e3/contracts/tasks/ciphernode"; import dotenv from "dotenv"; @@ -74,7 +75,7 @@ const config: HardhatUserConfig = { hardhatToolboxMochaEthersPlugin, hardhatVerify, ], - tasks: [cleanDeploymentsTask, ciphernodeAdd, ciphernodeAdminAdd], + tasks: [cleanDeploymentsTask, ciphernodeAdd, ciphernodeAdminAdd, ciphernodeMintTokens], networks: { hardhat: { type: "edr-simulated", diff --git a/examples/CRISP/packages/crisp-contracts/package.json b/examples/CRISP/packages/crisp-contracts/package.json index 93d4c0b3b7..ec583a3277 100644 --- a/examples/CRISP/packages/crisp-contracts/package.json +++ b/examples/CRISP/packages/crisp-contracts/package.json @@ -29,6 +29,8 @@ "scripts": { "compile": "hardhat compile", "ciphernode:add": "hardhat ciphernode:admin-add", + "ciphernode:mint:tokens": "hardhat ciphernode:mint-tokens", + "ciphernode:add:self": "hardhat ciphernode:add", "clean:deployments": "hardhat utils:clean-deployments", "deploy:contracts": "hardhat run deploy/deploy.ts", "deploy:contracts:full": "export DEPLOY_ENCLAVE=true && pnpm deploy:contracts", diff --git a/examples/CRISP/scripts/setup_testnet.sh b/examples/CRISP/scripts/setup_testnet.sh new file mode 100644 index 0000000000..081d23e5a1 --- /dev/null +++ b/examples/CRISP/scripts/setup_testnet.sh @@ -0,0 +1,89 @@ +#!/usr/bin/env bash + +set -euo pipefail + +export CARGO_INCREMENTAL=1 + +# nuke past installations as we are adding these nodes to the contract +rm -rf ./.enclave/data +rm -rf ./.enclave/config + +cleanup() { + echo "Cleaning up processes..." + pkill -9 -f "enclave start" + sleep 1 + + # Kill any remaining background jobs from this script + jobs -p | xargs kill -9 2>/dev/null || true + + # Give processes a moment to terminate + sleep 1 + + + echo "Cleanup complete" + exit 0 +} + +trap cleanup INT TERM + +echo "TESTNET SCRIPT STARTING..." + +# Read .env +if [ ! -f .env ]; then + echo "Error: .env file not found. Please copy .env.example to .env and configure it." + exit 1 +fi +source .env + +enclave wallet set --name ag --private-key "$PRIVATE_KEY_AG" +enclave wallet set --name cn1 --private-key "$PRIVATE_KEY_CN1" +enclave wallet set --name cn2 --private-key "$PRIVATE_KEY_CN2" +enclave wallet set --name cn3 --private-key "$PRIVATE_KEY_CN3" +enclave wallet set --name cn4 --private-key "$PRIVATE_KEY_CN4" +enclave wallet set --name cn5 --private-key "$PRIVATE_KEY_CN5" + +# using & instead of -d so that wait works below +# TODO: add --experimental-trbfv after testing +enclave nodes up -v & + +sleep 2 + +CN1=$(yq -r '.nodes.cn1.address' ./enclave.config.yaml) +CN2=$(yq -r '.nodes.cn2.address' ./enclave.config.yaml) +CN3=$(yq -r '.nodes.cn3.address' ./enclave.config.yaml) +CN4=$(yq -r '.nodes.cn4.address' ./enclave.config.yaml) +CN5=$(yq -r '.nodes.cn5.address' ./enclave.config.yaml) + +echo "Minting tokens" + +# The aggregator is supposed to be the contract owner for testing +export PRIVATE_KEY="$PRIVATE_KEY_AG" + +pnpm ciphernode:mint:tokens --ciphernode-address "$CN1" --network "sepolia" +pnpm ciphernode:mint:tokens --ciphernode-address "$CN2" --network "sepolia" +pnpm ciphernode:mint:tokens --ciphernode-address "$CN3" --network "sepolia" +pnpm ciphernode:mint:tokens --ciphernode-address "$CN4" --network "sepolia" +pnpm ciphernode:mint:tokens --ciphernode-address "$CN5" --network "sepolia" + +echo "Adding ciphernodes to the contract" + +export PRIVATE_KEY="$PRIVATE_KEY_CN1" +pnpm ciphernode:add:self --network "sepolia" +export PRIVATE_KEY="$PRIVATE_KEY_CN2" +pnpm ciphernode:add:self --network "sepolia" +export PRIVATE_KEY="$PRIVATE_KEY_CN3" +pnpm ciphernode:add:self --network "sepolia" +export PRIVATE_KEY="$PRIVATE_KEY_CN4" +pnpm ciphernode:add:self --network "sepolia" +export PRIVATE_KEY="$PRIVATE_KEY_CN5" +pnpm ciphernode:add:self --network "sepolia" + +echo "CIPHERNODES HAVE BEEN ADDED." + +# wait + +concurrently -kr \ + --names "PROGRAM SERVER,CRISP SERVER" \ + --prefix-colors "blue,green" \ + "./scripts/dev_program.sh" \ + "./scripts/dev_server.sh" \ No newline at end of file diff --git a/examples/CRISP/server/src/cli/approve.rs b/examples/CRISP/server/src/cli/approve.rs index c248fa3df3..fe2b848b59 100644 --- a/examples/CRISP/server/src/cli/approve.rs +++ b/examples/CRISP/server/src/cli/approve.rs @@ -31,7 +31,7 @@ pub async fn approve_token( let token_address: Address = token_address.parse()?; let spender_address: Address = spender_address.parse()?; let signer: PrivateKeySigner = private_key.parse()?; - let wallet = EthereumWallet::from(signer); + let wallet = EthereumWallet::from(signer.clone()); let provider = ProviderBuilder::new() .wallet(wallet) @@ -39,8 +39,7 @@ pub async fn approve_token( .await?; let contract = ERC20::new(token_address, &provider); - - let owner = provider.get_accounts().await?[0]; + let owner = signer.clone().address(); let current_allowance = contract.allowance(owner, spender_address).call().await?; log::info!("Current allowance: {}", current_allowance); diff --git a/examples/CRISP/server/src/server/token_holders/etherscan.rs b/examples/CRISP/server/src/server/token_holders/etherscan.rs index 9e1ca54245..5a3bcb0a65 100644 --- a/examples/CRISP/server/src/server/token_holders/etherscan.rs +++ b/examples/CRISP/server/src/server/token_holders/etherscan.rs @@ -444,7 +444,7 @@ impl EtherscanClient { let token = ERC20Votes::new(token_address, provider); let votes = token - .getPastVotes(voter_address, U256::from(block_number)) + .getPastVotes(voter_address, U256::from(block_number - 1)) .call() .await .context("Failed to call getPastVotes")?; diff --git a/packages/enclave-contracts/contracts/registry/CiphernodeRegistryOwnable.sol b/packages/enclave-contracts/contracts/registry/CiphernodeRegistryOwnable.sol index 25ade0f694..549ae3cea3 100644 --- a/packages/enclave-contracts/contracts/registry/CiphernodeRegistryOwnable.sol +++ b/packages/enclave-contracts/contracts/registry/CiphernodeRegistryOwnable.sol @@ -492,8 +492,10 @@ contract CiphernodeRegistryOwnable is ICiphernodeRegistry, OwnableUpgradeable { Committee storage c = committees[e3Id]; + // @todo Ensure we check everywhere that we use the block before the request block + // to ensure cases where everything is done in the same block are handled correctly. uint256 ticketBalance = IBondingRegistry(bondingRegistry) - .getTicketBalanceAtBlock(node, c.requestBlock); + .getTicketBalanceAtBlock(node, c.requestBlock - 1); uint256 ticketPrice = IBondingRegistry(bondingRegistry).ticketPrice(); require(ticketPrice > 0, InvalidTicketNumber()); diff --git a/packages/enclave-contracts/contracts/test/MockStableToken.sol b/packages/enclave-contracts/contracts/test/MockStableToken.sol index dcfc978518..b23f7b6738 100644 --- a/packages/enclave-contracts/contracts/test/MockStableToken.sol +++ b/packages/enclave-contracts/contracts/test/MockStableToken.sol @@ -22,7 +22,7 @@ contract MockUSDC is ERC20, Ownable { return _decimals; } - function mint(address to, uint256 amount) external onlyOwner { + function mint(address to, uint256 amount) external { _mint(to, amount); } } diff --git a/packages/enclave-contracts/deployed_contracts.json b/packages/enclave-contracts/deployed_contracts.json index e753ae6695..078e235afb 100644 --- a/packages/enclave-contracts/deployed_contracts.json +++ b/packages/enclave-contracts/deployed_contracts.json @@ -1,5 +1,8 @@ { "sepolia": { + "RiscZeroGroth16Verifier": { + "address": "0x925d8331ddc0a1F0d96E68CF073DFE1d92b69187" + }, "PoseidonT3": { "blockNumber": 9615389, "address": "0x3333333C0A88F9BE4fd23ed0536F9B6c427e3B93" diff --git a/packages/enclave-contracts/tasks/ciphernode.ts b/packages/enclave-contracts/tasks/ciphernode.ts index 8c85500b76..5ed2fa2405 100644 --- a/packages/enclave-contracts/tasks/ciphernode.ts +++ b/packages/enclave-contracts/tasks/ciphernode.ts @@ -97,11 +97,16 @@ export const ciphernodeAdd = task( ); console.log("Step 4: Registering as operator..."); - const registerTx = await bondingRegistryConnected.registerOperator(); - await registerTx.wait(); - console.log( - "Operator registered (automatically added to CiphernodeRegistry)", - ); + const isRegistered = await bondingRegistry.isRegistered(signer.address); + if (!isRegistered) { + const registerTx = await bondingRegistryConnected.registerOperator(); + await registerTx.wait(); + console.log( + "Operator registered (automatically added to CiphernodeRegistry)", + ); + } else { + console.log("Ciphernode is already registered as operator"); + } console.log("Step 5: Approving USDC for ticket purchase..."); const approveUsdcTx = await usdcToken.approve( @@ -119,7 +124,6 @@ export const ciphernodeAdd = task( `Ticket balance added: ${ethers.formatUnits(ticketAmountBigInt, 6)} USDC worth`, ); - const isRegistered = await bondingRegistry.isRegistered(signer.address); const isActive = await bondingRegistry.isActive(signer.address); const licenseBond = await bondingRegistry.getLicenseBond( signer.address, @@ -265,6 +269,16 @@ export const ciphernodeMintTokens = task( console.log("\n=== Token Balances ==="); console.log(`ENCL: ${ethers.formatEther(enclBalance)}`); console.log(`USDC: ${ethers.formatUnits(usdcBalance, 6)}`); + + const transfersRestricted = + await enclaveTokenContract.transfersRestricted(); + if (transfersRestricted) { + console.log("Allowing EnclaveToken to be transferrable..."); + const transferEnabledTx = + await enclaveTokenContract.setTransferRestriction(false); + await transferEnabledTx.wait(); + console.log("EnclaveToken transfers are now enabled"); + } } catch (error) { console.error("Token minting failed:", error); throw error;