false
false
0

Contract Address Details

0x93764A73d3c575Df0f555b8527F004cEf4AE2079

Contract Name
CleanupBlockNumberManager
Creator
0x493044–a7586e at 0x399f13–03f881
Balance
0 SGB ( )
Tokens
Fetching tokens...
Transactions
3 Transactions
Transfers
0 Transfers
Gas Used
146,167
Last Balance Update
56508890
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