ETH Price: $3,279.47 (-1.82%)

Contract

0xC4356aF40cc379b15925Fc8C21e52c00F474e8e9
 
Transaction Hash
Method
Block
From
To
Batch Signature214623582024-12-23 2:58:353 hrs ago1734922715IN
0xC4356aF4...0F474e8e9
0 ETH0.000440624.17914067
Transfer213689442024-12-10 1:51:5913 days ago1733795519IN
0xC4356aF4...0F474e8e9
0.06256114 ETH0.0004780817.36801888
Transfer213667132024-12-09 18:23:5913 days ago1733768639IN
0xC4356aF4...0F474e8e9
0.04989774 ETH0.0007945228.86340937
Transfer213647002024-12-09 11:38:5913 days ago1733744339IN
0xC4356aF4...0F474e8e9
0.03452487 ETH0.000288510.480757
Transfer213641622024-12-09 9:50:5913 days ago1733737859IN
0xC4356aF4...0F474e8e9
0.04845603 ETH0.0002926210.63063104
Transfer213636602024-12-09 8:10:3513 days ago1733731835IN
0xC4356aF4...0F474e8e9
0.11417527 ETH0.000243198.83491267
Transfer213624562024-12-09 4:08:5914 days ago1733717339IN
0xC4356aF4...0F474e8e9
0.05245775 ETH0.0003018810.9668486
Transfer213623892024-12-09 3:55:3514 days ago1733716535IN
0xC4356aF4...0F474e8e9
0.03918484 ETH0.0002992610.87159958
Transfer213596412024-12-08 18:43:3514 days ago1733683415IN
0xC4356aF4...0F474e8e9
0.04729416 ETH0.0003272311.88791066
Transfer213594722024-12-08 18:09:3514 days ago1733681375IN
0xC4356aF4...0F474e8e9
0.03121759 ETH0.0003866614.04673148
Transfer213588392024-12-08 16:02:3514 days ago1733673755IN
0xC4356aF4...0F474e8e9
0.02933501 ETH0.0003639113.22043519
Transfer213587742024-12-08 15:49:3514 days ago1733672975IN
0xC4356aF4...0F474e8e9
0.01902873 ETH0.000320511.64319517
Transfer213579772024-12-08 13:09:3514 days ago1733663375IN
0xC4356aF4...0F474e8e9
0.06148048 ETH0.0003567412.95970919
Transfer213579212024-12-08 12:58:2314 days ago1733662703IN
0xC4356aF4...0F474e8e9
0.04317747 ETH0.000323111.73777135
Transfer213546552024-12-08 2:02:1115 days ago1733623331IN
0xC4356aF4...0F474e8e9
0.02542058 ETH0.000248119.01359449
Transfer213534102024-12-07 21:51:4715 days ago1733608307IN
0xC4356aF4...0F474e8e9
0.03386238 ETH0.0003078311.18296873
Transfer213528092024-12-07 19:50:2315 days ago1733601023IN
0xC4356aF4...0F474e8e9
0.06204278 ETH0.0003720913.51729371
Transfer213520442024-12-07 17:16:2315 days ago1733591783IN
0xC4356aF4...0F474e8e9
0.02593168 ETH0.0004137515.03083557
Transfer213485392024-12-07 5:29:5916 days ago1733549399IN
0xC4356aF4...0F474e8e9
0.02756204 ETH0.0003683913.38306192
Transfer213480592024-12-07 3:53:5916 days ago1733543639IN
0xC4356aF4...0F474e8e9
0.05319705 ETH0.0003153611.456547
Transfer213450002024-12-06 17:38:4716 days ago1733506727IN
0xC4356aF4...0F474e8e9
0.0495964 ETH0.0007558727.45946699
Transfer213432932024-12-06 11:55:5916 days ago1733486159IN
0xC4356aF4...0F474e8e9
0.02186907 ETH0.0003189611.58722957
Transfer213425252024-12-06 9:21:1116 days ago1733476871IN
0xC4356aF4...0F474e8e9
0.25941888 ETH0.0005053918.35983779
Transfer213407612024-12-06 3:26:3517 days ago1733455595IN
0xC4356aF4...0F474e8e9
0.03907023 ETH0.0004807617.46529594
Transfer213407432024-12-06 3:22:4717 days ago1733455367IN
0xC4356aF4...0F474e8e9
0.02115529 ETH0.0004669616.96385182
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block
From
To
214623582024-12-23 2:58:353 hrs ago1734922715
0xC4356aF4...0F474e8e9
26,941.41408207 ETH
213468162024-12-06 23:44:2316 days ago1733528663
0xC4356aF4...0F474e8e9
0.34050502 ETH
213136642024-12-02 8:34:4720 days ago1733128487
0xC4356aF4...0F474e8e9
0.00070811 ETH
213136642024-12-02 8:34:4720 days ago1733128487
0xC4356aF4...0F474e8e9
0.00071919 ETH
210899342024-11-01 2:53:4752 days ago1730429627
0xC4356aF4...0F474e8e9
0.02655386 ETH
210375672024-10-24 19:31:3559 days ago1729798295
0xC4356aF4...0F474e8e9
0.08672686 ETH
208424472024-09-27 14:06:1186 days ago1727445971
0xC4356aF4...0F474e8e9
0.0005 ETH
208424472024-09-27 14:06:1186 days ago1727445971
0xC4356aF4...0F474e8e9
0.001 ETH
208424472024-09-27 14:06:1186 days ago1727445971
0xC4356aF4...0F474e8e9
0.001293 ETH
207900052024-09-20 6:26:4794 days ago1726813607
0xC4356aF4...0F474e8e9
218.3262805 ETH
207475512024-09-14 8:07:2399 days ago1726301243
0xC4356aF4...0F474e8e9
0.00054453 ETH
206233462024-08-27 23:55:47117 days ago1724802947
0xC4356aF4...0F474e8e9
0.00090783 ETH
206233462024-08-27 23:55:47117 days ago1724802947
0xC4356aF4...0F474e8e9
0.00294557 ETH
206233462024-08-27 23:55:47117 days ago1724802947
0xC4356aF4...0F474e8e9
0.03310414 ETH
204547572024-08-04 11:01:11140 days ago1722769271
0xC4356aF4...0F474e8e9
0.00017155 ETH
204097622024-07-29 4:14:47147 days ago1722226487
0xC4356aF4...0F474e8e9
0.0004673 ETH
204097622024-07-29 4:14:47147 days ago1722226487
0xC4356aF4...0F474e8e9
0.00077143 ETH
203530562024-07-21 6:15:47155 days ago1721542547
0xC4356aF4...0F474e8e9
0.00002518 ETH
202509742024-07-07 0:12:11169 days ago1720311131
0xC4356aF4...0F474e8e9
0.00016834 ETH
202509742024-07-07 0:12:11169 days ago1720311131
0xC4356aF4...0F474e8e9
0.00021061 ETH
202509742024-07-07 0:12:11169 days ago1720311131
0xC4356aF4...0F474e8e9
0.00031646 ETH
202509742024-07-07 0:12:11169 days ago1720311131
0xC4356aF4...0F474e8e9
0.00051975 ETH
202509742024-07-07 0:12:11169 days ago1720311131
0xC4356aF4...0F474e8e9
0.00052426 ETH
202509742024-07-07 0:12:11169 days ago1720311131
0xC4356aF4...0F474e8e9
0.00061795 ETH
202509742024-07-07 0:12:11169 days ago1720311131
0xC4356aF4...0F474e8e9
0.00138036 ETH
View All Internal Transactions
Loading...
Loading

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

Contract Name:
MultiSigWalletProxy

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 1 of 4: MultiSigWalletProxy.sol
// SPDX-License-Identifier: Unlicense
pragma solidity ^0.8.0;

contract MultiSigWalletProxy {
    address public implementation;

    constructor(address _implementation, bytes memory _data) {
        implementation = _implementation;
        if(_data.length > 0) {
            (bool success,) = _implementation.delegatecall(_data);
            require(success, "MultiSigWalletProxy: Initialization failed");
        }
    }

    fallback() external payable {
        _delegate(implementation);
    }

    receive() external payable {
        _delegate(implementation);
    }

    function _delegate(address _implementation) internal {
        assembly {
            calldatacopy(0, 0, calldatasize())
            let result := delegatecall(gas(), _implementation, 0, calldatasize(), 0, 0)
            returndatacopy(0, 0, returndatasize())
            switch result
            case 0 { 
                revert(0, returndatasize()) 
            } default { 
                return(0, returndatasize())
            }
        }
    }
}

File 2 of 4: MultiSigWalletFactory.sol
// SPDX-License-Identifier: Unlicense
pragma solidity ^0.8.0;

import "./MultiSigWalletProxy.sol";
import "./MultiSigWalletImplementation.sol";

contract MultiSigWalletFactory {

    event NewMultiSigWalletCreated(address wallet);

    function createMultiSigWallet(
        address _implementation,
        address[] memory owners,
        uint required,
        uint256 nonce
    ) public payable returns (address payable) {
        bytes32 salt = keccak256(abi.encodePacked(nonce, owners, required));
        bytes memory initCode = abi.encodePacked(
            type(MultiSigWalletProxy).creationCode,
            abi.encode(address(_implementation), abi.encodeWithSignature("initialize(address[],uint256)", owners, required))
        );

        address payable wallet;
        assembly {
            wallet := create2(0, add(initCode, 0x20), mload(initCode), salt)
            if iszero(extcodesize(wallet)) {
                revert(0, 0)
            }
        }

        emit NewMultiSigWalletCreated(wallet);

        return wallet;
    }
    
    function calculateMultiSigWalletAddress(
        address _implementation,
        address[] memory owners,
        uint required,
        uint256 nonce
    ) public view returns (address wallet) {
        bytes32 salt = keccak256(abi.encodePacked(nonce, owners, required));
        bytes memory initCode = abi.encodePacked(
            type(MultiSigWalletProxy).creationCode,
            abi.encode(address(_implementation), abi.encodeWithSignature("initialize(address[],uint256)", owners, required))
        );
        bytes32 hash = keccak256(abi.encodePacked(
            bytes1(0xff),
            address(this),
            salt,
            keccak256(initCode)
        ));

        return address(uint160(uint(hash)));
    }

    function createMultiSigWalletWithTransaction(
        address _implementation,
        address[] memory owners,
        uint required,
        uint256 nonce,
        MultiSigWalletImplementation.Transaction memory transaction,
        MultiSigWalletImplementation.Signature[] memory signatures
    ) public payable returns (address payable, bool) {
        address payable wallet = createMultiSigWallet(_implementation, owners, required, nonce);
        bool isOk = MultiSigWalletImplementation(wallet).batchSignature(transaction, signatures);
        return (wallet, isOk);
    }
}

File 3 of 4: MultiSigWalletImplementation.sol
// SPDX-License-Identifier: Unlicense
pragma solidity ^0.8.0;

/// @title Multisignature wallet - Allows multiple parties to agree on transactions before execution.
/// @author Stefan George - <[email protected]>
contract MultiSigWalletImplementation {
    /*
     *  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 public constant MAX_OWNER_COUNT = 50;

    /*
     *  Storage
     */
    mapping(uint => Transaction) public transactions;
    mapping(uint => mapping(address => bool)) public confirmations;
    mapping(address => bool) public isOwner;
    mapping(bytes32 => bool) public txNonces;

    address[] public owners;
    uint public required;
    uint public transactionCount;

    bytes32 public DOMAIN_SEPARATOR;
    bytes32 constant EIP712DOMAIN_TYPEHASH = keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)");
    bytes32 internal constant TRANSACTION_TYPEHASH = keccak256("Transaction(uint nonce,address destination,uint value,bytes data)");

    bool initialized;

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

    struct Signature {
        address signer;
        uint8 v;
        bytes32 r;
        bytes32 s;
    }

    /*
     *  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 != address(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 != address(0));
        _;
    }

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

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

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

    /*
     * Public functions
     */
    /// @dev Contract constructor sets initial owners and required number of confirmations.
    constructor() {}

    function initialize(
        address[] memory _owners,
        uint _required
    ) validRequirement(_owners.length, _required) public {
        require(!initialized, "already initialized");

        DOMAIN_SEPARATOR = keccak256(
            abi.encode(
                EIP712DOMAIN_TYPEHASH,
                keccak256("MultiSigWallet"), // name
                keccak256("2"), // version
                block.chainid,
                address(this)
            )
        );

        for (uint i = 0; i < _owners.length; i++) {
            require(!isOwner[_owners[i]] && _owners[i] != address(0));
            isOwner[_owners[i]] = true;
        }
        owners = _owners;
        required = _required;

        initialized = true;
    }
    

    /// @dev Allows to add a new owner. Transaction has to be sent by wallet.
    /// @param owner Address of new owner.
    function addOwner(
        address owner
    )
        public
        onlyWallet
        ownerDoesNotExist(owner)
        notNull(owner)
        validRequirement(owners.length + 1, required)
    {
        isOwner[owner] = true;
        owners.push(owner);
        emit OwnerAddition(owner);
    }

    /// @dev Allows to remove an owner. Transaction has to be sent by wallet.
    /// @param owner Address of owner.
    function removeOwner(address owner) public onlyWallet ownerExists(owner) {
        isOwner[owner] = false;
        for (uint i = 0; i < owners.length - 1; i++)
            if (owners[i] == owner) {
                owners[i] = owners[owners.length - 1];
                delete owners[i];
                break;
            }
        if (required > owners.length) changeRequirement(owners.length);
        emit OwnerRemoval(owner);
    }

    /// @dev Allows to replace an owner with a new owner. Transaction has to be sent by wallet.
    /// @param owner Address of owner to be replaced.
    /// @param newOwner Address of new owner.
    function replaceOwner(
        address owner,
        address newOwner
    ) public onlyWallet ownerExists(owner) ownerDoesNotExist(newOwner) {
        for (uint i = 0; i < owners.length; i++)
            if (owners[i] == owner) {
                owners[i] = newOwner;
                break;
            }
        isOwner[owner] = false;
        isOwner[newOwner] = true;
        emit OwnerRemoval(owner);
        emit OwnerAddition(newOwner);
    }

    /// @dev Allows to change the number of required confirmations. Transaction has to be sent by wallet.
    /// @param _required Number of required confirmations.
    function changeRequirement(
        uint _required
    ) public onlyWallet validRequirement(owners.length, _required) {
        required = _required;
        emit RequirementChange(_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 transactionId Returns transaction ID.
    function submitTransaction(
        address destination,
        uint value,
        bytes memory 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;
        emit 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;
        emit 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)
    {
        _executeTransaction(transactionId);
    }

    function _executeTransaction(
        uint transactionId
    ) internal 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
                )
            ) emit Execution(transactionId);
            else {
                emit 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 memory 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 status Confirmation status.
    function isConfirmed(uint transactionId) public view returns (bool status) {
        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 transactionId Returns transaction ID.
    function addTransaction(
        address destination,
        uint value,
        bytes memory data
    ) internal notNull(destination) returns (uint transactionId) {
        if(transactions[transactionId].destination == address(0)) {
            transactionId = transactionCount;
            transactions[transactionId] = Transaction({
                nonce: transactionId,
                destination: destination,
                value: value,
                data: data,
                executed: false
            });
            transactionCount += 1;
            
            emit Submission(transactionId);
        } else {
            revert("transactionId already exist");
        }
    }

    /*
     * Web3 call functions
     */
    /// @dev Returns number of confirmations of a transaction.
    /// @param transactionId Transaction ID.
    /// @return count Number of confirmations.
    function getConfirmationCount(
        uint transactionId
    ) public view 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 count Total number of transactions after filters are applied.
    function getTransactionCount(
        bool pending,
        bool executed
    ) public view 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 view returns (address[] memory) {
        return owners;
    }

    /// @dev Returns array with owner addresses, which confirmed transaction.
    /// @param transactionId Transaction ID.
    /// @return _confirmations Returns array of owner addresses.
    function getConfirmations(
        uint transactionId
    ) public view returns (address[] memory _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 _transactionIds Returns array of transaction IDs.
    function getTransactionIds(
        uint from,
        uint to,
        bool pending,
        bool executed
    ) public view returns (uint[] memory _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];
    }

    function hashTransaction(
        Transaction memory transaction
    ) public pure returns (bytes32) {
        return
            keccak256(
                abi.encode(
                    TRANSACTION_TYPEHASH,
                    transaction.nonce,
                    transaction.destination,
                    transaction.value,
                    keccak256(bytes(transaction.data))
                )
            );
    }

    function getTransactionMessage(
        Transaction memory transaction
    ) public view returns (bytes32) {
        bytes32 digest = keccak256(
            abi.encodePacked(
                "\x19\x01",
                DOMAIN_SEPARATOR,
                hashTransaction(transaction)
            )
        );
        return digest;
    }

    function batchSignature(Transaction memory txn, Signature[] memory sortedSignatures) public returns (bool isOK) {
        require(sortedSignatures.length >= required, "invalid signature data length");

        bytes32 digest = keccak256(
            abi.encodePacked(
                "\x19\x01",
                DOMAIN_SEPARATOR,
                hashTransaction(txn)
            )
        );
        require(!txNonces[digest], "tx-executed");

        uint256 txId = txn.nonce;
        address lastOwner = address(0);
        for(uint i = 0; i < sortedSignatures.length; i++) {
            Signature memory signature = sortedSignatures[i];
            address signer = signature.signer;
            uint8 v = signature.v;
            bytes32 r = signature.r;
            bytes32 s = signature.s;

            address currentOwner = ecrecover(digest, v, r, s);

            // to save gas, must need signature.signer sorted
            require(currentOwner > lastOwner && isOwner[currentOwner] && signer == currentOwner, "error-sig");
            lastOwner = currentOwner;
            emit Confirmation(signer, txId);
        }

        txn.executed = true;
        txNonces[digest] = true;
        if (external_call(txn.destination, txn.value, txn.data.length, txn.data)) {
            emit Execution(txId);
        } else {
            emit ExecutionFailure(txId);
            txn.executed = false;
        }

        return txn.executed;
    }

    struct Call {
        address target;
        uint value;
        bytes data;
    }

    function multiCall(
        Call[] memory calls
    ) public onlyWallet {
        for (uint i = 0; i < calls.length; i++) {
            if (external_call(
                calls[i].target,
                calls[i].value,
                calls[i].data.length,
                calls[i].data
            )) {}
            else {
                revert("internal call failed");
            }
        }
    }
}

File 4 of 4: MultiSigWalletImplementationBeacon.sol
// SPDX-License-Identifier: Unlicense
pragma solidity ^0.8.0;

import "./MultiSigWalletImplementation.sol";


contract MultiSigWalletImplementationBeacon {

    event MultiSigWalletImplementationDeployed(address indexed implementation);

    constructor() {
        MultiSigWalletImplementation implementation = new MultiSigWalletImplementation();

        address[] memory owners = new address[](1);
        owners[0] = msg.sender;

        implementation.initialize(owners, 1);
        
        emit MultiSigWalletImplementationDeployed(address(implementation));
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_implementation","type":"address"},{"internalType":"bytes","name":"_data","type":"bytes"}],"stateMutability":"nonpayable","type":"constructor"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"implementation","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

Deployed Bytecode

0x6080604052600436106100225760003560e01c80635c60da1b1461007d57610052565b366100525761005060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff166100a8565b005b61007b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff166100a8565b005b34801561008957600080fd5b506100926100ce565b60405161009f9190610133565b60405180910390f35b3660008037600080366000845af43d6000803e80600081146100c9573d6000f35b3d6000fd5b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061011d826100f2565b9050919050565b61012d81610112565b82525050565b60006020820190506101486000830184610124565b9291505056fea26469706673582212209ddd38ba0d1790de3f61b13242414d0a219eeb1743a9f9d028636e2b2243263564736f6c63430008110033

Deployed Bytecode Sourcemap

63:971:3:-:0;;;;;;;;;;;;;;;;;;;;;;;543:25;553:14;;;;;;;;;;543:9;:25::i;:::-;63:971;;468:25;478:14;;;;;;;;;;468:9;:25::i;:::-;63:971;98:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;581:451;686:14;683:1;680;667:34;787:1;784;768:14;765:1;748:15;741:5;728:61;823:16;820:1;817;802:38;860:6;884:1;879:68;;;;985:16;982:1;975:27;879:68;915:16;912:1;905:27;98:29;;;;;;;;;;;;:::o;7:126:4:-;44:7;84:42;77:5;73:54;62:65;;7:126;;;:::o;139:96::-;176:7;205:24;223:5;205:24;:::i;:::-;194:35;;139:96;;;:::o;241:118::-;328:24;346:5;328:24;:::i;:::-;323:3;316:37;241:118;;:::o;365:222::-;458:4;496:2;485:9;481:18;473:26;;509:71;577:1;566:9;562:17;553:6;509:71;:::i;:::-;365:222;;;;:::o

Swarm Source

ipfs://9ddd38ba0d1790de3f61b13242414d0a219eeb1743a9f9d028636e2b22432635

 Latest 25 blocks (From a total of 976 blocks with 32.57 Ether produced)

Block Transaction Difficulty Gas Used Reward
213136642024-12-02 8:34:4720 days ago17331284872040.00 TH17,820,476 (59.40%)
0.0514367217617651 ETH
212357112024-11-21 11:09:2331 days ago17321873631760.00 TH8,775,560 (29.25%)
0.010986391522638824 ETH
209129292024-10-07 9:56:5976 days ago17282950191570.00 TH14,947,388 (49.82%)
0.0370270547400198 ETH
208865532024-10-03 17:44:1180 days ago17279774511460.00 TH12,414,948 (41.38%)
0.03955634793862256 ETH
208424472024-09-27 14:06:1186 days ago17274459712430.00 TH17,170,032 (57.23%)
0.051766914850576809 ETH
207475512024-09-14 8:07:2399 days ago1726301243940.00 TH7,526,961 (25.09%)
0.020397300135300881 ETH
206456072024-08-31 2:36:11114 days ago17250717711400.00 TH27,812,959 (92.71%)
0.022428001680251089 ETH
206233462024-08-27 23:55:47117 days ago17248029471250.00 TH18,429,194 (61.43%)
0.012203802977751257 ETH
204547572024-08-04 11:01:11140 days ago17227692711480.00 TH14,393,901 (47.98%)
0.019694405253263953 ETH
204097622024-07-29 4:14:47147 days ago1722226487790.00 TH9,918,318 (33.06%)
0.043661408970923456 ETH
203802312024-07-25 1:19:23151 days ago17218703631050.00 TH7,825,758 (26.09%)
0.009699518350970845 ETH
203732232024-07-24 1:50:11152 days ago17217858111070.00 TH9,839,654 (32.80%)
0.010803122793310782 ETH
203530562024-07-21 6:15:47155 days ago17215425471650.00 TH15,002,689 (50.01%)
0.016154832816506885 ETH
203316442024-07-18 6:33:35158 days ago17212844151130.00 TH9,314,039 (31.05%)
0.00709477437598079 ETH
203293182024-07-17 22:45:23158 days ago1721256323700.00 TH4,768,664 (15.90%)
0.008553549717187723 ETH
203223202024-07-16 23:19:59159 days ago1721171999730.00 TH3,468,349 (11.56%)
0.004787419831971932 ETH
202790292024-07-10 22:16:59165 days ago1720649819850.00 TH21,910,812 (73.04%)
0.009557539127148345 ETH
202745602024-07-10 7:19:23165 days ago1720595963870.00 TH5,763,318 (19.21%)
0.010894774764366455 ETH
202728432024-07-10 1:34:35166 days ago1720575275480.00 TH3,876,265 (12.92%)
0.004880507505278269 ETH
202674802024-07-09 7:34:47166 days ago17205104871190.00 TH8,279,696 (27.60%)
0.008160588423520559 ETH
202589292024-07-08 2:51:59168 days ago17204071191180.00 TH7,142,566 (23.81%)
0.004391512797392332 ETH
202543802024-07-07 11:37:11168 days ago17203522311080.00 TH7,667,669 (25.56%)
0.007353407765551607 ETH
202519812024-07-07 3:34:47169 days ago17203232871220.00 TH29,783,857 (99.28%)
0.005835060179786642 ETH
202509742024-07-07 0:12:11169 days ago17203111311810.00 TH19,278,693 (64.26%)
0.093021864030321769 ETH
202247502024-07-03 8:19:59172 days ago17199947991500.00 TH11,835,992 (39.45%)
0.024325177232358701 ETH
View All Blocks Produced

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

Latest 25 from a total of 121870 withdrawals (102,479.04240461 ETH withdrawn)

Validator Index Block Amount
841620214055172024-12-15 4:24:598 days ago173423669932.010115544 ETH
841619214055172024-12-15 4:24:598 days ago173423669932.010074815 ETH
841618214055172024-12-15 4:24:598 days ago173423669932.056220101 ETH
841617214055172024-12-15 4:24:598 days ago173423669932.010111516 ETH
841616214055172024-12-15 4:24:598 days ago173423669932.010091074 ETH
841615214055172024-12-15 4:24:598 days ago173423669932.01008217 ETH
841614214055172024-12-15 4:24:598 days ago173423669932.010117669 ETH
841613214055172024-12-15 4:24:598 days ago173423669932.01012347 ETH
841612214055172024-12-15 4:24:598 days ago173423669932.010059194 ETH
841611214055172024-12-15 4:24:598 days ago173423669932.010118033 ETH
841610214055172024-12-15 4:24:598 days ago173423669932.01008409 ETH
841609214055172024-12-15 4:24:598 days ago173423669932.010083734 ETH
841608214055172024-12-15 4:24:598 days ago173423669932.01009726 ETH
841607214055172024-12-15 4:24:598 days ago173423669932.010139109 ETH
841606214055162024-12-15 4:24:478 days ago173423668732.010109168 ETH
841605214055162024-12-15 4:24:478 days ago173423668732.010048961 ETH
841604214055162024-12-15 4:24:478 days ago173423668732.010035421 ETH
841603214055162024-12-15 4:24:478 days ago173423668732.010086379 ETH
841602214055162024-12-15 4:24:478 days ago173423668732.01008052 ETH
841601214055162024-12-15 4:24:478 days ago173423668732.010057062 ETH
841600214055162024-12-15 4:24:478 days ago173423668732.01006276 ETH
841599214055162024-12-15 4:24:478 days ago173423668732.010098836 ETH
841598214055162024-12-15 4:24:478 days ago173423668732.010042886 ETH
841597214055162024-12-15 4:24:478 days ago173423668732.010069544 ETH
841596214055162024-12-15 4:24:478 days ago173423668732.010040675 ETH
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]
[ 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.