Contract

0xF31f1Ad07F469c1CAbDdA041A501Fcc9b2193790

Overview

M Balance

MemeCore LogoMemeCore LogoMemeCore Logo699,999,999.947949692 M

M Value

-

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Execute Tx9541282025-03-28 7:32:5326 days ago1743147173IN
0xF31f1Ad0...9b2193790
0 M0.087384851,502
Submit Tx9541232025-03-28 7:32:1826 days ago1743147138IN
0xF31f1Ad0...9b2193790
0 M0.266747691,502
Execute Tx9541152025-03-28 7:31:2226 days ago1743147082IN
0xF31f1Ad0...9b2193790
0 M0.154528761,502
Execute Tx9541112025-03-28 7:30:5426 days ago1743147054IN
0xF31f1Ad0...9b2193790
0 M0.154528761,502
Submit Tx9540762025-03-28 7:26:4926 days ago1743146809IN
0xF31f1Ad0...9b2193790
0 M0.267090141,502
Submit Tx9540732025-03-28 7:26:2826 days ago1743146788IN
0xF31f1Ad0...9b2193790
0 M0.267090141,502
Execute Tx9533862025-03-28 6:06:1926 days ago1743141979IN
0xF31f1Ad0...9b2193790
0 M0.090490991,502
Submit Tx9533782025-03-28 6:05:2326 days ago1743141923IN
0xF31f1Ad0...9b2193790
0 M0.225382611,502
Transfer9533322025-03-28 6:00:0126 days ago1743141601IN
0xF31f1Ad0...9b2193790
749,999,999.94794969 M0.034196031,502

Latest 1 internal transaction

Parent Transaction Hash Block From To
9533862025-03-28 6:06:1926 days ago1743141979
0xF31f1Ad0...9b2193790
50,000,000 M
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  ]
[ 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.