tornado-contracts/contracts/Governance/v4-exploit-patch/GovernanceExploitPatchUpgrade.sol

74 lines
2.4 KiB
Solidity
Raw Permalink Normal View History

2024-03-29 21:52:45 +00:00
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.12;
pragma experimental ABIEncoderV2;
2025-01-05 09:29:24 +00:00
import { Governance } from '../v1/Governance.sol';
import { GovernanceStakingUpgrade } from '../v3-relayer-registry/GovernanceStakingUpgrade.sol';
2024-03-29 21:52:45 +00:00
contract GovernanceExploitPatchUpgrade is GovernanceStakingUpgrade {
mapping(uint256 => bytes32) public proposalCodehashes;
2025-01-05 09:29:24 +00:00
constructor(
address stakingRewardsAddress,
address gasCompLogic,
address userVaultAddress
) public GovernanceStakingUpgrade(stakingRewardsAddress, gasCompLogic, userVaultAddress) {}
2024-03-29 21:52:45 +00:00
/// @notice Return the version of the contract
function version() external pure virtual override returns (string memory) {
2025-01-05 09:29:24 +00:00
return '4.patch-exploit';
2024-03-29 21:52:45 +00:00
}
/**
* @notice Execute a proposal
* @dev This upgrade should protect against Metamorphic contracts by comparing the proposal's extcodehash with a stored one
* @param proposalId The proposal's ID
*/
function execute(uint256 proposalId) public payable virtual override(Governance) {
2025-01-05 09:29:24 +00:00
require(msg.sender != address(this), 'Governance::propose: pseudo-external function');
2024-03-29 21:52:45 +00:00
Proposal storage proposal = proposals[proposalId];
address target = proposal.target;
bytes32 proposalCodehash;
assembly {
proposalCodehash := extcodehash(target)
}
require(
proposalCodehash == proposalCodehashes[proposalId],
2025-01-05 09:29:24 +00:00
'Governance::propose: metamorphic contracts not allowed'
2024-03-29 21:52:45 +00:00
);
super.execute(proposalId);
}
/**
* @notice Internal function called from propoese
* @dev This should store the extcodehash of the proposal contract
* @param proposer proposer address
* @param target smart contact address that will be executed as result of voting
* @param description description of the proposal
* @return proposalId new proposal id
*/
2025-01-05 09:29:24 +00:00
function _propose(
address proposer,
address target,
string memory description
) internal virtual override(Governance) returns (uint256 proposalId) {
2024-03-29 21:52:45 +00:00
// Implies all former predicates were valid
proposalId = super._propose(proposer, target, description);
bytes32 proposalCodehash;
assembly {
proposalCodehash := extcodehash(target)
}
proposalCodehashes[proposalId] = proposalCodehash;
}
}