Skip to content

Commit

Permalink
Merge pull request #5 from aragon/f/plugin-setup-2
Browse files Browse the repository at this point in the history
Plugin setup
  • Loading branch information
brickpop authored Jan 27, 2025
2 parents 7f301fe + 52f2a9a commit e463f1f
Show file tree
Hide file tree
Showing 19 changed files with 2,509 additions and 788 deletions.
6 changes: 4 additions & 2 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,10 @@ PRODNET_RPC_URL="https://eth.drpc.org"
ALCHEMY_API_KEY="..."
ETHERSCAN_API_KEY="..."

# Plugin ENS Subdomain to deploy under (per-network)
ENS_DOMAIN="lock-to-vote-dev-1"
# The address that will own the plugin repository
PLUGIN_MAINTAINER="0x..."
LOCK_TO_VOTE_REPO_ENS_SUBDOMAIN="" # blank for none
LOCK_TO_APPROVE_REPO_ENS_SUBDOMAIN="" # blank for none

# OSx BASE CONTRACT ADDRESSES (network dependent, see active_contracts.json on lib/osx)

Expand Down
244 changes: 67 additions & 177 deletions script/Deploy.s.sol
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,13 @@ import {Script, console} from "forge-std/Script.sol";
import {DAO} from "@aragon/osx/src/core/dao/DAO.sol";
import {IVotesUpgradeable} from "@openzeppelin/contracts-upgradeable/governance/utils/IVotesUpgradeable.sol";
import {LockToVotePluginSetup} from "../src/setup/LockToVotePluginSetup.sol";
import {LockToApprovePluginSetup} from "../src/setup/LockToApprovePluginSetup.sol";
import {PluginRepoFactory} from "@aragon/osx/src/framework/plugin/repo/PluginRepoFactory.sol";
import {PluginRepo} from "@aragon/osx/src/framework/plugin/repo/PluginRepo.sol";
import {PluginSetupProcessor} from "@aragon/osx/src/framework/plugin/setup/PluginSetupProcessor.sol";
import {TestToken} from "../test/mocks/TestToken.sol";

contract Deploy is Script {
LockToVotePluginSetup lockToVotePluginSetup;

modifier broadcast() {
uint256 privKey = vm.envUint("DEPLOYMENT_PRIVATE_KEY");
vm.startBroadcast(privKey);
Expand All @@ -22,181 +22,71 @@ contract Deploy is Script {
vm.stopBroadcast();
}

// function run() public broadcast {
// // Deploy the plugin setup's
// lockToVotePluginSetup = new LockToVotePluginSetup(
// GovernanceERC20(vm.envAddress("GOVERNANCE_ERC20_BASE")),
// GovernanceWrappedERC20(
// vm.envAddress("GOVERNANCE_WRAPPED_ERC20_BASE")
// )
// );

// console.log("Chain ID:", block.chainid);

// DeploymentSettings memory settings;
// if (vm.envOr("MINT_TEST_TOKENS", false)) {
// settings = getTestTokenSettings();
// } else {
// settings = getProductionSettings();
// }

// console.log("");

// // TODO: DEPLOY

// // Done
// printDeploymentSummary(factory, delegationWall);
// }

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

// settings = DeploymentSettings({
// tokenAddress: IVotesUpgradeable(vm.envAddress("TOKEN_ADDRESS")),
// timelockPeriod: uint32(vm.envUint("TIME_LOCK_PERIOD")),
// l2InactivityPeriod: uint32(vm.envUint("L2_INACTIVITY_PERIOD")),
// l2AggregationGracePeriod: uint32(
// vm.envUint("L2_AGGREGATION_GRACE_PERIOD")
// ),
// skipL2: bool(vm.envBool("SKIP_L2")),
// // Voting settings
// minVetoRatio: uint32(vm.envUint("MIN_VETO_RATIO")),
// minStdProposalDuration: uint32(
// vm.envUint("MIN_STD_PROPOSAL_DURATION")
// ),
// minStdApprovals: uint16(vm.envUint("MIN_STD_APPROVALS")),
// minEmergencyApprovals: uint16(
// vm.envUint("MIN_EMERGENCY_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),
// emergencyMultisigPluginSetup: EmergencyMultisigPluginSetup(
// emergencyMultisigPluginSetup
// ),
// lockToVotePluginSetup: LockToVotePluginSetup(lockToVotePluginSetup),
// // Multisig members
// multisigMembers: readMultisigMembers(),
// multisigExpirationPeriod: uint32(
// vm.envUint("MULTISIG_PROPOSAL_EXPIRATION_PERIOD")
// ),
// // ENS
// stdMultisigEnsDomain: vm.envString("STD_MULTISIG_ENS_DOMAIN"),
// emergencyMultisigEnsDomain: vm.envString(
// "EMERGENCY_MULTISIG_ENS_DOMAIN"
// ),
// optimisticTokenVotingEnsDomain: vm.envString(
// "OPTIMISTIC_TOKEN_VOTING_ENS_DOMAIN"
// )
// });
// }

// function getTestTokenSettings()
// internal
// returns (DeploymentSettings memory settings)
// {
// console.log("Using test token settings");

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

// settings = DeploymentSettings({
// tokenAddress: IVotesUpgradeable(votingToken),
// timelockPeriod: uint32(vm.envUint("TIME_LOCK_PERIOD")),
// l2InactivityPeriod: uint32(vm.envUint("L2_INACTIVITY_PERIOD")),
// l2AggregationGracePeriod: uint32(
// vm.envUint("L2_AGGREGATION_GRACE_PERIOD")
// ),
// skipL2: bool(vm.envBool("SKIP_L2")),
// // Voting settings
// minVetoRatio: uint32(vm.envUint("MIN_VETO_RATIO")),
// minStdProposalDuration: uint32(
// vm.envUint("MIN_STD_PROPOSAL_DURATION")
// ),
// minStdApprovals: uint16(vm.envUint("MIN_STD_APPROVALS")),
// minEmergencyApprovals: uint16(
// vm.envUint("MIN_EMERGENCY_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),
// emergencyMultisigPluginSetup: EmergencyMultisigPluginSetup(
// emergencyMultisigPluginSetup
// ),
// lockToVotePluginSetup: LockToVotePluginSetup(lockToVotePluginSetup),
// // Multisig members
// multisigMembers: multisigMembers,
// multisigExpirationPeriod: uint32(
// vm.envUint("MULTISIG_PROPOSAL_EXPIRATION_PERIOD")
// ),
// // ENS
// stdMultisigEnsDomain: vm.envString("STD_MULTISIG_ENS_DOMAIN"),
// emergencyMultisigEnsDomain: vm.envString(
// "EMERGENCY_MULTISIG_ENS_DOMAIN"
// ),
// optimisticTokenVotingEnsDomain: vm.envString(
// "OPTIMISTIC_TOKEN_VOTING_ENS_DOMAIN"
// )
// });
// }

// function printDeploymentSummary(
// ) internal view {
// DeploymentSettings memory settings = factory.getSettings();
// Deployment memory daoDeployment = factory.getDeployment();

// console.log("Factory:", address(factory));
// console.log("");
// console.log("DAO:", address(daoDeployment.dao));
// console.log("Voting token:", address(settings.tokenAddress));
// console.log("");

// console.log("Plugins");
// console.log(
// "- Lock to vote plugin:",
// address(daoDeployment.multisigPlugin)
// );
// console.log("");

// console.log("Helpers");
// console.log("- Lock Manager", address(daoDeployment.signerList));

// console.log("");

// console.log("Plugin repositories");
// console.log(
// "- Lock to vote plugin repository:",
// address(daoDeployment.optimisticTokenVotingPluginRepo)
// );
// }
function run() public broadcast {
address maintainer = vm.envAddress("PLUGIN_MAINTAINER");
address pluginRepoFactory = vm.envAddress("PLUGIN_REPO_FACTORY");
string memory ltvEnsSubdomain = vm.envString("LOCK_TO_VOTE_REPO_ENS_SUBDOMAIN");
string memory ltaEnsSubdomain = vm.envString("LOCK_TO_APPROVE_REPO_ENS_SUBDOMAIN");

// Deploy the plugin setup's
(address lockToVotePluginSetup, PluginRepo lockToVotePluginRepo) = prepareLockToVote(
maintainer,
PluginRepoFactory(pluginRepoFactory),
ltvEnsSubdomain
);
(address lockToApprovePluginSetup, PluginRepo lockToApprovePluginRepo) = prepareLockToApprove(
maintainer,
PluginRepoFactory(pluginRepoFactory),
ltaEnsSubdomain
);

console.log("Chain ID:", block.chainid);

console.log("");

console.log("Plugins");
console.log("- LockToVotePluginSetup:", lockToVotePluginSetup);
console.log("- LockToApprovePluginSetup:", lockToApprovePluginSetup);
console.log("");

console.log("Plugin repositories");
console.log("- LockToVote plugin repository:", address(lockToVotePluginRepo));
console.log("- LockToApprove plugin repository:", address(lockToApprovePluginRepo));
}

// function createTestToken(
// address[] memory members,
// ) internal returns (address) {
// GovernanceERC20Mock testToken = new GovernanceERC20Mock(address(0));
// console.log("Minting test tokens for the members");
// testToken.mintAndDelegate(members, 10 ether);
function prepareLockToVote(
address maintainer,
PluginRepoFactory pluginRepoFactory,
string memory ensSubdomain
) internal returns (address pluginSetup, PluginRepo) {
// Publish repo
LockToVotePluginSetup lockToVotePluginSetup = new LockToVotePluginSetup();

PluginRepo pluginRepo = pluginRepoFactory.createPluginRepoWithFirstVersion(
ensSubdomain, // ENS repo subdomain left empty
address(lockToVotePluginSetup),
maintainer,
" ",
" "
);
return (address(lockToVotePluginSetup), pluginRepo);
}

// return address(testToken);
// }
function prepareLockToApprove(
address maintainer,
PluginRepoFactory pluginRepoFactory,
string memory ensSubdomain
) internal returns (address pluginSetup, PluginRepo) {
// Publish repo
LockToApprovePluginSetup lockToApprovePluginSetup = new LockToApprovePluginSetup();

PluginRepo pluginRepo = pluginRepoFactory.createPluginRepoWithFirstVersion(
ensSubdomain,
address(lockToApprovePluginSetup),
maintainer,
" ",
" "
);
return (address(lockToApprovePluginSetup), pluginRepo);
}
}
8 changes: 1 addition & 7 deletions src/LockManager.sol
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,6 @@ import "@openzeppelin/contracts/utils/introspection/IERC165.sol";
/// @author Aragon X 2024
/// @notice Helper contract acting as the vault for locked tokens used to vote on multiple plugins and proposals.
contract LockManager is ILockManager, DaoAuthorizable {
/// @notice The ID of the permission required to call `setPluginAddress` function.
bytes32 public constant UPDATE_SETTINGS_PERMISSION_ID =
keccak256("UPDATE_SETTINGS_PERMISSION");

/// @notice The current LockManager settings
LockManagerSettings public settings;

Expand Down Expand Up @@ -224,9 +220,7 @@ contract LockManager is ILockManager, DaoAuthorizable {
}

/// @inheritdoc ILockManager
function setPluginAddress(
ILockToVoteBase _newPluginAddress
) public auth(UPDATE_SETTINGS_PERMISSION_ID) {
function setPluginAddress(ILockToVoteBase _newPluginAddress) public {
if (address(plugin) != address(0)) {
revert SetPluginAddressForbidden();
} else if (
Expand Down
5 changes: 2 additions & 3 deletions src/LockToApprovePlugin.sol
Original file line number Diff line number Diff line change
Expand Up @@ -328,9 +328,8 @@ contract LockToApprovePlugin is
return settings.proposalDuration;
}

/// @notice Returns the minimum voting power required to create a proposal stored in the voting settings.
/// @return The minimum voting power required to create a proposal.
function minProposerVotingPower() public view virtual returns (uint256) {
/// @inheritdoc ILockToVoteBase
function minProposerVotingPower() public view override returns (uint256) {
return settings.minProposerVotingPower;
}

Expand Down
Loading

0 comments on commit e463f1f

Please sign in to comment.