Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
- Contract name:
- CleanupBlockNumberManager
- Optimization enabled
- true
- Compiler version
- v0.7.6+commit.7338295f
- Optimization runs
- 200
- EVM Version
- default
- Verified at
- 2021-09-17T15:45:15.438653Z
Constructor Arguments
000000000000000000000000493044fbbaa7f9f78379864fa88accaff6a7586e
Arg [0] (address) : 0x493044fbbaa7f9f78379864fa88accaff6a7586e
Contract source code
// Sources flattened with hardhat v2.3.0 https://hardhat.org // File contracts/governance/implementation/GovernedBase.sol // SPDX-License-Identifier: MIT pragma solidity 0.7.6; /** * @title Governed Base * @notice This abstract base class defines behaviors for a governed contract. * @dev This class is abstract so that specific behaviors can be defined for the constructor. * Contracts should not be left ungoverned, but not all contract will have a constructor * (for example those pre-defined in genesis). **/ abstract contract GovernedBase { address public governance; address public proposedGovernance; bool private initialised; event GovernanceProposed(address proposedGovernance); event GovernanceUpdated (address oldGovernance, address newGoveranance); modifier onlyGovernance () { require (msg.sender == governance, "only governance"); _; } constructor(address _governance) { if (_governance != address(0)) { initialise(_governance); } } /** * @notice First of a two step process for turning over governance to another address. * @param _governance The address to propose to receive governance role. * @dev Must hold governance to propose another address. */ function proposeGovernance(address _governance) external onlyGovernance { proposedGovernance = _governance; emit GovernanceProposed(_governance); } /** * @notice Once proposed, claimant can claim the governance role as the second of a two-step process. */ function claimGovernance() external { require(msg.sender == proposedGovernance, "not claimaint"); emit GovernanceUpdated(governance, proposedGovernance); governance = proposedGovernance; proposedGovernance = address(0); } /** * @notice In a one-step process, turn over governance to another address. * @dev Must hold governance to transfer. */ function transferGovernance(address _governance) external onlyGovernance { emit GovernanceUpdated(governance, _governance); governance = _governance; proposedGovernance = address(0); } /** * @notice Initialize the governance address if not first initialized. */ function initialise(address _governance) public virtual { require(initialised == false, "initialised != false"); initialised = true; emit GovernanceUpdated(governance, _governance); governance = _governance; proposedGovernance = address(0); } } // File contracts/governance/implementation/Governed.sol // pragma solidity 0.7.6; /** * @title Governed * @dev For deployed, governed contracts, enforce a non-zero address at create time. **/ contract Governed is GovernedBase { constructor(address _governance) GovernedBase(_governance) { require(_governance != address(0), "_governance zero"); } } // File contracts/token/interface/IICleanable.sol // pragma solidity 0.7.6; interface IICleanable { /** * Set the contract that is allowed to call history cleaning methods. */ function setCleanerContract(address _cleanerContract) external; /** * Set the cleanup block number. * Historic data for the blocks before `cleanupBlockNumber` can be erased, * history before that block should never be used since it can be inconsistent. * In particular, cleanup block number must be before current vote power block. * @param _blockNumber The new cleanup block number. */ function setCleanupBlockNumber(uint256 _blockNumber) external; /** * Set the contract that is allowed to set cleanupBlockNumber. * Usually this will be an instance of CleanupBlockNumberManager. */ function setCleanupBlockNumberManager(address _cleanupBlockNumberManager) external; /** * Get the current cleanup block number. */ function cleanupBlockNumber() external view returns (uint256); } // File contracts/token/implementation/CleanupBlockNumberManager.sol // pragma solidity 0.7.6; /** * @title Token history cleanup manager * @notice Maintains the list of cleanable tokens for which history cleanup can be collectively cleaned u */ contract CleanupBlockNumberManager is Governed { string internal constant ERR_CONTRACT_NOT_FOUND = "contract not found"; string internal constant ERR_TRIGGER_CONTRACT_OR_GOVERNANCE_ONLY = "trigger or governance only"; IICleanable[] public registeredTokens; address public triggerContract; event RegistrationUpdated (IICleanable theContract, bool add); event CleanupBlockNumberSet (IICleanable theContract, uint256 blockNumber, bool success); modifier onlyTriggerOrGovernance { require( msg.sender == address(triggerContract) || msg.sender == governance, ERR_TRIGGER_CONTRACT_OR_GOVERNANCE_ONLY ); _; } constructor(address _governance) Governed(_governance) { /* empty block */ } /** * @notice Sets trigger contract address. * @dev Usually this is FTSO Manager contract address. */ function setTriggerContractAddress(address _triggerContract) external onlyGovernance { triggerContract = _triggerContract; } /** * @notice Register a contract of which history cleanup index is to be managed * @param _cleanableToken The address of the contract to be managed. * @dev when using this function take care that call of setCleanupBlockNumber * is permitted by this object */ function registerToken(IICleanable _cleanableToken) external onlyGovernance { uint256 len = registeredTokens.length; for (uint256 i = 0; i < len; i++) { if (_cleanableToken == registeredTokens[i]) { return; // already registered } } registeredTokens.push(_cleanableToken); emit RegistrationUpdated (_cleanableToken, true); } /** * @notice Unregiseter a contract from history cleanup index management * @param _cleanableToken The address of the contract to unregister. */ function unregisterToken(IICleanable _cleanableToken) external onlyGovernance { uint256 len = registeredTokens.length; for (uint256 i = 0; i < len; i++) { if (_cleanableToken == registeredTokens[i]) { registeredTokens[i] = registeredTokens[len -1]; registeredTokens.pop(); emit RegistrationUpdated (_cleanableToken, false); return; } } revert(ERR_CONTRACT_NOT_FOUND); } /** * @notice Sets clean up block number on managed cleanable tokens * @param _blockNumber cleanup block number */ function setCleanUpBlockNumber(uint256 _blockNumber) external onlyTriggerOrGovernance { uint256 len = registeredTokens.length; for (uint256 i = 0; i < len; i++) { try registeredTokens[i].setCleanupBlockNumber(_blockNumber) { emit CleanupBlockNumberSet(registeredTokens[i], _blockNumber, true); } catch { emit CleanupBlockNumberSet(registeredTokens[i], _blockNumber, false); } } } }
Contract ABI
[{"type":"constructor","stateMutability":"nonpayable","inputs":[{"type":"address","name":"_governance","internalType":"address"}]},{"type":"event","name":"CleanupBlockNumberSet","inputs":[{"type":"address","name":"theContract","internalType":"contract IICleanable","indexed":false},{"type":"uint256","name":"blockNumber","internalType":"uint256","indexed":false},{"type":"bool","name":"success","internalType":"bool","indexed":false}],"anonymous":false},{"type":"event","name":"GovernanceProposed","inputs":[{"type":"address","name":"proposedGovernance","internalType":"address","indexed":false}],"anonymous":false},{"type":"event","name":"GovernanceUpdated","inputs":[{"type":"address","name":"oldGovernance","internalType":"address","indexed":false},{"type":"address","name":"newGoveranance","internalType":"address","indexed":false}],"anonymous":false},{"type":"event","name":"RegistrationUpdated","inputs":[{"type":"address","name":"theContract","internalType":"contract IICleanable","indexed":false},{"type":"bool","name":"add","internalType":"bool","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"claimGovernance","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"governance","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"initialise","inputs":[{"type":"address","name":"_governance","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"proposeGovernance","inputs":[{"type":"address","name":"_governance","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"proposedGovernance","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"registerToken","inputs":[{"type":"address","name":"_cleanableToken","internalType":"contract IICleanable"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IICleanable"}],"name":"registeredTokens","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setCleanUpBlockNumber","inputs":[{"type":"uint256","name":"_blockNumber","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setTriggerContractAddress","inputs":[{"type":"address","name":"_triggerContract","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferGovernance","inputs":[{"type":"address","name":"_governance","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"triggerContract","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"unregisterToken","inputs":[{"type":"address","name":"_cleanableToken","internalType":"contract IICleanable"}]}]
Contract Creation Code
0x608060405234801561001057600080fd5b50604051610cfc380380610cfc8339818101604052602081101561003357600080fd5b505180806001600160a01b0381161561004f5761004f816100a5565b506001600160a01b03811661009e576040805162461bcd60e51b815260206004820152601060248201526f5f676f7665726e616e6365207a65726f60801b604482015290519081900360640190fd5b5050610188565b600154600160a01b900460ff1615610104576040805162461bcd60e51b815260206004820152601460248201527f696e697469616c6973656420213d2066616c7365000000000000000000000000604482015290519081900360640190fd5b6001805460ff60a01b1916600160a01b179055600054604080516001600160a01b039283168152918316602083015280517f434a2db650703b36c824e745330d6397cdaa9ee2cc891a4938ae853e1c50b68d9281900390910190a1600080546001600160a01b039092166001600160a01b0319928316179055600180549091169055565b610b65806101976000396000f3fe608060405234801561001057600080fd5b50600436106100b45760003560e01c80639a0ba2ea116100715780639a0ba2ea146101615780639d6a890f1461017e578063c373a08e146101a4578063cbc31cf7146101ca578063d2b799ad146101e7578063d38bfff4146101ef576100b4565b806309824a80146100b95780632bcd9f94146100e15780635aa6e675146101075780635d36b1901461012b57806360f7ac971461013357806377860cdd1461013b575b600080fd5b6100df600480360360208110156100cf57600080fd5b50356001600160a01b0316610215565b005b6100df600480360360208110156100f757600080fd5b50356001600160a01b0316610340565b61010f6103b3565b604080516001600160a01b039092168252519081900360200190f35b6100df6103c2565b61010f610484565b6100df6004803603602081101561015157600080fd5b50356001600160a01b0316610493565b61010f6004803603602081101561017757600080fd5b50356106b6565b6100df6004803603602081101561019457600080fd5b50356001600160a01b03166106e0565b6100df600480360360208110156101ba57600080fd5b50356001600160a01b03166107ba565b6100df600480360360208110156101e057600080fd5b503561085f565b61010f610a5e565b6100df6004803603602081101561020557600080fd5b50356001600160a01b0316610a6d565b6000546001600160a01b03163314610266576040805162461bcd60e51b815260206004820152600f60248201526e6f6e6c7920676f7665726e616e636560881b604482015290519081900360640190fd5b60025460005b818110156102af576002818154811061028157fe5b6000918252602090912001546001600160a01b03848116911614156102a757505061033d565b60010161026c565b5060028054600180820183556000929092527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace0180546001600160a01b0319166001600160a01b03851690811790915560408051918252602082019290925281517f86d03f430c7616021073d7a71766f632f1ce19f289aa989534d9f4732253eb59929181900390910190a1505b50565b6000546001600160a01b03163314610391576040805162461bcd60e51b815260206004820152600f60248201526e6f6e6c7920676f7665726e616e636560881b604482015290519081900360640190fd5b600380546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031681565b6001546001600160a01b03163314610411576040805162461bcd60e51b815260206004820152600d60248201526c1b9bdd0818db185a5b585a5b9d609a1b604482015290519081900360640190fd5b600054600154604080516001600160a01b03938416815292909116602083015280517f434a2db650703b36c824e745330d6397cdaa9ee2cc891a4938ae853e1c50b68d9281900390910190a160018054600080546001600160a01b03199081166001600160a01b03841617909155169055565b6001546001600160a01b031681565b6000546001600160a01b031633146104e4576040805162461bcd60e51b815260206004820152600f60248201526e6f6e6c7920676f7665726e616e636560881b604482015290519081900360640190fd5b60025460005b8181101561060657600281815481106104ff57fe5b6000918252602090912001546001600160a01b03848116911614156105fe576002600183038154811061052e57fe5b600091825260209091200154600280546001600160a01b03909216918390811061055457fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550600280548061058d57fe5b60008281526020808220830160001990810180546001600160a01b0319169055909201909255604080516001600160a01b03871681529182019290925281517f86d03f430c7616021073d7a71766f632f1ce19f289aa989534d9f4732253eb59929181900390910190a1505061033d565b6001016104ea565b506040518060400160405280601281526020017118dbdb9d1c9858dd081b9bdd08199bdd5b9960721b81525060405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561067b578181015183820152602001610663565b50505050905090810190601f1680156106a85780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b600281815481106106c657600080fd5b6000918252602090912001546001600160a01b0316905081565b600154600160a01b900460ff1615610736576040805162461bcd60e51b8152602060048201526014602482015273696e697469616c6973656420213d2066616c736560601b604482015290519081900360640190fd5b6001805460ff60a01b1916600160a01b179055600054604080516001600160a01b039283168152918316602083015280517f434a2db650703b36c824e745330d6397cdaa9ee2cc891a4938ae853e1c50b68d9281900390910190a1600080546001600160a01b039092166001600160a01b0319928316179055600180549091169055565b6000546001600160a01b0316331461080b576040805162461bcd60e51b815260206004820152600f60248201526e6f6e6c7920676f7665726e616e636560881b604482015290519081900360640190fd5b600180546001600160a01b0383166001600160a01b0319909116811790915560408051918252517f1f95fb40be3a947982072902a887b521248d1d8931a39eb38f84f4d6fd758b699181900360200190a150565b6003546001600160a01b031633148061088257506000546001600160a01b031633145b6040518060400160405280601a81526020017f74726967676572206f7220676f7665726e616e6365206f6e6c79000000000000815250906109045760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561067b578181015183820152602001610663565b5060025460005b81811015610a59576002818154811061092057fe5b6000918252602082200154604080516313de97f560e01b81526004810187905290516001600160a01b03909216926313de97f59260248084019382900301818387803b15801561096f57600080fd5b505af1925050508015610980575060015b6109ed577f6e31dc4aae4e8c2369947a8179952c1929b7af7bc75f57e71ebce5d37e62eae7600282815481106109b257fe5b6000918252602080832090910154604080516001600160a01b03909216825291810187905280820192909252519081900360600190a1610a51565b7f6e31dc4aae4e8c2369947a8179952c1929b7af7bc75f57e71ebce5d37e62eae760028281548110610a1b57fe5b60009182526020918290200154604080516001600160a01b03909216825291810186905260018183015290519081900360600190a15b60010161090b565b505050565b6003546001600160a01b031681565b6000546001600160a01b03163314610abe576040805162461bcd60e51b815260206004820152600f60248201526e6f6e6c7920676f7665726e616e636560881b604482015290519081900360640190fd5b600054604080516001600160a01b039283168152918316602083015280517f434a2db650703b36c824e745330d6397cdaa9ee2cc891a4938ae853e1c50b68d9281900390910190a1600080546001600160a01b039092166001600160a01b031992831617905560018054909116905556fea264697066735822122065d4147220bf4bb33fd8520c3bdd95d3339f5787ea393482448266c0c6abc7ea64736f6c63430007060033000000000000000000000000493044fbbaa7f9f78379864fa88accaff6a7586e
Deployed ByteCode
0x608060405234801561001057600080fd5b50600436106100b45760003560e01c80639a0ba2ea116100715780639a0ba2ea146101615780639d6a890f1461017e578063c373a08e146101a4578063cbc31cf7146101ca578063d2b799ad146101e7578063d38bfff4146101ef576100b4565b806309824a80146100b95780632bcd9f94146100e15780635aa6e675146101075780635d36b1901461012b57806360f7ac971461013357806377860cdd1461013b575b600080fd5b6100df600480360360208110156100cf57600080fd5b50356001600160a01b0316610215565b005b6100df600480360360208110156100f757600080fd5b50356001600160a01b0316610340565b61010f6103b3565b604080516001600160a01b039092168252519081900360200190f35b6100df6103c2565b61010f610484565b6100df6004803603602081101561015157600080fd5b50356001600160a01b0316610493565b61010f6004803603602081101561017757600080fd5b50356106b6565b6100df6004803603602081101561019457600080fd5b50356001600160a01b03166106e0565b6100df600480360360208110156101ba57600080fd5b50356001600160a01b03166107ba565b6100df600480360360208110156101e057600080fd5b503561085f565b61010f610a5e565b6100df6004803603602081101561020557600080fd5b50356001600160a01b0316610a6d565b6000546001600160a01b03163314610266576040805162461bcd60e51b815260206004820152600f60248201526e6f6e6c7920676f7665726e616e636560881b604482015290519081900360640190fd5b60025460005b818110156102af576002818154811061028157fe5b6000918252602090912001546001600160a01b03848116911614156102a757505061033d565b60010161026c565b5060028054600180820183556000929092527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace0180546001600160a01b0319166001600160a01b03851690811790915560408051918252602082019290925281517f86d03f430c7616021073d7a71766f632f1ce19f289aa989534d9f4732253eb59929181900390910190a1505b50565b6000546001600160a01b03163314610391576040805162461bcd60e51b815260206004820152600f60248201526e6f6e6c7920676f7665726e616e636560881b604482015290519081900360640190fd5b600380546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031681565b6001546001600160a01b03163314610411576040805162461bcd60e51b815260206004820152600d60248201526c1b9bdd0818db185a5b585a5b9d609a1b604482015290519081900360640190fd5b600054600154604080516001600160a01b03938416815292909116602083015280517f434a2db650703b36c824e745330d6397cdaa9ee2cc891a4938ae853e1c50b68d9281900390910190a160018054600080546001600160a01b03199081166001600160a01b03841617909155169055565b6001546001600160a01b031681565b6000546001600160a01b031633146104e4576040805162461bcd60e51b815260206004820152600f60248201526e6f6e6c7920676f7665726e616e636560881b604482015290519081900360640190fd5b60025460005b8181101561060657600281815481106104ff57fe5b6000918252602090912001546001600160a01b03848116911614156105fe576002600183038154811061052e57fe5b600091825260209091200154600280546001600160a01b03909216918390811061055457fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550600280548061058d57fe5b60008281526020808220830160001990810180546001600160a01b0319169055909201909255604080516001600160a01b03871681529182019290925281517f86d03f430c7616021073d7a71766f632f1ce19f289aa989534d9f4732253eb59929181900390910190a1505061033d565b6001016104ea565b506040518060400160405280601281526020017118dbdb9d1c9858dd081b9bdd08199bdd5b9960721b81525060405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561067b578181015183820152602001610663565b50505050905090810190601f1680156106a85780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b600281815481106106c657600080fd5b6000918252602090912001546001600160a01b0316905081565b600154600160a01b900460ff1615610736576040805162461bcd60e51b8152602060048201526014602482015273696e697469616c6973656420213d2066616c736560601b604482015290519081900360640190fd5b6001805460ff60a01b1916600160a01b179055600054604080516001600160a01b039283168152918316602083015280517f434a2db650703b36c824e745330d6397cdaa9ee2cc891a4938ae853e1c50b68d9281900390910190a1600080546001600160a01b039092166001600160a01b0319928316179055600180549091169055565b6000546001600160a01b0316331461080b576040805162461bcd60e51b815260206004820152600f60248201526e6f6e6c7920676f7665726e616e636560881b604482015290519081900360640190fd5b600180546001600160a01b0383166001600160a01b0319909116811790915560408051918252517f1f95fb40be3a947982072902a887b521248d1d8931a39eb38f84f4d6fd758b699181900360200190a150565b6003546001600160a01b031633148061088257506000546001600160a01b031633145b6040518060400160405280601a81526020017f74726967676572206f7220676f7665726e616e6365206f6e6c79000000000000815250906109045760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561067b578181015183820152602001610663565b5060025460005b81811015610a59576002818154811061092057fe5b6000918252602082200154604080516313de97f560e01b81526004810187905290516001600160a01b03909216926313de97f59260248084019382900301818387803b15801561096f57600080fd5b505af1925050508015610980575060015b6109ed577f6e31dc4aae4e8c2369947a8179952c1929b7af7bc75f57e71ebce5d37e62eae7600282815481106109b257fe5b6000918252602080832090910154604080516001600160a01b03909216825291810187905280820192909252519081900360600190a1610a51565b7f6e31dc4aae4e8c2369947a8179952c1929b7af7bc75f57e71ebce5d37e62eae760028281548110610a1b57fe5b60009182526020918290200154604080516001600160a01b03909216825291810186905260018183015290519081900360600190a15b60010161090b565b505050565b6003546001600160a01b031681565b6000546001600160a01b03163314610abe576040805162461bcd60e51b815260206004820152600f60248201526e6f6e6c7920676f7665726e616e636560881b604482015290519081900360640190fd5b600054604080516001600160a01b039283168152918316602083015280517f434a2db650703b36c824e745330d6397cdaa9ee2cc891a4938ae853e1c50b68d9281900390910190a1600080546001600160a01b039092166001600160a01b031992831617905560018054909116905556fea264697066735822122065d4147220bf4bb33fd8520c3bdd95d3339f5787ea393482448266c0c6abc7ea64736f6c63430007060033