Skip to content

Commit

Permalink
Adding tests for all plugin setup's
Browse files Browse the repository at this point in the history
  • Loading branch information
brickpop committed Jul 15, 2024
1 parent 6e7afce commit f6541c3
Show file tree
Hide file tree
Showing 5 changed files with 361 additions and 49 deletions.
2 changes: 1 addition & 1 deletion .vscode/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
"solidity.packageDefaultDependenciesDirectory": "lib",
"editor.formatOnSave": true,
"[solidity]": {
"editor.defaultFormatter": "NomicFoundation.hardhat-solidity"
"editor.defaultFormatter": "NomicFoundation.hardhat-solidity"
},
"solidity.formatter": "forge",
"solidity.compileUsingRemoteVersion": "v0.8.17"
Expand Down
8 changes: 4 additions & 4 deletions src/setup/EmergencyMultisigPluginSetup.sol
Original file line number Diff line number Diff line change
Expand Up @@ -25,16 +25,16 @@ contract EmergencyMultisigPluginSetup is PluginSetup {
external
returns (address plugin, PreparedSetupData memory preparedSetupData)
{
// Decode `_data` to extract the params needed for deploying and initializing `EmergencyMultisig` plugin.
(EmergencyMultisig.MultisigSettings memory multisigSettings) = decodeInstallationParams(_data);
// Decode `_data` to extract the parameters needed for deploying and initializing `EmergencyMultisig` plugin.
(EmergencyMultisig.MultisigSettings memory multisigSettings) = decodeInstallationParameters(_data);

// Prepare and Deploy the plugin proxy.
plugin = createERC1967Proxy(
address(multisigBase), abi.encodeCall(EmergencyMultisig.initialize, (IDAO(_dao), multisigSettings))
);

// Prepare permissions
PermissionLib.MultiTargetPermission[] memory permissions = new PermissionLib.MultiTargetPermission[](3);
PermissionLib.MultiTargetPermission[] memory permissions = new PermissionLib.MultiTargetPermission[](2);

// Set permissions to be granted.
// Grant the list of permissions of the plugin to the DAO.
Expand Down Expand Up @@ -107,7 +107,7 @@ contract EmergencyMultisigPluginSetup is PluginSetup {
}

/// @notice Decodes the given byte array into the original installation parameters
function decodeInstallationParams(bytes memory _data)
function decodeInstallationParameters(bytes memory _data)
public
pure
returns (EmergencyMultisig.MultisigSettings memory _multisigSettings)
Expand Down
61 changes: 17 additions & 44 deletions src/setup/MultisigPluginSetup.sol
Original file line number Diff line number Diff line change
Expand Up @@ -21,31 +21,21 @@ contract MultisigPluginSetup is PluginSetup {
}

/// @inheritdoc IPluginSetup
function prepareInstallation(
address _dao,
bytes calldata _data
)
function prepareInstallation(address _dao, bytes calldata _data)
external
returns (address plugin, PreparedSetupData memory preparedSetupData)
{
// Decode `_data` to extract the params needed for deploying and initializing `Multisig` plugin.
(
address[] memory members,
Multisig.MultisigSettings memory multisigSettings
) = decodeInstallationParams(_data);
// Decode `_data` to extract the parameters needed for deploying and initializing `Multisig` plugin.
(address[] memory members, Multisig.MultisigSettings memory multisigSettings) =
decodeInstallationParameters(_data);

// Prepare and Deploy the plugin proxy.
plugin = createERC1967Proxy(
address(multisigBase),
abi.encodeCall(
Multisig.initialize,
(IDAO(_dao), members, multisigSettings)
)
address(multisigBase), abi.encodeCall(Multisig.initialize, (IDAO(_dao), members, multisigSettings))
);

// Prepare permissions
PermissionLib.MultiTargetPermission[]
memory permissions = new PermissionLib.MultiTargetPermission[](3);
PermissionLib.MultiTargetPermission[] memory permissions = new PermissionLib.MultiTargetPermission[](2);

// Set permissions to be granted.
// Grant the list of permissions of the plugin to the DAO.
Expand All @@ -69,25 +59,15 @@ contract MultisigPluginSetup is PluginSetup {
}

/// @inheritdoc IPluginSetup
function prepareUpdate(
address _dao,
uint16 _currentBuild,
SetupPayload calldata _payload
)
function prepareUpdate(address _dao, uint16 _currentBuild, SetupPayload calldata _payload)
external
pure
override
returns (
bytes memory initData,
PreparedSetupData memory preparedSetupData
)
returns (bytes memory initData, PreparedSetupData memory preparedSetupData)
{}

/// @inheritdoc IPluginSetup
function prepareUninstallation(
address _dao,
SetupPayload calldata _payload
)
function prepareUninstallation(address _dao, SetupPayload calldata _payload)
external
view
returns (PermissionLib.MultiTargetPermission[] memory permissions)
Expand Down Expand Up @@ -119,27 +99,20 @@ contract MultisigPluginSetup is PluginSetup {
}

/// @notice Encodes the given installation parameters into a byte array
function encodeInstallationParameters(
address[] memory _members,
Multisig.MultisigSettings memory _multisigSettings
) external pure returns (bytes memory) {
function encodeInstallationParameters(address[] memory _members, Multisig.MultisigSettings memory _multisigSettings)
external
pure
returns (bytes memory)
{
return abi.encode(_members, _multisigSettings);
}

/// @notice Decodes the given byte array into the original installation parameters
function decodeInstallationParams(
bytes memory _data
)
function decodeInstallationParameters(bytes memory _data)
public
pure
returns (
address[] memory _members,
Multisig.MultisigSettings memory _multisigSettings
)
returns (address[] memory _members, Multisig.MultisigSettings memory _multisigSettings)
{
(_members, _multisigSettings) = abi.decode(
_data,
(address[], Multisig.MultisigSettings)
);
(_members, _multisigSettings) = abi.decode(_data, (address[], Multisig.MultisigSettings));
}
}
179 changes: 179 additions & 0 deletions test/EmergencyMultisigPluginSetup.t.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,179 @@
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.17;

import {Test} from "forge-std/Test.sol";
import {EmergencyMultisig} from "../src/EmergencyMultisig.sol";
import {Multisig} from "../src/Multisig.sol";
import {EmergencyMultisigPluginSetup} from "../src/setup/EmergencyMultisigPluginSetup.sol";
import {GovernanceERC20} from "@aragon/osx/token/ERC20/governance/GovernanceERC20.sol";
import {GovernanceWrappedERC20} from "@aragon/osx/token/ERC20/governance/GovernanceWrappedERC20.sol";
import {IERC20Upgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol";
import {IDAO} from "@aragon/osx/core/dao/IDAO.sol";
import {RATIO_BASE} from "@aragon/osx/plugins/utils/Ratio.sol";
import {DAO} from "@aragon/osx/core/dao/DAO.sol";
import {IPluginSetup} from "@aragon/osx/framework/plugin/setup/PluginSetup.sol";
import {PermissionLib} from "@aragon/osx/core/permission/PermissionLib.sol";
import {ERC1967Proxy} from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol";
import {ERC20Mock} from "./mocks/ERC20Mock.sol";
import {TaikoL1} from "../src/adapted-dependencies/TaikoL1.sol";

contract EmergencyMultisigPluginSetupTest is Test {
EmergencyMultisigPluginSetup public pluginSetup;
GovernanceERC20 governanceERC20Base;
GovernanceWrappedERC20 governanceWrappedERC20Base;
address immutable daoBase = address(new DAO());
address immutable stdMultisigBase = address(new Multisig());
DAO dao;

// Recycled installation parameters
EmergencyMultisig.MultisigSettings eMultisigSettings;
address[] stdMembers;
Multisig stdMultisig;

address alice = address(0xa11ce);
address bob = address(0xb0b);
address carol = address(0xc4601);
address dave = address(0xd473);

error Unimplemented();

function setUp() public {
pluginSetup = new EmergencyMultisigPluginSetup();

// Address list source (std multisig)
stdMembers = new address[](4);
stdMembers[0] = alice;
stdMembers[1] = bob;
stdMembers[2] = carol;
stdMembers[3] = dave;
Multisig.MultisigSettings memory stdSettings =
Multisig.MultisigSettings({onlyListed: true, minApprovals: 3, destinationProposalDuration: 10 days});
stdMultisig = Multisig(
createProxyAndCall(
stdMultisigBase, abi.encodeCall(Multisig.initialize, (IDAO(dao), stdMembers, stdSettings))
)
);

// Default params
eMultisigSettings =
EmergencyMultisig.MultisigSettings({onlyListed: true, minApprovals: 3, addresslistSource: stdMultisig});
}

function test_ShouldEncodeInstallationParameters_1() public view {
// 1
bytes memory output = pluginSetup.encodeInstallationParameters(eMultisigSettings);

bytes memory expected =
hex"000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000030000000000000000000000005991a2df15a8f6a256d3ec51e99254cd3fb576a9";
assertEq(output, expected, "Incorrect encoded bytes");
}

function test_ShouldEncodeInstallationParameters_2() public {
// 2
stdMembers = new address[](2);
stdMembers[0] = alice;
stdMembers[1] = bob;
Multisig.MultisigSettings memory stdSettings =
Multisig.MultisigSettings({onlyListed: true, minApprovals: 1, destinationProposalDuration: 10 days});
stdMultisig = Multisig(
createProxyAndCall(
stdMultisigBase, abi.encodeCall(Multisig.initialize, (IDAO(dao), stdMembers, stdSettings))
)
);

eMultisigSettings =
EmergencyMultisig.MultisigSettings({onlyListed: true, minApprovals: 1, addresslistSource: stdMultisig});

bytes memory output = pluginSetup.encodeInstallationParameters(eMultisigSettings);
bytes memory expected =
hex"00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000c7183455a4c133ae270771860664b6b7ec320bb1";
assertEq(output, expected, "Incorrect encoded bytes");
}

function test_ShouldDecodeInstallationParameters_1() public view {
// 1
bytes memory installationParams = pluginSetup.encodeInstallationParameters(eMultisigSettings);

// Decode
(EmergencyMultisig.MultisigSettings memory outSettings) =
pluginSetup.decodeInstallationParameters(installationParams);

assertEq(outSettings.onlyListed, true, "Should be true");
assertEq(outSettings.minApprovals, 3, "Should be 3");
assertEq(
address(outSettings.addresslistSource),
address(eMultisigSettings.addresslistSource),
"Incorrect address list source"
);
}

function test_ShouldDecodeInstallationParameters_2() public {
// 2

stdMembers = new address[](2);
stdMembers[0] = alice;
stdMembers[1] = bob;
Multisig.MultisigSettings memory stdSettings =
Multisig.MultisigSettings({onlyListed: true, minApprovals: 1, destinationProposalDuration: 10 days});
stdMultisig = Multisig(
createProxyAndCall(
stdMultisigBase, abi.encodeCall(Multisig.initialize, (IDAO(dao), stdMembers, stdSettings))
)
);
eMultisigSettings =
EmergencyMultisig.MultisigSettings({onlyListed: false, minApprovals: 1, addresslistSource: stdMultisig});

bytes memory installationParams = pluginSetup.encodeInstallationParameters(eMultisigSettings);

// Decode
(EmergencyMultisig.MultisigSettings memory outSettings) =
pluginSetup.decodeInstallationParameters(installationParams);

assertEq(outSettings.onlyListed, false, "Should be false");
assertEq(outSettings.minApprovals, 1, "Should be 1");
assertEq(address(outSettings.addresslistSource), address(stdMultisig), "Incorrect address list source");
}

function test_PrepareInstallationReturnsTheProperPermissions() public {
bytes memory installationParams = pluginSetup.encodeInstallationParameters(eMultisigSettings);

(address _plugin, IPluginSetup.PreparedSetupData memory _preparedSetupData) =
pluginSetup.prepareInstallation(address(dao), installationParams);

assertEq(_plugin != address(0), true, "Plugin address should not be zero");
assertEq(_preparedSetupData.helpers.length, 0, "Zero helpers expected");
assertEq(
_preparedSetupData.permissions.length,
2, // permissions
"Incorrect permission length"
);
// 1
assertEq(
uint256(_preparedSetupData.permissions[0].operation),
uint256(PermissionLib.Operation.Grant),
"Incorrect operation"
);
assertEq(_preparedSetupData.permissions[0].where, _plugin, "Incorrect where");
assertEq(_preparedSetupData.permissions[0].who, address(dao), "Incorrect who");
assertEq(_preparedSetupData.permissions[0].condition, address(0), "Incorrect condition");
assertEq(
_preparedSetupData.permissions[0].permissionId,
keccak256("UPDATE_MULTISIG_SETTINGS_PERMISSION"),
"Incorrect permission id"
);
// 2
assertEq(_preparedSetupData.permissions[1].where, _plugin, "Incorrect where");
assertEq(_preparedSetupData.permissions[1].who, address(dao), "Incorrect who");
assertEq(_preparedSetupData.permissions[1].condition, address(0), "Incorrect condition");
assertEq(
_preparedSetupData.permissions[1].permissionId,
keccak256("UPGRADE_PLUGIN_PERMISSION"),
"Incorrect permission id"
);
}

// HELPERS
function createProxyAndCall(address _logic, bytes memory _data) private returns (address) {
return address(new ERC1967Proxy(_logic, _data));
}
}
Loading

0 comments on commit f6541c3

Please sign in to comment.