Cryo Explorer Ethereum Mainnet

Address Contract Partially Verified

Address 0xEbAABAc3E56E06D4cE4056593f98599d316557E6
Balance 0 ETH
Nonce 1
Code Size 5954 bytes
Indexed Transactions 0
External Etherscan · Sourcify

Contract Bytecode

5954 bytes
0x606060405236156100ef576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063025e7c271461014b57806320ea8d86146101ae5780632f54bf6e146101d15780633411c81c14610222578063547415251461027c578063784547a7146102c05780638b51d13f146102fb5780639ace38c214610332578063a0e67e2b14610430578063a8abe69a1461049b578063b5dc40c314610533578063b77bf600146105ac578063c01a8c84146105d5578063c6427474146105f8578063d74f8edd14610691578063dc8452cd146106ba578063ee22610b146106e3575b5b6000341115610148573373ffffffffffffffffffffffffffffffffffffffff167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c346040518082815260200191505060405180910390a25b5b005b341561015657600080fd5b61016c6004808035906020019091905050610706565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156101b957600080fd5b6101cf6004808035906020019091905050610746565b005b34156101dc57600080fd5b610208600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506108f2565b604051808215151515815260200191505060405180910390f35b341561022d57600080fd5b610262600480803590602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610912565b604051808215151515815260200191505060405180910390f35b341561028757600080fd5b6102aa600480803515159060200190919080351515906020019091905050610941565b6040518082815260200191505060405180910390f35b34156102cb57600080fd5b6102e160048080359060200190919050506109d5565b604051808215151515815260200191505060405180910390f35b341561030657600080fd5b61031c6004808035906020019091905050610abd565b6040518082815260200191505060405180910390f35b341561033d57600080fd5b6103536004808035906020019091905050610b8c565b604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001848152602001806020018315151515815260200182810382528481815460018160011615610100020316600290048152602001915080546001816001161561010002031660029004801561041e5780601f106103f35761010080835404028352916020019161041e565b820191906000526020600020905b81548152906001019060200180831161040157829003601f168201915b50509550505050505060405180910390f35b341561043b57600080fd5b610443610be8565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156104875780820151818401525b60208101905061046b565b505050509050019250505060405180910390f35b34156104a657600080fd5b6104db600480803590602001909190803590602001909190803515159060200190919080351515906020019091905050610c7d565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b8381101561051f5780820151818401525b602081019050610503565b505050509050019250505060405180910390f35b341561053e57600080fd5b6105546004808035906020019091905050610dde565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156105985780820151818401525b60208101905061057c565b505050509050019250505060405180910390f35b34156105b757600080fd5b6105bf61100f565b6040518082815260200191505060405180910390f35b34156105e057600080fd5b6105f66004808035906020019091905050611015565b005b341561060357600080fd5b61067b600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919050506111f6565b6040518082815260200191505060405180910390f35b341561069c57600080fd5b6106a4611216565b6040518082815260200191505060405180910390f35b34156106c557600080fd5b6106cd61121b565b6040518082815260200191505060405180910390f35b34156106ee57600080fd5b6107046004808035906020019091905050611221565b005b60038181548110151561071557fe5b906000526020600020900160005b915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b33600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151561079f57600080fd5b81336001600083815260200190815260200160002060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151561080a57600080fd5b8360008082815260200190815260200160002060030160009054906101000a900460ff1615151561083a57600080fd5b60006001600087815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550843373ffffffffffffffffffffffffffffffffffffffff167ff6a317157440607f36269043eb55f1287a5a19ba2216afeab88cd46cbcfb88e960405160405180910390a35b5b505b50505b5050565b60026020528060005260406000206000915054906101000a900460ff1681565b60016020528160005260406000206020528060005260406000206000915091509054906101000a900460ff1681565b600080600090505b6005548110156109cd57838015610980575060008082815260200190815260200160002060030160009054906101000a900460ff16155b806109b357508280156109b2575060008082815260200190815260200160002060030160009054906101000a900460ff165b5b156109bf576001820191505b5b8080600101915050610949565b5b5092915050565b6000806000809150600090505b600380549050811015610ab557600160008581526020019081526020016000206000600383815481101515610a1357fe5b906000526020600020900160005b9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610a94576001820191505b600454821415610aa75760019250610ab6565b5b80806001019150506109e2565b5b5050919050565b600080600090505b600380549050811015610b8557600160008481526020019081526020016000206000600383815481101515610af657fe5b906000526020600020900160005b9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610b77576001820191505b5b8080600101915050610ac5565b5b50919050565b60006020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169080600101549080600201908060030160009054906101000a900460ff16905084565b610bf0611649565b6003805480602002602001604051908101604052809291908181526020018280548015610c7257602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311610c28575b505050505090505b90565b610c8561165d565b610c8d61165d565b600080600554604051805910610ca05750595b908082528060200260200182016040525b50925060009150600090505b600554811015610d5e57858015610cf4575060008082815260200190815260200160002060030160009054906101000a900460ff16155b80610d275750848015610d26575060008082815260200190815260200160002060030160009054906101000a900460ff165b5b15610d5057808383815181101515610d3b57fe5b90602001906020020181815250506001820191505b5b8080600101915050610cbd565b878703604051805910610d6e5750595b908082528060200260200182016040525b5093508790505b86811015610dd2578281815181101515610d9c57fe5b9060200190602002015184898303815181101515610db657fe5b90602001906020020181815250505b8080600101915050610d86565b5b505050949350505050565b610de6611649565b610dee611649565b600080600380549050604051805910610e045750595b908082528060200260200182016040525b50925060009150600090505b600380549050811015610f6757600160008681526020019081526020016000206000600383815481101515610e5257fe5b906000526020600020900160005b9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610f5957600381815481101515610edb57fe5b906000526020600020900160005b9054906101000a900473ffffffffffffffffffffffffffffffffffffffff168383815181101515610f1657fe5b9060200190602002019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506001820191505b5b8080600101915050610e21565b81604051805910610f755750595b908082528060200260200182016040525b509350600090505b81811015611006578281815181101515610fa457fe5b906020019060200201518482815181101515610fbc57fe5b9060200190602002019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250505b8080600101915050610f8e565b5b505050919050565b60055481565b33600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151561106e57600080fd5b81600080600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515156110ca57600080fd5b82336001600083815260200190815260200160002060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615151561113657600080fd5b600180600087815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550843373ffffffffffffffffffffffffffffffffffffffff167f4a504a94899432a9846e1aa406dceb1bcfd538bb839071d49d1e5e23f5be30ef60405160405180910390a36111eb85611221565b5b5b50505b505b5050565b60006112038484846114cd565b905061120e81611015565b5b9392505050565b603281565b60045481565b600033600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151561127c57600080fd5b82336001600083815260200190815260200160002060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615156112e757600080fd5b8460008082815260200190815260200160002060030160009054906101000a900460ff1615151561131757600080fd5b611320866109d5565b156114c157600080878152602001908152602001600020945060018560030160006101000a81548160ff02191690831515021790555061143e8560000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16866001015487600201805460018160011615610100020316600290049050886002018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156114345780601f1061140957610100808354040283529160200191611434565b820191906000526020600020905b81548152906001019060200180831161141757829003601f168201915b5050505050611621565b1561147557857f33e13ecb54c3076d8e8bb8c2881800a4d972b792045ffae98fdf46df365fed7560405160405180910390a26114c0565b857f526441bb6c1aba3c9a4a6ca1d6545da9c2333c8c48343ef398eb858d72b7923660405160405180910390a260008560030160006101000a81548160ff0219169083151502179055505b5b5b5b505b50505b505050565b60008360008173ffffffffffffffffffffffffffffffffffffffff16141515156114f657600080fd5b60055491506080604051908101604052808673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018481526020016000151581525060008084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015560408201518160020190805190602001906115b5929190611671565b5060608201518160030160006101000a81548160ff0219169083151502179055509050506001600560008282540192505081905550817fc0ba8fe4b176c1714197d43b9cc6bcf797a4a7461c5fe8d0ef6e184ae7601e5160405160405180910390a25b5b509392505050565b6000806040516020840160008287838a8c6187965a03f1925050508091505b50949350505050565b602060405190810160405280600081525090565b602060405190810160405280600081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106116b257805160ff19168380011785556116e0565b828001600101855582156116e0579182015b828111156116df5782518255916020019190600101906116c4565b5b5090506116ed91906116f1565b5090565b61171391905b8082111561170f5760008160009055506001016116f7565b5090565b905600a165627a7a723058207ecbafd6183e722de22a1e98c8837e4f65463caa34ff6e49a0b07508331e49090029

Verified Source Code Partial Match

Compiler: v0.4.15+commit.8b45bddb Optimization: No
MultiSigWallet.sol 329 lines
// SPDX-License-Identifier: LGPL-3.0
// Modified from https://github.com/gnosis/MultiSigWallet/blob/master/contracts/MultiSigWallet.sol
pragma solidity ^0.4.15;

/// @title Multisignature wallet - Allows multiple parties to agree on transactions before execution.
/// @author Stefan George - <[email protected]>
contract MultiSigWallet {

    /*
     *  Events
     */
    event Confirmation(address indexed sender, uint indexed transactionId);
    event Revocation(address indexed sender, uint indexed transactionId);
    event Submission(uint indexed transactionId);
    event Execution(uint indexed transactionId);
    event ExecutionFailure(uint indexed transactionId);
    event Deposit(address indexed sender, uint value);
    event OwnerAddition(address indexed owner);
    event OwnerRemoval(address indexed owner);
    event RequirementChange(uint required);

    /*
     *  Constants
     */
    uint constant public MAX_OWNER_COUNT = 50;

    /*
     *  Storage
     */
    mapping (uint => Transaction) public transactions;
    mapping (uint => mapping (address => bool)) public confirmations;
    mapping (address => bool) public isOwner;
    address[] public owners;
    uint public required;
    uint public transactionCount;

    struct Transaction {
        address destination;
        uint value;
        bytes data;
        bool executed;
    }

    /*
     *  Modifiers
     */
    modifier onlyWallet() {
        require(msg.sender == address(this));
        _;
    }

    modifier ownerDoesNotExist(address owner) {
        require(!isOwner[owner]);
        _;
    }

    modifier ownerExists(address owner) {
        require(isOwner[owner]);
        _;
    }

    modifier transactionExists(uint transactionId) {
        require(transactions[transactionId].destination != 0);
        _;
    }

    modifier confirmed(uint transactionId, address owner) {
        require(confirmations[transactionId][owner]);
        _;
    }

    modifier notConfirmed(uint transactionId, address owner) {
        require(!confirmations[transactionId][owner]);
        _;
    }

    modifier notExecuted(uint transactionId) {
        require(!transactions[transactionId].executed);
        _;
    }

    modifier notNull(address _address) {
        require(_address != 0);
        _;
    }

    modifier validRequirement(uint ownerCount, uint _required) {
        require(ownerCount <= MAX_OWNER_COUNT
            && _required <= ownerCount
            && _required != 0
            && ownerCount != 0);
        _;
    }

    /// @dev Fallback function allows to deposit ether.
    function()
        payable
    {
        if (msg.value > 0)
            Deposit(msg.sender, msg.value);
    }

    /*
     * Public functions
     */
    /// @dev Contract constructor sets initial owners and required number of confirmations.
    /// @param _owners List of initial owners.
    /// @param _required Number of required confirmations.
    function MultiSigWallet(address[] _owners, uint _required)
        public
        validRequirement(_owners.length, _required)
    {
        for (uint i=0; i<_owners.length; i++) {
            require(!isOwner[_owners[i]] && _owners[i] != 0);
            isOwner[_owners[i]] = true;
        }
        owners = _owners;
        required = _required;
    }

    /// @dev Allows an owner to submit and confirm a transaction.
    /// @param destination Transaction target address.
    /// @param value Transaction ether value.
    /// @param data Transaction data payload.
    /// @return Returns transaction ID.
    function submitTransaction(address destination, uint value, bytes data)
        public
        returns (uint transactionId)
    {
        transactionId = addTransaction(destination, value, data);
        confirmTransaction(transactionId);
    }

    /// @dev Allows an owner to confirm a transaction.
    /// @param transactionId Transaction ID.
    function confirmTransaction(uint transactionId)
        public
        ownerExists(msg.sender)
        transactionExists(transactionId)
        notConfirmed(transactionId, msg.sender)
    {
        confirmations[transactionId][msg.sender] = true;
        Confirmation(msg.sender, transactionId);
        executeTransaction(transactionId);
    }

    /// @dev Allows an owner to revoke a confirmation for a transaction.
    /// @param transactionId Transaction ID.
    function revokeConfirmation(uint transactionId)
        public
        ownerExists(msg.sender)
        confirmed(transactionId, msg.sender)
        notExecuted(transactionId)
    {
        confirmations[transactionId][msg.sender] = false;
        Revocation(msg.sender, transactionId);
    }

    /// @dev Allows anyone to execute a confirmed transaction.
    /// @param transactionId Transaction ID.
    function executeTransaction(uint transactionId)
        public
        ownerExists(msg.sender)
        confirmed(transactionId, msg.sender)
        notExecuted(transactionId)
    {
        if (isConfirmed(transactionId)) {
            Transaction storage txn = transactions[transactionId];
            txn.executed = true;
            if (external_call(txn.destination, txn.value, txn.data.length, txn.data))
                Execution(transactionId);
            else {
                ExecutionFailure(transactionId);
                txn.executed = false;
            }
        }
    }

    // call has been separated into its own function in order to take advantage
    // of the Solidity's code generator to produce a loop that copies tx.data into memory.
    function external_call(address destination, uint value, uint dataLength, bytes data) internal returns (bool) {
        bool result;
        assembly {
            let x := mload(0x40)   // "Allocate" memory for output (0x40 is where "free memory" pointer is stored by convention)
            let d := add(data, 32) // First 32 bytes are the padded length of data, so exclude that
            result := call(
                sub(gas, 34710),   // 34710 is the value that solidity is currently emitting
                                   // It includes callGas (700) + callVeryLow (3, to pay for SUB) + callValueTransferGas (9000) +
                                   // callNewAccountGas (25000, in case the destination address does not exist and needs creating)
                destination,
                value,
                d,
                dataLength,        // Size of the input (in bytes) - this is what fixes the padding problem
                x,
                0                  // Output is ignored, therefore the output size is zero
            )
        }
        return result;
    }

    /// @dev Returns the confirmation status of a transaction.
    /// @param transactionId Transaction ID.
    /// @return Confirmation status.
    function isConfirmed(uint transactionId)
        public
        constant
        returns (bool)
    {
        uint count = 0;
        for (uint i=0; i<owners.length; i++) {
            if (confirmations[transactionId][owners[i]])
                count += 1;
            if (count == required)
                return true;
        }
    }

    /*
     * Internal functions
     */
    /// @dev Adds a new transaction to the transaction mapping, if transaction does not exist yet.
    /// @param destination Transaction target address.
    /// @param value Transaction ether value.
    /// @param data Transaction data payload.
    /// @return Returns transaction ID.
    function addTransaction(address destination, uint value, bytes data)
        internal
        notNull(destination)
        returns (uint transactionId)
    {
        transactionId = transactionCount;
        transactions[transactionId] = Transaction({
            destination: destination,
            value: value,
            data: data,
            executed: false
        });
        transactionCount += 1;
        Submission(transactionId);
    }

    /*
     * Web3 call functions
     */
    /// @dev Returns number of confirmations of a transaction.
    /// @param transactionId Transaction ID.
    /// @return Number of confirmations.
    function getConfirmationCount(uint transactionId)
        public
        constant
        returns (uint count)
    {
        for (uint i=0; i<owners.length; i++)
            if (confirmations[transactionId][owners[i]])
                count += 1;
    }

    /// @dev Returns total number of transactions after filers are applied.
    /// @param pending Include pending transactions.
    /// @param executed Include executed transactions.
    /// @return Total number of transactions after filters are applied.
    function getTransactionCount(bool pending, bool executed)
        public
        constant
        returns (uint count)
    {
        for (uint i=0; i<transactionCount; i++)
            if (   pending && !transactions[i].executed
                || executed && transactions[i].executed)
                count += 1;
    }

    /// @dev Returns list of owners.
    /// @return List of owner addresses.
    function getOwners()
        public
        constant
        returns (address[])
    {
        return owners;
    }

    /// @dev Returns array with owner addresses, which confirmed transaction.
    /// @param transactionId Transaction ID.
    /// @return Returns array of owner addresses.
    function getConfirmations(uint transactionId)
        public
        constant
        returns (address[] _confirmations)
    {
        address[] memory confirmationsTemp = new address[](owners.length);
        uint count = 0;
        uint i;
        for (i=0; i<owners.length; i++)
            if (confirmations[transactionId][owners[i]]) {
                confirmationsTemp[count] = owners[i];
                count += 1;
            }
        _confirmations = new address[](count);
        for (i=0; i<count; i++)
            _confirmations[i] = confirmationsTemp[i];
    }

    /// @dev Returns list of transaction IDs in defined range.
    /// @param from Index start position of transaction array.
    /// @param to Index end position of transaction array.
    /// @param pending Include pending transactions.
    /// @param executed Include executed transactions.
    /// @return Returns array of transaction IDs.
    function getTransactionIds(uint from, uint to, bool pending, bool executed)
        public
        constant
        returns (uint[] _transactionIds)
    {
        uint[] memory transactionIdsTemp = new uint[](transactionCount);
        uint count = 0;
        uint i;
        for (i=0; i<transactionCount; i++)
            if (   pending && !transactions[i].executed
                || executed && transactions[i].executed)
            {
                transactionIdsTemp[count] = i;
                count += 1;
            }
        _transactionIds = new uint[](to - from);
        for (i=from; i<to; i++)
            _transactionIds[i - from] = transactionIdsTemp[i];
    }
}

Write Contract 17 functions

These functions modify contract state and require a wallet transaction to execute.

MAX_OWNER_COUNT 0xd74f8edd
No parameters
returns: uint256
confirmTransaction 0xc01a8c84
uint256 transactionId
confirmations 0x3411c81c
uint256
address
returns: bool
executeTransaction 0xee22610b
uint256 transactionId
getConfirmationCount 0x8b51d13f
uint256 transactionId
returns: uint256
getConfirmations 0xb5dc40c3
uint256 transactionId
returns: address[]
getOwners 0xa0e67e2b
No parameters
returns: address[]
getTransactionCount 0x54741525
bool pending
bool executed
returns: uint256
getTransactionIds 0xa8abe69a
uint256 from
uint256 to
bool pending
bool executed
returns: uint256[]
isConfirmed 0x784547a7
uint256 transactionId
returns: bool
isOwner 0x2f54bf6e
address
returns: bool
owners 0x025e7c27
uint256
returns: address
required 0xdc8452cd
No parameters
returns: uint256
revokeConfirmation 0x20ea8d86
uint256 transactionId
submitTransaction 0xc6427474
address destination
uint256 value
bytes data
returns: uint256
transactionCount 0xb77bf600
No parameters
returns: uint256
transactions 0x9ace38c2
uint256
returns: address, uint256, bytes, bool

Recent Transactions

No transactions found for this address