Skip to content

Commit

Permalink
Removing the local addresslist from EmergencyMultisig. Using the stan…
Browse files Browse the repository at this point in the history
…dard multisig's
  • Loading branch information
brickpop committed May 3, 2024
1 parent f1793c3 commit cdb72d3
Show file tree
Hide file tree
Showing 3 changed files with 86 additions and 212 deletions.
200 changes: 58 additions & 142 deletions script/Deploy.s.sol
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import {GovernanceERC20} from "@aragon/osx/token/ERC20/governance/GovernanceERC2
import {GovernanceWrappedERC20} from "@aragon/osx/token/ERC20/governance/GovernanceWrappedERC20.sol";
import {PluginRepoFactory} from "@aragon/osx/framework/plugin/repo/PluginRepoFactory.sol";
import {hashHelpers, PluginSetupRef} from "@aragon/osx/framework/plugin/setup/PluginSetupProcessorHelpers.sol";
import {Addresslist} from "@aragon/osx/plugins/utils/Addresslist.sol";
import {Multisig} from "../src/Multisig.sol";
import {EmergencyMultisig} from "../src/EmergencyMultisig.sol";
import {PluginRepo} from "@aragon/osx/framework/plugin/repo/PluginRepo.sol";
Expand Down Expand Up @@ -42,12 +43,8 @@ contract Deploy is Script {
daoImplementation = new DAO();

governanceERC20Base = vm.envAddress("GOVERNANCE_ERC20_BASE");
governanceWrappedERC20Base = vm.envAddress(
"GOVERNANCE_WRAPPED_ERC20_BASE"
);
pluginSetupProcessor = PluginSetupProcessor(
vm.envAddress("PLUGIN_SETUP_PROCESSOR")
);
governanceWrappedERC20Base = vm.envAddress("GOVERNANCE_WRAPPED_ERC20_BASE");
pluginSetupProcessor = PluginSetupProcessor(vm.envAddress("PLUGIN_SETUP_PROCESSOR"));
pluginRepoFactory = vm.envAddress("PLUGIN_REPO_FACTORY");
tokenAddress = vm.envAddress("TOKEN_ADDRESS");

Expand All @@ -56,9 +53,7 @@ contract Deploy is Script {
minEmergencyApprovals = uint16(vm.envUint("MIN_EMERGENCY_APPROVALS"));

stdMultisigEnsDomain = vm.envString("STD_MULTISIG_ENS_DOMAIN");
emergencyMultisigEnsDomain = vm.envString(
"EMERGENCY_MULTISIG_ENS_DOMAIN"
);
emergencyMultisigEnsDomain = vm.envString("EMERGENCY_MULTISIG_ENS_DOMAIN");

// JSON list of members
string memory root = vm.projectRoot();
Expand All @@ -72,40 +67,22 @@ contract Deploy is Script {
DAO dao = prepareDao();

// Prepare plugins
(
address p1,
PluginRepo pr1,
IPluginSetup.PreparedSetupData memory preparedSetupData1
) = prepareMultisig(dao);

(
address p2,
PluginRepo pr2,
IPluginSetup.PreparedSetupData memory preparedSetupData2
) = prepareEmergencyMultisig(dao);

(
address p3,
PluginRepo pr3,
IPluginSetup.PreparedSetupData memory preparedSetupData3
) = prepareOptimisticTokenVoting(dao, p1, p2);
(address p1, PluginRepo pr1, IPluginSetup.PreparedSetupData memory preparedSetupData1) = prepareMultisig(dao);

(address p2, PluginRepo pr2, IPluginSetup.PreparedSetupData memory preparedSetupData2) =
prepareEmergencyMultisig(dao, Addresslist(p1));

(address p3, PluginRepo pr3, IPluginSetup.PreparedSetupData memory preparedSetupData3) =
prepareOptimisticTokenVoting(dao, p1, p2);

// Apply installations
dao.grant(
address(dao),
address(pluginSetupProcessor),
dao.ROOT_PERMISSION_ID()
);
dao.grant(address(dao), address(pluginSetupProcessor), dao.ROOT_PERMISSION_ID());

applyPluginInstallation(dao, p1, pr1, preparedSetupData1);
applyPluginInstallation(dao, p2, pr2, preparedSetupData2);
applyPluginInstallation(dao, p3, pr3, preparedSetupData3);

dao.revoke(
address(dao),
address(pluginSetupProcessor),
dao.ROOT_PERMISSION_ID()
);
dao.revoke(address(dao), address(pluginSetupProcessor), dao.ROOT_PERMISSION_ID());

// Remove ourselves as root

Expand All @@ -121,20 +98,9 @@ contract Deploy is Script {
}

function getDeployerWallet() private returns (address) {
VmSafe.Wallet memory wallet = vm.createWallet(
vm.envUint("PRIVATE_KEY")
);
VmSafe.Wallet memory wallet = vm.createWallet(vm.envUint("PRIVATE_KEY"));

return
address(
uint160(
uint256(
keccak256(
abi.encode(wallet.publicKeyX, wallet.publicKeyY)
)
)
)
);
return address(uint160(uint256(keccak256(abi.encode(wallet.publicKeyX, wallet.publicKeyY)))));
}

function prepareDao() internal returns (DAO dao) {
Expand All @@ -156,24 +122,14 @@ contract Deploy is Script {
);
}

function prepareMultisig(
DAO dao
)
internal
returns (address, PluginRepo, IPluginSetup.PreparedSetupData memory)
{
function prepareMultisig(DAO dao) internal returns (address, PluginRepo, IPluginSetup.PreparedSetupData memory) {
// Deploy plugin setup
MultisigPluginSetup pluginSetup = new MultisigPluginSetup();

// Publish repo
PluginRepo pluginRepo = PluginRepoFactory(pluginRepoFactory)
.createPluginRepoWithFirstVersion(
stdMultisigEnsDomain,
address(pluginSetup),
msg.sender,
"0x",
"0x"
);
PluginRepo pluginRepo = PluginRepoFactory(pluginRepoFactory).createPluginRepoWithFirstVersion(
stdMultisigEnsDomain, address(pluginSetup), msg.sender, "0x", "0x"
);

bytes memory settingsData = pluginSetup.encodeInstallationParameters(
multisigMembers,
Expand All @@ -184,128 +140,88 @@ contract Deploy is Script {
)
);

(
address plugin,
IPluginSetup.PreparedSetupData memory preparedSetupData
) = pluginSetupProcessor.prepareInstallation(
address(dao),
PluginSetupProcessor.PrepareInstallationParams(
PluginSetupRef(
PluginRepo.Tag(1, 1),
PluginRepo(pluginRepo)
),
settingsData
)
);
(address plugin, IPluginSetup.PreparedSetupData memory preparedSetupData) = pluginSetupProcessor
.prepareInstallation(
address(dao),
PluginSetupProcessor.PrepareInstallationParams(
PluginSetupRef(PluginRepo.Tag(1, 1), PluginRepo(pluginRepo)), settingsData
)
);

return (plugin, pluginRepo, preparedSetupData);
}

function prepareEmergencyMultisig(
DAO dao
)
function prepareEmergencyMultisig(DAO dao, Addresslist multisigPlugin)
internal
returns (address, PluginRepo, IPluginSetup.PreparedSetupData memory)
{
// Deploy plugin setup
EmergencyMultisigPluginSetup pluginSetup = new EmergencyMultisigPluginSetup();

// Publish repo
PluginRepo pluginRepo = PluginRepoFactory(pluginRepoFactory)
.createPluginRepoWithFirstVersion(
emergencyMultisigEnsDomain,
address(pluginSetup),
msg.sender,
"0x",
"0x"
);
PluginRepo pluginRepo = PluginRepoFactory(pluginRepoFactory).createPluginRepoWithFirstVersion(
emergencyMultisigEnsDomain, address(pluginSetup), msg.sender, "0x", "0x"
);

bytes memory settingsData = pluginSetup.encodeInstallationParameters(
multisigMembers,
EmergencyMultisig.MultisigSettings(
true, // onlyListed
minEmergencyApprovals // minAppovals
minEmergencyApprovals, // minAppovals
Addresslist(multisigPlugin)
)
);

(
address plugin,
IPluginSetup.PreparedSetupData memory preparedSetupData
) = pluginSetupProcessor.prepareInstallation(
address(dao),
PluginSetupProcessor.PrepareInstallationParams(
PluginSetupRef(
PluginRepo.Tag(1, 1),
PluginRepo(pluginRepo)
),
settingsData
)
);
(address plugin, IPluginSetup.PreparedSetupData memory preparedSetupData) = pluginSetupProcessor
.prepareInstallation(
address(dao),
PluginSetupProcessor.PrepareInstallationParams(
PluginSetupRef(PluginRepo.Tag(1, 1), PluginRepo(pluginRepo)), settingsData
)
);

return (plugin, pluginRepo, preparedSetupData);
}

function prepareOptimisticTokenVoting(
DAO dao,
address stdProposer,
address emergencyProposer
)
function prepareOptimisticTokenVoting(DAO dao, address stdProposer, address emergencyProposer)
internal
returns (
address plugin,
PluginRepo pluginRepo,
IPluginSetup.PreparedSetupData memory preparedSetupData
)
returns (address plugin, PluginRepo pluginRepo, IPluginSetup.PreparedSetupData memory preparedSetupData)
{
// Deploy plugin setup
OptimisticTokenVotingPluginSetup pluginSetup = new OptimisticTokenVotingPluginSetup(
GovernanceERC20(governanceERC20Base),
GovernanceWrappedERC20(governanceWrappedERC20Base)
);
GovernanceERC20(governanceERC20Base), GovernanceWrappedERC20(governanceWrappedERC20Base)
);

// Publish repo
pluginRepo = PluginRepoFactory(pluginRepoFactory)
.createPluginRepoWithFirstVersion(
"ens-of-the-optimistic-token-voting",
address(pluginSetup),
msg.sender,
"0x",
"0x"
);
pluginRepo = PluginRepoFactory(pluginRepoFactory).createPluginRepoWithFirstVersion(
"ens-of-the-optimistic-token-voting", address(pluginSetup), msg.sender, "0x", "0x"
);

// Plugin settings
bytes memory settingsData;
{
OptimisticTokenVotingPlugin.OptimisticGovernanceSettings
memory votingSettings = OptimisticTokenVotingPlugin
.OptimisticGovernanceSettings(
200000, // minVetoRatio - 20%
0, // minDuration (the condition will enforce it)
0 // minProposerVotingPower
);
OptimisticTokenVotingPlugin.OptimisticGovernanceSettings memory votingSettings = OptimisticTokenVotingPlugin
.OptimisticGovernanceSettings(
200000, // minVetoRatio - 20%
0, // minDuration (the condition will enforce it)
0 // minProposerVotingPower
);

OptimisticTokenVotingPluginSetup.TokenSettings
memory tokenSettings = OptimisticTokenVotingPluginSetup
.TokenSettings(tokenAddress, "", "");
OptimisticTokenVotingPluginSetup.TokenSettings memory tokenSettings =
OptimisticTokenVotingPluginSetup.TokenSettings(tokenAddress, "", "");

GovernanceERC20.MintSettings memory mintSettings = GovernanceERC20
.MintSettings(new address[](0), new uint256[](0));
GovernanceERC20.MintSettings memory mintSettings =
GovernanceERC20.MintSettings(new address[](0), new uint256[](0));

settingsData = pluginSetup.encodeInstallationParams(
votingSettings,
tokenSettings,
mintSettings,
minStdProposalDelay,
stdProposer,
emergencyProposer
votingSettings, tokenSettings, mintSettings, minStdProposalDelay, stdProposer, emergencyProposer
);
}

(plugin, preparedSetupData) = pluginSetupProcessor.prepareInstallation(
address(dao),
PluginSetupProcessor.PrepareInstallationParams(
PluginSetupRef(PluginRepo.Tag(1, 1), PluginRepo(pluginRepo)),
settingsData
PluginSetupRef(PluginRepo.Tag(1, 1), PluginRepo(pluginRepo)), settingsData
)
);

Expand Down
Loading

0 comments on commit cdb72d3

Please sign in to comment.