Contract

0x5327dB59913772934128c6201D3311823CB6103a

Overview

M Balance

MemeCore LogoMemeCore LogoMemeCore Logo99,999,999.947949692 M

M Value

-

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Execute Tx9535952025-03-28 6:30:4226 days ago1743143442IN
0x5327dB59...23CB6103a
0 M0.087384851,502
Submit Tx9535872025-03-28 6:29:4626 days ago1743143386IN
0x5327dB59...23CB6103a
0 M0.266747691,502
Execute Tx9533062025-03-28 5:56:5926 days ago1743141419IN
0x5327dB59...23CB6103a
0 M0.154528761,502
Execute Tx9533022025-03-28 5:56:3126 days ago1743141391IN
0x5327dB59...23CB6103a
0 M0.154510741,502
Transfer9530932025-03-28 5:32:0826 days ago1743139928IN
0x5327dB59...23CB6103a
99,999,999.94794969 M0.034196031,502
Submit Tx9530262025-03-28 5:24:1926 days ago1743139459IN
0x5327dB59...23CB6103a
0 M0.267090141,502
Submit Tx9530242025-03-28 5:24:0526 days ago1743139445IN
0x5327dB59...23CB6103a
0 M0.292774341,502

Parent Transaction Hash Block From To
View All Internal Transactions
Loading...
Loading

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

Contract Name:
TimelockMultiSigWallet

Compiler Version
v0.8.28+commit.7893614a

Optimization Enabled:
Yes with 200 runs

Other Settings:
shanghai EvmVersion
File 1 of 2 : TimelockMultiSigWallet.sol
// SPDX-License-Identifier: MIT

pragma solidity =0.8.28;

import {ITimelockMultiSigWallet} from "./ITimelockMultiSigWallet.sol";

contract TimelockMultiSigWallet is ITimelockMultiSigWallet {
    uint256 public constant EXECUTED_TIMESTAMP = uint256(1);

    mapping(uint256 txId => Transaction) public transactions;
    mapping(uint256 txId => uint256) public timestamps;
    mapping(uint256 txId => mapping(address owner => bool)) public isConfirmed;
    mapping(address owner => bool) public isOwner;

    address[] public owners;
    uint256 public transactionCount;
    uint256 public requiredConfirmations;
    uint256 public minDelay;

    modifier onlyOwner() {
        require(isOwner[msg.sender], UnAuthorizedCaller(msg.sender));
        _;
    }

    modifier onlyWallet() {
        require(msg.sender == address(this), InvalidAccess(msg.sender));
        _;
    }

    modifier onlyNotConfirmed(uint256 _txId) {
        require(
            !isConfirmed[_txId][msg.sender],
            CallerAlreadyConfirmed({txId: _txId, caller: msg.sender})
        );
        _;
    }

    /**
     * Transaction status
     * submitted -> fullyConfirmed -> scheduled(watting, ready) -> executed
     */
    modifier onlySubmittedTx(uint256 _txId) {
        require(_txId < transactionCount, UnsubmittedTx(_txId));
        _;
    }

    modifier onlyFullyConfirmed(uint256 _txId) {
        require(isFullyConfirmed(_txId), NotFullyConfirmedTx(_txId));
        _;
    }

    modifier onlyUnscheduled(uint256 _txId) {
        require(
            getScheduleStatus(_txId) == ScheduleStatus.Unscheduled,
            UnexpectedScheduleState({
                txId: _txId,
                expectedState: _encodeStateBitmap(ScheduleStatus.Unscheduled)
            })
        );
        _;
    }

    constructor(
        address[] memory _owners,
        uint256 _requiredConfirmations,
        uint256 _minDelay
    ) {
        uint256 ownersLen = _owners.length;
        require(
            ownersLen > 0,
            OwnersLengthNotEnough({newLength: ownersLen, minimum: 1})
        );
        require(
            _requiredConfirmations > 0 && _requiredConfirmations <= ownersLen,
            InvalidRequiredConfirmations({
                newRequired: _requiredConfirmations,
                maximum: ownersLen
            })
        );
        for (uint256 i = 0; i < ownersLen; i++) {
            address owner = _owners[i];
            require(owner != address(0), InvalidZeroAddress());
            require(!isOwner[owner], DuplicateOwner(owner));
            isOwner[owner] = true;
        }
        owners = _owners;

        requiredConfirmations = _requiredConfirmations;
        minDelay = _minDelay;
    }

    receive() external payable {
        emit Deposit(msg.sender, msg.value, address(this).balance);
    }

    function submitTx(
        address _to,
        uint256 _value,
        bytes calldata _data,
        uint256 _delay
    ) external onlyOwner {
        require(
            _delay >= minDelay,
            InsufficientDelay({delay: _delay, minDelay: minDelay})
        );

        uint256 txId = transactionCount;
        transactions[txId] = Transaction({
            to: _to,
            value: _value,
            data: _data,
            delay: _delay
        });
        transactionCount++;
        emit SubmitTx({txId: txId, submittedBy: msg.sender});

        _confirmTx(txId);
        if (requiredConfirmations == 1) _scheduleTx(txId);
    }

    function confirmTx(
        uint256 _txId
    )
        external
        onlyOwner
        onlySubmittedTx(_txId)
        onlyNotConfirmed(_txId)
        onlyUnscheduled(_txId)
    {
        _confirmTx(_txId);
        if (isFullyConfirmed(_txId)) _scheduleTx(_txId);
    }

    function revokeConfirmation(
        uint256 _txId
    ) external onlyOwner onlySubmittedTx(_txId) onlyUnscheduled(_txId) {
        require(
            isConfirmed[_txId][msg.sender],
            CallerNotConfirmed({txId: _txId, caller: msg.sender})
        );
        isConfirmed[_txId][msg.sender] = false;
        emit RevokeConfirmation({txId: _txId, revokedBy: msg.sender});
    }

    /**
     * @dev Changes the transaction status to 'executed' to prevent further confirmation or execution
     */
    function cancelTx(uint256 _txId) public onlyWallet onlySubmittedTx(_txId) {
        require(
            !isScheduleExecuted(_txId),
            UnexpectedScheduleState({
                txId: _txId,
                expectedState: _encodeStateBitmap(ScheduleStatus.Unscheduled) |
                    _encodeStateBitmap(ScheduleStatus.Waiting) |
                    _encodeStateBitmap(ScheduleStatus.Ready)
            })
        );
        delete transactions[_txId];
        timestamps[_txId] = EXECUTED_TIMESTAMP;
        emit CancelTx({txId: _txId, canceledBy: msg.sender});
    }

    function executeTx(
        uint256 _txId
    ) public onlyOwner onlySubmittedTx(_txId) onlyFullyConfirmed(_txId) {
        Transaction storage transaction = transactions[_txId];
        uint256 value = transaction.value;
        uint256 balance = address(this).balance;
        require(
            balance >= value,
            NotEnoughBalance({have: balance, need: value})
        );

        _beforeCall(_txId);
        (bool success, bytes memory data) = transaction.to.call{value: value}(
            transaction.data
        );
        if (!success) {
            assembly {
                revert(add(data, 32), mload(data))
            }
        }
        _afterCall(_txId);

        emit ExecuteTx({txId: _txId, executedBy: msg.sender});
    }

    function _beforeCall(uint256 _txId) private view {
        require(
            isScheduleReady(_txId),
            UnexpectedScheduleState({
                txId: _txId,
                expectedState: _encodeStateBitmap(ScheduleStatus.Ready)
            })
        );
    }

    function _afterCall(uint256 _txId) private {
        require(
            isScheduleReady(_txId),
            UnexpectedScheduleState({
                txId: _txId,
                expectedState: _encodeStateBitmap(ScheduleStatus.Ready)
            })
        );
        timestamps[_txId] = EXECUTED_TIMESTAMP;
    }

    function addOwner(address _owner) external onlyWallet {
        require(_owner != address(0), InvalidZeroAddress());
        require(!isOwner[_owner], DuplicateOwner(_owner));

        isOwner[_owner] = true;
        owners.push(_owner);

        emit AddOwner(_owner);
    }

    function removeOwner(address _owner) external onlyWallet {
        require(isOwner[_owner], NotOwnerAddress(_owner));
        uint256 newOwnerLength = owners.length - 1;
        require(
            newOwnerLength >= requiredConfirmations,
            OwnersLengthNotEnough(newOwnerLength, requiredConfirmations)
        );

        isOwner[_owner] = false;
        uint256 len = owners.length;
        for (uint256 i = 0; i < len; i++) {
            if (owners[i] == _owner) {
                owners[i] = owners[len - 1];
                owners.pop();
                break;
            }
        }

        emit RemoveOwner(_owner);
    }

    function changeOwner(
        address _oldOwner,
        address _newOwner
    ) external onlyWallet {
        require(isOwner[_oldOwner], NotOwnerAddress(_oldOwner));
        require(!isOwner[_newOwner], DuplicateOwner(_newOwner));
        require(_newOwner != address(0), InvalidZeroAddress());

        isOwner[_oldOwner] = false;
        isOwner[_newOwner] = true;
        uint256 len = owners.length;
        for (uint256 i = 0; i < len; i++) {
            if (owners[i] == _oldOwner) {
                owners[i] = _newOwner;
                break;
            }
        }

        emit ChangeOwner(_oldOwner, _newOwner);
    }

    function changeRequiredConfirmations(uint8 _required) external onlyWallet {
        uint256 maximum = owners.length;
        require(
            _required > 0 && _required <= maximum,
            InvalidRequiredConfirmations({
                newRequired: _required,
                maximum: maximum
            })
        );
        requiredConfirmations = _required;
        emit ChangeRequiredConfirmations(_required);
    }

    function changeMinDelay(uint256 _newDelay) external onlyWallet {
        minDelay = _newDelay;
        emit ChangeMinDelay({oldDelay: minDelay, newDelay: _newDelay});
    }

    function _confirmTx(uint256 _txId) private {
        isConfirmed[_txId][msg.sender] = true;
        emit ConfirmTx({txId: _txId, confirmedBy: msg.sender});
    }

    function _scheduleTx(uint256 _txId) private {
        uint256 timestamp = block.timestamp + transactions[_txId].delay;
        timestamps[_txId] = timestamp;
        emit ScheduleTx({txId: _txId, timestamp: timestamp});
    }

    function isFullyConfirmed(uint256 _txId) public view returns (bool) {
        uint256 count = 0;
        uint256 len = owners.length;
        for (uint256 i = 0; i < len; i++) {
            if (isConfirmed[_txId][owners[i]]) {
                count += 1;
            }
            if (count == requiredConfirmations) {
                return true;
            }
        }
        return false;
    }

    function isSchedulePending(uint256 _txId) public view returns (bool) {
        ScheduleStatus state = getScheduleStatus(_txId);
        return state == ScheduleStatus.Waiting || state == ScheduleStatus.Ready;
    }

    function isScheduleReady(uint256 _txId) public view returns (bool) {
        return getScheduleStatus(_txId) == ScheduleStatus.Ready;
    }

    function isScheduleExecuted(uint256 _txId) public view returns (bool) {
        return getScheduleStatus(_txId) == ScheduleStatus.Executed;
    }

    function getConfirmCount(uint256 _txId) public view returns (uint256) {
        uint256 count = 0;
        uint256 len = owners.length;
        for (uint256 i = 0; i < len; i++) {
            if (isConfirmed[_txId][owners[i]]) {
                count += 1;
            }
        }
        return count;
    }

    function getScheduleStatus(
        uint256 _txId
    ) public view returns (ScheduleStatus) {
        uint256 timestamp = timestamps[_txId];
        if (timestamp == 0) {
            return ScheduleStatus.Unscheduled;
        } else if (timestamp == EXECUTED_TIMESTAMP) {
            return ScheduleStatus.Executed;
        } else if (timestamp > block.timestamp) {
            return ScheduleStatus.Waiting;
        } else {
            return ScheduleStatus.Ready;
        }
    }

    function getTransactionsInfo(
        uint256[] memory _txIds
    )
        external
        view
        returns (
            ScheduleStatus[] memory status,
            uint256[] memory confirmCounts,
            Transaction[] memory txs
        )
    {
        uint256 txIdsLength = _txIds.length;
        require(txIdsLength > 0);
        status = new ScheduleStatus[](txIdsLength);
        confirmCounts = new uint256[](txIdsLength);
        txs = new Transaction[](txIdsLength);

        for (uint256 i = 0; i < txIdsLength; i++) {
            uint256 id = _txIds[i];
            status[i] = getScheduleStatus(id);
            confirmCounts[i] = getConfirmCount(id);
            txs[i] = transactions[id];
        }
    }

    function getOwnersLen() external view returns (uint256) {
        return owners.length;
    }

    function getOwners() external view returns (address[] memory) {
        return owners;
    }

    /**
     * 0x000...1000
     *   ^^^^^^----- ...
     *         ^---- Executed
     *          ^--- Ready
     *           ^-- Waiting
     *            ^- Unscheduled
     */
    function _encodeStateBitmap(
        ScheduleStatus _scheduleStatus
    ) private pure returns (bytes32) {
        return bytes32(1 << uint8(_scheduleStatus));
    }
}

File 2 of 2 : ITimelockMultiSigWallet.sol
// SPDX-License-Identifier: MIT

pragma solidity =0.8.28;

interface ITimelockMultiSigWallet {
    struct Transaction {
        address to;
        uint256 value;
        uint256 delay;
        bytes data;
    }

    enum ScheduleStatus {
        Unscheduled,
        Waiting,
        Ready,
        Executed
    }

    // events
    event SubmitTx(uint256 indexed txId, address indexed submittedBy);

    event ConfirmTx(uint256 indexed txId, address indexed confirmedBy);

    event RevokeConfirmation(uint256 indexed txId, address indexed revokedBy);

    event ScheduleTx(uint256 indexed txId, uint256 timestamp);

    event CancelTx(uint256 indexed txId, address indexed canceledBy);

    event AddOwner(address indexed owner);

    event ChangeMinDelay(uint256 oldDelay, uint256 newDelay);

    event ChangeOwner(address indexed oldOwner, address indexed newOwner);

    event ChangeRequiredConfirmations(uint8 required);

    event Deposit(address indexed sender, uint256 amount, uint256 balance);

    event ExecuteTx(uint256 indexed txId, address indexed executedBy);

    event RemoveOwner(address indexed revokedOwner);

    // errors
    error UnAuthorizedCaller(address caller);

    error InvalidAccess(address caller);

    error CallerAlreadyConfirmed(uint256 txId, address caller);

    error CallerNotConfirmed(uint256 txId, address caller);

    error UnsubmittedTx(uint256 txId);

    error NotFullyConfirmedTx(uint256 txId);

    error UnexpectedScheduleState(uint256 txId, bytes32 expectedState);

    error NotEnoughBalance(uint256 have, uint256 need);

    error InvalidZeroAddress();

    error NotOwnerAddress(address addr);

    error DuplicateOwner(address addr);

    error OwnersLengthNotEnough(uint256 newLength, uint256 minimum);

    error InvalidRequiredConfirmations(uint256 newRequired, uint256 maximum);

    error InsufficientDelay(uint256 delay, uint256 minDelay);

    // functions
    receive() external payable;

    function EXECUTED_TIMESTAMP() external view returns (uint256);

    function addOwner(address _owner) external;

    function cancelTx(uint256 _txId) external;

    function changeMinDelay(uint256 _newDelay) external;

    function changeOwner(address _oldOwner, address _newOwner) external;

    function changeRequiredConfirmations(uint8 _required) external;

    function confirmTx(uint256 _txId) external;

    function executeTx(uint256 _txId) external;

    function getConfirmCount(uint256 _txId) external view returns (uint256);

    function getOwners() external view returns (address[] memory);

    function getOwnersLen() external view returns (uint256);

    function getScheduleStatus(
        uint256 _txId
    ) external view returns (ITimelockMultiSigWallet.ScheduleStatus);

    function isConfirmed(
        uint256 txId,
        address owner
    ) external view returns (bool);

    function isFullyConfirmed(uint256 _txId) external view returns (bool);

    function isOwner(address owner) external view returns (bool);

    function isScheduleExecuted(uint256 _txId) external view returns (bool);

    function isSchedulePending(uint256 _txId) external view returns (bool);

    function isScheduleReady(uint256 _txId) external view returns (bool);

    function minDelay() external view returns (uint256);

    function owners(uint256) external view returns (address);

    function removeOwner(address _owner) external;

    function requiredConfirmations() external view returns (uint256);

    function revokeConfirmation(uint256 _txId) external;

    function submitTx(
        address _to,
        uint256 _value,
        bytes memory _data,
        uint256 _delay
    ) external;

    function timestamps(uint256 txId) external view returns (uint256);

    function transactionCount() external view returns (uint256);

    function transactions(
        uint256 txId
    )
        external
        view
        returns (address to, uint256 value, uint256 delay, bytes memory data);

    function getTransactionsInfo(
        uint256[] memory _txIds
    )
        external
        view
        returns (
            ScheduleStatus[] memory status,
            uint256[] memory confirmCounts,
            Transaction[] memory txs
        );
}

Settings
{
  "remappings": [
    "@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/",
    "@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/",
    "ds-test/=lib/openzeppelin-contracts-upgradeable/lib/forge-std/lib/ds-test/src/",
    "erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/",
    "forge-std/=lib/forge-std/src/",
    "halmos-cheatcodes/=lib/openzeppelin-contracts-upgradeable/lib/halmos-cheatcodes/src/",
    "openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/",
    "openzeppelin-contracts/=lib/openzeppelin-contracts/"
  ],
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "metadata": {
    "useLiteralContent": false,
    "bytecodeHash": "ipfs",
    "appendCBOR": true
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "evmVersion": "shanghai",
  "viaIR": false,
  "libraries": {}
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"address[]","name":"_owners","type":"address[]"},{"internalType":"uint256","name":"_requiredConfirmations","type":"uint256"},{"internalType":"uint256","name":"_minDelay","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"uint256","name":"txId","type":"uint256"},{"internalType":"address","name":"caller","type":"address"}],"name":"CallerAlreadyConfirmed","type":"error"},{"inputs":[{"internalType":"uint256","name":"txId","type":"uint256"},{"internalType":"address","name":"caller","type":"address"}],"name":"CallerNotConfirmed","type":"error"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"DuplicateOwner","type":"error"},{"inputs":[{"internalType":"uint256","name":"delay","type":"uint256"},{"internalType":"uint256","name":"minDelay","type":"uint256"}],"name":"InsufficientDelay","type":"error"},{"inputs":[{"internalType":"address","name":"caller","type":"address"}],"name":"InvalidAccess","type":"error"},{"inputs":[{"internalType":"uint256","name":"newRequired","type":"uint256"},{"internalType":"uint256","name":"maximum","type":"uint256"}],"name":"InvalidRequiredConfirmations","type":"error"},{"inputs":[],"name":"InvalidZeroAddress","type":"error"},{"inputs":[{"internalType":"uint256","name":"have","type":"uint256"},{"internalType":"uint256","name":"need","type":"uint256"}],"name":"NotEnoughBalance","type":"error"},{"inputs":[{"internalType":"uint256","name":"txId","type":"uint256"}],"name":"NotFullyConfirmedTx","type":"error"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"NotOwnerAddress","type":"error"},{"inputs":[{"internalType":"uint256","name":"newLength","type":"uint256"},{"internalType":"uint256","name":"minimum","type":"uint256"}],"name":"OwnersLengthNotEnough","type":"error"},{"inputs":[{"internalType":"address","name":"caller","type":"address"}],"name":"UnAuthorizedCaller","type":"error"},{"inputs":[{"internalType":"uint256","name":"txId","type":"uint256"},{"internalType":"bytes32","name":"expectedState","type":"bytes32"}],"name":"UnexpectedScheduleState","type":"error"},{"inputs":[{"internalType":"uint256","name":"txId","type":"uint256"}],"name":"UnsubmittedTx","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"}],"name":"AddOwner","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"txId","type":"uint256"},{"indexed":true,"internalType":"address","name":"canceledBy","type":"address"}],"name":"CancelTx","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldDelay","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newDelay","type":"uint256"}],"name":"ChangeMinDelay","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"ChangeOwner","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"required","type":"uint8"}],"name":"ChangeRequiredConfirmations","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"txId","type":"uint256"},{"indexed":true,"internalType":"address","name":"confirmedBy","type":"address"}],"name":"ConfirmTx","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"balance","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"txId","type":"uint256"},{"indexed":true,"internalType":"address","name":"executedBy","type":"address"}],"name":"ExecuteTx","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"revokedOwner","type":"address"}],"name":"RemoveOwner","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"txId","type":"uint256"},{"indexed":true,"internalType":"address","name":"revokedBy","type":"address"}],"name":"RevokeConfirmation","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"txId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"ScheduleTx","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"txId","type":"uint256"},{"indexed":true,"internalType":"address","name":"submittedBy","type":"address"}],"name":"SubmitTx","type":"event"},{"inputs":[],"name":"EXECUTED_TIMESTAMP","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"addOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_txId","type":"uint256"}],"name":"cancelTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newDelay","type":"uint256"}],"name":"changeMinDelay","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_oldOwner","type":"address"},{"internalType":"address","name":"_newOwner","type":"address"}],"name":"changeOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_required","type":"uint8"}],"name":"changeRequiredConfirmations","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_txId","type":"uint256"}],"name":"confirmTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_txId","type":"uint256"}],"name":"executeTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_txId","type":"uint256"}],"name":"getConfirmCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getOwners","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getOwnersLen","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_txId","type":"uint256"}],"name":"getScheduleStatus","outputs":[{"internalType":"enum ITimelockMultiSigWallet.ScheduleStatus","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_txIds","type":"uint256[]"}],"name":"getTransactionsInfo","outputs":[{"internalType":"enum ITimelockMultiSigWallet.ScheduleStatus[]","name":"status","type":"uint8[]"},{"internalType":"uint256[]","name":"confirmCounts","type":"uint256[]"},{"components":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"delay","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"internalType":"struct ITimelockMultiSigWallet.Transaction[]","name":"txs","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"txId","type":"uint256"},{"internalType":"address","name":"owner","type":"address"}],"name":"isConfirmed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_txId","type":"uint256"}],"name":"isFullyConfirmed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_txId","type":"uint256"}],"name":"isScheduleExecuted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_txId","type":"uint256"}],"name":"isSchedulePending","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_txId","type":"uint256"}],"name":"isScheduleReady","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minDelay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"owners","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"removeOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"requiredConfirmations","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_txId","type":"uint256"}],"name":"revokeConfirmation","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"},{"internalType":"uint256","name":"_delay","type":"uint256"}],"name":"submitTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"txId","type":"uint256"}],"name":"timestamps","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"transactionCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"txId","type":"uint256"}],"name":"transactions","outputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"delay","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

Deployed Bytecode

0x6080604052600436106101b2575f3560e01c806380be9696116100e7578063a452304211610087578063d0b6a17d11610062578063d0b6a17d14610556578063f00d4b5d14610575578063f079630414610594578063fc5616f8146105a8575f5ffd5b8063a45230421461050d578063b77bf6001461052c578063c63c4e9b14610541575f5ffd5b80638bc33af3116100c25780638bc33af3146104735780639749b3681461049e5780639ace38c2146104bd578063a0e67e2b146104ec575f5ffd5b806380be96961461040657806380f59a651461042557806382e717f71461045e575f5ffd5b80634d07ffd11161015257806366670bc91161012d57806366670bc91461038a5780636e7afa34146103a95780637065cb48146103c8578063801be060146103e7575f5ffd5b80634d07ffd11461032057806354b5fe801461034c57806357b055bc1461036b575f5ffd5b8063173825d91161018d578063173825d91461028e57806319089490146102af57806320ea8d86146102c35780632f54bf6e146102e2575f5ffd5b8063025e7c27146101f7578063088440bf1461023357806309a3c07814610260575f5ffd5b366101f3576040805134815247602082015233917f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a15910160405180910390a2005b5f5ffd5b348015610202575f5ffd5b50610216610211366004611a63565b6105c7565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561023e575f5ffd5b5061025261024d366004611a63565b6105ef565b60405190815260200161022a565b34801561026b575f5ffd5b5061027f61027a366004611a8e565b61066f565b60405161022a93929190611c5b565b348015610299575f5ffd5b506102ad6102a8366004611d11565b610925565b005b3480156102ba575f5ffd5b50600454610252565b3480156102ce575f5ffd5b506102ad6102dd366004611a63565b610b30565b3480156102ed575f5ffd5b506103106102fc366004611d11565b60036020525f908152604090205460ff1681565b604051901515815260200161022a565b34801561032b575f5ffd5b5061033f61033a366004611a63565b610c86565b60405161022a9190611d2a565b348015610357575f5ffd5b506102ad610366366004611a63565b610cd4565b348015610376575f5ffd5b506102ad610385366004611a63565b610e65565b348015610395575f5ffd5b506103106103a4366004611a63565b610f8a565b3480156103b4575f5ffd5b506103106103c3366004611a63565b610faf565b3480156103d3575f5ffd5b506102ad6103e2366004611d11565b611044565b3480156103f2575f5ffd5b506102ad610401366004611a63565b61116c565b348015610411575f5ffd5b50610310610420366004611a63565b61129c565b348015610430575f5ffd5b5061031061043f366004611d3e565b600260209081525f928352604080842090915290825290205460ff1681565b348015610469575f5ffd5b5061025260065481565b34801561047e575f5ffd5b5061025261048d366004611a63565b60016020525f908152604090205481565b3480156104a9575f5ffd5b506102ad6104b8366004611a63565b6112e1565b3480156104c8575f5ffd5b506104dc6104d7366004611a63565b611350565b60405161022a9493929190611d68565b3480156104f7575f5ffd5b5061050061140a565b60405161022a9190611d94565b348015610518575f5ffd5b506102ad610527366004611ddf565b61146a565b348015610537575f5ffd5b5061025260055481565b34801561054c575f5ffd5b5061025260075481565b348015610561575f5ffd5b506102ad610570366004611dff565b61151e565b348015610580575f5ffd5b506102ad61058f366004611e89565b6116a8565b34801561059f575f5ffd5b50610252600181565b3480156105b3575f5ffd5b506103106105c2366004611a63565b611897565b600481815481106105d6575f80fd5b5f918252602090912001546001600160a01b0316905081565b6004545f908190815b81811015610666575f858152600260205260408120600480549192918490811061062457610624611eb1565b5f9182526020808320909101546001600160a01b0316835282019290925260400190205460ff161561065e5761065b600184611ed9565b92505b6001016105f8565b50909392505050565b60608060605f845190505f8111610684575f5ffd5b8067ffffffffffffffff81111561069d5761069d611a7a565b6040519080825280602002602001820160405280156106c6578160200160208202803683370190505b5093508067ffffffffffffffff8111156106e2576106e2611a7a565b60405190808252806020026020018201604052801561070b578160200160208202803683370190505b5092508067ffffffffffffffff81111561072757610727611a7a565b60405190808252806020026020018201604052801561078957816020015b61077660405180608001604052805f6001600160a01b031681526020015f81526020015f8152602001606081525090565b8152602001906001900390816107455790505b5091505f5b8181101561091c575f8682815181106107a9576107a9611eb1565b602002602001015190506107bc81610c86565b8683815181106107ce576107ce611eb1565b602002602001019060038111156107e7576107e7611b56565b908160038111156107fa576107fa611b56565b905250610806816105ef565b85838151811061081857610818611eb1565b6020908102919091018101919091525f828152808252604090819020815160808101835281546001600160a01b0316815260018201549381019390935260028101549183019190915260038101805460608401919061087690611eec565b80601f01602080910402602001604051908101604052809291908181526020018280546108a290611eec565b80156108ed5780601f106108c4576101008083540402835291602001916108ed565b820191905f5260205f20905b8154815290600101906020018083116108d057829003601f168201915b50505050508152505084838151811061090857610908611eb1565b60209081029190910101525060010161078e565b50509193909250565b33308114610957576040516384fa6f7160e01b81526001600160a01b0390911660048201526024015b60405180910390fd5b506001600160a01b0381165f90815260036020526040902054819060ff1661099e5760405163a5a3ffb960e01b81526001600160a01b03909116600482015260240161094e565b506004545f906109b090600190611f1e565b6006549091508190808210156109e25760405163144e1ce760e21b81526004810192909252602482015260440161094e565b50506001600160a01b0382165f908152600360205260408120805460ff19169055600454905b81811015610af757836001600160a01b031660048281548110610a2d57610a2d611eb1565b5f918252602090912001546001600160a01b031603610aef576004610a53600184611f1e565b81548110610a6357610a63611eb1565b5f91825260209091200154600480546001600160a01b039092169183908110610a8e57610a8e611eb1565b905f5260205f20015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506004805480610aca57610aca611f31565b5f8281526020902081015f1990810180546001600160a01b0319169055019055610af7565b600101610a08565b506040516001600160a01b038416907fac6e8398676cf37429d530b81144d7079e99f4fe9d28b0d88c4a749ceccbe8cd905f90a2505050565b335f8181526003602052604090205460ff16610b6b57604051630b104a5b60e01b81526001600160a01b03909116600482015260240161094e565b508060055481108190610b9457604051630f2b9c6360e41b815260040161094e91815260200190565b50815f610ba082610c86565b6003811115610bb157610bb1611b56565b1481610bbc5f61189f565b9091610be45760405163c7af9e5d60e01b81526004810192909252602482015260440161094e565b50505f8381526002602090815260408083203380855292529091205484919060ff16610c355760405163123c4d5760e11b815260048101929092526001600160a01b0316602482015260440161094e565b50505f838152600260209081526040808320338085529252808320805460ff1916905551909185917f7f8ce8e4f5a5b480ff78c18404639350996fd63efc83ace55b1d6a3e12158e249190a3505050565b5f81815260016020526040812054808203610ca357505f92915050565b60018103610cb45750600392915050565b42811115610cc55750600192915050565b50600292915050565b50919050565b335f8181526003602052604090205460ff16610d0f57604051630b104a5b60e01b81526001600160a01b03909116600482015260240161094e565b508060055481108190610d3857604051630f2b9c6360e41b815260040161094e91815260200190565b5081610d4381610faf565b8190610d6557604051636fc639ef60e01b815260040161094e91815260200190565b505f838152602081905260409020600181015447808280821015610da557604051634787a10360e11b81526004810192909252602482015260440161094e565b5050610db0866118c1565b82546040515f9182916001600160a01b03909116908590610dd5906003890190611f45565b5f6040518083038185875af1925050503d805f8114610e0f576040519150601f19603f3d011682016040523d82523d5f602084013e610e14565b606091505b509150915081610e2657805160208201fd5b610e2f88611902565b604051339089907fd4e99b6d5236f3c2f82c63c57342d13eb032719450bf3ca7680839cc7fdc24c9905f90a35050505050505050565b33308114610e92576040516384fa6f7160e01b81526001600160a01b03909116600482015260240161094e565b508060055481108190610ebb57604051630f2b9c6360e41b815260040161094e91815260200190565b50610ec582611897565b1582610ed1600261189f565b610edb600161189f565b610ee45f61189f565b17179091610f0e5760405163c7af9e5d60e01b81526004810192909252602482015260440161094e565b50505f82815260208190526040812080546001600160a01b0319168155600181018290556002810182905590610f476003830182611a11565b50505f8281526001602081905260408083209190915551339184917fe0246fa20caffde99aa81aaa27d0eb4993a6e5caae34ac12c7e513aed1ae0abe9190a35050565b5f60025b610f9783610c86565b6003811115610fa857610fa8611b56565b1492915050565b6004545f908190815b8181101561103a575f8581526002602052604081206004805491929184908110610fe457610fe4611eb1565b5f9182526020808320909101546001600160a01b0316835282019290925260400190205460ff161561101e5761101b600184611ed9565b92505b600654830361103257506001949350505050565b600101610fb8565b505f949350505050565b33308114611071576040516384fa6f7160e01b81526001600160a01b03909116600482015260240161094e565b506001600160a01b0381166110995760405163f6b2911f60e01b815260040160405180910390fd5b6001600160a01b0381165f90815260036020526040902054819060ff16156110e057604051632029bc6560e01b81526001600160a01b03909116600482015260240161094e565b506001600160a01b0381165f81815260036020526040808220805460ff1916600190811790915560048054918201815583527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b0180546001600160a01b03191684179055517fac1e9ef41b54c676ccf449d83ae6f2624bcdce8f5b93a6b48ce95874c332693d9190a250565b335f8181526003602052604090205460ff166111a757604051630b104a5b60e01b81526001600160a01b03909116600482015260240161094e565b5080600554811081906111d057604051630f2b9c6360e41b815260040161094e91815260200190565b505f828152600260209081526040808320338085529252909120548391829160ff16156112225760405163140415cb60e01b815260048101929092526001600160a01b0316602482015260440161094e565b508390505f61123082610c86565b600381111561124157611241611b56565b148161124c5f61189f565b90916112745760405163c7af9e5d60e01b81526004810192909252602482015260440161094e565b505061127f84611953565b61128884610faf565b1561129657611296846119a3565b50505050565b5f5f6112a783610c86565b905060018160038111156112bd576112bd611b56565b14806112da575060028160038111156112d8576112d8611b56565b145b9392505050565b3330811461130e576040516384fa6f7160e01b81526001600160a01b03909116600482015260240161094e565b50600781905560408051828152602081018390527f0c5ff76c31d24175d9e84ef46e328eafbcaeb2aa67a2333035eb082dd34324f1910160405180910390a150565b5f6020819052908152604090208054600182015460028301546003840180546001600160a01b0390941694929391929161138990611eec565b80601f01602080910402602001604051908101604052809291908181526020018280546113b590611eec565b80156114005780601f106113d757610100808354040283529160200191611400565b820191905f5260205f20905b8154815290600101906020018083116113e357829003601f168201915b5050505050905084565b6060600480548060200260200160405190810160405280929190818152602001828054801561146057602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311611442575b5050505050905090565b33308114611497576040516384fa6f7160e01b81526001600160a01b03909116600482015260240161094e565b5060045460ff8216158015906114b05750808260ff1611155b828290916114dc5760405163389a26c160e21b815260ff9092166004830152602482015260440161094e565b505060ff821660068190556040519081527f588dc25a3a4ef20c1e02fa5c2a887c852caf685c49563793b7b4bef9a5a169a19060200160405180910390a15050565b335f8181526003602052604090205460ff1661155957604051630b104a5b60e01b81526001600160a01b03909116600482015260240161094e565b50600754819080821015611589576040516348b6d3db60e01b81526004810192909252602482015260440161094e565b50505f60055490506040518060800160405280876001600160a01b0316815260200186815260200183815260200185858080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509390945250508381526020818152604091829020845181546001600160a01b0319166001600160a01b03909116178155908401516001820155908301516002820155606083015190915060038201906116419082612001565b50506005805491505f611653836120bc565b9091555050604051339082907fd5e71018e2b150e81bc29178fcd2d986031492eb90f4f87287c251f3c41aea72905f90a361168d81611953565b6006546001036116a0576116a0816119a3565b505050505050565b333081146116d5576040516384fa6f7160e01b81526001600160a01b03909116600482015260240161094e565b506001600160a01b0382165f90815260036020526040902054829060ff1661171c5760405163a5a3ffb960e01b81526001600160a01b03909116600482015260240161094e565b506001600160a01b0381165f90815260036020526040902054819060ff161561176457604051632029bc6560e01b81526001600160a01b03909116600482015260240161094e565b506001600160a01b03811661178c5760405163f6b2911f60e01b815260040160405180910390fd5b6001600160a01b038083165f90815260036020526040808220805460ff19908116909155928416825281208054909216600117909155600454905b8181101561185157836001600160a01b0316600482815481106117ec576117ec611eb1565b5f918252602090912001546001600160a01b03160361184957826004828154811061181957611819611eb1565b905f5260205f20015f6101000a8154816001600160a01b0302191690836001600160a01b03160217905550611851565b6001016117c7565b50816001600160a01b0316836001600160a01b03167f9aecf86140d81442289f667eb72e1202a8fbb3478a686659952e145e8531965660405160405180910390a3505050565b5f6003610f8e565b5f8160038111156118b2576118b2611b56565b600160ff919091161b92915050565b6118ca81610f8a565b816118d5600261189f565b90916118fd5760405163c7af9e5d60e01b81526004810192909252602482015260440161094e565b505050565b61190b81610f8a565b81611916600261189f565b909161193e5760405163c7af9e5d60e01b81526004810192909252602482015260440161094e565b50505f90815260016020819052604090912055565b5f818152600260209081526040808320338085529252808320805460ff1916600117905551909183917f6e5d64ddafdd31fc9a91822d05f1eaa7b8cefdd22ecca7786b2132dac74edf199190a350565b5f818152602081905260408120600201546119be9042611ed9565b5f83815260016020526040908190208290555190915082907f193d02e3f35c67d210003621d4b64601dc382c6a91d9b6430109303b540fb9af90611a059084815260200190565b60405180910390a25050565b508054611a1d90611eec565b5f825580601f10611a2c575050565b601f0160209004905f5260205f2090810190611a489190611a4b565b50565b5b80821115611a5f575f8155600101611a4c565b5090565b5f60208284031215611a73575f5ffd5b5035919050565b634e487b7160e01b5f52604160045260245ffd5b5f60208284031215611a9e575f5ffd5b813567ffffffffffffffff811115611ab4575f5ffd5b8201601f81018413611ac4575f5ffd5b803567ffffffffffffffff811115611ade57611ade611a7a565b8060051b604051601f19603f830116810181811067ffffffffffffffff82111715611b0b57611b0b611a7a565b604052918252602081840181019290810187841115611b28575f5ffd5b6020850194505b83851015611b4b57843580825260209586019590935001611b2f565b509695505050505050565b634e487b7160e01b5f52602160045260245ffd5b60048110611b8657634e487b7160e01b5f52602160045260245ffd5b9052565b5f81518084525f5b81811015611bae57602081850181015186830182015201611b92565b505f602082860101526020601f19601f83011685010191505092915050565b5f82825180855260208501945060208160051b830101602085015f5b83811015611c4f57848303601f19018852815180516001600160a01b031684526020808201519085015260408082015190850152606090810151608091850182905290611c3890850182611b8a565b6020998a0199909450929092019150600101611be9565b50909695505050505050565b606080825284519082018190525f9060208601906080840190835b81811015611c9c57611c89838551611b6a565b6020938401939290920191600101611c76565b5050838103602080860191909152865180835291810192508601905f5b81811015611cd7578251845260209384019390920191600101611cb9565b5050508281036040840152611cec8185611bcd565b9695505050505050565b80356001600160a01b0381168114611d0c575f5ffd5b919050565b5f60208284031215611d21575f5ffd5b6112da82611cf6565b60208101611d388284611b6a565b92915050565b5f5f60408385031215611d4f575f5ffd5b82359150611d5f60208401611cf6565b90509250929050565b60018060a01b0385168152836020820152826040820152608060608201525f611cec6080830184611b8a565b602080825282518282018190525f918401906040840190835b81811015611dd45783516001600160a01b0316835260209384019390920191600101611dad565b509095945050505050565b5f60208284031215611def575f5ffd5b813560ff811681146112da575f5ffd5b5f5f5f5f5f60808688031215611e13575f5ffd5b611e1c86611cf6565b945060208601359350604086013567ffffffffffffffff811115611e3e575f5ffd5b8601601f81018813611e4e575f5ffd5b803567ffffffffffffffff811115611e64575f5ffd5b886020828401011115611e75575f5ffd5b959894975060200195606001359392505050565b5f5f60408385031215611e9a575f5ffd5b611ea383611cf6565b9150611d5f60208401611cf6565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b80820180821115611d3857611d38611ec5565b600181811c90821680611f0057607f821691505b602082108103610cce57634e487b7160e01b5f52602260045260245ffd5b81810381811115611d3857611d38611ec5565b634e487b7160e01b5f52603160045260245ffd5b5f5f8354611f5281611eec565b600182168015611f695760018114611f7e57611fab565b60ff1983168652811515820286019350611fab565b865f5260205f205f5b83811015611fa357815488820152600190910190602001611f87565b505081860193505b509195945050505050565b601f8211156118fd57805f5260205f20601f840160051c81016020851015611fdb5750805b601f840160051c820191505b81811015611ffa575f8155600101611fe7565b5050505050565b815167ffffffffffffffff81111561201b5761201b611a7a565b61202f816120298454611eec565b84611fb6565b6020601f821160018114612061575f831561204a5750848201515b5f19600385901b1c1916600184901b178455611ffa565b5f84815260208120601f198516915b828110156120905787850151825560209485019460019092019101612070565b50848210156120ad57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b5f600182016120cd576120cd611ec5565b506001019056fea26469706673582212205443c3aa322077444f601667ea26d71fb6def75206a157778f0a8edfb27447d764736f6c634300081c0033

Block Transaction 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
[ 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.