Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
bd40311
feat: add initial interface and logic
0xChin Apr 14, 2025
c978296
refactor: remove installed governor submodule
0xChin Apr 14, 2025
e0fffdf
chore: remove xERC20
0xChin Apr 14, 2025
bf3218e
feat: add proposal routing full flow
0xChin Apr 18, 2025
1eff3c6
feat: check voting power and required proposals
0xChin Apr 22, 2025
e6d256c
refactor: rename to ProposalValidator
0xChin Apr 23, 2025
c1f1abf
feat: add EAS validation for certain Proposal Types
0xChin Apr 23, 2025
53a8b06
chore: fix attestation schema approved address naming
0xChin May 1, 2025
e6721e5
chore: remove management functions
0xChin May 1, 2025
2786406
chore: run pre-pr
0xChin May 6, 2025
0e9a403
refacto: follow style guide for function parameters and return variables
0xChin May 6, 2025
0c0dc9b
docs: add natspec, remove unused errors
0xChin May 6, 2025
389b3c7
chore: remove management functions from interface
0xChin May 6, 2025
3a06bd1
chore: make voting token immutable
0xChin May 6, 2025
0fbc510
perf: make governor immutable
0xChin May 6, 2025
7ecb908
feat: add validator management functions
0xChin May 6, 2025
d588a1e
chore: add comments for imports in ProposalValidator
0xChin May 6, 2025
d87a2c1
test: add unit tests
0xChin May 6, 2025
c5ab973
fix: semgrep warnings
0xChin May 6, 2025
3266bff
chore: rename MaintenanceUpgradeProposals --> MaintenanceUpgrade
0xChin May 6, 2025
4337e06
chore(semgrep): add excluded governance files
0xChin May 6, 2025
01d4bb3
chore: fix coding style
0xChin May 6, 2025
7557215
chore: add ImmutableProposalTypeData
0xChin May 6, 2025
f1ad385
chore: improve errors naming
0xChin May 6, 2025
a2879ff
docs: improve natspec
0xChin May 6, 2025
1eef92c
docs: add technical explanation on attestation validation function
0xChin May 6, 2025
30c171b
feat: add _proposalTypeData mapping
0xChin May 6, 2025
5ff0692
chore: keep private functions consistency
0xChin May 6, 2025
d95a3d7
chore: improve required attestation naming
0xChin May 6, 2025
33230de
docs: improve documents legibility
0xChin May 6, 2025
e062c4b
chore: fix immutable variables coding style
0xChin May 6, 2025
078915b
chore: explain governor external call
0xChin May 6, 2025
a6cc075
docs: explicit Validator/Governor contract interaction in events natspec
0xChin May 6, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions .semgrep/rules/sol-rules.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -125,6 +125,7 @@ rules:
- packages/contracts-bedrock/src/universal/WETH98.sol
- packages/contracts-bedrock/src/L2/SuperchainETHBridge.sol
- packages/contracts-bedrock/src/governance/GovernanceToken.sol
- packages/contracts-bedrock/src/governance/VotingModule.sol

- id: sol-style-return-arg-fmt
languages: [solidity]
Expand All @@ -139,6 +140,7 @@ rules:
- packages/contracts-bedrock/test/safe-tools
- packages/contracts-bedrock/scripts/libraries/Solarray.sol
- packages/contracts-bedrock/scripts/interfaces/IGnosisSafe.sol
- packages/contracts-bedrock/src/governance/VotingModule.sol

- id: sol-style-doc-comment
languages: [solidity]
Expand Down Expand Up @@ -241,6 +243,7 @@ rules:
- packages/contracts-bedrock/src/libraries/Blueprint.sol
- packages/contracts-bedrock/src/dispute/lib/Errors.sol
- packages/contracts-bedrock/src/dispute/SuperFaultDisputeGame.sol
- packages/contracts-bedrock/src/governance/VotingModule.sol
- packages/contracts-bedrock/src/cannon/libraries/MIPS64Instructions.sol
- packages/contracts-bedrock/src/cannon/libraries/CannonErrors.sol
- packages/contracts-bedrock/src/L2/SuperchainETHBridge.sol
Expand Down Expand Up @@ -341,6 +344,9 @@ rules:
- packages/contracts-bedrock/src/dispute/SuperFaultDisputeGame.sol
- packages/contracts-bedrock/src/dispute/SuperPermissionedDisputeGame.sol
- packages/contracts-bedrock/src/governance/MintManager.sol
- packages/contracts-bedrock/src/governance/ProposalValidator.sol
- packages/contracts-bedrock/src/governance/VotingModule.sol
- packages/contracts-bedrock/src/governance/ProposalValidator.sol
- packages/contracts-bedrock/src/periphery/TransferOnion.sol
- packages/contracts-bedrock/src/periphery/faucet/Faucet.sol
- packages/contracts-bedrock/src/periphery/faucet/authmodules/AdminFaucetAuthModule.sol
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import {VotingModule} from "src/governance/VotingModule.sol";
interface IOptimismGovernor {
function propose(
address[] memory targets,
uint256[] memory values,
bytes[] memory calldatas,
string memory description,
uint8 proposalType
) external returns (uint256 proposalId);

function proposeWithModule(
VotingModule module,
bytes memory proposalData,
string memory description,
uint8 proposalType
) external returns (uint256 proposalId);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,125 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import {IGovernanceToken} from "./IGovernanceToken.sol";
import {IOptimismGovernor} from "./IOptimismGovernor.sol";

/// @title IProposalValidator
/// @notice Interface for the ProposalValidator contract.
interface IProposalValidator {
error ProposalValidator_InsufficientApprovals();
error ProposalValidator_ProposalAlreadyApproved();
error ProposalValidator_ProposalAlreadyInVoting();
error ProposalValidator_InsufficientVotingPower();
error ProposalValidator_InvalidAttestation();

struct ProposalData {
address proposer;
address[] targets;
uint256[] values;
bytes[] calldatas;
string description;
ProposalType proposalType;
bool inVoting;
mapping(address => bool) delegateApprovals;
uint256 remainingApprovalsRequired;
}

struct ImmutableProposalTypeData {
address[] targets;
uint256[] values;
string[] signatures;
}

enum ProposalType {
ProtocolOrGovernorUpgrade,
MaintenanceUpgrade,
CouncilMemberElections,
GovernanceFund,
CouncilBudget
}

event ProposalSubmitted(
uint256 indexed proposalId,
address indexed proposer,
address[] targets,
uint256[] values,
bytes[] calldatas,
string description,
ProposalType proposalType
);

event ProposalApproved(
uint256 indexed proposalId,
address indexed approver
);

event ProposalMovedToVote(
uint256 indexed proposalId,
address indexed executor
);

event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

event MinimumVotingPowerSet(uint256 newMinimumVotingPower);

event VotingCycleBlockSet(uint256 newVotingCycleBlock);

event DistributionThresholdSet(uint256 newDistributionThreshold);

event ProposalApprovalThresholdSet(ProposalType proposalType, uint256 newApprovalThreshold);

function submitProposal(
address[] memory _targets,
uint256[] memory _values,
bytes[] memory _calldatas,
string memory _description,
ProposalType _proposalType,
bytes32 _attestationUid
) external returns (uint256 proposalId_);

function approveProposal(uint256 _proposalId) external;

function moveToVote(uint256 _proposalId) external returns (uint256 governorProposalId_);

function setMinimumVotingPower(uint256 _minimumVotingPower) external;

function setVotingCycleBlock(uint256 _votingCycleBlock) external;

function setDistributionThreshold(uint256 _distributionThreshold) external;

function setProposalRequiredApprovals(ProposalType _proposalType, uint256 _requiredApprovals) external;

function renounceOwnership() external;

function canSignOff(address _delegate) external view returns (bool canSignOff_);

function transferOwnership(address newOwner) external;

function minimumVotingPower() external view returns (uint256);

function votingCycleBlock() external view returns (uint256);

function distributionThreshold() external view returns (uint256);

function VOTING_TOKEN() external view returns (IGovernanceToken);

function GOVERNOR() external view returns (IOptimismGovernor);

function owner() external view returns (address);

function ATTESTATION_SCHEMA_UID() external view returns (bytes32);

function __constructor__(
address _owner,
IOptimismGovernor _governor,
IGovernanceToken _votingToken,
bytes32 _attestationSchemaUid,
uint256 _minimumVotingPower,
uint256 _votingCycleBlock,
uint256 _distributionThreshold,
ProposalType[] memory _proposalTypes,
uint256[] memory _requiredApprovals,
ImmutableProposalTypeData[] memory _immutableProposalTypeDatas
) external;
}
Loading