ETH Price: $2,712.88 (+2.33%)

Contract

0xe2CEDA90aa1E43647EF306810a903b32c9a3Aa94
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Set Pending Admi...162311932022-12-21 6:10:23783 days ago1671603023IN
0xe2CEDA90...2c9a3Aa94
0 ETH0.0006580713.95121949

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Similar Match Source Code
This contract matches the deployed Bytecode of the Source Code for Contract 0x8e8506C9...7f847E9bA
The constructor portion of the code might be different and could alter the actual behaviour of the contract

Contract Name:
TimeLock

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
File 1 of 2 : TimeLock.sol
// SPDX-License-Identifier: GPL-3.0-or-later
pragma solidity 0.8.9;

import './ITimeLock.sol';

contract TimeLock is ITimeLock {
	event NewAdmin(address indexed newAdmin);
	event NewPendingAdmin(address indexed newPendingAdmin);
	event NewDelay(uint256 newDelay);
	event QueueTransaction(
		bytes32 indexed txHash,
		address indexed target,
		uint256 value,
		string signature,
		bytes data,
		uint256 eta
	);
	event ExecuteTransaction(
		bytes32 indexed txHash,
		address indexed target,
		uint256 value,
		string signature,
		bytes data,
		uint256 eta
	);
	event CancelTransaction(
		bytes32 indexed txHash,
		address indexed target,
		uint256 value,
		string signature,
		bytes data,
		uint256 eta
	);

	uint256 private constant MIN_DELAY = 1 days;
	uint256 private constant MAX_DELAY = 30 days;
	//  Time period a tx is valid for execution after eta has elapsed.
	uint256 private constant GRACE_PERIOD = 14 days;

	address public admin;
	address public pendingAdmin;

	// Cool-off before a queued transaction is executed
	uint256 public delay;
	// Queued status of a transaction (txHash => tx status).
	mapping(bytes32 => bool) public queuedTransactions;

	constructor(uint256 _delay) {
		require(_delay >= MIN_DELAY, 'delay < min');
		require(_delay <= MAX_DELAY, 'delay > max');
		admin = msg.sender;
		delay = _delay;
	}

	receive() external payable {}

	modifier onlyTimeLock() {
		require(msg.sender == address(this), 'not time lock');
		_;
	}

	modifier onlyAdmin() {
		require(msg.sender == admin, 'not admin');
		_;
	}

	/**
	 * @notice Sets the the new value of {_pendingAdmin}.
	 * @param _pendingAdmin Address of next admin
	 */
	function setPendingAdmin(address _pendingAdmin) external onlyAdmin {
		pendingAdmin = _pendingAdmin;
		emit NewPendingAdmin(_pendingAdmin);
	}

	/**
	 * @notice Sets {pendingAdmin} to admin of current contract.
	 */
	function acceptAdmin() external {
		require(msg.sender == pendingAdmin, 'not pending admin');
		admin = msg.sender;
		pendingAdmin = address(0);
		emit NewAdmin(admin);
	}

	/**
	 * @notice Sets the the new value of {delay}.
	 * @param _delay Seconds to delay
	 */
	function setDelay(uint256 _delay) external onlyTimeLock {
		require(_delay >= MIN_DELAY, 'delay < min');
		require(_delay <= MAX_DELAY, 'delay > max');
		delay = _delay;
		emit NewDelay(_delay);
	}

	function _getTxHash(
		address target,
		uint256 value,
		string calldata signature,
		bytes calldata data,
		uint256 eta
	) private pure returns (bytes32) {
		return keccak256(abi.encode(target, value, signature, data, eta));
	}

	/**
	 * @notice Computes transaction hash.
	 * @param target Address to call
	 * @param value Amount of ETH to send
	 * @param signature Function signature
	 * @param data Data to send, function inputs
	 * @param eta Timestamp
	 */
	function getTxHash(
		address target,
		uint256 value,
		string calldata signature,
		bytes calldata data,
		uint256 eta
	) external pure returns (bytes32) {
		return _getTxHash(target, value, signature, data, eta);
	}

	/**
	 * @notice Queues a transaction by setting its status in {queuedTransactions} mapping.
	 * @param target Address to call
	 * @param value Amount of ETH to send
	 * @param signature Function signature
	 * @param data Data to send, function inputs
	 * @param eta Timestamp
	 */
	function queueTransaction(
		address target,
		uint256 value,
		string calldata signature,
		bytes calldata data,
		uint256 eta
	) external onlyAdmin returns (bytes32 txHash) {
		require(eta >= block.timestamp + delay, 'eta < now + delay');

		txHash = _getTxHash(target, value, signature, data, eta);
		require(!queuedTransactions[txHash], 'queued');
		queuedTransactions[txHash] = true;

		emit QueueTransaction(txHash, target, value, signature, data, eta);
	}

	/**
	 * @notice Cancels a transaction by setting its status in {queuedTransactions} mapping.
	 * @param target Address to call
	 * @param value Amount of ETH to send
	 * @param signature Function signature
	 * @param data Data to send, function inputs
	 * @param eta Timestamp
	 */
	function cancelTransaction(
		address target,
		uint256 value,
		string calldata signature,
		bytes calldata data,
		uint256 eta
	) external onlyAdmin {
		bytes32 txHash = _getTxHash(target, value, signature, data, eta);
		require(queuedTransactions[txHash], 'not queued');
		queuedTransactions[txHash] = false;
		emit CancelTransaction(txHash, target, value, signature, data, eta);
	}

	/**
	 * @notice Executes a transaction by making a low level call to its `target`.
	 * @param target Address to call
	 * @param value Amount of ETH to send
	 * @param signature Function signature
	 * @param data Data to send, function inputs
	 * @param eta Timestamp
	 */
	function executeTransaction(
		address target,
		uint256 value,
		string calldata signature,
		bytes calldata data,
		uint256 eta
	) external payable onlyAdmin returns (bytes memory) {
		bytes32 txHash = _getTxHash(target, value, signature, data, eta);

		require(queuedTransactions[txHash], 'not queued');
		require(block.timestamp >= eta, 'timestamp < eta');
		require(block.timestamp <= eta + GRACE_PERIOD, 'timestamp > grace period');

		queuedTransactions[txHash] = false;

		bytes memory callData;

		if (bytes(signature).length == 0) {
			callData = data;
		} else {
			callData = abi.encodePacked(bytes4(keccak256(bytes(signature))), data);
		}

		// solium-disable-next-line security/no-call-value
		(bool success, bytes memory returnData) = target.call{value: value}(callData);
		require(success, 'tx reverted');

		emit ExecuteTransaction(txHash, target, value, signature, data, eta);

		return returnData;
	}
}

File 2 of 2 : ITimeLock.sol
// SPDX-License-Identifier: GPL-3.0-or-later
pragma solidity 0.8.9;

interface ITimeLock {
    function delay() external view returns (uint);

    function queuedTransactions(bytes32 hash) external view returns (bool);

    function queueTransaction(
        address target,
        uint value,
        string calldata signature,
        bytes calldata data,
        uint eta
    ) external returns (bytes32);

    function cancelTransaction(
        address target,
        uint value,
        string calldata signature,
        bytes calldata data,
        uint eta
    ) external;

    function executeTransaction(
        address target,
        uint value,
        string calldata signature,
        bytes calldata data,
        uint eta
    ) external payable returns (bytes memory);
}

Settings
{
  "remappings": [
    "ds-test/=lib/forge-std/lib/ds-test/src/",
    "forge-std/=lib/forge-std/src/"
  ],
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "metadata": {
    "bytecodeHash": "ipfs"
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "evmVersion": "london",
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"uint256","name":"_delay","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"txHash","type":"bytes32"},{"indexed":true,"internalType":"address","name":"target","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"string","name":"signature","type":"string"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"},{"indexed":false,"internalType":"uint256","name":"eta","type":"uint256"}],"name":"CancelTransaction","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"txHash","type":"bytes32"},{"indexed":true,"internalType":"address","name":"target","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"string","name":"signature","type":"string"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"},{"indexed":false,"internalType":"uint256","name":"eta","type":"uint256"}],"name":"ExecuteTransaction","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAdmin","type":"address"}],"name":"NewAdmin","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newDelay","type":"uint256"}],"name":"NewDelay","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newPendingAdmin","type":"address"}],"name":"NewPendingAdmin","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"txHash","type":"bytes32"},{"indexed":true,"internalType":"address","name":"target","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"string","name":"signature","type":"string"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"},{"indexed":false,"internalType":"uint256","name":"eta","type":"uint256"}],"name":"QueueTransaction","type":"event"},{"inputs":[],"name":"acceptAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"string","name":"signature","type":"string"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"uint256","name":"eta","type":"uint256"}],"name":"cancelTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"delay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"string","name":"signature","type":"string"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"uint256","name":"eta","type":"uint256"}],"name":"executeTransaction","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"string","name":"signature","type":"string"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"uint256","name":"eta","type":"uint256"}],"name":"getTxHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"pendingAdmin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"string","name":"signature","type":"string"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"uint256","name":"eta","type":"uint256"}],"name":"queueTransaction","outputs":[{"internalType":"bytes32","name":"txHash","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"queuedTransactions","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_delay","type":"uint256"}],"name":"setDelay","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_pendingAdmin","type":"address"}],"name":"setPendingAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

Deployed Bytecode

0x6080604052600436106100a05760003560e01c80634dd18bf5116100645780634dd18bf51461016e578063591fcdfe1461018e5780636a42b8f8146101ae578063e177246e146101c4578063f2b06537146101e4578063f851a4401461022457600080fd5b806304a71576146100ac5780630825f38f146100df5780630e18b681146100ff57806326782247146101165780633a66f9011461014e57600080fd5b366100a757005b600080fd5b3480156100b857600080fd5b506100cc6100c7366004610a12565b610244565b6040519081526020015b60405180910390f35b6100f26100ed366004610a12565b610261565b6040516100d69190610ad5565b34801561010b57600080fd5b50610114610524565b005b34801561012257600080fd5b50600154610136906001600160a01b031681565b6040516001600160a01b0390911681526020016100d6565b34801561015a57600080fd5b506100cc610169366004610a12565b6105bb565b34801561017a57600080fd5b50610114610189366004610b08565b610703565b34801561019a57600080fd5b506101146101a9366004610a12565b610777565b3480156101ba57600080fd5b506100cc60025481565b3480156101d057600080fd5b506101146101df366004610b2a565b61086f565b3480156101f057600080fd5b506102146101ff366004610b2a565b60036020526000908152604090205460ff1681565b60405190151581526020016100d6565b34801561023057600080fd5b50600054610136906001600160a01b031681565b60006102558888888888888861096b565b98975050505050505050565b6000546060906001600160a01b031633146102975760405162461bcd60e51b815260040161028e90610b43565b60405180910390fd5b60006102a88989898989898961096b565b60008181526003602052604090205490915060ff166102f65760405162461bcd60e51b815260206004820152600a6024820152691b9bdd081c5d595d595960b21b604482015260640161028e565b824210156103385760405162461bcd60e51b815260206004820152600f60248201526e74696d657374616d70203c2065746160881b604482015260640161028e565b6103456212750084610b66565b4211156103945760405162461bcd60e51b815260206004820152601860248201527f74696d657374616d70203e20677261636520706572696f640000000000000000604482015260640161028e565b6000818152600360205260409020805460ff191690556060866103f05785858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092935061042b92505050565b8787604051610400929190610b8c565b6040519081900381206104199188908890602001610b9c565b60405160208183030381529060405290505b6000808b6001600160a01b03168b846040516104479190610bc0565b60006040518083038185875af1925050503d8060008114610484576040519150601f19603f3d011682016040523d82523d6000602084013e610489565b606091505b5091509150816104c95760405162461bcd60e51b815260206004820152600b60248201526a1d1e081c995d995c9d195960aa1b604482015260640161028e565b8b6001600160a01b0316847fa560e3198060a2f10670c1ec5b403077ea6ae93ca8de1c32b451dc1a943cd6e78d8d8d8d8d8d60405161050d96959493929190610c05565b60405180910390a39b9a5050505050505050505050565b6001546001600160a01b031633146105725760405162461bcd60e51b81526020600482015260116024820152703737ba103832b73234b7339030b236b4b760791b604482015260640161028e565b60008054336001600160a01b0319918216811783556001805490921690915560405190917f71614071b88dee5e0b2ae578a9dd7b2ebbe9ae832ba419dc0242cd065a290b6c91a2565b600080546001600160a01b031633146105e65760405162461bcd60e51b815260040161028e90610b43565b6002546105f39042610b66565b8210156106365760405162461bcd60e51b8152602060048201526011602482015270657461203c206e6f77202b2064656c617960781b604482015260640161028e565b6106458888888888888861096b565b60008181526003602052604090205490915060ff16156106905760405162461bcd60e51b81526020600482015260066024820152651c5d595d595960d21b604482015260640161028e565b60008181526003602052604090819020805460ff19166001179055516001600160a01b0389169082907f76e2796dc3a81d57b0e8504b647febcbeeb5f4af818e164f11eef8131a6a763f906106f0908b908b908b908b908b908b90610c05565b60405180910390a3979650505050505050565b6000546001600160a01b0316331461072d5760405162461bcd60e51b815260040161028e90610b43565b600180546001600160a01b0319166001600160a01b0383169081179091556040517f69d78e38a01985fbb1462961809b4b2d65531bc93b2b94037f3334b82ca4a75690600090a250565b6000546001600160a01b031633146107a15760405162461bcd60e51b815260040161028e90610b43565b60006107b28888888888888861096b565b60008181526003602052604090205490915060ff166108005760405162461bcd60e51b815260206004820152600a6024820152691b9bdd081c5d595d595960b21b604482015260640161028e565b60008181526003602052604090819020805460ff19169055516001600160a01b0389169082907f2fffc091a501fd91bfbff27141450d3acb40fb8e6d8382b243ec7a812a3aaf879061085d908b908b908b908b908b908b90610c05565b60405180910390a35050505050505050565b3330146108ae5760405162461bcd60e51b815260206004820152600d60248201526c6e6f742074696d65206c6f636b60981b604482015260640161028e565b620151808110156108ef5760405162461bcd60e51b815260206004820152600b60248201526a3232b630bc901e1036b4b760a91b604482015260640161028e565b62278d008111156109305760405162461bcd60e51b815260206004820152600b60248201526a0c8cad8c2f2407c40dac2f60ab1b604482015260640161028e565b60028190556040518181527f948b1f6a42ee138b7e34058ba85a37f716d55ff25ff05a763f15bed6a04c8d2c9060200160405180910390a150565b60008787878787878760405160200161098a9796959493929190610c46565b604051602081830303815290604052805190602001209050979650505050505050565b80356001600160a01b03811681146109c457600080fd5b919050565b60008083601f8401126109db57600080fd5b50813567ffffffffffffffff8111156109f357600080fd5b602083019150836020828501011115610a0b57600080fd5b9250929050565b600080600080600080600060a0888a031215610a2d57600080fd5b610a36886109ad565b965060208801359550604088013567ffffffffffffffff80821115610a5a57600080fd5b610a668b838c016109c9565b909750955060608a0135915080821115610a7f57600080fd5b50610a8c8a828b016109c9565b989b979a50959894979596608090950135949350505050565b60005b83811015610ac0578181015183820152602001610aa8565b83811115610acf576000848401525b50505050565b6020815260008251806020840152610af4816040850160208701610aa5565b601f01601f19169190910160400192915050565b600060208284031215610b1a57600080fd5b610b23826109ad565b9392505050565b600060208284031215610b3c57600080fd5b5035919050565b6020808252600990820152683737ba1030b236b4b760b91b604082015260600190565b60008219821115610b8757634e487b7160e01b600052601160045260246000fd5b500190565b8183823760009101908152919050565b6001600160e01b031984168152818360048301376000910160040190815292915050565b60008251610bd2818460208701610aa5565b9190910192915050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b868152608060208201526000610c1f608083018789610bdc565b8281036040840152610c32818688610bdc565b915050826060830152979650505050505050565b60018060a01b038816815286602082015260a060408201526000610c6e60a083018789610bdc565b8281036060840152610c81818688610bdc565b9150508260808301529897505050505050505056fea26469706673582212204040c369a3d399421ad8c9f8446e5816416b7b7c781592694622685ad8cbfc1a64736f6c63430008090033

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.