Skip to content

Commit

Permalink
Merge pull request #128 from worldcoin/dcbuild3r/add-devnet-deployment
Browse files Browse the repository at this point in the history
add devnet deployment
  • Loading branch information
dcbuild3r authored Nov 30, 2023
2 parents 5828eaa + aaff088 commit 9a2b4c7
Show file tree
Hide file tree
Showing 6 changed files with 188 additions and 48 deletions.
2 changes: 2 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,8 @@ deploy: install build; node --no-warnings src/script/deploy.js deploy

deploy-testnet: install build; node --no-warnings src/script/deploy.js deploy-testnet

deploy-devnet: install build; node --no-warnings src/script/deploy.js deploy-devnet

mock: install build; node --no-warnings src/script/deploy.js mock

local-mock: install build; node --no-warnings src/script/deploy.js local-mock
Expand Down
4 changes: 2 additions & 2 deletions src/mock/MockWorldIDIdentityManager.sol
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,8 @@ contract MockWorldIDIdentityManager is IWorldIDIdentityManager {
constructor(uint256 initRoot) {
_latestRoot = initRoot;
}
/// @notice Registers identities into the WorldID system.

/// @notice Registers identities into the WorldID system.
/// @dev Can only be called by the identity operator.
/// @dev Registration is performed off-chain and verified on-chain via the `insertionProof`.
/// This saves gas and time over inserting identities one at a time.
Expand Down
173 changes: 132 additions & 41 deletions src/script/deploy.js
Original file line number Diff line number Diff line change
Expand Up @@ -193,6 +193,15 @@ async function getPolygonscanApiKey(config) {
}
}

async function getBlockscoutApiUrl(config) {
if (!config.blockscoutApiUrl) {
config.blockscoutApiUrl = process.env.BLOCKSCOUT_API_URL;
}
if (!config.blockscoutApiUrl) {
config.blockscoutApiUrl = (await ask(`Enter Blockscout API URL: `)) + "/api";
}
}

async function getTreeDepth(config) {
if (!config.treeDepth) {
config.treeDepth = await ask("Enter WorldID tree depth: ");
Expand Down Expand Up @@ -430,24 +439,45 @@ async function saveConfiguration(config) {
}

///////////////////////////////////////////////////////////////////
/// DEPLOYMENT ///
/// DEPLOYMENTS ///
///////////////////////////////////////////////////////////////////

async function deployOptimismOpStateBridgeGoerli(config) {
const spinner = ora("Deploying Optimism State Bridge...").start();
async function deployOptimismWorldID(config) {
const spinner = ora("Deploying OpWorldID on Optimism...").start();

try {
const data =
execSync(`forge script src/script/deploy/op-stack/optimism/DeployOptimismStateBridgeGoerli.s.sol:DeployOpStateBridgeGoerli --fork-url ${config.ethereumRpcUrl} \
--etherscan-api-key ${config.ethereumEtherscanApiKey} --broadcast --verify -vvvv`);
const data = execSync(
`forge script src/script/deploy/op-stack/DeployOpWorldID.s.sol:DeployOpWorldID --fork-url ${config.optimismRpcUrl} \
--etherscan-api-key ${config.optimismEtherscanApiKey} --broadcast --verify -vvvv`,
);
console.log(data.toString());
} catch (err) {
console.error(err);
}

spinner.succeed("DeployOptimismStateBridgeGoerli.s.sol ran successfully!");
spinner.succeed("DeployOpWorldID.s.sol ran successfully!");
}

async function deployBaseWorldID(config) {
const spinner = ora("Deploying OpWorldID on Base...").start();

try {
const data = execSync(
`forge script src/script/deploy/op-stack/DeployOpWorldID.s.sol:DeployOpWorldID --fork-url ${config.baseRpcUrl} \
--etherscan-api-key ${config.baseEtherscanApiKey} --broadcast --verify -vvvv`,
);
console.log(data.toString());
} catch (err) {
console.error(err);
}

spinner.succeed("DeployOpWorldID.s.sol ran successfully!");
}

///////////////////////////////////////////////////////////////////
/// MAINNET DEPLOYMENT ///
///////////////////////////////////////////////////////////////////

async function deployOptimismOpStateBridgeMainnet(config) {
const spinner = ora("Deploying Optimism State Bridge...").start();

Expand All @@ -463,119 +493,141 @@ async function deployOptimismOpStateBridgeMainnet(config) {
spinner.succeed("DeployOptimismStateBridgeMainnet.s.sol ran successfully!");
}

async function deployBaseOpStateBridgeGoerli(config) {
async function deployBaseOpStateBridgeMainnet(config) {
const spinner = ora("Deploying Base State Bridge...").start();

try {
const data =
execSync(`forge script src/script/deploy/op-stack/base/DeployBaseStateBridgeGoerli.s.sol:DeployBaseStateBridgeGoerli --fork-url ${config.ethereumRpcUrl} \
execSync(`forge script src/script/deploy/op-stack/base/DeployBaseStateBridgeMainnet.s.sol:DeployBaseStateBridgeMainnet --fork-url ${config.ethereumRpcUrl} \
--etherscan-api-key ${config.ethereumEtherscanApiKey} --broadcast --verify -vvvv`);
console.log(data.toString());
} catch (err) {
console.error(err);
}

spinner.succeed("DeployBaseStateBridgeGoerli.s.sol ran successfully!");
spinner.succeed("DeployBaseStateBridgeMainnet.s.sol ran successfully!");
}

async function deployBaseOpStateBridgeMainnet(config) {
const spinner = ora("Deploying Base State Bridge...").start();
async function deployPolygonStateBridgeMainnet(config) {
const spinner = ora("Deploying Polygon State Bridge...").start();

try {
const data =
execSync(`forge script src/script/deploy/op-stack/base/DeployBaseStateBridgeMainnet.s.sol:DeployBaseStateBridgeMainnet --fork-url ${config.ethereumRpcUrl} \
execSync(`forge script src/script/deploy/polygon/DeployPolygonStateBridgeMainnet.s.sol:DeployPolygonStateBridgeMainnet --fork-url ${config.ethereumRpcUrl} \
--etherscan-api-key ${config.ethereumEtherscanApiKey} --broadcast --verify -vvvv`);
console.log(data.toString());
} catch (err) {
console.error(err);
}

spinner.succeed("DeployBaseStateBridgeMainnet.s.sol ran successfully!");
spinner.succeed("DeployPolygonStateBridgeMainnet.s.sol ran successfully!");
}

async function deployPolygonStateBridgeGoerli(config) {
const spinner = ora("Deploying Polygon State Bridge...").start();
async function deployPolygonWorldIDMainnet(config) {
const spinner = ora("Deploying PolygonWorldID...").start();

try {
const data =
execSync(`forge script src/script/deploy/polygon/DeployPolygonStateBridgeGoerli.s.sol:DeployPolygonStateBridgeGoerli --fork-url ${config.ethereumRpcUrl} \
execSync(`forge script src/script/deploy/polygon/DeployPolygonWorldIDMainnet.s.sol:DeployPolygonWorldID --fork-url ${config.polygonRpcUrl} \
--etherscan-api-key ${config.polygonscanApiKey} --legacy --broadcast --verify -vvvv`);
console.log(data.toString());
} catch (err) {
console.error(err);
}

spinner.succeed("DeployPolygonWorldIDMainnet.s.sol ran successfully!");
}

///////////////////////////////////////////////////////////////////
/// TESTNET DEPLOYMENT ///
///////////////////////////////////////////////////////////////////

async function deployOptimismOpStateBridgeGoerli(config) {
const spinner = ora("Deploying Optimism State Bridge...").start();

try {
const data =
execSync(`forge script src/script/deploy/op-stack/optimism/DeployOptimismStateBridgeGoerli.s.sol:DeployOpStateBridgeGoerli --fork-url ${config.ethereumRpcUrl} \
--etherscan-api-key ${config.ethereumEtherscanApiKey} --broadcast --verify -vvvv`);
console.log(data.toString());
} catch (err) {
console.error(err);
}

spinner.succeed("DeployPolygonStateBridgeGoerli.s.sol ran successfully!");
spinner.succeed("DeployOptimismStateBridgeGoerli.s.sol ran successfully!");
}

async function deployPolygonStateBridgeMainnet(config) {
const spinner = ora("Deploying Polygon State Bridge...").start();
async function deployBaseOpStateBridgeGoerli(config) {
const spinner = ora("Deploying Base State Bridge...").start();

try {
const data =
execSync(`forge script src/script/deploy/polygon/DeployPolygonStateBridgeMainnet.s.sol:DeployPolygonStateBridgeMainnet --fork-url ${config.ethereumRpcUrl} \
execSync(`forge script src/script/deploy/op-stack/base/DeployBaseStateBridgeGoerli.s.sol:DeployBaseStateBridgeGoerli --fork-url ${config.ethereumRpcUrl} \
--etherscan-api-key ${config.ethereumEtherscanApiKey} --broadcast --verify -vvvv`);
console.log(data.toString());
} catch (err) {
console.error(err);
}

spinner.succeed("DeployPolygonStateBridgeMainnet.s.sol ran successfully!");
spinner.succeed("DeployBaseStateBridgeGoerli.s.sol ran successfully!");
}

async function deployPolygonWorldIDMumbai(config) {
const spinner = ora("Deploying PolygonWorldID...").start();
async function deployPolygonStateBridgeGoerli(config) {
const spinner = ora("Deploying Polygon State Bridge...").start();

try {
const data =
execSync(`forge script src/script/deploy/polygon/DeployPolygonWorldIDMumbai.s.sol:DeployPolygonWorldIDMumbai --fork-url ${config.polygonRpcUrl} \
--etherscan-api-key ${config.polygonscanApiKey} --legacy --broadcast --verify -vvvv`);
execSync(`forge script src/script/deploy/polygon/DeployPolygonStateBridgeGoerli.s.sol:DeployPolygonStateBridgeGoerli --fork-url ${config.ethereumRpcUrl} \
--etherscan-api-key ${config.ethereumEtherscanApiKey} --broadcast --verify -vvvv`);
console.log(data.toString());
} catch (err) {
console.error(err);
}

spinner.succeed("DeployPolygonWorldIDMumbai.s.sol ran successfully!");
spinner.succeed("DeployPolygonStateBridgeGoerli.s.sol ran successfully!");
}

async function deployPolygonWorldIDMainnet(config) {
async function deployPolygonWorldIDMumbai(config) {
const spinner = ora("Deploying PolygonWorldID...").start();

try {
const data =
execSync(`forge script src/script/deploy/polygon/DeployPolygonWorldIDMainnet.s.sol:DeployPolygonWorldID --fork-url ${config.polygonRpcUrl} \
execSync(`forge script src/script/deploy/polygon/DeployPolygonWorldIDMumbai.s.sol:DeployPolygonWorldIDMumbai --fork-url ${config.polygonRpcUrl} \
--etherscan-api-key ${config.polygonscanApiKey} --legacy --broadcast --verify -vvvv`);
console.log(data.toString());
} catch (err) {
console.error(err);
}

spinner.succeed("DeployPolygonWorldIDMainnet.s.sol ran successfully!");
spinner.succeed("DeployPolygonWorldIDMumbai.s.sol ran successfully!");
}

async function deployOptimismWorldID(config) {
const spinner = ora("Deploying OpWorldID on Optimism...").start();
///////////////////////////////////////////////////////////////////
/// DEVNET DEPLOYMENT ///
///////////////////////////////////////////////////////////////////

async function deployOptimismOpStateBridgeDevnet(config) {
const spinner = ora("Deploying Optimism State Bridge...").start();

try {
const data = execSync(
`forge script src/script/deploy/op-stack/DeployOpWorldID.s.sol:DeployOpWorldID --fork-url ${config.optimismRpcUrl} \
--etherscan-api-key ${config.optimismEtherscanApiKey} --broadcast --verify -vvvv`,
);
const data =
execSync(`forge script src/script/deploy/op-stack/optimism/DeployOptimismStateBridgeDevnet.s.sol:DeployOpStateBridgeDevnet --fork-url ${config.ethereumRpcUrl} \
-e ${config.ethereumEtherscanApiKey} --broadcast --verify -vvvv`);
console.log(data.toString());
} catch (err) {
console.error(err);
}

spinner.succeed("DeployOpWorldID.s.sol ran successfully!");
spinner.succeed("DeployOptimismStateBridgeGoerli.s.sol ran successfully!");
}

async function deployBaseWorldID(config) {
const spinner = ora("Deploying OpWorldID on Base...").start();
async function deployOpWorldIDDevnet(config) {
const spinner = ora("Deploying OpWorldID on Optimism...").start();

try {
const data = execSync(
`forge script src/script/deploy/op-stack/DeployOpWorldID.s.sol:DeployOpWorldID --fork-url ${config.baseRpcUrl} \
--etherscan-api-key ${config.baseEtherscanApiKey} --broadcast --verify -vvvv`,
`forge script src/script/deploy/op-stack/DeployOpWorldID.s.sol:DeployOpWorldID --fork-url ${config.optimismRpcUrl} \
--verifier blockscout --verifier-url ${config.blockscoutApiUrl} --broadcast --verify -vvvv`,
);
console.log(data.toString());
} catch (err) {
Expand Down Expand Up @@ -849,6 +901,26 @@ async function deploymentTestnet(config) {
await localTransferOwnershipOfBaseWorldIDToStateBridge(config);
}

async function devnetDeployment(config) {
dotenv.config();

await getPrivateKey(config);
await getEthereumRpcUrl(config);
await getOptimismRpcUrl(config);
await getEthereumEtherscanApiKey(config);
await getBlockscoutApiUrl(config);
await getTreeDepth(config);
await saveConfiguration(config);
await deployOpWorldIDDevnet(config);
await getOptimismWorldIDAddress(config);
await getWorldIDIdentityManagerAddress(config);
await saveConfiguration(config);
await deployOptimismOpStateBridgeDevnet(config);
await getOptimismStateBridgeAddress(config);
await saveConfiguration(config);
await localTransferOwnershipOfOpWorldIDToStateBridge(config);
}

async function mockDeployment(config) {
dotenv.config();

Expand Down Expand Up @@ -960,6 +1032,25 @@ async function main() {
await saveConfiguration(config);
});

program
.name("deploy-devnet")
.description(
"A CLI interface for deploying the WorldID state bridge on the Sepolia testnet and bridge to Conduit OPStack devnet.",
)
.option("--no-config", "Do not use any existing configuration.");

program
.command("deploy-devnet")
.description(
"Interactively deploys the WorldID state bridge on the Sepolia testnet and bridge to Conduit OPStack devnet.",
)
.action(async () => {
const options = program.opts();
let config = await loadConfiguration(options.config);
await devnetDeployment(config);
await saveConfiguration(config);
});

program
.name("mock")
.command("mock")
Expand Down
1 change: 0 additions & 1 deletion src/script/deploy/mock/DeployMockStateBridge.s.sol
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,6 @@ contract DeployMockStateBridge is Script {
mockWorldID = new MockWorldIDIdentityManager(initialRoot);
mockStateBridge = new MockStateBridge(address(mockWorldID), address(mockBridgedWorldID));


mockStateBridge.propagateRoot();

vm.stopBroadcast();
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.15;

import {Script} from "forge-std/Script.sol";
import {OpStateBridge} from "src/OpStateBridge.sol";

/// @title Deploy State Bridge Optimism
/// @notice forge script to deploy OpStateBridge.sol on Ethereum mainnet
/// @author Worldcoin
contract DeployOpStateBridgeDevnet is Script {
OpStateBridge public bridge;

address public opWorldIDAddress;
address public worldIDIdentityManagerAddress;
address public opCrossDomainMessengerAddress;

///////////////////////////////////////////////////////////////////
/// CONFIG ///
///////////////////////////////////////////////////////////////////
string public root = vm.projectRoot();
string public path = string.concat(root, "/src/script/.deploy-config.json");
string public json = vm.readFile(path);

uint256 public privateKey = abi.decode(vm.parseJson(json, ".privateKey"), (uint256));

function setUp() public {
///////////////////////////////////////////////////////////////////
/// OPTIMISM ///
///////////////////////////////////////////////////////////////////
opCrossDomainMessengerAddress = address(0x7E75b00FfBF0a4295ab7112F04Fd8255334194BD);

///////////////////////////////////////////////////////////////////
/// WORLD ID ///
///////////////////////////////////////////////////////////////////
worldIDIdentityManagerAddress =
abi.decode(vm.parseJson(json, ".worldIDIdentityManagerAddress"), (address));
opWorldIDAddress = abi.decode(vm.parseJson(json, ".optimismWorldIDAddress"), (address));
}

function run() public {
vm.startBroadcast(privateKey);

bridge = new OpStateBridge (
worldIDIdentityManagerAddress,
opWorldIDAddress,
opCrossDomainMessengerAddress
);

vm.stopBroadcast();
}
}
Loading

0 comments on commit 9a2b4c7

Please sign in to comment.