ETH Price: $3,157.45 (-0.89%)
 

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Batch Signature239388992025-12-04 9:45:2319 hrs ago1764841523IN
0x78329f10...F3BD32952
0 ETH0.000054090.53370387
Batch Signature239388562025-12-04 9:35:4720 hrs ago1764840947IN
0x78329f10...F3BD32952
0 ETH0.000054330.53615964
Transfer239144522025-11-30 22:25:594 days ago1764541559IN
0x78329f10...F3BD32952
0.00408218 ETH0.000001320.04807723
Transfer239141062025-11-30 21:15:594 days ago1764537359IN
0x78329f10...F3BD32952
0.00948559 ETH0.000001490.05412902
Transfer239119512025-11-30 14:03:114 days ago1764511391IN
0x78329f10...F3BD32952
0.02288971 ETH0.000001060.03882647
Transfer238998332025-11-28 21:24:356 days ago1764365075IN
0x78329f10...F3BD32952
0.00689533 ETH0.000001580.05768506
Transfer238933992025-11-27 23:45:117 days ago1764287111IN
0x78329f10...F3BD32952
0.00779475 ETH0.000001150.04185259
Transfer238923922025-11-27 20:21:477 days ago1764274907IN
0x78329f10...F3BD32952
0.01061053 ETH0.000001210.04422361
Transfer238889652025-11-27 8:49:237 days ago1764233363IN
0x78329f10...F3BD32952
0.00658879 ETH0.000001520.05531283
Transfer238839142025-11-26 15:49:358 days ago1764172175IN
0x78329f10...F3BD32952
0.01137215 ETH0.000002160.07863059
Transfer238827882025-11-26 12:01:358 days ago1764158495IN
0x78329f10...F3BD32952
0.01060164 ETH0.00000160.05848064
Batch Signature238821562025-11-26 9:54:358 days ago1764150875IN
0x78329f10...F3BD32952
0 ETH0.0000560.55246621
Batch Signature238820542025-11-26 9:33:358 days ago1764149615IN
0x78329f10...F3BD32952
0 ETH0.000055940.55205151
Transfer238684312025-11-24 11:29:5910 days ago1763983799IN
0x78329f10...F3BD32952
0.00592975 ETH0.000002340.08517649
Transfer238682622025-11-24 10:56:1110 days ago1763981771IN
0x78329f10...F3BD32952
0.01147073 ETH0.000002230.08122715
Transfer238674102025-11-24 8:03:5910 days ago1763971439IN
0x78329f10...F3BD32952
0.00588036 ETH0.000002240.08161295
Transfer238624832025-11-23 15:28:2311 days ago1763911703IN
0x78329f10...F3BD32952
0.00615184 ETH0.000002310.08394943
Transfer238620722025-11-23 14:05:3511 days ago1763906735IN
0x78329f10...F3BD32952
0.12225072 ETH0.000003450.12553106
Transfer238574712025-11-22 22:33:3512 days ago1763850815IN
0x78329f10...F3BD32952
0.02384251 ETH0.000001760.06403824
Transfer238573032025-11-22 21:59:4712 days ago1763848787IN
0x78329f10...F3BD32952
0.00986885 ETH0.000001670.06067507
Transfer238501762025-11-21 21:54:1113 days ago1763762051IN
0x78329f10...F3BD32952
0.02516784 ETH0.000006470.23505869
Transfer238456772025-11-21 6:43:1113 days ago1763707391IN
0x78329f10...F3BD32952
0.01020725 ETH0.000004840.176108
Transfer238439662025-11-21 0:58:4714 days ago1763686727IN
0x78329f10...F3BD32952
0.00886369 ETH0.000002810.10213933
Transfer238349272025-11-19 18:33:2315 days ago1763577203IN
0x78329f10...F3BD32952
0.01217605 ETH0.00003471.26064037
Transfer238344282025-11-19 16:52:1115 days ago1763571131IN
0x78329f10...F3BD32952
0.02653002 ETH0.000030461.1069053
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Method Block
From
To
Transfer239388992025-12-04 9:45:2319 hrs ago1764841523
0x78329f10...F3BD32952
1,999.9 ETH
Transfer239388562025-12-04 9:35:4720 hrs ago1764840947
0x78329f10...F3BD32952
0.1 ETH
Transfer238821562025-11-26 9:54:358 days ago1764150875
0x78329f10...F3BD32952
127.99 ETH
Transfer238820542025-11-26 9:33:358 days ago1764149615
0x78329f10...F3BD32952
0.01 ETH
Transfer234874222025-10-02 3:28:3564 days ago1759375715
0x78329f10...F3BD32952
71.99 ETH
Transfer234799512025-10-01 2:22:3565 days ago1759285355
0x78329f10...F3BD32952
0.01 ETH
Transfer228381932025-07-03 10:45:47154 days ago1751539547
0x78329f10...F3BD32952
6,116.230768 ETH
Transfer227853882025-06-26 1:39:11162 days ago1750901951
0x78329f10...F3BD32952
3,883.569232 ETH
Transfer227815832025-06-25 12:54:59162 days ago1750856099
0x78329f10...F3BD32952
0.2 ETH
Transfer225728512025-05-27 8:11:59191 days ago1748333519
0x78329f10...F3BD32952
1,599.9 ETH
Transfer225727312025-05-27 7:47:47191 days ago1748332067
0x78329f10...F3BD32952
0.1 ETH
Transfer222235162025-04-08 10:14:35240 days ago1744107275
0x78329f10...F3BD32952
311.19 ETH
Transfer221807312025-04-02 10:48:11246 days ago1743590891
0x78329f10...F3BD32952
0x78329f10...F3BD32952
0.001 ETH
Transfer220652212025-03-17 7:49:11262 days ago1742197751
0x78329f10...F3BD32952
0.00004583 ETH
Transfer219521282025-03-01 12:50:35278 days ago1740833435
0x78329f10...F3BD32952
0.00001857 ETH
Transfer219521282025-03-01 12:50:35278 days ago1740833435
0x78329f10...F3BD32952
0.00004794 ETH
Transfer219521282025-03-01 12:50:35278 days ago1740833435
0x78329f10...F3BD32952
0.0004022 ETH
Transfer214647522024-12-23 11:01:11346 days ago1734951671
0x78329f10...F3BD32952
56,839 ETH
Transfer214623742024-12-23 3:01:47347 days ago1734922907
0x78329f10...F3BD32952
188.57338083 ETH
Transfer214623662024-12-23 3:00:11347 days ago1734922811
0x78329f10...F3BD32952
97.38874869 ETH
Transfer214623582024-12-23 2:58:35347 days ago1734922715
0x78329f10...F3BD32952
26,941.41408207 ETH
Transfer213534532024-12-07 22:00:23362 days ago1733608823
0x78329f10...F3BD32952
0.00008991 ETH
Transfer213534532024-12-07 22:00:23362 days ago1733608823
0x78329f10...F3BD32952
0.00504545 ETH
Transfer212820262024-11-27 22:20:23372 days ago1732746023
0x78329f10...F3BD32952
0.00052959 ETH
Transfer212820262024-11-27 22:20:23372 days ago1732746023
0x78329f10...F3BD32952
0.01033491 ETH
View All Internal Transactions
Loading...
Loading
Cross-Chain Transactions

 Latest 25 blocks (From a total of 34 blocks with 1.33 Ether produced)

Block Transaction Difficulty Gas Used Reward
231236522025-08-12 8:04:23114 days ago17549858632020.00 TH14,401,754 (31.85%)
0.009132407153970651 ETH
220652212025-03-17 7:49:11262 days ago17421977511060.00 TH22,930,659 (63.70%)
0.013517397537084441 ETH
219521282025-03-01 12:50:35278 days ago17408334351250.00 TH13,944,750 (38.93%)
0.025637434857820462 ETH
219114822025-02-23 20:42:59284 days ago17403433791500.00 TH32,080,081 (89.20%)
0.025679006461402425 ETH
218945752025-02-21 12:00:35286 days ago17401392351670.00 TH14,441,600 (40.12%)
0.043109290600474799 ETH
213534532024-12-07 22:00:23362 days ago17336088231230.00 TH8,373,574 (27.91%)
0.014394945539614356 ETH
213004382024-11-30 12:17:23369 days ago17329690431120.00 TH10,986,474 (36.62%)
0.056725927245934954 ETH
212820262024-11-27 22:20:23372 days ago17327460231600.00 TH11,411,562 (38.04%)
0.017544474248341736 ETH
212194912024-11-19 4:49:11381 days ago17319917511240.00 TH11,632,514 (38.78%)
0.028241308238846734 ETH
208265432024-09-25 8:51:11435 days ago17272542711560.00 TH15,963,297 (53.21%)
0.068906687958077041 ETH
207094482024-09-09 0:24:11452 days ago17258414511810.00 TH13,045,320 (43.48%)
0.012622372083962275 ETH
206701192024-09-03 12:41:59457 days ago17253673191210.00 TH17,830,833 (59.44%)
0.050665641765776964 ETH
206524542024-09-01 1:32:47460 days ago17251543671050.00 TH7,273,132 (24.24%)
0.01515042561940963 ETH
206315542024-08-29 3:26:47463 days ago17249020071740.00 TH12,381,110 (41.27%)
0.037387361925754975 ETH
206203362024-08-27 13:51:35464 days ago17247666951600.00 TH15,493,345 (51.64%)
0.037399018965282148 ETH
206120112024-08-26 9:56:59465 days ago17246662192130.00 TH14,550,094 (48.50%)
0.021318013044396516 ETH
206077842024-08-25 19:46:59466 days ago17246152191000.00 TH29,957,903 (99.86%)
0.024262124900204402 ETH
205863332024-08-22 19:47:59469 days ago17243560791850.00 TH21,617,806 (72.06%)
0.033083004711088208 ETH
205436912024-08-16 20:50:59475 days ago17238414591780.00 TH22,651,829 (75.51%)
0.02222059517597721 ETH
205048842024-08-11 10:50:23480 days ago17233734231900.00 TH21,464,686 (71.55%)
0.037041081792893134 ETH
205040562024-08-11 8:03:35480 days ago17233634152180.00 TH19,844,499 (66.15%)
0.023122604769148094 ETH
204690412024-08-06 10:50:23485 days ago17229414231210.00 TH11,757,548 (39.19%)
0.023885585397144783 ETH
204595422024-08-05 3:01:23487 days ago1722826883970.00 TH9,837,821 (32.79%)
0.14935439134661522 ETH
204577972024-08-04 21:11:35487 days ago17228058951350.00 TH14,325,823 (47.75%)
0.048913147851237904 ETH
204466082024-08-03 7:45:59488 days ago17226711591420.00 TH14,801,949 (49.34%)
0.028847011028430768 ETH
View All Blocks Produced

Latest 25 from a total of 49703 withdrawals (52,029.561783665 ETH withdrawn)

Validator Index Block Amount
1471620239318952025-12-03 9:02:1144 hrs ago176475253132.013635657 ETH
1471619239318952025-12-03 9:02:1144 hrs ago176475253132.013570752 ETH
1471618239318952025-12-03 9:02:1144 hrs ago176475253132.013637328 ETH
1471617239318952025-12-03 9:02:1144 hrs ago176475253132.013635141 ETH
1471616239318942025-12-03 9:01:5944 hrs ago176475251932.013608699 ETH
1471615239318942025-12-03 9:01:5944 hrs ago176475251932.013652382 ETH
1471614239318942025-12-03 9:01:5944 hrs ago176475251932.013610831 ETH
1471613239318942025-12-03 9:01:5944 hrs ago176475251932.013548382 ETH
1471612239318942025-12-03 9:01:5944 hrs ago176475251932.013605743 ETH
1471611239318942025-12-03 9:01:5944 hrs ago176475251932.013609859 ETH
1471610239318942025-12-03 9:01:5944 hrs ago176475251932.013531104 ETH
1471609239318942025-12-03 9:01:5944 hrs ago176475251932.013600915 ETH
1471608239318942025-12-03 9:01:5944 hrs ago176475251932.013542841 ETH
1471607239318942025-12-03 9:01:5944 hrs ago176475251932.013528351 ETH
1471606239318942025-12-03 9:01:5944 hrs ago176475251932.013541188 ETH
1471605239318942025-12-03 9:01:5944 hrs ago176475251932.01357939 ETH
1471604239318942025-12-03 9:01:5944 hrs ago176475251932.013589338 ETH
1471603239318942025-12-03 9:01:5944 hrs ago176475251932.013547461 ETH
1471602239318942025-12-03 9:01:5944 hrs ago176475251932.013522909 ETH
1471601239318942025-12-03 9:01:5944 hrs ago176475251932.013558439 ETH
1471600239318932025-12-03 9:01:4744 hrs ago176475250732.013541109 ETH
1471599239318932025-12-03 9:01:4744 hrs ago176475250732.013525044 ETH
1471598239318932025-12-03 9:01:4744 hrs ago176475250732.013578286 ETH
1471597239318932025-12-03 9:01:4744 hrs ago176475250732.013557826 ETH
1471596239318932025-12-03 9:01:4744 hrs ago176475250732.013524966 ETH
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
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"}]

0x608060405234801561001057600080fd5b506040516105f33803806105f383398181016040528101906100329190610303565b816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000815111156101295760008273ffffffffffffffffffffffffffffffffffffffff16826040516100a391906103a6565b600060405180830381855af49150503d80600081146100de576040519150601f19603f3d011682016040523d82523d6000602084013e6100e3565b606091505b5050905080610127576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161011e90610440565b60405180910390fd5b505b5050610460565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061016f82610144565b9050919050565b61017f81610164565b811461018a57600080fd5b50565b60008151905061019c81610176565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6101f5826101ac565b810181811067ffffffffffffffff82111715610214576102136101bd565b5b80604052505050565b6000610227610130565b905061023382826101ec565b919050565b600067ffffffffffffffff821115610253576102526101bd565b5b61025c826101ac565b9050602081019050919050565b60005b8381101561028757808201518184015260208101905061026c565b60008484015250505050565b60006102a66102a184610238565b61021d565b9050828152602081018484840111156102c2576102c16101a7565b5b6102cd848285610269565b509392505050565b600082601f8301126102ea576102e96101a2565b5b81516102fa848260208601610293565b91505092915050565b6000806040838503121561031a5761031961013a565b5b60006103288582860161018d565b925050602083015167ffffffffffffffff8111156103495761034861013f565b5b610355858286016102d5565b9150509250929050565b600081519050919050565b600081905092915050565b60006103808261035f565b61038a818561036a565b935061039a818560208601610269565b80840191505092915050565b60006103b28284610375565b915081905092915050565b600082825260208201905092915050565b7f4d756c746953696757616c6c657450726f78793a20496e697469616c697a617460008201527f696f6e206661696c656400000000000000000000000000000000000000000000602082015250565b600061042a602a836103bd565b9150610435826103ce565b604082019050919050565b600060208201905081810360008301526104598161041d565b9050919050565b6101848061046f6000396000f3fe6080604052600436106100225760003560e01c80635c60da1b1461007d57610052565b366100525761005060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff166100a8565b005b61007b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff166100a8565b005b34801561008957600080fd5b506100926100ce565b60405161009f9190610133565b60405180910390f35b3660008037600080366000845af43d6000803e80600081146100c9573d6000f35b3d6000fd5b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061011d826100f2565b9050919050565b61012d81610112565b82525050565b60006020820190506101486000830184610124565b9291505056fea26469706673582212209ddd38ba0d1790de3f61b13242414d0a219eeb1743a9f9d028636e2b2243263564736f6c634300081100330000000000000000000000002cf26caf5f1b457de18c19a08c6597943aa246b20000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000016460b5bb3f0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000080000000000000000000000003b5e729537a607480f64e97658e678df03aab4be000000000000000000000000685ac8aee5ad107929b1e9ef2af2075cc5ba187d0000000000000000000000006b46a856522310fa24b3d06286593d042b36eb610000000000000000000000006de00e0fc9a7673208efb1653a086fa51dcbc4bc000000000000000000000000712f004a405d93fe25b54bb84275f87951d6cece00000000000000000000000073194d6c6df7b4295d9b84c941b929cbcb2e657b000000000000000000000000a63f89df6154429a60f59069659ba881036fd5b5000000000000000000000000fd585015998120b517dabb2388900e059f44b87600000000000000000000000000000000000000000000000000000000

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

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading
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.