Skip to content
Merged
Show file tree
Hide file tree
Changes from 30 commits
Commits
Show all changes
38 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
585f3dc
feat: add duplicated proposals validation
0xChin Apr 28, 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
6d7accc
Merge branch 'feat/add-delegate-proposal-validator' into feat/duplica…
0xChin May 6, 2025
513253a
chore: run pre-pr
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
23fd96a
Merge branch 'feat/add-delegate-proposal-validator' into feat/duplica…
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
4393002
Merge branch 'feat/add-delegate-proposal-validator' into feat/duplica…
0xChin May 6, 2025
519aee7
Merge branch 'sc-feat/permissionless-proposals' into feat/duplicated-…
0xChin May 6, 2025
55e5114
chore: run pre-pr
0xChin May 6, 2025
ad61628
chore: more descriptive errors
0xChin May 6, 2025
baf0841
chore: confusing error name in submitProposal
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,129 @@
// 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();
error ProposalValidator_UnexistentProposal();

struct ProposalData {
address proposer;
ProposalType proposalType;
uint8 proposalTypeConfigurator;
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(
bytes32 indexed proposalHash,
address indexed proposer,
address[] targets,
uint256[] values,
bytes[] calldatas,
string description,
ProposalType proposalType,
uint8 proposalTypeConfigurator
);

event ProposalApproved(
bytes32 indexed proposalHash,
address indexed approver
);

event ProposalMovedToVote(
bytes32 indexed proposalHash,
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,
uint8 _proposalTypeConfigurator,
bytes32 _attestationUid
) external returns (bytes32 proposalHash_);

function approveProposal(bytes32 _proposalHash) external;

function moveToVote(
address[] memory _targets,
uint256[] memory _values,
bytes[] memory _calldatas,
string memory _description
) 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 votingToken() 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
) external;
}
Loading