ETH Price: $3,119.24 (+0.69%)

Contract

0xC4356aF40cc379b15925Fc8C21e52c00F474e8e9
 
Transaction Hash
Method
Block
From
To
Transfer212163962024-11-18 18:28:231 hr ago1731954503IN
0xC4356aF4...0F474e8e9
0.05720429 ETH0.0006157522.36909262
Transfer212152732024-11-18 14:42:594 hrs ago1731940979IN
0xC4356aF4...0F474e8e9
0.05391584 ETH0.000383513.93208933
Transfer212151012024-11-18 14:07:595 hrs ago1731938879IN
0xC4356aF4...0F474e8e9
0.03359832 ETH0.0004480416.27670918
Transfer212145832024-11-18 12:24:117 hrs ago1731932651IN
0xC4356aF4...0F474e8e9
0.04606077 ETH0.0002923410.62036715
Transfer212133332024-11-18 8:13:2311 hrs ago1731917603IN
0xC4356aF4...0F474e8e9
0.05301722 ETH0.0003081711.19532101
Transfer212117782024-11-18 3:01:2316 hrs ago1731898883IN
0xC4356aF4...0F474e8e9
0.08028513 ETH0.000264499.60857275
Transfer212111702024-11-18 0:59:1118 hrs ago1731891551IN
0xC4356aF4...0F474e8e9
0.04452175 ETH0.000203897.40695152
Transfer212102262024-11-17 21:50:2321 hrs ago1731880223IN
0xC4356aF4...0F474e8e9
0.20273994 ETH0.000260929.47885008
Transfer212083372024-11-17 15:30:5927 hrs ago1731857459IN
0xC4356aF4...0F474e8e9
0.04323496 ETH0.000258679.39728885
Transfer212080622024-11-17 14:35:5928 hrs ago1731854159IN
0xC4356aF4...0F474e8e9
0.04668857 ETH0.0003020710.97371599
Transfer212064502024-11-17 9:12:2334 hrs ago1731834743IN
0xC4356aF4...0F474e8e9
0.03431253 ETH0.000259489.42660463
Transfer212051032024-11-17 4:41:1138 hrs ago1731818471IN
0xC4356aF4...0F474e8e9
0.08551449 ETH0.000274019.95430349
Transfer212019932024-11-16 18:16:472 days ago1731781007IN
0xC4356aF4...0F474e8e9
0.1265316 ETH0.0003415612.40839962
Transfer211976722024-11-16 3:49:112 days ago1731728951IN
0xC4356aF4...0F474e8e9
0.0539289 ETH0.0003983114.47001575
Transfer211972522024-11-16 2:25:112 days ago1731723911IN
0xC4356aF4...0F474e8e9
0.04958829 ETH0.0003735813.57152279
Transfer211972512024-11-16 2:24:592 days ago1731723899IN
0xC4356aF4...0F474e8e9
0.03545772 ETH0.0003769413.69357959
Transfer211956212024-11-15 20:57:232 days ago1731704243IN
0xC4356aF4...0F474e8e9
0.17578704 ETH0.0006621124.05340233
Transfer211954862024-11-15 20:30:112 days ago1731702611IN
0xC4356aF4...0F474e8e9
0.19739574 ETH0.0006198222.51687431
Transfer211954282024-11-15 20:18:232 days ago1731701903IN
0xC4356aF4...0F474e8e9
0.05534085 ETH0.0007327526.61943895
Transfer211940852024-11-15 15:47:353 days ago1731685655IN
0xC4356aF4...0F474e8e9
0.10053465 ETH0.0006937625.20312285
Transfer211909782024-11-15 5:22:353 days ago1731648155IN
0xC4356aF4...0F474e8e9
0.09093871 ETH0.0004132615.01310738
Transfer211897062024-11-15 1:07:233 days ago1731632843IN
0xC4356aF4...0F474e8e9
0.03660116 ETH0.0004732817.19335286
Transfer211824432024-11-14 0:46:354 days ago1731545195IN
0xC4356aF4...0F474e8e9
0.03367223 ETH0.0007636127.74065469
Transfer211820912024-11-13 23:35:354 days ago1731540935IN
0xC4356aF4...0F474e8e9
0.14980486 ETH0.0007211626.19856798
Transfer211814582024-11-13 21:28:234 days ago1731533303IN
0xC4356aF4...0F474e8e9
0.20280131 ETH0.0017214862.53816436
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To
210899342024-11-01 2:53:4717 days ago1730429627
0xC4356aF4...0F474e8e9
0.02655386 ETH
210375672024-10-24 19:31:3524 days ago1729798295
0xC4356aF4...0F474e8e9
0.08672686 ETH
208424472024-09-27 14:06:1152 days ago1727445971
0xC4356aF4...0F474e8e9
0.0005 ETH
208424472024-09-27 14:06:1152 days ago1727445971
0xC4356aF4...0F474e8e9
0.001 ETH
208424472024-09-27 14:06:1152 days ago1727445971
0xC4356aF4...0F474e8e9
0.001293 ETH
207900052024-09-20 6:26:4759 days ago1726813607
0xC4356aF4...0F474e8e9
218.3262805 ETH
207475512024-09-14 8:07:2365 days ago1726301243
0xC4356aF4...0F474e8e9
0.00054453 ETH
206233462024-08-27 23:55:4782 days ago1724802947
0xC4356aF4...0F474e8e9
0.00090783 ETH
206233462024-08-27 23:55:4782 days ago1724802947
0xC4356aF4...0F474e8e9
0.00294557 ETH
206233462024-08-27 23:55:4782 days ago1724802947
0xC4356aF4...0F474e8e9
0.03310414 ETH
204547572024-08-04 11:01:11106 days ago1722769271
0xC4356aF4...0F474e8e9
0.00017155 ETH
204097622024-07-29 4:14:47112 days ago1722226487
0xC4356aF4...0F474e8e9
0.0004673 ETH
204097622024-07-29 4:14:47112 days ago1722226487
0xC4356aF4...0F474e8e9
0.00077143 ETH
203530562024-07-21 6:15:47120 days ago1721542547
0xC4356aF4...0F474e8e9
0.00002518 ETH
202509742024-07-07 0:12:11134 days ago1720311131
0xC4356aF4...0F474e8e9
0.00016834 ETH
202509742024-07-07 0:12:11134 days ago1720311131
0xC4356aF4...0F474e8e9
0.00021061 ETH
202509742024-07-07 0:12:11134 days ago1720311131
0xC4356aF4...0F474e8e9
0.00031646 ETH
202509742024-07-07 0:12:11134 days ago1720311131
0xC4356aF4...0F474e8e9
0.00051975 ETH
202509742024-07-07 0:12:11134 days ago1720311131
0xC4356aF4...0F474e8e9
0.00052426 ETH
202509742024-07-07 0:12:11134 days ago1720311131
0xC4356aF4...0F474e8e9
0.00061795 ETH
202509742024-07-07 0:12:11134 days ago1720311131
0xC4356aF4...0F474e8e9
0.00138036 ETH
202100912024-07-01 7:10:47140 days ago1719817847
0xC4356aF4...0F474e8e9
29.28557632 ETH
201301392024-06-20 3:03:23151 days ago1718852603
0xC4356aF4...0F474e8e9
1,322 ETH
201102152024-06-17 8:08:11154 days ago1718611691
0xC4356aF4...0F474e8e9
2,816 ETH
201102122024-06-17 8:07:35154 days ago1718611655
0xC4356aF4...0F474e8e9
1,408 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 974 blocks with 32.50 Ether produced)

Block Transaction Difficulty Gas Used Reward
209129292024-10-07 9:56:5942 days ago17282950191570.00 TH14,947,388 (49.82%)
0.0370270547400198 ETH
208865532024-10-03 17:44:1146 days ago17279774511460.00 TH12,414,948 (41.38%)
0.03955634793862256 ETH
208424472024-09-27 14:06:1152 days ago17274459712430.00 TH17,170,032 (57.23%)
0.051766914850576809 ETH
207475512024-09-14 8:07:2365 days ago1726301243940.00 TH7,526,961 (25.09%)
0.020397300135300881 ETH
206456072024-08-31 2:36:1179 days ago17250717711400.00 TH27,812,959 (92.71%)
0.022428001680251089 ETH
206233462024-08-27 23:55:4782 days ago17248029471250.00 TH18,429,194 (61.43%)
0.012203802977751257 ETH
204547572024-08-04 11:01:11106 days ago17227692711480.00 TH14,393,901 (47.98%)
0.019694405253263953 ETH
204097622024-07-29 4:14:47112 days ago1722226487790.00 TH9,918,318 (33.06%)
0.043661408970923456 ETH
203802312024-07-25 1:19:23116 days ago17218703631050.00 TH7,825,758 (26.09%)
0.009699518350970845 ETH
203732232024-07-24 1:50:11117 days ago17217858111070.00 TH9,839,654 (32.80%)
0.010803122793310782 ETH
203530562024-07-21 6:15:47120 days ago17215425471650.00 TH15,002,689 (50.01%)
0.016154832816506885 ETH
203316442024-07-18 6:33:35123 days ago17212844151130.00 TH9,314,039 (31.05%)
0.00709477437598079 ETH
203293182024-07-17 22:45:23123 days ago1721256323700.00 TH4,768,664 (15.90%)
0.008553549717187723 ETH
203223202024-07-16 23:19:59124 days ago1721171999730.00 TH3,468,349 (11.56%)
0.004787419831971932 ETH
202790292024-07-10 22:16:59130 days ago1720649819850.00 TH21,910,812 (73.04%)
0.009557539127148345 ETH
202745602024-07-10 7:19:23131 days ago1720595963870.00 TH5,763,318 (19.21%)
0.010894774764366455 ETH
202728432024-07-10 1:34:35131 days ago1720575275480.00 TH3,876,265 (12.92%)
0.004880507505278269 ETH
202674802024-07-09 7:34:47132 days ago17205104871190.00 TH8,279,696 (27.60%)
0.008160588423520559 ETH
202589292024-07-08 2:51:59133 days ago17204071191180.00 TH7,142,566 (23.81%)
0.004391512797392332 ETH
202543802024-07-07 11:37:11134 days ago17203522311080.00 TH7,667,669 (25.56%)
0.007353407765551607 ETH
202519812024-07-07 3:34:47134 days ago17203232871220.00 TH29,783,857 (99.28%)
0.005835060179786642 ETH
202509742024-07-07 0:12:11134 days ago17203111311810.00 TH19,278,693 (64.26%)
0.093021864030321769 ETH
202247502024-07-03 8:19:59138 days ago17199947991500.00 TH11,835,992 (39.45%)
0.024325177232358701 ETH
202210012024-07-02 19:45:59138 days ago17199495591330.00 TH12,329,962 (41.10%)
0.034406157489846825 ETH
200337282024-06-06 15:37:59165 days ago17176882791410.00 TH12,262,273 (40.87%)
0.019818627604178722 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 119365 withdrawals (75,710.925197686 ETH withdrawn)

Validator Index Block Amount
841620212035642024-11-16 23:31:3543 hrs ago17317998950.019496125 ETH
841619212035642024-11-16 23:31:3543 hrs ago17317998950.019494577 ETH
841618212035642024-11-16 23:31:3543 hrs ago17317998950.019489629 ETH
841617212035642024-11-16 23:31:3543 hrs ago17317998950.01946592 ETH
841616212035642024-11-16 23:31:3543 hrs ago17317998950.019496435 ETH
841615212035642024-11-16 23:31:3543 hrs ago17317998950.019507143 ETH
841614212035642024-11-16 23:31:3543 hrs ago17317998950.019480284 ETH
841613212035632024-11-16 23:31:2343 hrs ago17317998830.019444077 ETH
841612212035632024-11-16 23:31:2343 hrs ago17317998830.019496127 ETH
841611212035632024-11-16 23:31:2343 hrs ago17317998830.019459999 ETH
841610212035632024-11-16 23:31:2343 hrs ago17317998830.019486761 ETH
841609212035632024-11-16 23:31:2343 hrs ago17317998830.019466284 ETH
841608212035632024-11-16 23:31:2343 hrs ago17317998830.019468153 ETH
841607212035632024-11-16 23:31:2343 hrs ago17317998830.019437819 ETH
841606212035632024-11-16 23:31:2343 hrs ago17317998830.019460124 ETH
841605212035632024-11-16 23:31:2343 hrs ago17317998830.019491561 ETH
841604212035632024-11-16 23:31:2343 hrs ago17317998830.019450866 ETH
841603212035632024-11-16 23:31:2343 hrs ago17317998830.019489166 ETH
841602212035632024-11-16 23:31:2343 hrs ago17317998830.019478515 ETH
841601212035632024-11-16 23:31:2343 hrs ago17317998830.019468423 ETH
841600212035632024-11-16 23:31:2343 hrs ago17317998830.019489542 ETH
841599212035632024-11-16 23:31:2343 hrs ago17317998830.019484581 ETH
841598212035632024-11-16 23:31:2343 hrs ago17317998830.019453142 ETH
841597212035622024-11-16 23:31:1143 hrs ago17317998710.019468257 ETH
841596212035622024-11-16 23:31:1143 hrs ago17317998710.019394991 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.