|
5 | 5 | pragma solidity ^0.8.20;
|
6 | 6 |
|
7 | 7 | import {Script, console2} from "forge-std/Script.sol";
|
| 8 | +import "forge-std/Test.sol"; |
8 | 9 | import {IRiscZeroVerifier} from "risc0/IRiscZeroVerifier.sol";
|
9 | 10 | import {ControlID, RiscZeroGroth16Verifier} from "risc0/groth16/RiscZeroGroth16Verifier.sol";
|
10 | 11 | import {RiscZeroCheats} from "risc0/test/RiscZeroCheats.sol";
|
| 12 | +import {UnsafeUpgrades, Upgrades} from "openzeppelin-foundry-upgrades/Upgrades.sol"; |
| 13 | +import {ConfigLoader, DeploymentConfig} from "./Config.s.sol"; |
11 | 14 |
|
12 | 15 | import {ProofMarket} from "../src/ProofMarket.sol";
|
13 | 16 | import {RiscZeroSetVerifier} from "../src/RiscZeroSetVerifier.sol";
|
14 | 17 |
|
15 | 18 | // For local testing:
|
16 |
| -import {ImageID as AssesorImgId} from "../src/AssessorImageID.sol"; |
17 |
| -import {ImageID as SetBuidlerId} from "../src/SetBuilderImageID.sol"; |
| 19 | +// TODO: Uncommenting these lines currently creates a chicken-egg problem in that |
| 20 | +// `cargo build -Ftest-utils` cannot complete without first running `forge build` and `forge build` |
| 21 | +// cannot run without building the guests. |
| 22 | +//import {ImageID as AssesorImgId} from "../src/AssessorImageID.sol"; |
| 23 | +//import {ImageID as SetBuidlerId} from "../src/SetBuilderImageID.sol"; |
18 | 24 |
|
19 | 25 | contract Deploy is Script, RiscZeroCheats {
|
| 26 | + // Path to deployment config file, relative to the project root. |
| 27 | + string constant CONFIG_FILE = "contracts/deployment.toml"; |
| 28 | + |
| 29 | + IRiscZeroVerifier verifier; |
| 30 | + RiscZeroSetVerifier setVerifier; |
| 31 | + address proofMarketAddress; |
| 32 | + bytes32 setBuilderImageId; |
| 33 | + bytes32 assessorImageId; |
| 34 | + |
20 | 35 | function run() external {
|
| 36 | + string memory setBuilderGuestUrl = ""; |
| 37 | + string memory assessorGuestUrl = ""; |
| 38 | + |
21 | 39 | // load ENV variables first
|
22 |
| - uint256 adminKey = vm.envUint("PRIVATE_KEY"); |
| 40 | + uint256 deployerKey = vm.envOr("DEPLOYER_PRIVATE_KEY", uint256(0)); |
| 41 | + require(deployerKey != 0, "No deployer key provided. Please set the env var DEPLOYER_PRIVATE_KEY."); |
| 42 | + vm.rememberKey(deployerKey); |
23 | 43 |
|
24 |
| - vm.startBroadcast(adminKey); |
| 44 | + address proofMarketOwner = vm.envAddress("PROOF_MARKET_OWNER"); |
| 45 | + console2.log("ProofMarket Owner:", proofMarketOwner); |
25 | 46 |
|
26 |
| - IRiscZeroVerifier verifier = deployRiscZeroVerifier(); |
| 47 | + // Read and log the chainID |
| 48 | + uint256 chainId = block.chainid; |
| 49 | + console2.log("You are deploying on ChainID %d", chainId); |
| 50 | + |
| 51 | + // Load the deployment config |
| 52 | + DeploymentConfig memory deploymentConfig = |
| 53 | + ConfigLoader.loadDeploymentConfig(string.concat(vm.projectRoot(), "/", CONFIG_FILE)); |
| 54 | + |
| 55 | + // Assign parsed config values to the variables |
| 56 | + verifier = IRiscZeroVerifier(deploymentConfig.router); |
| 57 | + setVerifier = RiscZeroSetVerifier(deploymentConfig.setVerifier); |
| 58 | + setBuilderImageId = deploymentConfig.setBuilderImageId; |
| 59 | + setBuilderGuestUrl = deploymentConfig.setBuilderGuestUrl; |
| 60 | + assessorImageId = deploymentConfig.assessorImageId; |
| 61 | + assessorGuestUrl = deploymentConfig.assessorGuestUrl; |
| 62 | + |
| 63 | + vm.startBroadcast(deployerKey); |
| 64 | + |
| 65 | + // Deploy the verifier, if not already deployed. |
| 66 | + if (address(verifier) == address(0)) { |
| 67 | + verifier = deployRiscZeroVerifier(); |
| 68 | + } else { |
| 69 | + console2.log("Using IRiscZeroVerifier contract deployed at", address(verifier)); |
| 70 | + } |
| 71 | + |
| 72 | + // Set the setBuilderImageId and assessorImageId if not set. |
| 73 | + if (setBuilderImageId == bytes32(0)) { |
| 74 | + // TODO: Currently cannot work. See note in imports. |
| 75 | + //setBuilderImageId = SetBuidlerId.SET_BUILDER_GUEST_ID; |
| 76 | + revert("set builder image ID must be set in deployment.toml"); |
| 77 | + } |
| 78 | + if (assessorImageId == bytes32(0)) { |
| 79 | + // TODO: Currently cannot work. See note in imports. |
| 80 | + //assessorImageId = AssesorImgId.ASSESSOR_GUEST_ID; |
| 81 | + revert("assessor image ID must be set in deployment.toml"); |
| 82 | + } |
27 | 83 |
|
28 |
| - string memory setBuilderGuestUrl = ""; |
29 |
| - string memory assessorGuestUrl = ""; |
30 | 84 | if (bytes(vm.envOr("RISC0_DEV_MODE", string(""))).length > 0) {
|
31 |
| - // TODO: Create a more robust way of getting a URI for guests. |
| 85 | + // TODO: Create a more robust way of getting a URI for guests, and ensure that it is |
| 86 | + // in-sync with the configured image ID. |
32 | 87 | string memory cwd = vm.envString("PWD");
|
33 |
| - setBuilderGuestUrl = string.concat( |
34 |
| - "file://", |
35 |
| - cwd, |
36 |
| - "/target/riscv-guest/riscv32im-risc0-zkvm-elf/release/set-builder-guest" |
37 |
| - ); |
| 88 | + setBuilderGuestUrl = |
| 89 | + string.concat("file://", cwd, "/target/riscv-guest/riscv32im-risc0-zkvm-elf/release/set-builder-guest"); |
38 | 90 | console2.log("Set builder URI", setBuilderGuestUrl);
|
39 |
| - assessorGuestUrl = string.concat( |
40 |
| - "file://", |
41 |
| - cwd, |
42 |
| - "/target/riscv-guest/riscv32im-risc0-zkvm-elf/release/assessor-guest" |
43 |
| - ); |
| 91 | + assessorGuestUrl = |
| 92 | + string.concat("file://", cwd, "/target/riscv-guest/riscv32im-risc0-zkvm-elf/release/assessor-guest"); |
44 | 93 | console2.log("Assessor URI", assessorGuestUrl);
|
45 | 94 | }
|
46 | 95 |
|
47 |
| - RiscZeroSetVerifier setVerifier = new RiscZeroSetVerifier(verifier, SetBuidlerId.SET_BUILDER_GUEST_ID, setBuilderGuestUrl); |
48 |
| - console2.log("Deployed SetVerifier to,", address(setVerifier)); |
| 96 | + // Deploy the setVerifier, if not already deployed. |
| 97 | + if (address(setVerifier) == address(0)) { |
| 98 | + setVerifier = new RiscZeroSetVerifier(verifier, setBuilderImageId, setBuilderGuestUrl); |
| 99 | + console2.log("Deployed RiscZeroSetVerifier to", address(setVerifier)); |
| 100 | + } else { |
| 101 | + console2.log("Using RiscZeroSetVerifier contract deployed at", address(setVerifier)); |
| 102 | + } |
49 | 103 |
|
50 |
| - ProofMarket market = new ProofMarket(setVerifier, AssesorImgId.ASSESSOR_GUEST_ID, assessorGuestUrl); |
51 |
| - console2.log("Deployed ProofMarket to", address(market)); |
| 104 | + // Deploy the proof market |
| 105 | + address newImplementation = address(new ProofMarket(setVerifier, assessorImageId)); |
| 106 | + console2.log("Deployed new ProofMarket implementation at", newImplementation); |
| 107 | + proofMarketAddress = UnsafeUpgrades.deployUUPSProxy( |
| 108 | + newImplementation, abi.encodeCall(ProofMarket.initialize, (proofMarketOwner, assessorGuestUrl)) |
| 109 | + ); |
| 110 | + console2.log("Deployed ProofMarket (proxy) to", proofMarketAddress); |
52 | 111 |
|
53 | 112 | vm.stopBroadcast();
|
54 | 113 | }
|
|
0 commit comments