Skip to content
Merged
Show file tree
Hide file tree
Changes from 12 commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
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
14 changes: 13 additions & 1 deletion .semgrep/rules/sol-rules.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ rules:
paths:
exclude:
- packages/contracts-bedrock/test/dispute/WETH98.t.sol
- packages/contracts-bedrock/src/governance/ApprovalVotingModule.sol

- id: sol-safety-natspec-semver-match
languages: [generic]
Expand Down Expand Up @@ -110,6 +111,7 @@ rules:
exclude:
- packages/contracts-bedrock/test
- packages/contracts-bedrock/scripts
- packages/contracts-bedrock/src/governance/ApprovalVotingModule.sol

- id: sol-style-input-arg-fmt
languages: [solidity]
Expand All @@ -126,6 +128,7 @@ rules:
- packages/contracts-bedrock/src/L2/SuperchainETHBridge.sol
- packages/contracts-bedrock/src/governance/GovernanceToken.sol
- packages/contracts-bedrock/src/governance/VotingModule.sol
- packages/contracts-bedrock/src/governance/ApprovalVotingModule.sol

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

- id: sol-style-doc-comment
languages: [solidity]
Expand All @@ -150,6 +154,7 @@ rules:
paths:
exclude:
- packages/contracts-bedrock/test/safe-tools/CompatibilityFallbackHandler_1_3_0.sol
- packages/contracts-bedrock/src/governance/ApprovalVotingModule.sol

- id: sol-style-malformed-require
languages: [solidity]
Expand All @@ -171,6 +176,7 @@ rules:
- packages/contracts-bedrock/src/cannon/MIPS2.sol
- packages/contracts-bedrock/src/cannon/libraries/MIPSMemory.sol
- packages/contracts-bedrock/src/cannon/libraries/MIPSInstructions.sol
- packages/contracts-bedrock/src/governance/ApprovalVotingModule.sol

- id: sol-style-malformed-revert
languages: [solidity]
Expand All @@ -187,6 +193,7 @@ rules:
paths:
exclude:
- packages/contracts-bedrock/src/cannon/libraries/MIPSInstructions.sol
- packages/contracts-bedrock/src/governance/ApprovalVotingModule.sol

- id: sol-style-use-abi-encodecall
languages: [solidity]
Expand All @@ -203,6 +210,7 @@ rules:
exclude:
- packages/contracts-bedrock/src/L1/OPContractsManager.sol
- packages/contracts-bedrock/src/legacy/L1ChugSplashProxy.sol
- packages/contracts-bedrock/src/governance/ApprovalVotingModule.sol

- id: sol-style-enforce-require-msg
languages: [solidity]
Expand All @@ -214,6 +222,7 @@ rules:
paths:
exclude:
- packages/contracts-bedrock/src/universal/WETH98.sol
- packages/contracts-bedrock/src/governance/ApprovalVotingModule.sol

- id: sol-style-no-bare-imports
languages: [solidity]
Expand All @@ -223,6 +232,7 @@ rules:
paths:
exclude:
- packages/contracts-bedrock/test
- packages/contracts-bedrock/src/governance/ApprovalVotingModule.sol

- id: sol-style-error-format
languages: [generic]
Expand All @@ -244,6 +254,7 @@ rules:
- 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/governance/ApprovalVotingModule.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 @@ -347,6 +358,7 @@ rules:
- 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/governance/ApprovalVotingModule.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 All @@ -355,4 +367,4 @@ rules:
- packages/contracts-bedrock/src/safe/LivenessGuard.sol
- packages/contracts-bedrock/src/safe/LivenessModule.sol
- packages/contracts-bedrock/src/universal/OptimismMintableERC20.sol
- packages/contracts-bedrock/src/universal/ReinitializableBase.sol
- packages/contracts-bedrock/src/universal/ReinitializableBase.sol
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
pragma solidity ^0.8.0;

import {VotingModule} from "src/governance/VotingModule.sol";

interface IOptimismGovernor {
function propose(
address[] memory targets,
Expand All @@ -17,4 +18,11 @@ interface IOptimismGovernor {
string memory description,
uint8 proposalType
) external returns (uint256 proposalId);

function timelock() external view returns (address);

/// @notice Returns the snapshot block number for a proposal, 0 if proposal doesn't exist
/// @param proposalId The ID of the proposal
/// @return The snapshot block number, or 0 if proposal doesn't exist
function proposalSnapshot(uint256 proposalId) external view returns (uint256);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

interface IProposalTypesConfigurator {
/*//////////////////////////////////////////////////////////////
ERRORS
//////////////////////////////////////////////////////////////*/

error InvalidQuorum();
error InvalidApprovalThreshold();
error NotManagerOrTimelock();
error AlreadyInit();

/*//////////////////////////////////////////////////////////////
EVENTS
//////////////////////////////////////////////////////////////*/

event ProposalTypeSet(
uint8 indexed proposalTypeId, uint16 quorum, uint16 approvalThreshold, string name, string description
);

/*//////////////////////////////////////////////////////////////
STRUCTS
//////////////////////////////////////////////////////////////*/

struct ProposalType {
uint16 quorum;
uint16 approvalThreshold;
string name;
string description;
address module;
}

/*//////////////////////////////////////////////////////////////
FUNCTIONS
//////////////////////////////////////////////////////////////*/

function initialize(address _governor, ProposalType[] calldata _proposalTypes) external;

function proposalTypes(uint8 proposalTypeId) external view returns (ProposalType memory);

function setProposalType(
uint8 proposalTypeId,
uint16 quorum,
uint16 approvalThreshold,
string memory name,
string memory description,
address module
) external;
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ pragma solidity ^0.8.0;
import {IGovernanceToken} from './IGovernanceToken.sol';
import {IOptimismGovernor} from './IOptimismGovernor.sol';
import { ISemver } from "interfaces/universal/ISemver.sol";
import { IProposalTypesConfigurator } from './IProposalTypesConfigurator.sol';

/// @title IProposalValidator
/// @notice Interface for the ProposalValidator contract.
Expand All @@ -18,6 +19,9 @@ interface IProposalValidator is ISemver {
error ProposalValidator_VotingCycleAlreadySet();
error ProposalValidator_ProposalTypesDataLengthMismatch();
error ReinitializableBase_ZeroInitVersion();
error ProposalValidator_InvalidFundingProposalType();
error ProposalValidator_ExceedsDistributionThreshold();
error ProposalValidator_InvalidOptionsLength();

struct ProposalData {
address proposer;
Expand Down Expand Up @@ -56,14 +60,30 @@ interface IProposalValidator is ISemver {

event DistributionThresholdSet(uint256 newDistributionThreshold);

event ProposalTypeDataSet(ProposalType proposalType, uint256 requiredApprovals, uint8 proposalVotingModule);
event ProposalTypeDataSet(
ProposalType proposalType,
uint256 requiredApprovals,
uint8 proposalVotingModule
);

event ProposalVotingModuleData(
bytes32 indexed proposalHash,
bytes encodedVotingModuleData
);

event VotingCycleDataSet(
uint256 cycleNumber,
uint256 startBlock,
uint256 duration,
uint256 votingCycleDistributionLimit
);

event ProposalSubmitted(
bytes32 indexed proposalHash,
address indexed proposer,
string description,
ProposalType proposalType
);

event Initialized(uint8 version);

Expand All @@ -79,7 +99,7 @@ interface IProposalValidator is ISemver {
function setMinimumVotingPower(uint256 _minimumVotingPower) external;

function setDistributionThreshold(uint256 _distributionThreshold) external;

function setProposalTypeData(
ProposalType _proposalType,
ProposalTypeData memory _proposalTypeData
Expand All @@ -91,9 +111,19 @@ interface IProposalValidator is ISemver {
uint256 _duration,
uint256 _votingCycleDistributionLimit
) external;


function submitFundingProposal(
uint128 _criteriaValue,
string[] memory _optionsDescriptions,
address[] memory _optionsRecipients,
uint256[] memory _optionsAmounts,
string memory _description,
ProposalType _proposalType
) external returns (bytes32 proposalHash_);

function initialize(
address _owner,
IProposalTypesConfigurator _proposalTypesConfigurator,
uint256 _minimumVotingPower,
uint256 _cycleNumber,
uint256 _startBlock,
Expand Down Expand Up @@ -123,9 +153,11 @@ interface IProposalValidator is ISemver {
function initVersion() external view returns (uint8);

function ATTESTATION_SCHEMA_UID() external view returns (bytes32);

function proposalTypesConfigurator() external view returns (IProposalTypesConfigurator);

function proposalTypesData(ProposalType) external view returns (uint256 requiredApprovals, uint8 proposalVotingModule);

function votingCycles(uint256) external view returns (
uint256 startingBlock,
uint256 duration,
Expand Down
Loading