Medium Severity Risks
Issue
Contexts
MED‑1
block.number
means different things on different L2s
8
MED‑2
Condition will not revert when block.timestamp
is ==
to the compared variable
1
MED‑3
Contracts do not work with fee-on-transfer tokens
13
MED‑4
Some tokens may revert when zero value transfers are made
4
MED‑5
Use _safeMint
instead of _mint
2
MED‑6
Return values of transfer()
/transferFrom()
not checked
7
MED‑7
Use safetransfer
Instead Of transfer
7
MED‑8
Admin privilege - A single point of failure can allow a hacked or malicious owner use critical functions in the project
16
Total: 68 contexts over 10 issues
Low Severity Risks
Issue
Contexts
LOW‑1
Add to blacklist
function
53
LOW‑2
Array lengths not checked
5
LOW‑3
Avoid using tx.origin
2
LOW‑4
Consider the case where totalsupply
is 0
6
LOW‑5
Use of ecrecover
is susceptible to signature malleability
4
LOW‑6
External call recipient may consume all transaction gas
6
LOW‑7
External calls in an un-bounded for-
loop may result in a DOS
55
LOW‑8
Init functions are susceptible to front-running
6
LOW‑9
Possible rounding issue
16
LOW‑10
Setting Minter to zero address should be avoided
2
LOW‑11
Missing Contract-existence Checks Before Low-level Calls
35
LOW‑12
Missing Checks for Address(0x0)
15
LOW‑13
Contracts are not using their OZ Upgradeable counterparts
19
LOW‑14
Prevent division by 0
4
LOW‑15
Protect your NFT from copying in POW forks
1
LOW‑16
Contracts are designed to receive ETH but do not implement function for withdrawal
4
LOW‑17
safeTransfer
function does not check for contract existence
2
LOW‑18
Missing Reentrancy-Guard when using sendValue
from OZ's Address.sol
1
LOW‑19
Solidity version 0.8.20 may not work on other chains due to PUSH0
33
LOW‑20
Storage Write Removal Bug On Conditional Early Termination
1
LOW‑21
TransferOwnership Should Be Two Step
21
LOW‑22
Unbounded loop
2
LOW‑23
Unused receive()
Function Will Lock Ether In Contract
4
LOW‑24
No Storage Gap For Upgradeable Contracts
6
LOW‑25
Upgrade OpenZeppelin Contract Dependency
4
LOW‑26
Use Ownable2Step
rather than Ownable
4
Total: 318 contexts over 30 issues
Issue
Contexts
NC‑1
address
shouldn't be hard-coded
6
NC‑2
Avoid Floating Pragmas: The Version Should Be Locked
33
NC‑3
Avoid the use of sensitive terms
3
NC‑4
No need for == true
or == false
checks
4
NC‑5
Variable names that consist of all capital letters should be reserved for constant
/immutable
variables
10
NC‑6
Compliance with Solidity Style rules in Constant expressions
4
NC‑7
Consider adding a deny-list
3
NC‑8
Consider disabling renounceOwnership()
2
NC‑9
Consider using named mappings
29
NC‑10
Consistent usage of require vs custom error
149
NC‑11
Constant redefined elsewhere
76
NC‑12
Constants Should Be Defined Rather Than Using Magic Numbers
3
NC‑13
Constants in comparisons should appear on the left side
11
NC‑14
Contract does not follow the Solidity style guide's suggested layout ordering
7
NC‑15
Critical Changes Should Use Two-step Procedure
14
NC‑16
Duplicated require()
/revert()
Checks Should Be Refactored To A Modifier Or Function
6
NC‑17
else
-block not required
5
NC‑18
Event emit should emit a parameter
3
NC‑19
Mint events missing key information
2
NC‑20
Events are missing sender information
63
NC‑21
Event Is Missing Indexed Fields
61
NC‑22
File is missing NatSpec
11
NC‑23
Function writing that does not comply with the Solidity Style Guide
4
NC‑24
Large or complicated code bases should implement fuzzing tests
1
NC‑25
Use delete
to Clear Variables
32
NC‑26
Immutables can be named using the same convention
7
NC‑27
Imports can be grouped together
53
NC‑28
No need to initialize uints to zero
9
NC‑29
Initial value check is missing in Set Functions
13
NC‑30
Interfaces should be indicated with an I
prefix in the contract name
1
NC‑31
Lines are too long
189
NC‑32
Long functions should be refactored into multiple, smaller, functions
4
NC‑33
Missing event for critical parameter change
3
NC‑34
NatSpec comments should be increased in contracts
1
NC‑35
NatSpec @param
is missing
60
NC‑36
NatSpec @return
argument is missing
20
NC‑37
Non-assembly Method Available
1
NC‑38
Non-external
/public
function names should begin with an underscore
74
NC‑39
Non-usage of specific imports
7
NC‑40
Numeric values having to do with time should use time units for readability
10
NC‑41
Use a more recent version of Solidity
33
NC‑42
Omissions in Events
9
NC‑43
Public Functions Not Called By The Contract Should Be Declared External Instead
16
NC‑44
Empty blocks should be removed or emit something
21
NC‑45
Remove forge-std
import
10
NC‑46
Remove unused error
definition
2
NC‑47
Strings should use double quotes rather than single quotes
26
NC‑48
2**<N> - 1
Should Be Re-written As type(uint<N>).max
2
NC‑49
Using underscore at the end of variable name
41
NC‑50
Large multiples of ten should use scientific notation
7
NC‑51
Use bytes.concat()
10
NC‑52
Use @inheritdoc rather than using a non-standard annotation
12
NC‑53
Use named function calls
7
NC‑54
Use Underscores for Number Literals
7
NC‑55
Cast to bytes
or bytes32
for clearer semantic meaning
6
NC‑56
Implement some type of version counter that will be incremented automatically for contract upgrades
5
Total: 56 issues
Gas Optimizations
Issue
Contexts
Estimated Gas Saved
GAS‑1
abi.encode()
is less efficient than abi.encodepacked()
39
3900
GAS‑2
Consider activating via-ir
for deploying
1
250
GAS‑3
<array>.length
Should Not Be Looked Up In Every Loop Of A For-loop
31
3007
GAS‑4
Use assembly to emit events
132
5016
GAS‑5
Comparing to constant boolean
4
32
GAS‑6
Setting the constructor
to payable
12
156
GAS‑7
Don't compare boolean expressions to boolean literals
4
36
GAS‑8
Duplicated require()
/revert()
Checks Should Be Refactored To A Modifier Or Function
6
168
GAS‑9
Empty Blocks Should Be Removed Or Emit Something
12
132
GAS‑10
Using delete
statement can save gas
41
328
GAS‑11
++i
Costs Less Gas Than i++
, Especially When It’s Used In For-loops (--i
/i--
Too)
23
138
GAS‑12
Use assembly
to write address storage values
6
444
GAS‑13
Functions guaranteed to revert when called by normal users can be marked payable
36
756
GAS‑14
It Costs More Gas To Initialize Variables To Zero Than To Let The Default Of Zero Be Applied
26
156
GAS‑15
internal
functions only called once can be inlined to save gas
46
1012
GAS‑16
Multiple accesses of a mapping/array should use a local variable cache
320
25600
GAS‑17
Multiple Address Mappings Can Be Combined Into A Single Mapping Of An Address To A Struct, Where Appropriate
21
10500
GAS‑18
Multiplication/division By Two Should Use Bit Shifting
3
24
GAS‑19
Expression `` is cheaper than new bytes(0)
1
259
GAS‑20
Optimize names to save gas
25
550
GAS‑21
<x> += <y>
Costs More Gas Than <x> = <x> + <y>
For State Variables
5
30
GAS‑22
Structs can be packed into fewer storage slots by editing time variables
2
4000
GAS‑23
Using private
rather than public
for constants, saves gas
119
404600
GAS‑24
Remove forge-std
import
10
1000
GAS‑25
require()
/revert()
Strings Longer Than 32 Bytes Cost Extra Gas
70
980
GAS‑26
The result of a function call should be cached rather than re-calling the function
16
800
GAS‑27
Shorten the array rather than copying to a new one
21
1050
GAS‑28
Splitting require()
Statements That Use &&
Saves Gas
2
18
GAS‑29
Help The Optimizer By Saving A Storage Variable’s Reference Instead Of Repeatedly Fetching It
12
648
GAS‑30
Structs can be packed into fewer storage slots
2
4000
GAS‑31
Superfluous event fields
15
510
GAS‑32
Usage of uints
/ints
smaller than 32 bytes (256 bits) incurs overhead
97
582
GAS‑33
++i
/i++
Should Be unchecked{++i}
/unchecked{i++}
When It Is Not Possible For Them To Overflow, As Is The Case When Used In For- And While-loops
32
1120
GAS‑34
Using unchecked
blocks to save gas
14
280
GAS‑35
Use assembly to check for address(0)
2
52
GAS‑36
Use functions instead of modifiers
33
3300
GAS‑37
Use v4.9.0 OpenZeppelin contracts
4
112
GAS‑38
Use of Custom Errors Instead of String
80
960
GAS‑39
Use solidity version 0.8.20 to gain some gas boost
15
1320
GAS‑40
Use Short Circuiting rules to your advantage
2
2000
GAS‑41
Using storage
instead of memory
saves gas
3
1050
GAS‑42
Use uint256(1)
/uint256(2)
instead for true
and false
boolean states
40
200000
GAS‑43
Using Bools For Storage Incurs Overhead
7
119700
Total: 43 issues
On Optimism, block.number
is the L2 block number, but on Arbitrum, it's the L1 block number, and ArbSys(address(100)).arbBlockNumber()
must be used. Furthermore, L2 block numbers often occur much more frequently than L1 block numbers (any may even occur on a per-transaction basis), so using block numbers for timing results in inconsistencies, especially when voting is involved across multiple chains. As of version 4.9, OpenZeppelin has modified their governor code to use a clock rather than block numbers, to avoid these sorts of issues, but this still requires that the project implement a clock for each L2.
File: NounsDAOLogicV2.sol
236 : temp.startBlock = block .number + votingDelay;
258 : newProposal.creationBlock = block .number ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L236
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L258
File: NounsDAOLogicV2.sol
1024 : uint32 blockNumber = safe32 (block .number , 'block number exceeds 32 bits ' );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L1024
File: NounsDAOV3Admin.sol
583 : uint32 blockNumber = safe32 (block .number , 'block number exceeds 32 bits ' );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L583
File: NounsDAOV3Proposals.sol
898 : uint64 updatePeriodEndBlock = SafeCast.toUint64 (block .number + ds.proposalUpdatablePeriodInBlocks);
913 : newProposal.creationBlock = SafeCast.toUint64 (block .number );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L898
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L913
File: NounsDAOLogicV1Fork.sol
313 : temp.startBlock = block .number + votingDelay;
335 : newProposal.creationBlock = block .number ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L313
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L335
The condition does not revert when block.timestamp is equal to the compared >
or <
variable. For example, if there is a check for block.timestamp > proposerSignature.expirationTimestamp
then there should be a check for cases where block.timestamp
is ==
to proposerSignature.expirationTimestamp
File: NounsDAOV3Proposals.sol
989 : if (block .timestamp > proposerSignature.expirationTimestamp) revert SignatureExpired ();
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L989
Some tokens take a transfer fee (e.g. STA, PAXG), some do not currently charge a fee but may do so in the future (e.g. USDT, USDC).
Without measuring the balance before and after the transfer, there's no way to ensure that enough tokens were transferred, in the cases where the token has a fee-on-transfer mechanic. If there are latent funds in the contract, subsequent transfers will succeed.
File: NounsDAOExecutorV2.sol
228 : IERC20 (erc20Token).safeTransfer (recipient, tokensToSend);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutorV2.sol#L228
File: NounsDAOV3Admin.sol
604 : if (erc20tokens[i] == erc20tokens[j]) revert DuplicateTokenAddress ();
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L604
File: NounsDAOV3Fork.sol
253 : IERC20 erc20token = IERC20 (ds.erc20TokensToIncludeInFork[i]);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/NounsDAOV3Fork.sol#L253
File: NounsAuctionHouseFork.sol
264 : IERC20 (weth).transfer (to, amount);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/NounsAuctionHouseFork.sol#L264
File: NounsDAOLogicV1Fork.sol
232 : IERC20 erc20token = IERC20 (erc20TokensToInclude[i]);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L232
File: NounsDAOLogicV1Fork.sol
798 : if (erc20tokens[i] == erc20tokens[j]) revert DuplicateTokenAddress ();
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L798
File: ERC20Transferer .sol
34 : IERC20 (token).transferFrom (msg .sender , to, balance);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/utils/ERC20Transferer.sol#L34
File: DeployDAOV3NewContractsBase.s.sol
57 : (forkEscrow, forkDeployer, daoV3Impl, timelockV2, erc20Transferer) = deployNewContracts ();
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/DeployDAOV3NewContractsBase.s.sol#L57
File: DeployDAOV3NewContractsBase.s.sol
93 : erc20Transferer = new ERC20Transferer ();
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/DeployDAOV3NewContractsBase.s.sol#L93
File: ProposeDAOV3UpgradeMainnet.s.sol
29 : address erc20Transferer = vm.envAddress ('ERC20_TRANSFERER ' );
33 : address [] memory erc20TokensToIncludeInFork = new address [](1 );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L29
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L33
File: ProposeDAOV3UpgradeTestnet.s.sol
37 : address erc20Transferer = vm.envAddress ('ERC20_TRANSFERER ' );
41 : address [] memory erc20TokensToIncludeInFork = new address [](1 );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L37
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L41
Recommended Mitigation Steps
Consider comparing before and after balance to get the actual transferred amount.
Alternatively, disallow tokens with fee-on-transfer mechanics to be added as reward tokens.
In spite of the fact that EIP-20 states that zero-valued transfers must be accepted, some tokens, such as LEND will revert if this is attempted, which may cause transactions that involve other tokens (such as batch operations) to fully revert. Consider skipping the transfer if the amount is zero, which will also save gas.
File: NounsDAOExecutorV2.sol
221 : function sendERC20 (
address recipient ,
address erc20Token ,
uint256 tokensToSend
) external {
require (msg .sender == admin, 'NounsDAOExecutor::sendERC20: Call must come from admin. ' );
IERC20 (erc20Token).safeTransfer (recipient, tokensToSend);
emit ERC20Sent (recipient, erc20Token, tokensToSend);
}
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutorV2.sol#L221
File: NounsDAOForkEscrow.sol
116 : function returnTokensToOwner (address owner , uint256 [] calldata tokenIds ) external onlyDAO {
for (uint256 i = 0 ; i < tokenIds.length ; i++ ) {
if (currentOwnerOf (tokenIds[i]) != owner) revert NotOwner ();
nounsToken.transferFrom (address (this ), owner, tokenIds[i]);
escrowedTokensByForkId[forkId][tokenIds[i]] = address (0 );
}
numTokensInEscrow -= tokenIds.length ;
}
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/NounsDAOForkEscrow.sol#L116
File: NounsDAOForkEscrow.sol
147 : function withdrawTokens (uint256 [] calldata tokenIds , address to ) external onlyDAO {
for (uint256 i = 0 ; i < tokenIds.length ; i++ ) {
if (currentOwnerOf (tokenIds[i]) != dao) revert NotOwner ();
nounsToken.transferFrom (address (this ), to, tokenIds[i]);
}
}
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/NounsDAOForkEscrow.sol#L147
File: ERC20Transferer .sol
32 : function transferEntireBalance (address token , address to ) external returns (uint256 ) {
uint256 balance = IERC20 (token).balanceOf (msg .sender );
IERC20 (token).transferFrom (msg .sender , to, balance);
return balance;
}
}
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/utils/ERC20Transferer.sol#L32
According to openzepplin's ERC721, the use of _mint
is discouraged, use _safeMint whenever possible.
https://docs.openzeppelin.com/contracts/3.x/api/token/erc721#ERC721-_mint-address-uint256-
File: NounsTokenFork.sol
302 : _mint (to, nounId);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/NounsTokenFork.sol#L302
File: NounsTokenFork.sol
318 : _mint (to, nounId);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/NounsTokenFork.sol#L318
Recommended Mitigation Steps
Use _safeMint
whenever possible instead of _mint
Not all IERC20
implementations revert()
when there's a failure in transfer()
/transferFrom()
. The function signature has a boolean
return value and they indicate errors that way instead. By not checking the return value, operations that should have marked as failed, may potentially go through without actually making a payment
File: NounsDAOForkEscrow.sol
120 : nounsToken.transferFrom (address (this ), owner, tokenIds[i]);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/NounsDAOForkEscrow.sol#L120
File: NounsDAOForkEscrow.sol
151 : nounsToken.transferFrom (address (this ), to, tokenIds[i]);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/NounsDAOForkEscrow.sol#L151
File: NounsDAOV3Fork.sol
154 : ds.nouns.transferFrom (msg .sender , timelock, tokenIds[i]);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/NounsDAOV3Fork.sol#L154
File: NounsAuctionHouseFork.sol
248 : nouns.transferFrom (address (this ), _auction.bidder, _auction.nounId);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/NounsAuctionHouseFork.sol#L248
File: NounsAuctionHouseFork.sol
264 : IERC20 (weth).transfer (to, amount);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/NounsAuctionHouseFork.sol#L264
File: NounsDAOLogicV1Fork.sol
224 : nouns.transferFrom (msg .sender , address (timelock), tokenIds[i]);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L224
File: ERC20Transferer .sol
34 : IERC20 (token).transferFrom (msg .sender , to, balance);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/utils/ERC20Transferer.sol#L34
It is good to add a require()
statement that checks the return value of token transfers or to use something like OpenZeppelin’s safeTransfer
/safeTransferFrom
unless one is sure the given token reverts in case of a failure. Failure to do so will cause silent failures of transfers and affect token accounting in contract.
For example, Some tokens do not implement the ERC20 standard properly but are still accepted by most code that accepts ERC20 tokens. For example Tether (USDT)'s transfer() and transferFrom() functions do not return booleans as the specification requires, and instead have no return value. When these sorts of tokens are cast to IERC20, their function signatures do not match and therefore the calls made, revert.
File: NounsDAOForkEscrow.sol
120 : nounsToken.transferFrom (address (this ), owner, tokenIds[i]);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/NounsDAOForkEscrow.sol#L120
File: NounsDAOForkEscrow.sol
151 : nounsToken.transferFrom (address (this ), to, tokenIds[i]);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/NounsDAOForkEscrow.sol#L151
File: NounsDAOV3Fork.sol
154 : ds.nouns.transferFrom (msg .sender , timelock, tokenIds[i]);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/NounsDAOV3Fork.sol#L154
File: NounsAuctionHouseFork.sol
248 : nouns.transferFrom (address (this ), _auction.bidder, _auction.nounId);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/NounsAuctionHouseFork.sol#L248
File: NounsAuctionHouseFork.sol
264 : IERC20 (weth).transfer (to, amount);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/NounsAuctionHouseFork.sol#L264
File: NounsDAOLogicV1Fork.sol
224 : nouns.transferFrom (msg .sender , address (timelock), tokenIds[i]);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L224
File: ERC20Transferer .sol
34 : IERC20 (token).transferFrom (msg .sender , to, balance);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/utils/ERC20Transferer.sol#L34
Recommended Mitigation Steps
Consider using safeTransfer
/safeTransferFrom
or require()
consistently.
The owner
role has a single point of failure and onlyOwner
can use critical a few functions.
owner
role in the project:
Owner is not behind a multisig and changes are not behind a timelock.
Even if protocol admins/developers are not malicious there is still a chance for Owner keys to be stolen. In such a case, the attacker can cause serious damage to the project due to important functions. In such a case, users who have invested in project will suffer high financial losses.
Hacked owner or malicious owner can immediately use critical functions in the project.
File: NounsAuctionHouseFork.sol
159 : function pause () external override onlyOwner {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/NounsAuctionHouseFork.sol#L159
File: NounsAuctionHouseFork.sol
168 : function unpause () external override onlyOwner {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/NounsAuctionHouseFork.sol#L168
File: NounsAuctionHouseFork.sol
180 : function setTimeBuffer (uint256 _timeBuffer ) external override onlyOwner {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/NounsAuctionHouseFork.sol#L180
File: NounsAuctionHouseFork.sol
190 : function setReservePrice (uint256 _reservePrice ) external override onlyOwner {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/NounsAuctionHouseFork.sol#L190
File: NounsAuctionHouseFork.sol
200 : function setMinBidIncrementPercentage (uint8 _minBidIncrementPercentage ) external override onlyOwner {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/NounsAuctionHouseFork.sol#L200
File: NounsAuctionHouseFork.sol
281 : function _authorizeUpgrade (address ) internal view override onlyOwner {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/NounsAuctionHouseFork.sol#L281
File: NounsTokenFork.sol
198 : function setContractURIHash (string memory newContractURIHash ) external onlyOwner {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/NounsTokenFork.sol#L198
File: NounsTokenFork.sol
206 : function mint () public override onlyMinter returns (uint256 ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/NounsTokenFork.sol#L206
File: NounsTokenFork.sol
213 : function burn (uint256 nounId ) public override onlyMinter {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/NounsTokenFork.sol#L213
File: NounsTokenFork.sol
240 : function setMinter (address _minter ) external override onlyOwner whenMinterNotLocked {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/NounsTokenFork.sol#L240
File: NounsTokenFork.sol
250 : function lockMinter () external override onlyOwner whenMinterNotLocked {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/NounsTokenFork.sol#L250
File: NounsTokenFork.sol
260 : function setDescriptor (INounsDescriptorMinimal _descriptor ) external override onlyOwner whenDescriptorNotLocked {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/NounsTokenFork.sol#L260
File: NounsTokenFork.sol
270 : function lockDescriptor () external override onlyOwner whenDescriptorNotLocked {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/NounsTokenFork.sol#L270
File: NounsTokenFork.sol
280 : function setSeeder (INounsSeeder _seeder ) external override onlyOwner whenSeederNotLocked {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/NounsTokenFork.sol#L280
File: NounsTokenFork.sol
290 : function lockSeeder () external override onlyOwner whenSeederNotLocked {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/NounsTokenFork.sol#L290
File: NounsTokenFork.sol
327 : function _authorizeUpgrade (address ) internal view override onlyOwner {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/NounsTokenFork.sol#L327
Recommended Mitigation Steps
Add a time lock to critical functions. Admin-only functions that change critical parameters should emit events and have timelocks.
Events allow capturing the changed parameters so that off-chain tools/interfaces can register such changes with timelocks that allow users to evaluate them and consider if they would like to engage/exit based on how they perceive the changes as affecting the trustworthiness of the protocol or profitability of the implemented financial services.
Allow only multi-signature wallets to call the function to reduce the likelihood of an attack.
https://twitter.com/danielvf/status/1572963475101556738?s=20&t=V1kvzfJlsx-D2hfnG0OmuQ
NFT thefts have increased recently, so with the addition of hacked NFTs to the platform, NFTs can be converted into liquidity. To prevent this, I recommend adding the blacklist function.
Marketplaces such as Opensea have a blacklist feature that will not list NFTs that have been reported theft, NFT projects such as Manifold have blacklist functions in their smart contracts.
Here is the project example; Manifold
Manifold Contract https://etherscan.io/address/0xe4e4003afe3765aca8149a82fc064c0b125b9e5a#code
modifier nonBlacklistRequired (address extension ) {
require (! _blacklistedExtensions.contains (extension), "Extension blacklisted " );
_;
}
Recommended Mitigation Steps
Add to Blacklist function and modifier.
If the length of the arrays are not required to be of the same length, user operations may not be fully executed
File: NounsDAOV3Fork.sol
function escrowToFork (
NounsDAOStorageV3.StorageV3 storage ds ,
uint256 [] calldata tokenIds ,
uint256 [] calldata proposalIds ,
string calldata reason
) external {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/NounsDAOV3Fork.sol#L74
File: NounsDAOV3Fork.sol
function joinFork (
NounsDAOStorageV3.StorageV3 storage ds ,
uint256 [] calldata tokenIds ,
uint256 [] calldata proposalIds ,
string calldata reason
) external {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/NounsDAOV3Fork.sol#L141
File: NounsDAOLogicV1Fork.sol
function quit (uint256 [] calldata tokenIds , address [] memory erc20TokensToInclude ) external nonReentrant {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L202
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L206
File: NounsDAOLogicV1Fork.sol
function quitInternal (uint256 [] calldata tokenIds , address [] memory erc20TokensToInclude ) internal {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L218
tx.origin
is a global variable in Solidity that returns the address of the account that sent the transaction.
Using the variable could make a contract vulnerable if an authorized account calls a malicious contract. You can impersonate a user using a third party contract.
This can make it easier to create a vault on behalf of another user with an external administrator (by receiving it as an argument).
File: NounsDAOLogicV2.sol
1043 : (bool refundSent , ) = tx .origin .call { value: refundAmount }('' );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L1043
File: NounsDAOLogicV2.sol
1044 : emit RefundableVote (tx .origin , refundAmount, refundSent);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L1044
Consider the case where totalsupply
is 0. When totalsupply
is 0, it should return 0 directly, because there will be an error of dividing by 0.
This would cause the affected functions to revert and as a result can lead to potential loss.
File: NounsDAOLogicV2.sol
967 : uint256 againstVotesBPS = (10000 * againstVotes) / totalSupply;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L967
File: NounsDAOV3DynamicQuorum.sol
63 : uint256 againstVotesBPS = (10000 * againstVotes) / totalSupply;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3DynamicQuorum.sol#L63
File: NounsDAOV3Fork.sol
247 : uint256 ethToSend = (address (timelock).balance * tokenCount) / totalSupply;
254 : uint256 tokensToSend = (erc20token.balanceOf (address (timelock)) * tokenCount) / totalSupply;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/NounsDAOV3Fork.sol#L247
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/NounsDAOV3Fork.sol#L254
File: NounsDAOLogicV1Fork.sol
230 : uint256 ethToSend = (address (timelock).balance * tokenIds.length ) / totalSupply;
233 : balancesToSend[i] = (erc20token.balanceOf (address (timelock)) * tokenIds.length ) / totalSupply;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L230
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L233
Recommended Mitigation Steps
Add check for zero value and return 0.
if ( totalSupply () == 0 ) return 0 ;
The built-in EVM precompile ecrecover
is susceptible to signature malleability, which could lead to replay attacks.
References: https://swcregistry.io/docs/SWC-117 , https://swcregistry.io/docs/SWC-121 , and https://medium.com/cryptronics/signature-replay-vulnerabilities-in-smart-contracts-3b6f7596df57 .
While this is not immediately exploitable, this may become a vulnerability if used elsewhere.
File: NounsDAOLogicV2.sol
599 : function castVoteBySig (
uint256 proposalId ,
uint8 support ,
uint8 v ,
bytes32 r ,
bytes32 s
) external {
bytes32 domainSeparator = keccak256 (
abi.encode (DOMAIN_TYPEHASH, keccak256 (bytes (name)), getChainIdInternal (), address (this ))
);
bytes32 structHash = keccak256 (abi.encode (BALLOT_TYPEHASH, proposalId, support));
bytes32 digest = keccak256 (abi.encodePacked ('/x19/x01 ' , domainSeparator, structHash));
address signatory = ecrecover (digest, v, r, s);
require (signatory != address (0 ), 'NounsDAO::castVoteBySig: invalid signature ' );
emit VoteCast (signatory, proposalId, support, castVoteInternal (signatory, proposalId, support), '' );
}
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L599
File: NounsDAOV3Votes.sol
169 : function castVoteBySig (
NounsDAOStorageV3.StorageV3 storage ds ,
uint256 proposalId ,
uint8 support ,
uint8 v ,
bytes32 r ,
bytes32 s
) external {
bytes32 domainSeparator = keccak256 (
abi.encode (DOMAIN_TYPEHASH, keccak256 (bytes (name)), block .chainid , address (this ))
);
bytes32 structHash = keccak256 (abi.encode (BALLOT_TYPEHASH, proposalId, support));
bytes32 digest = keccak256 (abi.encodePacked ('/x19/x01 ' , domainSeparator, structHash));
address signatory = ecrecover (digest, v, r, s);
require (signatory != address (0 ), 'NounsDAO::castVoteBySig: invalid signature ' );
emit VoteCast (signatory, proposalId, support, castVoteInternal (ds, signatory, proposalId, support), '' );
}
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Votes.sol#L169
File: NounsDAOLogicV1Fork.sol
600 : function castVoteBySig (
uint256 proposalId ,
uint8 support ,
uint8 v ,
bytes32 r ,
bytes32 s
) external {
bytes32 domainSeparator = keccak256 (
abi.encode (DOMAIN_TYPEHASH, keccak256 (bytes (name)), block .chainid , address (this ))
);
bytes32 structHash = keccak256 (abi.encode (BALLOT_TYPEHASH, proposalId, support));
bytes32 digest = keccak256 (abi.encodePacked ('/x19/x01 ' , domainSeparator, structHash));
address signatory = ecrecover (digest, v, r, s);
require (signatory != address (0 ), 'NounsDAO::castVoteBySig: invalid signature ' );
emit VoteCast (signatory, proposalId, support, castVoteInternal (signatory, proposalId, support), '' );
}
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L600
File: ERC721CheckpointableUpgradeable .sol
151 : function delegateBySig (
address delegatee ,
uint256 nonce ,
uint256 expiry ,
uint8 v ,
bytes32 r ,
bytes32 s
) public {
require (delegatee != address (0 ), 'ERC721Checkpointable::delegateBySig: delegatee cannot be zero address ' );
bytes32 domainSeparator = keccak256 (
abi.encode (DOMAIN_TYPEHASH, keccak256 (bytes (name ())), block .chainid , address (this ))
);
bytes32 structHash = keccak256 (abi.encode (DELEGATION_TYPEHASH, delegatee, nonce, expiry));
bytes32 digest = keccak256 (abi.encodePacked ('/x19/x01 ' , domainSeparator, structHash));
address signatory = ecrecover (digest, v, r, s);
require (signatory != address (0 ), 'ERC721Checkpointable::delegateBySig: invalid signature ' );
require (nonce == nonces[signatory]++ , 'ERC721Checkpointable::delegateBySig: invalid nonce ' );
require (block .timestamp <= expiry, 'ERC721Checkpointable::delegateBySig: signature expired ' );
return _delegate (signatory, delegatee);
}
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/base/ERC721CheckpointableUpgradeable.sol#L151
Recommended Mitigation Steps
Consider using OpenZeppelin’s ECDSA library (which prevents this malleability) instead of the built-in function.
https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/cryptography/ECDSA.sol#L138-L149
There is no limit specified on the amount of gas used, so the recipient can use up all of the transaction's gas, causing it to revert. Use addr.call{gas: <amount>}("")
or this library instead.
File: NounsDAOExecutor.sol
173 : (bool success , bytes memory returnData ) = target.call { value: value }(callData);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutor.sol#L173
File: NounsDAOExecutorV2.sol
196 : (bool success , bytes memory returnData ) = target.call { value: value }(callData);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutorV2.sol#L196
File: NounsDAOLogicV2.sol
824 : (bool sent , ) = msg .sender .call { value: amount }('' );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L824
File: NounsDAOLogicV2.sol
1043 : (bool refundSent , ) = tx .origin .call { value: refundAmount }('' );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L1043
File: NounsDAOV3Admin.sol
470 : (bool sent , ) = msg .sender .call { value: amount }('' );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L470
File: NounsDAOV3Votes.sol
305 : (bool refundSent , ) = msg .sender .call { value: refundAmount }('' );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Votes.sol#L305
Consider limiting the number of iterations in for-
loops that make external calls
File: NounsDAOLogicV2.sol
305 : for (uint256 i = 0 ; i < proposal.targets.length ; i++ ) {
343 : for (uint256 i = 0 ; i < proposal.targets.length ; i++ ) {
372 : for (uint256 i = 0 ; i < proposal.targets.length ; i++ ) {
405 : for (uint256 i = 0 ; i < proposal.targets.length ; i++ ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L305
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L343
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L372
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L405
File: NounsDAOV3Proposals.sol
409 : for (uint256 i = 0 ; i < proposerSignatures.length ; ++ i) {
826 : for (uint256 i = 0 ; i < proposerSignatures.length ; ++ i) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L409
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L826
File: NounsDAOV3Proposals.sol
446 : for (uint256 i = 0 ; i < proposal.targets.length ; i++ ) {
508 : for (uint256 i = 0 ; i < proposal.targets.length ; i++ ) {
553 : for (uint256 i = 0 ; i < proposal.targets.length ; i++ ) {
602 : for (uint256 i = 0 ; i < proposal.targets.length ; i++ ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L446
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L508
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L553
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L602
File: NounsDAOV3Proposals.sol
590 : for (uint256 i = 0 ; i < signers.length ; ++ i) {
446 : for (uint256 i = 0 ; i < proposal.targets.length ; i++ ) {
508 : for (uint256 i = 0 ; i < proposal.targets.length ; i++ ) {
553 : for (uint256 i = 0 ; i < proposal.targets.length ; i++ ) {
602 : for (uint256 i = 0 ; i < proposal.targets.length ; i++ ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L590
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L446
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L508
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L553
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L602
File: NounsDAOForkEscrow.sol
117 : for (uint256 i = 0 ; i < tokenIds.length ; i++ ) {
148 : for (uint256 i = 0 ; i < tokenIds.length ; i++ ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/NounsDAOForkEscrow.sol#L117
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/NounsDAOForkEscrow.sol#L148
File: NounsDAOV3Fork.sol
83 : for (uint256 i = 0 ; i < tokenIds.length ; i++ ) {
153 : for (uint256 i = 0 ; i < tokenIds.length ; i++ ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/NounsDAOV3Fork.sol#L83
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/NounsDAOV3Fork.sol#L153
File: NounsDAOLogicV1Fork.sol
209 : for (uint256 i = 0 ; i < erc20TokensToInclude.length ; i++ ) {
231 : for (uint256 i = 0 ; i < erc20TokensToInclude.length ; i++ ) {
238 : for (uint256 i = 0 ; i < erc20TokensToInclude.length ; i++ ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L209
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L231
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L238
File: NounsDAOLogicV1Fork.sol
397 : for (uint256 i = 0 ; i < proposal.targets.length ; i++ ) {
435 : for (uint256 i = 0 ; i < proposal.targets.length ; i++ ) {
462 : for (uint256 i = 0 ; i < proposal.targets.length ; i++ ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L397
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L435
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L462
File: NounsTokenFork.sol
149 : for (uint256 i = 0 ; i < tokenIds.length ; i++ ) {
172 : for (uint256 i = 0 ; i < tokenIds.length ; i++ ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/NounsTokenFork.sol#L149
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/NounsTokenFork.sol#L172
The initialize()
functions below are not called by another contract atomically after the contract is deployed, so it's possible for a malicious user to call initialize()
which, if it's noticed in time, would require the project to re-deploy the contract in order to properly initialize. Consider creating a factory contract, which will new
and initialize()
each contract atomically.
File: NounsDAOExecutorV2.sol
function initialize (address admin_ , uint256 delay_ ) public virtual initializer {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutorV2.sol#L95
File: NounsDAOLogicV2.sol
function initialize (
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L135
File: NounsDAOLogicV3.sol
function initialize (
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV3.sol#L141
File: NounsAuctionHouseFork.sol
function initialize (
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/NounsAuctionHouseFork.sol#L76
File: NounsDAOLogicV1Fork.sol
function initialize (
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L165
File: NounsTokenFork.sol
function initialize (
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/NounsTokenFork.sol#L119
Division by large numbers may result in the result being zero, due to solidity not supporting fractions. Consider requiring a minimum amount for the numerator to ensure that it is always larger than the denominator
File: NounsDAOLogicV2.sol
967 : uint256 againstVotesBPS = (10000 * againstVotes) / totalSupply;
968 : uint256 quorumAdjustmentBPS = (params.quorumCoefficient * againstVotesBPS) / 1e6 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L967-L968
File: NounsDAOLogicV2.sol
1010 : uint256 center = upper - (upper - lower) / 2 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L1010
File: NounsDAOLogicV2.sol
1067 : return (number * bps) / 10000 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L1067
File: NounsDAOV3DynamicQuorum.sol
63 : uint256 againstVotesBPS = (10000 * againstVotes) / totalSupply;
64 : uint256 quorumAdjustmentBPS = (params.quorumCoefficient * againstVotesBPS) / 1e6 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3DynamicQuorum.sol#L63-L64
File: NounsDAOV3DynamicQuorum.sol
110 : uint256 center = upper - (upper - lower) / 2 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3DynamicQuorum.sol#L110
File: NounsDAOV3DynamicQuorum.sol
162 : return (number * bps) / 10000 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3DynamicQuorum.sol#L162
File: NounsDAOV3Proposals.sol
1016 : return (number * bps) / 10000 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L1016
File: NounsDAOV3Fork.sol
209 : return (adjustedTotalSupply (ds) * ds.forkThresholdBPS) / 10_000 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/NounsDAOV3Fork.sol#L209
File: NounsDAOV3Fork.sol
247 : uint256 ethToSend = (address (timelock).balance * tokenCount) / totalSupply;
254 : uint256 tokensToSend = (erc20token.balanceOf (address (timelock)) * tokenCount) / totalSupply;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/NounsDAOV3Fork.sol#L247
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/NounsDAOV3Fork.sol#L254
File: NounsDAOLogicV1Fork.sol
230 : uint256 ethToSend = (address (timelock).balance * tokenIds.length ) / totalSupply;
233 : balancesToSend[i] = (erc20token.balanceOf (address (timelock)) * tokenIds.length ) / totalSupply;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L230
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L233
File: NounsDAOLogicV1Fork.sol
786 : return (number * bps) / 10000 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L786
File: ERC721CheckpointableUpgradeable .sol
196 : uint32 center = upper - (upper - lower) / 2 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/base/ERC721CheckpointableUpgradeable.sol#L196
The core function mint
is used by users to mint an option position by providing token1 as collateral and borrowing the max amount of liquidity. Address(0)
check is missing in both this function and the internal function _mint
, which is triggered to mint the tokens to the to address. Consider applying a check in the function to ensure tokens aren't minted to the zero address.
File: NounsTokenFork.sol
function setMinter (address _minter ) external override onlyOwner whenMinterNotLocked {
minter = _minter;
emit MinterUpdated (_minter);
}
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/NounsTokenFork.sol#L240
Low-level calls return success if there is no code present at the specified address.
File: NounsDAOExecutor.sol
173 : (bool success , bytes memory returnData ) = target.call { value: value }(callData);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutor.sol#L173
File: NounsDAOExecutorV2.sol
196 : (bool success , bytes memory returnData ) = target.call { value: value }(callData);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutorV2.sol#L196
File: NounsDAOLogicV2.sol
248 : newProposal.calldatas = calldatas;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L248
File: NounsDAOLogicV2.sol
310 : proposal.calldatas[i],
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L310
File: NounsDAOLogicV2.sol
348 : proposal.calldatas[i],
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L348
File: NounsDAOLogicV2.sol
377 : proposal.calldatas[i],
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L377
File: NounsDAOLogicV2.sol
410 : proposal.calldatas[i],
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L410
File: NounsDAOLogicV2.sol
437 : return (p.targets, p.values, p.signatures, p.calldatas);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L437
File: NounsDAOLogicV2.sol
824 : (bool sent , ) = msg .sender .call { value: amount }('' );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L824
File: NounsDAOLogicV2.sol
1043 : (bool refundSent , ) = tx .origin .call { value: refundAmount }('' );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L1043
File: NounsDAOProxy.sol
95 : (bool success , bytes memory returnData ) = callee.delegatecall (data);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOProxy.sol#L95
File: NounsDAOProxy.sol
110 : (bool success , ) = implementation.delegatecall (msg .data );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOProxy.sol#L110
File: NounsDAOV3Admin.sol
470 : (bool sent , ) = msg .sender .call { value: amount }('' );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L470
File: NounsDAOV3Proposals.sol
351 : proposal.calldatas = calldatas;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L351
File: NounsDAOV3Proposals.sol
420 : proposal.calldatas = txs.calldatas;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L420
File: NounsDAOV3Proposals.sol
428 : txs.calldatas,
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L428
File: NounsDAOV3Proposals.sol
452 : proposal.calldatas[i],
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L452
File: NounsDAOV3Proposals.sol
513 : proposal.calldatas[i],
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L513
File: NounsDAOV3Proposals.sol
558 : proposal.calldatas[i],
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L558
File: NounsDAOV3Proposals.sol
607 : proposal.calldatas[i],
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L607
File: NounsDAOV3Proposals.sol
688 : return (p.targets, p.values, p.signatures, p.calldatas);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L688
File: NounsDAOV3Proposals.sol
864 : bytes32 [] memory calldatasHashes = new bytes32 [](txs.calldatas.length );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L864
File: NounsDAOV3Proposals.sol
865 : for (uint256 i = 0 ; i < txs.calldatas.length ; ++ i) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L865
File: NounsDAOV3Proposals.sol
866 : calldatasHashes[i] = keccak256 (txs.calldatas[i]);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L866
File: NounsDAOV3Proposals.sol
909 : newProposal.calldatas = txs.calldatas;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L909
File: NounsDAOV3Proposals.sol
931 : txs.calldatas,
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L931
File: NounsDAOV3Proposals.sol
970 : txs.targets.length != txs.calldatas.length
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L970
File: NounsDAOV3Votes.sol
305 : (bool refundSent , ) = msg .sender .call { value: refundAmount }('' );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Votes.sol#L305
File: NounsAuctionHouseFork.sol
273 : (bool success , ) = to.call { value: value, gas: 30_000 }(new bytes (0 ));
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/NounsAuctionHouseFork.sol#L273
File: NounsDAOLogicV1Fork.sol
327 : newProposal.calldatas = calldatas;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L327
File: NounsDAOLogicV1Fork.sol
402 : proposal.calldatas[i],
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L402
File: NounsDAOLogicV1Fork.sol
440 : proposal.calldatas[i],
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L440
File: NounsDAOLogicV1Fork.sol
467 : proposal.calldatas[i],
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L467
File: NounsDAOLogicV1Fork.sol
494 : return (p.targets, p.values, p.signatures, p.calldatas);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L494
Recommended Mitigation Steps
In addition to the zero-address checks, add a check to verify that <address>.code.length > 0
Lack of zero-address validation on address parameters may lead to transaction reverts, waste gas, require resubmission of transactions and may even force contract redeployments in certain cases within the protocol.
File: NounsDAOExecutor.sol
97 : function setPendingAdmin : address pendingAdmin_
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutor.sol#L97
File: NounsDAOExecutor.sol
143 : function executeTransaction : address target
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutor.sol#L143
File: NounsDAOExecutorV2.sol
120 : function setPendingAdmin : address pendingAdmin_
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutorV2.sol#L120
File: NounsDAOExecutorV2.sol
166 : function executeTransaction : address target
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutorV2.sol#L166
File: NounsDAOLogicV2.sol
836 : function _setPendingAdmin : address newPendingAdmin
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L836
File: NounsDAOLogicV2.sol
876 : function _setPendingVetoer : address newPendingVetoer
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L876
File: NounsDAOV3Admin.sol
261 : function _setPendingAdmin : address newPendingAdmin
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L261
File: NounsDAOV3Admin.sol
301 : function _setPendingVetoer : address newPendingVetoer
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L301
File: NounsDAOV3Admin.sol
570 : function _setTimelocksAndAdmin : address admin
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L570
File: NounsDAOForkEscrow.sol
96 : function onERC721Received : address from
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/NounsDAOForkEscrow.sol#L96
File: NounsAuctionHouseFork.sol
79 : function initialize : address _weth
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/NounsAuctionHouseFork.sol#L79
File: NounsDAOLogicV1Fork.sol
713 : function _setPendingAdmin : address newPendingAdmin
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L713
File: NounsTokenFork.sol
121 : function initialize : address _minter
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/NounsTokenFork.sol#L121
File: NounsTokenFork.sol
166 : function claimDuringForkPeriod : address to
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/NounsTokenFork.sol#L166
File: NounsTokenFork.sol
240 : function setMinter : address _minter
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/NounsTokenFork.sol#L240
Recommended Mitigation Steps
Consider adding explicit zero-address validation on input parameters of address type.
The non-upgradeable standard version of OpenZeppelin’s library are inherited / used by the contracts.
It would be safer to use the upgradeable versions of the library contracts to avoid unexpected behaviour.
File: NounsDAOExecutorProxy.sol
20 : import { ERC1967Proxy } from '@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol ' ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutorProxy.sol#L20
File: NounsDAOExecutorV2.sol
42 : import { IERC20 } from '@openzeppelin/contracts/token/ERC20/IERC20.sol ' ;
43 : import { SafeERC20 } from '@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol ' ;
45 : import { UUPSUpgradeable } from '@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol ' ;
46 : import { Address } from '@openzeppelin/contracts/utils/Address.sol ' ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutorV2.sol#L42-L46
File: NounsDAOV3Proposals.sol
23 : import { SignatureChecker } from '@openzeppelin/contracts/utils/cryptography/SignatureChecker.sol ' ;
24 : import { ECDSA } from '@openzeppelin/contracts/utils/cryptography/ECDSA.sol ' ;
25 : import { SafeCast } from '@openzeppelin/contracts/utils/math/SafeCast.sol ' ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L23-L25
File: NounsDAOV3Votes.sol
22 : import { SafeCast } from '@openzeppelin/contracts/utils/math/SafeCast.sol ' ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Votes.sol#L22
File: ForkDAODeployer.sol
20 : import { ERC1967Proxy } from '@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol ' ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/ForkDAODeployer.sol#L20
File: NounsDAOForkEscrow.sol
21 : import { IERC721Receiver } from '@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol ' ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/NounsDAOForkEscrow.sol#L21
File: NounsDAOV3Fork.sol
21 : import { IERC20 } from '@openzeppelin/contracts/token/ERC20/IERC20.sol ' ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/NounsDAOV3Fork.sol#L21
File: NounsAuctionHouseFork.sol
35 : import { IERC20 } from '@openzeppelin/contracts/token/ERC20/IERC20.sol ' ;
39 : import { UUPSUpgradeable } from '@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol ' ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/NounsAuctionHouseFork.sol#L35-L39
File: NounsDAOLogicV1Fork.sol
97 : import { UUPSUpgradeable } from '@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol ' ;
102 : import { IERC20 } from '@openzeppelin/contracts/token/ERC20/IERC20.sol ' ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L97-L102
File: NounsTokenFork.sol
25 : import { IERC721 } from '@openzeppelin/contracts/token/ERC721/IERC721.sol ' ;
26 : import { UUPSUpgradeable } from '@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol ' ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/NounsTokenFork.sol#L25-L26
File: ERC20Transferer .sol
18 : import { IERC20 } from '@openzeppelin/contracts/token/ERC20/IERC20.sol ' ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/utils/ERC20Transferer.sol#L18
Recommended Mitigation Steps
Where applicable, use the contracts from @openzeppelin/contracts-upgradeable
instead of @openzeppelin/contracts
.
See https://github.com/OpenZeppelin/openzeppelin-contracts-upgradeable/tree/master/contracts for list of available upgradeable contracts
On several locations in the code precautions are not being taken for not dividing by 0, this will revert the code.
These functions can be called with 0 value in the input, this value is not checked for being bigger than 0, that means in some scenarios this can potentially trigger a division by zero.
File: NounsDAOLogicV2.sol
967 : uint256 againstVotesBPS = (10000 * againstVotes) / totalSupply
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L967
File: NounsDAOV3DynamicQuorum.sol
63 : uint256 againstVotesBPS = (10000 * againstVotes) / totalSupply
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3DynamicQuorum.sol#L63
File: NounsDAOV3Fork.sol
247 : uint256 ethToSend = (address (timelock).balance * tokenCount) / totalSupply
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/NounsDAOV3Fork.sol#L247
File: NounsDAOV3Fork.sol
254 : uint256 tokensToSend = (erc20token.balanceOf (address (timelock)) * tokenCount) / totalSupply
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/NounsDAOV3Fork.sol#L254
Recommended Mitigation Steps
Recommend making sure division by 0 won’t occur by checking the variables beforehand and handling this edge case.
Ethereum has performed the long-awaited "merge" that will dramatically reduce the environmental impact of the network
There may be forked versions of Ethereum, which could cause confusion and lead to scams as duplicated NFT assets enter the market.
If the Ethereum Merge, which took place in September 2022, results in the Blockchain splitting into two Blockchains due to the 'THE DAO' attack in 2016, this could result in duplication of immutable tokens (NFTs).
In any case, duplicate NFTs will exist due to the ETH proof-of-work chain and other potential forks, and there’s likely to be some level of confusion around which assets are 'official' or 'authentic.'
Even so, there could be a frenzy for these copies, as NFT owners attempt to flip the proof-of-work versions of their valuable tokens.
As ETHPOW and any other forks spin off of the Ethereum mainnet, they will yield duplicate versions of Ethereum’s NFTs. An NFT is simply a blockchain token, and it can work as a deed of ownership to digital items like artwork and collectibles. A forked Ethereum chain will thus have duplicated deeds that point to the same tokenURI
About Merge Replay Attack: https://twitter.com/elerium115/status/1558471934924431363?s=20&t=RRheaYJwo-GmSnePwofgag
File: NounsTokenFork.sol
222 : function tokenURI (
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/NounsTokenFork.sol#L222
Recommended Mitigation Steps
Add the following check:
if (block .chainid != 1 ) {
revert ();
}
The following contracts can receive ETH but can not withdraw, ETH is occasionally sent by users will be stuck in those contracts.
This functionality also applies to baseTokens resulting in locked tokens and loss of funds.
File: NounsDAOExecutor.sol
186 : receive () external payable {}
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutor.sol#L186
File: NounsDAOExecutorV2.sol
209 : receive () external payable {}
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutorV2.sol#L209
File: NounsDAOLogicV2.sol
1090 : receive () external payable {}
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L1090
File: NounsDAOProxy.sol
138 : receive () external payable {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOProxy.sol#L138
Recommended Mitigation Steps
Provide a rescue ETH and rescueTokens function
According to the implementation of the of the library's safeTransfer function, the contract existences are not checked. It is possible that a token becomes non-existent in the future; for instance, if some bugs are found for the output token, it is possible that the output token will be destroyed through calling its selfdestruct function after migrating its data to another contract for fixing these bugs. When this happens, such output token becomes non-existent but calling the swap function to swap for it does not revert. As a result, the user can lose tokens
File: NounsAuctionHouseFork.sol
261 : function _safeTransferETHWithFallback (address to , uint256 amount ) internal {
if (! _safeTransferETH (to, amount)) {
IWETH (weth).deposit { value: amount }();
IERC20 (weth).transfer (to, amount);
}
}
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/NounsAuctionHouseFork.sol#L261
File: NounsAuctionHouseFork.sol
272 : function _safeTransferETH (address to , uint256 value ) internal returns (bool ) {
(bool success , ) = to.call { value: value, gas: 30_000 }(new bytes (0 ));
return success;
}
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/NounsAuctionHouseFork.sol#L272
Recommended Mitigation Steps
In the library's safeTransfer
function, the existence of the contract for token should be checked before performing the low-level call. If such contract does not exist, calling this function should revert.
OZ’s Address.sol library is used. Ether transfer is done with a sendValue
call in the following functions.
There is this warning in OZ’s Address.sol library. Accordingly, he used the Check-Effect-Interaction pattern in the project:
* IMPORTANT: because control is transferred to `recipient`, care must be
* taken to not create reentrancy vulnerabilities. Consider using
* {ReentrancyGuard} or the
* https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*/
It would be best practice to use re-entrancy Guard for reasons such as complicated dangers such as view Re-Entrancy that emerged in the last period and the possibility of expanding the project and its integration with other contracts.
File: NounsDAOExecutorV2.sol
216 : recipient.sendValue (ethToSend);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutorV2.sol#L216
The compiler for Solidity 0.8.20 switches the default target EVM version to Shanghai , which includes the new PUSH0
op code. This op code may not yet be implemented on all L2s, so deployment on these chains will fail. To work around this issue, use an earlier EVM version . While the project itself may or may not compile with 0.8.20, other projects with which it integrates, or which extend this project may, and those projects will have problems deploying these contracts/libraries.
File: NounsDAOExecutor.sol
pragma solidity ^ 0.8.6 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutor.sol#L31
File: NounsDAOExecutorProxy.sol
pragma solidity ^ 0.8.19 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutorProxy.sol#L18
File: NounsDAOExecutorV2.sol
pragma solidity ^ 0.8.19 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutorV2.sol#L40
File: NounsDAOInterfaces.sol
pragma solidity ^ 0.8.6 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOInterfaces.sol#L35
File: NounsDAOLogicV2.sol
pragma solidity ^ 0.8.6 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L53
File: NounsDAOLogicV3.sol
pragma solidity ^ 0.8.19 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV3.sol#L56
File: NounsDAOProxy.sol
pragma solidity ^ 0.8.6 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOProxy.sol#L36
File: NounsDAOV3Admin.sol
pragma solidity ^ 0.8.19 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L18
File: NounsDAOV3DynamicQuorum.sol
pragma solidity ^ 0.8.19 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3DynamicQuorum.sol#L18
File: NounsDAOV3Proposals.sol
pragma solidity ^ 0.8.19 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L18
File: NounsDAOV3Votes.sol
pragma solidity ^ 0.8.19 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Votes.sol#L18
File: ForkDAODeployer.sol
pragma solidity ^ 0.8.19 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/ForkDAODeployer.sol#L18
File: NounsDAOForkEscrow.sol
pragma solidity ^ 0.8.19 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/NounsDAOForkEscrow.sol#L18
File: NounsDAOV3Fork.sol
pragma solidity ^ 0.8.19 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/NounsDAOV3Fork.sol#L18
File: NounsAuctionHouseFork.sol
pragma solidity ^ 0.8.19 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/NounsAuctionHouseFork.sol#L30
File: INounsTokenForkLike.sol
pragma solidity ^ 0.8.19 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/INounsTokenForkLike.sol#L3
File: NounsDAOEventsFork.sol
pragma solidity ^ 0.8.19 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOEventsFork.sol#L3
File: NounsDAOLogicV1Fork.sol
pragma solidity ^ 0.8.19 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L95
File: NounsDAOStorageV1Fork.sol
pragma solidity ^ 0.8.19 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOStorageV1Fork.sol#L3
File: INounsTokenFork.sol
pragma solidity ^ 0.8.19 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/INounsTokenFork.sol#L18
File: NounsTokenFork.sol
pragma solidity ^ 0.8.19 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/NounsTokenFork.sol#L18
File: ERC721CheckpointableUpgradeable .sol
pragma solidity ^ 0.8.19 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/base/ERC721CheckpointableUpgradeable.sol#L46
File: ERC20Transferer .sol
pragma solidity ^ 0.8.16 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/utils/ERC20Transferer.sol#L16
File: DeployDAOV3DataContractsBase.s.sol
pragma solidity ^ 0.8.15 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/DeployDAOV3DataContractsBase.s.sol#L2
File: DeployDAOV3DataContractsGoerli.s.sol
pragma solidity ^ 0.8.15 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/DeployDAOV3DataContractsGoerli.s.sol#L2
File: DeployDAOV3DataContractsSepolia.s.sol
pragma solidity ^ 0.8.15 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/DeployDAOV3DataContractsSepolia.s.sol#L2
File: DeployDAOV3NewContractsBase.s.sol
pragma solidity ^ 0.8.15 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/DeployDAOV3NewContractsBase.s.sol#L2
File: DeployDAOV3NewContractsMainnet.s.sol
pragma solidity ^ 0.8.15 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/DeployDAOV3NewContractsMainnet.s.sol#L2
File: DeployDAOV3NewContractsTestnet.s.sol
pragma solidity ^ 0.8.15 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/DeployDAOV3NewContractsTestnet.s.sol#L2
File: ProposeDAOV3UpgradeMainnet.s.sol
pragma solidity ^ 0.8.15 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L2
File: ProposeDAOV3UpgradeTestnet.s.sol
pragma solidity ^ 0.8.15 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L2
File: ProposeENSReverseLookupConfigMainnet.s.sol
pragma solidity ^ 0.8.15 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeENSReverseLookupConfigMainnet.s.sol#L2
File: ProposeTimelockMigrationCleanupMainnet.s.sol
pragma solidity ^ 0.8.15 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeTimelockMigrationCleanupMainnet.s.sol#L2
See the following for more info:
https://twitter.com/solidity_lang/status/1567953562151579650?s=20&t=fXIo4hRjOiMXl2dqpD5Oyw
https://blog.soliditylang.org/2022/09/08/storage-write-removal-before-conditional-termination/
File: NounsDAOLogicV2.sol
1070 : function getChainIdInternal () internal view returns (uint256 ) {
uint256 chainId;
assembly {
chainId := chainid ()
}
return chainId;
}
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L1070
Recommended Mitigation Steps
Upgrade pragma to at least version 0.8.17
Recommend considering implementing a two step process where the owner or admin nominates an account and the nominated account needs to call an acceptOwnership() function for the transfer of ownership to fully succeed. This ensures the nominated EOA account is a valid and active account.
File: NounsAuctionHouseFork.sol
87 : function initialize : _transferOwnership (_owner);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/NounsAuctionHouseFork.sol#L87
File: NounsTokenFork.sol
129 : function initialize : _transferOwnership (_owner);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/NounsTokenFork.sol#L129
File: ProposeDAOV3UpgradeMainnet.s.sol
109 : function propose : signatures[i] = 'transferOwnership(address) ' ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L109
File: ProposeDAOV3UpgradeMainnet.s.sol
128 : function propose : signatures[i] = 'transferOwnership(address) ' ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L128
File: ProposeDAOV3UpgradeMainnet.s.sol
135 : function propose : signatures[i] = 'transferOwnership(address) ' ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L135
File: ProposeDAOV3UpgradeTestnet.s.sol
116 : function propose : signatures[i] = 'transferOwnership(address) ' ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L116
File: ProposeTimelockMigrationCleanupMainnet.s.sol
62 : function propose : signatures[i] = 'transferOwnership(address) ' ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeTimelockMigrationCleanupMainnet.s.sol#L62
File: ProposeTimelockMigrationCleanupMainnet.s.sol
90 : function propose : signatures[i] = 'transferOwnership(address) ' ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeTimelockMigrationCleanupMainnet.s.sol#L90
File: ProposeTimelockMigrationCleanupMainnet.s.sol
97 : function propose : signatures[i] = 'transferOwnership(address) ' ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeTimelockMigrationCleanupMainnet.s.sol#L97
Recommended Mitigation Steps
Lack of two-step procedure for critical operations leaves them error-prone. Consider adding two step procedure on the critical functions.
New items are pushed into the following arrays but there is no option to pop
them out. Currently, the array can grow indefinitely. E.g. there's no maximum limit and there's no functionality to remove array values.
If the array grows too large, calling relevant functions might run out of gas and revert. Calling these functions could result in a DOS condition.
File: NounsDAOLogicV2.sol
1029 : quorumParamsCheckpoints.push (DynamicQuorumParamsCheckpoint ({ fromBlock: blockNumber, params: params }));
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L1029
File: NounsDAOV3Admin.sol
588 : ds.quorumParamsCheckpoints.push (
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L588
Recommended Mitigation Steps
Add a functionality to delete array values or add a maximum size limit for arrays.
If the intention is for the Ether to be used, the function should call another function, otherwise it should revert (e.g. require(msg.sender == address(weth))
). Having no access control on the function means that someone may send Ether to the contract, and have no way to get anything back out, which is a loss of funds. If the concern is having to spend a small amount of gas to check the sender against an immutable address, the code should at least have a function to rescue unused Ether.
File: NounsDAOExecutor.sol
186 : receive () external payable {}
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutor.sol#L186
File: NounsDAOExecutorV2.sol
209 : receive () external payable {}
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutorV2.sol#L209
File: NounsDAOLogicV2.sol
1090 : receive () external payable {}
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L1090
File: NounsDAOLogicV3.sol
1035 : receive () external payable {}
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV3.sol#L1035
For upgradeable contracts, there must be storage gap to "allow developers to freely add new state variables in the future without compromising the storage compatibility with existing deployments". Otherwise it may be very difficult to write new implementation code. Without storage gap, the variable in child contract might be overwritten by the upgraded base contract if new variables are added to the base contract. This could have unintended and very serious consequences to the child contracts.
Refer to the bottom part of this article: https://docs.openzeppelin.com/upgrades-plugins/1.x/writing-upgradeable
However, the contract doesn't contain a storage gap. The storage gap is essential for upgradeable contract because "It allows us to freely add new state variables in the future without compromising the storage compatibility with existing deployments". See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps for a description of this storage variable. While some contracts may not currently be sub-classed, adding the variable now protects against forgetting to add it in the future.
File: NounsDAOExecutorV2.sol
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutorV2.sol
File: NounsAuctionHouseFork.sol
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/NounsAuctionHouseFork.sol
File: NounsDAOLogicV1Fork.sol
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol
File: INounsTokenFork.sol
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/INounsTokenFork.sol
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/NounsTokenFork.sol
File: ERC721CheckpointableUpgradeable .sol
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/base/ERC721CheckpointableUpgradeable.sol
Recommended Mitigation Steps
Recommend adding appropriate storage gap at the end of upgradeable contracts such as the below. Please reference OpenZeppelin upgradeable contract templates.
uint256 [50 ] private __gap;
An outdated OZ version is used (which has known vulnerabilities, see: https://github.com/OpenZeppelin/openzeppelin-contracts/security/advisories ).
Release: https://github.com/OpenZeppelin/openzeppelin-contracts/releases/tag/v4.9.0
Require dependencies to be at least version of 4.9.0 to include critical vulnerability patches.
File: package.json
"@openzeppelin/contracts " : "^4.1.0 "
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/../nouns-monorepo/packages/nouns-contracts/package.json#L32
File: package.json
"@openzeppelin/contracts-upgradeable " : "^4.1.0 "
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/../nouns-monorepo/packages/nouns-contracts/package.json#L33
File: package.json
"@openzeppelin/contracts " : "^4.1.0 "
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/../nouns-monorepo-2023-07/packages/nouns-contracts/package.json#L32
File: package.json
"@openzeppelin/contracts-upgradeable " : "^4.1.0 "
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/../nouns-monorepo-2023-07/packages/nouns-contracts/package.json#L33
Recommended Mitigation Steps
Update OpenZeppelin Contracts Usage in package.json and require at least version of 4.9.0 via >=4.9.0
Ownable2Step
and Ownable2StepUpgradeable
prevent the contract ownership from mistakenly being transferred to an address that cannot handle it (e.g. due to a typo in the address), by requiring that the recipient of the owner permissions actively accept via a contract call of its own.
File: NounsAuctionHouseFork.sol
34 : import { OwnableUpgradeable } from '@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol ' ;
45 : OwnableUpgradeable,
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/NounsAuctionHouseFork.sol#L34
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/NounsAuctionHouseFork.sol#L45
File: NounsTokenFork.sol
20 : import { OwnableUpgradeable } from '@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol ' ;
39 : contract NounsTokenFork is INounsTokenFork , OwnableUpgradeable , ERC721CheckpointableUpgradeable , UUPSUpgradeable {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/NounsTokenFork.sol#L20
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/NounsTokenFork.sol#L39
It is often better to declare address
es as immutable
, and assign them via constructor arguments. This allows the code to remain the same across deployments on different networks, and avoids recompilation when addresses need to change.
File: ProposeDAOV3UpgradeMainnet.s.sol
11 : NounsDAOLogicV1 (0x6f3E6272A167e8AcCb32072d08E0957F9c79223d );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L11
File: ProposeDAOV3UpgradeTestnet.s.sol
143 : NounsDAOLogicV1 (0x9e6D4B42b8Dc567AC4aeCAB369Eb9a3156dF095C );
160 : NounsDAOLogicV1 (0x35d2670d7C8931AACdd37C89Ddcb0638c3c44A57 );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L143
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L160
File: ProposeENSReverseLookupConfigMainnet.s.sol
14 : NounsDAOLogicV3 (payable (0x6f3E6272A167e8AcCb32072d08E0957F9c79223d ));
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeENSReverseLookupConfigMainnet.s.sol#L14
File: ProposeTimelockMigrationCleanupMainnet.s.sol
14 : NounsDAOLogicV3 (payable (0x6f3E6272A167e8AcCb32072d08E0957F9c79223d ));
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeTimelockMigrationCleanupMainnet.s.sol#L14
Avoid floating pragmas for non-library contracts.
While floating pragmas make sense for libraries to allow them to be included with multiple different versions of applications, it may be a security risk for application implementations.
A known vulnerable compiler version may accidentally be selected or security tools might fall-back to an older compiler version ending up checking a different EVM compilation that is ultimately deployed on the blockchain.
It is recommended to pin to a concrete compiler version.
File: NounsDAOExecutor.sol
Found usage of floating pragmas ^ 0.8.6 of Solidity in [NounsDAOExecutor.sol]
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutor.sol#L31
File: NounsDAOExecutorProxy.sol
Found usage of floating pragmas ^ 0.8.19 of Solidity in [NounsDAOExecutorProxy.sol]
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutorProxy.sol#L18
File: NounsDAOExecutorV2.sol
Found usage of floating pragmas ^ 0.8.19 of Solidity in [NounsDAOExecutorV2.sol]
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutorV2.sol#L40
File: NounsDAOInterfaces.sol
Found usage of floating pragmas ^ 0.8.6 of Solidity in [NounsDAOInterfaces.sol]
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOInterfaces.sol#L35
File: NounsDAOLogicV2.sol
Found usage of floating pragmas ^ 0.8.6 of Solidity in [NounsDAOLogicV2.sol]
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L53
File: NounsDAOLogicV3.sol
Found usage of floating pragmas ^ 0.8.19 of Solidity in [NounsDAOLogicV3.sol]
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV3.sol#L56
File: NounsDAOProxy.sol
Found usage of floating pragmas ^ 0.8.6 of Solidity in [NounsDAOProxy.sol]
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOProxy.sol#L36
File: NounsDAOV3Admin.sol
Found usage of floating pragmas ^ 0.8.19 of Solidity in [NounsDAOV3Admin.sol]
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L18
File: NounsDAOV3DynamicQuorum.sol
Found usage of floating pragmas ^ 0.8.19 of Solidity in [NounsDAOV3DynamicQuorum.sol]
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3DynamicQuorum.sol#L18
File: NounsDAOV3Proposals.sol
Found usage of floating pragmas ^ 0.8.19 of Solidity in [NounsDAOV3Proposals.sol]
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L18
File: NounsDAOV3Votes.sol
Found usage of floating pragmas ^ 0.8.19 of Solidity in [NounsDAOV3Votes.sol]
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Votes.sol#L18
File: ForkDAODeployer.sol
Found usage of floating pragmas ^ 0.8.19 of Solidity in [ForkDAODeployer.sol]
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/ForkDAODeployer.sol#L18
File: NounsDAOForkEscrow.sol
Found usage of floating pragmas ^ 0.8.19 of Solidity in [NounsDAOForkEscrow.sol]
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/NounsDAOForkEscrow.sol#L18
File: NounsDAOV3Fork.sol
Found usage of floating pragmas ^ 0.8.19 of Solidity in [NounsDAOV3Fork.sol]
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/NounsDAOV3Fork.sol#L18
File: NounsAuctionHouseFork.sol
Found usage of floating pragmas ^ 0.8.19 of Solidity in [NounsAuctionHouseFork.sol]
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/NounsAuctionHouseFork.sol#L30
File: INounsTokenForkLike.sol
Found usage of floating pragmas ^ 0.8.19 of Solidity in [INounsTokenForkLike.sol]
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/INounsTokenForkLike.sol#L3
File: NounsDAOEventsFork.sol
Found usage of floating pragmas ^ 0.8.19 of Solidity in [NounsDAOEventsFork.sol]
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOEventsFork.sol#L3
File: NounsDAOLogicV1Fork.sol
Found usage of floating pragmas ^ 0.8.19 of Solidity in [NounsDAOLogicV1Fork.sol]
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L95
File: NounsDAOStorageV1Fork.sol
Found usage of floating pragmas ^ 0.8.19 of Solidity in [NounsDAOStorageV1Fork.sol]
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOStorageV1Fork.sol#L3
File: INounsTokenFork.sol
Found usage of floating pragmas ^ 0.8.19 of Solidity in [INounsTokenFork.sol]
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/INounsTokenFork.sol#L18
File: NounsTokenFork.sol
Found usage of floating pragmas ^ 0.8.19 of Solidity in [NounsTokenFork.sol]
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/NounsTokenFork.sol#L18
File: ERC721CheckpointableUpgradeable .sol
Found usage of floating pragmas ^ 0.8.19 of Solidity in [ERC721CheckpointableUpgradeable .sol]
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/base/ERC721CheckpointableUpgradeable.sol#L46
File: ERC20Transferer .sol
Found usage of floating pragmas ^ 0.8.16 of Solidity in [ERC20Transferer .sol]
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/utils/ERC20Transferer.sol#L16
File: DeployDAOV3DataContractsBase.s.sol
Found usage of floating pragmas ^ 0.8.15 of Solidity in [DeployDAOV3DataContractsBase.s.sol]
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/DeployDAOV3DataContractsBase.s.sol#L2
File: DeployDAOV3DataContractsGoerli.s.sol
Found usage of floating pragmas ^ 0.8.15 of Solidity in [DeployDAOV3DataContractsGoerli.s.sol]
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/DeployDAOV3DataContractsGoerli.s.sol#L2
File: DeployDAOV3DataContractsSepolia.s.sol
Found usage of floating pragmas ^ 0.8.15 of Solidity in [DeployDAOV3DataContractsSepolia.s.sol]
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/DeployDAOV3DataContractsSepolia.s.sol#L2
File: DeployDAOV3NewContractsBase.s.sol
Found usage of floating pragmas ^ 0.8.15 of Solidity in [DeployDAOV3NewContractsBase.s.sol]
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/DeployDAOV3NewContractsBase.s.sol#L2
File: DeployDAOV3NewContractsMainnet.s.sol
Found usage of floating pragmas ^ 0.8.15 of Solidity in [DeployDAOV3NewContractsMainnet.s.sol]
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/DeployDAOV3NewContractsMainnet.s.sol#L2
File: DeployDAOV3NewContractsTestnet.s.sol
Found usage of floating pragmas ^ 0.8.15 of Solidity in [DeployDAOV3NewContractsTestnet.s.sol]
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/DeployDAOV3NewContractsTestnet.s.sol#L2
File: ProposeDAOV3UpgradeMainnet.s.sol
Found usage of floating pragmas ^ 0.8.15 of Solidity in [ProposeDAOV3UpgradeMainnet.s.sol]
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L2
File: ProposeDAOV3UpgradeTestnet.s.sol
Found usage of floating pragmas ^ 0.8.15 of Solidity in [ProposeDAOV3UpgradeTestnet.s.sol]
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L2
File: ProposeENSReverseLookupConfigMainnet.s.sol
Found usage of floating pragmas ^ 0.8.15 of Solidity in [ProposeENSReverseLookupConfigMainnet.s.sol]
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeENSReverseLookupConfigMainnet.s.sol#L2
File: ProposeTimelockMigrationCleanupMainnet.s.sol
Found usage of floating pragmas ^ 0.8.15 of Solidity in [ProposeTimelockMigrationCleanupMainnet.s.sol]
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeTimelockMigrationCleanupMainnet.s.sol#L2
Use alternative variants , e.g. allowlist/denylist instead of whitelist/blacklist
File: NounsDAOLogicV1Fork.sol
108 : error TokensMustBeASubsetOfWhitelistedTokens ();
211 : revert TokensMustBeASubsetOfWhitelistedTokens ();
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L108
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L211
File: NounsTokenFork.sol
35 : * - Removed the proxyRegistry feature that whitelisted OpenSea.
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/NounsTokenFork.sol#L35
There is no need to verify that == true
or == false
when the variable checked upon is a boolean as well.
File: NounsDAOLogicV2.sol
620 : require (receipt.hasVoted == false , 'NounsDAO::castVoteInternal: voter already voted ' );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L620
File: NounsDAOV3Votes.sol
219 : require (receipt.hasVoted == false , 'NounsDAO::castVoteDuringVotingPeriodInternal: voter already voted ' );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Votes.sol#L219
File: NounsDAOV3Votes.sol
282 : require (receipt.hasVoted == false , 'NounsDAO::castVoteInternal: voter already voted ' );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Votes.sol#L282
File: NounsDAOLogicV1Fork.sol
621 : require (receipt.hasVoted == false , 'NounsDAO::castVoteInternal: voter already voted ' );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L621
Recommended Mitigation Steps
Instead simply check for variable
or !variable
Variable names with all capital letters should be restricted to be used only with constant
or immutable
variables.
If the variable needs to be different based on which class it comes from, a view
/pure
function should be used instead (e.g. like this ).
File: NounsDAOInterfaces.sol
391 : uint256 public proposalThresholdBPS;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOInterfaces.sol#L391
File: NounsDAOInterfaces.sol
394 : uint256 public quorumVotesBPS;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOInterfaces.sol#L394
File: NounsDAOStorageV1Fork.sol
34 : uint256 public proposalThresholdBPS;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOStorageV1Fork.sol#L34
File: NounsDAOStorageV1Fork.sol
37 : uint256 public quorumVotesBPS;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOStorageV1Fork.sol#L37
Variables are declared as constant should utilize the UPPER_CASE_WITH_UNDERSCORES format.
File: NounsDAOLogicV2.sol
59 : string public constant name = 'Nouns DAO ' ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L59
File: NounsDAOV3Votes.sol
44 : string public constant name = 'Nouns DAO ' ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Votes.sol#L44
File: NounsDAOLogicV1Fork.sol
116 : string public constant name = 'Nouns DAO ' ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L116
File: ERC721CheckpointableUpgradeable .sol
52 : uint8 public constant decimals = 0 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/base/ERC721CheckpointableUpgradeable.sol#L52
Doing so will significantly increase centralization, but will help to prevent hackers from using stolen tokens
File: NounsDAOForkEscrow.sol
23 : contract NounsDAOForkEscrow is IERC721Receiver
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/NounsDAOForkEscrow.sol#L23
File: NounsTokenFork.sol
39 : contract NounsTokenFork is INounsTokenFork , OwnableUpgradeable , ERC721CheckpointableUpgradeable , UUPSUpgradeable
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/NounsTokenFork.sol#L39
File: ERC20Transferer .sol
24 : contract ERC20Transferer
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/utils/ERC20Transferer.sol#L24
Typically, the contract's owner is the account that deploys the contract. As a result, the owner is able to perform certain privileged activities. The OpenZeppelin's Ownable
is used in this project contract implements renounceOwnership
. This can represent a certain risk if the ownership is renounced for any other reason than by design. Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner.
File: NounsAuctionHouseFork.sol
45 : OwnableUpgradeable,
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/NounsAuctionHouseFork.sol#L45
File: NounsTokenFork.sol
39 : contract NounsTokenFork is INounsTokenFork , OwnableUpgradeable , ERC721CheckpointableUpgradeable , UUPSUpgradeable {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/NounsTokenFork.sol#L39
Consider moving to solidity version 0.8.18 or later, and using named mappings to make it easier to understand the purpose of each mapping
File: NounsDAOExecutor.sol
70 : mapping (bytes32 => bool ) public queuedTransactions;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutor.sol#L70
File: NounsDAOExecutorV2.sol
93 : mapping (bytes32 => bool ) public queuedTransactions;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutorV2.sol#L93
File: NounsDAOInterfaces.sol
306 : mapping (uint256 => Proposal) public proposals;
309 : mapping (address => uint256 ) public latestProposalIds;
409 : mapping (address => uint256 ) public latestProposalIds;
347 : mapping (address => Receipt) receipts;
447 : mapping (address => Receipt) receipts;
755 : mapping (address => Receipt) receipts;
406 : mapping (uint256 => Proposal) internal _proposals;
309 : mapping (address => uint256 ) public latestProposalIds;
409 : mapping (address => uint256 ) public latestProposalIds;
347 : mapping (address => Receipt) receipts;
447 : mapping (address => Receipt) receipts;
755 : mapping (address => Receipt) receipts;
679 : mapping (uint256 => Proposal) _proposals;
681 : mapping (address => uint256 ) latestProposalIds;
688 : mapping (address => mapping (bytes32 => bool )) cancelledSigs;
347 : mapping (address => Receipt) receipts;
447 : mapping (address => Receipt) receipts;
755 : mapping (address => Receipt) receipts;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOInterfaces.sol#L306
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOInterfaces.sol#L309
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOInterfaces.sol#L409
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOInterfaces.sol#L347
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOInterfaces.sol#L447
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOInterfaces.sol#L755
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOInterfaces.sol#L406
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOInterfaces.sol#L309
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOInterfaces.sol#L409
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOInterfaces.sol#L347
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOInterfaces.sol#L447
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOInterfaces.sol#L755
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOInterfaces.sol#L679
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOInterfaces.sol#L681
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOInterfaces.sol#L688
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOInterfaces.sol#L347
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOInterfaces.sol#L447
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOInterfaces.sol#L755
File: NounsDAOForkEscrow.sol
58 : mapping (uint32 => mapping (uint256 => address )) public escrowedTokensByForkId;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/NounsDAOForkEscrow.sol#L58
File: NounsDAOStorageV1Fork.sol
49 : mapping (uint256 => Proposal) public _proposals;
52 : mapping (address => uint256 ) public latestProposalIds;
92 : mapping (address => Receipt) receipts;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOStorageV1Fork.sol#L49
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOStorageV1Fork.sol#L52
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOStorageV1Fork.sol#L92
File: NounsTokenFork.sol
79 : mapping (uint256 => INounsSeeder.Seed) public seeds;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/NounsTokenFork.sol#L79
File: ERC721CheckpointableUpgradeable .sol
55 : mapping (address => address ) private _delegates;
64 : mapping (address => mapping (uint32 => Checkpoint)) public checkpoints;
67 : mapping (address => uint32 ) public numCheckpoints;
78 : mapping (address => uint256 ) public nonces;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/base/ERC721CheckpointableUpgradeable.sol#L55
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/base/ERC721CheckpointableUpgradeable.sol#L64
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/base/ERC721CheckpointableUpgradeable.sol#L67
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/base/ERC721CheckpointableUpgradeable.sol#L78
Consider using the same approach throughout the codebase to improve the consistency of the code.
File: NounsDAOExecutor.sol
152 : require (queuedTransactions[txHash], "NounsDAOExecutor::executeTransaction: Transaction hasn ' t been queued.");
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutor.sol#L152
File: NounsDAOExecutorV2.sol
175 : require (queuedTransactions[txHash], "NounsDAOExecutor::executeTransaction: Transaction hasn ' t been queued.");
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutorV2.sol#L175
File: NounsDAOLogicV2.sol
146 : revert AdminOnly ();
646 : revert AdminOnly ();
664 : revert AdminOnly ();
683 : revert AdminOnly ();
704 : revert AdminOnly ();
734 : revert AdminOnly ();
761 : revert AdminOnly ();
789 : revert AdminOnly ();
820 : revert AdminOnly ();
361 : revert CantCancelExecutedProposal ();
391 : revert VetoerBurned ();
395 : revert VetoerOnly ();
878 : revert VetoerOnly ();
399 : revert CantVetoExecutedProposal ();
146 : revert AdminOnly ();
646 : revert AdminOnly ();
664 : revert AdminOnly ();
683 : revert AdminOnly ();
704 : revert AdminOnly ();
734 : revert AdminOnly ();
761 : revert AdminOnly ();
789 : revert AdminOnly ();
820 : revert AdminOnly ();
146 : revert AdminOnly ();
646 : revert AdminOnly ();
664 : revert AdminOnly ();
683 : revert AdminOnly ();
704 : revert AdminOnly ();
734 : revert AdminOnly ();
761 : revert AdminOnly ();
789 : revert AdminOnly ();
820 : revert AdminOnly ();
146 : revert AdminOnly ();
646 : revert AdminOnly ();
664 : revert AdminOnly ();
683 : revert AdminOnly ();
704 : revert AdminOnly ();
734 : revert AdminOnly ();
761 : revert AdminOnly ();
789 : revert AdminOnly ();
820 : revert AdminOnly ();
146 : revert AdminOnly ();
646 : revert AdminOnly ();
664 : revert AdminOnly ();
683 : revert AdminOnly ();
704 : revert AdminOnly ();
734 : revert AdminOnly ();
761 : revert AdminOnly ();
789 : revert AdminOnly ();
820 : revert AdminOnly ();
146 : revert AdminOnly ();
646 : revert AdminOnly ();
664 : revert AdminOnly ();
683 : revert AdminOnly ();
704 : revert AdminOnly ();
734 : revert AdminOnly ();
761 : revert AdminOnly ();
789 : revert AdminOnly ();
820 : revert AdminOnly ();
146 : revert AdminOnly ();
646 : revert AdminOnly ();
664 : revert AdminOnly ();
683 : revert AdminOnly ();
704 : revert AdminOnly ();
734 : revert AdminOnly ();
761 : revert AdminOnly ();
789 : revert AdminOnly ();
820 : revert AdminOnly ();
146 : revert AdminOnly ();
646 : revert AdminOnly ();
664 : revert AdminOnly ();
683 : revert AdminOnly ();
704 : revert AdminOnly ();
734 : revert AdminOnly ();
761 : revert AdminOnly ();
789 : revert AdminOnly ();
820 : revert AdminOnly ();
795 : revert InvalidMinQuorumVotesBPS ();
798 : revert InvalidMaxQuorumVotesBPS ();
801 : revert MinQuorumBPSGreaterThanMaxQuorumBPS ();
146 : revert AdminOnly ();
646 : revert AdminOnly ();
664 : revert AdminOnly ();
683 : revert AdminOnly ();
704 : revert AdminOnly ();
734 : revert AdminOnly ();
761 : revert AdminOnly ();
789 : revert AdminOnly ();
820 : revert AdminOnly ();
395 : revert VetoerOnly ();
878 : revert VetoerOnly ();
888 : revert PendingVetoerOnly ();
1085 : revert UnsafeUint16Cast ();
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L146
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L646
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L664
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L683
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L704
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L734
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L761
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L789
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L820
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L361
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L391
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L395
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L878
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L399
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L146
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L646
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L664
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L683
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L704
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L734
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L761
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L789
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L820
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L146
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L646
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L664
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L683
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L704
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L734
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L761
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L789
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L820
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L146
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L646
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L664
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L683
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L704
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L734
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L761
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L789
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L820
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L146
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L646
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L664
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L683
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L704
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L734
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L761
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L789
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L820
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L146
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L646
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L664
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L683
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L704
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L734
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L761
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L789
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L820
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L146
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L646
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L664
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L683
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L704
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L734
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L761
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L789
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L820
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L146
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L646
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L664
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L683
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L704
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L734
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L761
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L789
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L820
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L795
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L798
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L801
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L146
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L646
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L664
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L683
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L704
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L734
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L761
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L789
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L820
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L395
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L878
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L888
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L1085
File: NounsDAOV3Admin.sol
152 : revert AdminOnly ();
217 : revert InvalidObjectionPeriodDurationInBlocks ();
248 : revert InvalidProposalUpdatablePeriodInBlocks ();
303 : revert VetoerOnly ();
316 : revert PendingVetoerOnly ();
442 : revert InvalidMinQuorumVotesBPS ();
445 : revert InvalidMaxQuorumVotesBPS ();
448 : revert MinQuorumBPSGreaterThanMaxQuorumBPS ();
485 : revert VoteSnapshotSwitchAlreadySet ();
535 : revert ForkPeriodTooLong ();
539 : revert ForkPeriodTooShort ();
604 : if (erc20tokens[i] == erc20tokens[j]) revert DuplicateTokenAddress ();
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L152
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L217
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L248
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L303
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L316
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L442
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L445
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L448
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L485
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L535
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L539
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L604
File: NounsDAOV3DynamicQuorum.sol
152 : revert UnsafeUint16Cast ();
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3DynamicQuorum.sol#L152
File: NounsDAOV3Proposals.sol
226 : if (proposerSignatures.length == 0 ) revert MustProvideSignatures ();
394 : if (proposerSignatures.length == 0 ) revert MustProvideSignatures ();
251 : if (signers.length == 0 ) revert MustProvideSignatures ();
252 : if (votes <= propThreshold) revert VotesBelowProposalThreshold ();
963 : if (votes <= propThreshold) revert VotesBelowProposalThreshold ();
226 : if (proposerSignatures.length == 0 ) revert MustProvideSignatures ();
394 : if (proposerSignatures.length == 0 ) revert MustProvideSignatures ();
398 : revert CanOnlyEditUpdatableProposals ();
886 : revert CanOnlyEditUpdatableProposals ();
399 : if (msg .sender != proposal.proposer) revert OnlyProposerCanEdit ();
887 : if (msg .sender != proposal.proposer) revert OnlyProposerCanEdit ();
402 : if (proposerSignatures.length != signers.length ) revert SignerCountMismtach ();
414 : if (signers[i] != proposerSignatures[i].signer) revert OnlyProposerCanEdit ();
504 : if (ds.isForkPeriodActive ()) revert CannotExecuteDuringForkingPeriod ();
538 : revert VetoerBurned ();
542 : revert VetoerOnly ();
546 : revert CantVetoExecutedProposal ();
580 : revert CantCancelProposalAtFinalState ();
807 : ) revert ProposerAlreadyHasALiveProposal ();
398 : revert CanOnlyEditUpdatableProposals ();
886 : revert CanOnlyEditUpdatableProposals ();
399 : if (msg .sender != proposal.proposer) revert OnlyProposerCanEdit ();
887 : if (msg .sender != proposal.proposer) revert OnlyProposerCanEdit ();
888 : if (proposal.signers.length > 0 ) revert ProposerCannotUpdateProposalWithSigners ();
252 : if (votes <= propThreshold) revert VotesBelowProposalThreshold ();
963 : if (votes <= propThreshold) revert VotesBelowProposalThreshold ();
971 : ) revert ProposalInfoArityMismatch ();
972 : if (txs.targets.length == 0 ) revert MustProvideActions ();
973 : if (txs.targets.length > PROPOSAL_MAX_OPERATIONS) revert TooManyActions ();
983 : if (ds.cancelledSigs[proposerSignature.signer][sigHash]) revert SignatureIsCancelled ();
987 : revert InvalidSignature ();
989 : if (block .timestamp > proposerSignature.expirationTimestamp) revert SignatureExpired ();
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L226
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L394
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L251
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L252
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L963
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L226
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L394
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L398
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L886
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L399
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L887
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L402
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L414
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L504
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L538
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L542
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L546
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L580
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L807
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L398
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L886
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L399
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L887
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L888
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L252
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L963
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L971
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L972
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L973
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L983
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L987
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L989
File: NounsDAOV3Votes.sol
195 : if (support != 0 ) revert CanOnlyVoteAgainstDuringObjectionPeriod ();
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Votes.sol#L195
File: NounsDAOLogicV1Fork.sol
211 : revert TokensMustBeASubsetOfWhitelistedTokens ();
378 : revert GovernanceBlockedDuringForkingPeriod ();
382 : revert WaitingForTokensToClaimOrExpiration ();
753 : if (msg .sender != admin) revert AdminOnly ();
798 : if (erc20tokens[i] == erc20tokens[j]) revert DuplicateTokenAddress ();
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L211
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L378
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L382
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L753
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L798
File: NounsTokenFork.sol
151 : if (escrow.ownerOfEscrowedToken (forkId, nounId) != msg .sender ) revert OnlyTokenOwnerCanClaim ();
169 : if (msg .sender != escrow.dao ()) revert OnlyOriginalDAO ();
170 : if (block .timestamp >= forkingPeriodEndTimestamp) revert OnlyDuringForkingPeriod ();
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/NounsTokenFork.sol#L151
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/NounsTokenFork.sol#L169
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/NounsTokenFork.sol#L170
Consider defining in only one contract so that values cannot become out of sync when only one location is updated. A cheap way to store constants in a single location is to create an internal constant
in a library
. If the variable is a local cache of another contract's value, consider making the cache variable internal or private, which will require external users to query the contract with the source of truth, so that callers don't get out of sync.
File: NounsDAOExecutor.sol
62 : uint256 public constant GRACE_PERIOD = 14 days ;
63 : uint256 public constant MINIMUM_DELAY = 2 days ;
64 : uint256 public constant MAXIMUM_DELAY = 30 days ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutor.sol#L62-L64
File: NounsDAOExecutorV2.sol
82 : string public constant NAME = 'NounsDAOExecutorV2 ' ;
85 : uint256 public constant GRACE_PERIOD = 21 days ;
86 : uint256 public constant MINIMUM_DELAY = 2 days ;
87 : uint256 public constant MAXIMUM_DELAY = 30 days ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutorV2.sol#L82
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutorV2.sol#L85
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutorV2.sol#L86
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutorV2.sol#L87
File: NounsDAOLogicV2.sol
59 : string public constant name = 'Nouns DAO ' ;
62 : uint256 public constant MIN_PROPOSAL_THRESHOLD_BPS = 1 ; // 1 basis point or 0.01%
65 : uint256 public constant MAX_PROPOSAL_THRESHOLD_BPS = 1_000 ; // 1,000 basis points or 10%
68 : uint256 public constant MIN_VOTING_PERIOD = 5_760 ; // About 24 hours
71 : uint256 public constant MAX_VOTING_PERIOD = 80_640 ; // About 2 weeks
74 : uint256 public constant MIN_VOTING_DELAY = 1 ;
77 : uint256 public constant MAX_VOTING_DELAY = 40_320 ; // About 1 week
80 : uint256 public constant MIN_QUORUM_VOTES_BPS_LOWER_BOUND = 200 ; // 200 basis points or 2%
83 : uint256 public constant MIN_QUORUM_VOTES_BPS_UPPER_BOUND = 2_000 ; // 2,000 basis points or 20%
86 : uint256 public constant MAX_QUORUM_VOTES_BPS_UPPER_BOUND = 6_000 ; // 4,000 basis points or 60%
89 : uint256 public constant MAX_QUORUM_VOTES_BPS = 2_000 ; // 2,000 basis points or 20%
92 : uint256 public constant proposalMaxOperations = 10 ; // 10 actions
95 : uint256 public constant MAX_REFUND_PRIORITY_FEE = 2 gwei ;
98 : uint256 public constant REFUND_BASE_GAS = 36000 ;
101 : uint256 public constant MAX_REFUND_GAS_USED = 200_000 ;
104 : uint256 public constant MAX_REFUND_BASE_FEE = 200 gwei ;
111 : bytes32 public constant BALLOT_TYPEHASH = keccak256 ('Ballot(uint256 proposalId,uint8 support) ' );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L59
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L62
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L65
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L68
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L71
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L74
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L77
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L80
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L83
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L86
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L89
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L92
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L95
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L98
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L101
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L104
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L111
File: NounsDAOV3Admin.sol
112 : uint256 public constant MIN_PROPOSAL_THRESHOLD_BPS = 1 ; // 1 basis point or 0.01%
115 : uint256 public constant MAX_PROPOSAL_THRESHOLD_BPS = 1_000 ; // 1,000 basis points or 10%
130 : uint256 public constant MIN_QUORUM_VOTES_BPS_LOWER_BOUND = 200 ; // 200 basis points or 2%
133 : uint256 public constant MIN_QUORUM_VOTES_BPS_UPPER_BOUND = 2_000 ; // 2,000 basis points or 20%
136 : uint256 public constant MAX_QUORUM_VOTES_BPS_UPPER_BOUND = 6_000 ; // 6,000 basis points or 60%
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L112
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L115
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L130
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L133
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L136
File: NounsDAOV3Votes.sol
44 : string public constant name = 'Nouns DAO ' ;
51 : bytes32 public constant BALLOT_TYPEHASH = keccak256 ('Ballot(uint256 proposalId,uint8 support) ' );
54 : uint256 public constant MAX_REFUND_PRIORITY_FEE = 2 gwei ;
57 : uint256 public constant REFUND_BASE_GAS = 36000 ;
60 : uint256 public constant MAX_REFUND_GAS_USED = 200_000 ;
63 : uint256 public constant MAX_REFUND_BASE_FEE = 200 gwei ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Votes.sol#L44
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Votes.sol#L51
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Votes.sol#L54
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Votes.sol#L57
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Votes.sol#L60
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Votes.sol#L63
File: NounsAuctionHouseFork.sol
48 : string public constant NAME = 'NounsAuctionHouseFork ' ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/NounsAuctionHouseFork.sol#L48
File: NounsDAOLogicV1Fork.sol
116 : string public constant name = 'Nouns DAO ' ;
119 : uint256 public constant MIN_PROPOSAL_THRESHOLD_BPS = 1 ; // 1 basis point or 0.01%
122 : uint256 public constant MAX_PROPOSAL_THRESHOLD_BPS = 1_000 ; // 1,000 basis points or 10%
125 : uint256 public constant MIN_VOTING_PERIOD = 7_200 ; // 24 hours
128 : uint256 public constant MAX_VOTING_PERIOD = 100_800 ; // 2 weeks
131 : uint256 public constant MIN_VOTING_DELAY = 1 ;
134 : uint256 public constant MAX_VOTING_DELAY = 100_800 ; // 2 weeks
140 : uint256 public constant MAX_QUORUM_VOTES_BPS = 2_000 ; // 2,000 basis points or 20%
143 : uint256 public constant proposalMaxOperations = 10 ; // 10 actions
150 : bytes32 public constant BALLOT_TYPEHASH = keccak256 ('Ballot(uint256 proposalId,uint8 support) ' );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L116
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L119
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L122
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L125
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L128
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L131
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L134
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L140
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L143
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L150
File: NounsTokenFork.sol
46 : string public constant NAME = 'NounsTokenFork ' ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/NounsTokenFork.sol#L46
File: DeployDAOV3DataContractsGoerli.s.sol
8 : address public constant NOUNS_DAO_PROXY_GOERLI = 0x34b74B5c1996b37e5e3EDB756731A5812FF43F67 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/DeployDAOV3DataContractsGoerli.s.sol#L8
File: DeployDAOV3DataContractsSepolia.s.sol
8 : address public constant NOUNS_DAO_PROXY_SEPOLIA = 0x35d2670d7C8931AACdd37C89Ddcb0638c3c44A57 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/DeployDAOV3DataContractsSepolia.s.sol#L8
File: DeployDAOV3NewContractsMainnet.s.sol
9 : address public constant NOUNS_TIMELOCK_V1_MAINNET = 0x0BC3807Ec262cB779b38D65b38158acC3bfedE10 ;
10 : uint256 public constant FORK_DAO_VOTING_PERIOD = 36000 ; // 5 days
11 : uint256 public constant FORK_DAO_VOTING_DELAY = 36000 ; // 5 days
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/DeployDAOV3NewContractsMainnet.s.sol#L9-L11
File: DeployDAOV3NewContractsTestnet.s.sol
8 : address public constant NOUNS_DAO_PROXY_GOERLI = 0x9e6D4B42b8Dc567AC4aeCAB369Eb9a3156dF095C ;
9 : address public constant NOUNS_TIMELOCK_V1_GOERLI = 0xADa0F1A73D1df49477fa41C7F8476F9eA5aB115f ;
10 : uint256 public constant FORK_DAO_VOTING_PERIOD = 40 ; // 8 minutes
27 : uint256 public constant FORK_DAO_VOTING_PERIOD = 40 ; // 8 minutes
11 : uint256 public constant FORK_DAO_VOTING_DELAY = 1 ;
28 : uint256 public constant FORK_DAO_VOTING_DELAY = 1 ;
25 : address public constant NOUNS_DAO_PROXY_SEPOLIA = 0x35d2670d7C8931AACdd37C89Ddcb0638c3c44A57 ;
26 : address public constant NOUNS_TIMELOCK_V1_SEPOLIA = 0x332db58b51393f3a6b28d4DD8964234967e1aD33 ;
10 : uint256 public constant FORK_DAO_VOTING_PERIOD = 40 ; // 8 minutes
27 : uint256 public constant FORK_DAO_VOTING_PERIOD = 40 ; // 8 minutes
11 : uint256 public constant FORK_DAO_VOTING_DELAY = 1 ;
28 : uint256 public constant FORK_DAO_VOTING_DELAY = 1 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/DeployDAOV3NewContractsTestnet.s.sol#L8
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/DeployDAOV3NewContractsTestnet.s.sol#L9
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/DeployDAOV3NewContractsTestnet.s.sol#L10
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/DeployDAOV3NewContractsTestnet.s.sol#L27
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/DeployDAOV3NewContractsTestnet.s.sol#L11
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/DeployDAOV3NewContractsTestnet.s.sol#L28
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/DeployDAOV3NewContractsTestnet.s.sol#L25
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/DeployDAOV3NewContractsTestnet.s.sol#L26
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/DeployDAOV3NewContractsTestnet.s.sol#L10
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/DeployDAOV3NewContractsTestnet.s.sol#L27
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/DeployDAOV3NewContractsTestnet.s.sol#L11
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/DeployDAOV3NewContractsTestnet.s.sol#L28
File: ProposeDAOV3UpgradeMainnet.s.sol
12 : address public constant NOUNS_TIMELOCK_V1_MAINNET = 0x0BC3807Ec262cB779b38D65b38158acC3bfedE10 ;
14 : uint256 public constant ETH_TO_SEND_TO_NEW_TIMELOCK = 10000 ether ;
15 : uint256 public constant FORK_PERIOD = 7 days ;
16 : uint256 public constant FORK_THRESHOLD_BPS = 2000 ;
20 : address public constant NOUNS_TOKEN_MAINNET = 0x9C8fF314C9Bc7F6e59A9d9225Fb22946427eDC03 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L12
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L14
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L15
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L16
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L20
File: ProposeDAOV3UpgradeTestnet.s.sol
10 : uint256 public constant ETH_TO_SEND_TO_NEW_TIMELOCK = 0.001 ether ;
11 : uint256 public constant FORK_PERIOD = 1 hours ;
12 : uint256 public constant FORK_THRESHOLD_BPS = 2000 ;
144 : address public constant NOUNS_TIMELOCK_V1_GOERLI = 0xADa0F1A73D1df49477fa41C7F8476F9eA5aB115f ;
161 : address public constant NOUNS_TIMELOCK_V1_SEPOLIA = 0x332db58b51393f3a6b28d4DD8964234967e1aD33 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L10
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L11
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L12
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L144
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L161
File: ProposeTimelockMigrationCleanupMainnet.s.sol
15 : address public constant NOUNS_TIMELOCK_V1_MAINNET = 0x0BC3807Ec262cB779b38D65b38158acC3bfedE10 ;
16 : address public constant NOUNS_TOKEN_MAINNET = 0x9C8fF314C9Bc7F6e59A9d9225Fb22946427eDC03 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeTimelockMigrationCleanupMainnet.s.sol#L15-L16
Even assembly can benefit from using readable constants instead of hex/numeric literals
File: NounsAuctionHouseFork.sol
126 : msg .value >= _auction.amount + ((_auction.amount * minBidIncrementPercentage) / 100 ),
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/NounsAuctionHouseFork.sol#L126
File: ERC721CheckpointableUpgradeable .sol
266 : require (n < 2 ** 32 , errorMessage);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/base/ERC721CheckpointableUpgradeable.sol#L266
File: ERC721CheckpointableUpgradeable .sol
271 : require (n < 2 ** 96 , errorMessage);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/base/ERC721CheckpointableUpgradeable.sol#L271
Doing so will prevent typo bugs
File: NounsDAOLogicV2.sol
625 : if (support == 0 ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L625
File: NounsDAOLogicV2.sol
985 : if (len == 0 ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L985
File: NounsDAOLogicV2.sol
1036 : if (balance == 0 ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L1036
File: NounsDAOV3DynamicQuorum.sol
85 : if (len == 0 ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3DynamicQuorum.sol#L85
File: NounsDAOV3Proposals.sol
833 : if (signerVotes == 0 ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L833
File: NounsDAOV3Votes.sol
225 : if (support == 1 ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Votes.sol#L225
File: NounsDAOV3Votes.sol
232 : if (support == 0 ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Votes.sol#L232
File: NounsDAOV3Votes.sol
248 : proposal.objectionPeriodEndBlock == 0 &&
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Votes.sol#L248
File: NounsDAOV3Votes.sol
298 : if (balance == 0 ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Votes.sol#L298
File: NounsDAOLogicV1Fork.sol
626 : if (support == 0 ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L626
File: ERC721CheckpointableUpgradeable .sol
179 : if (nCheckpoints == 0 ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/base/ERC721CheckpointableUpgradeable.sol#L179
The style guide says that, within a contract, the ordering should be 1) Type declarations, 2) State variables, 3) Events, 4) Errors 5) Modifiers, and 6) Functions, but the contract(s) below do not follow this ordering
Various in-scope contracts
The critical procedures should be two step process.
See similar findings in previous Code4rena contests for reference:
https://code4rena.com/reports/2022-06-illuminate/#2-critical-changes-should-use-two-step-procedure
File: NounsDAOExecutor.sol
80 : function setDelay (uint256 delay_ ) public {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutor.sol#L80
File: NounsDAOExecutor.sol
97 : function setPendingAdmin (address pendingAdmin_ ) public {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutor.sol#L97
File: NounsDAOExecutorV2.sol
103 : function setDelay (uint256 delay_ ) public {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutorV2.sol#L103
File: NounsDAOExecutorV2.sol
120 : function setPendingAdmin (address pendingAdmin_ ) public {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutorV2.sol#L120
File: NounsDAOInterfaces.sol
601 : function setApprovalForAll (address operator , bool approved ) external ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOInterfaces.sol#L601
File: NounsAuctionHouseFork.sol
102 : function settleCurrentAndCreateNewAuction () external override nonReentrant whenNotPaused {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/NounsAuctionHouseFork.sol#L102
File: NounsAuctionHouseFork.sol
111 : function settleAuction () external override whenPaused nonReentrant {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/NounsAuctionHouseFork.sol#L111
File: NounsAuctionHouseFork.sol
180 : function setTimeBuffer (uint256 _timeBuffer ) external override onlyOwner {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/NounsAuctionHouseFork.sol#L180
File: NounsAuctionHouseFork.sol
190 : function setReservePrice (uint256 _reservePrice ) external override onlyOwner {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/NounsAuctionHouseFork.sol#L190
File: NounsAuctionHouseFork.sol
200 : function setMinBidIncrementPercentage (uint8 _minBidIncrementPercentage ) external override onlyOwner {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/NounsAuctionHouseFork.sol#L200
File: NounsTokenFork.sol
198 : function setContractURIHash (string memory newContractURIHash ) external onlyOwner {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/NounsTokenFork.sol#L198
File: NounsTokenFork.sol
240 : function setMinter (address _minter ) external override onlyOwner whenMinterNotLocked {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/NounsTokenFork.sol#L240
File: NounsTokenFork.sol
260 : function setDescriptor (INounsDescriptorMinimal _descriptor ) external override onlyOwner whenDescriptorNotLocked {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/NounsTokenFork.sol#L260
File: NounsTokenFork.sol
280 : function setSeeder (INounsSeeder _seeder ) external override onlyOwner whenSeederNotLocked {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/NounsTokenFork.sol#L280
Recommended Mitigation Steps
Lack of two-step procedure for critical operations leaves them error-prone. Consider adding two step procedure on the critical functions.
Saves deployment costs
File: NounsDAOExecutor.sol
74 : require (delay_ <= MAXIMUM_DELAY, 'NounsDAOExecutor::setDelay: Delay must not exceed maximum delay. ' );
83 : require (delay_ <= MAXIMUM_DELAY, 'NounsDAOExecutor::setDelay: Delay must not exceed maximum delay. ' );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutor.sol#L74
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutor.sol#L83
File: NounsDAOExecutorV2.sol
97 : require (delay_ <= MAXIMUM_DELAY, 'NounsDAOExecutor::setDelay: Delay must not exceed maximum delay. ' );
106 : require (delay_ <= MAXIMUM_DELAY, 'NounsDAOExecutor::setDelay: Delay must not exceed maximum delay. ' );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutorV2.sol#L97
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutorV2.sol#L106
File: NounsTokenFork.sol
223 : require (_exists (tokenId), 'NounsToken: URI query for nonexistent token ' );
232 : require (_exists (tokenId), 'NounsToken: URI query for nonexistent token ' );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/NounsTokenFork.sol#L223
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/NounsTokenFork.sol#L232
One level of nesting can be removed by not having an else
block when the if
-block returns, and if (foo) { return 1; } else { return 2; }
becomes if (foo) { return 1; } return 2;
File: NounsDAOLogicV2.sol
472 : } else if (block .timestamp >= proposal.eta + timelock.GRACE_PERIOD ()) {
return ProposalState.Expired;
} else {
return ProposalState.Queued;
}
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L472
File: NounsDAOV3Proposals.sol
525 : if (proposal.executeOnTimelockV1) {
return ds.timelockV1;
} else {
return ds.timelock;
}
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L525
File: NounsDAOV3Proposals.sol
662 : } else if (block .timestamp >= proposal.eta + getProposalTimelock (ds, proposal).GRACE_PERIOD ()) {
return NounsDAOStorageV3.ProposalState.Expired;
} else {
return NounsDAOStorageV3.ProposalState.Queued;
}
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L662
File: NounsDAOForkEscrow.sol
187 : if (owner == address (0 )) {
return dao;
} else {
return owner;
}
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/NounsDAOForkEscrow.sol#L187
File: NounsDAOLogicV1Fork.sol
527 : } else if (block .timestamp >= proposal.eta + timelock.GRACE_PERIOD ()) {
return ProposalState.Expired;
} else {
return ProposalState.Queued;
}
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L527
Some emitted events do not have any emitted parameters. It is recommended to add some parameter such as state changes or value changes when events are emitted
File: NounsTokenFork.sol
253 : emit MinterLocked ()
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/NounsTokenFork.sol#L253
File: NounsTokenFork.sol
273 : emit DescriptorLocked ()
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/NounsTokenFork.sol#L273
File: NounsTokenFork.sol
293 : emit SeederLocked ()
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/NounsTokenFork.sol#L293
Some events are missing key information when emitted.
In the following events, they should contain the minted amount and beneficiary to whom it was minted.
File: NounsTokenFork.sol
243 : emit MinterUpdated (_minter);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/NounsTokenFork.sol#L243
File: NounsTokenFork.sol
253 : emit MinterLocked ();
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/NounsTokenFork.sol#L253
The following functions are missing critical parameters when emitting an event.
When dealing with source address which uses the value of msg.sender
, the msg.sender
value must be specified in every transaction, a contract or web page listening to events cannot react to users, emit does not serve the purpose. Basically, this event cannot be used.
File: NounsDAOExecutor.sol
function setDelay (uint256 delay_ ) public {
require (msg .sender == address (this ), 'NounsDAOExecutor::setDelay: Call must come from NounsDAOExecutor. ' );
require (delay_ >= MINIMUM_DELAY, 'NounsDAOExecutor::setDelay: Delay must exceed minimum delay. ' );
require (delay_ <= MAXIMUM_DELAY, 'NounsDAOExecutor::setDelay: Delay must not exceed maximum delay. ' );
delay = delay_;
emit NewDelay (delay);
}
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutor.sol#L86
File: NounsDAOExecutor.sol
function acceptAdmin () public {
require (msg .sender == pendingAdmin, 'NounsDAOExecutor::acceptAdmin: Call must come from pendingAdmin. ' );
admin = msg .sender ;
pendingAdmin = address (0 );
emit NewAdmin (admin);
}
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutor.sol#L94
File: NounsDAOExecutor.sol
function setPendingAdmin (address pendingAdmin_ ) public {
require (
msg .sender == address (this ),
'NounsDAOExecutor::setPendingAdmin: Call must come from NounsDAOExecutor. '
);
pendingAdmin = pendingAdmin_;
emit NewPendingAdmin (pendingAdmin);
}
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutor.sol#L104
File: NounsDAOExecutor.sol
function queueTransaction (
address target ,
uint256 value ,
string memory signature ,
bytes memory data ,
uint256 eta
) public returns (bytes32 ) {
require (msg .sender == admin, 'NounsDAOExecutor::queueTransaction: Call must come from admin. ' );
require (
eta >= getBlockTimestamp () + delay,
'NounsDAOExecutor::queueTransaction: Estimated execution block must satisfy delay. '
);
bytes32 txHash = keccak256 (abi.encode (target, value, signature, data, eta));
queuedTransactions[txHash] = true ;
emit QueueTransaction (txHash, target, value, signature, data, eta);
return txHash;
}
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutor.sol#L123
File: NounsDAOExecutor.sol
function cancelTransaction (
address target ,
uint256 value ,
string memory signature ,
bytes memory data ,
uint256 eta
) public {
require (msg .sender == admin, 'NounsDAOExecutor::cancelTransaction: Call must come from admin. ' );
bytes32 txHash = keccak256 (abi.encode (target, value, signature, data, eta));
queuedTransactions[txHash] = false ;
emit CancelTransaction (txHash, target, value, signature, data, eta);
}
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutor.sol#L139
File: NounsDAOExecutor.sol
function executeTransaction (
address target ,
uint256 value ,
string memory signature ,
bytes memory data ,
uint256 eta
) public returns (bytes memory ) {
require (msg .sender == admin, 'NounsDAOExecutor::executeTransaction: Call must come from admin. ' );
bytes32 txHash = keccak256 (abi.encode (target, value, signature, data, eta));
require (queuedTransactions[txHash], "NounsDAOExecutor::executeTransaction: Transaction hasn ' t been queued.");
require(
getBlockTimestamp() >= eta,
" NounsDAOExecutor::executeTransaction: Transaction hasn't surpassed time lock. "
);
require (
getBlockTimestamp () <= eta + GRACE_PERIOD,
'NounsDAOExecutor::executeTransaction: Transaction is stale. '
);
queuedTransactions[txHash] = false ;
bytes memory callData;
if (bytes (signature).length == 0 ) {
callData = data;
} else {
callData = abi.encodePacked (bytes4 (keccak256 (bytes (signature))), data);
}
(bool success , bytes memory returnData ) = target.call { value: value }(callData);
require (success, 'NounsDAOExecutor::executeTransaction: Transaction execution reverted. ' );
emit ExecuteTransaction (txHash, target, value, signature, data, eta);
return returnData;
}
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutor.sol#L176
File: NounsDAOExecutorV2.sol
function setDelay (uint256 delay_ ) public {
require (msg .sender == address (this ), 'NounsDAOExecutor::setDelay: Call must come from NounsDAOExecutor. ' );
require (delay_ >= MINIMUM_DELAY, 'NounsDAOExecutor::setDelay: Delay must exceed minimum delay. ' );
require (delay_ <= MAXIMUM_DELAY, 'NounsDAOExecutor::setDelay: Delay must not exceed maximum delay. ' );
delay = delay_;
emit NewDelay (delay_);
}
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutorV2.sol#L109
File: NounsDAOExecutorV2.sol
function setPendingAdmin (address pendingAdmin_ ) public {
require (
msg .sender == address (this ),
'NounsDAOExecutor::setPendingAdmin: Call must come from NounsDAOExecutor. '
);
pendingAdmin = pendingAdmin_;
emit NewPendingAdmin (pendingAdmin_);
}
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutorV2.sol#L127
File: NounsDAOExecutorV2.sol
function queueTransaction (
address target ,
uint256 value ,
string memory signature ,
bytes memory data ,
uint256 eta
) public returns (bytes32 ) {
require (msg .sender == admin, 'NounsDAOExecutor::queueTransaction: Call must come from admin. ' );
require (
eta >= getBlockTimestamp () + delay,
'NounsDAOExecutor::queueTransaction: Estimated execution block must satisfy delay. '
);
bytes32 txHash = keccak256 (abi.encode (target, value, signature, data, eta));
queuedTransactions[txHash] = true ;
emit QueueTransaction (txHash, target, value, signature, data, eta);
return txHash;
}
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutorV2.sol#L146
File: NounsDAOExecutorV2.sol
function cancelTransaction (
address target ,
uint256 value ,
string memory signature ,
bytes memory data ,
uint256 eta
) public {
require (msg .sender == admin, 'NounsDAOExecutor::cancelTransaction: Call must come from admin. ' );
bytes32 txHash = keccak256 (abi.encode (target, value, signature, data, eta));
queuedTransactions[txHash] = false ;
emit CancelTransaction (txHash, target, value, signature, data, eta);
}
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutorV2.sol#L162
File: NounsDAOExecutorV2.sol
function executeTransaction (
address target ,
uint256 value ,
string memory signature ,
bytes memory data ,
uint256 eta
) public returns (bytes memory ) {
require (msg .sender == admin, 'NounsDAOExecutor::executeTransaction: Call must come from admin. ' );
bytes32 txHash = keccak256 (abi.encode (target, value, signature, data, eta));
require (queuedTransactions[txHash], "NounsDAOExecutor::executeTransaction: Transaction hasn ' t been queued.");
require(
getBlockTimestamp() >= eta,
" NounsDAOExecutor::executeTransaction: Transaction hasn't surpassed time lock. "
);
require (
getBlockTimestamp () <= eta + GRACE_PERIOD,
'NounsDAOExecutor::executeTransaction: Transaction is stale. '
);
queuedTransactions[txHash] = false ;
bytes memory callData;
if (bytes (signature).length == 0 ) {
callData = data;
} else {
callData = abi.encodePacked (bytes4 (keccak256 (bytes (signature))), data);
}
(bool success , bytes memory returnData ) = target.call { value: value }(callData);
require (success, 'NounsDAOExecutor::executeTransaction: Transaction execution reverted. ' );
emit ExecuteTransaction (txHash, target, value, signature, data, eta);
return returnData;
}
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutorV2.sol#L199
File: NounsDAOExecutorV2.sol
function sendETH (address payable recipient , uint256 ethToSend ) external {
require (msg .sender == admin, 'NounsDAOExecutor::sendETH: Call must come from admin. ' );
recipient.sendValue (ethToSend);
emit ETHSent (recipient, ethToSend);
}
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutorV2.sol#L218
File: NounsDAOExecutorV2.sol
function sendERC20 (
address recipient ,
address erc20Token ,
uint256 tokensToSend
) external {
require (msg .sender == admin, 'NounsDAOExecutor::sendERC20: Call must come from admin. ' );
IERC20 (erc20Token).safeTransfer (recipient, tokensToSend);
emit ERC20Sent (recipient, erc20Token, tokensToSend);
}
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutorV2.sol#L230
File: NounsDAOLogicV2.sol
function initialize (
address timelock_ ,
address nouns_ ,
address vetoer_ ,
uint256 votingPeriod_ ,
uint256 votingDelay_ ,
uint256 proposalThresholdBPS_ ,
DynamicQuorumParams calldata dynamicQuorumParams_
) public virtual {
require (address (timelock) == address (0 ), 'NounsDAO::initialize: can only initialize once ' );
if (msg .sender != admin) {
revert AdminOnly ();
}
require (timelock_ != address (0 ), 'NounsDAO::initialize: invalid timelock address ' );
require (nouns_ != address (0 ), 'NounsDAO::initialize: invalid nouns address ' );
require (
votingPeriod_ >= MIN_VOTING_PERIOD && votingPeriod_ <= MAX_VOTING_PERIOD,
'NounsDAO::initialize: invalid voting period '
);
require (
votingDelay_ >= MIN_VOTING_DELAY && votingDelay_ <= MAX_VOTING_DELAY,
'NounsDAO::initialize: invalid voting delay '
);
require (
proposalThresholdBPS_ >= MIN_PROPOSAL_THRESHOLD_BPS && proposalThresholdBPS_ <= MAX_PROPOSAL_THRESHOLD_BPS,
'NounsDAO::initialize: invalid proposal threshold bps '
);
emit VotingPeriodSet (votingPeriod, votingPeriod_);
emit VotingDelaySet (votingDelay, votingDelay_);
emit ProposalThresholdBPSSet (proposalThresholdBPS, proposalThresholdBPS_);
timelock = INounsDAOExecutor (timelock_);
nouns = NounsTokenLike (nouns_);
vetoer = vetoer_;
votingPeriod = votingPeriod_;
votingDelay = votingDelay_;
proposalThresholdBPS = proposalThresholdBPS_;
_setDynamicQuorumParams (
dynamicQuorumParams_.minQuorumVotesBPS,
dynamicQuorumParams_.maxQuorumVotesBPS,
dynamicQuorumParams_.quorumCoefficient
);
}
struct ProposalTemp {
uint256 totalSupply;
uint256 proposalThreshold;
uint256 latestProposalId;
uint256 startBlock;
uint256 endBlock;
}
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L163-L165
File: NounsDAOLogicV2.sol
function cancel (uint256 proposalId ) external {
if (state (proposalId) == ProposalState.Executed) {
revert CantCancelExecutedProposal ();
}
Proposal storage proposal = _proposals[proposalId];
require (
msg .sender == proposal.proposer ||
nouns.getPriorVotes (proposal.proposer, block .number - 1 ) <= proposal.proposalThreshold,
'NounsDAO::cancel: proposer above threshold '
);
proposal.canceled = true ;
for (uint256 i = 0 ; i < proposal.targets.length ; i++ ) {
timelock.cancelTransaction (
proposal.targets[i],
proposal.values[i],
proposal.signatures[i],
proposal.calldatas[i],
proposal.eta
);
}
emit ProposalCanceled (proposalId);
}
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L382
File: NounsDAOLogicV2.sol
function veto (uint256 proposalId ) external {
if (vetoer == address (0 )) {
revert VetoerBurned ();
}
if (msg .sender != vetoer) {
revert VetoerOnly ();
}
if (state (proposalId) == ProposalState.Executed) {
revert CantVetoExecutedProposal ();
}
Proposal storage proposal = _proposals[proposalId];
proposal.vetoed = true ;
for (uint256 i = 0 ; i < proposal.targets.length ; i++ ) {
timelock.cancelTransaction (
proposal.targets[i],
proposal.values[i],
proposal.signatures[i],
proposal.calldatas[i],
proposal.eta
);
}
emit ProposalVetoed (proposalId);
}
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L415
File: NounsDAOLogicV2.sol
function _setVotingDelay (uint256 newVotingDelay ) external {
if (msg .sender != admin) {
revert AdminOnly ();
}
require (
newVotingDelay >= MIN_VOTING_DELAY && newVotingDelay <= MAX_VOTING_DELAY,
'NounsDAO::_setVotingDelay: invalid voting delay '
);
uint256 oldVotingDelay = votingDelay;
votingDelay = newVotingDelay;
emit VotingDelaySet (oldVotingDelay, votingDelay);
}
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L655
File: NounsDAOLogicV2.sol
function _setVotingPeriod (uint256 newVotingPeriod ) external {
if (msg .sender != admin) {
revert AdminOnly ();
}
require (
newVotingPeriod >= MIN_VOTING_PERIOD && newVotingPeriod <= MAX_VOTING_PERIOD,
'NounsDAO::_setVotingPeriod: invalid voting period '
);
uint256 oldVotingPeriod = votingPeriod;
votingPeriod = newVotingPeriod;
emit VotingPeriodSet (oldVotingPeriod, votingPeriod);
}
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L673
File: NounsDAOLogicV2.sol
function _setProposalThresholdBPS (uint256 newProposalThresholdBPS ) external {
if (msg .sender != admin) {
revert AdminOnly ();
}
require (
newProposalThresholdBPS >= MIN_PROPOSAL_THRESHOLD_BPS &&
newProposalThresholdBPS <= MAX_PROPOSAL_THRESHOLD_BPS,
'NounsDAO::_setProposalThreshold: invalid proposal threshold bps '
);
uint256 oldProposalThresholdBPS = proposalThresholdBPS;
proposalThresholdBPS = newProposalThresholdBPS;
emit ProposalThresholdBPSSet (oldProposalThresholdBPS, proposalThresholdBPS);
}
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L693
File: NounsDAOLogicV2.sol
function _setMinQuorumVotesBPS (uint16 newMinQuorumVotesBPS ) external {
if (msg .sender != admin) {
revert AdminOnly ();
}
DynamicQuorumParams memory params = getDynamicQuorumParamsAt (block .number );
require (
newMinQuorumVotesBPS >= MIN_QUORUM_VOTES_BPS_LOWER_BOUND &&
newMinQuorumVotesBPS <= MIN_QUORUM_VOTES_BPS_UPPER_BOUND,
'NounsDAO::_setMinQuorumVotesBPS: invalid min quorum votes bps '
);
require (
newMinQuorumVotesBPS <= params.maxQuorumVotesBPS,
'NounsDAO::_setMinQuorumVotesBPS: min quorum votes bps greater than max '
);
uint16 oldMinQuorumVotesBPS = params.minQuorumVotesBPS;
params.minQuorumVotesBPS = newMinQuorumVotesBPS;
_writeQuorumParamsCheckpoint (params);
emit MinQuorumVotesBPSSet (oldMinQuorumVotesBPS, newMinQuorumVotesBPS);
}
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L723
File: NounsDAOLogicV2.sol
function _setMaxQuorumVotesBPS (uint16 newMaxQuorumVotesBPS ) external {
if (msg .sender != admin) {
revert AdminOnly ();
}
DynamicQuorumParams memory params = getDynamicQuorumParamsAt (block .number );
require (
newMaxQuorumVotesBPS <= MAX_QUORUM_VOTES_BPS_UPPER_BOUND,
'NounsDAO::_setMaxQuorumVotesBPS: invalid max quorum votes bps '
);
require (
params.minQuorumVotesBPS <= newMaxQuorumVotesBPS,
'NounsDAO::_setMaxQuorumVotesBPS: min quorum votes bps greater than max '
);
uint16 oldMaxQuorumVotesBPS = params.maxQuorumVotesBPS;
params.maxQuorumVotesBPS = newMaxQuorumVotesBPS;
_writeQuorumParamsCheckpoint (params);
emit MaxQuorumVotesBPSSet (oldMaxQuorumVotesBPS, newMaxQuorumVotesBPS);
}
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L752
File: NounsDAOLogicV2.sol
function _setQuorumCoefficient (uint32 newQuorumCoefficient ) external {
if (msg .sender != admin) {
revert AdminOnly ();
}
DynamicQuorumParams memory params = getDynamicQuorumParamsAt (block .number );
uint32 oldQuorumCoefficient = params.quorumCoefficient;
params.quorumCoefficient = newQuorumCoefficient;
_writeQuorumParamsCheckpoint (params);
emit QuorumCoefficientSet (oldQuorumCoefficient, newQuorumCoefficient);
}
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L770
File: NounsDAOLogicV2.sol
function _setDynamicQuorumParams (
uint16 newMinQuorumVotesBPS ,
uint16 newMaxQuorumVotesBPS ,
uint32 newQuorumCoefficient
) public {
if (msg .sender != admin) {
revert AdminOnly ();
}
if (
newMinQuorumVotesBPS < MIN_QUORUM_VOTES_BPS_LOWER_BOUND ||
newMinQuorumVotesBPS > MIN_QUORUM_VOTES_BPS_UPPER_BOUND
) {
revert InvalidMinQuorumVotesBPS ();
}
if (newMaxQuorumVotesBPS > MAX_QUORUM_VOTES_BPS_UPPER_BOUND) {
revert InvalidMaxQuorumVotesBPS ();
}
if (newMinQuorumVotesBPS > newMaxQuorumVotesBPS) {
revert MinQuorumBPSGreaterThanMaxQuorumBPS ();
}
DynamicQuorumParams memory oldParams = getDynamicQuorumParamsAt (block .number );
DynamicQuorumParams memory params = DynamicQuorumParams ({
minQuorumVotesBPS: newMinQuorumVotesBPS,
maxQuorumVotesBPS: newMaxQuorumVotesBPS,
quorumCoefficient: newQuorumCoefficient
});
_writeQuorumParamsCheckpoint (params);
emit MinQuorumVotesBPSSet (oldParams.minQuorumVotesBPS, params.minQuorumVotesBPS);
emit MaxQuorumVotesBPSSet (oldParams.maxQuorumVotesBPS, params.maxQuorumVotesBPS);
emit QuorumCoefficientSet (oldParams.quorumCoefficient, params.quorumCoefficient);
}
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L813-L815
File: NounsDAOLogicV2.sol
function _withdraw () external returns (uint256 , bool ) {
if (msg .sender != admin) {
revert AdminOnly ();
}
uint256 amount = address (this ).balance;
(bool sent , ) = msg .sender .call { value: amount }('' );
emit Withdraw (amount, sent);
return (amount, sent);
}
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L826
File: NounsDAOLogicV2.sol
function _setPendingAdmin (address newPendingAdmin ) external {
require (msg .sender == admin, 'NounsDAO::_setPendingAdmin: admin only ' );
address oldPendingAdmin = pendingAdmin;
pendingAdmin = newPendingAdmin;
emit NewPendingAdmin (oldPendingAdmin, newPendingAdmin);
}
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L847
File: NounsDAOLogicV2.sol
function _acceptAdmin () external {
require (msg .sender == pendingAdmin && msg .sender != address (0 ), 'NounsDAO::_acceptAdmin: pending admin only ' );
address oldAdmin = admin;
address oldPendingAdmin = pendingAdmin;
admin = pendingAdmin;
pendingAdmin = address (0 );
emit NewAdmin (oldAdmin, admin);
emit NewPendingAdmin (oldPendingAdmin, pendingAdmin);
}
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L868-L869
File: NounsDAOLogicV2.sol
function _setPendingVetoer (address newPendingVetoer ) public {
if (msg .sender != vetoer) {
revert VetoerOnly ();
}
emit NewPendingVetoer (pendingVetoer, newPendingVetoer);
pendingVetoer = newPendingVetoer;
}
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L881
File: NounsDAOLogicV2.sol
function _acceptVetoer () external {
if (msg .sender != pendingVetoer) {
revert PendingVetoerOnly ();
}
emit NewVetoer (vetoer, pendingVetoer);
vetoer = pendingVetoer;
emit NewPendingVetoer (pendingVetoer, address (0 ));
pendingVetoer = address (0 );
}
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L892
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L896
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L913
File: NounsDAOLogicV2.sol
function _burnVetoPower () public {
require (msg .sender == vetoer, 'NounsDAO::_burnVetoPower: vetoer only ' );
emit NewVetoer (vetoer, address (0 ));
vetoer = address (0 );
emit NewPendingVetoer (pendingVetoer, address (0 ));
pendingVetoer = address (0 );
}
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L909
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L896
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L913
File: NounsDAOProxy.sol
function _setImplementation (address implementation_ ) public {
require (msg .sender == admin, 'NounsDAOProxy::_setImplementation: admin only ' );
require (implementation_ != address (0 ), 'NounsDAOProxy::_setImplementation: invalid implementation address ' );
address oldImplementation = implementation;
implementation = implementation_;
emit NewImplementation (oldImplementation, implementation);
}
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOProxy.sol#L85
File: NounsDAOV3Admin.sol
function _acceptAdmin (NounsDAOStorageV3.StorageV3 storage ds ) external {
require (
msg .sender == ds.pendingAdmin && msg .sender != address (0 ),
'NounsDAO::_acceptAdmin: pending admin only '
);
address oldAdmin = ds.admin;
address oldPendingAdmin = ds.pendingAdmin;
ds.admin = ds.pendingAdmin;
ds.pendingAdmin = address (0 );
emit NewAdmin (oldAdmin, ds.admin);
emit NewPendingAdmin (oldPendingAdmin, address (0 ));
}
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L293-L294
File: NounsDAOV3Admin.sol
function _setPendingVetoer (NounsDAOStorageV3.StorageV3 storage ds , address newPendingVetoer ) public {
if (msg .sender != ds.vetoer) {
revert VetoerOnly ();
}
emit NewPendingVetoer (ds.pendingVetoer, newPendingVetoer);
ds.pendingVetoer = newPendingVetoer;
}
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L306
File: NounsDAOV3Admin.sol
function _acceptVetoer (NounsDAOStorageV3.StorageV3 storage ds ) external {
if (msg .sender != ds.pendingVetoer) {
revert PendingVetoerOnly ();
}
emit NewVetoer (ds.vetoer, ds.pendingVetoer);
ds.vetoer = ds.pendingVetoer;
emit NewPendingVetoer (ds.pendingVetoer, address (0 ));
ds.pendingVetoer = address (0 );
}
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L320
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L324
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L341
File: NounsDAOV3Admin.sol
function _burnVetoPower (NounsDAOStorageV3.StorageV3 storage ds ) public {
require (msg .sender == ds.vetoer, 'NounsDAO::_burnVetoPower: vetoer only ' );
emit NewVetoer (ds.vetoer, address (0 ));
ds.vetoer = address (0 );
emit NewPendingVetoer (ds.pendingVetoer, address (0 ));
ds.pendingVetoer = address (0 );
}
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L337
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L324
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L341
File: NounsDAOV3Admin.sol
function _withdraw (NounsDAOStorageV3.StorageV3 storage ds ) external onlyAdmin (ds) returns (uint256 , bool ) {
uint256 amount = address (this ).balance;
(bool sent , ) = msg .sender .call { value: amount }('' );
emit Withdraw (amount, sent);
return (amount, sent);
}
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L472
File: NounsDAOV3Proposals.sol
function propose (
NounsDAOStorageV3.StorageV3 storage ds ,
ProposalTxs memory txs ,
string memory description
) internal returns (uint256 ) {
uint256 adjustedTotalSupply = ds.adjustedTotalSupply ();
uint256 proposalThreshold_ = checkPropThreshold (
ds,
ds.nouns.getPriorVotes (msg .sender , block .number - 1 ),
adjustedTotalSupply
);
checkProposalTxs (txs);
checkNoActiveProp (ds, msg .sender );
uint256 proposalId = ds.proposalCount = ds.proposalCount + 1 ;
NounsDAOStorageV3.Proposal storage newProposal = createNewProposal (
ds,
proposalId,
proposalThreshold_,
adjustedTotalSupply,
txs
);
ds.latestProposalIds[msg .sender ] = proposalId;
emitNewPropEvents (newProposal, new address [](0 ), ds.minQuorumVotes (adjustedTotalSupply), txs, description);
return proposalId;
}
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L184
File: NounsDAOV3Proposals.sol
function veto (NounsDAOStorageV3.StorageV3 storage ds , uint256 proposalId ) external {
if (ds.vetoer == address (0 )) {
revert VetoerBurned ();
}
if (msg .sender != ds.vetoer) {
revert VetoerOnly ();
}
if (stateInternal (ds, proposalId) == NounsDAOStorageV3.ProposalState.Executed) {
revert CantVetoExecutedProposal ();
}
NounsDAOStorageV3.Proposal storage proposal = ds._proposals[proposalId];
proposal.vetoed = true ;
INounsDAOExecutor timelock = getProposalTimelock (ds, proposal);
for (uint256 i = 0 ; i < proposal.targets.length ; i++ ) {
timelock.cancelTransaction (
proposal.targets[i],
proposal.values[i],
proposal.signatures[i],
proposal.calldatas[i],
proposal.eta
);
}
emit ProposalVetoed (proposalId);
}
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L563
File: NounsDAOV3Proposals.sol
function cancel (NounsDAOStorageV3.StorageV3 storage ds , uint256 proposalId ) external {
NounsDAOStorageV3.ProposalState proposalState = stateInternal (ds, proposalId);
if (
proposalState == NounsDAOStorageV3.ProposalState.Canceled ||
proposalState == NounsDAOStorageV3.ProposalState.Defeated ||
proposalState == NounsDAOStorageV3.ProposalState.Expired ||
proposalState == NounsDAOStorageV3.ProposalState.Executed ||
proposalState == NounsDAOStorageV3.ProposalState.Vetoed
) {
revert CantCancelProposalAtFinalState ();
}
NounsDAOStorageV3.Proposal storage proposal = ds._proposals[proposalId];
address proposer = proposal.proposer;
NounsTokenLike nouns = ds.nouns;
uint256 votes = nouns.getPriorVotes (proposer, block .number - 1 );
bool msgSenderIsProposer = proposer == msg .sender ;
address [] memory signers = proposal.signers;
for (uint256 i = 0 ; i < signers.length ; ++ i) {
msgSenderIsProposer = msgSenderIsProposer || msg .sender == signers[i];
votes += nouns.getPriorVotes (signers[i], block .number - 1 );
}
require (
msgSenderIsProposer || votes <= proposal.proposalThreshold,
'NounsDAO::cancel: proposer above threshold '
);
proposal.canceled = true ;
INounsDAOExecutor timelock = getProposalTimelock (ds, proposal);
for (uint256 i = 0 ; i < proposal.targets.length ; i++ ) {
timelock.cancelTransaction (
proposal.targets[i],
proposal.values[i],
proposal.signatures[i],
proposal.calldatas[i],
proposal.eta
);
}
emit ProposalCanceled (proposalId);
}
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L612
File: NounsDAOV3Fork.sol
function withdrawDAONounsFromEscrow (
NounsDAOStorageV3.StorageV3 storage ds ,
uint256 [] calldata tokenIds ,
address to
) private {
if (msg .sender != ds.admin) {
revert AdminOnly ();
}
ds.forkEscrow.withdrawTokens (tokenIds, to);
emit DAOWithdrawNounsFromEscrow (tokenIds, to);
}
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/NounsDAOV3Fork.sol#L202
File: NounsAuctionHouseFork.sol
function createBid (uint256 nounId ) external payable override nonReentrant {
INounsAuctionHouse.Auction memory _auction = auction;
require (_auction.nounId == nounId, 'Noun not up for auction ' );
require (block .timestamp < _auction.endTime, 'Auction expired ' );
require (msg .value >= reservePrice, 'Must send at least reservePrice ' );
require (
msg .value >= _auction.amount + ((_auction.amount * minBidIncrementPercentage) / 100 ),
'Must send more than last bid by minBidIncrementPercentage amount '
);
address payable lastBidder = _auction.bidder;
if (lastBidder != address (0 )) {
_safeTransferETHWithFallback (lastBidder, _auction.amount);
}
auction.amount = msg .value ;
auction.bidder = payable (msg .sender );
bool extended = _auction.endTime - block .timestamp < timeBuffer;
if (extended) {
auction.endTime = _auction.endTime = block .timestamp + timeBuffer;
}
emit AuctionBid (_auction.nounId, msg .sender , msg .value , extended);
if (extended) {
emit AuctionExtended (_auction.nounId, _auction.endTime);
}
}
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/NounsAuctionHouseFork.sol#L149
File: NounsDAOLogicV1Fork.sol
function cancel (uint256 proposalId ) external {
require (state (proposalId) != ProposalState.Executed, 'NounsDAO::cancel: cannot cancel executed proposal ' );
Proposal storage proposal = _proposals[proposalId];
require (
msg .sender == proposal.proposer ||
nouns.getPriorVotes (proposal.proposer, block .number - 1 ) <= proposal.proposalThreshold,
'NounsDAO::cancel: proposer above threshold '
);
proposal.canceled = true ;
for (uint256 i = 0 ; i < proposal.targets.length ; i++ ) {
timelock.cancelTransaction (
proposal.targets[i],
proposal.values[i],
proposal.signatures[i],
proposal.calldatas[i],
proposal.eta
);
}
emit ProposalCanceled (proposalId);
}
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L472
File: NounsDAOLogicV1Fork.sol
function _setVotingDelay (uint256 newVotingDelay ) external {
require (msg .sender == admin, 'NounsDAO::_setVotingDelay: admin only ' );
require (
newVotingDelay >= MIN_VOTING_DELAY && newVotingDelay <= MAX_VOTING_DELAY,
'NounsDAO::_setVotingDelay: invalid voting delay '
);
uint256 oldVotingDelay = votingDelay;
votingDelay = newVotingDelay;
emit VotingDelaySet (oldVotingDelay, newVotingDelay);
}
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L654
File: NounsDAOLogicV1Fork.sol
function _setVotingPeriod (uint256 newVotingPeriod ) external {
require (msg .sender == admin, 'NounsDAO::_setVotingPeriod: admin only ' );
require (
newVotingPeriod >= MIN_VOTING_PERIOD && newVotingPeriod <= MAX_VOTING_PERIOD,
'NounsDAO::_setVotingPeriod: invalid voting period '
);
uint256 oldVotingPeriod = votingPeriod;
votingPeriod = newVotingPeriod;
emit VotingPeriodSet (oldVotingPeriod, newVotingPeriod);
}
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L670
File: NounsDAOLogicV1Fork.sol
function _setProposalThresholdBPS (uint256 newProposalThresholdBPS ) external {
require (msg .sender == admin, 'NounsDAO::_setProposalThresholdBPS: admin only ' );
require (
newProposalThresholdBPS >= MIN_PROPOSAL_THRESHOLD_BPS &&
newProposalThresholdBPS <= MAX_PROPOSAL_THRESHOLD_BPS,
'NounsDAO::_setProposalThreshold: invalid proposal threshold '
);
uint256 oldProposalThresholdBPS = proposalThresholdBPS;
proposalThresholdBPS = newProposalThresholdBPS;
emit ProposalThresholdBPSSet (oldProposalThresholdBPS, newProposalThresholdBPS);
}
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L688
File: NounsDAOLogicV1Fork.sol
function _setQuorumVotesBPS (uint256 newQuorumVotesBPS ) external {
require (msg .sender == admin, 'NounsDAO::_setQuorumVotesBPS: admin only ' );
require (
newQuorumVotesBPS >= MIN_QUORUM_VOTES_BPS && newQuorumVotesBPS <= MAX_QUORUM_VOTES_BPS,
'NounsDAO::_setQuorumVotesBPS: invalid quorum votes basis points '
);
uint256 oldQuorumVotesBPS = quorumVotesBPS;
quorumVotesBPS = newQuorumVotesBPS;
emit QuorumVotesBPSSet (oldQuorumVotesBPS, newQuorumVotesBPS);
}
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L705
File: NounsDAOLogicV1Fork.sol
function _setPendingAdmin (address newPendingAdmin ) external {
require (msg .sender == admin, 'NounsDAO::_setPendingAdmin: admin only ' );
address oldPendingAdmin = pendingAdmin;
pendingAdmin = newPendingAdmin;
emit NewPendingAdmin (oldPendingAdmin, newPendingAdmin);
}
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L724
File: NounsDAOLogicV1Fork.sol
function _acceptAdmin () external {
require (msg .sender == pendingAdmin && msg .sender != address (0 ), 'NounsDAO::_acceptAdmin: pending admin only ' );
address oldAdmin = admin;
address oldPendingAdmin = pendingAdmin;
admin = pendingAdmin;
pendingAdmin = address (0 );
emit NewAdmin (oldAdmin, admin);
emit NewPendingAdmin (oldPendingAdmin, pendingAdmin);
}
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L745-L746
File: NounsDAOLogicV1Fork.sol
function _setErc20TokensToIncludeInQuit (address [] calldata erc20tokens ) external {
if (msg .sender != admin) revert AdminOnly ();
checkForDuplicates (erc20tokens);
emit ERC20TokensToIncludeInQuitSet (erc20TokensToIncludeInQuit, erc20tokens);
erc20TokensToIncludeInQuit = erc20tokens;
}
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L756
Recommended Mitigation Steps
Add msg.sender
parameter in event-emit
Index event fields make the field more quickly accessible to off-chain tools that parse events. However, note that each index field costs extra gas during emission, so it's not necessarily best to index the maximum allowed per event (three fields).
Each event should use three indexed fields if there are three or more fields, and gas usage is not particularly of concern for the events in question. If there are fewer than three fields, all of the fields should be indexed.
File: NounsDAOInterfaces.sol
event ProposalCreated (
uint256 id ,
address proposer ,
address [] targets ,
uint256 [] values ,
string [] signatures ,
bytes [] calldatas ,
uint256 startBlock ,
uint256 endBlock ,
string description
);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOInterfaces.sol#L39
File: NounsDAOInterfaces.sol
event ProposalCreatedWithRequirements (
uint256 id ,
address proposer ,
address [] targets ,
uint256 [] values ,
string [] signatures ,
bytes [] calldatas ,
uint256 startBlock ,
uint256 endBlock ,
uint256 proposalThreshold ,
uint256 quorumVotes ,
string description
);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOInterfaces.sol#L52
File: NounsDAOInterfaces.sol
event ProposalQueued (uint256 id , uint256 eta );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOInterfaces.sol#L78
File: NounsDAOInterfaces.sol
event VotingDelaySet (uint256 oldVotingDelay , uint256 newVotingDelay );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOInterfaces.sol#L87
File: NounsDAOInterfaces.sol
event VotingPeriodSet (uint256 oldVotingPeriod , uint256 newVotingPeriod );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOInterfaces.sol#L90
File: NounsDAOInterfaces.sol
event NewImplementation (address oldImplementation , address newImplementation );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOInterfaces.sol#L93
File: NounsDAOInterfaces.sol
event ProposalThresholdBPSSet (uint256 oldProposalThresholdBPS , uint256 newProposalThresholdBPS );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOInterfaces.sol#L96
File: NounsDAOInterfaces.sol
event QuorumVotesBPSSet (uint256 oldQuorumVotesBPS , uint256 newQuorumVotesBPS );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOInterfaces.sol#L99
File: NounsDAOInterfaces.sol
event NewPendingAdmin (address oldPendingAdmin , address newPendingAdmin );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOInterfaces.sol#L102
File: NounsDAOInterfaces.sol
event NewAdmin (address oldAdmin , address newAdmin );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOInterfaces.sol#L105
File: NounsDAOInterfaces.sol
event NewVetoer (address oldVetoer , address newVetoer );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOInterfaces.sol#L108
File: NounsDAOInterfaces.sol
event MinQuorumVotesBPSSet (uint16 oldMinQuorumVotesBPS , uint16 newMinQuorumVotesBPS );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOInterfaces.sol#L113
File: NounsDAOInterfaces.sol
event MaxQuorumVotesBPSSet (uint16 oldMaxQuorumVotesBPS , uint16 newMaxQuorumVotesBPS );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOInterfaces.sol#L116
File: NounsDAOInterfaces.sol
event QuorumCoefficientSet (uint32 oldQuorumCoefficient , uint32 newQuorumCoefficient );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOInterfaces.sol#L119
File: NounsDAOInterfaces.sol
event Withdraw (uint256 amount , bool sent );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOInterfaces.sol#L125
File: NounsDAOInterfaces.sol
event NewPendingVetoer (address oldPendingVetoer , address newPendingVetoer );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOInterfaces.sol#L128
File: NounsDAOInterfaces.sol
event ObjectionPeriodDurationSet (
uint32 oldObjectionPeriodDurationInBlocks ,
uint32 newObjectionPeriodDurationInBlocks
);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOInterfaces.sol#L191
File: NounsDAOInterfaces.sol
event LastMinuteWindowSet (uint32 oldLastMinuteWindowInBlocks , uint32 newLastMinuteWindowInBlocks );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOInterfaces.sol#L197
File: NounsDAOInterfaces.sol
event ProposalUpdatablePeriodSet (
uint32 oldProposalUpdatablePeriodInBlocks ,
uint32 newProposalUpdatablePeriodInBlocks
);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOInterfaces.sol#L200
File: NounsDAOInterfaces.sol
event VoteSnapshotBlockSwitchProposalIdSet (
uint256 oldVoteSnapshotBlockSwitchProposalId ,
uint256 newVoteSnapshotBlockSwitchProposalId
);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOInterfaces.sol#L206
File: NounsDAOInterfaces.sol
event ERC20TokensToIncludeInForkSet (address [] oldErc20Tokens , address [] newErc20tokens );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOInterfaces.sol#L212
File: NounsDAOInterfaces.sol
event ForkDAODeployerSet (address oldForkDAODeployer , address newForkDAODeployer );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOInterfaces.sol#L215
File: NounsDAOInterfaces.sol
event ForkPeriodSet (uint256 oldForkPeriod , uint256 newForkPeriod );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOInterfaces.sol#L218
File: NounsDAOInterfaces.sol
event ForkThresholdSet (uint256 oldForkThreshold , uint256 newForkThreshold );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOInterfaces.sol#L221
File: NounsDAOInterfaces.sol
event TimelocksAndAdminSet (address timelock , address timelockV1 , address admin );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOInterfaces.sol#L224
File: NounsDAOInterfaces.sol
event DAOWithdrawNounsFromEscrow (uint256 [] tokenIds , address to );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOInterfaces.sol#L257
File: NounsDAOInterfaces.sol
event DAONounsSupplyIncreasedFromEscrow (uint256 numTokens , address to );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOInterfaces.sol#L260
File: NounsDAOV3Admin.sol
event ProposalThresholdBPSSet (uint256 oldProposalThresholdBPS , uint256 newProposalThresholdBPS );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L40
File: NounsDAOV3Admin.sol
event VotingDelaySet (uint256 oldVotingDelay , uint256 newVotingDelay );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L43
File: NounsDAOV3Admin.sol
event VotingPeriodSet (uint256 oldVotingPeriod , uint256 newVotingPeriod );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L46
File: NounsDAOV3Admin.sol
event ObjectionPeriodDurationSet (
uint32 oldObjectionPeriodDurationInBlocks ,
uint32 newObjectionPeriodDurationInBlocks
);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L49
File: NounsDAOV3Admin.sol
event LastMinuteWindowSet (uint32 oldLastMinuteWindowInBlocks , uint32 newLastMinuteWindowInBlocks );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L55
File: NounsDAOV3Admin.sol
event ProposalUpdatablePeriodSet (
uint32 oldProposalUpdatablePeriodInBlocks ,
uint32 newProposalUpdatablePeriodInBlocks
);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L58
File: NounsDAOV3Admin.sol
event NewPendingAdmin (address oldPendingAdmin , address newPendingAdmin );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L64
File: NounsDAOV3Admin.sol
event NewAdmin (address oldAdmin , address newAdmin );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L67
File: NounsDAOV3Admin.sol
event NewPendingVetoer (address oldPendingVetoer , address newPendingVetoer );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L70
File: NounsDAOV3Admin.sol
event NewVetoer (address oldVetoer , address newVetoer );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L73
File: NounsDAOV3Admin.sol
event MinQuorumVotesBPSSet (uint16 oldMinQuorumVotesBPS , uint16 newMinQuorumVotesBPS );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L76
File: NounsDAOV3Admin.sol
event MaxQuorumVotesBPSSet (uint16 oldMaxQuorumVotesBPS , uint16 newMaxQuorumVotesBPS );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L79
File: NounsDAOV3Admin.sol
event QuorumCoefficientSet (uint32 oldQuorumCoefficient , uint32 newQuorumCoefficient );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L82
File: NounsDAOV3Admin.sol
event Withdraw (uint256 amount , bool sent );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L85
File: NounsDAOV3Admin.sol
event VoteSnapshotBlockSwitchProposalIdSet (
uint256 oldVoteSnapshotBlockSwitchProposalId ,
uint256 newVoteSnapshotBlockSwitchProposalId
);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L88
File: NounsDAOV3Admin.sol
event ForkDAODeployerSet (address oldForkDAODeployer , address newForkDAODeployer );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L94
File: NounsDAOV3Admin.sol
event ERC20TokensToIncludeInForkSet (address [] oldErc20Tokens , address [] newErc20tokens );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L97
File: NounsDAOV3Admin.sol
event ForkEscrowSet (address oldForkEscrow , address newForkEscrow );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L100
File: NounsDAOV3Admin.sol
event ForkPeriodSet (uint256 oldForkPeriod , uint256 newForkPeriod );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L103
File: NounsDAOV3Admin.sol
event ForkThresholdSet (uint256 oldForkThreshold , uint256 newForkThreshold );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L106
File: NounsDAOV3Admin.sol
event TimelocksAndAdminSet (address timelock , address timelockV1 , address admin );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L109
File: NounsDAOV3Proposals.sol
event ProposalCreated (
uint256 id ,
address proposer ,
address [] targets ,
uint256 [] values ,
string [] signatures ,
bytes [] calldatas ,
uint256 startBlock ,
uint256 endBlock ,
string description
);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L54
File: NounsDAOV3Proposals.sol
event ProposalCreatedWithRequirements (
uint256 id ,
address proposer ,
address [] signers ,
address [] targets ,
uint256 [] values ,
string [] signatures ,
bytes [] calldatas ,
uint256 startBlock ,
uint256 endBlock ,
uint256 updatePeriodEndBlock ,
uint256 proposalThreshold ,
uint256 quorumVotes ,
string description
);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L68
File: NounsDAOV3Proposals.sol
event ProposalQueued (uint256 id , uint256 eta );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L119
File: ForkDAODeployer.sol
event DAODeployed (address token , address auction , address governor , address treasury );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/ForkDAODeployer.sol#L32
File: NounsDAOV3Fork.sol
event DAOWithdrawNounsFromEscrow (uint256 [] tokenIds , address to );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/NounsDAOV3Fork.sol#L62
File: NounsDAOV3Fork.sol
event DAONounsSupplyIncreasedFromEscrow (uint256 numTokens , address to );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/NounsDAOV3Fork.sol#L65
File: NounsDAOEventsFork.sol
event VotingDelaySet (uint256 oldVotingDelay , uint256 newVotingDelay );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOEventsFork.sol#L52
File: NounsDAOEventsFork.sol
event VotingPeriodSet (uint256 oldVotingPeriod , uint256 newVotingPeriod );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOEventsFork.sol#L55
File: NounsDAOEventsFork.sol
event NewImplementation (address oldImplementation , address newImplementation );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOEventsFork.sol#L58
File: NounsDAOEventsFork.sol
event ProposalThresholdBPSSet (uint256 oldProposalThresholdBPS , uint256 newProposalThresholdBPS );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOEventsFork.sol#L61
File: NounsDAOEventsFork.sol
event QuorumVotesBPSSet (uint256 oldQuorumVotesBPS , uint256 newQuorumVotesBPS );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOEventsFork.sol#L64
File: NounsDAOLogicV1Fork.sol
event ERC20TokensToIncludeInQuitSet (address [] oldErc20Tokens , address [] newErc20tokens );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L112
Various in-scope contract files.
Order of Functions; ordering helps readers identify which functions they can call and to find the constructor and fallback definitions easier. But there are contracts in the project that do not comply with this.
https://docs.soliditylang.org/en/v0.8.17/style-guide.html
Functions should be grouped according to their visibility and ordered:
constructor
receive function (if exists)
fallback function (if exists)
external
public
internal
private
within a grouping, place the view and pure functions last
Various in-scope contract files.
Large code bases, or code with lots of inline-assembly, complicated math, or complicated interactions between multiple contracts, should implement fuzzing tests . Fuzzers such as Echidna require the test writer to come up with invariants which should not be violated under any circumstances, and the fuzzer tests various inputs and function calls to ensure that the invariants always hold. Even code with 100% code coverage can still have bugs due to the order of the operations a user performs, and fuzzers, with properly and extensively-written invariants, can close this testing gap significantly.
Various in-scope contract files.
delete a
assigns the initial value for the type to a
. i.e. for integers it is equivalent to a = 0
, but it can also be used on arrays, where it assigns a dynamic array of length zero or a static array of the same length with all elements reset. For structs, it assigns a struct with all members reset. Similarly, it can also be used to set an address to zero address. It has no effect on whole mappings though (as the keys of mappings may be arbitrary and are generally unknown). However, individual keys and what they map to can be deleted: If a
is a mapping, then delete a[x]
will delete the value stored at x
.
The delete
key better conveys the intention and is also more idiomatic. Consider replacing assignments of zero with delete
statements.
File: NounsDAOLogicV2.sol
244 : newProposal.eta = 0 ;
251 : newProposal.forVotes = 0 ;
252 : newProposal.againstVotes = 0 ;
253 : newProposal.abstainVotes = 0 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L244
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L251
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L252
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L253
File: NounsDAOV3Votes.sol
289 : receipt.support = 0 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Votes.sol#L289
File: NounsDAOForkEscrow.sol
134 : numTokensInEscrow = 0 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/NounsDAOForkEscrow.sol#L134
File: NounsDAOLogicV1Fork.sol
323 : newProposal.eta = 0 ;
330 : newProposal.forVotes = 0 ;
331 : newProposal.againstVotes = 0 ;
332 : newProposal.abstainVotes = 0 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L323
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L330
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L331
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L332
File: ProposeDAOV3UpgradeMainnet.s.sol
84 : values[i] = 0 ;
84 : values[i] = 0 ;
84 : values[i] = 0 ;
84 : values[i] = 0 ;
84 : values[i] = 0 ;
84 : values[i] = 0 ;
84 : values[i] = 0 ;
84 : values[i] = 0 ;
84 : values[i] = 0 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L84
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L84
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L84
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L84
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L84
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L84
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L84
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L84
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L84
File: ProposeDAOV3UpgradeTestnet.s.sol
91 : values[i] = 0 ;
91 : values[i] = 0 ;
91 : values[i] = 0 ;
91 : values[i] = 0 ;
91 : values[i] = 0 ;
91 : values[i] = 0 ;
91 : values[i] = 0 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L91
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L91
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L91
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L91
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L91
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L91
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L91
File: ProposeENSReverseLookupConfigMainnet.s.sol
42 : values[i] = 0 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeENSReverseLookupConfigMainnet.s.sol#L42
File: ProposeTimelockMigrationCleanupMainnet.s.sol
61 : values[i] = 0 ;
61 : values[i] = 0 ;
61 : values[i] = 0 ;
61 : values[i] = 0 ;
61 : values[i] = 0 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeTimelockMigrationCleanupMainnet.s.sol#L61
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeTimelockMigrationCleanupMainnet.s.sol#L61
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeTimelockMigrationCleanupMainnet.s.sol#L61
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeTimelockMigrationCleanupMainnet.s.sol#L61
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeTimelockMigrationCleanupMainnet.s.sol#L61
Immutables should be in uppercase per naming convention.
As shown below, some immutables are named using capital letters and underscores while some are not. For a better code quality, please consider naming these immutables using the same naming convention.
File: NounsDAOForkEscrow.sol
41 : address public immutable dao;
44 : NounsTokenLike public immutable nounsToken;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/NounsDAOForkEscrow.sol#L41
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/NounsDAOForkEscrow.sol#L44
File: DeployDAOV3NewContractsBase.s.sol
20 : uint256 public immutable forkDAOVotingPeriod;
21 : uint256 public immutable forkDAOVotingDelay;
25 : NounsDAOLogicV1 public immutable daoProxy;
26 : INounsDAOExecutor public immutable timelockV1;
27 : bool public immutable deployTimelockV2Harness; // should be true only for testnets
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/DeployDAOV3NewContractsBase.s.sol#L20
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/DeployDAOV3NewContractsBase.s.sol#L21
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/DeployDAOV3NewContractsBase.s.sol#L25
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/DeployDAOV3NewContractsBase.s.sol#L26
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/DeployDAOV3NewContractsBase.s.sol#L27
Consider importing OZ first, then all interfaces, then all utils.
File: NounsDAOV3Proposals.sol
20 : import './NounsDAOInterfaces.sol ' ;
21 : import { NounsDAOV3DynamicQuorum } from './NounsDAOV3DynamicQuorum.sol ' ;
22 : import { NounsDAOV3Fork } from './fork/NounsDAOV3Fork.sol ' ;
23 : import { SignatureChecker } from '@openzeppelin/contracts/utils/cryptography/SignatureChecker.sol ' ;
24 : import { ECDSA } from '@openzeppelin/contracts/utils/cryptography/ECDSA.sol ' ;
25 : import { SafeCast } from '@openzeppelin/contracts/utils/math/SafeCast.sol ' ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L20-L25
File: NounsDAOV3Votes.sol
20 : import './NounsDAOInterfaces.sol ' ;
21 : import { NounsDAOV3Proposals } from './NounsDAOV3Proposals.sol ' ;
22 : import { SafeCast } from '@openzeppelin/contracts/utils/math/SafeCast.sol ' ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Votes.sol#L20-L22
File: NounsDAOForkEscrow.sol
20 : import { NounsTokenLike } from '../NounsDAOInterfaces.sol ' ;
21 : import { IERC721Receiver } from '@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol ' ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/NounsDAOForkEscrow.sol#L20-L21
File: NounsDAOV3Fork.sol
20 : import { NounsDAOStorageV3, INounsDAOForkEscrow, INounsDAOExecutorV2 } from '../NounsDAOInterfaces.sol ' ;
21 : import { IERC20 } from '@openzeppelin/contracts/token/ERC20/IERC20.sol ' ;
22 : import { NounsTokenFork } from './newdao/token/NounsTokenFork.sol ' ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/NounsDAOV3Fork.sol#L20-L22
File: NounsAuctionHouseFork.sol
32 : import { PausableUpgradeable } from '@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol ' ;
33 : import { ReentrancyGuardUpgradeable } from '@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol ' ;
34 : import { OwnableUpgradeable } from '@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol ' ;
35 : import { IERC20 } from '@openzeppelin/contracts/token/ERC20/IERC20.sol ' ;
36 : import { INounsAuctionHouse } from '../../../interfaces/INounsAuctionHouse.sol ' ;
37 : import { INounsToken } from '../../../interfaces/INounsToken.sol ' ;
38 : import { IWETH } from '../../../interfaces/IWETH.sol ' ;
39 : import { UUPSUpgradeable } from '@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol ' ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/NounsAuctionHouseFork.sol#L32-L39
File: NounsDAOLogicV1Fork.sol
97 : import { UUPSUpgradeable } from '@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol ' ;
98 : import { NounsDAOEventsFork } from './NounsDAOEventsFork.sol ' ;
99 : import { NounsDAOStorageV1Fork } from './NounsDAOStorageV1Fork.sol ' ;
100 : import { NounsDAOExecutorV2 } from '../../../NounsDAOExecutorV2.sol ' ;
101 : import { INounsTokenForkLike } from './INounsTokenForkLike.sol ' ;
102 : import { IERC20 } from '@openzeppelin/contracts/token/ERC20/IERC20.sol ' ;
103 : import { ReentrancyGuardUpgradeable } from '@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol ' ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L97-L103
File: INounsTokenFork.sol
20 : import { IERC721Upgradeable } from '@openzeppelin/contracts-upgradeable/token/ERC721/IERC721Upgradeable.sol ' ;
21 : import { INounsDescriptorMinimal } from '../../../../interfaces/INounsDescriptorMinimal.sol ' ;
22 : import { INounsSeeder } from '../../../../interfaces/INounsSeeder.sol ' ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/INounsTokenFork.sol#L20-L22
File: NounsTokenFork.sol
20 : import { OwnableUpgradeable } from '@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol ' ;
21 : import { ERC721CheckpointableUpgradeable } from './base/ERC721CheckpointableUpgradeable.sol ' ;
22 : import { INounsDescriptorMinimal } from '../../../../interfaces/INounsDescriptorMinimal.sol ' ;
23 : import { INounsSeeder } from '../../../../interfaces/INounsSeeder.sol ' ;
24 : import { INounsTokenFork } from './INounsTokenFork.sol ' ;
25 : import { IERC721 } from '@openzeppelin/contracts/token/ERC721/IERC721.sol ' ;
26 : import { UUPSUpgradeable } from '@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol ' ;
27 : import { INounsDAOForkEscrow } from '../../../NounsDAOInterfaces.sol ' ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/NounsTokenFork.sol#L20-L27
File: DeployDAOV3NewContractsBase.s.sol
4 : import 'forge-std/Script.sol ' ;
5 : import { NounsDAOExecutorV2 } from '../contracts/governance/NounsDAOExecutorV2.sol ' ;
6 : import { NounsDAOExecutorV2Test } from '../contracts/test/NounsDAOExecutorHarness.sol ' ;
7 : import { NounsDAOLogicV1 } from '../contracts/governance/NounsDAOLogicV1.sol ' ;
8 : import { NounsDAOLogicV3 } from '../contracts/governance/NounsDAOLogicV3.sol ' ;
9 : import { NounsDAOExecutorProxy } from '../contracts/governance/NounsDAOExecutorProxy.sol ' ;
10 : import { INounsDAOExecutor } from '../contracts/governance/NounsDAOInterfaces.sol ' ;
11 : import { NounsDAOForkEscrow } from '../contracts/governance/fork/NounsDAOForkEscrow.sol ' ;
12 : import { NounsTokenFork } from '../contracts/governance/fork/newdao/token/NounsTokenFork.sol ' ;
13 : import { NounsAuctionHouseFork } from '../contracts/governance/fork/newdao/NounsAuctionHouseFork.sol ' ;
14 : import { NounsDAOLogicV1Fork } from '../contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol ' ;
15 : import { ForkDAODeployer } from '../contracts/governance/fork/ForkDAODeployer.sol ' ;
16 : import { ERC20Transferer } from '../contracts/utils/ERC20Transferer.sol ' ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/DeployDAOV3NewContractsBase.s.sol#L4-L16
There is no need to initialize uint
variables to zero as their default value is 0
File: NounsDAOLogicV2.sol
1007 : uint256 lower = 0 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L1007
File: NounsDAOV3DynamicQuorum.sol
107 : uint256 lower = 0 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3DynamicQuorum.sol#L107
File: NounsDAOV3Proposals.sol
825 : uint256 numSigners = 0 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L825
File: NounsTokenFork.sol
168 : uint256 maxNounId = 0 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/NounsTokenFork.sol#L168
File: ERC721CheckpointableUpgradeable .sol
193 : uint32 lower = 0 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/base/ERC721CheckpointableUpgradeable.sol#L193
File: ProposeDAOV3UpgradeMainnet.s.sol
75 : uint256 i = 0 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L75
File: ProposeDAOV3UpgradeTestnet.s.sol
82 : uint256 i = 0 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L82
File: ProposeENSReverseLookupConfigMainnet.s.sol
40 : uint256 i = 0 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeENSReverseLookupConfigMainnet.s.sol#L40
File: ProposeTimelockMigrationCleanupMainnet.s.sol
59 : uint256 i = 0 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeTimelockMigrationCleanupMainnet.s.sol#L59
A check regarding whether the current value and the new value are the same should be added
File: NounsDAOExecutor.sol
80 : function setDelay (uint256 delay_ ) public {
require (msg .sender == address (this ), 'NounsDAOExecutor::setDelay: Call must come from NounsDAOExecutor. ' );
require (delay_ >= MINIMUM_DELAY, 'NounsDAOExecutor::setDelay: Delay must exceed minimum delay. ' );
require (delay_ <= MAXIMUM_DELAY, 'NounsDAOExecutor::setDelay: Delay must not exceed maximum delay. ' );
delay = delay_;
emit NewDelay (delay);
}
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutor.sol#L80
File: NounsDAOExecutor.sol
97 : function setPendingAdmin (address pendingAdmin_ ) public {
require (
msg .sender == address (this ),
'NounsDAOExecutor::setPendingAdmin: Call must come from NounsDAOExecutor. '
);
pendingAdmin = pendingAdmin_;
emit NewPendingAdmin (pendingAdmin);
}
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutor.sol#L97
File: NounsDAOExecutorV2.sol
103 : function setDelay (uint256 delay_ ) public {
require (msg .sender == address (this ), 'NounsDAOExecutor::setDelay: Call must come from NounsDAOExecutor. ' );
require (delay_ >= MINIMUM_DELAY, 'NounsDAOExecutor::setDelay: Delay must exceed minimum delay. ' );
require (delay_ <= MAXIMUM_DELAY, 'NounsDAOExecutor::setDelay: Delay must not exceed maximum delay. ' );
delay = delay_;
emit NewDelay (delay_);
}
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutorV2.sol#L103
File: NounsDAOExecutorV2.sol
120 : function setPendingAdmin (address pendingAdmin_ ) public {
require (
msg .sender == address (this ),
'NounsDAOExecutor::setPendingAdmin: Call must come from NounsDAOExecutor. '
);
pendingAdmin = pendingAdmin_;
emit NewPendingAdmin (pendingAdmin_);
}
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutorV2.sol#L120
File: NounsAuctionHouseFork.sol
102 : function settleCurrentAndCreateNewAuction () external override nonReentrant whenNotPaused {
_settleAuction ();
_createAuction ();
}
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/NounsAuctionHouseFork.sol#L102
File: NounsAuctionHouseFork.sol
111 : function settleAuction () external override whenPaused nonReentrant {
_settleAuction ();
}
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/NounsAuctionHouseFork.sol#L111
File: NounsAuctionHouseFork.sol
180 : function setTimeBuffer (uint256 _timeBuffer ) external override onlyOwner {
timeBuffer = _timeBuffer;
emit AuctionTimeBufferUpdated (_timeBuffer);
}
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/NounsAuctionHouseFork.sol#L180
File: NounsAuctionHouseFork.sol
190 : function setReservePrice (uint256 _reservePrice ) external override onlyOwner {
reservePrice = _reservePrice;
emit AuctionReservePriceUpdated (_reservePrice);
}
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/NounsAuctionHouseFork.sol#L190
File: NounsAuctionHouseFork.sol
200 : function setMinBidIncrementPercentage (uint8 _minBidIncrementPercentage ) external override onlyOwner {
minBidIncrementPercentage = _minBidIncrementPercentage;
emit AuctionMinBidIncrementPercentageUpdated (_minBidIncrementPercentage);
}
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/NounsAuctionHouseFork.sol#L200
File: NounsTokenFork.sol
198 : function setContractURIHash (string memory newContractURIHash ) external onlyOwner {
_contractURIHash = newContractURIHash;
}
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/NounsTokenFork.sol#L198
File: NounsTokenFork.sol
240 : function setMinter (address _minter ) external override onlyOwner whenMinterNotLocked {
minter = _minter;
emit MinterUpdated (_minter);
}
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/NounsTokenFork.sol#L240
File: NounsTokenFork.sol
260 : function setDescriptor (INounsDescriptorMinimal _descriptor ) external override onlyOwner whenDescriptorNotLocked {
descriptor = _descriptor;
emit DescriptorUpdated (_descriptor);
}
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/NounsTokenFork.sol#L260
File: NounsTokenFork.sol
280 : function setSeeder (INounsSeeder _seeder ) external override onlyOwner whenSeederNotLocked {
seeder = _seeder;
emit SeederUpdated (_seeder);
}
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/NounsTokenFork.sol#L280
File: NounsDAOInterfaces.sol
576 : interface NounsTokenLike {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOInterfaces.sol#L576
Usually lines in source code are limited to 80 characters. Today's screens are much larger so it's reasonable to stretch this in some cases. Since the files will most likely reside in GitHub, and GitHub starts using a scroll bar in all cases when the length is over 164 characters, the lines below should be split when they reach that length
Reference: https://docs.soliditylang.org/en/v0.8.10/style-guide.html#maximum-line-length
File: NounsDAOExecutor.sol
20 : // https://github.com/compound-finance/compound-protocol/blob/20abad28055a2f91df48a90f8bb6009279a4cb35/contracts/Timelock.sol
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutor.sol#L20
File: NounsDAOExecutor.sol
22 : // Timelock.sol source code Copyright 2020 Compound Labs, Inc. licensed under the BSD-3-Clause license.
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutor.sol#L22
File: NounsDAOExecutor.sol
25 : // Additional conditions of BSD-3-Clause can be found here: https://opensource.org/licenses/BSD-3-Clause
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutor.sol#L25
File: NounsDAOExecutor.sol
28 : // NounsDAOExecutor.sol modifies Timelock to use Solidity 0.8.x receive(), fallback(), and built-in over/underflow protection
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutor.sol#L28
File: NounsDAOExecutor.sol
29 : // This contract acts as executor of Nouns DAO governance and its treasury, so it has been modified to accept ETH.
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutor.sol#L29
File: NounsDAOExecutorV2.sol
20 : // https://github.com/compound-finance/compound-protocol/blob/20abad28055a2f91df48a90f8bb6009279a4cb35/contracts/Timelock.sol
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutorV2.sol#L20
File: NounsDAOExecutorV2.sol
22 : // Timelock.sol source code Copyright 2020 Compound Labs, Inc. licensed under the BSD-3-Clause license.
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutorV2.sol#L22
File: NounsDAOExecutorV2.sol
25 : // Additional conditions of BSD-3-Clause can be found here: https://opensource.org/licenses/BSD-3-Clause
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutorV2.sol#L25
File: NounsDAOExecutorV2.sol
31 : // NounsDAOExecutor.sol modifies Timelock to use Solidity 0.8.x receive(), fallback(), and built-in over/underflow protection
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutorV2.sol#L31
File: NounsDAOExecutorV2.sol
32 : // This contract acts as executor of Nouns DAO governance and its treasury, so it has been modified to accept ETH.
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutorV2.sol#L32
File: NounsDAOExecutorV2.sol
38 : // - `GRACE_PERIOD` has been increased from 14 days to 21 days to allow more time in case of a forking period
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutorV2.sol#L38
File: NounsDAOExecutorV2.sol
84 : /// @dev increased grace period from 14 days to 21 days to allow more time in case of a forking period
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutorV2.sol#L84
File: NounsDAOInterfaces.sol
20 : // https://github.com/compound-finance/compound-protocol/blob/b9b14038612d846b83f8a009a82c38974ff2dcfe/contracts/Governance/GovernorBravoInterfaces.sol
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOInterfaces.sol#L20
File: NounsDAOInterfaces.sol
22 : // GovernorBravoInterfaces.sol source code Copyright 2020 Compound Labs, Inc. licensed under the BSD-3-Clause license.
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOInterfaces.sol#L22
File: NounsDAOInterfaces.sol
25 : // Additional conditions of BSD-3-Clause can be found here: https://opensource.org/licenses/BSD-3-Clause
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOInterfaces.sol#L25
File: NounsDAOInterfaces.sol
28 : // NounsDAOEvents, NounsDAOProxyStorage, NounsDAOStorageV1 add support for changes made by Nouns DAO to GovernorBravo.sol
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOInterfaces.sol#L28
File: NounsDAOInterfaces.sol
290 : /// @notice The basis point number of votes required in order for a voter to become a proposer. *DIFFERS from GovernerBravo
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOInterfaces.sol#L290
File: NounsDAOInterfaces.sol
390 : /// @notice The basis point number of votes required in order for a voter to become a proposer. *DIFFERS from GovernerBravo
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOInterfaces.sol#L390
File: NounsDAOInterfaces.sol
668 : /// @notice The basis point number of votes required in order for a voter to become a proposer. *DIFFERS from GovernerBravo
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOInterfaces.sol#L668
File: NounsDAOInterfaces.sol
293 : /// @notice The basis point number of votes in support of a proposal required in order for a quorum to be reached and for a vote to succeed. *DIFFERS from GovernerBravo
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOInterfaces.sol#L293
File: NounsDAOInterfaces.sol
393 : /// @notice The basis point number of votes in support of a proposal required in order for a quorum to be reached and for a vote to succeed. *DIFFERS from GovernerBravo
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOInterfaces.sol#L393
File: NounsDAOInterfaces.sol
670 : /// @notice The basis point number of votes in support of a proposal required in order for a quorum to be reached and for a vote to succeed. *DIFFERS from GovernerBravo
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOInterfaces.sol#L670
File: NounsDAOInterfaces.sol
316 : /// @notice The number of votes needed to create a proposal at the time of proposal creation. *DIFFERS from GovernerBravo
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOInterfaces.sol#L316
File: NounsDAOInterfaces.sol
416 : /// @notice The number of votes needed to create a proposal at the time of proposal creation. *DIFFERS from GovernerBravo
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOInterfaces.sol#L416
File: NounsDAOInterfaces.sol
513 : /// @notice The number of votes needed to create a proposal at the time of proposal creation. *DIFFERS from GovernerBravo
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOInterfaces.sol#L513
File: NounsDAOInterfaces.sol
724 : /// @notice The number of votes needed to create a proposal at the time of proposal creation. *DIFFERS from GovernerBravo
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOInterfaces.sol#L724
File: NounsDAOInterfaces.sol
796 : /// @notice The number of votes needed to create a proposal at the time of proposal creation. *DIFFERS from GovernerBravo
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOInterfaces.sol#L796
File: NounsDAOInterfaces.sol
318 : /// @notice The number of votes in support of a proposal required in order for a quorum to be reached and for a vote to succeed at the time of proposal creation. *DIFFERS from GovernerBravo
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOInterfaces.sol#L318
File: NounsDAOInterfaces.sol
418 : /// @notice The number of votes in support of a proposal required in order for a quorum to be reached and for a vote to succeed at the time of proposal creation. *DIFFERS from GovernerBravo
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOInterfaces.sol#L418
File: NounsDAOInterfaces.sol
726 : /// @notice The number of votes in support of a proposal required in order for a quorum to be reached and for a vote to succeed at the time of proposal creation. *DIFFERS from GovernerBravo
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOInterfaces.sol#L726
File: NounsDAOInterfaces.sol
320 : /// @notice The timestamp that the proposal will be available for execution, set once the vote succeeds
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOInterfaces.sol#L320
File: NounsDAOInterfaces.sol
420 : /// @notice The timestamp that the proposal will be available for execution, set once the vote succeeds
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOInterfaces.sol#L420
File: NounsDAOInterfaces.sol
517 : /// @notice The timestamp that the proposal will be available for execution, set once the vote succeeds
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOInterfaces.sol#L517
File: NounsDAOInterfaces.sol
728 : /// @notice The timestamp that the proposal will be available for execution, set once the vote succeeds
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOInterfaces.sol#L728
File: NounsDAOInterfaces.sol
800 : /// @notice The timestamp that the proposal will be available for execution, set once the vote succeeds
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOInterfaces.sol#L800
File: NounsDAOInterfaces.sol
491 : /// @notice The minimum basis point number of votes in support of a proposal required in order for a quorum to be reached and for a vote to succeed.
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOInterfaces.sol#L491
File: NounsDAOInterfaces.sol
833 : /// @notice The minimum basis point number of votes in support of a proposal required in order for a quorum to be reached and for a vote to succeed.
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOInterfaces.sol#L833
File: NounsDAOInterfaces.sol
493 : /// @notice The maximum basis point number of votes in support of a proposal required in order for a quorum to be reached and for a vote to succeed.
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOInterfaces.sol#L493
File: NounsDAOInterfaces.sol
835 : /// @notice The maximum basis point number of votes in support of a proposal required in order for a quorum to be reached and for a vote to succeed.
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOInterfaces.sol#L835
File: NounsDAOInterfaces.sol
496 : /// @dev Assumed to be fixed point integer with 6 decimals, i.e 0.2 is represented as 0.2 * 1e6 = 200000
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOInterfaces.sol#L496
File: NounsDAOInterfaces.sol
838 : /// @dev Assumed to be fixed point integer with 6 decimals, i.e 0.2 is represented as 0.2 * 1e6 = 200000
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOInterfaces.sol#L838
File: NounsDAOInterfaces.sol
515 : /// @notice The minimum number of votes in support of a proposal required in order for a quorum to be reached and for a vote to succeed at the time of proposal creation. *DIFFERS from GovernerBravo
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOInterfaces.sol#L515
File: NounsDAOInterfaces.sol
798 : /// @notice The minimum number of votes in support of a proposal required in order for a quorum to be reached and for a vote to succeed at the time of proposal creation. *DIFFERS from GovernerBravo
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOInterfaces.sol#L798
File: NounsDAOInterfaces.sol
687 : /// @notice user => sig => isCancelled: signatures that have been cancelled by the signer and are no longer valid
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOInterfaces.sol#L687
File: NounsDAOInterfaces.sol
689 : /// @notice The number of blocks before voting ends during which the objection period can be initiated
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOInterfaces.sol#L689
File: NounsDAOInterfaces.sol
713 : /// @notice The proposal at which to start using `startBlock` instead of `creationBlock` for vote snapshots
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOInterfaces.sol#L713
File: NounsDAOInterfaces.sol
714 : /// @dev Make sure this stays the last variable in this struct, so we can delete it in the next version
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOInterfaces.sol#L714
File: NounsDAOInterfaces.sol
762 : /// @notice Starts at 0 and is set to the block at which the objection period ends when the objection period is initiated
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOInterfaces.sol#L762
File: NounsDAOInterfaces.sol
826 : /// @notice Starts at 0 and is set to the block at which the objection period ends when the objection period is initiated
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOInterfaces.sol#L826
File: NounsDAOLogicV2.sol
20 : // https://github.com/compound-finance/compound-protocol/blob/b9b14038612d846b83f8a009a82c38974ff2dcfe/contracts/Governance/GovernorBravoDelegate.sol
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L20
File: NounsDAOLogicV2.sol
22 : // GovernorBravoDelegate.sol source code Copyright 2020 Compound Labs, Inc. licensed under the BSD-3-Clause license.
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L22
File: NounsDAOLogicV2.sol
25 : // Additional conditions of BSD-3-Clause can be found here: https://opensource.org/licenses/BSD-3-Clause
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L25
File: NounsDAOLogicV2.sol
97 : /// @notice The vote refund gas overhead, including 7K for ETH transfer and 29K for general transaction overhead
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L97
File: NounsDAOLogicV2.sol
622 : /// @notice: Unlike GovernerBravo, votes are considered from the block the proposal was created in order to normalize quorumVotes and proposalThreshold metrics
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L622
File: NounsDAOLogicV3.sol
20 : // https://github.com/compound-finance/compound-protocol/blob/b9b14038612d846b83f8a009a82c38974ff2dcfe/contracts/Governance/GovernorBravoDelegate.sol
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV3.sol#L20
File: NounsDAOLogicV3.sol
22 : // GovernorBravoDelegate.sol source code Copyright 2020 Compound Labs, Inc. licensed under the BSD-3-Clause license.
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV3.sol#L22
File: NounsDAOLogicV3.sol
25 : // Additional conditions of BSD-3-Clause can be found here: https://opensource.org/licenses/BSD-3-Clause
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV3.sol#L25
File: NounsDAOLogicV3.sol
33 : // - Proposal editing: allowing proposers to update their proposal’s transactions and text description,
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV3.sol#L33
File: NounsDAOLogicV3.sol
34 : // during the Updatable period only, which is the state upon proposal creation. Editing also works with signatures,
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV3.sol#L34
File: NounsDAOLogicV3.sol
36 : // - Propose by signature: allowing Nouners and delegates to pool their voting power towards submitting a proposal,
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV3.sol#L36
File: NounsDAOLogicV3.sol
37 : // by submitting their signature, instead of the current approach where sponsors must delegate their votes to help
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV3.sol#L37
File: NounsDAOLogicV3.sol
39 : // - Objection-only Period: a conditional voting period that gets activated upon a last-minute proposal swing
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV3.sol#L39
File: NounsDAOLogicV3.sol
42 : // - Votes snapshot after voting delay: moving votes snapshot up, to provide Nouners with reaction time per proposal,
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV3.sol#L42
File: NounsDAOProxy.sol
20 : // https://github.com/compound-finance/compound-protocol/blob/b9b14038612d846b83f8a009a82c38974ff2dcfe/contracts/Governance/GovernorBravoDelegator.sol
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOProxy.sol#L20
File: NounsDAOProxy.sol
22 : // GovernorBravoDelegator.sol source code Copyright 2020 Compound Labs, Inc. licensed under the BSD-3-Clause license.
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOProxy.sol#L22
File: NounsDAOProxy.sol
25 : // Additional conditions of BSD-3-Clause can be found here: https://opensource.org/licenses/BSD-3-Clause
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOProxy.sol#L25
File: NounsDAOProxy.sol
29 : // https://github.com/OpenZeppelin/openzeppelin-contracts/blob/5c8746f56b4bed8cc9e0e044f5f69ab2f9428ce1/contracts/proxy/Proxy.sol
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOProxy.sol#L29
File: NounsDAOProxy.sol
34 : // The fallback() and receive() functions of Proxy.sol have been used to allow Solidity > 0.6.0 compatibility
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOProxy.sol#L34
File: NounsDAOV3Admin.sol
138 : /// @notice Upper bound for forking period. If forking period is too high it can block proposals for too long.
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L138
File: NounsDAOV3Proposals.sol
392 : // without this check it's possible to run through this function and update a proposal without signatures
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L392
File: NounsDAOV3Proposals.sol
412 : // To avoid the gas cost of having to search signers in proposal.signers, we're assuming the sigs we get
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L412
File: NounsDAOV3Votes.sol
56 : /// @notice The vote refund gas overhead, including 7K for ETH transfer and 29K for general transaction overhead
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Votes.sol#L56
File: NounsDAOV3Votes.sol
221 : /// @notice: Unlike GovernerBravo, votes are considered from the block the proposal was created in order to normalize quorumVotes and proposalThreshold metrics
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Votes.sol#L221
File: NounsDAOV3Votes.sol
322 : // The idea is to temporarily use this code that would still use `creationBlock` until all proposals are using
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Votes.sol#L322
File: NounsDAOV3Votes.sol
323 : // `startBlock`, then we can deploy a quick DAO fix that removes this line and only uses `startBlock`.
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Votes.sol#L323
File: NounsDAOForkEscrow.sol
60 : /// @notice Number of tokens in escrow in the current fork contributing to the fork threshold. They can be unescrowed.
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/NounsDAOForkEscrow.sol#L60
File: NounsAuctionHouseFork.sol
21 : // https://github.com/ourzora/auction-house/blob/54a12ec1a6cf562e49f0a4917990474b11350a2d/contracts/AuctionHouse.sol
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/NounsAuctionHouseFork.sol#L21
File: NounsDAOLogicV1Fork.sol
21 : // https://github.com/compound-finance/compound-protocol/blob/b9b14038612d846b83f8a009a82c38974ff2dcfe/contracts/Governance/GovernorBravoDelegate.sol
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L21
File: NounsDAOLogicV1Fork.sol
23 : // GovernorBravoDelegate.sol source code Copyright 2020 Compound Labs, Inc. licensed under the BSD-3-Clause license.
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L23
File: NounsDAOLogicV1Fork.sol
26 : // Additional conditions of BSD-3-Clause can be found here: https://opensource.org/licenses/BSD-3-Clause
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L26
File: NounsDAOLogicV1Fork.sol
30 : // - `quit(tokenIds)`, a function that allows token holders to quit the DAO, taking their pro rata funds,
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L30
File: NounsDAOLogicV1Fork.sol
33 : // - `adjustedTotalSupply`, the total supply calculation used in DAO functions like quorum and proposal threshold, in
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L33
File: NounsDAOLogicV1Fork.sol
34 : // which the DAO exludes tokens held by the treasury, such that tokens used to quit the DAO are not counted.
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L34
File: NounsDAOLogicV1Fork.sol
38 : // - A new proposals getter function, since adding new fields to Proposal results in the default getter hitting a
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L38
File: NounsDAOLogicV1Fork.sol
41 : // - A new Proposal field: `creationBlock`, used to resolve the `votingDelay` bug, in which editing `votingDelay` would
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L41
File: NounsDAOLogicV1Fork.sol
45 : // - The proxy pattern from Compound's old Transparent-like proxy, to OpenZeppelin's recommended UUPS pattern.
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L45
File: NounsDAOLogicV1Fork.sol
49 : // - includes a new 'delayed governance' feature which gives forkers from the original DAO time to claim their tokens
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L49
File: NounsDAOLogicV1Fork.sol
50 : // with this new DAO; proposals are not allowed until all tokens are claimed, or until the delay expiration
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L50
File: NounsDAOLogicV1Fork.sol
53 : // - `cancel` bugfix, allowing proposals to be canceled by anyone if the proposer's vote balance is equal to proposal
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L53
File: NounsDAOLogicV1Fork.sol
56 : // - Removes the vetoer role and logic related to it. The quit function provides minority protection instead of the
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L56
File: NounsDAOLogicV1Fork.sol
229 : // Capture balances to send before actually sending them, to avoid the risk of external calls changing balances.
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L229
File: NounsDAOLogicV1Fork.sol
623 : /// @notice: Unlike GovernerBravo, votes are considered from the block the proposal was created in order to normalize quorumVotes and proposalThreshold metrics
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L623
File: NounsDAOStorageV1Fork.sol
33 : /// @notice The basis point number of votes to exceed in order for a voter to become a proposer. *DIFFERS from GovernerBravo
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOStorageV1Fork.sol#L33
File: NounsDAOStorageV1Fork.sol
36 : /// @notice The basis point number of votes in support of a proposal required in order for a quorum to be reached and for a vote to succeed. *DIFFERS from GovernerBravo
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOStorageV1Fork.sol#L36
File: NounsDAOStorageV1Fork.sol
63 : /// @notice The number of votes needed to create a proposal at the time of proposal creation. *DIFFERS from GovernerBravo
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOStorageV1Fork.sol#L63
File: NounsDAOStorageV1Fork.sol
124 : /// @notice The number of votes needed to create a proposal at the time of proposal creation. *DIFFERS from GovernerBravo
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOStorageV1Fork.sol#L124
File: NounsDAOStorageV1Fork.sol
65 : /// @notice The number of votes in support of a proposal required in order for a quorum to be reached and for a vote to succeed at the time of proposal creation. *DIFFERS from GovernerBravo
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOStorageV1Fork.sol#L65
File: NounsDAOStorageV1Fork.sol
67 : /// @notice The timestamp that the proposal will be available for execution, set once the vote succeeds
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOStorageV1Fork.sol#L67
File: NounsDAOStorageV1Fork.sol
128 : /// @notice The timestamp that the proposal will be available for execution, set once the vote succeeds
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOStorageV1Fork.sol#L128
File: NounsDAOStorageV1Fork.sol
126 : /// @notice The minimum number of votes in support of a proposal required in order for a quorum to be reached and for a vote to succeed at the time of proposal creation. *DIFFERS from GovernerBravo
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOStorageV1Fork.sol#L126
File: NounsTokenFork.sol
57 : /// @notice The escrow contract used to verify ownership of the original Nouns in the post-fork claiming process
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/NounsTokenFork.sol#L57
File: NounsTokenFork.sol
63 : /// @notice How many tokens are still available to be claimed by Nouners who put their original Nouns in escrow
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/NounsTokenFork.sol#L63
File: NounsTokenFork.sol
66 : /// @notice The forking period expiration timestamp, after which new tokens cannot be claimed by the original DAO
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/NounsTokenFork.sol#L66
File: NounsTokenFork.sol
180 : // During a forking period, people can buy new Nouns on auction, with a higher ID than the auction ID at forking
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/NounsTokenFork.sol#L180
File: ERC721CheckpointableUpgradeable .sol
19 : // ERC721CheckpointableUpgradeable.sol is a modified version of ERC721Checkpointable.sol in this repository.
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/base/ERC721CheckpointableUpgradeable.sol#L19
File: ERC721CheckpointableUpgradeable .sol
21 : // https://github.com/compound-finance/compound-protocol/blob/ae4388e780a8d596d97619d9704a931a2752c2bc/contracts/Governance/Comp.sol
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/base/ERC721CheckpointableUpgradeable.sol#L21
File: ERC721CheckpointableUpgradeable .sol
26 : // Additional conditions of BSD-3-Clause can be found here: https://opensource.org/licenses/BSD-3-Clause
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/base/ERC721CheckpointableUpgradeable.sol#L26
File: ERC721CheckpointableUpgradeable .sol
29 : // - Inherits from OpenZeppelin's ERC721EnumerableUpgradeable.sol, removing the original modification Nouns made to
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/base/ERC721CheckpointableUpgradeable.sol#L29
File: ERC721CheckpointableUpgradeable .sol
30 : // ERC721.sol, where for each mint two Transfer events were emitted; this modified implementation sticks with the
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/base/ERC721CheckpointableUpgradeable.sol#L30
File: ERC721CheckpointableUpgradeable .sol
32 : // - More importantly, this inheritance change makes the token upgradable, which we deemed important in the context of
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/base/ERC721CheckpointableUpgradeable.sol#L32
File: ERC721CheckpointableUpgradeable .sol
33 : // forks, in order to give new Nouns forks enough of a chance to modify their contracts to the new DAO's needs.
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/base/ERC721CheckpointableUpgradeable.sol#L33
File: ERC721CheckpointableUpgradeable .sol
34 : // - Fixes a critical bug in `delegateBySig`, where the previous version allowed delegating to address zero, which then
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/base/ERC721CheckpointableUpgradeable.sol#L34
File: ERC721CheckpointableUpgradeable .sol
35 : // reverts whenever that owner tries to delegate anew or transfer their tokens. The fix is simply to revert on any
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/base/ERC721CheckpointableUpgradeable.sol#L35
File: ERC721CheckpointableUpgradeable .sol
44 : // - `_transferTokens()` is renamed `_beforeTokenTransfer()` and adapted to hook into OpenZeppelin's ERC721 hooks.
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/base/ERC721CheckpointableUpgradeable.sol#L44
File: ERC721CheckpointableUpgradeable .sol
51 : /// @notice Defines decimals as per ERC-20 convention to make integrations with 3rd party governance platforms easier
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/base/ERC721CheckpointableUpgradeable.sol#L51
File: ERC721CheckpointableUpgradeable .sol
115 : /// @notice Differs from `_transferTokens()` to use `delegates` override method to simulate auto-delegation
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/base/ERC721CheckpointableUpgradeable.sol#L115
File: ERC721CheckpointableUpgradeable .sol
210 : /// @notice differs from `_delegate()` in `Comp.sol` to use `delegates` override method to simulate auto-delegation
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/base/ERC721CheckpointableUpgradeable.sol#L210
File: NounsDAOLogicV2.sol
197 : function propose (
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L197
File: NounsDAOLogicV1Fork.sol
272 : function propose (
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L272
File: ProposeDAOV3UpgradeMainnet.s.sol
54 : function propose (
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L54
File: ProposeDAOV3UpgradeTestnet.s.sol
62 : function propose (
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L62
When changing state variables events are not emitted. Emitting events allows monitoring activities with off-chain monitoring tools.
File: NounsDAOInterfaces.sol
601 : function setApprovalForAll (address operator , bool approved ) external ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOInterfaces.sol#L601
File: NounsAuctionHouseFork.sol
102 : function settleCurrentAndCreateNewAuction () external override nonReentrant whenNotPaused {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/NounsAuctionHouseFork.sol#L102
File: NounsTokenFork.sol
198 : function setContractURIHash (string memory newContractURIHash ) external onlyOwner {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/NounsTokenFork.sol#L198
It is recommended that Solidity contracts are fully annotated using NatSpec for all public interfaces (everything in the ABI). It is clearly stated in the Solidity official documentation. In complex projects such as Defi, the interpretation of all functions and their arguments and returns is important for code readability and auditability. https://docs.soliditylang.org/en/v0.8.15/natspec-format.html
All in-scope contracts
Recommended Mitigation Steps
NatSpec comments should be increased in contracts
File: NounsDAOExecutorV2.sol
84 : /// @dev increased grace period from 14 days to 21 days to allow more time in case of a forking period
uint256 public constant GRACE_PERIOD = 21 days ;
uint256 public constant MINIMUM_DELAY = 2 days ;
uint256 public constant MAXIMUM_DELAY = 30 days ;
address public admin;
address public pendingAdmin;
uint256 public delay;
mapping (bytes32 => bool ) public queuedTransactions;
function initialize (address admin_ , uint256 delay_ ) public virtual initializer {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutorV2.sol#L84
File: NounsDAOLogicV2.sol
932 : /**
* @notice Quorum votes required for a specific proposal to succeed
* Differs from `GovernerBravo` which uses fixed amount
*/
function quorumVotes (uint256 proposalId ) public view returns (uint256 ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L932
File: NounsDAOLogicV3.sol
373 : /**
* @notice Executes a queued proposal on timelockV1 if eta has passed
* This is only required for proposal that were queued on timelockV1, but before the upgrade to DAO V3.
* These proposals will not have the `executeOnTimelockV1` bool turned on.
*/
function executeOnTimelockV1 (uint256 proposalId ) external {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV3.sol#L373
File: NounsDAOLogicV3.sol
872 : /**
* ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
* DYNAMIC QUORUM
* ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
*/
/**
* @notice Quorum votes required for a specific proposal to succeed
* Differs from `GovernerBravo` which uses fixed amount
*/
function quorumVotes (uint256 proposalId ) public view returns (uint256 ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV3.sol#L872
File: NounsDAOLogicV3.sol
931 : /**
* @notice Get all quorum params checkpoints
*/
function quorumParamsCheckpoints () public view returns (DynamicQuorumParamsCheckpoint[] memory ) {
938 : /**
* @notice Get a quorum params checkpoint by its index
*/
function quorumParamsCheckpoints (uint256 index ) public view returns (DynamicQuorumParamsCheckpoint memory ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV3.sol#L931
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV3.sol#L938
File: NounsDAOV3Admin.sol
297 : /**
* @notice Begins transition of vetoer. The newPendingVetoer must call _acceptVetoer to finalize the transfer.
* @param newPendingVetoer New Pending Vetoer
*/
function _setPendingVetoer (NounsDAOStorageV3.StorageV3 storage ds , address newPendingVetoer ) public {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L297
File: NounsDAOV3Admin.sol
311 : /**
* @notice Called by the pendingVetoer to accept role and update vetoer
*/
function _acceptVetoer (NounsDAOStorageV3.StorageV3 storage ds ) external {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L311
File: NounsDAOV3Admin.sol
465 : /**
* @notice Withdraws all the ETH in the contract. This is callable only by the admin (timelock).
*/
function _withdraw (NounsDAOStorageV3.StorageV3 storage ds ) external onlyAdmin (ds) returns (uint256 , bool ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L465
File: NounsDAOV3DynamicQuorum.sol
28 : /**
* @notice Quorum votes required for a specific proposal to succeed
* Differs from `GovernerBravo` which uses fixed amount
*/
function quorumVotes (NounsDAOStorageV3.StorageV3 storage ds , uint256 proposalId ) internal view returns (uint256 ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3DynamicQuorum.sol#L28
File: NounsDAOV3DynamicQuorum.sol
70 : /**
* @notice returns the dynamic quorum parameters values at a certain block number
* @dev The checkpoints array must not be empty, and the block number must be higher than or equal to
* the block of the first checkpoint
* @param blockNumber_ the block number to get the params at
* @return The dynamic quorum parameters that were set at the given block number
*/
function getDynamicQuorumParamsAt (NounsDAOStorageV3.StorageV3 storage ds , uint256 blockNumber_ )
internal
view
returns (NounsDAOStorageV3.DynamicQuorumParams memory )
{
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3DynamicQuorum.sol#L70
File: NounsDAOV3DynamicQuorum.sol
123 : /**
* @notice Current min quorum votes using Nouns adjusted total supply
*/
function minQuorumVotes (NounsDAOStorageV3.StorageV3 storage ds , uint256 adjustedTotalSupply )
internal
view
returns (uint256 )
{
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3DynamicQuorum.sol#L123
File: NounsDAOV3DynamicQuorum.sol
134 : /**
* @notice Current max quorum votes using Nouns adjusted total supply
*/
function maxQuorumVotes (NounsDAOStorageV3.StorageV3 storage ds , uint256 adjustedTotalSupply )
internal
view
returns (uint256 )
{
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3DynamicQuorum.sol#L134
File: NounsDAOV3Proposals.sol
261 : /**
* @notice Invalidates a signature that may be used for signing a proposal.
* Once a signature is canceled, the sender can no longer use it again.
* If the sender changes their mind and want to sign the proposal, they can change the expiry timestamp
* in order to produce a new signature.
* The signature will only be invalidated when used by the sender. If used by a different account, it will
* not be invalidated.
* @param sig The signature to cancel
*/
function cancelSig (NounsDAOStorageV3.StorageV3 storage ds , bytes calldata sig ) external {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L261
File: NounsDAOV3Proposals.sol
354 : /**
* @notice Updates the proposal's description. Only the proposer can update it, and only during the updateable period.
* @param proposalId Proposal's id
* @param description Updated description of the proposal
* @param updateMessage Short message to explain the update
*/
function updateProposalDescription (
NounsDAOStorageV3.StorageV3 storage ds ,
uint256 proposalId ,
string calldata description ,
string calldata updateMessage
) external {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L354
File: NounsDAOV3Proposals.sol
372 : /**
* @notice Update a proposal's transactions and description that was created with proposeBySigs.
* Only the proposer can update it, during the updateable period.
* Requires the original signers to sign the update.
* @param proposalId Proposal's id
* @param proposerSignatures Array of signers who have signed the proposal and their signatures.
* @dev The signatures follow EIP-712. See `UPDATE_PROPOSAL_TYPEHASH` in NounsDAOV3Proposals.sol
* @param txs Updated transactions for the proposal
* @param description Updated description of the proposal
* @param updateMessage Short message to explain the update
*/
function updateProposalBySigs (
NounsDAOStorageV3.StorageV3 storage ds ,
uint256 proposalId ,
NounsDAOStorageV3.ProposerSignature[] memory proposerSignatures ,
ProposalTxs memory txs ,
string memory description ,
string memory updateMessage
) external {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L372
File: NounsDAOV3Proposals.sol
434 : /**
* @notice Queues a proposal of state succeeded
* @param proposalId The id of the proposal to queue
*/
function queue (NounsDAOStorageV3.StorageV3 storage ds , uint256 proposalId ) external {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L434
File: NounsDAOV3Proposals.sol
475 : /**
* @notice Executes a queued proposal if eta has passed
* @param proposalId The id of the proposal to execute
*/
function execute (NounsDAOStorageV3.StorageV3 storage ds , uint256 proposalId ) external {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L475
File: NounsDAOV3Proposals.sol
485 : /**
* @notice Executes a queued proposal on timelockV1 if eta has passed
* This is only required for proposal that were queued on timelockV1, but before the upgrade to DAO V3.
* These proposals will not have the `executeOnTimelockV1` bool turned on.
*/
function executeOnTimelockV1 (NounsDAOStorageV3.StorageV3 storage ds , uint256 proposalId ) external {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L485
File: NounsDAOV3Proposals.sol
532 : /**
* @notice Vetoes a proposal only if sender is the vetoer and the proposal has not been executed.
* @param proposalId The id of the proposal to veto
*/
function veto (NounsDAOStorageV3.StorageV3 storage ds , uint256 proposalId ) external {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L532
File: NounsDAOV3Proposals.sol
566 : /**
* @notice Cancels a proposal only if sender is the proposer or a signer, or proposer & signers voting power
* dropped below proposal threshold
* @param proposalId The id of the proposal to cancel
*/
function cancel (NounsDAOStorageV3.StorageV3 storage ds , uint256 proposalId ) external {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L566
File: NounsDAOV3Proposals.sol
669 : /**
* @notice Gets actions of a proposal
* @param proposalId the id of the proposal
* @return targets
* @return values
* @return signatures
* @return calldatas
*/
function getActions (NounsDAOStorageV3.StorageV3 storage ds , uint256 proposalId )
internal
view
returns (
address [] memory targets ,
uint256 [] memory values ,
string [] memory signatures ,
bytes [] memory calldatas
)
{
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L669
File: NounsDAOV3Proposals.sol
691 : /**
* @notice Gets the receipt for a voter on a given proposal
* @param proposalId the id of proposal
* @param voter The address of the voter
* @return The voting receipt
*/
function getReceipt (
NounsDAOStorageV3.StorageV3 storage ds ,
uint256 proposalId ,
address voter
) internal view returns (NounsDAOStorageV3.Receipt memory ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L691
File: NounsDAOV3Proposals.sol
773 : /**
* @notice Current proposal threshold using Noun Total Supply
* Differs from `GovernerBravo` which uses fixed amount
*/
function proposalThreshold (NounsDAOStorageV3.StorageV3 storage ds , uint256 adjustedTotalSupply )
internal
view
returns (uint256 )
{
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L773
File: NounsDAOV3Proposals.sol
794 : /**
* @notice reverts if `proposer` is the proposer or signer of an active proposal.
* This is a spam protection mechanism to limit the number of proposals each noun can back.
*/
function checkNoActiveProp (NounsDAOStorageV3.StorageV3 storage ds , address proposer ) internal view {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L794
File: NounsDAOV3Proposals.sol
924 : /// @notice Maintains backwards compatibility with GovernorBravo events
emit ProposalCreated (
newProposal.id,
msg .sender ,
txs.targets,
txs.values,
txs.signatures,
txs.calldatas,
newProposal.startBlock,
newProposal.endBlock,
description
);
/// @notice V1: Updated event with `proposalThreshold` and `quorumVotes` `minQuorumVotes`
/// @notice V2: `quorumVotes` changed to `minQuorumVotes`
/// @notice V3: Added signers and updatePeriodEndBlock
emit ProposalCreatedWithRequirements (
newProposal.id,
msg .sender ,
signers,
txs.targets,
txs.values,
txs.signatures,
txs.calldatas,
newProposal.startBlock,
newProposal.endBlock,
newProposal.updatePeriodEndBlock,
newProposal.proposalThreshold,
minQuorumVotes,
description
);
}
function checkPropThreshold (
NounsDAOStorageV3.StorageV3 storage ds ,
uint256 votes ,
uint256 adjustedTotalSupply
) internal view returns (uint256 propThreshold ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L924
File: NounsDAOV3Votes.sol
78 : /**
* @notice Cast a vote for a proposal, asking the DAO to refund gas costs.
* Users with > 0 votes receive refunds. Refunds are partial when using a gas priority fee higher than the DAO's cap.
* Refunds are partial when the DAO's balance is insufficient.
* No refund is sent when the DAO's balance is empty. No refund is sent to users with no votes.
* Voting takes place regardless of refund success.
* @param proposalId The id of the proposal to vote on
* @param support The support value for the vote. 0=against, 1=for, 2=abstain
* @dev Reentrancy is defended against in `castVoteInternal` at the `receipt.hasVoted == false` require statement.
*/
function castRefundableVote (
NounsDAOStorageV3.StorageV3 storage ds ,
uint256 proposalId ,
uint8 support
) external {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Votes.sol#L78
File: NounsDAOV3Votes.sol
96 : /**
* @notice Cast a vote for a proposal, asking the DAO to refund gas costs.
* Users with > 0 votes receive refunds. Refunds are partial when using a gas priority fee higher than the DAO's cap.
* Refunds are partial when the DAO's balance is insufficient.
* No refund is sent when the DAO's balance is empty. No refund is sent to users with no votes.
* Voting takes place regardless of refund success.
* @param proposalId The id of the proposal to vote on
* @param support The support value for the vote. 0=against, 1=for, 2=abstain
* @param reason The reason given for the vote by the voter
* @dev Reentrancy is defended against in `castVoteInternal` at the `receipt.hasVoted == false` require statement.
*/
function castRefundableVoteWithReason (
NounsDAOStorageV3.StorageV3 storage ds ,
uint256 proposalId ,
uint8 support ,
string calldata reason
) external {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Votes.sol#L96
File: NounsDAOV3Votes.sol
137 : /**
* @notice Cast a vote for a proposal with a reason
* @param proposalId The id of the proposal to vote on
* @param support The support value for the vote. 0=against, 1=for, 2=abstain
* @param reason The reason given for the vote by the voter
*/
function castVoteWithReason (
NounsDAOStorageV3.StorageV3 storage ds ,
uint256 proposalId ,
uint8 support ,
string calldata reason
) external {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Votes.sol#L137
File: ForkDAODeployer.sol
131 : /**
* @dev Used to prevent the 'Stack too deep' error in the main deploy function.
*/
function initDAO (
address governor ,
address treasury ,
address token ,
NounsDAOExecutorV2 originalTimelock
) internal {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/ForkDAODeployer.sol#L131
File: ForkDAODeployer.sol
153 : /**
* @dev Used to prevent the 'Stack too deep' error in the main deploy function.
*/
function getOriginalTimelock (INounsDAOForkEscrow forkEscrow ) internal view returns (NounsDAOExecutorV2) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/ForkDAODeployer.sol#L153
File: ForkDAODeployer.sol
161 : /**
* @dev Used to prevent the 'Stack too deep' error in the main deploy function.
*/
function getOriginalAuction (INounsDAOForkEscrow forkEscrow ) internal view returns (NounsAuctionHouse) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/ForkDAODeployer.sol#L161
File: NounsDAOV3Fork.sol
90 : /**
* @notice Withdraw Nouns from the fork escrow. Only possible if the fork has not been executed.
* Only allowed to withdraw tokens that the sender has escrowed.
* @param tokenIds the tokenIds to withdraw
*/
function withdrawFromForkEscrow (NounsDAOStorageV3.StorageV3 storage ds , uint256 [] calldata tokenIds ) external {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/NounsDAOV3Fork.sol#L90
File: NounsDAOV3Fork.sol
104 : /**
* @notice Execute the fork. Only possible if the fork threshold has been exceeded.
* This will deploy a new DAO and send the prorated part of the treasury to the new DAO's treasury.
* This will also close the active escrow and all nouns in the escrow will belong to the original DAO.
* @return forkTreasury The address of the new DAO's treasury
* @return forkToken The address of the new DAO's token
*/
function executeFork (NounsDAOStorageV3.StorageV3 storage ds )
external
returns (address forkTreasury , address forkToken )
{
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/NounsDAOV3Fork.sol#L104
File: NounsDAOV3Fork.sol
134 : /**
* @notice Joins a fork while a fork is active
* Sends the tokens to the timelock contract.
* Sends a prorated part of the treasury to the new fork DAO's treasury.
* Mints new tokens in the new fork DAO with the same token ids.
* @param tokenIds the tokenIds to send to the DAO in exchange for joining the fork
*/
function joinFork (
NounsDAOStorageV3.StorageV3 storage ds ,
uint256 [] calldata tokenIds ,
uint256 [] calldata proposalIds ,
string calldata reason
) external {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/NounsDAOV3Fork.sol#L134
File: NounsDAOV3Fork.sol
162 : /**
* @notice Withdraws nouns from the fork escrow to the treasury after the fork has been executed
* @dev Only the DAO can call this function
* @param tokenIds the tokenIds to withdraw
*/
function withdrawDAONounsFromEscrowToTreasury (NounsDAOStorageV3.StorageV3 storage ds , uint256 [] calldata tokenIds )
external
{
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/NounsDAOV3Fork.sol#L162
File: NounsDAOV3Fork.sol
173 : /**
* @notice Withdraws nouns from the fork escrow after the fork has been executed to an address other than the treasury
* @dev Only the DAO can call this function
* @param tokenIds the tokenIds to withdraw
* @param to the address to send the nouns to
*/
function withdrawDAONounsFromEscrowIncreasingTotalSupply (
NounsDAOStorageV3.StorageV3 storage ds ,
uint256 [] calldata tokenIds ,
address to
) external {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/NounsDAOV3Fork.sol#L173
File: NounsDAOV3Fork.sol
205 : /**
* @notice Returns the required number of tokens to escrow to trigger a fork
*/
function forkThreshold (NounsDAOStorageV3.StorageV3 storage ds ) public view returns (uint256 ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/NounsDAOV3Fork.sol#L205
File: NounsDAOV3Fork.sol
212 : /**
* @notice Returns the number of tokens currently in escrow, contributing to the fork threshold
*/
function numTokensInForkEscrow (NounsDAOStorageV3.StorageV3 storage ds ) public view returns (uint256 ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/NounsDAOV3Fork.sol#L212
File: NounsDAOV3Fork.sol
219 : /**
* @notice Returns the number of nouns in supply minus nouns owned by the DAO, i.e. held in the treasury or in an
* escrow after it has closed.
* This is used when calculating proposal threshold, quorum, fork threshold & treasury split.
*/
function adjustedTotalSupply (NounsDAOStorageV3.StorageV3 storage ds ) internal view returns (uint256 ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/NounsDAOV3Fork.sol#L219
File: NounsDAOV3Fork.sol
228 : /**
* @notice Returns true if noun holders can currently join a fork
*/
function isForkPeriodActive (NounsDAOStorageV3.StorageV3 storage ds ) internal view returns (bool ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/NounsDAOV3Fork.sol#L228
File: NounsDAOV3Fork.sol
235 : /**
* @notice Sends part of the DAO's treasury to the `newDAOTreasury` address.
* The amount sent is proportional to the `tokenCount` out of `totalSupply`.
* Sends ETH and ERC20 tokens listed in `ds.erc20TokensToIncludeInFork`.
*/
function sendProRataTreasury (
NounsDAOStorageV3.StorageV3 storage ds ,
address newDAOTreasury ,
uint256 tokenCount ,
uint256 totalSupply
) internal {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/NounsDAOV3Fork.sol#L235
File: NounsAuctionHouseFork.sol
176 : /**
* @notice Set the auction time buffer.
* @dev Only callable by the owner.
*/
function setTimeBuffer (uint256 _timeBuffer ) external override onlyOwner {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/NounsAuctionHouseFork.sol#L176
File: NounsAuctionHouseFork.sol
186 : /**
* @notice Set the auction reserve price.
* @dev Only callable by the owner.
*/
function setReservePrice (uint256 _reservePrice ) external override onlyOwner {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/NounsAuctionHouseFork.sol#L186
File: NounsAuctionHouseFork.sol
196 : /**
* @notice Set the auction minimum bid increment percentage.
* @dev Only callable by the owner.
*/
function setMinBidIncrementPercentage (uint8 _minBidIncrementPercentage ) external override onlyOwner {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/NounsAuctionHouseFork.sol#L196
File: NounsAuctionHouseFork.sol
258 : /**
* @notice Transfer ETH. If the ETH transfer fails, wrap the ETH and try send it as WETH.
*/
function _safeTransferETHWithFallback (address to , uint256 amount ) internal {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/NounsAuctionHouseFork.sol#L258
File: NounsAuctionHouseFork.sol
277 : /**
* @dev Reverts when `msg.sender` is not the owner of this contract; in the case of Noun DAOs it should be the
* DAO's treasury contract.
*/
function _authorizeUpgrade (address ) internal view override onlyOwner {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/NounsAuctionHouseFork.sol#L277
File: NounsTokenFork.sol
194 : /**
* @notice Set the _contractURIHash.
* @dev Only callable by the owner.
*/
function setContractURIHash (string memory newContractURIHash ) external onlyOwner {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/NounsTokenFork.sol#L194
File: NounsTokenFork.sol
210 : /**
* @notice Burn a noun.
*/
function burn (uint256 nounId ) public override onlyMinter {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/NounsTokenFork.sol#L210
File: NounsTokenFork.sol
218 : /**
* @notice A distinct Uniform Resource Identifier (URI) for a given asset.
* @dev See {IERC721Metadata-tokenURI}.
*/
function tokenURI (uint256 tokenId ) public view override returns (string memory ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/NounsTokenFork.sol#L218
File: NounsTokenFork.sol
227 : /**
* @notice Similar to `tokenURI`, but always serves a base64 encoded data URI
* with the JSON contents directly inlined.
*/
function dataURI (uint256 tokenId ) public view override returns (string memory ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/NounsTokenFork.sol#L227
File: NounsTokenFork.sol
236 : /**
* @notice Set the token minter.
* @dev Only callable by the owner when not locked.
*/
function setMinter (address _minter ) external override onlyOwner whenMinterNotLocked {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/NounsTokenFork.sol#L236
File: NounsTokenFork.sol
256 : /**
* @notice Set the token URI descriptor.
* @dev Only callable by the owner when not locked.
*/
function setDescriptor (INounsDescriptorMinimal _descriptor ) external override onlyOwner whenDescriptorNotLocked {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/NounsTokenFork.sol#L256
File: NounsTokenFork.sol
276 : /**
* @notice Set the token seeder.
* @dev Only callable by the owner when not locked.
*/
function setSeeder (INounsSeeder _seeder ) external override onlyOwner whenSeederNotLocked {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/NounsTokenFork.sol#L276
File: NounsTokenFork.sol
296 : /**
* @notice Mint a Noun with `nounId` to the provided `to` address.
*/
function _mintTo (address to , uint256 nounId ) internal returns (uint256 ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/NounsTokenFork.sol#L296
File: NounsTokenFork.sol
308 : /**
* @notice Mint a new token using the original Nouns seed.
*/
function _mintWithOriginalSeed (address to , uint256 nounId ) internal {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/NounsTokenFork.sol#L308
File: NounsTokenFork.sol
323 : /**
* @dev Reverts when `msg.sender` is not the owner of this contract; in the case of Noun DAOs it should be the
* DAO's treasury contract.
*/
function _authorizeUpgrade (address ) internal view override onlyOwner {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/NounsTokenFork.sol#L323
File: ERC721CheckpointableUpgradeable .sol
94 : /**
* @notice Overrides the standard `Comp.sol` delegates mapping to return
* the delegator's own address if they haven't delegated.
* This avoids having to delegate to oneself.
*/
function delegates (address delegator ) public view returns (address ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/base/ERC721CheckpointableUpgradeable.sol#L94
File: ERC721CheckpointableUpgradeable .sol
104 : /**
* @notice Adapted from `_transferTokens()` in `Comp.sol` to update delegate votes.
* @dev hooks into OpenZeppelin's `ERC721._transfer`
*/
function _beforeTokenTransfer (
address from ,
address to ,
uint256 tokenId
) internal override {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/base/ERC721CheckpointableUpgradeable.sol#L104
File: ERC721CheckpointableUpgradeable .sol
210 : /// @notice differs from `_delegate()` in `Comp.sol` to use `delegates` override method to simulate auto-delegation
address currentDelegate = delegates (delegator);
_delegates[delegator] = delegatee;
emit DelegateChanged (delegator, currentDelegate, delegatee);
uint96 amount = votesToDelegate (delegator);
_moveDelegates (currentDelegate, delegatee, amount);
}
function _moveDelegates (
address srcRep ,
address dstRep ,
uint96 amount
) internal {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/base/ERC721CheckpointableUpgradeable.sol#L210
File: NounsDAOLogicV2.sol
932 : /**
* @notice Quorum votes required for a specific proposal to succeed
* Differs from `GovernerBravo` which uses fixed amount
*/
function quorumVotes (uint256 proposalId ) public view returns (uint256 ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L932
File: NounsDAOLogicV3.sol
872 : /**
* ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
* DYNAMIC QUORUM
* ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
*/
/**
* @notice Quorum votes required for a specific proposal to succeed
* Differs from `GovernerBravo` which uses fixed amount
*/
function quorumVotes (uint256 proposalId ) public view returns (uint256 ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV3.sol#L872
File: NounsDAOLogicV3.sol
931 : /**
* @notice Get all quorum params checkpoints
*/
function quorumParamsCheckpoints () public view returns (DynamicQuorumParamsCheckpoint[] memory ) {
938 : /**
* @notice Get a quorum params checkpoint by its index
*/
function quorumParamsCheckpoints (uint256 index ) public view returns (DynamicQuorumParamsCheckpoint memory ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV3.sol#L931
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV3.sol#L938
File: NounsDAOV3Admin.sol
465 : /**
* @notice Withdraws all the ETH in the contract. This is callable only by the admin (timelock).
*/
function _withdraw (NounsDAOStorageV3.StorageV3 storage ds ) external onlyAdmin (ds) returns (uint256 , bool ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L465
File: NounsDAOV3DynamicQuorum.sol
28 : /**
* @notice Quorum votes required for a specific proposal to succeed
* Differs from `GovernerBravo` which uses fixed amount
*/
function quorumVotes (NounsDAOStorageV3.StorageV3 storage ds , uint256 proposalId ) internal view returns (uint256 ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3DynamicQuorum.sol#L28
File: NounsDAOV3DynamicQuorum.sol
123 : /**
* @notice Current min quorum votes using Nouns adjusted total supply
*/
function minQuorumVotes (NounsDAOStorageV3.StorageV3 storage ds , uint256 adjustedTotalSupply )
internal
view
returns (uint256 )
{
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3DynamicQuorum.sol#L123
File: NounsDAOV3DynamicQuorum.sol
134 : /**
* @notice Current max quorum votes using Nouns adjusted total supply
*/
function maxQuorumVotes (NounsDAOStorageV3.StorageV3 storage ds , uint256 adjustedTotalSupply )
internal
view
returns (uint256 )
{
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3DynamicQuorum.sol#L134
File: NounsDAOV3Proposals.sol
773 : /**
* @notice Current proposal threshold using Noun Total Supply
* Differs from `GovernerBravo` which uses fixed amount
*/
function proposalThreshold (NounsDAOStorageV3.StorageV3 storage ds , uint256 adjustedTotalSupply )
internal
view
returns (uint256 )
{
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L773
File: NounsDAOV3Proposals.sol
924 : /// @notice Maintains backwards compatibility with GovernorBravo events
emit ProposalCreated (
newProposal.id,
msg .sender ,
txs.targets,
txs.values,
txs.signatures,
txs.calldatas,
newProposal.startBlock,
newProposal.endBlock,
description
);
/// @notice V1: Updated event with `proposalThreshold` and `quorumVotes` `minQuorumVotes`
/// @notice V2: `quorumVotes` changed to `minQuorumVotes`
/// @notice V3: Added signers and updatePeriodEndBlock
emit ProposalCreatedWithRequirements (
newProposal.id,
msg .sender ,
signers,
txs.targets,
txs.values,
txs.signatures,
txs.calldatas,
newProposal.startBlock,
newProposal.endBlock,
newProposal.updatePeriodEndBlock,
newProposal.proposalThreshold,
minQuorumVotes,
description
);
}
function checkPropThreshold (
NounsDAOStorageV3.StorageV3 storage ds ,
uint256 votes ,
uint256 adjustedTotalSupply
) internal view returns (uint256 propThreshold ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L924
File: ForkDAODeployer.sol
153 : /**
* @dev Used to prevent the 'Stack too deep' error in the main deploy function.
*/
function getOriginalTimelock (INounsDAOForkEscrow forkEscrow ) internal view returns (NounsDAOExecutorV2) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/ForkDAODeployer.sol#L153
File: ForkDAODeployer.sol
161 : /**
* @dev Used to prevent the 'Stack too deep' error in the main deploy function.
*/
function getOriginalAuction (INounsDAOForkEscrow forkEscrow ) internal view returns (NounsAuctionHouse) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/ForkDAODeployer.sol#L161
File: NounsDAOV3Fork.sol
205 : /**
* @notice Returns the required number of tokens to escrow to trigger a fork
*/
function forkThreshold (NounsDAOStorageV3.StorageV3 storage ds ) public view returns (uint256 ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/NounsDAOV3Fork.sol#L205
File: NounsDAOV3Fork.sol
212 : /**
* @notice Returns the number of tokens currently in escrow, contributing to the fork threshold
*/
function numTokensInForkEscrow (NounsDAOStorageV3.StorageV3 storage ds ) public view returns (uint256 ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/NounsDAOV3Fork.sol#L212
File: NounsDAOV3Fork.sol
219 : /**
* @notice Returns the number of nouns in supply minus nouns owned by the DAO, i.e. held in the treasury or in an
* escrow after it has closed.
* This is used when calculating proposal threshold, quorum, fork threshold & treasury split.
*/
function adjustedTotalSupply (NounsDAOStorageV3.StorageV3 storage ds ) internal view returns (uint256 ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/NounsDAOV3Fork.sol#L219
File: NounsDAOV3Fork.sol
228 : /**
* @notice Returns true if noun holders can currently join a fork
*/
function isForkPeriodActive (NounsDAOStorageV3.StorageV3 storage ds ) internal view returns (bool ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/NounsDAOV3Fork.sol#L228
File: NounsTokenFork.sol
218 : /**
* @notice A distinct Uniform Resource Identifier (URI) for a given asset.
* @dev See {IERC721Metadata-tokenURI}.
*/
function tokenURI (uint256 tokenId ) public view override returns (string memory ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/NounsTokenFork.sol#L218
File: NounsTokenFork.sol
227 : /**
* @notice Similar to `tokenURI`, but always serves a base64 encoded data URI
* with the JSON contents directly inlined.
*/
function dataURI (uint256 tokenId ) public view override returns (string memory ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/NounsTokenFork.sol#L227
File: NounsTokenFork.sol
296 : /**
* @notice Mint a Noun with `nounId` to the provided `to` address.
*/
function _mintTo (address to , uint256 nounId ) internal returns (uint256 ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/NounsTokenFork.sol#L296
File: ERC721CheckpointableUpgradeable .sol
94 : /**
* @notice Overrides the standard `Comp.sol` delegates mapping to return
* the delegator's own address if they haven't delegated.
* This avoids having to delegate to oneself.
*/
function delegates (address delegator ) public view returns (address ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/base/ERC721CheckpointableUpgradeable.sol#L94
File: NounsDAOLogicV2.sol
1073 : chainId := chainid ()
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L1073
According to the Solidity Style Guide, Non-external
/public
function names should begin with an underscore
File: NounsDAOExecutor.sol
181 : function getBlockTimestamp () internal view returns (uint256 ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutor.sol#L181
File: NounsDAOExecutorV2.sol
204 : function getBlockTimestamp () internal view returns (uint256 ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutorV2.sol#L204
File: NounsDAOLogicV2.sol
318 : function queueOrRevertInternal (
address target ,
uint256 value ,
string memory signature ,
bytes memory data ,
uint256 eta
) internal {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L318
File: NounsDAOLogicV2.sol
556 : function castRefundableVoteInternal (
uint256 proposalId ,
uint8 support ,
string memory reason
) internal {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L556
File: NounsDAOLogicV2.sol
611 : function castVoteInternal (
address voter ,
uint256 proposalId ,
uint8 support
) internal returns (uint96 ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L611
File: NounsDAOLogicV2.sol
925 : function proposalCreationBlock (Proposal storage proposal ) internal view returns (uint256 ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L925
File: NounsDAOLogicV2.sol
1048 : function min (uint256 a , uint256 b ) internal pure returns (uint256 ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L1048
File: NounsDAOLogicV2.sol
1066 : function bps2Uint (uint256 bps , uint256 number ) internal pure returns (uint256 ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L1066
File: NounsDAOLogicV2.sol
1070 : function getChainIdInternal () internal view returns (uint256 ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L1070
File: NounsDAOLogicV2.sol
1078 : function safe32 (uint256 n , string memory errorMessage ) internal pure returns (uint32 ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L1078
File: NounsDAOLogicV2.sol
1083 : function safe16 (uint256 n ) internal pure returns (uint16 ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L1083
File: NounsDAOProxy.sol
94 : function delegateTo (address callee , bytes memory data ) internal {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOProxy.sol#L94
File: NounsDAOV3Admin.sol
594 : function safe32 (uint256 n , string memory errorMessage ) internal pure returns (uint32 ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L594
File: NounsDAOV3Admin.sol
599 : function checkForDuplicates (address [] calldata erc20tokens ) internal pure {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L599
File: NounsDAOV3DynamicQuorum.sol
32 : function quorumVotes (NounsDAOStorageV3.StorageV3 storage ds , uint256 proposalId ) internal view returns (uint256 ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3DynamicQuorum.sol#L32
File: NounsDAOV3DynamicQuorum.sol
77 : function getDynamicQuorumParamsAt (NounsDAOStorageV3.StorageV3 storage ds , uint256 blockNumber_ )
internal
view
returns (NounsDAOStorageV3.DynamicQuorumParams memory )
{
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3DynamicQuorum.sol#L77
File: NounsDAOV3DynamicQuorum.sol
126 : function minQuorumVotes (NounsDAOStorageV3.StorageV3 storage ds , uint256 adjustedTotalSupply )
internal
view
returns (uint256 )
{
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3DynamicQuorum.sol#L126
File: NounsDAOV3DynamicQuorum.sol
137 : function maxQuorumVotes (NounsDAOStorageV3.StorageV3 storage ds , uint256 adjustedTotalSupply )
internal
view
returns (uint256 )
{
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3DynamicQuorum.sol#L137
File: NounsDAOV3DynamicQuorum.sol
145 : function safe32 (uint256 n , string memory errorMessage ) internal pure returns (uint32 ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3DynamicQuorum.sol#L145
File: NounsDAOV3DynamicQuorum.sol
150 : function safe16 (uint256 n ) internal pure returns (uint16 ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3DynamicQuorum.sol#L150
File: NounsDAOV3DynamicQuorum.sol
157 : function min (uint256 a , uint256 b ) internal pure returns (uint256 ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3DynamicQuorum.sol#L157
File: NounsDAOV3DynamicQuorum.sol
161 : function bps2Uint (uint256 bps , uint256 number ) internal pure returns (uint256 ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3DynamicQuorum.sol#L161
File: NounsDAOV3Proposals.sol
160 : function propose (
NounsDAOStorageV3.StorageV3 storage ds ,
ProposalTxs memory txs ,
string memory description
) internal returns (uint256 ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L160
File: NounsDAOV3Proposals.sol
197 : function proposeOnTimelockV1 (
NounsDAOStorageV3.StorageV3 storage ds ,
ProposalTxs memory txs ,
string memory description
) internal returns (uint256 ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L197
File: NounsDAOV3Proposals.sol
335 : function updateProposalTransactionsInternal (
NounsDAOStorageV3.StorageV3 storage ds ,
uint256 proposalId ,
address [] memory targets ,
uint256 [] memory values ,
string [] memory signatures ,
bytes [] memory calldatas
) internal {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L335
File: NounsDAOV3Proposals.sol
460 : function queueOrRevertInternal (
INounsDAOExecutor timelock ,
address target ,
uint256 value ,
string memory signature ,
bytes memory data ,
uint256 eta
) internal {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L460
File: NounsDAOV3Proposals.sol
495 : function executeInternal (
NounsDAOStorageV3.StorageV3 storage ds ,
NounsDAOStorageV3.Proposal storage proposal ,
INounsDAOExecutor timelock
) internal {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L495
File: NounsDAOV3Proposals.sol
520 : function getProposalTimelock (NounsDAOStorageV3.StorageV3 storage ds , NounsDAOStorageV3.Proposal storage proposal )
internal
view
returns (INounsDAOExecutor)
{
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L520
File: NounsDAOV3Proposals.sol
636 : function stateInternal (NounsDAOStorageV3.StorageV3 storage ds , uint256 proposalId )
internal
view
returns (NounsDAOStorageV3.ProposalState)
{
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L636
File: NounsDAOV3Proposals.sol
677 : function getActions (NounsDAOStorageV3.StorageV3 storage ds , uint256 proposalId )
internal
view
returns (
address [] memory targets ,
uint256 [] memory values ,
string [] memory signatures ,
bytes [] memory calldatas
)
{
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L677
File: NounsDAOV3Proposals.sol
697 : function getReceipt (
NounsDAOStorageV3.StorageV3 storage ds ,
uint256 proposalId ,
address voter
) internal view returns (NounsDAOStorageV3.Receipt memory ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L697
File: NounsDAOV3Proposals.sol
777 : function proposalThreshold (NounsDAOStorageV3.StorageV3 storage ds , uint256 adjustedTotalSupply )
internal
view
returns (uint256 )
{
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L777
File: NounsDAOV3Proposals.sol
785 : function isDefeated (NounsDAOStorageV3.StorageV3 storage ds , NounsDAOStorageV3.Proposal storage proposal )
internal
view
returns (bool )
{
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L785
File: NounsDAOV3Proposals.sol
798 : function checkNoActiveProp (NounsDAOStorageV3.StorageV3 storage ds , address proposer ) internal view {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L798
File: NounsDAOV3Proposals.sol
814 : function verifySignersCanBackThisProposalAndCountTheirVotes (
NounsDAOStorageV3.StorageV3 storage ds ,
NounsDAOStorageV3.ProposerSignature[] memory proposerSignatures ,
ProposalTxs memory txs ,
string memory description ,
uint256 proposalId
) internal returns (uint256 votes , address [] memory signers ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L814
File: NounsDAOV3Proposals.sol
854 : function calcProposalEncodeData (
address proposer ,
ProposalTxs memory txs ,
string memory description
) internal pure returns (bytes memory ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L854
File: NounsDAOV3Proposals.sol
880 : function checkProposalUpdatable (
NounsDAOStorageV3.StorageV3 storage ds ,
uint256 proposalId ,
NounsDAOStorageV3.Proposal storage proposal
) internal view {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L880
File: NounsDAOV3Proposals.sol
891 : function createNewProposal (
NounsDAOStorageV3.StorageV3 storage ds ,
uint256 proposalId ,
uint256 proposalThreshold_ ,
uint256 adjustedTotalSupply ,
ProposalTxs memory txs
) internal returns (NounsDAOStorageV3.Proposal storage newProposal ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L891
File: NounsDAOV3Proposals.sol
917 : function emitNewPropEvents (
NounsDAOStorageV3.Proposal storage newProposal ,
address [] memory signers ,
uint256 minQuorumVotes ,
ProposalTxs memory txs ,
string memory description
) internal {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L917
File: NounsDAOV3Proposals.sol
957 : function checkPropThreshold (
NounsDAOStorageV3.StorageV3 storage ds ,
uint256 votes ,
uint256 adjustedTotalSupply
) internal view returns (uint256 propThreshold ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L957
File: NounsDAOV3Proposals.sol
966 : function checkProposalTxs (ProposalTxs memory txs ) internal pure {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L966
File: NounsDAOV3Proposals.sol
976 : function verifyProposalSignature (
NounsDAOStorageV3.StorageV3 storage ds ,
bytes memory proposalEncodeData ,
NounsDAOStorageV3.ProposerSignature memory proposerSignature ,
bytes32 typehash
) internal view {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L976
File: NounsDAOV3Proposals.sol
1000 : function sigDigest (
bytes32 typehash ,
bytes memory proposalEncodeData ,
uint256 expirationTimestamp ,
address verifyingContract
) internal view returns (bytes32 ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L1000
File: NounsDAOV3Proposals.sol
1015 : function bps2Uint (uint256 bps , uint256 number ) internal pure returns (uint256 ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L1015
File: NounsDAOV3Votes.sol
123 : function castRefundableVoteInternal (
NounsDAOStorageV3.StorageV3 storage ds ,
uint256 proposalId ,
uint8 support ,
string memory reason
) internal {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Votes.sol#L123
File: NounsDAOV3Votes.sol
184 : function castVoteInternal (
NounsDAOStorageV3.StorageV3 storage ds ,
address voter ,
uint256 proposalId ,
uint8 support
) internal returns (uint96 ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Votes.sol#L184
File: NounsDAOV3Votes.sol
210 : function castVoteDuringVotingPeriodInternal (
NounsDAOStorageV3.StorageV3 storage ds ,
uint256 proposalId ,
address voter ,
uint8 support
) internal returns (uint96 ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Votes.sol#L210
File: NounsDAOV3Votes.sol
275 : function castObjectionInternal (
NounsDAOStorageV3.StorageV3 storage ds ,
uint256 proposalId ,
address voter
) internal returns (uint96 ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Votes.sol#L275
File: NounsDAOV3Votes.sol
317 : function proposalVoteSnapshotBlock (
NounsDAOStorageV3.StorageV3 storage ds ,
uint256 proposalId ,
NounsDAOStorageV3.Proposal storage proposal
) internal view returns (uint256 ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Votes.sol#L317
File: NounsDAOV3Votes.sol
332 : function min (uint256 a , uint256 b ) internal pure returns (uint256 ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Votes.sol#L332
File: ForkDAODeployer.sol
134 : function initDAO (
address governor ,
address treasury ,
address token ,
NounsDAOExecutorV2 originalTimelock
) internal {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/ForkDAODeployer.sol#L134
File: ForkDAODeployer.sol
156 : function getOriginalTimelock (INounsDAOForkEscrow forkEscrow ) internal view returns (NounsDAOExecutorV2) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/ForkDAODeployer.sol#L156
File: ForkDAODeployer.sol
164 : function getOriginalAuction (INounsDAOForkEscrow forkEscrow ) internal view returns (NounsAuctionHouse) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/ForkDAODeployer.sol#L164
File: ForkDAODeployer.sol
169 : function getStartNounId (NounsAuctionHouse originalAuction ) internal view returns (uint256 ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/ForkDAODeployer.sol#L169
File: NounsDAOV3Fork.sol
224 : function adjustedTotalSupply (NounsDAOStorageV3.StorageV3 storage ds ) internal view returns (uint256 ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/NounsDAOV3Fork.sol#L224
File: NounsDAOV3Fork.sol
231 : function isForkPeriodActive (NounsDAOStorageV3.StorageV3 storage ds ) internal view returns (bool ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/NounsDAOV3Fork.sol#L231
File: NounsDAOV3Fork.sol
240 : function sendProRataTreasury (
NounsDAOStorageV3.StorageV3 storage ds ,
address newDAOTreasury ,
uint256 tokenCount ,
uint256 totalSupply
) internal {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/NounsDAOV3Fork.sol#L240
File: NounsDAOLogicV1Fork.sol
218 : function quitInternal (uint256 [] calldata tokenIds , address [] memory erc20TokensToInclude ) internal {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L218
File: NounsDAOLogicV1Fork.sol
247 : function isAddressIn (address a , address [] memory addresses ) internal pure returns (bool ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L247
File: NounsDAOLogicV1Fork.sol
376 : function checkGovernanceActive () internal view {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L376
File: NounsDAOLogicV1Fork.sol
410 : function queueOrRevertInternal (
address target ,
uint256 value ,
string memory signature ,
bytes memory data ,
uint256 eta
) internal {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L410
File: NounsDAOLogicV1Fork.sol
612 : function castVoteInternal (
address voter ,
uint256 proposalId ,
uint8 support
) internal returns (uint96 ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L612
File: NounsDAOLogicV1Fork.sol
785 : function bps2Uint (uint256 bps , uint256 number ) internal pure returns (uint256 ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L785
File: NounsDAOLogicV1Fork.sol
793 : function checkForDuplicates (address [] calldata erc20tokens ) internal pure {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L793
File: ERC721CheckpointableUpgradeable .sol
265 : function safe32 (uint256 n , string memory errorMessage ) internal pure returns (uint32 ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/base/ERC721CheckpointableUpgradeable.sol#L265
File: ERC721CheckpointableUpgradeable .sol
270 : function safe96 (uint256 n , string memory errorMessage ) internal pure returns (uint96 ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/base/ERC721CheckpointableUpgradeable.sol#L270
File: ERC721CheckpointableUpgradeable .sol
275 : function add96 (
uint96 a ,
uint96 b ,
string memory errorMessage
) internal pure returns (uint96 ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/base/ERC721CheckpointableUpgradeable.sol#L275
File: ERC721CheckpointableUpgradeable .sol
285 : function sub96 (
uint96 a ,
uint96 b ,
string memory errorMessage
) internal pure returns (uint96 ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/base/ERC721CheckpointableUpgradeable.sol#L285
File: DeployDAOV3NewContractsBase.s.sol
62 : function deployNewContracts ()
internal
returns (
NounsDAOForkEscrow forkEscrow ,
ForkDAODeployer forkDeployer ,
NounsDAOLogicV3 daoV3Impl ,
NounsDAOExecutorV2 timelockV2 ,
ERC20Transferer erc20Transferer
)
{
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/DeployDAOV3NewContractsBase.s.sol#L62
File: DeployDAOV3NewContractsBase.s.sol
96 : function deployAndInitTimelockV2 (address timelockV2Impl ) internal returns (NounsDAOExecutorV2 timelockV2 ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/DeployDAOV3NewContractsBase.s.sol#L96
File: ProposeDAOV3UpgradeMainnet.s.sol
54 : function propose (
NounsDAOLogicV1 daoProxy ,
address daoV3Implementation ,
address timelockV2 ,
uint256 ethToSendToNewTimelock ,
address erc20Transferer ,
address forkEscrow ,
address forkDeployer ,
address [] memory erc20TokensToIncludeInFork ,
string memory description
) internal returns (uint256 proposalId ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L54
File: ProposeDAOV3UpgradeTestnet.s.sol
62 : function propose (
NounsDAOLogicV1 daoProxy ,
address daoV3Implementation ,
address timelockV2 ,
uint256 ethToSendToNewTimelock ,
address erc20Transferer ,
address forkEscrow ,
address forkDeployer ,
address [] memory erc20TokensToIncludeInFork ,
string memory description
) internal returns (uint256 proposalId ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L62
File: ProposeENSReverseLookupConfigMainnet.s.sol
29 : function propose (
NounsDAOLogicV3 daoProxy ,
address reverseRegistrar ,
string memory description
) internal returns (uint256 proposalId ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeENSReverseLookupConfigMainnet.s.sol#L29
File: ProposeTimelockMigrationCleanupMainnet.s.sol
43 : function propose (
NounsDAOLogicV3 daoProxy ,
address timelockV1 ,
address timelockV2 ,
address nounsToken ,
address auctionHouseProxyAdmin ,
address lilNouns ,
string memory description
) internal returns (uint256 proposalId ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeTimelockMigrationCleanupMainnet.s.sol#L43
The current form of relative path import is not recommended for use because it can unpredictably pollute the namespace.
Instead, the Solidity docs recommend specifying imported symbols explicitly.
https://docs.soliditylang.org/en/v0.8.15/layout-of-source-files.html#importing-other-source-files
A good example:
import {OwnableUpgradeable} from "openzeppelin-contracts-upgradeable/contracts/access/OwnableUpgradeable.sol " ;
import {SafeTransferLib} from "solmate/utils/SafeTransferLib.sol " ;
import {SafeCastLib} from "solmate/utils/SafeCastLib.sol " ;
import {ERC20 } from "solmate/tokens/ERC20.sol " ;
import {IProducer} from "src/interfaces/IProducer.sol " ;
import {GlobalState, UserState} from "src/Common.sol " ;
File: NounsDAOLogicV2.sol
55 : import './NounsDAOInterfaces.sol ' ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L55
File: NounsDAOLogicV3.sol
58 : import './NounsDAOInterfaces.sol ' ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV3.sol#L58
File: NounsDAOProxy.sol
38 : import './NounsDAOInterfaces.sol ' ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOProxy.sol#L38
File: NounsDAOV3Admin.sol
20 : import './NounsDAOInterfaces.sol ' ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L20
File: NounsDAOV3DynamicQuorum.sol
20 : import './NounsDAOInterfaces.sol ' ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3DynamicQuorum.sol#L20
File: NounsDAOV3Proposals.sol
20 : import './NounsDAOInterfaces.sol ' ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L20
File: NounsDAOV3Votes.sol
20 : import './NounsDAOInterfaces.sol ' ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Votes.sol#L20
Recommended Mitigation Steps
Use specific imports syntax per solidity docs recommendation.
There are units for seconds, minutes, hours, days, and weeks, and since they're defined, they should be used
File: NounsDAOLogicV2.sol
68 : uint256 public constant MIN_VOTING_PERIOD = 5_760 ; // About 24 hours
86 : uint256 public constant MAX_QUORUM_VOTES_BPS_UPPER_BOUND = 6_000 ; // 4,000 basis points or 60%
98 : uint256 public constant REFUND_BASE_GAS = 36000 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L68
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L86
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L98
File: NounsDAOV3Votes.sol
57 : uint256 public constant REFUND_BASE_GAS = 36000 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Votes.sol#L57
File: DeployDAOV3NewContractsMainnet.s.sol
10 : uint256 public constant FORK_DAO_VOTING_PERIOD = 36000 ; // 5 days
11 : uint256 public constant FORK_DAO_VOTING_DELAY = 36000 ; // 5 days
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/DeployDAOV3NewContractsMainnet.s.sol#L10-L11
File: ProposeDAOV3UpgradeMainnet.s.sol
21 : address public constant DESCRIPTOR_MAINNET = 0x6229c811D04501523C6058bfAAc29c91bb586268 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L21
File: ProposeDAOV3UpgradeTestnet.s.sol
162 : address public constant AUCTION_HOUSE_PROXY_SEPOLIA = 0x488609b7113FCf3B761A05956300d605E8f6BcAf ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L162
0.8.4 :
bytes.concat() instead of abi.encodePacked(,)
0.8.12 :
string.concat() instead of abi.encodePacked(,)
0.8.13 :
Ability to use using for with a list of free functions
0.8.14 :
ABI Encoder: When ABI-encoding values from calldata that contain nested arrays, correctly validate the nested array length against calldatasize() in all cases.
Override Checker: Allow changing data location for parameters only when overriding external functions.
0.8.15 :
Code Generation: Avoid writing dirty bytes to storage when copying bytes arrays.
Yul Optimizer: Keep all memory side-effects of inline assembly blocks.
0.8.16 :
Code Generation: Fix data corruption that affected ABI-encoding of calldata values represented by tuples: structs at any nesting level; argument lists of external functions, events and errors; return value lists of external functions. The 32 leading bytes of the first dynamically-encoded value in the tuple would get zeroed when the last component contained a statically-encoded array.
0.8.17 :
Yul Optimizer: Prevent the incorrect removal of storage writes before calls to Yul functions that conditionally terminate the external EVM call.
0.8.19 :
SMTChecker: New trusted mode that assumes that any compile-time available code is the actual used code, even in external calls.
Bug Fixes:
Assembler: Avoid duplicating subassembly bytecode where possible.
Code Generator: Avoid including references to the deployed label of referenced functions if they are called right away.
ContractLevelChecker: Properly distinguish the case of missing base constructor arguments from having an unimplemented base function.
SMTChecker: Fix internal error caused by unhandled z3 expressions that come from the solver when bitwise operators are used.
SMTChecker: Fix internal error when using the custom NatSpec annotation to abstract free functions.
TypeChecker: Also allow external library functions in using for.
0.8.20 :
Assembler: Use push0 for placing 0 on the stack for EVM versions starting from “Shanghai”. This decreases the deployment and runtime costs.
EVM: Set default EVM version to “Shanghai”.
EVM: Support for the EVM Version “Shanghai”.
Optimizer: Re-implement simplified version of UnusedAssignEliminator and UnusedStoreEliminator. It can correctly remove some unused assignments in deeply nested loops that were ignored by the old version.
Parser: Unary plus is no longer recognized as a unary operator in the AST and triggers an error at the parsing stage (rather than later during the analysis).
SMTChecker: Group all messages about unsupported language features in a single warning. The CLI option --model-checker-show-unsupported and the JSON option settings.modelChecker.showUnsupported can be enabled to show the full list.
SMTChecker: Properties that are proved safe are now reported explicitly at the end of analysis. By default, only the number of safe properties is shown. The CLI option --model-checker-show-proved-safe and the JSON option settings.modelChecker.showProvedSafe can be enabled to show the full list of safe properties.
Standard JSON Interface: Add experimental support for importing ASTs via Standard JSON.
Yul EVM Code Transform: If available, use push0 instead of codesize to produce an arbitrary value on stack in order to create equal stack heights between branches.
File: NounsDAOExecutor.sol
pragma solidity ^ 0.8.6 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutor.sol#L31
File: NounsDAOExecutorProxy.sol
pragma solidity ^ 0.8.19 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutorProxy.sol#L18
File: NounsDAOExecutorV2.sol
pragma solidity ^ 0.8.19 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutorV2.sol#L40
File: NounsDAOInterfaces.sol
pragma solidity ^ 0.8.6 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOInterfaces.sol#L35
File: NounsDAOLogicV2.sol
pragma solidity ^ 0.8.6 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L53
File: NounsDAOLogicV3.sol
pragma solidity ^ 0.8.19 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV3.sol#L56
File: NounsDAOProxy.sol
pragma solidity ^ 0.8.6 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOProxy.sol#L36
File: NounsDAOV3Admin.sol
pragma solidity ^ 0.8.19 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L18
File: NounsDAOV3DynamicQuorum.sol
pragma solidity ^ 0.8.19 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3DynamicQuorum.sol#L18
File: NounsDAOV3Proposals.sol
pragma solidity ^ 0.8.19 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L18
File: NounsDAOV3Votes.sol
pragma solidity ^ 0.8.19 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Votes.sol#L18
File: ForkDAODeployer.sol
pragma solidity ^ 0.8.19 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/ForkDAODeployer.sol#L18
File: NounsDAOForkEscrow.sol
pragma solidity ^ 0.8.19 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/NounsDAOForkEscrow.sol#L18
File: NounsDAOV3Fork.sol
pragma solidity ^ 0.8.19 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/NounsDAOV3Fork.sol#L18
File: NounsAuctionHouseFork.sol
pragma solidity ^ 0.8.19 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/NounsAuctionHouseFork.sol#L30
File: INounsTokenForkLike.sol
pragma solidity ^ 0.8.19 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/INounsTokenForkLike.sol#L3
File: NounsDAOEventsFork.sol
pragma solidity ^ 0.8.19 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOEventsFork.sol#L3
File: NounsDAOLogicV1Fork.sol
pragma solidity ^ 0.8.19 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L95
File: NounsDAOStorageV1Fork.sol
pragma solidity ^ 0.8.19 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOStorageV1Fork.sol#L3
File: INounsTokenFork.sol
pragma solidity ^ 0.8.19 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/INounsTokenFork.sol#L18
File: NounsTokenFork.sol
pragma solidity ^ 0.8.19 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/NounsTokenFork.sol#L18
File: ERC721CheckpointableUpgradeable .sol
pragma solidity ^ 0.8.19 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/base/ERC721CheckpointableUpgradeable.sol#L46
File: ERC20Transferer .sol
pragma solidity ^ 0.8.16 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/utils/ERC20Transferer.sol#L16
File: DeployDAOV3DataContractsBase.s.sol
pragma solidity ^ 0.8.15 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/DeployDAOV3DataContractsBase.s.sol#L2
File: DeployDAOV3DataContractsGoerli.s.sol
pragma solidity ^ 0.8.15 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/DeployDAOV3DataContractsGoerli.s.sol#L2
File: DeployDAOV3DataContractsSepolia.s.sol
pragma solidity ^ 0.8.15 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/DeployDAOV3DataContractsSepolia.s.sol#L2
File: DeployDAOV3NewContractsBase.s.sol
pragma solidity ^ 0.8.15 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/DeployDAOV3NewContractsBase.s.sol#L2
File: DeployDAOV3NewContractsMainnet.s.sol
pragma solidity ^ 0.8.15 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/DeployDAOV3NewContractsMainnet.s.sol#L2
File: DeployDAOV3NewContractsTestnet.s.sol
pragma solidity ^ 0.8.15 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/DeployDAOV3NewContractsTestnet.s.sol#L2
File: ProposeDAOV3UpgradeMainnet.s.sol
pragma solidity ^ 0.8.15 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L2
File: ProposeDAOV3UpgradeTestnet.s.sol
pragma solidity ^ 0.8.15 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L2
File: ProposeENSReverseLookupConfigMainnet.s.sol
pragma solidity ^ 0.8.15 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeENSReverseLookupConfigMainnet.s.sol#L2
File: ProposeTimelockMigrationCleanupMainnet.s.sol
pragma solidity ^ 0.8.15 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeTimelockMigrationCleanupMainnet.s.sol#L2
Recommended Mitigation Steps
Consider updating to a more recent solidity version.
Throughout the codebase, events are generally emitted when sensitive changes are made to the contracts. However, some events are missing important parameters
The following events should also add the previous original value in addition to the new value.
File: NounsDAOExecutor.sol
34 : event NewAdmin (address indexed newAdmin );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutor.sol#L34
File: NounsDAOExecutor.sol
35 : event NewPendingAdmin (address indexed newPendingAdmin );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutor.sol#L35
File: NounsDAOExecutor.sol
36 : event NewDelay (uint256 indexed newDelay );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutor.sol#L36
File: NounsDAOExecutorV2.sol
52 : event NewAdmin (address indexed newAdmin );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutorV2.sol#L52
File: NounsDAOExecutorV2.sol
53 : event NewPendingAdmin (address indexed newPendingAdmin );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutorV2.sol#L53
File: NounsDAOExecutorV2.sol
54 : event NewDelay (uint256 indexed newDelay );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutorV2.sol#L54
File: INounsTokenFork.sol
29 : event MinterUpdated (address minter );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/INounsTokenFork.sol#L29
File: INounsTokenFork.sol
33 : event DescriptorUpdated (INounsDescriptorMinimal descriptor );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/INounsTokenFork.sol#L33
File: INounsTokenFork.sol
37 : event SeederUpdated (INounsSeeder seeder );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/INounsTokenFork.sol#L37
Recommended Mitigation Steps
The events should include the new value and old value where possible.
Contracts are allowed to override their parents’ functions and change the visibility from external to public.
File: NounsDAOLogicV2.sol
function _setPendingVetoer (address newPendingVetoer ) public {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L876
File: NounsDAOLogicV3.sol
function proposalMaxOperations () public pure returns (uint256 ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV3.sol#L109
File: NounsDAOLogicV3.sol
function proposeOnTimelockV1 (
address [] memory targets ,
uint256 [] memory values ,
string [] memory signatures ,
bytes [] memory calldatas ,
string memory description
) public returns (uint256 ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV3.sol#L210
File: NounsDAOLogicV3.sol
function _setPendingVetoer (address newPendingVetoer ) public {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV3.sol#L718
File: NounsDAOLogicV3.sol
function _burnVetoPower () public {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV3.sol#L733
File: NounsDAOLogicV3.sol
function dynamicQuorumVotes (
uint256 againstVotes ,
uint256 adjustedTotalSupply_ ,
DynamicQuorumParams memory params
) public pure returns (uint256 ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV3.sol#L898
File: NounsDAOLogicV3.sol
function getDynamicQuorumParamsAt (uint256 blockNumber_ ) public view returns (DynamicQuorumParams memory ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV3.sol#L913
File: NounsDAOV3Admin.sol
function _setPendingVetoer (NounsDAOStorageV3.StorageV3 storage ds , address newPendingVetoer ) public {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L301
File: NounsDAOV3Admin.sol
function _setDynamicQuorumParams (
NounsDAOStorageV3.StorageV3 storage ds ,
uint16 newMinQuorumVotesBPS ,
uint16 newMaxQuorumVotesBPS ,
uint32 newQuorumCoefficient
) public onlyAdmin (ds) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L432
File: NounsDAOV3Fork.sol
function numTokensInForkEscrow (NounsDAOStorageV3.StorageV3 storage ds ) public view returns (uint256 ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/NounsDAOV3Fork.sol#L215
File: NounsDAOLogicV1Fork.sol
function erc20TokensToIncludeInQuitArray () public view returns (address [] memory ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L781
File: NounsTokenFork.sol
function dataURI (uint256 tokenId ) public view override returns (string memory ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/NounsTokenFork.sol#L231
File: DeployDAOV3DataContractsBase.s.sol
function run () public returns (NounsDAODataProxy dataProxy ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/DeployDAOV3DataContractsBase.s.sol#L20
File: DeployDAOV3NewContractsBase.s.sol
function run ()
public
returns (
NounsDAOForkEscrow forkEscrow ,
ForkDAODeployer forkDeployer ,
NounsDAOLogicV3 daoV3Impl ,
NounsDAOExecutorV2 timelockV2 ,
ERC20Transferer erc20Transferer
)
{
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/DeployDAOV3NewContractsBase.s.sol#L43
File: ProposeDAOV3UpgradeMainnet.s.sol
function run () public returns (uint256 proposalId ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L23
File: ProposeTimelockMigrationCleanupMainnet.s.sol
function run () public returns (uint256 proposalId ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeTimelockMigrationCleanupMainnet.s.sol#L22
File: NounsDAOExecutor.sol
186 : receive () external payable {}
188 : fallback () external payable {}
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutor.sol#L186
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutor.sol#L188
File: NounsDAOExecutorProxy.sol
27 : constructor (address logic , bytes memory data ) ERC1967Proxy (logic, data) {}
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutorProxy.sol#L27
File: NounsDAOExecutorV2.sol
209 : receive () external payable {}
211 : fallback () external payable {}
240 : * function _authorizeUpgrade (address ) internal override onlyOwner {}
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutorV2.sol#L209
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutorV2.sol#L211
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutorV2.sol#L240
File: NounsDAOLogicV2.sol
1090 : receive () external payable {}
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L1090
File: NounsDAOLogicV3.sol
1035 : receive () external payable {}
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV3.sol#L1035
File: NounsAuctionHouseFork.sol
281 : function _authorizeUpgrade (address ) internal view override onlyOwner {}
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/NounsAuctionHouseFork.sol#L281
File: NounsTokenFork.sol
327 : function _authorizeUpgrade (address ) internal view override onlyOwner {}
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/NounsTokenFork.sol#L327
File: DeployDAOV3DataContractsGoerli.s.sol
11 : constructor () DeployDAOV3DataContractsBase (NOUNS_DAO_PROXY_GOERLI, NOUNS_TIMELOCK_V2_PROXY_GOERLI) {}
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/DeployDAOV3DataContractsGoerli.s.sol#L11
File: DeployDAOV3DataContractsSepolia.s.sol
11 : constructor () DeployDAOV3DataContractsBase (NOUNS_DAO_PROXY_SEPOLIA, NOUNS_TIMELOCK_V2_PROXY_SEPOLIA) {}
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/DeployDAOV3DataContractsSepolia.s.sol#L11
File: DeployDAOV3NewContractsMainnet.s.sol
21 : {}
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/DeployDAOV3NewContractsMainnet.s.sol#L21
File: DeployDAOV3NewContractsTestnet.s.sol
21 : {}
38 : {}
21 : {}
38 : {}
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/DeployDAOV3NewContractsTestnet.s.sol#L21
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/DeployDAOV3NewContractsTestnet.s.sol#L38
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/DeployDAOV3NewContractsTestnet.s.sol#L21
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/DeployDAOV3NewContractsTestnet.s.sol#L38
File: ProposeDAOV3UpgradeTestnet.s.sol
155 : {}
172 : {}
155 : {}
172 : {}
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L155
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L172
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L155
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L172
forge-std
is used for logging and debugging purposes and should be removed when not used for development.
File: DeployDAOV3DataContractsBase.s.sol
4 : import 'forge-std/Script.sol ' ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/DeployDAOV3DataContractsBase.s.sol#L4
File: DeployDAOV3DataContractsGoerli.s.sol
4 : import 'forge-std/Script.sol ' ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/DeployDAOV3DataContractsGoerli.s.sol#L4
File: DeployDAOV3DataContractsSepolia.s.sol
4 : import 'forge-std/Script.sol ' ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/DeployDAOV3DataContractsSepolia.s.sol#L4
File: DeployDAOV3NewContractsBase.s.sol
4 : import 'forge-std/Script.sol ' ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/DeployDAOV3NewContractsBase.s.sol#L4
File: DeployDAOV3NewContractsMainnet.s.sol
4 : import 'forge-std/Script.sol ' ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/DeployDAOV3NewContractsMainnet.s.sol#L4
File: DeployDAOV3NewContractsTestnet.s.sol
4 : import 'forge-std/Script.sol ' ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/DeployDAOV3NewContractsTestnet.s.sol#L4
File: ProposeDAOV3UpgradeMainnet.s.sol
4 : import 'forge-std/Script.sol ' ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L4
File: ProposeDAOV3UpgradeTestnet.s.sol
4 : import 'forge-std/Script.sol ' ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L4
File: ProposeENSReverseLookupConfigMainnet.s.sol
4 : import 'forge-std/Script.sol ' ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeENSReverseLookupConfigMainnet.s.sol#L4
File: ProposeTimelockMigrationCleanupMainnet.s.sol
4 : import 'forge-std/Script.sol ' ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeTimelockMigrationCleanupMainnet.s.sol#L4
Note that there may be cases where an error superficially appears to be used, but this is only because there are multiple definitions of the error in different files. In such cases, the error definition should be moved into a separate file. The instances below are the unused definitions.
File: NounsTokenFork.sol
error OnlyOwner
error NoundersCannotBeAddressZero
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/NounsTokenFork.sol
See the Solidity Style Guide
File: NounsDAOExecutorV2.sol
82 : string public constant NAME = 'NounsDAOExecutorV2 ' ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutorV2.sol#L82
File: NounsAuctionHouseFork.sol
48 : string public constant NAME = 'NounsAuctionHouseFork ' ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/NounsAuctionHouseFork.sol#L48
File: NounsTokenFork.sol
46 : string public constant NAME = 'NounsTokenFork ' ;
85 : string private _contractURIHash = 'QmZi1n79FqWt2tTLwCqiy6nLM6xLGRsEPQ5JmReJQKNNzX ' ;
128 : __ERC721_init ('Nouns ' , 'NOUN ' );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/NounsTokenFork.sol#L46
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/NounsTokenFork.sol#L85
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/NounsTokenFork.sol#L128
File: DeployDAOV3DataContractsBase.s.sol
21 : uint256 deployerKey = vm.envUint ('DEPLOYER_PRIVATE_KEY ' );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/DeployDAOV3DataContractsBase.s.sol#L21
File: DeployDAOV3NewContractsBase.s.sol
53 : uint256 deployerKey = vm.envUint ('DEPLOYER_PRIVATE_KEY ' );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/DeployDAOV3NewContractsBase.s.sol#L53
File: ProposeDAOV3UpgradeMainnet.s.sol
24 : uint256 proposerKey = vm.envUint ('PROPOSER_KEY ' );
25 : address daoV3Implementation = vm.envAddress ('DAO_V3_IMPL ' );
26 : address timelockV2 = vm.envAddress ('TIMELOCK_V2 ' );
27 : address forkEscrow = vm.envAddress ('FORK_ESCROW ' );
28 : address forkDeployer = vm.envAddress ('FORK_DEPLOYER ' );
29 : address erc20Transferer = vm.envAddress ('ERC20_TRANSFERER ' );
31 : string memory description = vm.readFile (vm.envString ('PROPOSAL_DESCRIPTION_FILE ' ));
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L24
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L25
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L26
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L27
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L28
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L29
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L31
File: ProposeDAOV3UpgradeTestnet.s.sol
32 : uint256 proposerKey = vm.envUint ('PROPOSER_KEY ' );
33 : address daoV3Implementation = vm.envAddress ('DAO_V3_IMPL ' );
34 : address timelockV2 = vm.envAddress ('TIMELOCK_V2 ' );
35 : address forkEscrow = vm.envAddress ('FORK_ESCROW ' );
36 : address forkDeployer = vm.envAddress ('FORK_DEPLOYER ' );
37 : address erc20Transferer = vm.envAddress ('ERC20_TRANSFERER ' );
39 : string memory description = vm.readFile (vm.envString ('PROPOSAL_DESCRIPTION_FILE ' ));
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L32
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L33
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L34
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L35
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L36
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L37
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L39
File: ProposeENSReverseLookupConfigMainnet.s.sol
18 : uint256 proposerKey = vm.envUint ('PROPOSER_KEY ' );
19 : string memory description = vm.readFile (vm.envString ('PROPOSAL_DESCRIPTION_FILE ' ));
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeENSReverseLookupConfigMainnet.s.sol#L18-L19
File: ProposeTimelockMigrationCleanupMainnet.s.sol
23 : uint256 proposerKey = vm.envUint ('PROPOSER_KEY ' );
24 : address timelockV2 = vm.envAddress ('TIMELOCK_V2 ' );
25 : string memory description = vm.readFile (vm.envString ('PROPOSAL_DESCRIPTION_FILE ' ));
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeTimelockMigrationCleanupMainnet.s.sol#L23-L25
Earlier versions of solidity can use uint<n>(-1)
instead. Expressions not including the - 1
can often be re-written to accomodate the change (e.g. by using a >
rather than a >=
, which will also save some gas)
File: ERC721CheckpointableUpgradeable .sol
266 : require (n < 2 ** 32 , errorMessage);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/base/ERC721CheckpointableUpgradeable.sol#L266
File: ERC721CheckpointableUpgradeable .sol
271 : require (n < 2 ** 96 , errorMessage);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/base/ERC721CheckpointableUpgradeable.sol#L271
The use of underscore at the end of the variable name is uncommon and also suggests that the variable name was not completely changed. Consider refactoring variableName_
to variableName
.
File: NounsDAOExecutor.sol
76 : admin_;
77 : delay_;
84 : delay_;
77 : delay_;
84 : delay_;
102 : pendingAdmin_;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutor.sol#L76
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutor.sol#L77
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutor.sol#L84
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutor.sol#L77
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutor.sol#L84
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutor.sol#L102
File: NounsDAOExecutorV2.sol
99 : admin_;
100 : delay_;
107 : delay_;
100 : delay_;
107 : delay_;
125 : pendingAdmin_;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutorV2.sol#L99
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutorV2.sol#L100
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutorV2.sol#L107
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutorV2.sol#L100
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutorV2.sol#L107
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutorV2.sol#L125
File: NounsDAOLogicV2.sol
169 : vetoer_;
170 : votingPeriod_;
171 : votingDelay_;
172 : proposalThresholdBPS_;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L169-L172
File: NounsDAOLogicV3.sol
162 : vetoer_;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV3.sol#L162
File: NounsDAOProxy.sol
71 : admin_;
83 : implementation_;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOProxy.sol#L71
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOProxy.sol#L83
File: NounsDAOV3Proposals.sol
905 : proposalThreshold_;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L905
File: ForkDAODeployer.sol
72 : tokenImpl_;
73 : auctionImpl_;
74 : governorImpl_;
75 : treasuryImpl_;
76 : delayedGovernanceMaxDuration_;
77 : initialVotingPeriod_;
78 : initialVotingDelay_;
79 : initialProposalThresholdBPS_;
80 : initialQuorumVotesBPS_;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/ForkDAODeployer.sol#L72-L80
File: NounsDAOForkEscrow.sol
64 : dao_;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/NounsDAOForkEscrow.sol#L64
File: NounsDAOLogicV1Fork.sol
185 : timelock_;
188 : votingPeriod_;
189 : votingDelay_;
190 : proposalThresholdBPS_;
191 : quorumVotesBPS_;
192 : erc20TokensToIncludeInQuit_;
193 : delayedGovernanceExpirationTimestamp_;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L185
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L188
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L189
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L190
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L191
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L192
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L193
File: ProposeDAOV3UpgradeTestnet.s.sol
25 : daoProxy_;
26 : timelockV1_;
27 : auctionHouseProxy_;
28 : stETH_;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L25-L28
Use (e.g. 1e6) rather than decimal literals (e.g. 100000), for better code readability.
File: NounsDAOLogicV2.sol
967 : uint256 againstVotesBPS = (10000 * againstVotes) / totalSupply;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L967
File: NounsDAOLogicV2.sol
1067 : return (number * bps) / 10000 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L1067
File: NounsDAOV3DynamicQuorum.sol
63 : uint256 againstVotesBPS = (10000 * againstVotes) / totalSupply;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3DynamicQuorum.sol#L63
File: NounsDAOV3DynamicQuorum.sol
162 : return (number * bps) / 10000 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3DynamicQuorum.sol#L162
File: NounsDAOV3Proposals.sol
1016 : return (number * bps) / 10000 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L1016
File: NounsDAOLogicV1Fork.sol
786 : return (number * bps) / 10000 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L786
File: ProposeDAOV3UpgradeMainnet.s.sol
14 : uint256 public constant ETH_TO_SEND_TO_NEW_TIMELOCK = 10000 ether ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L14
Solidity version 0.8.4 introduces bytes.concat()
(vs abi.encodePacked(<bytes>,<bytes>)
)
File: NounsDAOExecutor.sol
169 : callData = abi.encodePacked (bytes4 (keccak256 (bytes (signature))), data)
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutor.sol#L169
File: NounsDAOExecutorV2.sol
192 : callData = abi.encodePacked (bytes4 (keccak256 (bytes (signature))), data)
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutorV2.sol#L192
File: NounsDAOLogicV2.sol
598 : bytes32 digest = keccak256 (abi.encodePacked ('/x19/x01 ' , domainSeparator, structHash))
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L598
File: NounsDAOV3Proposals.sol
404 : bytes memory proposalEncodeData = abi.encodePacked (
proposalId,
calcProposalEncodeData (msg .sender , txs, description)
)
872 : keccak256 (abi.encodePacked (txs.targets)),
keccak256 (abi.encodePacked (txs.values)),
keccak256 (abi.encodePacked (signatureHashes)),
keccak256 (abi.encodePacked (calldatasHashes)),
keccak256 (bytes (description))
)
1006 : bytes32 structHash = keccak256 (abi.encodePacked (typehash, proposalEncodeData, expirationTimestamp))
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L404
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L872
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L1006
File: NounsDAOV3Votes.sol
168 : bytes32 digest = keccak256 (abi.encodePacked ('/x19/x01 ' , domainSeparator, structHash))
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Votes.sol#L168
File: NounsDAOLogicV1Fork.sol
599 : bytes32 digest = keccak256 (abi.encodePacked ('/x19/x01 ' , domainSeparator, structHash))
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L599
File: NounsTokenFork.sol
191 : return string (abi.encodePacked ('ipfs:// ' , _contractURIHash))
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/NounsTokenFork.sol#L191
File: ERC721CheckpointableUpgradeable .sol
150 : bytes32 digest = keccak256 (abi.encodePacked ('/x19/x01 ' , domainSeparator, structHash))
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/base/ERC721CheckpointableUpgradeable.sol#L150
Recommended Mitigation Steps
Use bytes.concat()
and upgrade to at least Solidity version 0.8.4 if required.
File: NounsDAOExecutorV2.sol
84 : /// @dev increased grace period from 14 days to 21 days to allow more time in case of a forking period
uint256 public constant GRACE_PERIOD = 21 days ;
uint256 public constant MINIMUM_DELAY = 2 days ;
uint256 public constant MAXIMUM_DELAY = 30 days ;
address public admin;
address public pendingAdmin;
uint256 public delay;
mapping (bytes32 => bool ) public queuedTransactions;
function initialize (address admin_ , uint256 delay_ ) public virtual initializer {
233 : /**
* @dev Function that should revert when `msg.sender` is not authorized to upgrade the contract. Called by
* {upgradeTo} and {upgradeToAndCall}.
*
* Normally, this function will use an xref:access.adoc[access control] modifier such as {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutorV2.sol#L84
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutorV2.sol#L233
File: NounsDAOProxy.sol
103 : /**
* @dev Delegates execution to an implementation contract.
* It returns to the external caller whatever the implementation returns
* or forwards reverts.
*/
function _fallback () internal {
126 : /**
* @dev Fallback function that delegates calls to the `implementation`. Will run if no other
* function in the contract matches the call data.
*/
fallback () external payable {
134 : /**
* @dev Fallback function that delegates calls to `implementation`. Will run if call data
* is empty.
*/
receive () external payable {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOProxy.sol#L103
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOProxy.sol#L126
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOProxy.sol#L134
File: NounsDAOV3Proposals.sol
811 : /**
* @dev Extracted this function to fix the `Stack too deep` error `proposeBySigs` hit.
*/
function verifySignersCanBackThisProposalAndCountTheirVotes (
NounsDAOStorageV3.StorageV3 storage ds ,
NounsDAOStorageV3.ProposerSignature[] memory proposerSignatures ,
ProposalTxs memory txs ,
string memory description ,
uint256 proposalId
) internal returns (uint256 votes , address [] memory signers ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L811
File: ForkDAODeployer.sol
131 : /**
* @dev Used to prevent the 'Stack too deep' error in the main deploy function.
*/
function initDAO (
address governor ,
address treasury ,
address token ,
NounsDAOExecutorV2 originalTimelock
) internal {
153 : /**
* @dev Used to prevent the 'Stack too deep' error in the main deploy function.
*/
function getOriginalTimelock (INounsDAOForkEscrow forkEscrow ) internal view returns (NounsDAOExecutorV2) {
161 : /**
* @dev Used to prevent the 'Stack too deep' error in the main deploy function.
*/
function getOriginalAuction (INounsDAOForkEscrow forkEscrow ) internal view returns (NounsAuctionHouse) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/ForkDAODeployer.sol#L131
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/ForkDAODeployer.sol#L153
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/ForkDAODeployer.sol#L161
File: NounsAuctionHouseFork.sol
277 : /**
* @dev Reverts when `msg.sender` is not the owner of this contract; in the case of Noun DAOs it should be the
* DAO's treasury contract.
*/
function _authorizeUpgrade (address ) internal view override onlyOwner {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/NounsAuctionHouseFork.sol#L277
File: NounsTokenFork.sol
3 : /// @title The Nouns ERC-721 token, adjusted for forks
/*********************************
* ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ *
* ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ *
* ░░░░░░█████████░░█████████░░░ *
* ░░░░░░██░░░████░░██░░░████░░░ *
* ░░██████░░░████████░░░████░░░ *
* ░░██░░██░░░████░░██░░░████░░░ *
* ░░██░░██░░░████░░██░░░████░░░ *
* ░░░░░░█████████░░█████████░░░ *
* ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ *
* ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ *
*********************************/
pragma solidity ^ 0.8.19 ;
import { OwnableUpgradeable } from '@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol ' ;
import { ERC721CheckpointableUpgradeable } from './base/ERC721CheckpointableUpgradeable.sol ' ;
import { INounsDescriptorMinimal } from '../../../../interfaces/INounsDescriptorMinimal.sol ' ;
import { INounsSeeder } from '../../../../interfaces/INounsSeeder.sol ' ;
import { INounsTokenFork } from './INounsTokenFork.sol ' ;
import { IERC721 } from '@openzeppelin/contracts/token/ERC721/IERC721.sol ' ;
import { UUPSUpgradeable } from '@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol ' ;
import { INounsDAOForkEscrow } from '../../../NounsDAOInterfaces.sol ' ;
/**
* @dev This contract is a fork of NounsToken, with the following changes:
* - Added upgradeablity via UUPSUpgradeable.
* - Inheriting from an unmodified ERC721, so that the double Transfer event emission that
* NounsToken performs is gone, in favor of the standard single event.
* - Added functions to claim tokens from a Nouns Fork escrow, or during the forking period.
* - Removed the proxyRegistry feature that whitelisted OpenSea.
* - Removed `noundersDAO` and the founder reward every 10 mints.
* For additional context see `ERC721CheckpointableUpgradeable`.
*/
contract NounsTokenFork is INounsTokenFork , OwnableUpgradeable , ERC721CheckpointableUpgradeable , UUPSUpgradeable {
323 : /**
* @dev Reverts when `msg.sender` is not the owner of this contract; in the case of Noun DAOs it should be the
* DAO's treasury contract.
*/
function _authorizeUpgrade (address ) internal view override onlyOwner {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/NounsTokenFork.sol#L3
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/NounsTokenFork.sol#L323
Code base has an extensive use of named function calls, but it somehow missed one instance where this would be appropriate.
It should use named function calls on function call, as such:
library.exampleFunction {value: _data.amount.value}({
_id: _data.id,
_amount: _data.amount.value,
_token: _data.token,
_example: "" ,
_metadata: _data.metadata
});
File: NounsDAOExecutor.sol
173 : (bool success , bytes memory returnData ) = target.call { value: value }(callData);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutor.sol#L173
File: NounsDAOExecutorV2.sol
196 : (bool success , bytes memory returnData ) = target.call { value: value }(callData);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutorV2.sol#L196
File: NounsDAOLogicV2.sol
824 : (bool sent , ) = msg .sender .call { value: amount }('' );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L824
File: NounsDAOLogicV2.sol
1043 : (bool refundSent , ) = tx .origin .call { value: refundAmount }('' );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L1043
File: NounsDAOV3Admin.sol
470 : (bool sent , ) = msg .sender .call { value: amount }('' );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L470
File: NounsDAOV3Votes.sol
305 : (bool refundSent , ) = msg .sender .call { value: refundAmount }('' );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Votes.sol#L305
File: NounsAuctionHouseFork.sol
273 : (bool success , ) = to.call { value: value, gas: 30_000 }(new bytes (0 ));
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/NounsAuctionHouseFork.sol#L273
File: NounsDAOLogicV2.sol
967 : uint256 againstVotesBPS = (10000 * againstVotes) / totalSupply;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L967
File: NounsDAOLogicV2.sol
1067 : return (number * bps) / 10000 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L1067
File: NounsDAOV3DynamicQuorum.sol
63 : uint256 againstVotesBPS = (10000 * againstVotes) / totalSupply;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3DynamicQuorum.sol#L63
File: NounsDAOV3DynamicQuorum.sol
162 : return (number * bps) / 10000 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3DynamicQuorum.sol#L162
File: NounsDAOV3Proposals.sol
1016 : return (number * bps) / 10000 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L1016
File: NounsDAOLogicV1Fork.sol
786 : return (number * bps) / 10000 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L786
File: ProposeDAOV3UpgradeMainnet.s.sol
14 : uint256 public constant ETH_TO_SEND_TO_NEW_TIMELOCK = 10000 ether ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L14
Using a cast on a single argument, rather than abi.encodePacked() makes the intended operation more clear, leading to less reviewer confusion.
File: NounsDAOExecutor.sol
169 : callData = abi.encodePacked (bytes4 (keccak256 (bytes (signature))), data);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutor.sol#L169
File: NounsDAOExecutorV2.sol
192 : callData = abi.encodePacked (bytes4 (keccak256 (bytes (signature))), data);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutorV2.sol#L192
File: NounsDAOV3Proposals.sol
872 : keccak256 (abi.encodePacked (txs.targets)),
873 : keccak256 (abi.encodePacked (txs.values)),
874 : keccak256 (abi.encodePacked (signatureHashes)),
875 : keccak256 (abi.encodePacked (calldatasHashes)),
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L872-L875
As part of the upgradeability of Proxies , the contract can be upgraded multiple times, where it is a systematic approach to record the version of each upgrade.
File: NounsDAOExecutorV2.sol
240 : * function _authorizeUpgrade (address ) internal override onlyOwner {}
243 : function _authorizeUpgrade (address ) internal view override {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutorV2.sol#L240
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutorV2.sol#L243
File: NounsAuctionHouseFork.sol
281 : function _authorizeUpgrade (address ) internal view override onlyOwner {}
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/NounsAuctionHouseFork.sol#L281
File: NounsDAOLogicV1Fork.sol
789 : function _authorizeUpgrade (address ) internal view override {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L789
File: NounsTokenFork.sol
327 : function _authorizeUpgrade (address ) internal view override onlyOwner {}
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/NounsTokenFork.sol#L327
Recommended Mitigation Steps
I suggest implementing some kind of version counter that will be incremented automatically when you upgrade the contract.
For example
uint256 public authorizeUpgradeCounter;
function _authorizeUpgrade (address newImplementation ) internal {
authorizeUpgradeCounter+= 1 ;
}
See for more information: https://github.com/ConnorBlockchain/Solidity-Encode-Gas-Comparison
File: NounsDAOExecutor.sol
120 : bytes32 txHash = keccak256 (abi.encode (target, value, signature, data, eta));
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutor.sol#L120
File: NounsDAOExecutor.sol
136 : bytes32 txHash = keccak256 (abi.encode (target, value, signature, data, eta));
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutor.sol#L136
File: NounsDAOExecutor.sol
151 : bytes32 txHash = keccak256 (abi.encode (target, value, signature, data, eta));
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutor.sol#L151
File: NounsDAOExecutorV2.sol
143 : bytes32 txHash = keccak256 (abi.encode (target, value, signature, data, eta));
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutorV2.sol#L143
File: NounsDAOExecutorV2.sol
159 : bytes32 txHash = keccak256 (abi.encode (target, value, signature, data, eta));
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutorV2.sol#L159
File: NounsDAOExecutorV2.sol
174 : bytes32 txHash = keccak256 (abi.encode (target, value, signature, data, eta));
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutorV2.sol#L174
File: NounsDAOLogicV2.sol
326 : ! timelock.queuedTransactions (keccak256 (abi.encode (target, value, signature, data, eta))),
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L326
File: NounsDAOLogicV2.sol
595 : abi.encode (DOMAIN_TYPEHASH, keccak256 (bytes (name)), getChainIdInternal (), address (this ))
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L595
File: NounsDAOLogicV2.sol
597 : bytes32 structHash = keccak256 (abi.encode (BALLOT_TYPEHASH, proposalId, support));
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L597
File: NounsDAOV3Proposals.sol
469 : ! timelock.queuedTransactions (keccak256 (abi.encode (target, value, signature, data, eta))),
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L469
File: NounsDAOV3Proposals.sol
870 : abi.encode (
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L870
File: NounsDAOV3Proposals.sol
1009 : abi.encode (DOMAIN_TYPEHASH, keccak256 (bytes ('Nouns DAO ' )), block .chainid , verifyingContract)
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L1009
File: NounsDAOV3Votes.sol
165 : abi.encode (DOMAIN_TYPEHASH, keccak256 (bytes (name)), block .chainid , address (this ))
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Votes.sol#L165
File: NounsDAOV3Votes.sol
167 : bytes32 structHash = keccak256 (abi.encode (BALLOT_TYPEHASH, proposalId, support));
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Votes.sol#L167
File: NounsDAOLogicV1Fork.sol
418 : ! timelock.queuedTransactions (keccak256 (abi.encode (target, value, signature, data, eta))),
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L418
File: NounsDAOLogicV1Fork.sol
596 : abi.encode (DOMAIN_TYPEHASH, keccak256 (bytes (name)), block .chainid , address (this ))
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L596
File: NounsDAOLogicV1Fork.sol
598 : bytes32 structHash = keccak256 (abi.encode (BALLOT_TYPEHASH, proposalId, support));
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L598
File: ERC721CheckpointableUpgradeable .sol
147 : abi.encode (DOMAIN_TYPEHASH, keccak256 (bytes (name ())), block .chainid , address (this ))
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/base/ERC721CheckpointableUpgradeable.sol#L147
File: ERC721CheckpointableUpgradeable .sol
149 : bytes32 structHash = keccak256 (abi.encode (DELEGATION_TYPEHASH, delegatee, nonce, expiry));
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/base/ERC721CheckpointableUpgradeable.sol#L149
File: ProposeDAOV3UpgradeMainnet.s.sol
86 : calldatas[i] = abi.encode (daoV3Implementation);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L86
File: ProposeDAOV3UpgradeMainnet.s.sol
110 : calldatas[i] = abi.encode (timelockV2);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L110
File: ProposeDAOV3UpgradeMainnet.s.sol
116 : calldatas[i] = abi.encode (erc20Transferer, type (uint256 ).max);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L116
File: ProposeDAOV3UpgradeMainnet.s.sol
122 : calldatas[i] = abi.encode (STETH_MAINNET, timelockV2);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L122
File: ProposeDAOV3UpgradeMainnet.s.sol
143 : calldatas[i] = abi.encode (timelockV2, NOUNS_TIMELOCK_V1_MAINNET, timelockV2);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L143
File: ProposeDAOV3UpgradeTestnet.s.sol
93 : calldatas[i] = abi.encode (daoV3Implementation);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L93
File: ProposeDAOV3UpgradeTestnet.s.sol
117 : calldatas[i] = abi.encode (timelockV2);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L117
File: ProposeDAOV3UpgradeTestnet.s.sol
123 : calldatas[i] = abi.encode (erc20Transferer, type (uint256 ).max);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L123
File: ProposeDAOV3UpgradeTestnet.s.sol
129 : calldatas[i] = abi.encode (stETH, timelockV2);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L129
File: ProposeDAOV3UpgradeTestnet.s.sol
135 : calldatas[i] = abi.encode (timelockV2, timelockV1, timelockV2);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L135
File: ProposeENSReverseLookupConfigMainnet.s.sol
44 : calldatas[i] = abi.encode ('nouns.eth ' );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeENSReverseLookupConfigMainnet.s.sol#L44
File: ProposeTimelockMigrationCleanupMainnet.s.sol
63 : calldatas[i] = abi.encode (timelockV2);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeTimelockMigrationCleanupMainnet.s.sol#L63
File: ProposeTimelockMigrationCleanupMainnet.s.sol
77 : calldatas[i] = abi.encode (timelockV2, true );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeTimelockMigrationCleanupMainnet.s.sol#L77
File: ProposeTimelockMigrationCleanupMainnet.s.sol
84 : calldatas[i] = abi.encode (timelockV1, timelockV2, 687 );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeTimelockMigrationCleanupMainnet.s.sol#L84
The IR-based code generator was introduced with an aim to not only allow code generation to be more transparent and auditable but also to enable more powerful optimization passes that span across functions.
You can enable it on the command line using --via-ir
or with the option {"viaIR": true}
.
This will take longer to compile, but you can just simple test it before deploying and if you got a better benchmark then you can add --via-ir to your deploy command
More on: https://docs.soliditylang.org/en/v0.8.17/ir-breaking-changes.html
The overheads outlined below are PER LOOP, excluding the first loop
storage arrays incur a Gwarmaccess (100 gas)
memory arrays use MLOAD (3 gas)
calldata arrays use CALLDATALOAD (3 gas)
Caching the length changes each of these to a DUP (3 gas), and gets rid of the extra DUP needed to store the stack offset
File: NounsDAOLogicV2.sol
305 : for (uint256 i = 0 ; i < proposal.targets.length ; i++ ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L305
File: NounsDAOLogicV2.sol
343 : for (uint256 i = 0 ; i < proposal.targets.length ; i++ ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L343
File: NounsDAOLogicV2.sol
372 : for (uint256 i = 0 ; i < proposal.targets.length ; i++ ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L372
File: NounsDAOLogicV2.sol
405 : for (uint256 i = 0 ; i < proposal.targets.length ; i++ ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L405
File: NounsDAOV3Admin.sol
602 : for (uint256 i = 0 ; i < erc20tokens.length - 1 ; i++ ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L602
File: NounsDAOV3Admin.sol
603 : for (uint256 j = i + 1 ; j < erc20tokens.length ; j++ ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L603
File: NounsDAOV3Proposals.sol
409 : for (uint256 i = 0 ; i < proposerSignatures.length ; ++ i) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L409
File: NounsDAOV3Proposals.sol
446 : for (uint256 i = 0 ; i < proposal.targets.length ; i++ ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L446
File: NounsDAOV3Proposals.sol
508 : for (uint256 i = 0 ; i < proposal.targets.length ; i++ ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L508
File: NounsDAOV3Proposals.sol
553 : for (uint256 i = 0 ; i < proposal.targets.length ; i++ ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L553
File: NounsDAOV3Proposals.sol
590 : for (uint256 i = 0 ; i < signers.length ; ++ i) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L590
File: NounsDAOV3Proposals.sol
602 : for (uint256 i = 0 ; i < proposal.targets.length ; i++ ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L602
File: NounsDAOV3Proposals.sol
826 : for (uint256 i = 0 ; i < proposerSignatures.length ; ++ i) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L826
File: NounsDAOV3Proposals.sol
860 : for (uint256 i = 0 ; i < txs.signatures.length ; ++ i) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L860
File: NounsDAOV3Proposals.sol
865 : for (uint256 i = 0 ; i < txs.calldatas.length ; ++ i) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L865
File: NounsDAOForkEscrow.sol
117 : for (uint256 i = 0 ; i < tokenIds.length ; i++ ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/NounsDAOForkEscrow.sol#L117
File: NounsDAOForkEscrow.sol
148 : for (uint256 i = 0 ; i < tokenIds.length ; i++ ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/NounsDAOForkEscrow.sol#L148
File: NounsDAOV3Fork.sol
83 : for (uint256 i = 0 ; i < tokenIds.length ; i++ ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/NounsDAOV3Fork.sol#L83
File: NounsDAOV3Fork.sol
153 : for (uint256 i = 0 ; i < tokenIds.length ; i++ ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/NounsDAOV3Fork.sol#L153
File: NounsDAOLogicV1Fork.sol
209 : for (uint256 i = 0 ; i < erc20TokensToInclude.length ; i++ ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L209
File: NounsDAOLogicV1Fork.sol
223 : for (uint256 i = 0 ; i < tokenIds.length ; i++ ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L223
File: NounsDAOLogicV1Fork.sol
231 : for (uint256 i = 0 ; i < erc20TokensToInclude.length ; i++ ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L231
File: NounsDAOLogicV1Fork.sol
248 : for (uint256 i = 0 ; i < addresses.length ; i++ ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L248
File: NounsDAOLogicV1Fork.sol
397 : for (uint256 i = 0 ; i < proposal.targets.length ; i++ ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L397
File: NounsDAOLogicV1Fork.sol
435 : for (uint256 i = 0 ; i < proposal.targets.length ; i++ ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L435
File: NounsDAOLogicV1Fork.sol
462 : for (uint256 i = 0 ; i < proposal.targets.length ; i++ ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L462
File: NounsDAOLogicV1Fork.sol
796 : for (uint256 i = 0 ; i < erc20tokens.length - 1 ; i++ ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L796
File: NounsDAOLogicV1Fork.sol
797 : for (uint256 j = i + 1 ; j < erc20tokens.length ; j++ ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L797
File: NounsTokenFork.sol
149 : for (uint256 i = 0 ; i < tokenIds.length ; i++ ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/NounsTokenFork.sol#L149
File: NounsTokenFork.sol
172 : for (uint256 i = 0 ; i < tokenIds.length ; i++ ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/NounsTokenFork.sol#L172
We can use assembly to emit events efficiently by utilizing scratch space
and the free memory pointer
. This will allow us to potentially avoid memory expansion costs.
Note: In order to do this optimization safely, we will need to cache and restore the free memory pointer.
For example, for a generic emit
event for eventSentAmountExample
:
// uint256 id, uint256 value, uint256 amount
emit eventSentAmountExample (id, value, amount);
We can use the following assembly emit events:
assembly {
let memptr := mload (0x40 )
mstore (0x00 , calldataload (0x44 ))
mstore (0x20 , calldataload (0xa4 ))
mstore (0x40 , amount)
log1 (
0x00 ,
0x60 ,
// keccak256("eventSentAmountExample(uint256,uint256,uint256)")
0xa622cf392588fbf2cd020ff96b2f4ebd9c76d7a4bc7f3e6b2f18012312e76bc3
)
mstore (0x40 , memptr)
}
File: NounsDAOExecutor.sol
86 : emit NewDelay (delay);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutor.sol#L86
File: NounsDAOExecutor.sol
94 : emit NewAdmin (admin);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutor.sol#L94
File: NounsDAOExecutor.sol
104 : emit NewPendingAdmin (pendingAdmin);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutor.sol#L104
File: NounsDAOExecutor.sol
123 : emit QueueTransaction (txHash, target, value, signature, data, eta);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutor.sol#L123
File: NounsDAOExecutor.sol
139 : emit CancelTransaction (txHash, target, value, signature, data, eta);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutor.sol#L139
File: NounsDAOExecutor.sol
176 : emit ExecuteTransaction (txHash, target, value, signature, data, eta);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutor.sol#L176
File: NounsDAOExecutorV2.sol
109 : emit NewDelay (delay_);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutorV2.sol#L109
File: NounsDAOExecutorV2.sol
117 : emit NewAdmin (msg .sender );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutorV2.sol#L117
File: NounsDAOExecutorV2.sol
127 : emit NewPendingAdmin (pendingAdmin_);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutorV2.sol#L127
File: NounsDAOExecutorV2.sol
146 : emit QueueTransaction (txHash, target, value, signature, data, eta);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutorV2.sol#L146
File: NounsDAOExecutorV2.sol
162 : emit CancelTransaction (txHash, target, value, signature, data, eta);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutorV2.sol#L162
File: NounsDAOExecutorV2.sol
199 : emit ExecuteTransaction (txHash, target, value, signature, data, eta);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutorV2.sol#L199
File: NounsDAOExecutorV2.sol
218 : emit ETHSent (recipient, ethToSend);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutorV2.sol#L218
File: NounsDAOExecutorV2.sol
230 : emit ERC20Sent (recipient, erc20Token, tokensToSend);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutorV2.sol#L230
File: NounsDAOLogicV2.sol
163 : emit VotingPeriodSet (votingPeriod, votingPeriod_);
164 : emit VotingDelaySet (votingDelay, votingDelay_);
165 : emit ProposalThresholdBPSSet (proposalThresholdBPS, proposalThresholdBPS_);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L163-L165
File: NounsDAOLogicV2.sol
315 : emit ProposalQueued (proposalId, eta);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L315
File: NounsDAOLogicV2.sol
352 : emit ProposalExecuted (proposalId);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L352
File: NounsDAOLogicV2.sol
382 : emit ProposalCanceled (proposalId);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L382
File: NounsDAOLogicV2.sol
415 : emit ProposalVetoed (proposalId);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L415
File: NounsDAOLogicV2.sol
513 : emit VoteCast (msg .sender , proposalId, support, castVoteInternal (msg .sender , proposalId, support), '' );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L513
File: NounsDAOLogicV2.sol
563 : emit VoteCast (msg .sender , proposalId, support, votes, reason);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L563
File: NounsDAOLogicV2.sol
580 : emit VoteCast (msg .sender , proposalId, support, castVoteInternal (msg .sender , proposalId, support), reason);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L580
File: NounsDAOLogicV2.sol
601 : emit VoteCast (signatory, proposalId, support, castVoteInternal (signatory, proposalId, support), '' );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L601
File: NounsDAOLogicV2.sol
655 : emit VotingDelaySet (oldVotingDelay, votingDelay);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L655
File: NounsDAOLogicV2.sol
673 : emit VotingPeriodSet (oldVotingPeriod, votingPeriod);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L673
File: NounsDAOLogicV2.sol
693 : emit ProposalThresholdBPSSet (oldProposalThresholdBPS, proposalThresholdBPS);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L693
File: NounsDAOLogicV2.sol
723 : emit MinQuorumVotesBPSSet (oldMinQuorumVotesBPS, newMinQuorumVotesBPS);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L723
File: NounsDAOLogicV2.sol
752 : emit MaxQuorumVotesBPSSet (oldMaxQuorumVotesBPS, newMaxQuorumVotesBPS);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L752
File: NounsDAOLogicV2.sol
770 : emit QuorumCoefficientSet (oldQuorumCoefficient, newQuorumCoefficient);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L770
File: NounsDAOLogicV2.sol
813 : emit MinQuorumVotesBPSSet (oldParams.minQuorumVotesBPS, params.minQuorumVotesBPS);
814 : emit MaxQuorumVotesBPSSet (oldParams.maxQuorumVotesBPS, params.maxQuorumVotesBPS);
815 : emit QuorumCoefficientSet (oldParams.quorumCoefficient, params.quorumCoefficient);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L813-L815
File: NounsDAOLogicV2.sol
826 : emit Withdraw (amount, sent);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L826
File: NounsDAOLogicV2.sol
847 : emit NewPendingAdmin (oldPendingAdmin, newPendingAdmin);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L847
File: NounsDAOLogicV2.sol
868 : emit NewAdmin (oldAdmin, admin);
869 : emit NewPendingAdmin (oldPendingAdmin, pendingAdmin);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L868-L869
File: NounsDAOLogicV2.sol
881 : emit NewPendingVetoer (pendingVetoer, newPendingVetoer);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L881
File: NounsDAOLogicV2.sol
892 : emit NewVetoer (vetoer, pendingVetoer);
896 : emit NewPendingVetoer (pendingVetoer, address (0 ));
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L892
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L896
File: NounsDAOLogicV2.sol
909 : emit NewVetoer (vetoer, address (0 ));
913 : emit NewPendingVetoer (pendingVetoer, address (0 ));
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L909
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L913
File: NounsDAOLogicV2.sol
1044 : emit RefundableVote (tx .origin , refundAmount, refundSent);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L1044
File: NounsDAOProxy.sol
85 : emit NewImplementation (oldImplementation, implementation);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOProxy.sol#L85
File: NounsDAOV3Admin.sol
170 : emit VotingDelaySet (oldVotingDelay, newVotingDelay);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L170
File: NounsDAOV3Admin.sol
185 : emit VotingPeriodSet (oldVotingPeriod, newVotingPeriod);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L185
File: NounsDAOV3Admin.sol
205 : emit ProposalThresholdBPSSet (oldProposalThresholdBPS, newProposalThresholdBPS);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L205
File: NounsDAOV3Admin.sol
222 : emit ObjectionPeriodDurationSet (oldObjectionPeriodDurationInBlocks, newObjectionPeriodDurationInBlocks);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L222
File: NounsDAOV3Admin.sol
236 : emit LastMinuteWindowSet (oldLastMinuteWindowInBlocks, newLastMinuteWindowInBlocks);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L236
File: NounsDAOV3Admin.sol
253 : emit ProposalUpdatablePeriodSet (oldProposalUpdatablePeriodInBlocks, newProposalUpdatablePeriodInBlocks);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L253
File: NounsDAOV3Admin.sol
269 : emit NewPendingAdmin (oldPendingAdmin, newPendingAdmin);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L269
File: NounsDAOV3Admin.sol
293 : emit NewAdmin (oldAdmin, ds.admin);
294 : emit NewPendingAdmin (oldPendingAdmin, address (0 ));
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L293-L294
File: NounsDAOV3Admin.sol
306 : emit NewPendingVetoer (ds.pendingVetoer, newPendingVetoer);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L306
File: NounsDAOV3Admin.sol
320 : emit NewVetoer (ds.vetoer, ds.pendingVetoer);
324 : emit NewPendingVetoer (ds.pendingVetoer, address (0 ));
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L320
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L324
File: NounsDAOV3Admin.sol
337 : emit NewVetoer (ds.vetoer, address (0 ));
341 : emit NewPendingVetoer (ds.pendingVetoer, address (0 ));
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L337
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L341
File: NounsDAOV3Admin.sol
372 : emit MinQuorumVotesBPSSet (oldMinQuorumVotesBPS, newMinQuorumVotesBPS);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L372
File: NounsDAOV3Admin.sol
401 : emit MaxQuorumVotesBPSSet (oldMaxQuorumVotesBPS, newMaxQuorumVotesBPS);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L401
File: NounsDAOV3Admin.sol
419 : emit QuorumCoefficientSet (oldQuorumCoefficient, newQuorumCoefficient);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L419
File: NounsDAOV3Admin.sol
460 : emit MinQuorumVotesBPSSet (oldParams.minQuorumVotesBPS, params.minQuorumVotesBPS);
461 : emit MaxQuorumVotesBPSSet (oldParams.maxQuorumVotesBPS, params.maxQuorumVotesBPS);
462 : emit QuorumCoefficientSet (oldParams.quorumCoefficient, params.quorumCoefficient);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L460-L462
File: NounsDAOV3Admin.sol
472 : emit Withdraw (amount, sent);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L472
File: NounsDAOV3Admin.sol
507 : emit ForkDAODeployerSet (oldForkDAODeployer, newForkDAODeployer);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L507
File: NounsDAOV3Admin.sol
519 : emit ERC20TokensToIncludeInForkSet (ds.erc20TokensToIncludeInFork, erc20tokens);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L519
File: NounsDAOV3Admin.sol
528 : emit ForkEscrowSet (address (ds.forkEscrow), newForkEscrow);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L528
File: NounsDAOV3Admin.sol
542 : emit ForkPeriodSet (ds.forkPeriod, newForkPeriod);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L542
File: NounsDAOV3Admin.sol
555 : emit ForkThresholdSet (ds.forkThresholdBPS, newForkThresholdBPS);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L555
File: NounsDAOV3Admin.sol
576 : emit TimelocksAndAdminSet (timelock, timelockV1, admin);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L576
File: NounsDAOV3Proposals.sol
184 : emitNewPropEvents (newProposal, new address [](0 ), ds.minQuorumVotes (adjustedTotalSupply), txs, description);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L184
File: NounsDAOV3Proposals.sol
207 : emit ProposalCreatedOnTimelockV1 (newProposalId);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L207
File: NounsDAOV3Proposals.sol
256 : emitNewPropEvents (newProposal, signers, ds.minQuorumVotes (adjustedTotalSupply), txs, description);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L256
File: NounsDAOV3Proposals.sol
274 : emit SignatureCancelled (msg .sender , sig);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L274
File: NounsDAOV3Proposals.sol
332 : emit ProposalTransactionsUpdated (proposalId, msg .sender , targets, values, signatures, calldatas, updateMessage);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L332
File: NounsDAOV3Proposals.sol
369 : emit ProposalDescriptionUpdated (proposalId, msg .sender , description, updateMessage);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L369
File: NounsDAOV3Proposals.sol
457 : emit ProposalQueued (proposalId, eta);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L457
File: NounsDAOV3Proposals.sol
517 : emit ProposalExecuted (proposal.id);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L517
File: NounsDAOV3Proposals.sol
563 : emit ProposalVetoed (proposalId);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L563
File: NounsDAOV3Proposals.sol
612 : emit ProposalCanceled (proposalId);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L612
File: NounsDAOV3Votes.sol
75 : emit VoteCast (msg .sender , proposalId, support, castVoteInternal (ds, msg .sender , proposalId, support), '' );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Votes.sol#L75
File: NounsDAOV3Votes.sol
131 : emit VoteCast (msg .sender , proposalId, support, votes, reason);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Votes.sol#L131
File: NounsDAOV3Votes.sol
149 : emit VoteCast (msg .sender , proposalId, support, castVoteInternal (ds, msg .sender , proposalId, support), reason);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Votes.sol#L149
File: NounsDAOV3Votes.sol
171 : emit VoteCast (signatory, proposalId, support, castVoteInternal (ds, signatory, proposalId, support), '' );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Votes.sol#L171
File: NounsDAOV3Votes.sol
256 : emit ProposalObjectionPeriodSet (proposal.id, proposal.objectionPeriodEndBlock);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Votes.sol#L256
File: NounsDAOV3Votes.sol
306 : emit RefundableVote (msg .sender , refundAmount, refundSent);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Votes.sol#L306
File: ForkDAODeployer.sol
128 : emit DAODeployed (token, auction, governor, treasury);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/ForkDAODeployer.sol#L128
File: NounsDAOV3Fork.sol
87 : emit EscrowedToFork (forkEscrow.forkId (), msg .sender , tokenIds, proposalIds, reason);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/NounsDAOV3Fork.sol#L87
File: NounsDAOV3Fork.sol
101 : emit WithdrawFromForkEscrow (forkEscrow.forkId (), msg .sender , tokenIds);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/NounsDAOV3Fork.sol#L101
File: NounsDAOV3Fork.sol
131 : emit ExecuteFork (forkId, forkTreasury, forkToken, forkEndTimestamp, tokensInEscrow);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/NounsDAOV3Fork.sol#L131
File: NounsDAOV3Fork.sol
159 : emit JoinFork (forkEscrow.forkId () - 1 , msg .sender , tokenIds, proposalIds, reason);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/NounsDAOV3Fork.sol#L159
File: NounsDAOV3Fork.sol
188 : emit DAONounsSupplyIncreasedFromEscrow (tokenIds.length , to);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/NounsDAOV3Fork.sol#L188
File: NounsDAOV3Fork.sol
202 : emit DAOWithdrawNounsFromEscrow (tokenIds, to);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/NounsDAOV3Fork.sol#L202
File: NounsAuctionHouseFork.sol
146 : emit AuctionBid (_auction.nounId, msg .sender , msg .value , extended);
149 : emit AuctionExtended (_auction.nounId, _auction.endTime);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/NounsAuctionHouseFork.sol#L146
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/NounsAuctionHouseFork.sol#L149
File: NounsAuctionHouseFork.sol
183 : emit AuctionTimeBufferUpdated (_timeBuffer);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/NounsAuctionHouseFork.sol#L183
File: NounsAuctionHouseFork.sol
193 : emit AuctionReservePriceUpdated (_reservePrice);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/NounsAuctionHouseFork.sol#L193
File: NounsAuctionHouseFork.sol
203 : emit AuctionMinBidIncrementPercentageUpdated (_minBidIncrementPercentage);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/NounsAuctionHouseFork.sol#L203
File: NounsAuctionHouseFork.sol
226 : emit AuctionCreated (nounId, startTime, endTime);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/NounsAuctionHouseFork.sol#L226
File: NounsAuctionHouseFork.sol
255 : emit AuctionSettled (_auction.nounId, _auction.bidder, _auction.amount);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/NounsAuctionHouseFork.sol#L255
File: NounsDAOLogicV1Fork.sol
180 : emit VotingPeriodSet (votingPeriod, votingPeriod_);
181 : emit VotingDelaySet (votingDelay, votingDelay_);
182 : emit ProposalThresholdBPSSet (proposalThresholdBPS, proposalThresholdBPS_);
183 : emit QuorumVotesBPSSet (quorumVotesBPS, quorumVotesBPS_);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L180-L183
File: NounsDAOLogicV1Fork.sol
244 : emit Quit (msg .sender , tokenIds);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L244
File: NounsDAOLogicV1Fork.sol
407 : emit ProposalQueued (proposalId, eta);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L407
File: NounsDAOLogicV1Fork.sol
444 : emit ProposalExecuted (proposalId);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L444
File: NounsDAOLogicV1Fork.sol
472 : emit ProposalCanceled (proposalId);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L472
File: NounsDAOLogicV1Fork.sol
567 : emit VoteCast (msg .sender , proposalId, support, castVoteInternal (msg .sender , proposalId, support), '' );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L567
File: NounsDAOLogicV1Fork.sol
581 : emit VoteCast (msg .sender , proposalId, support, castVoteInternal (msg .sender , proposalId, support), reason);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L581
File: NounsDAOLogicV1Fork.sol
602 : emit VoteCast (signatory, proposalId, support, castVoteInternal (signatory, proposalId, support), '' );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L602
File: NounsDAOLogicV1Fork.sol
654 : emit VotingDelaySet (oldVotingDelay, newVotingDelay);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L654
File: NounsDAOLogicV1Fork.sol
670 : emit VotingPeriodSet (oldVotingPeriod, newVotingPeriod);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L670
File: NounsDAOLogicV1Fork.sol
688 : emit ProposalThresholdBPSSet (oldProposalThresholdBPS, newProposalThresholdBPS);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L688
File: NounsDAOLogicV1Fork.sol
705 : emit QuorumVotesBPSSet (oldQuorumVotesBPS, newQuorumVotesBPS);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L705
File: NounsDAOLogicV1Fork.sol
724 : emit NewPendingAdmin (oldPendingAdmin, newPendingAdmin);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L724
File: NounsDAOLogicV1Fork.sol
745 : emit NewAdmin (oldAdmin, admin);
746 : emit NewPendingAdmin (oldPendingAdmin, pendingAdmin);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L745-L746
File: NounsDAOLogicV1Fork.sol
756 : emit ERC20TokensToIncludeInQuitSet (erc20TokensToIncludeInQuit, erc20tokens);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L756
File: NounsTokenFork.sol
215 : emit NounBurned (nounId);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/NounsTokenFork.sol#L215
File: NounsTokenFork.sol
243 : emit MinterUpdated (_minter);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/NounsTokenFork.sol#L243
File: NounsTokenFork.sol
253 : emit MinterLocked ();
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/NounsTokenFork.sol#L253
File: NounsTokenFork.sol
263 : emit DescriptorUpdated (_descriptor);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/NounsTokenFork.sol#L263
File: NounsTokenFork.sol
273 : emit DescriptorLocked ();
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/NounsTokenFork.sol#L273
File: NounsTokenFork.sol
283 : emit SeederUpdated (_seeder);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/NounsTokenFork.sol#L283
File: NounsTokenFork.sol
293 : emit SeederLocked ();
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/NounsTokenFork.sol#L293
File: NounsTokenFork.sol
303 : emit NounCreated (nounId, seed);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/NounsTokenFork.sol#L303
File: NounsTokenFork.sol
320 : emit NounCreated (nounId, seed);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/NounsTokenFork.sol#L320
File: ERC721CheckpointableUpgradeable .sol
215 : emit DelegateChanged (delegator, currentDelegate, delegatee);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/base/ERC721CheckpointableUpgradeable.sol#L215
File: ERC721CheckpointableUpgradeable .sol
262 : emit DelegateVotesChanged (delegatee, oldVotes, newVotes);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/base/ERC721CheckpointableUpgradeable.sol#L262
There is no need to verify that == true
or == false
when the variable checked upon is a boolean as well.
File: NounsDAOLogicV2.sol
620 : require (receipt.hasVoted == false , 'NounsDAO::castVoteInternal: voter already voted ' );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L620
File: NounsDAOV3Votes.sol
219 : require (receipt.hasVoted == false , 'NounsDAO::castVoteDuringVotingPeriodInternal: voter already voted ' );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Votes.sol#L219
File: NounsDAOV3Votes.sol
282 : require (receipt.hasVoted == false , 'NounsDAO::castVoteInternal: voter already voted ' );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Votes.sol#L282
File: NounsDAOLogicV1Fork.sol
621 : require (receipt.hasVoted == false , 'NounsDAO::castVoteInternal: voter already voted ' );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L621
Recommended Mitigation Steps
Instead simply check for variable
or !variable
Saves ~13 gas per instance
File: NounsDAOExecutor.sol
72 : constructor (address admin_ , uint256 delay_ )
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutor.sol#L72
File: NounsDAOExecutorProxy.sol
27 : constructor (address logic , bytes memory data ) ERC1967Proxy (logic, data)
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutorProxy.sol#L27
File: NounsDAOProxy.sol
41 : constructor (
address timelock_ ,
address nouns_ ,
address vetoer_ ,
address admin_ ,
address implementation_ ,
uint256 votingPeriod_ ,
uint256 votingDelay_ ,
uint256 proposalThresholdBPS_ ,
uint256 quorumVotesBPS_
)
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOProxy.sol#L41
File: ForkDAODeployer.sol
61 : constructor (
address tokenImpl_ ,
address auctionImpl_ ,
address governorImpl_ ,
address treasuryImpl_ ,
uint256 delayedGovernanceMaxDuration_ ,
uint256 initialVotingPeriod_ ,
uint256 initialVotingDelay_ ,
uint256 initialProposalThresholdBPS_ ,
uint256 initialQuorumVotesBPS_
)
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/ForkDAODeployer.sol#L61
File: NounsDAOForkEscrow.sol
63 : constructor (address dao_ , address nounsToken_ )
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/NounsDAOForkEscrow.sol#L63
File: DeployDAOV3DataContractsBase.s.sol
15 : constructor (address _daoProxy , address _timelockV2Proxy )
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/DeployDAOV3DataContractsBase.s.sol#L15
File: DeployDAOV3DataContractsGoerli.s.sol
11 : constructor () DeployDAOV3DataContractsBase (NOUNS_DAO_PROXY_GOERLI, NOUNS_TIMELOCK_V2_PROXY_GOERLI)
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/DeployDAOV3DataContractsGoerli.s.sol#L11
File: DeployDAOV3DataContractsSepolia.s.sol
11 : constructor () DeployDAOV3DataContractsBase (NOUNS_DAO_PROXY_SEPOLIA, NOUNS_TIMELOCK_V2_PROXY_SEPOLIA)
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/DeployDAOV3DataContractsSepolia.s.sol#L11
File: DeployDAOV3NewContractsBase.s.sol
29 : constructor (
address _daoProxy ,
address _timelockV1 ,
bool _deployTimelockV2Harness ,
uint256 _forkDAOVotingPeriod ,
uint256 _forkDAOVotingDelay
)
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/DeployDAOV3NewContractsBase.s.sol#L29
File: DeployDAOV3NewContractsMainnet.s.sol
13 : constructor ()
DeployDAOV3NewContractsBase (
NOUNS_DAO_PROXY_MAINNET,
NOUNS_TIMELOCK_V1_MAINNET,
false ,
FORK_DAO_VOTING_PERIOD,
FORK_DAO_VOTING_DELAY
)
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/DeployDAOV3NewContractsMainnet.s.sol#L13
File: DeployDAOV3NewContractsTestnet.s.sol
30 : constructor ()
DeployDAOV3NewContractsBase (
NOUNS_DAO_PROXY_SEPOLIA,
NOUNS_TIMELOCK_V1_SEPOLIA,
true ,
FORK_DAO_VOTING_PERIOD,
FORK_DAO_VOTING_DELAY
)
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/DeployDAOV3NewContractsTestnet.s.sol#L30
File: ProposeDAOV3UpgradeTestnet.s.sol
165 : constructor ()
ProposeDAOV3UpgradeTestnet (
NOUNS_DAO_PROXY_SEPOLIA,
NOUNS_TIMELOCK_V1_SEPOLIA,
AUCTION_HOUSE_PROXY_SEPOLIA,
STETH_SEPOLIA
)
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L165
For cases of: if (<x> == true)
, use if (<x>)
instead
For cases of: if (<x> == false)
, use if (!<x>)
instead
File: NounsDAOLogicV2.sol
620 : require (receipt.hasVoted == false , 'NounsDAO::castVoteInternal: voter already voted ' );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L620
File: NounsDAOV3Votes.sol
219 : require (receipt.hasVoted == false , 'NounsDAO::castVoteDuringVotingPeriodInternal: voter already voted ' );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Votes.sol#L219
File: NounsDAOV3Votes.sol
282 : require (receipt.hasVoted == false , 'NounsDAO::castVoteInternal: voter already voted ' );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Votes.sol#L282
File: NounsDAOLogicV1Fork.sol
621 : require (receipt.hasVoted == false , 'NounsDAO::castVoteInternal: voter already voted ' );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L621
Saves deployment costs
File: NounsDAOExecutor.sol
74 : require (delay_ <= MAXIMUM_DELAY, 'NounsDAOExecutor::setDelay: Delay must not exceed maximum delay. ' );
83 : require (delay_ <= MAXIMUM_DELAY, 'NounsDAOExecutor::setDelay: Delay must not exceed maximum delay. ' );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutor.sol#L74
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutor.sol#L83
File: NounsDAOExecutorV2.sol
97 : require (delay_ <= MAXIMUM_DELAY, 'NounsDAOExecutor::setDelay: Delay must not exceed maximum delay. ' );
106 : require (delay_ <= MAXIMUM_DELAY, 'NounsDAOExecutor::setDelay: Delay must not exceed maximum delay. ' );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutorV2.sol#L97
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutorV2.sol#L106
File: NounsTokenFork.sol
223 : require (_exists (tokenId), 'NounsToken: URI query for nonexistent token ' );
232 : require (_exists (tokenId), 'NounsToken: URI query for nonexistent token ' );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/NounsTokenFork.sol#L223
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/NounsTokenFork.sol#L232
The code should be refactored such that they no longer exist, or the block should do something useful, such as emitting an event or reverting. If the contract is meant to be extended, the contract should be abstract and the function signatures be added without any default implementation. If the block is an empty if-statement block to avoid doing subsequent checks in the else-if/else conditions, the else-if/else conditions should be nested under the negation of the if-statement, because they involve different classes of checks, which may lead to the introduction of errors when the code is later modified (if(x){}else if(y){...}else{...} => if(!x){if(y){...}else{...}})
File: NounsDAOExecutor.sol
186 : receive () external payable {}
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutor.sol#L186
File: NounsDAOExecutor.sol
188 : fallback () external payable {}
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutor.sol#L188
File: NounsDAOExecutorV2.sol
209 : receive () external payable {}
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutorV2.sol#L209
File: NounsDAOExecutorV2.sol
211 : fallback () external payable {}
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutorV2.sol#L211
File: NounsDAOLogicV2.sol
1090 : receive () external payable {}
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L1090
File: NounsDAOLogicV3.sol
1035 : receive () external payable {}
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV3.sol#L1035
File: NounsAuctionHouseFork.sol
281 : function _authorizeUpgrade (address ) internal view override onlyOwner {}
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/NounsAuctionHouseFork.sol#L281
File: NounsTokenFork.sol
327 : function _authorizeUpgrade (address ) internal view override onlyOwner {}
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/NounsTokenFork.sol#L327
File: ProposeDAOV3UpgradeTestnet.s.sol
155 : {}
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L155
File: ProposeDAOV3UpgradeTestnet.s.sol
172 : {}
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L172
File: NounsDAOLogicV2.sol
244 : newProposal.eta = 0 ;
251 : newProposal.forVotes = 0 ;
252 : newProposal.againstVotes = 0 ;
253 : newProposal.abstainVotes = 0 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L244
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L251
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L252
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L253
File: NounsDAOLogicV2.sol
1007 : uint256 lower = 0 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L1007
File: NounsDAOV3DynamicQuorum.sol
107 : uint256 lower = 0 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3DynamicQuorum.sol#L107
File: NounsDAOV3Proposals.sol
825 : uint256 numSigners = 0 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L825
File: NounsDAOV3Votes.sol
289 : receipt.support = 0 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Votes.sol#L289
File: NounsDAOForkEscrow.sol
134 : numTokensInEscrow = 0 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/NounsDAOForkEscrow.sol#L134
File: NounsDAOLogicV1Fork.sol
323 : newProposal.eta = 0 ;
330 : newProposal.forVotes = 0 ;
331 : newProposal.againstVotes = 0 ;
332 : newProposal.abstainVotes = 0 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L323
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L330
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L331
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L332
File: NounsTokenFork.sol
168 : uint256 maxNounId = 0 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/NounsTokenFork.sol#L168
File: ERC721CheckpointableUpgradeable .sol
193 : uint32 lower = 0 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/base/ERC721CheckpointableUpgradeable.sol#L193
File: ProposeDAOV3UpgradeMainnet.s.sol
75 : uint256 i = 0 ;
84 : values[i] = 0 ;
84 : values[i] = 0 ;
84 : values[i] = 0 ;
84 : values[i] = 0 ;
84 : values[i] = 0 ;
84 : values[i] = 0 ;
84 : values[i] = 0 ;
84 : values[i] = 0 ;
84 : values[i] = 0 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L75-L84
File: ProposeDAOV3UpgradeTestnet.s.sol
82 : uint256 i = 0 ;
91 : values[i] = 0 ;
91 : values[i] = 0 ;
91 : values[i] = 0 ;
91 : values[i] = 0 ;
91 : values[i] = 0 ;
91 : values[i] = 0 ;
91 : values[i] = 0 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L82
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L91
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L91
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L91
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L91
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L91
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L91
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L91
File: ProposeENSReverseLookupConfigMainnet.s.sol
40 : uint256 i = 0 ;
42 : values[i] = 0 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeENSReverseLookupConfigMainnet.s.sol#L40
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeENSReverseLookupConfigMainnet.s.sol#L42
File: ProposeTimelockMigrationCleanupMainnet.s.sol
59 : uint256 i = 0 ;
61 : values[i] = 0 ;
61 : values[i] = 0 ;
61 : values[i] = 0 ;
61 : values[i] = 0 ;
61 : values[i] = 0 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeTimelockMigrationCleanupMainnet.s.sol#L59
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeTimelockMigrationCleanupMainnet.s.sol#L61
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeTimelockMigrationCleanupMainnet.s.sol#L61
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeTimelockMigrationCleanupMainnet.s.sol#L61
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeTimelockMigrationCleanupMainnet.s.sol#L61
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeTimelockMigrationCleanupMainnet.s.sol#L61
Saves 6 gas per loop
File: NounsDAOLogicV2.sol
305 : for (uint256 i = 0 ; i < proposal.targets.length ; i++ ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L305
File: NounsDAOLogicV2.sol
343 : for (uint256 i = 0 ; i < proposal.targets.length ; i++ ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L343
File: NounsDAOLogicV2.sol
372 : for (uint256 i = 0 ; i < proposal.targets.length ; i++ ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L372
File: NounsDAOLogicV2.sol
405 : for (uint256 i = 0 ; i < proposal.targets.length ; i++ ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L405
File: NounsDAOV3Admin.sol
602 : for (uint256 i = 0 ; i < erc20tokens.length - 1 ; i++ ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L602
File: NounsDAOV3Proposals.sol
446 : for (uint256 i = 0 ; i < proposal.targets.length ; i++ ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L446
File: NounsDAOV3Proposals.sol
508 : for (uint256 i = 0 ; i < proposal.targets.length ; i++ ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L508
File: NounsDAOV3Proposals.sol
553 : for (uint256 i = 0 ; i < proposal.targets.length ; i++ ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L553
File: NounsDAOV3Proposals.sol
602 : for (uint256 i = 0 ; i < proposal.targets.length ; i++ ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L602
File: NounsDAOForkEscrow.sol
117 : for (uint256 i = 0 ; i < tokenIds.length ; i++ ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/NounsDAOForkEscrow.sol#L117
File: NounsDAOForkEscrow.sol
138 : forkId++ ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/NounsDAOForkEscrow.sol#L138
File: NounsDAOForkEscrow.sol
148 : for (uint256 i = 0 ; i < tokenIds.length ; i++ ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/NounsDAOForkEscrow.sol#L148
File: NounsDAOV3Fork.sol
83 : for (uint256 i = 0 ; i < tokenIds.length ; i++ ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/NounsDAOV3Fork.sol#L83
File: NounsDAOV3Fork.sol
153 : for (uint256 i = 0 ; i < tokenIds.length ; i++ ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/NounsDAOV3Fork.sol#L153
File: NounsDAOLogicV1Fork.sol
209 : for (uint256 i = 0 ; i < erc20TokensToInclude.length ; i++ ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L209
File: NounsDAOLogicV1Fork.sol
223 : for (uint256 i = 0 ; i < tokenIds.length ; i++ ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L223
File: NounsDAOLogicV1Fork.sol
248 : for (uint256 i = 0 ; i < addresses.length ; i++ ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L248
File: NounsDAOLogicV1Fork.sol
397 : for (uint256 i = 0 ; i < proposal.targets.length ; i++ ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L397
File: NounsDAOLogicV1Fork.sol
435 : for (uint256 i = 0 ; i < proposal.targets.length ; i++ ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L435
File: NounsDAOLogicV1Fork.sol
462 : for (uint256 i = 0 ; i < proposal.targets.length ; i++ ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L462
File: NounsDAOLogicV1Fork.sol
796 : for (uint256 i = 0 ; i < erc20tokens.length - 1 ; i++ ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L796
File: NounsTokenFork.sol
149 : for (uint256 i = 0 ; i < tokenIds.length ; i++ ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/NounsTokenFork.sol#L149
File: NounsTokenFork.sol
172 : for (uint256 i = 0 ; i < tokenIds.length ; i++ ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/NounsTokenFork.sol#L172
Recommended Mitigation Steps
For example, use ++i
instead of i++
File: NounsAuctionHouseFork.sol
120 : _auction = auction;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/NounsAuctionHouseFork.sol#L120
File: NounsAuctionHouseFork.sol
237 : _auction = auction;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/NounsAuctionHouseFork.sol#L237
File: NounsTokenFork.sol
133 : _currentNounId = startNounId;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/NounsTokenFork.sol#L133
File: NounsTokenFork.sol
199 : _contractURIHash = newContractURIHash;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/NounsTokenFork.sol#L199
If a function modifier or require such as onlyOwner/onlyX is used, the function will revert if a normal user tries to pay the function. Marking the function as payable will lower the gas cost for legitimate callers because the compiler will not include checks for whether a payment was provided. The extra opcodes avoided are CALLVALUE(2), DUP1(3), ISZERO(3), PUSH2(3), JUMPI(10), PUSH1(3), DUP1(3), REVERT(0), JUMPDEST(1), POP(2) which costs an average of about 21 gas per call to the function, in addition to the extra deployment cost.
File: NounsDAOV3Admin.sol
162 : function _setVotingDelay (NounsDAOStorageV3.StorageV3 storage ds , uint256 newVotingDelay ) external onlyAdmin (ds) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L162
File: NounsDAOV3Admin.sol
177 : function _setVotingPeriod (NounsDAOStorageV3.StorageV3 storage ds , uint256 newVotingPeriod ) external onlyAdmin (ds) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L177
File: NounsDAOV3Admin.sol
193 : function _setProposalThresholdBPS (NounsDAOStorageV3.StorageV3 storage ds , uint256 newProposalThresholdBPS )
external
onlyAdmin (ds)
{
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L193
File: NounsDAOV3Admin.sol
212 : function _setObjectionPeriodDurationInBlocks (
NounsDAOStorageV3.StorageV3 storage ds ,
uint32 newObjectionPeriodDurationInBlocks
) external onlyAdmin (ds) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L212
File: NounsDAOV3Admin.sol
229 : function _setLastMinuteWindowInBlocks (NounsDAOStorageV3.StorageV3 storage ds , uint32 newLastMinuteWindowInBlocks )
external
onlyAdmin (ds)
{
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L229
File: NounsDAOV3Admin.sol
243 : function _setProposalUpdatablePeriodInBlocks (
NounsDAOStorageV3.StorageV3 storage ds ,
uint32 newProposalUpdatablePeriodInBlocks
) external onlyAdmin (ds) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L243
File: NounsDAOV3Admin.sol
261 : function _setPendingAdmin (NounsDAOStorageV3.StorageV3 storage ds , address newPendingAdmin ) external onlyAdmin (ds) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L261
File: NounsDAOV3Admin.sol
351 : function _setMinQuorumVotesBPS (NounsDAOStorageV3.StorageV3 storage ds , uint16 newMinQuorumVotesBPS )
external
onlyAdmin (ds)
{
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L351
File: NounsDAOV3Admin.sol
381 : function _setMaxQuorumVotesBPS (NounsDAOStorageV3.StorageV3 storage ds , uint16 newMaxQuorumVotesBPS )
external
onlyAdmin (ds)
{
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L381
File: NounsDAOV3Admin.sol
408 : function _setQuorumCoefficient (NounsDAOStorageV3.StorageV3 storage ds , uint32 newQuorumCoefficient )
external
onlyAdmin (ds)
{
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L408
File: NounsDAOV3Admin.sol
432 : function _setDynamicQuorumParams (
NounsDAOStorageV3.StorageV3 storage ds ,
uint16 newMinQuorumVotesBPS ,
uint16 newMaxQuorumVotesBPS ,
uint32 newQuorumCoefficient
) public onlyAdmin (ds) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L432
File: NounsDAOV3Admin.sol
468 : function _withdraw (NounsDAOStorageV3.StorageV3 storage ds ) external onlyAdmin (ds) returns (uint256 , bool ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L468
File: NounsDAOV3Admin.sol
482 : function _setVoteSnapshotBlockSwitchProposalId (NounsDAOStorageV3.StorageV3 storage ds ) external onlyAdmin (ds) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L482
File: NounsDAOV3Admin.sol
500 : function _setForkDAODeployer (NounsDAOStorageV3.StorageV3 storage ds , address newForkDAODeployer )
external
onlyAdmin (ds)
{
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L500
File: NounsDAOV3Admin.sol
513 : function _setErc20TokensToIncludeInFork (NounsDAOStorageV3.StorageV3 storage ds , address [] calldata erc20tokens )
external
onlyAdmin (ds)
{
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L513
File: NounsDAOV3Admin.sol
527 : function _setForkEscrow (NounsDAOStorageV3.StorageV3 storage ds , address newForkEscrow ) external onlyAdmin (ds) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L527
File: NounsDAOV3Admin.sol
533 : function _setForkPeriod (NounsDAOStorageV3.StorageV3 storage ds , uint256 newForkPeriod ) external onlyAdmin (ds) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L533
File: NounsDAOV3Admin.sol
551 : function _setForkThresholdBPS (NounsDAOStorageV3.StorageV3 storage ds , uint256 newForkThresholdBPS )
external
onlyAdmin (ds)
{
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L551
File: NounsDAOV3Admin.sol
566 : function _setTimelocksAndAdmin (
NounsDAOStorageV3.StorageV3 storage ds ,
address timelock ,
address timelockV1 ,
address admin
) external onlyAdmin (ds) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L566
File: NounsDAOForkEscrow.sol
116 : function returnTokensToOwner (address owner , uint256 [] calldata tokenIds ) external onlyDAO {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/NounsDAOForkEscrow.sol#L116
File: NounsDAOForkEscrow.sol
133 : function closeEscrow () external onlyDAO returns (uint32 closedForkId ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/NounsDAOForkEscrow.sol#L133
File: NounsDAOForkEscrow.sol
147 : function withdrawTokens (uint256 [] calldata tokenIds , address to ) external onlyDAO {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/NounsDAOForkEscrow.sol#L147
File: NounsAuctionHouseFork.sol
159 : function pause () external override onlyOwner {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/NounsAuctionHouseFork.sol#L159
File: NounsAuctionHouseFork.sol
168 : function unpause () external override onlyOwner {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/NounsAuctionHouseFork.sol#L168
File: NounsAuctionHouseFork.sol
180 : function setTimeBuffer (uint256 _timeBuffer ) external override onlyOwner {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/NounsAuctionHouseFork.sol#L180
File: NounsAuctionHouseFork.sol
190 : function setReservePrice (uint256 _reservePrice ) external override onlyOwner {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/NounsAuctionHouseFork.sol#L190
File: NounsAuctionHouseFork.sol
200 : function setMinBidIncrementPercentage (uint8 _minBidIncrementPercentage ) external override onlyOwner {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/NounsAuctionHouseFork.sol#L200
File: NounsTokenFork.sol
198 : function setContractURIHash (string memory newContractURIHash ) external onlyOwner {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/NounsTokenFork.sol#L198
File: NounsTokenFork.sol
206 : function mint () public override onlyMinter returns (uint256 ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/NounsTokenFork.sol#L206
File: NounsTokenFork.sol
213 : function burn (uint256 nounId ) public override onlyMinter {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/NounsTokenFork.sol#L213
File: NounsTokenFork.sol
240 : function setMinter (address _minter ) external override onlyOwner whenMinterNotLocked {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/NounsTokenFork.sol#L240
File: NounsTokenFork.sol
250 : function lockMinter () external override onlyOwner whenMinterNotLocked {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/NounsTokenFork.sol#L250
File: NounsTokenFork.sol
260 : function setDescriptor (INounsDescriptorMinimal _descriptor ) external override onlyOwner whenDescriptorNotLocked {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/NounsTokenFork.sol#L260
File: NounsTokenFork.sol
270 : function lockDescriptor () external override onlyOwner whenDescriptorNotLocked {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/NounsTokenFork.sol#L270
File: NounsTokenFork.sol
280 : function setSeeder (INounsSeeder _seeder ) external override onlyOwner whenSeederNotLocked {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/NounsTokenFork.sol#L280
File: NounsTokenFork.sol
290 : function lockSeeder () external override onlyOwner whenSeederNotLocked {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/NounsTokenFork.sol#L290
Recommended Mitigation Steps
Functions guaranteed to revert when called by normal users can be marked payable.
File: NounsDAOLogicV2.sol
305 : for (uint256 i = 0 ; i < proposal.targets.length ; i++ ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L305
File: NounsDAOLogicV2.sol
343 : for (uint256 i = 0 ; i < proposal.targets.length ; i++ ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L343
File: NounsDAOLogicV2.sol
372 : for (uint256 i = 0 ; i < proposal.targets.length ; i++ ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L372
File: NounsDAOLogicV2.sol
405 : for (uint256 i = 0 ; i < proposal.targets.length ; i++ ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L405
File: NounsDAOV3Admin.sol
602 : for (uint256 i = 0 ; i < erc20tokens.length - 1 ; i++ ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L602
File: NounsDAOV3Proposals.sol
409 : for (uint256 i = 0 ; i < proposerSignatures.length ; ++ i) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L409
File: NounsDAOV3Proposals.sol
446 : for (uint256 i = 0 ; i < proposal.targets.length ; i++ ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L446
File: NounsDAOV3Proposals.sol
508 : for (uint256 i = 0 ; i < proposal.targets.length ; i++ ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L508
File: NounsDAOV3Proposals.sol
553 : for (uint256 i = 0 ; i < proposal.targets.length ; i++ ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L553
File: NounsDAOV3Proposals.sol
590 : for (uint256 i = 0 ; i < signers.length ; ++ i) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L590
File: NounsDAOV3Proposals.sol
826 : for (uint256 i = 0 ; i < proposerSignatures.length ; ++ i) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L826
File: NounsDAOV3Proposals.sol
860 : for (uint256 i = 0 ; i < txs.signatures.length ; ++ i) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L860
File: NounsDAOForkEscrow.sol
117 : for (uint256 i = 0 ; i < tokenIds.length ; i++ ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/NounsDAOForkEscrow.sol#L117
File: NounsDAOForkEscrow.sol
148 : for (uint256 i = 0 ; i < tokenIds.length ; i++ ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/NounsDAOForkEscrow.sol#L148
File: NounsDAOV3Fork.sol
83 : for (uint256 i = 0 ; i < tokenIds.length ; i++ ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/NounsDAOV3Fork.sol#L83
File: NounsDAOV3Fork.sol
153 : for (uint256 i = 0 ; i < tokenIds.length ; i++ ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/NounsDAOV3Fork.sol#L153
File: NounsDAOV3Fork.sol
252 : for (uint256 i = 0 ; i < erc20Count; ++ i) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/NounsDAOV3Fork.sol#L252
File: NounsDAOLogicV1Fork.sol
209 : for (uint256 i = 0 ; i < erc20TokensToInclude.length ; i++ ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L209
File: NounsDAOLogicV1Fork.sol
223 : for (uint256 i = 0 ; i < tokenIds.length ; i++ ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L223
File: NounsDAOLogicV1Fork.sol
248 : for (uint256 i = 0 ; i < addresses.length ; i++ ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L248
File: NounsDAOLogicV1Fork.sol
397 : for (uint256 i = 0 ; i < proposal.targets.length ; i++ ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L397
File: NounsDAOLogicV1Fork.sol
435 : for (uint256 i = 0 ; i < proposal.targets.length ; i++ ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L435
File: NounsDAOLogicV1Fork.sol
462 : for (uint256 i = 0 ; i < proposal.targets.length ; i++ ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L462
File: NounsDAOLogicV1Fork.sol
796 : for (uint256 i = 0 ; i < erc20tokens.length - 1 ; i++ ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L796
File: NounsTokenFork.sol
149 : for (uint256 i = 0 ; i < tokenIds.length ; i++ ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/NounsTokenFork.sol#L149
File: NounsTokenFork.sol
172 : for (uint256 i = 0 ; i < tokenIds.length ; i++ ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/NounsTokenFork.sol#L172
File: NounsDAOExecutorV2.sol
240 : function _authorizeUpgrade
243 : function _authorizeUpgrade
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutorV2.sol#L240
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutorV2.sol#L243
File: NounsDAOLogicV2.sol
318 : function queueOrRevertInternal
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L318
File: NounsDAOLogicV2.sol
925 : function proposalCreationBlock
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L925
File: NounsDAOLogicV2.sol
1033 : function _refundGas
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L1033
File: NounsDAOLogicV2.sol
1070 : function getChainIdInternal
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L1070
File: NounsDAOProxy.sol
94 : function delegateTo
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOProxy.sol#L94
File: NounsDAOV3Admin.sol
594 : function safe32
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L594
File: NounsDAOV3Admin.sol
599 : function checkForDuplicates
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L599
File: NounsDAOV3DynamicQuorum.sol
32 : function quorumVotes
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3DynamicQuorum.sol#L32
File: NounsDAOV3DynamicQuorum.sol
145 : function safe32
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3DynamicQuorum.sol#L145
File: NounsDAOV3DynamicQuorum.sol
126 : function min
157 : function min
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3DynamicQuorum.sol#L126
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3DynamicQuorum.sol#L157
File: NounsDAOV3Proposals.sol
160 : function propose
197 : function propose
220 : function propose
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L160
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L197
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L220
File: NounsDAOV3Proposals.sol
460 : function queueOrRevertInternal
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L460
File: NounsDAOV3Proposals.sol
697 : function getReceipt
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L697
File: NounsDAOV3Proposals.sol
814 : function verifySignersCanBackThisProposalAndCountTheirVotes
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L814
File: NounsDAOV3Proposals.sol
957 : function checkPropThreshold
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L957
File: NounsDAOV3Proposals.sol
1000 : function sigDigest
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L1000
File: NounsDAOV3Proposals.sol
1015 : function bps2Uint
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L1015
File: NounsDAOV3Votes.sol
210 : function castVoteDuringVotingPeriodInternal
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Votes.sol#L210
File: NounsDAOV3Votes.sol
275 : function castObjectionInternal
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Votes.sol#L275
File: NounsDAOV3Votes.sol
295 : function _refundGas
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Votes.sol#L295
File: ForkDAODeployer.sol
134 : function initDAO
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/ForkDAODeployer.sol#L134
File: ForkDAODeployer.sol
156 : function getOriginalTimelock
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/ForkDAODeployer.sol#L156
File: ForkDAODeployer.sol
164 : function getOriginalAuction
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/ForkDAODeployer.sol#L164
File: ForkDAODeployer.sol
169 : function getStartNounId
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/ForkDAODeployer.sol#L169
File: NounsAuctionHouseFork.sol
261 : function _safeTransferETH
272 : function _safeTransferETH
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/NounsAuctionHouseFork.sol#L261
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/NounsAuctionHouseFork.sol#L272
File: NounsAuctionHouseFork.sol
281 : function _authorizeUpgrade
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/NounsAuctionHouseFork.sol#L281
File: NounsDAOLogicV1Fork.sol
247 : function isAddressIn
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L247
File: NounsDAOLogicV1Fork.sol
410 : function queueOrRevertInternal
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L410
File: NounsDAOLogicV1Fork.sol
789 : function _authorizeUpgrade
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L789
File: NounsDAOLogicV1Fork.sol
793 : function checkForDuplicates
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L793
File: NounsTokenFork.sol
299 : function _mintTo
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/NounsTokenFork.sol#L299
File: NounsTokenFork.sol
327 : function _authorizeUpgrade
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/NounsTokenFork.sol#L327
File: ERC721CheckpointableUpgradeable .sol
265 : function safe32
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/base/ERC721CheckpointableUpgradeable.sol#L265
File: ERC721CheckpointableUpgradeable .sol
270 : function safe96
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/base/ERC721CheckpointableUpgradeable.sol#L270
File: ERC721CheckpointableUpgradeable .sol
275 : function add96
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/base/ERC721CheckpointableUpgradeable.sol#L275
File: ERC721CheckpointableUpgradeable .sol
285 : function sub96
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/base/ERC721CheckpointableUpgradeable.sol#L285
File: DeployDAOV3NewContractsBase.s.sol
62 : function deployNewContracts
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/DeployDAOV3NewContractsBase.s.sol#L62
File: DeployDAOV3NewContractsBase.s.sol
96 : function deployAndInitTimelockV2
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/DeployDAOV3NewContractsBase.s.sol#L96
File: ProposeTimelockMigrationCleanupMainnet.s.sol
43 : function propose
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeTimelockMigrationCleanupMainnet.s.sol#L43
Caching a mapping's value in a local storage or calldata variable when the value is accessed multiple times saves ~42 gas per access due to not having to perform the same offset calculation every time. Help the Optimizer by saving a storage variable's reference instead of repeatedly fetching it
To help the optimizer,declare a storage type variable and use it instead of repeatedly fetching the reference in a map or an array. As an example, instead of repeatedly calling someMap[someIndex]
, save its reference like this: SomeStruct storage someStruct = someMap[someIndex]
and use it.
File: NounsDAOExecutor.sol
152 : require (queuedTransactions[txHash], "NounsDAOExecutor::executeTransaction: Transaction hasn ' t been queued.");
137: queuedTransactions[txHash] = false;
162: queuedTransactions[txHash] = false;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutor.sol#L152
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutor.sol#L137
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutor.sol#L162
File: NounsDAOExecutorV2.sol
175 : require (queuedTransactions[txHash], "NounsDAOExecutor::executeTransaction: Transaction hasn ' t been queued.");
160: queuedTransactions[txHash] = false;
185: queuedTransactions[txHash] = false;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutorV2.sol#L175
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutorV2.sol#L160
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutorV2.sol#L185
File: NounsDAOLogicV2.sol
994 : if (quorumParamsCheckpoints[len - 1 ].fromBlock <= blockNumber) {
995 : return quorumParamsCheckpoints[len - 1 ].params;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L994-L995
File: NounsDAOLogicV2.sol
1026 : if (pos > 0 && quorumParamsCheckpoints[pos - 1 ].fromBlock == blockNumber) {
1027 : quorumParamsCheckpoints[pos - 1 ].params = params;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L1026-L1027
File: NounsDAOV3Admin.sol
585 : if (pos > 0 && ds.quorumParamsCheckpoints[pos - 1 ].fromBlock == blockNumber) {
586 : ds.quorumParamsCheckpoints[pos - 1 ].params = params;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L585-L586
File: NounsDAOV3DynamicQuorum.sol
94 : if (ds.quorumParamsCheckpoints[len - 1 ].fromBlock <= blockNumber) {
95 : return ds.quorumParamsCheckpoints[len - 1 ].params;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3DynamicQuorum.sol#L94-L95
File: NounsDAOV3Proposals.sol
591 : msgSenderIsProposer = msgSenderIsProposer || msg .sender == signers[i];
592 : votes += nouns.getPriorVotes (signers[i], block .number - 1 );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L591-L592
File: NounsDAOV3Proposals.sol
827 : verifyProposalSignature (ds, proposalEncodeData, proposerSignatures[i], PROPOSAL_TYPEHASH);
829 : address signer = proposerSignatures[i].signer;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L827
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L829
File: NounsDAOForkEscrow.sol
118 : if (currentOwnerOf (tokenIds[i]) != owner) revert NotOwner ();
120 : nounsToken.transferFrom (address (this ), owner, tokenIds[i]);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/NounsDAOForkEscrow.sol#L118
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/NounsDAOForkEscrow.sol#L120
File: NounsDAOForkEscrow.sol
149 : if (currentOwnerOf (tokenIds[i]) != dao) revert NotOwner ();
151 : nounsToken.transferFrom (address (this ), to, tokenIds[i]);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/NounsDAOForkEscrow.sol#L149
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/NounsDAOForkEscrow.sol#L151
File: NounsDAOLogicV1Fork.sol
233 : balancesToSend[i] = (erc20token.balanceOf (address (timelock)) * tokenIds.length ) / totalSupply;
239 : if (balancesToSend[i] > 0 ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L233
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L239
File: ERC721CheckpointableUpgradeable .sol
184 : if (checkpoints[account][nCheckpoints - 1 ].fromBlock <= blockNumber) {
185 : return checkpoints[account][nCheckpoints - 1 ].votes;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/base/ERC721CheckpointableUpgradeable.sol#L184-L185
File: ERC721CheckpointableUpgradeable .sol
255 : if (nCheckpoints > 0 && checkpoints[delegatee][nCheckpoints - 1 ].fromBlock == blockNumber) {
256 : checkpoints[delegatee][nCheckpoints - 1 ].votes = newVotes;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/base/ERC721CheckpointableUpgradeable.sol#L255-L256
File: ProposeDAOV3UpgradeMainnet.s.sol
76 : targets[i] = timelockV2;
77 : values[i] = ethToSendToNewTimelock;
78 : signatures[i] = '' ;
79 : calldatas[i] = '' ;
104 : calldatas[i] = '' ;
83 : targets[i] = address (daoProxy);
89 : targets[i] = address (daoProxy);
101 : targets[i] = address (daoProxy);
140 : targets[i] = address (daoProxy);
84 : values[i] = 0 ;
90 : values[i] = 0 ;
102 : values[i] = 0 ;
108 : values[i] = 0 ;
114 : values[i] = 0 ;
120 : values[i] = 0 ;
127 : values[i] = 0 ;
134 : values[i] = 0 ;
141 : values[i] = 0 ;
85 : signatures[i] = '_setImplementation(address) ' ;
86 : calldatas[i] = abi.encode (daoV3Implementation);
83 : targets[i] = address (daoProxy);
89 : targets[i] = address (daoProxy);
101 : targets[i] = address (daoProxy);
140 : targets[i] = address (daoProxy);
84 : values[i] = 0 ;
90 : values[i] = 0 ;
102 : values[i] = 0 ;
108 : values[i] = 0 ;
114 : values[i] = 0 ;
120 : values[i] = 0 ;
127 : values[i] = 0 ;
134 : values[i] = 0 ;
141 : values[i] = 0 ;
86 : calldatas[i] = abi.encode (
92 : calldatas[i] = abi.encode (
110 : calldatas[i] = abi.encode (
116 : calldatas[i] = abi.encode (
122 : calldatas[i] = abi.encode (
129 : calldatas[i] = abi.encode (
136 : calldatas[i] = abi.encode (
143 : calldatas[i] = abi.encode (
83 : targets[i] = address (daoProxy);
89 : targets[i] = address (daoProxy);
101 : targets[i] = address (daoProxy);
140 : targets[i] = address (daoProxy);
84 : values[i] = 0 ;
90 : values[i] = 0 ;
102 : values[i] = 0 ;
108 : values[i] = 0 ;
114 : values[i] = 0 ;
120 : values[i] = 0 ;
127 : values[i] = 0 ;
134 : values[i] = 0 ;
141 : values[i] = 0 ;
103 : signatures[i] = '_setVoteSnapshotBlockSwitchProposalId() ' ;
79 : calldatas[i] = '' ;
104 : calldatas[i] = '' ;
107 : targets[i] = AUCTION_HOUSE_PROXY_MAINNET;
84 : values[i] = 0 ;
90 : values[i] = 0 ;
102 : values[i] = 0 ;
108 : values[i] = 0 ;
114 : values[i] = 0 ;
120 : values[i] = 0 ;
127 : values[i] = 0 ;
134 : values[i] = 0 ;
141 : values[i] = 0 ;
109 : signatures[i] = 'transferOwnership(address) ' ;
128 : signatures[i] = 'transferOwnership(address) ' ;
135 : signatures[i] = 'transferOwnership(address) ' ;
110 : calldatas[i] = abi.encode (timelockV2);
129 : calldatas[i] = abi.encode (timelockV2);
136 : calldatas[i] = abi.encode (timelockV2);
113 : targets[i] = STETH_MAINNET;
84 : values[i] = 0 ;
90 : values[i] = 0 ;
102 : values[i] = 0 ;
108 : values[i] = 0 ;
114 : values[i] = 0 ;
120 : values[i] = 0 ;
127 : values[i] = 0 ;
134 : values[i] = 0 ;
141 : values[i] = 0 ;
115 : signatures[i] = 'approve(address,uint256) ' ;
116 : calldatas[i] = abi.encode (erc20Transferer, type (uint256 ).max);
119 : targets[i] = erc20Transferer;
84 : values[i] = 0 ;
90 : values[i] = 0 ;
102 : values[i] = 0 ;
108 : values[i] = 0 ;
114 : values[i] = 0 ;
120 : values[i] = 0 ;
127 : values[i] = 0 ;
134 : values[i] = 0 ;
141 : values[i] = 0 ;
121 : signatures[i] = 'transferEntireBalance(address,address) ' ;
122 : calldatas[i] = abi.encode (STETH_MAINNET, timelockV2);
126 : targets[i] = NOUNS_TOKEN_MAINNET;
84 : values[i] = 0 ;
90 : values[i] = 0 ;
102 : values[i] = 0 ;
108 : values[i] = 0 ;
114 : values[i] = 0 ;
120 : values[i] = 0 ;
127 : values[i] = 0 ;
134 : values[i] = 0 ;
141 : values[i] = 0 ;
109 : signatures[i] = 'transferOwnership(address) ' ;
128 : signatures[i] = 'transferOwnership(address) ' ;
135 : signatures[i] = 'transferOwnership(address) ' ;
110 : calldatas[i] = abi.encode (timelockV2);
129 : calldatas[i] = abi.encode (timelockV2);
136 : calldatas[i] = abi.encode (timelockV2);
133 : targets[i] = DESCRIPTOR_MAINNET;
84 : values[i] = 0 ;
90 : values[i] = 0 ;
102 : values[i] = 0 ;
108 : values[i] = 0 ;
114 : values[i] = 0 ;
120 : values[i] = 0 ;
127 : values[i] = 0 ;
134 : values[i] = 0 ;
141 : values[i] = 0 ;
109 : signatures[i] = 'transferOwnership(address) ' ;
128 : signatures[i] = 'transferOwnership(address) ' ;
135 : signatures[i] = 'transferOwnership(address) ' ;
110 : calldatas[i] = abi.encode (timelockV2);
129 : calldatas[i] = abi.encode (timelockV2);
136 : calldatas[i] = abi.encode (timelockV2);
83 : targets[i] = address (daoProxy);
89 : targets[i] = address (daoProxy);
101 : targets[i] = address (daoProxy);
140 : targets[i] = address (daoProxy);
84 : values[i] = 0 ;
90 : values[i] = 0 ;
102 : values[i] = 0 ;
108 : values[i] = 0 ;
114 : values[i] = 0 ;
120 : values[i] = 0 ;
127 : values[i] = 0 ;
134 : values[i] = 0 ;
141 : values[i] = 0 ;
142 : signatures[i] = '_setTimelocksAndAdmin(address,address,address) ' ;
143 : calldatas[i] = abi.encode (timelockV2, NOUNS_TIMELOCK_V1_MAINNET, timelockV2);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L76
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L77
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L78
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L79
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L104
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L83
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L89
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L101
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L140
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L84
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L90
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L102
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L108
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L114
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L120
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L127
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L134
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L141
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L85
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L86
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L83
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L89
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L101
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L140
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L84
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L90
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L102
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L108
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L114
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L120
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L127
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L134
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L141
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L86
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L92
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L110
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L116
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L122
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L129
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L136
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L143
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L83
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L89
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L101
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L140
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L84
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L90
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L102
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L108
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L114
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L120
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L127
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L134
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L141
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L103
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L79
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L104
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L107
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L84
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L90
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L102
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L108
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L114
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L120
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L127
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L134
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L141
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L109
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L128
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L135
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L110
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L129
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L136
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L113
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L84
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L90
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L102
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L108
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L114
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L120
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L127
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L134
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L141
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L115
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L116
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L119
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L84
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L90
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L102
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L108
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L114
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L120
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L127
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L134
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L141
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L121
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L122
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L126
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L84
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L90
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L102
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L108
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L114
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L120
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L127
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L134
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L141
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L109
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L128
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L135
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L110
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L129
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L136
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L133
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L84
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L90
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L102
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L108
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L114
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L120
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L127
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L134
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L141
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L109
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L128
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L135
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L110
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L129
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L136
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L83
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L89
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L101
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L140
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L84
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L90
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L102
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L108
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L114
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L120
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L127
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L134
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L141
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L142
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L143
File: ProposeDAOV3UpgradeTestnet.s.sol
83 : targets[i] = timelockV2;
84 : values[i] = ethToSendToNewTimelock;
85 : signatures[i] = '' ;
86 : calldatas[i] = '' ;
111 : calldatas[i] = '' ;
90 : targets[i] = address (daoProxy);
96 : targets[i] = address (daoProxy);
108 : targets[i] = address (daoProxy);
132 : targets[i] = address (daoProxy);
91 : values[i] = 0 ;
97 : values[i] = 0 ;
109 : values[i] = 0 ;
115 : values[i] = 0 ;
121 : values[i] = 0 ;
127 : values[i] = 0 ;
133 : values[i] = 0 ;
92 : signatures[i] = '_setImplementation(address) ' ;
93 : calldatas[i] = abi.encode (daoV3Implementation);
90 : targets[i] = address (daoProxy);
96 : targets[i] = address (daoProxy);
108 : targets[i] = address (daoProxy);
132 : targets[i] = address (daoProxy);
91 : values[i] = 0 ;
97 : values[i] = 0 ;
109 : values[i] = 0 ;
115 : values[i] = 0 ;
121 : values[i] = 0 ;
127 : values[i] = 0 ;
133 : values[i] = 0 ;
93 : calldatas[i] = abi.encode (
99 : calldatas[i] = abi.encode (
117 : calldatas[i] = abi.encode (
123 : calldatas[i] = abi.encode (
129 : calldatas[i] = abi.encode (
135 : calldatas[i] = abi.encode (
90 : targets[i] = address (daoProxy);
96 : targets[i] = address (daoProxy);
108 : targets[i] = address (daoProxy);
132 : targets[i] = address (daoProxy);
91 : values[i] = 0 ;
97 : values[i] = 0 ;
109 : values[i] = 0 ;
115 : values[i] = 0 ;
121 : values[i] = 0 ;
127 : values[i] = 0 ;
133 : values[i] = 0 ;
110 : signatures[i] = '_setVoteSnapshotBlockSwitchProposalId() ' ;
86 : calldatas[i] = '' ;
111 : calldatas[i] = '' ;
114 : targets[i] = auctionHouseProxy;
91 : values[i] = 0 ;
97 : values[i] = 0 ;
109 : values[i] = 0 ;
115 : values[i] = 0 ;
121 : values[i] = 0 ;
127 : values[i] = 0 ;
133 : values[i] = 0 ;
116 : signatures[i] = 'transferOwnership(address) ' ;
117 : calldatas[i] = abi.encode (timelockV2);
120 : targets[i] = stETH;
91 : values[i] = 0 ;
97 : values[i] = 0 ;
109 : values[i] = 0 ;
115 : values[i] = 0 ;
121 : values[i] = 0 ;
127 : values[i] = 0 ;
133 : values[i] = 0 ;
122 : signatures[i] = 'approve(address,uint256) ' ;
123 : calldatas[i] = abi.encode (erc20Transferer, type (uint256 ).max);
126 : targets[i] = erc20Transferer;
91 : values[i] = 0 ;
97 : values[i] = 0 ;
109 : values[i] = 0 ;
115 : values[i] = 0 ;
121 : values[i] = 0 ;
127 : values[i] = 0 ;
133 : values[i] = 0 ;
128 : signatures[i] = 'transferEntireBalance(address,address) ' ;
129 : calldatas[i] = abi.encode (stETH, timelockV2);
90 : targets[i] = address (daoProxy);
96 : targets[i] = address (daoProxy);
108 : targets[i] = address (daoProxy);
132 : targets[i] = address (daoProxy);
91 : values[i] = 0 ;
97 : values[i] = 0 ;
109 : values[i] = 0 ;
115 : values[i] = 0 ;
121 : values[i] = 0 ;
127 : values[i] = 0 ;
133 : values[i] = 0 ;
134 : signatures[i] = '_setTimelocksAndAdmin(address,address,address) ' ;
135 : calldatas[i] = abi.encode (timelockV2, timelockV1, timelockV2);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L83
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L84
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L85
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L86
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L111
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L90
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L96
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L108
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L132
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L91
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L97
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L109
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L115
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L121
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L127
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L133
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L92
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L93
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L90
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L96
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L108
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L132
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L91
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L97
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L109
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L115
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L121
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L127
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L133
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L93
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L99
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L117
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L123
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L129
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L135
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L90
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L96
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L108
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L132
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L91
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L97
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L109
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L115
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L121
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L127
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L133
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L110
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L86
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L111
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L114
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L91
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L97
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L109
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L115
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L121
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L127
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L133
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L116
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L117
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L120
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L91
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L97
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L109
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L115
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L121
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L127
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L133
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L122
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L123
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L126
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L91
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L97
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L109
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L115
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L121
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L127
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L133
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L128
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L129
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L90
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L96
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L108
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L132
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L91
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L97
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L109
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L115
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L121
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L127
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L133
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L134
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L135
File: ProposeTimelockMigrationCleanupMainnet.s.sol
60 : targets[i] = auctionHouseProxyAdmin;
61 : values[i] = 0 ;
75 : values[i] = 0 ;
82 : values[i] = 0 ;
89 : values[i] = 0 ;
96 : values[i] = 0 ;
62 : signatures[i] = 'transferOwnership(address) ' ;
90 : signatures[i] = 'transferOwnership(address) ' ;
97 : signatures[i] = 'transferOwnership(address) ' ;
63 : calldatas[i] = abi.encode (timelockV2);
91 : calldatas[i] = abi.encode (timelockV2);
98 : calldatas[i] = abi.encode (timelockV2);
67 : targets[i] = timelockV2;
68 : values[i] = timelockV1.balance;
69 : signatures[i] = '' ;
70 : calldatas[i] = '' ;
74 : targets[i] = lilNouns;
61 : values[i] = 0 ;
75 : values[i] = 0 ;
82 : values[i] = 0 ;
89 : values[i] = 0 ;
96 : values[i] = 0 ;
76 : signatures[i] = 'setApprovalForAll(address,bool) ' ;
77 : calldatas[i] = abi.encode (timelockV2, true );
81 : targets[i] = nounsToken;
61 : values[i] = 0 ;
75 : values[i] = 0 ;
82 : values[i] = 0 ;
89 : values[i] = 0 ;
96 : values[i] = 0 ;
83 : signatures[i] = 'transferFrom(address,address,uint256) ' ;
84 : calldatas[i] = abi.encode (timelockV1, timelockV2, 687 );
88 : targets[i] = TOKEN_BUYER_MAINNET;
61 : values[i] = 0 ;
75 : values[i] = 0 ;
82 : values[i] = 0 ;
89 : values[i] = 0 ;
96 : values[i] = 0 ;
62 : signatures[i] = 'transferOwnership(address) ' ;
90 : signatures[i] = 'transferOwnership(address) ' ;
97 : signatures[i] = 'transferOwnership(address) ' ;
63 : calldatas[i] = abi.encode (timelockV2);
91 : calldatas[i] = abi.encode (timelockV2);
98 : calldatas[i] = abi.encode (timelockV2);
95 : targets[i] = PAYER_MAINNET;
61 : values[i] = 0 ;
75 : values[i] = 0 ;
82 : values[i] = 0 ;
89 : values[i] = 0 ;
96 : values[i] = 0 ;
62 : signatures[i] = 'transferOwnership(address) ' ;
90 : signatures[i] = 'transferOwnership(address) ' ;
97 : signatures[i] = 'transferOwnership(address) ' ;
63 : calldatas[i] = abi.encode (timelockV2);
91 : calldatas[i] = abi.encode (timelockV2);
98 : calldatas[i] = abi.encode (timelockV2);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeTimelockMigrationCleanupMainnet.s.sol#L60
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeTimelockMigrationCleanupMainnet.s.sol#L61
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeTimelockMigrationCleanupMainnet.s.sol#L75
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeTimelockMigrationCleanupMainnet.s.sol#L82
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeTimelockMigrationCleanupMainnet.s.sol#L89
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeTimelockMigrationCleanupMainnet.s.sol#L96
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeTimelockMigrationCleanupMainnet.s.sol#L62
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeTimelockMigrationCleanupMainnet.s.sol#L90
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeTimelockMigrationCleanupMainnet.s.sol#L97
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeTimelockMigrationCleanupMainnet.s.sol#L63
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeTimelockMigrationCleanupMainnet.s.sol#L91
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeTimelockMigrationCleanupMainnet.s.sol#L98
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeTimelockMigrationCleanupMainnet.s.sol#L67
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeTimelockMigrationCleanupMainnet.s.sol#L68
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeTimelockMigrationCleanupMainnet.s.sol#L69
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeTimelockMigrationCleanupMainnet.s.sol#L70
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeTimelockMigrationCleanupMainnet.s.sol#L74
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeTimelockMigrationCleanupMainnet.s.sol#L61
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeTimelockMigrationCleanupMainnet.s.sol#L75
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeTimelockMigrationCleanupMainnet.s.sol#L82
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeTimelockMigrationCleanupMainnet.s.sol#L89
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeTimelockMigrationCleanupMainnet.s.sol#L96
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeTimelockMigrationCleanupMainnet.s.sol#L76
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeTimelockMigrationCleanupMainnet.s.sol#L77
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeTimelockMigrationCleanupMainnet.s.sol#L81
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeTimelockMigrationCleanupMainnet.s.sol#L61
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeTimelockMigrationCleanupMainnet.s.sol#L75
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeTimelockMigrationCleanupMainnet.s.sol#L82
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeTimelockMigrationCleanupMainnet.s.sol#L89
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeTimelockMigrationCleanupMainnet.s.sol#L96
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeTimelockMigrationCleanupMainnet.s.sol#L83
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeTimelockMigrationCleanupMainnet.s.sol#L84
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeTimelockMigrationCleanupMainnet.s.sol#L88
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeTimelockMigrationCleanupMainnet.s.sol#L61
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeTimelockMigrationCleanupMainnet.s.sol#L75
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeTimelockMigrationCleanupMainnet.s.sol#L82
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeTimelockMigrationCleanupMainnet.s.sol#L89
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeTimelockMigrationCleanupMainnet.s.sol#L96
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeTimelockMigrationCleanupMainnet.s.sol#L62
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeTimelockMigrationCleanupMainnet.s.sol#L90
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeTimelockMigrationCleanupMainnet.s.sol#L97
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeTimelockMigrationCleanupMainnet.s.sol#L63
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeTimelockMigrationCleanupMainnet.s.sol#L91
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeTimelockMigrationCleanupMainnet.s.sol#L98
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeTimelockMigrationCleanupMainnet.s.sol#L95
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeTimelockMigrationCleanupMainnet.s.sol#L61
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeTimelockMigrationCleanupMainnet.s.sol#L75
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeTimelockMigrationCleanupMainnet.s.sol#L82
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeTimelockMigrationCleanupMainnet.s.sol#L89
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeTimelockMigrationCleanupMainnet.s.sol#L96
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeTimelockMigrationCleanupMainnet.s.sol#L62
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeTimelockMigrationCleanupMainnet.s.sol#L90
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeTimelockMigrationCleanupMainnet.s.sol#L97
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeTimelockMigrationCleanupMainnet.s.sol#L63
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeTimelockMigrationCleanupMainnet.s.sol#L91
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeTimelockMigrationCleanupMainnet.s.sol#L98
Saves a storage slot for the mapping. Depending on the circumstances and sizes of types, can avoid a Gsset (20000 gas) per mapping combined. Reads and subsequent writes can also be cheaper when a function requires both values and they both fit in the same storage slot.
File: NounsDAOInterfaces.sol
309 : mapping (address => uint256 ) public latestProposalIds;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOInterfaces.sol#L309
File: NounsDAOInterfaces.sol
409 : mapping (address => uint256 ) public latestProposalIds;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOInterfaces.sol#L409
File: NounsDAOInterfaces.sol
347 : mapping (address => Receipt) receipts;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOInterfaces.sol#L347
File: NounsDAOInterfaces.sol
447 : mapping (address => Receipt) receipts;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOInterfaces.sol#L447
File: NounsDAOInterfaces.sol
755 : mapping (address => Receipt) receipts;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOInterfaces.sol#L755
File: NounsDAOInterfaces.sol
681 : mapping (address => uint256 ) latestProposalIds;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOInterfaces.sol#L681
File: NounsDAOInterfaces.sol
688 : mapping (address => mapping (bytes32 => bool )) cancelledSigs;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOInterfaces.sol#L688
File: NounsDAOStorageV1Fork.sol
52 : mapping (address => uint256 ) public latestProposalIds;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOStorageV1Fork.sol#L52
File: NounsDAOStorageV1Fork.sol
92 : mapping (address => Receipt) receipts;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOStorageV1Fork.sol#L92
File: ERC721CheckpointableUpgradeable .sol
55 : mapping (address => address ) private _delegates;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/base/ERC721CheckpointableUpgradeable.sol#L55
File: ERC721CheckpointableUpgradeable .sol
64 : mapping (address => mapping (uint32 => Checkpoint)) public checkpoints;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/base/ERC721CheckpointableUpgradeable.sol#L64
File: ERC721CheckpointableUpgradeable .sol
67 : mapping (address => uint32 ) public numCheckpoints;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/base/ERC721CheckpointableUpgradeable.sol#L67
File: ERC721CheckpointableUpgradeable .sol
78 : mapping (address => uint256 ) public nonces;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/base/ERC721CheckpointableUpgradeable.sol#L78
* 2 is equivalent to << 1 and / 2 is the same as >> 1. The MUL and DIV opcodes cost 5 gas, whereas SHL and SHR only cost 3 gas
File: NounsDAOLogicV2.sol
1010 : uint256 center = upper - (upper - lower) / 2 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L1010
File: NounsDAOV3DynamicQuorum.sol
110 : uint256 center = upper - (upper - lower) / 2 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3DynamicQuorum.sol#L110
File: ERC721CheckpointableUpgradeable .sol
196 : uint32 center = upper - (upper - lower) / 2 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/base/ERC721CheckpointableUpgradeable.sol#L196
File: NounsAuctionHouseFork.sol
273 : (bool success , ) = to.call { value: value, gas: 30_000 }(new bytes (0 ));
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/NounsAuctionHouseFork.sol#L273
Contracts most called functions could simply save gas by function ordering via Method ID. Calling a function at runtime will be cheaper if the function is positioned earlier in the order (has a relatively lower Method ID) because 22 gas are added to the cost of a function for every position that came before it. The caller can save on gas if you prioritize most called functions.
See more here
All in-scope contracts
Recommended Mitigation Steps
Find a lower method ID name for the most called functions for example Call() vs. Call1() is cheaper by 22 gas
For example, the function IDs in the Gauge.sol contract will be the most used; A lower method ID may be given.
File: NounsDAOV3Proposals.sol
592 : votes += nouns.getPriorVotes (signers[i], block .number - 1 );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L592
File: NounsDAOV3Proposals.sol
839 : votes += signerVotes;
851 : votes += nouns.getPriorVotes (msg .sender , block .number - 1 );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L839
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L851
File: NounsDAOForkEscrow.sol
124 : numTokensInEscrow -= tokenIds.length ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/NounsDAOForkEscrow.sol#L124
File: NounsTokenFork.sol
156 : remainingTokensToClaim -= tokenIds.length ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/NounsTokenFork.sol#L156
The following structs contain time variables that are unlikely to ever reach max uint256
then it is possible to set them as uint32
, saving gas slots. Max value of uint32
is equal to Year 2016, which is more than enough.
File: NounsDAOInterfaces.sol
653 : struct StorageV3 {
// ================ PROXY ================ //
/// @notice Administrator for this contract
address admin;
/// @notice Pending administrator for this contract
address pendingAdmin;
/// @notice Active brains of Governor
address implementation;
// ================ V1 ================ //
/// @notice Vetoer who has the ability to veto any proposal
address vetoer;
/// @notice The delay before voting on a proposal may take place, once proposed, in blocks
uint256 votingDelay;
/// @notice The duration of voting on a proposal, in blocks
uint256 votingPeriod;
/// @notice The basis point number of votes required in order for a voter to become a proposer. *DIFFERS from GovernerBravo
uint256 proposalThresholdBPS;
/// @notice The basis point number of votes in support of a proposal required in order for a quorum to be reached and for a vote to succeed. *DIFFERS from GovernerBravo
uint256 quorumVotesBPS;
/// @notice The total number of proposals
uint256 proposalCount;
/// @notice The address of the Nouns DAO Executor NounsDAOExecutor
INounsDAOExecutorV2 timelock;
/// @notice The address of the Nouns tokens
NounsTokenLike nouns;
/// @notice The official record of all proposals ever proposed
mapping (uint256 => Proposal) _proposals;
/// @notice The latest proposal for each proposer
mapping (address => uint256 ) latestProposalIds;
// ================ V2 ================ //
DynamicQuorumParamsCheckpoint[] quorumParamsCheckpoints;
/// @notice Pending new vetoer
address pendingVetoer;
// ================ V3 ================ //
/// @notice user => sig => isCancelled: signatures that have been cancelled by the signer and are no longer valid
mapping (address => mapping (bytes32 => bool )) cancelledSigs;
/// @notice The number of blocks before voting ends during which the objection period can be initiated
uint32 lastMinuteWindowInBlocks;
/// @notice Length of the objection period in blocks
uint32 objectionPeriodDurationInBlocks;
/// @notice Length of proposal updatable period in block
uint32 proposalUpdatablePeriodInBlocks;
/// @notice address of the DAO's fork escrow contract
INounsDAOForkEscrow forkEscrow;
/// @notice address of the DAO's fork deployer contract
IForkDAODeployer forkDAODeployer;
/// @notice ERC20 tokens to include when sending funds to a deployed fork
address [] erc20TokensToIncludeInFork;
/// @notice The treasury contract of the last deployed fork
address forkDAOTreasury;
/// @notice The token contract of the last deployed fork
address forkDAOToken;
/// @notice Timestamp at which the last fork period ends
uint256 forkEndTimestamp;
/// @notice Fork period in seconds
uint256 forkPeriod;
/// @notice Threshold defined in basis points (10,000 = 100%) required for forking
uint256 forkThresholdBPS;
/// @notice Address of the original timelock
INounsDAOExecutor timelockV1;
/// @notice The proposal at which to start using `startBlock` instead of `creationBlock` for vote snapshots
/// @dev Make sure this stays the last variable in this struct, so we can delete it in the next version
/// @dev To be zeroed-out and removed in a V3.1 fix version once the switch takes place
uint256 voteSnapshotBlockSwitchProposalId;
}
Can lower most block and time related `uint256 ` to `uint32 `
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOInterfaces.sol#L653
```solidity
782 : struct ProposerSignature {
/// @notice Signature of a proposal
bytes sig;
/// @notice The address of the signer
address signer;
/// @notice The timestamp until which the signature is valid
uint256 expirationTimestamp;
}
Can be changed to
782 : struct ProposerSignature {
/// @notice Signature of a proposal
bytes sig;
/// @notice The address of the signer
address signer;
/// @notice The timestamp until which the signature is valid
uint32 expirationTimestamp;
}
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOInterfaces.sol#L782
If needed, the values can be read from the verified contract source code, or if there are multiple values there can be a single getter function that returns a tuple of the values of all currently-public constants. Saves 3406-3606 gas in deployment gas due to the compiler not having to create non-payable getter functions for deployment calldata, not having to store the bytes of the value outside of where it's used, and not adding another entry to the method ID table
File: NounsDAOExecutor.sol
62 : uint256 public constant GRACE_PERIOD = 14 days ;
63 : uint256 public constant MINIMUM_DELAY = 2 days ;
64 : uint256 public constant MAXIMUM_DELAY = 30 days ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutor.sol#L62-L64
File: NounsDAOExecutorV2.sol
82 : string public constant NAME = 'NounsDAOExecutorV2 ' ;
85 : uint256 public constant GRACE_PERIOD = 21 days ;
86 : uint256 public constant MINIMUM_DELAY = 2 days ;
87 : uint256 public constant MAXIMUM_DELAY = 30 days ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutorV2.sol#L82
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutorV2.sol#L85
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutorV2.sol#L86
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutorV2.sol#L87
File: NounsDAOLogicV2.sol
59 : string public constant name = 'Nouns DAO ' ;
62 : uint256 public constant MIN_PROPOSAL_THRESHOLD_BPS = 1 ; // 1 basis point or 0.01%
65 : uint256 public constant MAX_PROPOSAL_THRESHOLD_BPS = 1_000 ; // 1,000 basis points or 10%
68 : uint256 public constant MIN_VOTING_PERIOD = 5_760 ; // About 24 hours
71 : uint256 public constant MAX_VOTING_PERIOD = 80_640 ; // About 2 weeks
74 : uint256 public constant MIN_VOTING_DELAY = 1 ;
77 : uint256 public constant MAX_VOTING_DELAY = 40_320 ; // About 1 week
80 : uint256 public constant MIN_QUORUM_VOTES_BPS_LOWER_BOUND = 200 ; // 200 basis points or 2%
83 : uint256 public constant MIN_QUORUM_VOTES_BPS_UPPER_BOUND = 2_000 ; // 2,000 basis points or 20%
86 : uint256 public constant MAX_QUORUM_VOTES_BPS_UPPER_BOUND = 6_000 ; // 4,000 basis points or 60%
89 : uint256 public constant MAX_QUORUM_VOTES_BPS = 2_000 ; // 2,000 basis points or 20%
92 : uint256 public constant proposalMaxOperations = 10 ; // 10 actions
95 : uint256 public constant MAX_REFUND_PRIORITY_FEE = 2 gwei ;
98 : uint256 public constant REFUND_BASE_GAS = 36000 ;
101 : uint256 public constant MAX_REFUND_GAS_USED = 200_000 ;
104 : uint256 public constant MAX_REFUND_BASE_FEE = 200 gwei ;
107 : bytes32 public constant DOMAIN_TYPEHASH =
111 : bytes32 public constant BALLOT_TYPEHASH = keccak256 ('Ballot(uint256 proposalId,uint8 support) ' );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L59
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L62
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L65
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L68
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L71
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L74
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L77
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L80
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L83
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L86
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L89
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L92
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L95
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L98
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L101
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L104
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L107
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L111
File: NounsDAOV3Admin.sol
112 : uint256 public constant MIN_PROPOSAL_THRESHOLD_BPS = 1 ; // 1 basis point or 0.01%
115 : uint256 public constant MAX_PROPOSAL_THRESHOLD_BPS = 1_000 ; // 1,000 basis points or 10%
118 : uint256 public constant MIN_VOTING_PERIOD_BLOCKS = 1 days / 12 ;
121 : uint256 public constant MAX_VOTING_PERIOD_BLOCKS = 2 weeks / 12 ;
124 : uint256 public constant MIN_VOTING_DELAY_BLOCKS = 1 ;
127 : uint256 public constant MAX_VOTING_DELAY_BLOCKS = 2 weeks / 12 ;
130 : uint256 public constant MIN_QUORUM_VOTES_BPS_LOWER_BOUND = 200 ; // 200 basis points or 2%
133 : uint256 public constant MIN_QUORUM_VOTES_BPS_UPPER_BOUND = 2_000 ; // 2,000 basis points or 20%
136 : uint256 public constant MAX_QUORUM_VOTES_BPS_UPPER_BOUND = 6_000 ; // 6,000 basis points or 60%
139 : uint256 public constant MAX_FORK_PERIOD = 14 days ;
142 : uint256 public constant MIN_FORK_PERIOD = 2 days ;
145 : uint256 public constant MAX_OBJECTION_PERIOD_BLOCKS = 7 days / 12 ;
148 : uint256 public constant MAX_UPDATABLE_PERIOD_BLOCKS = 7 days / 12 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L112
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L115
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L118
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L121
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L124
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L127
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L130
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L133
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L136
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L139
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L142
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L145
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L148
File: NounsDAOV3Proposals.sol
139 : uint256 public constant PROPOSAL_MAX_OPERATIONS = 10 ; // 10 actions
141 : bytes32 public constant DOMAIN_TYPEHASH =
144 : bytes32 public constant PROPOSAL_TYPEHASH =
149 : bytes32 public constant UPDATE_PROPOSAL_TYPEHASH =
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L139
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L141
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L144
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L149
File: NounsDAOV3Votes.sol
44 : string public constant name = 'Nouns DAO ' ;
47 : bytes32 public constant DOMAIN_TYPEHASH =
51 : bytes32 public constant BALLOT_TYPEHASH = keccak256 ('Ballot(uint256 proposalId,uint8 support) ' );
54 : uint256 public constant MAX_REFUND_PRIORITY_FEE = 2 gwei ;
57 : uint256 public constant REFUND_BASE_GAS = 36000 ;
60 : uint256 public constant MAX_REFUND_GAS_USED = 200_000 ;
63 : uint256 public constant MAX_REFUND_BASE_FEE = 200 gwei ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Votes.sol#L44
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Votes.sol#L47
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Votes.sol#L51
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Votes.sol#L54
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Votes.sol#L57
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Votes.sol#L60
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Votes.sol#L63
File: NounsAuctionHouseFork.sol
48 : string public constant NAME = 'NounsAuctionHouseFork ' ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/NounsAuctionHouseFork.sol#L48
File: NounsDAOLogicV1Fork.sol
116 : string public constant name = 'Nouns DAO ' ;
119 : uint256 public constant MIN_PROPOSAL_THRESHOLD_BPS = 1 ; // 1 basis point or 0.01%
122 : uint256 public constant MAX_PROPOSAL_THRESHOLD_BPS = 1_000 ; // 1,000 basis points or 10%
125 : uint256 public constant MIN_VOTING_PERIOD = 7_200 ; // 24 hours
128 : uint256 public constant MAX_VOTING_PERIOD = 100_800 ; // 2 weeks
131 : uint256 public constant MIN_VOTING_DELAY = 1 ;
134 : uint256 public constant MAX_VOTING_DELAY = 100_800 ; // 2 weeks
137 : uint256 public constant MIN_QUORUM_VOTES_BPS = 200 ; // 200 basis points or 2%
140 : uint256 public constant MAX_QUORUM_VOTES_BPS = 2_000 ; // 2,000 basis points or 20%
143 : uint256 public constant proposalMaxOperations = 10 ; // 10 actions
146 : bytes32 public constant DOMAIN_TYPEHASH =
150 : bytes32 public constant BALLOT_TYPEHASH = keccak256 ('Ballot(uint256 proposalId,uint8 support) ' );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L116
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L119
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L122
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L125
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L128
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L131
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L134
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L137
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L140
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L143
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L146
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L150
File: NounsTokenFork.sol
46 : string public constant NAME = 'NounsTokenFork ' ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/NounsTokenFork.sol#L46
File: ERC721CheckpointableUpgradeable .sol
52 : uint8 public constant decimals = 0 ;
70 : bytes32 public constant DOMAIN_TYPEHASH =
74 : bytes32 public constant DELEGATION_TYPEHASH =
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/base/ERC721CheckpointableUpgradeable.sol#L52
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/base/ERC721CheckpointableUpgradeable.sol#L70
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/base/ERC721CheckpointableUpgradeable.sol#L74
File: DeployDAOV3DataContractsBase.s.sol
10 : uint256 public constant CREATE_CANDIDATE_COST = 0.01 ether ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/DeployDAOV3DataContractsBase.s.sol#L10
File: DeployDAOV3DataContractsGoerli.s.sol
8 : address public constant NOUNS_DAO_PROXY_GOERLI = 0x34b74B5c1996b37e5e3EDB756731A5812FF43F67 ;
9 : address public constant NOUNS_TIMELOCK_V2_PROXY_GOERLI = 0xc1A82A952d48E015beA401AC982AA3D019AAA91E ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/DeployDAOV3DataContractsGoerli.s.sol#L8-L9
File: DeployDAOV3DataContractsSepolia.s.sol
8 : address public constant NOUNS_DAO_PROXY_SEPOLIA = 0x35d2670d7C8931AACdd37C89Ddcb0638c3c44A57 ;
9 : address public constant NOUNS_TIMELOCK_V2_PROXY_SEPOLIA = 0x07e5D6a1550aD5E597A9b0698A474AA080A2fB28 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/DeployDAOV3DataContractsSepolia.s.sol#L8-L9
File: DeployDAOV3NewContractsBase.s.sol
19 : uint256 public constant DELAYED_GOV_DURATION = 30 days ;
22 : uint256 public constant FORK_DAO_PROPOSAL_THRESHOLD_BPS = 25 ; // 0.25%
23 : uint256 public constant FORK_DAO_QUORUM_VOTES_BPS = 1000 ; // 10%
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/DeployDAOV3NewContractsBase.s.sol#L19
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/DeployDAOV3NewContractsBase.s.sol#L22
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/DeployDAOV3NewContractsBase.s.sol#L23
File: DeployDAOV3NewContractsMainnet.s.sol
8 : address public constant NOUNS_DAO_PROXY_MAINNET = 0x6f3E6272A167e8AcCb32072d08E0957F9c79223d ;
9 : address public constant NOUNS_TIMELOCK_V1_MAINNET = 0x0BC3807Ec262cB779b38D65b38158acC3bfedE10 ;
10 : uint256 public constant FORK_DAO_VOTING_PERIOD = 36000 ; // 5 days
11 : uint256 public constant FORK_DAO_VOTING_DELAY = 36000 ; // 5 days
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/DeployDAOV3NewContractsMainnet.s.sol#L8-L11
File: DeployDAOV3NewContractsTestnet.s.sol
8 : address public constant NOUNS_DAO_PROXY_GOERLI = 0x9e6D4B42b8Dc567AC4aeCAB369Eb9a3156dF095C ;
9 : address public constant NOUNS_TIMELOCK_V1_GOERLI = 0xADa0F1A73D1df49477fa41C7F8476F9eA5aB115f ;
10 : uint256 public constant FORK_DAO_VOTING_PERIOD = 40 ; // 8 minutes
27 : uint256 public constant FORK_DAO_VOTING_PERIOD = 40 ; // 8 minutes
11 : uint256 public constant FORK_DAO_VOTING_DELAY = 1 ;
28 : uint256 public constant FORK_DAO_VOTING_DELAY = 1 ;
25 : address public constant NOUNS_DAO_PROXY_SEPOLIA = 0x35d2670d7C8931AACdd37C89Ddcb0638c3c44A57 ;
26 : address public constant NOUNS_TIMELOCK_V1_SEPOLIA = 0x332db58b51393f3a6b28d4DD8964234967e1aD33 ;
10 : uint256 public constant FORK_DAO_VOTING_PERIOD = 40 ; // 8 minutes
27 : uint256 public constant FORK_DAO_VOTING_PERIOD = 40 ; // 8 minutes
11 : uint256 public constant FORK_DAO_VOTING_DELAY = 1 ;
28 : uint256 public constant FORK_DAO_VOTING_DELAY = 1 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/DeployDAOV3NewContractsTestnet.s.sol#L8
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/DeployDAOV3NewContractsTestnet.s.sol#L9
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/DeployDAOV3NewContractsTestnet.s.sol#L10
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/DeployDAOV3NewContractsTestnet.s.sol#L27
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/DeployDAOV3NewContractsTestnet.s.sol#L11
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/DeployDAOV3NewContractsTestnet.s.sol#L28
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/DeployDAOV3NewContractsTestnet.s.sol#L25
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/DeployDAOV3NewContractsTestnet.s.sol#L26
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/DeployDAOV3NewContractsTestnet.s.sol#L10
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/DeployDAOV3NewContractsTestnet.s.sol#L27
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/DeployDAOV3NewContractsTestnet.s.sol#L11
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/DeployDAOV3NewContractsTestnet.s.sol#L28
File: ProposeDAOV3UpgradeMainnet.s.sol
10 : NounsDAOLogicV1 public constant NOUNS_DAO_PROXY_MAINNET =
12 : address public constant NOUNS_TIMELOCK_V1_MAINNET = 0x0BC3807Ec262cB779b38D65b38158acC3bfedE10 ;
14 : uint256 public constant ETH_TO_SEND_TO_NEW_TIMELOCK = 10000 ether ;
15 : uint256 public constant FORK_PERIOD = 7 days ;
16 : uint256 public constant FORK_THRESHOLD_BPS = 2000 ;
18 : address public constant STETH_MAINNET = 0xae7ab96520DE3A18E5e111B5EaAb095312D7fE84 ;
19 : address public constant AUCTION_HOUSE_PROXY_MAINNET = 0x830BD73E4184ceF73443C15111a1DF14e495C706 ;
20 : address public constant NOUNS_TOKEN_MAINNET = 0x9C8fF314C9Bc7F6e59A9d9225Fb22946427eDC03 ;
21 : address public constant DESCRIPTOR_MAINNET = 0x6229c811D04501523C6058bfAAc29c91bb586268 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L10
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L12
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L14
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L15
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L16
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L18
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L19
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L20
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L21
File: ProposeDAOV3UpgradeTestnet.s.sol
10 : uint256 public constant ETH_TO_SEND_TO_NEW_TIMELOCK = 0.001 ether ;
11 : uint256 public constant FORK_PERIOD = 1 hours ;
12 : uint256 public constant FORK_THRESHOLD_BPS = 2000 ;
142 : NounsDAOLogicV1 public constant NOUNS_DAO_PROXY_GOERLI =
144 : address public constant NOUNS_TIMELOCK_V1_GOERLI = 0xADa0F1A73D1df49477fa41C7F8476F9eA5aB115f ;
145 : address public constant AUCTION_HOUSE_PROXY_GOERLI = 0x17e8512851Db9F04164Aa54A6e62f368acCF9D0c ;
146 : address public constant STETH_GOERLI = 0x1643E812aE58766192Cf7D2Cf9567dF2C37e9B7F ;
159 : NounsDAOLogicV1 public constant NOUNS_DAO_PROXY_SEPOLIA =
161 : address public constant NOUNS_TIMELOCK_V1_SEPOLIA = 0x332db58b51393f3a6b28d4DD8964234967e1aD33 ;
162 : address public constant AUCTION_HOUSE_PROXY_SEPOLIA = 0x488609b7113FCf3B761A05956300d605E8f6BcAf ;
163 : address public constant STETH_SEPOLIA = 0xf16e3ab44cC450fCbe5E890322Ee715f3f7eAC29 ; // ERC20Mock
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L10
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L11
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L12
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L142
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L144
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L145
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L146
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L159
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L161
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L162
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L163
File: ProposeENSReverseLookupConfigMainnet.s.sol
13 : NounsDAOLogicV3 public constant NOUNS_DAO_PROXY_MAINNET =
15 : address public constant ENS_REVERSE_REGISTRAR_MAINNET = 0xa58E81fe9b61B5c3fE2AFD33CF304c454AbFc7Cb ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeENSReverseLookupConfigMainnet.s.sol#L13
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeENSReverseLookupConfigMainnet.s.sol#L15
File: ProposeTimelockMigrationCleanupMainnet.s.sol
13 : NounsDAOLogicV3 public constant NOUNS_DAO_PROXY_MAINNET =
15 : address public constant NOUNS_TIMELOCK_V1_MAINNET = 0x0BC3807Ec262cB779b38D65b38158acC3bfedE10 ;
16 : address public constant NOUNS_TOKEN_MAINNET = 0x9C8fF314C9Bc7F6e59A9d9225Fb22946427eDC03 ;
17 : address public constant AUCTION_HOUSE_PROXY_ADMIN_MAINNET = 0xC1C119932d78aB9080862C5fcb964029f086401e ;
18 : address public constant LILNOUNS_MAINNET = 0x4b10701Bfd7BFEdc47d50562b76b436fbB5BdB3B ;
19 : address public constant TOKEN_BUYER_MAINNET = 0x4f2aCdc74f6941390d9b1804faBc3E780388cfe5 ;
20 : address public constant PAYER_MAINNET = 0xd97Bcd9f47cEe35c0a9ec1dc40C1269afc9E8E1D ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeTimelockMigrationCleanupMainnet.s.sol#L13
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeTimelockMigrationCleanupMainnet.s.sol#L15
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeTimelockMigrationCleanupMainnet.s.sol#L16
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeTimelockMigrationCleanupMainnet.s.sol#L17
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeTimelockMigrationCleanupMainnet.s.sol#L18
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeTimelockMigrationCleanupMainnet.s.sol#L19
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeTimelockMigrationCleanupMainnet.s.sol#L20
Recommended Mitigation Steps
Set variable to private.
It's used to print the values of variables while running tests to help debug and see what's happening inside your contracts but since it's a development tool, it serves no purpose on mainnet.
Also, the remember to remove the usage of calls that use forge-std
when removing of the import of forge-std
.
File: DeployDAOV3DataContractsBase.s.sol
4 : import 'forge-std/Script.sol ' ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/DeployDAOV3DataContractsBase.s.sol#L4
File: DeployDAOV3DataContractsGoerli.s.sol
4 : import 'forge-std/Script.sol ' ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/DeployDAOV3DataContractsGoerli.s.sol#L4
File: DeployDAOV3DataContractsSepolia.s.sol
4 : import 'forge-std/Script.sol ' ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/DeployDAOV3DataContractsSepolia.s.sol#L4
File: DeployDAOV3NewContractsBase.s.sol
4 : import 'forge-std/Script.sol ' ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/DeployDAOV3NewContractsBase.s.sol#L4
File: DeployDAOV3NewContractsMainnet.s.sol
4 : import 'forge-std/Script.sol ' ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/DeployDAOV3NewContractsMainnet.s.sol#L4
File: DeployDAOV3NewContractsTestnet.s.sol
4 : import 'forge-std/Script.sol ' ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/DeployDAOV3NewContractsTestnet.s.sol#L4
File: ProposeDAOV3UpgradeMainnet.s.sol
4 : import 'forge-std/Script.sol ' ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L4
File: ProposeDAOV3UpgradeTestnet.s.sol
4 : import 'forge-std/Script.sol ' ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L4
File: ProposeENSReverseLookupConfigMainnet.s.sol
4 : import 'forge-std/Script.sol ' ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeENSReverseLookupConfigMainnet.s.sol#L4
File: ProposeTimelockMigrationCleanupMainnet.s.sol
4 : import 'forge-std/Script.sol ' ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeTimelockMigrationCleanupMainnet.s.sol#L4
File: NounsDAOExecutor.sol
81 : require (msg .sender == address (this ), 'NounsDAOExecutor::setDelay: Call must come from NounsDAOExecutor. ' );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutor.sol#L81
File: NounsDAOExecutor.sol
82 : require (delay_ >= MINIMUM_DELAY, 'NounsDAOExecutor::setDelay: Delay must exceed minimum delay. ' );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutor.sol#L82
File: NounsDAOExecutor.sol
83 : require (delay_ <= MAXIMUM_DELAY, 'NounsDAOExecutor::setDelay: Delay must not exceed maximum delay. ' );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutor.sol#L83
File: NounsDAOExecutor.sol
90 : require (msg .sender == pendingAdmin, 'NounsDAOExecutor::acceptAdmin: Call must come from pendingAdmin. ' );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutor.sol#L90
File: NounsDAOExecutor.sol
114 : require (msg .sender == admin, 'NounsDAOExecutor::queueTransaction: Call must come from admin. ' );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutor.sol#L114
File: NounsDAOExecutor.sol
134 : require (msg .sender == admin, 'NounsDAOExecutor::cancelTransaction: Call must come from admin. ' );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutor.sol#L134
File: NounsDAOExecutor.sol
149 : require (msg .sender == admin, 'NounsDAOExecutor::executeTransaction: Call must come from admin. ' );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutor.sol#L149
File: NounsDAOExecutor.sol
152 : require (queuedTransactions[txHash], "NounsDAOExecutor::executeTransaction: Transaction hasn ' t been queued.");
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutor.sol#L152
File: NounsDAOExecutor.sol
174 : require (success, 'NounsDAOExecutor::executeTransaction: Transaction execution reverted. ' );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutor.sol#L174
File: NounsDAOExecutorV2.sol
96 : require (delay_ >= MINIMUM_DELAY, 'NounsDAOExecutor::constructor: Delay must exceed minimum delay. ' );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutorV2.sol#L96
File: NounsDAOExecutorV2.sol
97 : require (delay_ <= MAXIMUM_DELAY, 'NounsDAOExecutor::setDelay: Delay must not exceed maximum delay. ' );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutorV2.sol#L97
File: NounsDAOExecutorV2.sol
104 : require (msg .sender == address (this ), 'NounsDAOExecutor::setDelay: Call must come from NounsDAOExecutor. ' );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutorV2.sol#L104
File: NounsDAOExecutorV2.sol
105 : require (delay_ >= MINIMUM_DELAY, 'NounsDAOExecutor::setDelay: Delay must exceed minimum delay. ' );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutorV2.sol#L105
File: NounsDAOExecutorV2.sol
106 : require (delay_ <= MAXIMUM_DELAY, 'NounsDAOExecutor::setDelay: Delay must not exceed maximum delay. ' );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutorV2.sol#L106
File: NounsDAOExecutorV2.sol
113 : require (msg .sender == pendingAdmin, 'NounsDAOExecutor::acceptAdmin: Call must come from pendingAdmin. ' );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutorV2.sol#L113
File: NounsDAOExecutorV2.sol
137 : require (msg .sender == admin, 'NounsDAOExecutor::queueTransaction: Call must come from admin. ' );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutorV2.sol#L137
File: NounsDAOExecutorV2.sol
157 : require (msg .sender == admin, 'NounsDAOExecutor::cancelTransaction: Call must come from admin. ' );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutorV2.sol#L157
File: NounsDAOExecutorV2.sol
172 : require (msg .sender == admin, 'NounsDAOExecutor::executeTransaction: Call must come from admin. ' );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutorV2.sol#L172
File: NounsDAOExecutorV2.sol
175 : require (queuedTransactions[txHash], "NounsDAOExecutor::executeTransaction: Transaction hasn ' t been queued.");
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutorV2.sol#L175
File: NounsDAOExecutorV2.sol
197 : require (success, 'NounsDAOExecutor::executeTransaction: Transaction execution reverted. ' );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutorV2.sol#L197
File: NounsDAOExecutorV2.sol
214 : require (msg .sender == admin, 'NounsDAOExecutor::sendETH: Call must come from admin. ' );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutorV2.sol#L214
File: NounsDAOExecutorV2.sol
226 : require (msg .sender == admin, 'NounsDAOExecutor::sendERC20: Call must come from admin. ' );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutorV2.sol#L226
File: NounsDAOLogicV2.sol
144 : require (address (timelock) == address (0 ), 'NounsDAO::initialize: can only initialize once ' );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L144
File: NounsDAOLogicV2.sol
148 : require (timelock_ != address (0 ), 'NounsDAO::initialize: invalid timelock address ' );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L148
File: NounsDAOLogicV2.sol
149 : require (nouns_ != address (0 ), 'NounsDAO::initialize: invalid nouns address ' );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L149
File: NounsDAOLogicV2.sol
220 : require (targets.length != 0 , 'NounsDAO::propose: must provide actions ' );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L220
File: NounsDAOLogicV2.sol
221 : require (targets.length <= proposalMaxOperations, 'NounsDAO::propose: too many actions ' );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L221
File: NounsDAOLogicV2.sol
456 : require (proposalCount >= proposalId, 'NounsDAO::state: invalid proposal id ' );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L456
File: NounsDAOLogicV2.sol
600 : require (signatory != address (0 ), 'NounsDAO::castVoteBySig: invalid signature ' );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L600
File: NounsDAOLogicV2.sol
616 : require (state (proposalId) == ProposalState.Active, 'NounsDAO::castVoteInternal: voting is closed ' );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L616
File: NounsDAOLogicV2.sol
617 : require (support <= 2 , 'NounsDAO::castVoteInternal: invalid vote type ' );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L617
File: NounsDAOLogicV2.sol
620 : require (receipt.hasVoted == false , 'NounsDAO::castVoteInternal: voter already voted ' );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L620
File: NounsDAOLogicV2.sol
838 : require (msg .sender == admin, 'NounsDAO::_setPendingAdmin: admin only ' );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L838
File: NounsDAOLogicV2.sol
856 : require (msg .sender == pendingAdmin && msg .sender != address (0 ), 'NounsDAO::_acceptAdmin: pending admin only ' );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L856
File: NounsDAOLogicV2.sol
906 : require (msg .sender == vetoer, 'NounsDAO::_burnVetoPower: vetoer only ' );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L906
File: NounsDAOProxy.sol
79 : require (msg .sender == admin, 'NounsDAOProxy::_setImplementation: admin only ' );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOProxy.sol#L79
File: NounsDAOProxy.sol
80 : require (implementation_ != address (0 ), 'NounsDAOProxy::_setImplementation: invalid implementation address ' );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOProxy.sol#L80
File: NounsDAOV3Admin.sol
334 : require (msg .sender == ds.vetoer, 'NounsDAO::_burnVetoPower: vetoer only ' );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L334
File: NounsDAOV3Proposals.sol
641 : require (ds.proposalCount >= proposalId, 'NounsDAO::state: invalid proposal id ' );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L641
File: NounsDAOV3Votes.sol
170 : require (signatory != address (0 ), 'NounsDAO::castVoteBySig: invalid signature ' );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Votes.sol#L170
File: NounsDAOV3Votes.sol
216 : require (support <= 2 , 'NounsDAO::castVoteDuringVotingPeriodInternal: invalid vote type ' );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Votes.sol#L216
File: NounsDAOV3Votes.sol
219 : require (receipt.hasVoted == false , 'NounsDAO::castVoteDuringVotingPeriodInternal: voter already voted ' );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Votes.sol#L219
File: NounsDAOV3Votes.sol
282 : require (receipt.hasVoted == false , 'NounsDAO::castVoteInternal: voter already voted ' );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Votes.sol#L282
File: NounsAuctionHouseFork.sol
124 : require (msg .value >= reservePrice, 'Must send at least reservePrice ' );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/NounsAuctionHouseFork.sol#L124
File: NounsAuctionHouseFork.sol
240 : require (! _auction.settled, 'Auction has already been settled ' );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/NounsAuctionHouseFork.sol#L240
File: NounsDAOLogicV1Fork.sol
176 : require (address (timelock) == address (0 ), 'NounsDAO::initialize: can only initialize once ' );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L176
File: NounsDAOLogicV1Fork.sol
177 : require (timelock_ != address (0 ), 'NounsDAO::initialize: invalid timelock address ' );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L177
File: NounsDAOLogicV1Fork.sol
178 : require (nouns_ != address (0 ), 'NounsDAO::initialize: invalid nouns address ' );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L178
File: NounsDAOLogicV1Fork.sol
297 : require (targets.length != 0 , 'NounsDAO::propose: must provide actions ' );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L297
File: NounsDAOLogicV1Fork.sol
298 : require (targets.length <= proposalMaxOperations, 'NounsDAO::propose: too many actions ' );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L298
File: NounsDAOLogicV1Fork.sol
452 : require (state (proposalId) != ProposalState.Executed, 'NounsDAO::cancel: cannot cancel executed proposal ' );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L452
File: NounsDAOLogicV1Fork.sol
513 : require (proposalCount >= proposalId, 'NounsDAO::state: invalid proposal id ' );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L513
File: NounsDAOLogicV1Fork.sol
601 : require (signatory != address (0 ), 'NounsDAO::castVoteBySig: invalid signature ' );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L601
File: NounsDAOLogicV1Fork.sol
617 : require (state (proposalId) == ProposalState.Active, 'NounsDAO::castVoteInternal: voting is closed ' );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L617
File: NounsDAOLogicV1Fork.sol
618 : require (support <= 2 , 'NounsDAO::castVoteInternal: invalid vote type ' );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L618
File: NounsDAOLogicV1Fork.sol
621 : require (receipt.hasVoted == false , 'NounsDAO::castVoteInternal: voter already voted ' );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L621
File: NounsDAOLogicV1Fork.sol
646 : require (msg .sender == admin, 'NounsDAO::_setVotingDelay: admin only ' );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L646
File: NounsDAOLogicV1Fork.sol
662 : require (msg .sender == admin, 'NounsDAO::_setVotingPeriod: admin only ' );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L662
File: NounsDAOLogicV1Fork.sol
679 : require (msg .sender == admin, 'NounsDAO::_setProposalThresholdBPS: admin only ' );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L679
File: NounsDAOLogicV1Fork.sol
697 : require (msg .sender == admin, 'NounsDAO::_setQuorumVotesBPS: admin only ' );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L697
File: NounsDAOLogicV1Fork.sol
715 : require (msg .sender == admin, 'NounsDAO::_setPendingAdmin: admin only ' );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L715
File: NounsDAOLogicV1Fork.sol
733 : require (msg .sender == pendingAdmin && msg .sender != address (0 ), 'NounsDAO::_acceptAdmin: pending admin only ' );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L733
File: NounsDAOLogicV1Fork.sol
790 : require (msg .sender == admin, 'NounsDAO::_authorizeUpgrade: admin only ' );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L790
File: NounsTokenFork.sol
223 : require (_exists (tokenId), 'NounsToken: URI query for nonexistent token ' );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/NounsTokenFork.sol#L223
File: NounsTokenFork.sol
232 : require (_exists (tokenId), 'NounsToken: URI query for nonexistent token ' );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/NounsTokenFork.sol#L232
File: ERC721CheckpointableUpgradeable .sol
145 : require (delegatee != address (0 ), 'ERC721Checkpointable::delegateBySig: delegatee cannot be zero address ' );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/base/ERC721CheckpointableUpgradeable.sol#L145
File: ERC721CheckpointableUpgradeable .sol
152 : require (signatory != address (0 ), 'ERC721Checkpointable::delegateBySig: invalid signature ' );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/base/ERC721CheckpointableUpgradeable.sol#L152
File: ERC721CheckpointableUpgradeable .sol
153 : require (nonce == nonces[signatory]++ , 'ERC721Checkpointable::delegateBySig: invalid nonce ' );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/base/ERC721CheckpointableUpgradeable.sol#L153
File: ERC721CheckpointableUpgradeable .sol
154 : require (block .timestamp <= expiry, 'ERC721Checkpointable::delegateBySig: signature expired ' );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/base/ERC721CheckpointableUpgradeable.sol#L154
File: ERC721CheckpointableUpgradeable .sol
176 : require (blockNumber < block .number , 'ERC721Checkpointable::getPriorVotes: not yet determined ' );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/base/ERC721CheckpointableUpgradeable.sol#L176
External calls are expensive. Results of external function calls should be cached rather than call them multiple times. Consider caching the following:
File: NounsDAOExecutor.sol
154 : getBlockTimestamp () >= eta,
158 : getBlockTimestamp () <= eta + GRACE_PERIOD,
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutor.sol#L154
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutor.sol#L158
File: NounsDAOExecutorV2.sol
177 : getBlockTimestamp () >= eta,
181 : getBlockTimestamp () <= eta + GRACE_PERIOD,
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutorV2.sol#L177
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutorV2.sol#L181
File: NounsDAOProxy.sol
108 : function _fallback () internal {
114 : returndatacopy (free_mem_ptr, 0 , returndatasize ())
118 : revert (free_mem_ptr, returndatasize ())
121 : return (free_mem_ptr, returndatasize ())
131 : _fallback ();
139 : _fallback ();
131 : _fallback ();
139 : _fallback ();
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOProxy.sol#L108
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOProxy.sol#L114
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOProxy.sol#L118
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOProxy.sol#L121
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOProxy.sol#L131
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOProxy.sol#L139
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOProxy.sol#L131
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOProxy.sol#L139
File: ProposeDAOV3UpgradeTestnet.s.sol
148 : constructor ()
165 : constructor ()
148 : constructor ()
165 : constructor ()
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L148
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L165
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L148
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L165
Inline-assembly can be used to shorten the array by changing the length slot, so that the entries don't have to be copied to a new, shorter array
File: NounsDAOV3Proposals.sol
859 : bytes32 [] memory signatureHashes = new bytes32 [](txs.signatures.length );
864 : bytes32 [] memory calldatasHashes = new bytes32 [](txs.calldatas.length );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L859
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L864
File: NounsDAOLogicV1Fork.sol
227 : uint256 [] memory balancesToSend = new uint256 [](erc20TokensToInclude.length );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L227
File: ProposeDAOV3UpgradeMainnet.s.sol
33 : address [] memory erc20TokensToIncludeInFork = new address [](1 );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L33
File: ProposeDAOV3UpgradeMainnet.s.sol
67 : address [] memory targets = new address [](numTxs);
68 : uint256 [] memory values = new uint256 [](numTxs);
69 : string [] memory signatures = new string [](numTxs);
70 : bytes [] memory calldatas = new bytes [](numTxs);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L67-L70
File: ProposeDAOV3UpgradeTestnet.s.sol
41 : address [] memory erc20TokensToIncludeInFork = new address [](1 );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L41
File: ProposeDAOV3UpgradeTestnet.s.sol
74 : address [] memory targets = new address [](numTxs);
75 : uint256 [] memory values = new uint256 [](numTxs);
76 : string [] memory signatures = new string [](numTxs);
77 : bytes [] memory calldatas = new bytes [](numTxs);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L74-L77
File: ProposeENSReverseLookupConfigMainnet.s.sol
35 : address [] memory targets = new address [](numTxs);
36 : uint256 [] memory values = new uint256 [](numTxs);
37 : string [] memory signatures = new string [](numTxs);
38 : bytes [] memory calldatas = new bytes [](numTxs);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeENSReverseLookupConfigMainnet.s.sol#L35-L38
File: ProposeTimelockMigrationCleanupMainnet.s.sol
53 : address [] memory targets = new address [](numTxs);
54 : uint256 [] memory values = new uint256 [](numTxs);
55 : string [] memory signatures = new string [](numTxs);
56 : bytes [] memory calldatas = new bytes [](numTxs);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeTimelockMigrationCleanupMainnet.s.sol#L53-L56
Instead of using operator &&
on a single require
. Using a two require
can save more gas.
i.e.
for require(version == 1 && _bytecodeHash[1] == bytes1(0), "zf");
use:
require(version == 1);
require(_bytecodeHash[1] == bytes1(0));
File: NounsDAOLogicV2.sol
856 : require (msg .sender == pendingAdmin && msg .sender != address (0 ), 'NounsDAO::_acceptAdmin: pending admin only ' );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L856
File: NounsDAOLogicV1Fork.sol
733 : require (msg .sender == pendingAdmin && msg .sender != address (0 ), 'NounsDAO::_acceptAdmin: pending admin only ' );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L733
To help the optimizer, declare a storage type variable and use it instead of repeatedly fetching the reference in a map or an array.
The effect can be quite significant.
As an example, instead of repeatedly calling someMap[someIndex], save its reference like this: SomeStruct storage someStruct = someMap[someIndex] and use it.
File: NounsDAOLogicV2.sol
303 : Proposal storage proposal = _proposals[proposalId];
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L303
File: NounsDAOLogicV2.sol
341 : Proposal storage proposal = _proposals[proposalId];
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L341
File: NounsDAOLogicV2.sol
364 : Proposal storage proposal = _proposals[proposalId];
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L364
File: NounsDAOLogicV2.sol
402 : Proposal storage proposal = _proposals[proposalId];
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L402
File: NounsDAOV3Proposals.sol
396 : NounsDAOStorageV3.Proposal storage proposal = ds._proposals[proposalId];
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L396
File: NounsDAOV3Proposals.sol
443 : NounsDAOStorageV3.Proposal storage proposal = ds._proposals[proposalId];
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L443
File: NounsDAOV3Proposals.sol
549 : NounsDAOStorageV3.Proposal storage proposal = ds._proposals[proposalId];
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L549
File: NounsDAOV3Proposals.sol
583 : NounsDAOStorageV3.Proposal storage proposal = ds._proposals[proposalId];
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L583
File: NounsDAOForkEscrow.sol
121 : escrowedTokensByForkId[forkId][tokenIds[i]] = address (0 );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/NounsDAOForkEscrow.sol#L121
File: NounsDAOLogicV1Fork.sol
395 : Proposal storage proposal = _proposals[proposalId];
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L395
File: NounsDAOLogicV1Fork.sol
433 : Proposal storage proposal = _proposals[proposalId];
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L433
File: NounsDAOLogicV1Fork.sol
454 : Proposal storage proposal = _proposals[proposalId];
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L454
XXX CHECK IF MEMORY XXX
Each slot saved can avoid an extra Gsset (20000 gas) for the first setting of the struct. Subsequent reads as well as writes have smaller gas savings
File: NounsDAOV3Proposals.sol
131 : struct ProposalTxs {
address [] targets;
uint256 [] values;
string [] signatures;
bytes [] calldatas;
}
Change to:
File: NounsDAOV3Proposals.sol
131 : struct ProposalTxs {
address [] targets;
string [] signatures;
uint256 [] values;
bytes [] calldatas;
}
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L131
File: NounsDAOStorageV1Fork.sol
119 : struct ProposalCondensed {
/// @notice Unique id for looking up a proposal
uint256 id;
/// @notice Creator of the proposal
address proposer;
/// @notice The number of votes needed to create a proposal at the time of proposal creation. *DIFFERS from GovernerBravo
uint256 proposalThreshold;
/// @notice The minimum number of votes in support of a proposal required in order for a quorum to be reached and for a vote to succeed at the time of proposal creation. *DIFFERS from GovernerBravo
uint256 quorumVotes;
/// @notice The timestamp that the proposal will be available for execution, set once the vote succeeds
uint256 eta;
/// @notice The block at which voting begins: holders must delegate their votes prior to this block
uint256 startBlock;
/// @notice The block at which voting ends: votes must be cast prior to this block
uint256 endBlock;
/// @notice Current number of votes in favor of this proposal
uint256 forVotes;
/// @notice Current number of votes in opposition to this proposal
uint256 againstVotes;
/// @notice Current number of votes for abstaining for this proposal
uint256 abstainVotes;
/// @notice Flag marking whether the proposal has been canceled
bool canceled;
/// @notice Flag marking whether the proposal has been executed
bool executed;
/// @notice The block at which this proposal was created
uint256 creationBlock;
}
Change to:
File: NounsDAOStorageV1Fork.sol
119 : struct ProposalCondensed {
/// @notice Unique id for looking up a proposal
uint256 id;
/// @notice The number of votes needed to create a proposal at the time of proposal creation. *DIFFERS from GovernerBravo
uint256 proposalThreshold;
/// @notice The minimum number of votes in support of a proposal required in order for a quorum to be reached and for a vote to succeed at the time of proposal creation. *DIFFERS from GovernerBravo
uint256 quorumVotes;
/// @notice The timestamp that the proposal will be available for execution, set once the vote succeeds
uint256 eta;
/// @notice The block at which voting begins: holders must delegate their votes prior to this block
uint256 startBlock;
/// @notice The block at which voting ends: votes must be cast prior to this block
uint256 endBlock;
/// @notice Current number of votes in favor of this proposal
uint256 forVotes;
/// @notice Current number of votes in opposition to this proposal
uint256 againstVotes;
/// @notice Current number of votes for abstaining for this proposal
uint256 abstainVotes;
/// @notice Creator of the proposal
address proposer;
/// @notice Flag marking whether the proposal has been canceled
bool canceled;
/// @notice Flag marking whether the proposal has been executed
bool executed;
/// @notice The block at which this proposal was created
uint256 creationBlock;
}
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOStorageV1Fork.sol#L119
block.number
and block.timestamp
are added to the event information by default, so adding them manually will waste additional gas.
File: NounsDAOInterfaces.sol
39 : event ProposalCreated (
uint256 id ,
address proposer ,
address [] targets ,
uint256 [] values ,
string [] signatures ,
bytes [] calldatas ,
uint256 startBlock ,
uint256 endBlock ,
string description
);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOInterfaces.sol#L39
File: NounsDAOInterfaces.sol
52 : event ProposalCreatedWithRequirements (
uint256 id ,
address proposer ,
address [] targets ,
uint256 [] values ,
string [] signatures ,
bytes [] calldatas ,
uint256 startBlock ,
uint256 endBlock ,
uint256 proposalThreshold ,
uint256 quorumVotes ,
string description
);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOInterfaces.sol#L52
File: NounsDAOInterfaces.sol
134 : event ProposalCreatedWithRequirements (
uint256 id ,
address proposer ,
address [] targets ,
uint256 [] values ,
string [] signatures ,
bytes [] calldatas ,
uint256 startBlock ,
uint256 endBlock ,
uint256 proposalThreshold ,
uint256 quorumVotes ,
string description
);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOInterfaces.sol#L134
File: NounsDAOInterfaces.sol
154 : event ProposalUpdated (
uint256 indexed id ,
address indexed proposer ,
address [] targets ,
uint256 [] values ,
string [] signatures ,
bytes [] calldatas ,
string description ,
string updateMessage
);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOInterfaces.sol#L154
File: NounsDAOInterfaces.sol
166 : event ProposalTransactionsUpdated (
uint256 indexed id ,
address indexed proposer ,
address [] targets ,
uint256 [] values ,
string [] signatures ,
bytes [] calldatas ,
string updateMessage
);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOInterfaces.sol#L166
File: NounsDAOInterfaces.sol
239 : event ExecuteFork (
uint32 indexed forkId ,
address forkTreasury ,
address forkToken ,
uint256 forkEndTimestamp ,
uint256 tokensInEscrow
);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOInterfaces.sol#L239
File: NounsDAOV3Proposals.sol
54 : event ProposalCreated (
uint256 id ,
address proposer ,
address [] targets ,
uint256 [] values ,
string [] signatures ,
bytes [] calldatas ,
uint256 startBlock ,
uint256 endBlock ,
string description
);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L54
File: NounsDAOV3Proposals.sol
68 : event ProposalCreatedWithRequirements (
uint256 id ,
address proposer ,
address [] signers ,
address [] targets ,
uint256 [] values ,
string [] signatures ,
bytes [] calldatas ,
uint256 startBlock ,
uint256 endBlock ,
uint256 updatePeriodEndBlock ,
uint256 proposalThreshold ,
uint256 quorumVotes ,
string description
);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L68
File: NounsDAOV3Proposals.sol
88 : event ProposalUpdated (
uint256 indexed id ,
address indexed proposer ,
address [] targets ,
uint256 [] values ,
string [] signatures ,
bytes [] calldatas ,
string description ,
string updateMessage
);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L88
File: NounsDAOV3Proposals.sol
100 : event ProposalTransactionsUpdated (
uint256 indexed id ,
address indexed proposer ,
address [] targets ,
uint256 [] values ,
string [] signatures ,
bytes [] calldatas ,
string updateMessage
);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L100
File: NounsDAOV3Fork.sol
44 : event ExecuteFork (
uint32 indexed forkId ,
address forkTreasury ,
address forkToken ,
uint256 forkEndTimestamp ,
uint256 tokensInEscrow
);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/NounsDAOV3Fork.sol#L44
File: NounsDAOEventsFork.sol
7 : event ProposalCreated (
uint256 indexed id ,
address indexed proposer ,
address [] targets ,
uint256 [] values ,
string [] signatures ,
bytes [] calldatas ,
uint256 startBlock ,
uint256 endBlock ,
string description
);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOEventsFork.sol#L7
File: NounsDAOEventsFork.sol
20 : event ProposalCreatedWithRequirements (
uint256 indexed id ,
address indexed proposer ,
address [] targets ,
uint256 [] values ,
string [] signatures ,
bytes [] calldatas ,
uint256 startBlock ,
uint256 endBlock ,
uint256 proposalThreshold ,
uint256 quorumVotes ,
string description
);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOEventsFork.sol#L20
When using elements that are smaller than 32 bytes, your contract's gas usage may be higher. This is because the EVM operates on 32 bytes at a time. Therefore, if the element is smaller than that, the EVM must use more operations in order to reduce the size of the element from 32 bytes to the desired size.
https://docs.soliditylang.org/en/v0.8.11/internals/layout_in_storage.html
Each operation involving a uint8
costs an extra 22-28 gas (depending on whether the other operand is also a variable of type uint8
) as compared to ones involving uint256
, due to the compiler having to clear the higher bits of the memory word before operating on the uint8
, as well as the associated stack operations of doing so. Use a larger size then downcast where needed
File: NounsDAOInterfaces.sol
777 : uint8 support;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOInterfaces.sol#L777
File: NounsDAOInterfaces.sol
779 : uint96 votes;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOInterfaces.sol#L779
File: NounsDAOInterfaces.sol
834 : uint16 minQuorumVotesBPS;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOInterfaces.sol#L834
File: NounsDAOInterfaces.sol
836 : uint16 maxQuorumVotesBPS;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOInterfaces.sol#L836
File: NounsDAOInterfaces.sol
839 : uint32 quorumCoefficient;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOInterfaces.sol#L839
File: NounsDAOInterfaces.sol
854 : uint32 fromBlock;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOInterfaces.sol#L854
File: NounsDAOInterfaces.sol
846 : uint32 lastMinuteWindowInBlocks;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOInterfaces.sol#L846
File: NounsDAOInterfaces.sol
847 : uint32 objectionPeriodDurationInBlocks;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOInterfaces.sol#L847
File: NounsDAOInterfaces.sol
848 : uint32 proposalUpdatablePeriodInBlocks;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOInterfaces.sol#L848
File: NounsDAOInterfaces.sol
759 : uint64 creationBlock;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOInterfaces.sol#L759
File: NounsDAOInterfaces.sol
761 : uint64 updatePeriodEndBlock;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOInterfaces.sol#L761
File: NounsDAOInterfaces.sol
763 : uint64 objectionPeriodEndBlock;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOInterfaces.sol#L763
File: NounsDAOInterfaces.sol
765 : uint64 placeholder;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOInterfaces.sol#L765
File: NounsDAOLogicV2.sol
562 : uint96 votes = castVoteInternal (msg .sender , proposalId, support);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L562
File: NounsDAOLogicV2.sol
623 : uint96 votes = nouns.getPriorVotes (voter, proposalCreationBlock (proposal));
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L623
File: NounsDAOLogicV2.sol
718 : uint16 oldMinQuorumVotesBPS = params.minQuorumVotesBPS;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L718
File: NounsDAOLogicV2.sol
747 : uint16 oldMaxQuorumVotesBPS = params.maxQuorumVotesBPS;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L747
File: NounsDAOLogicV2.sol
765 : uint32 oldQuorumCoefficient = params.quorumCoefficient;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L765
File: NounsDAOLogicV2.sol
982 : uint32 blockNumber = safe32 (blockNumber_, 'NounsDAO::getDynamicQuorumParamsAt: block number exceeds 32 bits ' );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L982
File: NounsDAOLogicV2.sol
1024 : uint32 blockNumber = safe32 (block .number , 'block number exceeds 32 bits ' );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L1024
File: NounsDAOV3Admin.sol
219 : uint32 oldObjectionPeriodDurationInBlocks = ds.objectionPeriodDurationInBlocks;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L219
File: NounsDAOV3Admin.sol
233 : uint32 oldLastMinuteWindowInBlocks = ds.lastMinuteWindowInBlocks;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L233
File: NounsDAOV3Admin.sol
250 : uint32 oldProposalUpdatablePeriodInBlocks = ds.proposalUpdatablePeriodInBlocks;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L250
File: NounsDAOV3Admin.sol
367 : uint16 oldMinQuorumVotesBPS = params.minQuorumVotesBPS;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L367
File: NounsDAOV3Admin.sol
396 : uint16 oldMaxQuorumVotesBPS = params.maxQuorumVotesBPS;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L396
File: NounsDAOV3Admin.sol
414 : uint32 oldQuorumCoefficient = params.quorumCoefficient;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L414
File: NounsDAOV3Admin.sol
583 : uint32 blockNumber = safe32 (block .number , 'block number exceeds 32 bits ' );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L583
File: NounsDAOV3DynamicQuorum.sol
82 : uint32 blockNumber = safe32 (blockNumber_, 'NounsDAO::getDynamicQuorumParamsAt: block number exceeds 32 bits ' );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3DynamicQuorum.sol#L82
File: NounsDAOV3Proposals.sol
898 : uint64 updatePeriodEndBlock = SafeCast.toUint64 (block .number + ds.proposalUpdatablePeriodInBlocks);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L898
File: NounsDAOV3Votes.sol
130 : uint96 votes = castVoteInternal (ds, msg .sender , proposalId, support);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Votes.sol#L130
File: NounsDAOV3Votes.sol
222 : uint96 votes = ds.nouns.getPriorVotes (voter, proposalVoteSnapshotBlock (ds, proposalId, proposal));
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Votes.sol#L222
File: NounsDAOForkEscrow.sol
53 : uint32 public forkId;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/NounsDAOForkEscrow.sol#L53
File: NounsDAOV3Fork.sol
125 : uint32 forkId = forkEscrow.closeEscrow ();
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/NounsDAOV3Fork.sol#L125
File: NounsAuctionHouseFork.sol
63 : uint8 public minBidIncrementPercentage;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/NounsAuctionHouseFork.sol#L63
File: NounsDAOLogicV1Fork.sol
624 : uint96 votes = nouns.getPriorVotes (voter, proposal.creationBlock);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L624
File: NounsDAOStorageV1Fork.sol
102 : uint8 support;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOStorageV1Fork.sol#L102
File: NounsDAOStorageV1Fork.sol
104 : uint96 votes;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOStorageV1Fork.sol#L104
File: NounsTokenFork.sol
61 : uint32 public forkId;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/NounsTokenFork.sol#L61
File: ERC721CheckpointableUpgradeable .sol
52 : uint8 public constant decimals = 0 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/base/ERC721CheckpointableUpgradeable.sol#L52
File: ERC721CheckpointableUpgradeable .sol
59 : uint32 fromBlock;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/base/ERC721CheckpointableUpgradeable.sol#L59
File: ERC721CheckpointableUpgradeable .sol
60 : uint96 votes;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/base/ERC721CheckpointableUpgradeable.sol#L60
File: ERC721CheckpointableUpgradeable .sol
178 : uint32 nCheckpoints = numCheckpoints[account];
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/base/ERC721CheckpointableUpgradeable.sol#L178
File: ERC721CheckpointableUpgradeable .sol
193 : uint32 lower = 0 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/base/ERC721CheckpointableUpgradeable.sol#L193
File: ERC721CheckpointableUpgradeable .sol
194 : uint32 upper = nCheckpoints - 1 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/base/ERC721CheckpointableUpgradeable.sol#L194
File: ERC721CheckpointableUpgradeable .sol
196 : uint32 center = upper - (upper - lower) / 2 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/base/ERC721CheckpointableUpgradeable.sol#L196
File: ERC721CheckpointableUpgradeable .sol
217 : uint96 amount = votesToDelegate (delegator);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/base/ERC721CheckpointableUpgradeable.sol#L217
File: ERC721CheckpointableUpgradeable .sol
229 : uint32 srcRepNum = numCheckpoints[srcRep];
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/base/ERC721CheckpointableUpgradeable.sol#L229
File: ERC721CheckpointableUpgradeable .sol
230 : uint96 srcRepOld = srcRepNum > 0 ? checkpoints[srcRep][srcRepNum - 1 ].votes : 0 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/base/ERC721CheckpointableUpgradeable.sol#L230
File: ERC721CheckpointableUpgradeable .sol
231 : uint96 srcRepNew = sub96 (srcRepOld, amount, 'ERC721Checkpointable::_moveDelegates: amount underflows ' );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/base/ERC721CheckpointableUpgradeable.sol#L231
File: ERC721CheckpointableUpgradeable .sol
236 : uint32 dstRepNum = numCheckpoints[dstRep];
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/base/ERC721CheckpointableUpgradeable.sol#L236
File: ERC721CheckpointableUpgradeable .sol
237 : uint96 dstRepOld = dstRepNum > 0 ? checkpoints[dstRep][dstRepNum - 1 ].votes : 0 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/base/ERC721CheckpointableUpgradeable.sol#L237
File: ERC721CheckpointableUpgradeable .sol
238 : uint96 dstRepNew = add96 (dstRepOld, amount, 'ERC721Checkpointable::_moveDelegates: amount overflows ' );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/base/ERC721CheckpointableUpgradeable.sol#L238
File: ERC721CheckpointableUpgradeable .sol
280 : uint96 c = a + b;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/base/ERC721CheckpointableUpgradeable.sol#L280
File: ProposeDAOV3UpgradeMainnet.s.sol
66 : uint8 numTxs = 10 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L66
File: ProposeDAOV3UpgradeTestnet.s.sol
73 : uint8 numTxs = 8 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L73
File: ProposeENSReverseLookupConfigMainnet.s.sol
34 : uint8 numTxs = 1 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeENSReverseLookupConfigMainnet.s.sol#L34
File: ProposeTimelockMigrationCleanupMainnet.s.sol
52 : uint8 numTxs = 6 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeTimelockMigrationCleanupMainnet.s.sol#L52
The unchecked keyword is new in solidity version 0.8.0, so this only applies to that version or higher, which these instances are. This saves 30-40 gas PER LOOP
File: NounsDAOLogicV2.sol
305 : for (uint256 i = 0 ; i < proposal.targets.length ; i++ ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L305
File: NounsDAOLogicV2.sol
343 : for (uint256 i = 0 ; i < proposal.targets.length ; i++ ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L343
File: NounsDAOLogicV2.sol
372 : for (uint256 i = 0 ; i < proposal.targets.length ; i++ ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L372
File: NounsDAOLogicV2.sol
405 : for (uint256 i = 0 ; i < proposal.targets.length ; i++ ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L405
File: NounsDAOV3Admin.sol
602 : for (uint256 i = 0 ; i < erc20tokens.length - 1 ; i++ ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L602
File: NounsDAOV3Admin.sol
603 : for (uint256 j = i + 1 ; j < erc20tokens.length ; j++ ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L603
File: NounsDAOV3Proposals.sol
409 : for (uint256 i = 0 ; i < proposerSignatures.length ; ++ i) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L409
File: NounsDAOV3Proposals.sol
446 : for (uint256 i = 0 ; i < proposal.targets.length ; i++ ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L446
File: NounsDAOV3Proposals.sol
508 : for (uint256 i = 0 ; i < proposal.targets.length ; i++ ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L508
File: NounsDAOV3Proposals.sol
553 : for (uint256 i = 0 ; i < proposal.targets.length ; i++ ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L553
File: NounsDAOV3Proposals.sol
590 : for (uint256 i = 0 ; i < signers.length ; ++ i) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L590
File: NounsDAOV3Proposals.sol
602 : for (uint256 i = 0 ; i < proposal.targets.length ; i++ ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L602
File: NounsDAOV3Proposals.sol
826 : for (uint256 i = 0 ; i < proposerSignatures.length ; ++ i) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L826
File: NounsDAOV3Proposals.sol
860 : for (uint256 i = 0 ; i < txs.signatures.length ; ++ i) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L860
File: NounsDAOV3Proposals.sol
865 : for (uint256 i = 0 ; i < txs.calldatas.length ; ++ i) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L865
File: NounsDAOForkEscrow.sol
117 : for (uint256 i = 0 ; i < tokenIds.length ; i++ ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/NounsDAOForkEscrow.sol#L117
File: NounsDAOForkEscrow.sol
148 : for (uint256 i = 0 ; i < tokenIds.length ; i++ ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/NounsDAOForkEscrow.sol#L148
File: NounsDAOV3Fork.sol
83 : for (uint256 i = 0 ; i < tokenIds.length ; i++ ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/NounsDAOV3Fork.sol#L83
File: NounsDAOV3Fork.sol
153 : for (uint256 i = 0 ; i < tokenIds.length ; i++ ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/NounsDAOV3Fork.sol#L153
File: NounsDAOV3Fork.sol
252 : for (uint256 i = 0 ; i < erc20Count; ++ i) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/NounsDAOV3Fork.sol#L252
File: NounsDAOLogicV1Fork.sol
209 : for (uint256 i = 0 ; i < erc20TokensToInclude.length ; i++ ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L209
File: NounsDAOLogicV1Fork.sol
223 : for (uint256 i = 0 ; i < tokenIds.length ; i++ ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L223
File: NounsDAOLogicV1Fork.sol
231 : for (uint256 i = 0 ; i < erc20TokensToInclude.length ; i++ ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L231
File: NounsDAOLogicV1Fork.sol
248 : for (uint256 i = 0 ; i < addresses.length ; i++ ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L248
File: NounsDAOLogicV1Fork.sol
397 : for (uint256 i = 0 ; i < proposal.targets.length ; i++ ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L397
File: NounsDAOLogicV1Fork.sol
435 : for (uint256 i = 0 ; i < proposal.targets.length ; i++ ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L435
File: NounsDAOLogicV1Fork.sol
462 : for (uint256 i = 0 ; i < proposal.targets.length ; i++ ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L462
File: NounsDAOLogicV1Fork.sol
796 : for (uint256 i = 0 ; i < erc20tokens.length - 1 ; i++ ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L796
File: NounsDAOLogicV1Fork.sol
797 : for (uint256 j = i + 1 ; j < erc20tokens.length ; j++ ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L797
File: NounsTokenFork.sol
149 : for (uint256 i = 0 ; i < tokenIds.length ; i++ ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/NounsTokenFork.sol#L149
File: NounsTokenFork.sol
172 : for (uint256 i = 0 ; i < tokenIds.length ; i++ ) {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/NounsTokenFork.sol#L172
Solidity version 0.8+ comes with implicit overflow and underflow checks on unsigned integers. When an overflow or an underflow isn’t possible (as an example, when a comparison is made before the arithmetic operation), some gas can be saved by using an unchecked
block
File: NounsDAOLogicV2.sol
211 : nouns.getPriorVotes (msg .sender , block .number - 1 ) > temp.proposalThreshold,
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L211
File: NounsDAOLogicV2.sol
367 : nouns.getPriorVotes (proposal.proposer, block .number - 1 ) <= proposal.proposalThreshold,
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L367
File: NounsDAOV3Proposals.sol
587 : uint256 votes = nouns.getPriorVotes (proposer, block .number - 1 );
592 : votes += nouns.getPriorVotes (signers[i], block .number - 1 );
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L587
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L592
File: NounsDAOV3Votes.sol
226 : isForVoteInLastMinuteWindow = (proposal.endBlock - block .number < ds.lastMinuteWindowInBlocks);
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Votes.sol#L226
File: NounsAuctionHouseFork.sol
141 : bool extended = _auction.endTime - block .timestamp < timeBuffer;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/NounsAuctionHouseFork.sol#L141
File: NounsDAOLogicV1Fork.sol
288 : nouns.getPriorVotes (msg .sender , block .number - 1 ) > temp.proposalThreshold,
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L288
File: NounsDAOLogicV1Fork.sol
457 : nouns.getPriorVotes (proposal.proposer, block .number - 1 ) <= proposal.proposalThreshold,
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L457
File: ERC721CheckpointableUpgradeable .sol
184 : if (checkpoints[account][nCheckpoints - 1 ].fromBlock <= blockNumber) {
185 : return checkpoints[account][nCheckpoints - 1 ].votes;
194 : uint32 upper = nCheckpoints - 1 ;
196 : uint32 center = upper - (upper - lower) / 2 ;
203 : upper = center - 1 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/base/ERC721CheckpointableUpgradeable.sol#L184
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/base/ERC721CheckpointableUpgradeable.sol#L185
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/base/ERC721CheckpointableUpgradeable.sol#L194
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/base/ERC721CheckpointableUpgradeable.sol#L196
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/base/ERC721CheckpointableUpgradeable.sol#L203
File: ERC721CheckpointableUpgradeable .sol
291 : return a - b;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/base/ERC721CheckpointableUpgradeable.sol#L291
Save 6 gas per instance if using assembly to check for address(0)
e.g.
assembly {
if iszero(_addr) {
mstore(0x00, "AddressZero")
revert(0x00, 0x20)
}
}
File: NounsDAOProxy.sol
function _setImplementation (address implementation_ ) public {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOProxy.sol#L78
File: ERC721CheckpointableUpgradeable .sol
function delegate (address delegatee ) public {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/base/ERC721CheckpointableUpgradeable.sol#L123
File: NounsDAOExecutorProxy.sol
26 : contract NounsDAOExecutorProxy is ERC1967Proxy {
27 : constructor (address logic , bytes memory data ) ERC1967Proxy (logic, data) {}
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutorProxy.sol#L26-L27
File: NounsDAOExecutorV2.sol
48 : contract NounsDAOExecutorV2 is UUPSUpgradeable , Initializable {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutorV2.sol#L48
File: NounsDAOInterfaces.sol
484 : contract NounsDAOStorageV2 is NounsDAOStorageV1Adjusted {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOInterfaces.sol#L484
File: ForkDAODeployer.sol
31 : contract ForkDAODeployer is IForkDAODeployer {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/ForkDAODeployer.sol#L31
File: NounsDAOForkEscrow.sol
23 : contract NounsDAOForkEscrow is IERC721Receiver {
107 : return IERC721Receiver .onERC721Received.selector ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/NounsDAOForkEscrow.sol#L23
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/NounsDAOForkEscrow.sol#L107
File: NounsAuctionHouseFork.sol
42 : INounsAuctionHouse,
69 : INounsAuctionHouse.Auction public auction;
120 : INounsAuctionHouse.Auction memory _auction = auction;
237 : INounsAuctionHouse.Auction memory _auction = auction;
120 : INounsAuctionHouse.Auction memory _auction = auction;
237 : INounsAuctionHouse.Auction memory _auction = auction;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/NounsAuctionHouseFork.sol#L42
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/NounsAuctionHouseFork.sol#L69
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/NounsAuctionHouseFork.sol#L120
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/NounsAuctionHouseFork.sol#L237
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/NounsAuctionHouseFork.sol#L120
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/NounsAuctionHouseFork.sol#L237
File: NounsDAOLogicV1Fork.sol
105 : contract NounsDAOLogicV1Fork is UUPSUpgradeable , ReentrancyGuardUpgradeable , NounsDAOStorageV1Fork , NounsDAOEventsFork {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L105
File: NounsTokenFork.sol
39 : contract NounsTokenFork is INounsTokenFork , OwnableUpgradeable , ERC721CheckpointableUpgradeable , UUPSUpgradeable {
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/NounsTokenFork.sol#L39
File: DeployDAOV3DataContractsGoerli.s.sol
7 : contract DeployDAOV3DataContractsGoerli is DeployDAOV3DataContractsBase {
11 : constructor () DeployDAOV3DataContractsBase (NOUNS_DAO_PROXY_GOERLI, NOUNS_TIMELOCK_V2_PROXY_GOERLI) {}
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/DeployDAOV3DataContractsGoerli.s.sol#L7
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/DeployDAOV3DataContractsGoerli.s.sol#L11
File: DeployDAOV3DataContractsSepolia.s.sol
7 : contract DeployDAOV3DataContractsSepolia is DeployDAOV3DataContractsBase {
11 : constructor () DeployDAOV3DataContractsBase (NOUNS_DAO_PROXY_SEPOLIA, NOUNS_TIMELOCK_V2_PROXY_SEPOLIA) {}
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/DeployDAOV3DataContractsSepolia.s.sol#L7
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/DeployDAOV3DataContractsSepolia.s.sol#L11
File: DeployDAOV3NewContractsMainnet.s.sol
7 : contract DeployDAOV3NewContractsMainnet is DeployDAOV3NewContractsBase {
14 : DeployDAOV3NewContractsBase (
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/DeployDAOV3NewContractsMainnet.s.sol#L7
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/DeployDAOV3NewContractsMainnet.s.sol#L14
File: DeployDAOV3NewContractsTestnet.s.sol
7 : contract DeployDAOV3NewContractsGoerli is DeployDAOV3NewContractsBase {
14 : DeployDAOV3NewContractsBase (
31 : DeployDAOV3NewContractsBase (
24 : contract DeployDAOV3NewContractsSepolia is DeployDAOV3NewContractsBase {
14 : DeployDAOV3NewContractsBase (
31 : DeployDAOV3NewContractsBase (
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/DeployDAOV3NewContractsTestnet.s.sol#L7
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/DeployDAOV3NewContractsTestnet.s.sol#L14
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/DeployDAOV3NewContractsTestnet.s.sol#L31
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/DeployDAOV3NewContractsTestnet.s.sol#L24
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/DeployDAOV3NewContractsTestnet.s.sol#L14
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/DeployDAOV3NewContractsTestnet.s.sol#L31
File: ProposeDAOV3UpgradeTestnet.s.sol
141 : contract ProposeDAOV3UpgradeGoerli is ProposeDAOV3UpgradeTestnet {
149 : ProposeDAOV3UpgradeTestnet (
166 : ProposeDAOV3UpgradeTestnet (
158 : contract ProposeDAOV3UpgradeSepolia is ProposeDAOV3UpgradeTestnet {
149 : ProposeDAOV3UpgradeTestnet (
166 : ProposeDAOV3UpgradeTestnet (
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L141
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L149
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L166
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L158
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L149
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L166
Recommended Mitigation Steps
Functions guaranteed to revert when called by normal users can be marked payable.
The upcoming v4.9.0 version of OpenZeppelin provides many small gas optimizations.
https://github.com/OpenZeppelin/openzeppelin-contracts/releases/tag/v4.9.0
File: package.json
"@openzeppelin/contracts " : "^4.1.0 "
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/../nouns-monorepo/packages/nouns-contracts/package.json#L32
File: package.json
"@openzeppelin/contracts-upgradeable " : "^4.1.0 "
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/../nouns-monorepo/packages/nouns-contracts/package.json#L33
File: package.json
"@openzeppelin/contracts " : "^4.1.0 "
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/../nouns-monorepo-2023-07/packages/nouns-contracts/package.json#L32
File: package.json
"@openzeppelin/contracts-upgradeable " : "^4.1.0 "
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/../nouns-monorepo-2023-07/packages/nouns-contracts/package.json#L33
Recommended Mitigation Steps
Update OpenZeppelin Contracts Usage in package.json and require at least version of 4.9.0
To save some gas the use of custom errors leads to cheaper deploy time cost and run time cost. The run time cost is only relevant when the revert condition is met.
File: NounsDAOExecutor.sol
require (delay_ >= MINIMUM_DELAY, 'NounsDAOExecutor::constructor: Delay must exceed minimum delay. ' )
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutor.sol#L73
File: NounsDAOExecutor.sol
require (delay_ <= MAXIMUM_DELAY, 'NounsDAOExecutor::setDelay: Delay must not exceed maximum delay. ' )
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutor.sol#L74
File: NounsDAOExecutor.sol
require (msg .sender == address (this ), 'NounsDAOExecutor::setDelay: Call must come from NounsDAOExecutor. ' )
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutor.sol#L81
File: NounsDAOExecutor.sol
require (delay_ >= MINIMUM_DELAY, 'NounsDAOExecutor::setDelay: Delay must exceed minimum delay. ' )
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutor.sol#L82
File: NounsDAOExecutor.sol
require (msg .sender == pendingAdmin, 'NounsDAOExecutor::acceptAdmin: Call must come from pendingAdmin. ' )
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutor.sol#L90
File: NounsDAOExecutor.sol
require (msg .sender == admin, 'NounsDAOExecutor::queueTransaction: Call must come from admin. ' )
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutor.sol#L114
File: NounsDAOExecutor.sol
require (msg .sender == admin, 'NounsDAOExecutor::cancelTransaction: Call must come from admin. ' )
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutor.sol#L134
File: NounsDAOExecutor.sol
require (msg .sender == admin, 'NounsDAOExecutor::executeTransaction: Call must come from admin. ' )
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutor.sol#L149
File: NounsDAOExecutor.sol
require (queuedTransactions[txHash], "NounsDAOExecutor::executeTransaction: Transaction hasn ' t been queued.")
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutor.sol#L152
File: NounsDAOExecutor.sol
require (success, 'NounsDAOExecutor::executeTransaction: Transaction execution reverted. ' )
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutor.sol#L174
File: NounsDAOExecutorV2.sol
require (delay_ >= MINIMUM_DELAY, 'NounsDAOExecutor::constructor: Delay must exceed minimum delay. ' )
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutorV2.sol#L96
File: NounsDAOExecutorV2.sol
require (delay_ <= MAXIMUM_DELAY, 'NounsDAOExecutor::setDelay: Delay must not exceed maximum delay. ' )
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutorV2.sol#L97
File: NounsDAOExecutorV2.sol
require (msg .sender == address (this ), 'NounsDAOExecutor::setDelay: Call must come from NounsDAOExecutor. ' )
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutorV2.sol#L104
File: NounsDAOExecutorV2.sol
require (delay_ >= MINIMUM_DELAY, 'NounsDAOExecutor::setDelay: Delay must exceed minimum delay. ' )
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutorV2.sol#L105
File: NounsDAOExecutorV2.sol
require (msg .sender == pendingAdmin, 'NounsDAOExecutor::acceptAdmin: Call must come from pendingAdmin. ' )
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutorV2.sol#L113
File: NounsDAOExecutorV2.sol
require (msg .sender == admin, 'NounsDAOExecutor::queueTransaction: Call must come from admin. ' )
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutorV2.sol#L137
File: NounsDAOExecutorV2.sol
require (msg .sender == admin, 'NounsDAOExecutor::cancelTransaction: Call must come from admin. ' )
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutorV2.sol#L157
File: NounsDAOExecutorV2.sol
require (msg .sender == admin, 'NounsDAOExecutor::executeTransaction: Call must come from admin. ' )
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutorV2.sol#L172
File: NounsDAOExecutorV2.sol
require (queuedTransactions[txHash], "NounsDAOExecutor::executeTransaction: Transaction hasn ' t been queued.")
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutorV2.sol#L175
File: NounsDAOExecutorV2.sol
require (success, 'NounsDAOExecutor::executeTransaction: Transaction execution reverted. ' )
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutorV2.sol#L197
File: NounsDAOExecutorV2.sol
require (msg .sender == admin, 'NounsDAOExecutor::sendETH: Call must come from admin. ' )
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutorV2.sol#L214
File: NounsDAOExecutorV2.sol
require (msg .sender == admin, 'NounsDAOExecutor::sendERC20: Call must come from admin. ' )
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutorV2.sol#L226
File: NounsDAOLogicV2.sol
require (address (timelock) == address (0 ), 'NounsDAO::initialize: can only initialize once ' )
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L144
File: NounsDAOLogicV2.sol
require (timelock_ != address (0 ), 'NounsDAO::initialize: invalid timelock address ' )
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L148
File: NounsDAOLogicV2.sol
require (nouns_ != address (0 ), 'NounsDAO::initialize: invalid nouns address ' )
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L149
File: NounsDAOLogicV2.sol
require (targets.length != 0 , 'NounsDAO::propose: must provide actions ' )
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L220
File: NounsDAOLogicV2.sol
require (targets.length <= proposalMaxOperations, 'NounsDAO::propose: too many actions ' )
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L221
File: NounsDAOLogicV2.sol
require (proposalCount >= proposalId, 'NounsDAO::state: invalid proposal id ' )
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L456
File: NounsDAOLogicV2.sol
require (signatory != address (0 ), 'NounsDAO::castVoteBySig: invalid signature ' )
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L600
File: NounsDAOLogicV2.sol
require (state (proposalId) == ProposalState.Active, 'NounsDAO::castVoteInternal: voting is closed ' )
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L616
File: NounsDAOLogicV2.sol
require (support <= 2 , 'NounsDAO::castVoteInternal: invalid vote type ' )
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L617
File: NounsDAOLogicV2.sol
require (receipt.hasVoted == false , 'NounsDAO::castVoteInternal: voter already voted ' )
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L620
File: NounsDAOLogicV2.sol
require (msg .sender == admin, 'NounsDAO::_setPendingAdmin: admin only ' )
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L838
File: NounsDAOLogicV2.sol
require (msg .sender == pendingAdmin && msg .sender != address (0 ), 'NounsDAO::_acceptAdmin: pending admin only ' )
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L856
File: NounsDAOLogicV2.sol
require (msg .sender == vetoer, 'NounsDAO::_burnVetoPower: vetoer only ' )
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L906
File: NounsDAOProxy.sol
require (msg .sender == admin, 'NounsDAOProxy::_setImplementation: admin only ' )
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOProxy.sol#L79
File: NounsDAOProxy.sol
require (implementation_ != address (0 ), 'NounsDAOProxy::_setImplementation: invalid implementation address ' )
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOProxy.sol#L80
File: NounsDAOV3Admin.sol
require (msg .sender == ds.vetoer, 'NounsDAO::_burnVetoPower: vetoer only ' )
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Admin.sol#L334
File: NounsDAOV3Proposals.sol
require (ds.proposalCount >= proposalId, 'NounsDAO::state: invalid proposal id ' )
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L641
File: NounsDAOV3Votes.sol
require (signatory != address (0 ), 'NounsDAO::castVoteBySig: invalid signature ' )
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Votes.sol#L170
File: NounsDAOV3Votes.sol
require (support <= 2 , 'NounsDAO::castVoteDuringVotingPeriodInternal: invalid vote type ' )
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Votes.sol#L216
File: NounsDAOV3Votes.sol
require (receipt.hasVoted == false , 'NounsDAO::castVoteDuringVotingPeriodInternal: voter already voted ' )
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Votes.sol#L219
File: NounsDAOV3Votes.sol
require (receipt.hasVoted == false , 'NounsDAO::castVoteInternal: voter already voted ' )
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Votes.sol#L282
File: NounsAuctionHouseFork.sol
require (_auction.nounId == nounId, 'Noun not up for auction ' )
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/NounsAuctionHouseFork.sol#L122
File: NounsAuctionHouseFork.sol
require (block .timestamp < _auction.endTime, 'Auction expired ' )
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/NounsAuctionHouseFork.sol#L123
File: NounsAuctionHouseFork.sol
require (msg .value >= reservePrice, 'Must send at least reservePrice ' )
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/NounsAuctionHouseFork.sol#L124
File: NounsAuctionHouseFork.sol
require (_auction.startTime != 0 , "Auction hasn ' t begun")
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/NounsAuctionHouseFork.sol#L239
File: NounsAuctionHouseFork.sol
require (! _auction.settled, 'Auction has already been settled ' )
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/NounsAuctionHouseFork.sol#L240
File: NounsAuctionHouseFork.sol
require (block .timestamp >= _auction.endTime, "Auction hasn ' t completed")
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/NounsAuctionHouseFork.sol#L241
File: NounsDAOLogicV1Fork.sol
require (address (timelock) == address (0 ), 'NounsDAO::initialize: can only initialize once ' )
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L176
File: NounsDAOLogicV1Fork.sol
require (timelock_ != address (0 ), 'NounsDAO::initialize: invalid timelock address ' )
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L177
File: NounsDAOLogicV1Fork.sol
require (nouns_ != address (0 ), 'NounsDAO::initialize: invalid nouns address ' )
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L178
File: NounsDAOLogicV1Fork.sol
require (targets.length != 0 , 'NounsDAO::propose: must provide actions ' )
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L297
File: NounsDAOLogicV1Fork.sol
require (targets.length <= proposalMaxOperations, 'NounsDAO::propose: too many actions ' )
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L298
File: NounsDAOLogicV1Fork.sol
require (state (proposalId) != ProposalState.Executed, 'NounsDAO::cancel: cannot cancel executed proposal ' )
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L452
File: NounsDAOLogicV1Fork.sol
require (proposalCount >= proposalId, 'NounsDAO::state: invalid proposal id ' )
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L513
File: NounsDAOLogicV1Fork.sol
require (signatory != address (0 ), 'NounsDAO::castVoteBySig: invalid signature ' )
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L601
File: NounsDAOLogicV1Fork.sol
require (state (proposalId) == ProposalState.Active, 'NounsDAO::castVoteInternal: voting is closed ' )
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L617
File: NounsDAOLogicV1Fork.sol
require (support <= 2 , 'NounsDAO::castVoteInternal: invalid vote type ' )
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L618
File: NounsDAOLogicV1Fork.sol
require (receipt.hasVoted == false , 'NounsDAO::castVoteInternal: voter already voted ' )
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L621
File: NounsDAOLogicV1Fork.sol
require (msg .sender == admin, 'NounsDAO::_setVotingDelay: admin only ' )
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L646
File: NounsDAOLogicV1Fork.sol
require (msg .sender == admin, 'NounsDAO::_setVotingPeriod: admin only ' )
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L662
File: NounsDAOLogicV1Fork.sol
require (msg .sender == admin, 'NounsDAO::_setProposalThresholdBPS: admin only ' )
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L679
File: NounsDAOLogicV1Fork.sol
require (msg .sender == admin, 'NounsDAO::_setQuorumVotesBPS: admin only ' )
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L697
File: NounsDAOLogicV1Fork.sol
require (msg .sender == admin, 'NounsDAO::_setPendingAdmin: admin only ' )
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L715
File: NounsDAOLogicV1Fork.sol
require (msg .sender == pendingAdmin && msg .sender != address (0 ), 'NounsDAO::_acceptAdmin: pending admin only ' )
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L733
File: NounsDAOLogicV1Fork.sol
require (msg .sender == admin, 'NounsDAO::_authorizeUpgrade: admin only ' )
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L790
File: NounsTokenFork.sol
require (! isMinterLocked, 'Minter is locked ' )
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/NounsTokenFork.sol#L91
File: NounsTokenFork.sol
require (! isDescriptorLocked, 'Descriptor is locked ' )
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/NounsTokenFork.sol#L99
File: NounsTokenFork.sol
require (! isSeederLocked, 'Seeder is locked ' )
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/NounsTokenFork.sol#L107
File: NounsTokenFork.sol
require (msg .sender == minter, 'Sender is not the minter ' )
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/NounsTokenFork.sol#L115
File: NounsTokenFork.sol
require (_exists (tokenId), 'NounsToken: URI query for nonexistent token ' )
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/NounsTokenFork.sol#L223
File: ERC721CheckpointableUpgradeable .sol
require (delegatee != address (0 ), 'ERC721Checkpointable::delegateBySig: delegatee cannot be zero address ' )
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/base/ERC721CheckpointableUpgradeable.sol#L145
File: ERC721CheckpointableUpgradeable .sol
require (signatory != address (0 ), 'ERC721Checkpointable::delegateBySig: invalid signature ' )
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/base/ERC721CheckpointableUpgradeable.sol#L152
File: ERC721CheckpointableUpgradeable .sol
require (nonce == nonces[signatory]++ , 'ERC721Checkpointable::delegateBySig: invalid nonce ' )
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/base/ERC721CheckpointableUpgradeable.sol#L153
File: ERC721CheckpointableUpgradeable .sol
require (block .timestamp <= expiry, 'ERC721Checkpointable::delegateBySig: signature expired ' )
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/base/ERC721CheckpointableUpgradeable.sol#L154
File: ERC721CheckpointableUpgradeable .sol
require (blockNumber < block .number , 'ERC721Checkpointable::getPriorVotes: not yet determined ' )
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/base/ERC721CheckpointableUpgradeable.sol#L176
Recommended Mitigation Steps
Use Custom Errors instead of strings.
Upgrade to the latest solidity version 0.8.20 to get additional gas savings.
See latest release for reference: https://blog.soliditylang.org/2023/05/10/solidity-0.8.20-release-announcement/
File: NounsDAOExecutor.sol
pragma solidity ^ 0.8.6 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutor.sol#L31
File: NounsDAOInterfaces.sol
pragma solidity ^ 0.8.6 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOInterfaces.sol#L35
File: NounsDAOLogicV2.sol
pragma solidity ^ 0.8.6 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L53
File: NounsDAOProxy.sol
pragma solidity ^ 0.8.6 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOProxy.sol#L36
File: ERC20Transferer .sol
pragma solidity ^ 0.8.16 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/utils/ERC20Transferer.sol#L16
File: DeployDAOV3DataContractsBase.s.sol
pragma solidity ^ 0.8.15 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/DeployDAOV3DataContractsBase.s.sol#L2
File: DeployDAOV3DataContractsGoerli.s.sol
pragma solidity ^ 0.8.15 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/DeployDAOV3DataContractsGoerli.s.sol#L2
File: DeployDAOV3DataContractsSepolia.s.sol
pragma solidity ^ 0.8.15 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/DeployDAOV3DataContractsSepolia.s.sol#L2
File: DeployDAOV3NewContractsBase.s.sol
pragma solidity ^ 0.8.15 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/DeployDAOV3NewContractsBase.s.sol#L2
File: DeployDAOV3NewContractsMainnet.s.sol
pragma solidity ^ 0.8.15 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/DeployDAOV3NewContractsMainnet.s.sol#L2
File: DeployDAOV3NewContractsTestnet.s.sol
pragma solidity ^ 0.8.15 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/DeployDAOV3NewContractsTestnet.s.sol#L2
File: ProposeDAOV3UpgradeMainnet.s.sol
pragma solidity ^ 0.8.15 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeMainnet.s.sol#L2
File: ProposeDAOV3UpgradeTestnet.s.sol
pragma solidity ^ 0.8.15 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeDAOV3UpgradeTestnet.s.sol#L2
File: ProposeENSReverseLookupConfigMainnet.s.sol
pragma solidity ^ 0.8.15 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeENSReverseLookupConfigMainnet.s.sol#L2
File: ProposeTimelockMigrationCleanupMainnet.s.sol
pragma solidity ^ 0.8.15 ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/ProposeTimelockMigrationCleanupMainnet.s.sol#L2
The operators ||
and &&
apply the common short-circuiting rules. This means that in the expression f(x) || g(y)
, if f(x)
evaluates to true, g(y)
will not be evaluated even if it may have side-effects.
So setting less costly function to f(x)
and setting costly function to g(x)
is efficient.
i.e.
if (! varA && msg .sender != varB);
Can be changed to:
if (msg .sender != varB && ! varA);
File: NounsDAOLogicV2.sol
856 : (msg .sender == pendingAdmin && msg .sender != address (0 ), 'NounsDAO::_acceptAdmin: pending admin only ' )
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L856
File: NounsDAOLogicV1Fork.sol
733 : (msg .sender == pendingAdmin && msg .sender != address (0 ), 'NounsDAO::_acceptAdmin: pending admin only ' )
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L733
When fetching data from a storage
location, assigning the data to a memory
variable causes all fields of the struct/array to be read from storage
, which incurs a Gcoldsload (2100 gas) for each field of the struct/array. If the fields are read from the new memory
variable, they incur an additional MLOAD rather than a cheap stack read. Instead of declearing the variable with the memory keyword, declaring the variable with the storage
keyword and caching any fields that need to be re-read in stack variables, will be much cheaper, only incuring the Gcoldsload for the fields actually read. The only time it makes sense to read the whole struct/array into a memory
variable, is if the full struct/array is being returned by the function, is being passed to a function that requires memory, or if the array/struct is being read from another memory
array/struct
File: NounsDAOLogicV2.sol
1011 : DynamicQuorumParamsCheckpoint memory cp = quorumParamsCheckpoints[center];
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L1011
File: NounsDAOV3DynamicQuorum.sol
111 : NounsDAOStorageV3.DynamicQuorumParamsCheckpoint memory cp = ds.quorumParamsCheckpoints[center];
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3DynamicQuorum.sol#L111
File: ERC721CheckpointableUpgradeable .sol
197 : Checkpoint memory cp = checkpoints[account][center];
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/base/ERC721CheckpointableUpgradeable.sol#L197
If you don't use boolean for storage you will avoid Gwarmaccess 100 gas. In addition, state changes of boolean from true
to false
can cost up to ~20000 gas rather than uint256(2)
to uint256(1)
that would cost significantly less.
File: NounsDAOExecutor.sol
70 : mapping (bytes32 => bool ) public queuedTransactions;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutor.sol#L70
File: NounsDAOExecutor.sol
121 : queuedTransactions[txHash] = true ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutor.sol#L121
File: NounsDAOExecutor.sol
137 : queuedTransactions[txHash] = false ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutor.sol#L137
File: NounsDAOExecutor.sol
162 : queuedTransactions[txHash] = false ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutor.sol#L162
File: NounsDAOExecutorV2.sol
93 : mapping (bytes32 => bool ) public queuedTransactions;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutorV2.sol#L93
File: NounsDAOExecutorV2.sol
144 : queuedTransactions[txHash] = true ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutorV2.sol#L144
File: NounsDAOExecutorV2.sol
160 : queuedTransactions[txHash] = false ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutorV2.sol#L160
File: NounsDAOExecutorV2.sol
185 : queuedTransactions[txHash] = false ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutorV2.sol#L185
File: NounsDAOInterfaces.sol
688 : mapping (address => mapping (bytes32 => bool )) cancelledSigs;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOInterfaces.sol#L688
File: NounsDAOLogicV2.sol
254 : newProposal.canceled = false ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L254
File: NounsDAOLogicV2.sol
255 : newProposal.executed = false ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L255
File: NounsDAOLogicV2.sol
256 : newProposal.vetoed = false ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L256
File: NounsDAOLogicV2.sol
342 : proposal.executed = true ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L342
File: NounsDAOLogicV2.sol
371 : proposal.canceled = true ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L371
File: NounsDAOLogicV2.sol
404 : proposal.vetoed = true ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L404
File: NounsDAOLogicV2.sol
633 : receipt.hasVoted = true ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOLogicV2.sol#L633
File: NounsDAOV3Proposals.sol
205 : newProposal.executeOnTimelockV1 = true ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L205
File: NounsDAOV3Proposals.sol
272 : ds.cancelledSigs[msg .sender ][sigHash] = true ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L272
File: NounsDAOV3Proposals.sol
506 : proposal.executed = true ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L506
File: NounsDAOV3Proposals.sol
551 : proposal.vetoed = true ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L551
File: NounsDAOV3Proposals.sol
600 : proposal.canceled = true ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Proposals.sol#L600
File: NounsDAOV3Votes.sol
224 : bool isForVoteInLastMinuteWindow = false ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Votes.sol#L224
File: NounsDAOV3Votes.sol
229 : bool isDefeatedBefore = false ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Votes.sol#L229
File: NounsDAOV3Votes.sol
259 : receipt.hasVoted = true ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Votes.sol#L259
File: NounsDAOV3Votes.sol
288 : receipt.hasVoted = true ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOV3Votes.sol#L288
File: NounsAuctionHouseFork.sol
243 : auction.settled = true ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/NounsAuctionHouseFork.sol#L243
File: NounsDAOLogicV1Fork.sol
333 : newProposal.canceled = false ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L333
File: NounsDAOLogicV1Fork.sol
334 : newProposal.executed = false ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L334
File: NounsDAOLogicV1Fork.sol
434 : proposal.executed = true ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L434
File: NounsDAOLogicV1Fork.sol
461 : proposal.canceled = true ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L461
File: NounsDAOLogicV1Fork.sol
634 : receipt.hasVoted = true ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/governance/NounsDAOLogicV1Fork.sol#L634
File: NounsTokenFork.sol
251 : isMinterLocked = true ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/NounsTokenFork.sol#L251
File: NounsTokenFork.sol
271 : isDescriptorLocked = true ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/NounsTokenFork.sol#L271
File: NounsTokenFork.sol
291 : isSeederLocked = true ;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/NounsTokenFork.sol#L291
Booleans are more expensive than uint256 or any type that takes up a full word because each write operation emits an extra SLOAD to first read the slot's contents, replace the bits taken up by the boolean, and then write back. This is the compiler's defense against contract upgrades and pointer aliasing, and it cannot be disabled.
File: NounsDAOExecutor.sol
70 : mapping (bytes32 => bool ) public queuedTransactions;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutor.sol#L70
File: NounsDAOExecutorV2.sol
93 : mapping (bytes32 => bool ) public queuedTransactions;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOExecutorV2.sol#L93
File: NounsDAOInterfaces.sol
688 : mapping (address => mapping (bytes32 => bool )) cancelledSigs;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/NounsDAOInterfaces.sol#L688
File: NounsTokenFork.sol
70 : bool public isMinterLocked;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/NounsTokenFork.sol#L70
File: NounsTokenFork.sol
73 : bool public isDescriptorLocked;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/NounsTokenFork.sol#L73
File: NounsTokenFork.sol
76 : bool public isSeederLocked;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/contracts/governance/fork/newdao/token/NounsTokenFork.sol#L76
File: DeployDAOV3NewContractsBase.s.sol
27 : bool public immutable deployTimelockV2Harness;
https://github.com/nounsDAO/nouns-monorepo/tree/718211e063d511eeda1084710f6a682955e80dcb/packages/nouns-contracts/script/DeployDAOV3NewContractsBase.s.sol#L27