Skip to content

Commit

Permalink
Mode DAO Factory work in progress
Browse files Browse the repository at this point in the history
  • Loading branch information
brickpop committed Sep 24, 2024
1 parent 23c2c95 commit 944e1b5
Show file tree
Hide file tree
Showing 4 changed files with 495 additions and 0 deletions.
30 changes: 30 additions & 0 deletions .env.example
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
# NETWORK AND DEPLOYMENT WALLET
DEPLOYMENT_PRIVATE_KEY="..."
ALCHEMY_API_KEY="..."
ETHERSCAN_API_KEY="..."
NETWORK="holesky"
DEPLOY_AS_PRODUCTION=true # With false, the script will deploy mock helpers

# GOVERNANCE PARAMETERS
MIN_PROPOSAL_DURATION="864000" # in seconds (10 days)
MIN_APPROVALS="5" # How many multisig approvals are required
MULTISIG_PROPOSAL_EXPIRATION_PERIOD="864000" # How long until a pending proposal expires (10 days)

# PARAMETERS
MODE_TOKEN_ADDRESS="0x..."
BPT_TOKEN_ADDRESS="0x..."

# OSx IMPLEMENTATIONS ADDRESSES (network dependent, see active_contracts.json on lib/osx)
# HOLESKY
DAO_FACTORY="0xE640Da5AD169630555A86D9b6b9C145B4961b1EB"
PLUGIN_SETUP_PROCESSOR="0xCe0B4124dea6105bfB85fB4461c4D39f360E9ef3"
PLUGIN_REPO_FACTORY="0x95D563382BeD5AcB458759EE05b27DF2CB019Cc7"
GOVERNANCE_ERC20_BASE="0xC24188a73dc09aA7C721f96Ad8857B469C01dC9f"
GOVERNANCE_WRAPPED_ERC20_BASE="0x7a62da7B56fB3bfCdF70E900787010Bc4c9Ca42e"

# PLUGIN REPO PARAMETERS (per-network)
# HOLESKY
MULTISIG_PLUGIN_REPO_ADDRESS="0x..."
MULTISIG_PLUGIN_RELEASE="1"
MULTISIG_PLUGIN_BUILD="2"
SIMPLE_GAUGE_VOTER_ENS_DOMAIN="mode-simple-gauge-voter-0"
149 changes: 149 additions & 0 deletions script/Deploy.s.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,149 @@
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.17;

import {Script, console} from "forge-std/Script.sol";
import {DAO} from "@aragon/osx/core/dao/DAO.sol";
import {ModeDaoFactory} from "../src/factory/ModeDaoFactory.sol";
import {MultisigSetup} from "@aragon/osx/plugins/governance/multisig/MultisigSetup.sol";
import {SimpleGaugeVoterSetup} from "../src/voting/SimpleGaugeVoterSetup.sol";
import {PluginRepoFactory} from "@aragon/osx/framework/plugin/repo/PluginRepoFactory.sol";
import {PluginSetupProcessor} from "@aragon/osx/framework/plugin/setup/PluginSetupProcessor.sol";

contract Deploy is Script {
MultisigPluginSetup multisigPluginSetup;
SimpleGaugeVoterSetup simpleGaugeVoterSetup;

modifier broadcast() {
vm.startBroadcast(vm.envUint("DEPLOYMENT_PRIVATE_KEY"));
console.log("Deploying from:", vm.addr(vm.envUint("DEPLOYMENT_PRIVATE_KEY")));
_;
vm.stopBroadcast();
}

function run() public broadcast {
// NOTE:
// Deploying the plugin setup's separately because of the code size limit

// Resolve the multisig plugin repo address

// Deploy the main plugin setup

// TODO

ModeDaoFactory.DeploymentSettings memory settings;
if (vm.envBool("DEPLOY_AS_PRODUCTION")) {
settings = getProductionSettings();
} else {
settings = getInternalTestingSettings();
}

console.log("");

// Create the DAO
ModeDaoFactory factory = new ModeDaoFactory(settings);
factory.deployOnce();

// Done
printDeploymentSummary(factory);
}

function getProductionSettings()
internal
view
returns (ModeDaoFactory.DeploymentSettings memory settings)
{
console.log("Using production settings");

settings = ModeDaoFactory.DeploymentSettings({
// Mode contract settings
tokenAddress: IVotesUpgradeable(vm.envAddress("TOKEN_ADDRESS")),
// Voting settings
minVetoRatio: uint32(vm.envUint("MIN_VETO_RATIO")),
minStdProposalDuration: uint64(vm.envUint("MIN_STD_PROPOSAL_DURATION")),
minStdApprovals: uint16(vm.envUint("MIN_STD_APPROVALS")),
// OSx contracts
osxDaoFactory: vm.envAddress("DAO_FACTORY"),
pluginSetupProcessor: PluginSetupProcessor(vm.envAddress("PLUGIN_SETUP_PROCESSOR")),
pluginRepoFactory: PluginRepoFactory(vm.envAddress("PLUGIN_REPO_FACTORY")),
// Plugin setup's
multisigPluginSetup: MultisigPluginSetup(multisigPluginSetup),
optimisticTokenVotingPluginSetup: OptimisticTokenVotingPluginSetup(
optimisticTokenVotingPluginSetup
),
// Multisig members
multisigMembers: readMultisigMembers(),
multisigExpirationPeriod: uint64(vm.envUint("MULTISIG_PROPOSAL_EXPIRATION_PERIOD")),
// ENS
stdMultisigEnsDomain: vm.envString("STD_MULTISIG_ENS_DOMAIN"),
optimisticTokenVotingEnsDomain: vm.envString("OPTIMISTIC_TOKEN_VOTING_ENS_DOMAIN")
});
}

function getInternalTestingSettings()
internal
returns (ModeDaoFactory.DeploymentSettings memory settings)
{
console.log("Using internal testing settings");

address[] memory multisigMembers = readMultisigMembers();
// address votingToken = createTestToken(multisigMembers, tokenAddress);

settings = ModeDaoFactory.DeploymentSettings({
// Mode contract settings
tokenAddress: IVotesUpgradeable(votingToken),
// Voting settings
minVetoRatio: uint32(vm.envUint("MIN_VETO_RATIO")),
minStdProposalDuration: uint64(vm.envUint("MIN_STD_PROPOSAL_DURATION")),
minStdApprovals: uint16(vm.envUint("MIN_STD_APPROVALS")),
// OSx contracts
osxDaoFactory: vm.envAddress("DAO_FACTORY"),
pluginSetupProcessor: PluginSetupProcessor(vm.envAddress("PLUGIN_SETUP_PROCESSOR")),
pluginRepoFactory: PluginRepoFactory(vm.envAddress("PLUGIN_REPO_FACTORY")),
// Plugin setup's
multisigPluginSetup: MultisigPluginSetup(multisigPluginSetup),
optimisticTokenVotingPluginSetup: OptimisticTokenVotingPluginSetup(
optimisticTokenVotingPluginSetup
),
// Multisig members
multisigMembers: multisigMembers,
multisigExpirationPeriod: uint64(vm.envUint("MULTISIG_PROPOSAL_EXPIRATION_PERIOD")),
// ENS
stdMultisigEnsDomain: vm.envString("STD_MULTISIG_ENS_DOMAIN"),
optimisticTokenVotingEnsDomain: vm.envString("OPTIMISTIC_TOKEN_VOTING_ENS_DOMAIN")
});
}

function readMultisigMembers() internal view returns (address[] memory) {
// JSON list of members
string memory path = string.concat(vm.projectRoot(), "/script/multisig-members.json");
string memory json = vm.readFile(path);
return vm.parseJsonAddressArray(json, "$.members");
}

function printDeploymentSummary(address factory) internal {
console.log("Factory:", address(factory));
console.log("Chain ID:", block.chainid);
console.log("");
console.log("DAO:", address(daoDeployment.dao));
console.log("Voting token:", address(settings.tokenAddress));
console.log("");

console.log("Plugins");
console.log("- Multisig plugin:", address(daoDeployment.multisigPlugin));
console.log(
"- Token voting plugin:",
address(daoDeployment.optimisticTokenVotingPlugin)
);
console.log("");

console.log("Plugin repositories");
console.log("- Multisig plugin repository:", address(daoDeployment.multisigPluginRepo));
console.log(
"- Token voting plugin repository:",
address(daoDeployment.optimisticTokenVotingPluginRepo)
);
console.log("");

console.log("Helpers");
}
}
4 changes: 4 additions & 0 deletions script/multisig-members.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
{
"members": [
]
}
Loading

0 comments on commit 944e1b5

Please sign in to comment.