ETH Price: $1,643.22 (-2.10%)
 

Overview

ETH Balance

17.343464764924239756 ETH

Eth Value

$28,499.06 (@ $1,643.22/ETH)

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Transfer222688032025-04-14 17:45:2316 hrs ago1744652723IN
0x78329f10...F3BD32952
0.02677907 ETH0.000042041.52730093
Transfer222682942025-04-14 16:03:1118 hrs ago1744646591IN
0x78329f10...F3BD32952
0.27674058 ETH0.000141365.13563968
Transfer222678412025-04-14 14:31:4719 hrs ago1744641107IN
0x78329f10...F3BD32952
0.04594164 ETH0.000063052.29063062
Transfer222667032025-04-14 10:42:4723 hrs ago1744627367IN
0x78329f10...F3BD32952
0.01313897 ETH0.000025240.91692686
Transfer222609612025-04-13 15:30:5942 hrs ago1744558259IN
0x78329f10...F3BD32952
0.05248432 ETH0.000013490.49026813
Transfer222589582025-04-13 8:48:472 days ago1744534127IN
0x78329f10...F3BD32952
0.01363859 ETH0.000012230.44440779
Transfer222583992025-04-13 6:56:592 days ago1744527419IN
0x78329f10...F3BD32952
0.01954379 ETH0.000011560.42024529
Transfer222576862025-04-13 4:33:232 days ago1744518803IN
0x78329f10...F3BD32952
0.01713171 ETH0.000011360.4128572
Transfer222571622025-04-13 2:48:352 days ago1744512515IN
0x78329f10...F3BD32952
0.01732943 ETH0.000012280.44638639
Transfer222548482025-04-12 19:03:472 days ago1744484627IN
0x78329f10...F3BD32952
0.08713588 ETH0.000012080.43911607
Transfer222535412025-04-12 14:40:352 days ago1744468835IN
0x78329f10...F3BD32952
0.04005415 ETH0.000108543.94311633
Transfer222511222025-04-12 6:35:473 days ago1744439747IN
0x78329f10...F3BD32952
0.0103813 ETH0.00001190.43257268
Transfer222496262025-04-12 1:36:233 days ago1744421783IN
0x78329f10...F3BD32952
0.00746903 ETH0.000013120.47684316
Transfer222490742025-04-11 23:45:353 days ago1744415135IN
0x78329f10...F3BD32952
0.01843077 ETH0.000011610.42209914
Transfer222438792025-04-11 6:23:114 days ago1744352591IN
0x78329f10...F3BD32952
0.01213665 ETH0.000012790.46476573
Transfer222419292025-04-10 23:51:474 days ago1744329107IN
0x78329f10...F3BD32952
0.00880583 ETH0.000012570.4567525
Transfer222379722025-04-10 10:36:474 days ago1744281407IN
0x78329f10...F3BD32952
0.01636124 ETH0.000017050.61953143
Transfer222373772025-04-10 8:37:355 days ago1744274255IN
0x78329f10...F3BD32952
0.02933383 ETH0.000020130.73146665
Transfer222361922025-04-10 4:39:595 days ago1744259999IN
0x78329f10...F3BD32952
0.01109838 ETH0.000011340.41217839
Transfer222361102025-04-10 4:23:355 days ago1744259015IN
0x78329f10...F3BD32952
0.01587171 ETH0.000013840.5029119
Transfer222353992025-04-10 2:01:235 days ago1744250483IN
0x78329f10...F3BD32952
0.04614466 ETH0.000017350.63031565
Transfer222347982025-04-10 0:00:595 days ago1744243259IN
0x78329f10...F3BD32952
0.02182825 ETH0.000015460.561902
Transfer222295012025-04-09 6:17:236 days ago1744179443IN
0x78329f10...F3BD32952
0.11818361 ETH0.000012460.45290065
Batch Signature222235162025-04-08 10:14:357 days ago1744107275IN
0x78329f10...F3BD32952
0 ETH0.000104391.02978212
Transfer222224072025-04-08 6:32:117 days ago1744093931IN
0x78329f10...F3BD32952
0.02826244 ETH0.000012380.44986771
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Method Block
From
To
Transfer222235162025-04-08 10:14:357 days ago1744107275
0x78329f10...F3BD32952
311.19 ETH
Transfer221807312025-04-02 10:48:1112 days ago1743590891
0x78329f10...F3BD32952
0x78329f10...F3BD32952
0.001 ETH
Transfer220652212025-03-17 7:49:1129 days ago1742197751
0x78329f10...F3BD32952
0.00004583 ETH
Transfer219521282025-03-01 12:50:3544 days ago1740833435
0x78329f10...F3BD32952
0.00001857 ETH
Transfer219521282025-03-01 12:50:3544 days ago1740833435
0x78329f10...F3BD32952
0.00004794 ETH
Transfer219521282025-03-01 12:50:3544 days ago1740833435
0x78329f10...F3BD32952
0.0004022 ETH
Transfer214647522024-12-23 11:01:11112 days ago1734951671
0x78329f10...F3BD32952
56,839 ETH
Transfer214623742024-12-23 3:01:47113 days ago1734922907
0x78329f10...F3BD32952
188.57338083 ETH
Transfer214623662024-12-23 3:00:11113 days ago1734922811
0x78329f10...F3BD32952
97.38874869 ETH
Transfer214623582024-12-23 2:58:35113 days ago1734922715
0x78329f10...F3BD32952
26,941.41408207 ETH
Transfer213534532024-12-07 22:00:23128 days ago1733608823
0x78329f10...F3BD32952
0.00008991 ETH
Transfer213534532024-12-07 22:00:23128 days ago1733608823
0x78329f10...F3BD32952
0.00504545 ETH
Transfer212820262024-11-27 22:20:23138 days ago1732746023
0x78329f10...F3BD32952
0.00052959 ETH
Transfer212820262024-11-27 22:20:23138 days ago1732746023
0x78329f10...F3BD32952
0.01033491 ETH
Transfer212107142024-11-17 23:27:59148 days ago1731886079
0x78329f10...F3BD32952
1.59552079 ETH
Transfer208636162024-09-30 12:57:59196 days ago1727701079
0x78329f10...F3BD32952
951.99 ETH
Transfer208633802024-09-30 12:10:23196 days ago1727698223
0x78329f10...F3BD32952
0.01 ETH
Transfer208265432024-09-25 8:51:11202 days ago1727254271
0x78329f10...F3BD32952
0.001 ETH
Transfer208265432024-09-25 8:51:11202 days ago1727254271
0x78329f10...F3BD32952
0.0035 ETH
Transfer207894842024-09-20 4:42:11207 days ago1726807331
0x78329f10...F3BD32952
393.0417801 ETH
Transfer205048842024-08-11 10:50:23246 days ago1723373423
0x78329f10...F3BD32952
0.0000284 ETH
Transfer205048842024-08-11 10:50:23246 days ago1723373423
0x78329f10...F3BD32952
0.00094182 ETH
Transfer204595422024-08-05 3:01:23253 days ago1722826883
0x78329f10...F3BD32952
0.05226357 ETH
Transfer203889012024-07-26 6:22:23263 days ago1721974943
0x78329f10...F3BD32952
0.00002905 ETH
Transfer203889012024-07-26 6:22:23263 days ago1721974943
0x78329f10...F3BD32952
0.00005228 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

API
[{"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 33 blocks with 1.32 Ether produced)

Block Transaction Difficulty Gas Used Reward
220652212025-03-17 7:49:1129 days ago17421977511060.00 TH22,930,659 (63.70%)
0.013517397537084441 ETH
219521282025-03-01 12:50:3544 days ago17408334351250.00 TH13,944,750 (38.93%)
0.025637434857820462 ETH
219114822025-02-23 20:42:5950 days ago17403433791500.00 TH32,080,081 (89.20%)
0.025679006461402425 ETH
218945752025-02-21 12:00:3552 days ago17401392351670.00 TH14,441,600 (40.12%)
0.043109290600474799 ETH
213534532024-12-07 22:00:23128 days ago17336088231230.00 TH8,373,574 (27.91%)
0.014394945539614356 ETH
213004382024-11-30 12:17:23135 days ago17329690431120.00 TH10,986,474 (36.62%)
0.056725927245934954 ETH
212820262024-11-27 22:20:23138 days ago17327460231600.00 TH11,411,562 (38.04%)
0.017544474248341736 ETH
212194912024-11-19 4:49:11147 days ago17319917511240.00 TH11,632,514 (38.78%)
0.028241308238846734 ETH
208265432024-09-25 8:51:11202 days ago17272542711560.00 TH15,963,297 (53.21%)
0.068906687958077041 ETH
207094482024-09-09 0:24:11218 days ago17258414511810.00 TH13,045,320 (43.48%)
0.012622372083962275 ETH
206701192024-09-03 12:41:59223 days ago17253673191210.00 TH17,830,833 (59.44%)
0.050665641765776964 ETH
206524542024-09-01 1:32:47226 days ago17251543671050.00 TH7,273,132 (24.24%)
0.01515042561940963 ETH
206315542024-08-29 3:26:47229 days ago17249020071740.00 TH12,381,110 (41.27%)
0.037387361925754975 ETH
206203362024-08-27 13:51:35230 days ago17247666951600.00 TH15,493,345 (51.64%)
0.037399018965282148 ETH
206120112024-08-26 9:56:59232 days ago17246662192130.00 TH14,550,094 (48.50%)
0.021318013044396516 ETH
206077842024-08-25 19:46:59232 days ago17246152191000.00 TH29,957,903 (99.86%)
0.024262124900204402 ETH
205863332024-08-22 19:47:59235 days ago17243560791850.00 TH21,617,806 (72.06%)
0.033083004711088208 ETH
205436912024-08-16 20:50:59241 days ago17238414591780.00 TH22,651,829 (75.51%)
0.02222059517597721 ETH
205048842024-08-11 10:50:23246 days ago17233734231900.00 TH21,464,686 (71.55%)
0.037041081792893134 ETH
205040562024-08-11 8:03:35247 days ago17233634152180.00 TH19,844,499 (66.15%)
0.023122604769148094 ETH
204690412024-08-06 10:50:23251 days ago17229414231210.00 TH11,757,548 (39.19%)
0.023885585397144783 ETH
204595422024-08-05 3:01:23253 days ago1722826883970.00 TH9,837,821 (32.79%)
0.14935439134661522 ETH
204577972024-08-04 21:11:35253 days ago17228058951350.00 TH14,325,823 (47.75%)
0.048913147851237904 ETH
204466082024-08-03 7:45:59255 days ago17226711591420.00 TH14,801,949 (49.34%)
0.028847011028430768 ETH
204287832024-07-31 20:00:47257 days ago17224560473970.00 TH28,095,702 (93.65%)
0.053762772921568747 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 39307 withdrawals (31,102.394777094 ETH withdrawn)

Validator Index Block Amount
1471620222225042025-04-08 6:51:357 days ago17440950950.019126779 ETH
1471619222225042025-04-08 6:51:357 days ago17440950950.019087644 ETH
1471618222225042025-04-08 6:51:357 days ago17440950950.096988879 ETH
1471617222225042025-04-08 6:51:357 days ago17440950950.019161129 ETH
1471616222225032025-04-08 6:51:237 days ago17440950830.019117881 ETH
1471615222225032025-04-08 6:51:237 days ago17440950830.019140368 ETH
1471614222225032025-04-08 6:51:237 days ago17440950830.019111729 ETH
1471613222225032025-04-08 6:51:237 days ago17440950830.019099965 ETH
1471612222225032025-04-08 6:51:237 days ago17440950830.019110753 ETH
1471611222225032025-04-08 6:51:237 days ago17440950830.019131723 ETH
1471610222225032025-04-08 6:51:237 days ago17440950830.019058339 ETH
1471609222225032025-04-08 6:51:237 days ago17440950830.065265337 ETH
1471608222225032025-04-08 6:51:237 days ago17440950830.019115805 ETH
1471607222225032025-04-08 6:51:237 days ago17440950830.019097234 ETH
1471606222225032025-04-08 6:51:237 days ago17440950830.019130709 ETH
1471605222225032025-04-08 6:51:237 days ago17440950830.019061182 ETH
1471604222225032025-04-08 6:51:237 days ago17440950830.019094262 ETH
1471603222225032025-04-08 6:51:237 days ago17440950830.019143765 ETH
1471602222225032025-04-08 6:51:237 days ago17440950830.019113056 ETH
1471601222225032025-04-08 6:51:237 days ago17440950830.01911272 ETH
1471600222225022025-04-08 6:51:117 days ago17440950710.019124081 ETH
1471599222225022025-04-08 6:51:117 days ago17440950710.019155952 ETH
1471598222225022025-04-08 6:51:117 days ago17440950710.019079344 ETH
1471597222225022025-04-08 6:51:117 days ago17440950710.019127592 ETH
1471596222225022025-04-08 6:51:117 days ago17440950710.019132371 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.