ETH Price: $3,058.98 (+2.22%)
Gas: 6 Gwei

Contract

0x57E037F4d2c8BEa011Ad8a9A5AF4AaEEd508650f
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Value
Create Wallet159630302022-11-13 18:55:23522 days ago1668365723IN
0x57E037F4...Ed508650f
0 ETH0.003444115.14420166
Create Wallet159619762022-11-13 15:24:11522 days ago1668353051IN
0x57E037F4...Ed508650f
0 ETH0.0040989618.01134848
Create Wallet159582382022-11-13 2:52:23522 days ago1668307943IN
0x57E037F4...Ed508650f
0 ETH0.0023882110.49486038
Create Wallet159577652022-11-13 1:17:23522 days ago1668302243IN
0x57E037F4...Ed508650f
0 ETH0.0031805713.98468905
Create Wallet159571972022-11-12 23:23:23523 days ago1668295403IN
0x57E037F4...Ed508650f
0 ETH0.0026321711.57979035
Create Wallet159571162022-11-12 23:07:11523 days ago1668294431IN
0x57E037F4...Ed508650f
0 ETH0.0024410310.73378371
Create Wallet159569562022-11-12 22:35:11523 days ago1668292511IN
0x57E037F4...Ed508650f
0 ETH0.0024952410.97191446
Create Wallet159566972022-11-12 21:43:23523 days ago1668289403IN
0x57E037F4...Ed508650f
0 ETH0.002236719.82913432
Create Wallet159557212022-11-12 18:27:11523 days ago1668277631IN
0x57E037F4...Ed508650f
0 ETH0.0030043513.19758322
Create Wallet159552432022-11-12 16:51:23523 days ago1668271883IN
0x57E037F4...Ed508650f
0 ETH0.003399813.71232036
Create Wallet159550602022-11-12 16:14:47523 days ago1668269687IN
0x57E037F4...Ed508650f
0 ETH0.0029872613.13401477
Create Wallet159547232022-11-12 15:07:23523 days ago1668265643IN
0x57E037F4...Ed508650f
0 ETH0.0028079112.33311446
Create Wallet159546732022-11-12 14:57:23523 days ago1668265043IN
0x57E037F4...Ed508650f
0 ETH0.0027940712.27258931
Create Wallet159545092022-11-12 14:24:11523 days ago1668263051IN
0x57E037F4...Ed508650f
0 ETH0.0032754314.38765147
Create Wallet159539212022-11-12 12:25:59523 days ago1668255959IN
0x57E037F4...Ed508650f
0 ETH0.002835612.4534134
Create Wallet159537892022-11-12 11:59:23523 days ago1668254363IN
0x57E037F4...Ed508650f
0 ETH0.0031098213.66492206
Create Wallet159531852022-11-12 9:58:23523 days ago1668247103IN
0x57E037F4...Ed508650f
0 ETH0.0037696215.20357878
Create Wallet159530232022-11-12 9:25:11523 days ago1668245111IN
0x57E037F4...Ed508650f
0 ETH0.0036663116.10340832
Create Wallet159529092022-11-12 9:02:23523 days ago1668243743IN
0x57E037F4...Ed508650f
0 ETH0.0031424913.81753035
Create Wallet159528392022-11-12 8:48:23523 days ago1668242903IN
0x57E037F4...Ed508650f
0 ETH0.0031505313.85360288
Create Wallet159525652022-11-12 7:53:23523 days ago1668239603IN
0x57E037F4...Ed508650f
0 ETH0.003516715.45559932
Create Wallet159524502022-11-12 7:30:23523 days ago1668238223IN
0x57E037F4...Ed508650f
0 ETH0.0038680516.98772493
Create Wallet159523902022-11-12 7:18:23523 days ago1668237503IN
0x57E037F4...Ed508650f
0 ETH0.0033659914.78278938
Create Wallet159522632022-11-12 6:52:35523 days ago1668235955IN
0x57E037F4...Ed508650f
0 ETH0.0036722914.87564241
Create Wallet159517942022-11-12 5:18:11523 days ago1668230291IN
0x57E037F4...Ed508650f
0 ETH0.0033911214.89395166
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To Value
196358662024-04-12 0:11:237 days ago1712880683
0x57E037F4...Ed508650f
 Contract Creation0 ETH
196312792024-04-11 8:46:237 days ago1712825183
0x57E037F4...Ed508650f
 Contract Creation0 ETH
195882742024-04-05 8:12:3513 days ago1712304755
0x57E037F4...Ed508650f
 Contract Creation0 ETH
195751082024-04-03 12:01:2315 days ago1712145683
0x57E037F4...Ed508650f
 Contract Creation0 ETH
195660752024-04-02 5:36:1116 days ago1712036171
0x57E037F4...Ed508650f
 Contract Creation0 ETH
195655942024-04-02 3:59:4716 days ago1712030387
0x57E037F4...Ed508650f
 Contract Creation0 ETH
195401192024-03-29 14:01:2320 days ago1711720883
0x57E037F4...Ed508650f
 Contract Creation0 ETH
195262822024-03-27 14:36:3522 days ago1711550195
0x57E037F4...Ed508650f
 Contract Creation0 ETH
195248602024-03-27 9:45:1122 days ago1711532711
0x57E037F4...Ed508650f
 Contract Creation0 ETH
195192702024-03-26 14:41:1123 days ago1711464071
0x57E037F4...Ed508650f
 Contract Creation0 ETH
195184312024-03-26 11:51:1123 days ago1711453871
0x57E037F4...Ed508650f
 Contract Creation0 ETH
195080672024-03-25 0:51:2324 days ago1711327883
0x57E037F4...Ed508650f
 Contract Creation0 ETH
195011682024-03-24 1:32:1125 days ago1711243931
0x57E037F4...Ed508650f
 Contract Creation0 ETH
194986452024-03-23 16:59:3526 days ago1711213175
0x57E037F4...Ed508650f
 Contract Creation0 ETH
194939102024-03-23 1:04:1126 days ago1711155851
0x57E037F4...Ed508650f
 Contract Creation0 ETH
194878502024-03-22 4:41:1127 days ago1711082471
0x57E037F4...Ed508650f
 Contract Creation0 ETH
194692422024-03-19 13:59:1130 days ago1710856751
0x57E037F4...Ed508650f
 Contract Creation0 ETH
194565212024-03-17 19:03:2332 days ago1710702203
0x57E037F4...Ed508650f
 Contract Creation0 ETH
194451092024-03-16 4:31:1133 days ago1710563471
0x57E037F4...Ed508650f
 Contract Creation0 ETH
194438282024-03-16 0:12:3534 days ago1710547955
0x57E037F4...Ed508650f
 Contract Creation0 ETH
194427152024-03-15 20:26:1134 days ago1710534371
0x57E037F4...Ed508650f
 Contract Creation0 ETH
194424862024-03-15 19:39:5934 days ago1710531599
0x57E037F4...Ed508650f
 Contract Creation0 ETH
194406602024-03-15 13:31:1134 days ago1710509471
0x57E037F4...Ed508650f
 Contract Creation0 ETH
194194622024-03-12 14:01:2337 days ago1710252083
0x57E037F4...Ed508650f
 Contract Creation0 ETH
194126642024-03-11 15:11:2338 days ago1710169883
0x57E037F4...Ed508650f
 Contract Creation0 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
WalletFactory

Compiler Version
v0.7.6+commit.7338295f

Optimization Enabled:
Yes with 100000 runs

Other Settings:
default evmVersion
File 1 of 11 : WalletFactory.sol
// SPDX-License-Identifier: GPL-2.0-or-later
// Copyright 2017 Loopring Technology Limited.
pragma solidity ^0.7.0;
pragma experimental ABIEncoderV2;

import "../iface/ILoopringWalletV2.sol";
import "../lib/EIP712.sol";
import "../lib/SignatureUtil.sol";
import "./WalletDeploymentLib.sol";


/// @title WalletFactory
/// @dev A factory contract to create a new wallet by deploying a proxy
///      in front of a real wallet.
/// @author Daniel Wang - <[email protected]>
contract WalletFactory is WalletDeploymentLib
{
    using SignatureUtil for bytes32;

    event WalletCreated (address wallet, address owner);

    bytes32             public immutable DOMAIN_SEPARATOR;

    bytes32 public constant CREATE_WALLET_TYPEHASH = keccak256(
        "createWallet(address owner,address[] guardians,uint256 quota,address inheritor,address feeRecipient,address feeToken,uint256 maxFeeAmount,uint256 salt)");

    struct WalletConfig
    {
        address   owner;
        address[] guardians;
        uint      quota;
        address   inheritor;
        address   feeRecipient;
        address   feeToken;
        uint      maxFeeAmount;
        uint      salt;
        bytes     signature;
    }

    constructor(
        address        _walletImplementation
        )
        WalletDeploymentLib(_walletImplementation)
    {
        DOMAIN_SEPARATOR = EIP712.hash(
            EIP712.Domain("WalletFactory", "2.0.0", address(this))
        );
    }

    /// @dev Create a new wallet by deploying a proxy.
    /// @param config The wallet's config.
    /// @param feeAmount The fee amount actually paid.
    /// @return wallet The new wallet address
    function createWallet(
        WalletConfig calldata config,
        uint                  feeAmount
        )
        external
        returns (address wallet)
    {
        require(feeAmount <= config.maxFeeAmount, "INVALID_FEE_AMOUNT");

        _validateConfig(config);
        wallet = _deploy(config.owner, config.salt);
        _initializeWallet(wallet, config, feeAmount);
    }

    /// @dev Computes the wallet address
    /// @param salt The initial wallet owner.
    /// @param salt A salt.
    /// @return wallet The wallet address
    function computeWalletAddress(
        address owner,
        uint    salt
        )
        public
        view
        returns (address)
    {
        return _computeWalletAddress(
            owner,
            salt,
            address(this)
        );
    }

    // --- Internal functions ---

    function _initializeWallet(
        address               wallet,
        WalletConfig calldata config,
        uint                  feeAmount
        )
        internal
    {
        ILoopringWalletV2(wallet).initialize(
            config.owner,
            config.guardians,
            config.quota,
            config.inheritor,
            config.feeRecipient,
            config.feeToken,
            feeAmount
        );

        emit WalletCreated(wallet, config.owner);
    }

    function _validateConfig(
        WalletConfig calldata config
        )
        private
        view
    {
        require(config.owner != address(0), "INVALID_OWNER");

        bytes32 dataHash = keccak256(
            abi.encode(
                CREATE_WALLET_TYPEHASH,
                config.owner,
                keccak256(abi.encodePacked(config.guardians)),
                config.quota,
                config.inheritor,
                config.feeRecipient,
                config.feeToken,
                config.maxFeeAmount,
                config.salt
            )
        );

        bytes32 signHash = EIP712.hashPacked(DOMAIN_SEPARATOR, dataHash);
        require(signHash.verifySignature(config.owner, config.signature), "INVALID_SIGNATURE");
    }
}

File 3 of 11 : ILoopringWalletV2.sol
// SPDX-License-Identifier: GPL-2.0-or-later
// Copyright 2017 Loopring Technology Limited.
pragma solidity ^0.7.0;


/// @title Loopring SmartWallet V2 interface
/// @author Brecht Devos - <[email protected]>
abstract contract ILoopringWalletV2
{
    /// @dev Initializes the smart wallet.
    /// @param owner The wallet owner address.
    /// @param guardians The initial wallet guardians.
    /// @param quota The initial wallet quota.
    /// @param inheritor The inheritor of the wallet.
    /// @param feeRecipient The address receiving the fee for creating the wallet.
    /// @param feeToken The token to use for the fee payment.
    /// @param feeAmount The amount of tokens paid to the fee recipient.
    function initialize(
        address             owner,
        address[] calldata  guardians,
        uint                quota,
        address             inheritor,
        address             feeRecipient,
        address             feeToken,
        uint                feeAmount
        )
        external
        virtual;

    /// @dev Returns the timestamp the wallet was created.
    /// @return The timestamp the wallet was created.
    function getCreationTimestamp()
        public
        view
        virtual
        returns (uint64);

    /// @dev Returns the current wallet owner.
    /// @return The current wallet owner.
    function getOwner()
        public
        view
        virtual
        returns (address);
}

File 4 of 11 : EIP712.sol
// SPDX-License-Identifier: Apache-2.0
// Copyright 2017 Loopring Technology Limited.
pragma solidity ^0.7.0;
pragma experimental ABIEncoderV2;


library EIP712
{
    struct Domain {
        string  name;
        string  version;
        address verifyingContract;
    }

    bytes32 constant internal EIP712_DOMAIN_TYPEHASH = keccak256(
        "EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"
    );

    string constant internal EIP191_HEADER = "\x19\x01";

    function hash(Domain memory domain)
        internal
        pure
        returns (bytes32)
    {
        uint _chainid;
        assembly { _chainid := chainid() }

        return keccak256(
            abi.encode(
                EIP712_DOMAIN_TYPEHASH,
                keccak256(bytes(domain.name)),
                keccak256(bytes(domain.version)),
                _chainid,
                domain.verifyingContract
            )
        );
    }

    function hashPacked(
        bytes32 domainSeparator,
        bytes32 dataHash
        )
        internal
        pure
        returns (bytes32)
    {
        return keccak256(
            abi.encodePacked(
                EIP191_HEADER,
                domainSeparator,
                dataHash
            )
        );
    }
}

File 5 of 11 : SignatureUtil.sol
// SPDX-License-Identifier: GPL-2.0-or-later
// Copyright 2017 Loopring Technology Limited.
pragma solidity ^0.7.0;
pragma experimental ABIEncoderV2;

import "../thirdparty/BytesUtil.sol";
import "./AddressUtil.sol";
import "./ERC1271.sol";
import "./MathUint.sol";


/// @title SignatureUtil
/// @author Daniel Wang - <[email protected]>
/// @dev This method supports multihash standard. Each signature's last byte indicates
///      the signature's type.
library SignatureUtil
{
    using BytesUtil     for bytes;
    using MathUint      for uint;
    using AddressUtil   for address;

    enum SignatureType {
        ILLEGAL,
        INVALID,
        EIP_712,
        ETH_SIGN,
        WALLET   // deprecated
    }

    bytes4 constant internal ERC1271_MAGICVALUE = 0x1626ba7e;

    function verifySignatures(
        bytes32          signHash,
        address[] memory signers,
        bytes[]   memory signatures
        )
        internal
        view
        returns (bool)
    {
        require(signers.length == signatures.length, "BAD_SIGNATURE_DATA");
        address lastSigner;
        for (uint i = 0; i < signers.length; i++) {
            require(signers[i] > lastSigner, "INVALID_SIGNERS_ORDER");
            lastSigner = signers[i];
            if (!verifySignature(signHash, signers[i], signatures[i])) {
                return false;
            }
        }
        return true;
    }

    function verifySignature(
        bytes32        signHash,
        address        signer,
        bytes   memory signature
        )
        internal
        view
        returns (bool)
    {
        if (signer == address(0)) {
            return false;
        }

        return signer.isContract()?
            verifyERC1271Signature(signHash, signer, signature):
            verifyEOASignature(signHash, signer, signature);
    }

    function recoverECDSASigner(
        bytes32      signHash,
        bytes memory signature
        )
        internal
        pure
        returns (address)
    {
        if (signature.length != 65) {
            return address(0);
        }

        bytes32 r;
        bytes32 s;
        uint8   v;
        // we jump 32 (0x20) as the first slot of bytes contains the length
        // we jump 65 (0x41) per signature
        // for v we load 32 bytes ending with v (the first 31 come from s) then apply a mask
        assembly {
            r := mload(add(signature, 0x20))
            s := mload(add(signature, 0x40))
            v := and(mload(add(signature, 0x41)), 0xff)
        }
        // See https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/cryptography/ECDSA.sol
        if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {
            return address(0);
        }
        if (v == 27 || v == 28) {
            return ecrecover(signHash, v, r, s);
        } else {
            return address(0);
        }
    }

    function verifyEOASignature(
        bytes32        signHash,
        address        signer,
        bytes   memory signature
        )
        private
        pure
        returns (bool success)
    {
        if (signer == address(0)) {
            return false;
        }

        uint signatureTypeOffset = signature.length.sub(1);
        SignatureType signatureType = SignatureType(signature.toUint8(signatureTypeOffset));

        // Strip off the last byte of the signature by updating the length
        assembly {
            mstore(signature, signatureTypeOffset)
        }

        if (signatureType == SignatureType.EIP_712) {
            success = (signer == recoverECDSASigner(signHash, signature));
        } else if (signatureType == SignatureType.ETH_SIGN) {
            bytes32 hash = keccak256(
                abi.encodePacked("\x19Ethereum Signed Message:\n32", signHash)
            );
            success = (signer == recoverECDSASigner(hash, signature));
        } else {
            success = false;
        }

        // Restore the signature length
        assembly {
            mstore(signature, add(signatureTypeOffset, 1))
        }

        return success;
    }

    function verifyERC1271Signature(
        bytes32 signHash,
        address signer,
        bytes   memory signature
        )
        private
        view
        returns (bool)
    {
        bytes memory callData = abi.encodeWithSelector(
            ERC1271.isValidSignature.selector,
            signHash,
            signature
        );
        (bool success, bytes memory result) = signer.staticcall(callData);
        return (
            success &&
            result.length == 32 &&
            result.toBytes4(0) == ERC1271_MAGICVALUE
        );
    }
}

File 6 of 11 : WalletDeploymentLib.sol
// SPDX-License-Identifier: GPL-2.0-or-later
// Copyright 2017 Loopring Technology Limited.
pragma solidity ^0.7.0;
pragma experimental ABIEncoderV2;

import "../thirdparty/Create2.sol";
import "../thirdparty/proxies/WalletProxy.sol";


/// @title WalletDeploymentLib
/// @dev Functionality to compute wallet addresses and to deploy wallets
/// @author Brecht Devos - <[email protected]>
contract WalletDeploymentLib
{
    address public immutable walletImplementation;

    string  public constant WALLET_CREATION = "WALLET_CREATION";

    constructor(
        address _walletImplementation
        )
    {
        walletImplementation = _walletImplementation;
    }

    function getWalletCode()
        public
        view
        returns (bytes memory)
    {
        return abi.encodePacked(
            type(WalletProxy).creationCode,
            abi.encode(walletImplementation)
        );
    }

    function computeWalletSalt(
        address owner,
        uint    salt
        )
        public
        pure
        returns (bytes32)
    {
        return keccak256(
            abi.encodePacked(
                WALLET_CREATION,
                owner,
                salt
            )
        );
    }

    function _deploy(
        address owner,
        uint    salt
        )
        internal
        returns (address payable wallet)
    {
        wallet = Create2.deploy(
            computeWalletSalt(owner, salt),
            getWalletCode()
        );
    }

    function _computeWalletAddress(
        address owner,
        uint    salt,
        address deployer
        )
        internal
        view
        returns (address)
    {
        return Create2.computeAddress(
            computeWalletSalt(owner, salt),
            getWalletCode(),
            deployer
        );
    }
}

File 7 of 11 : BytesUtil.sol
// SPDX-License-Identifier: UNLICENSED
// Taken from https://github.com/GNSPS/solidity-bytes-utils/blob/master/contracts/BytesLib.sol
pragma solidity ^0.7.0;

library BytesUtil {
    function slice(
        bytes memory _bytes,
        uint _start,
        uint _length
    )
        internal
        pure
        returns (bytes memory)
    {
        require(_bytes.length >= (_start + _length));

        bytes memory tempBytes;

        assembly {
            switch iszero(_length)
            case 0 {
                // Get a location of some free memory and store it in tempBytes as
                // Solidity does for memory variables.
                tempBytes := mload(0x40)

                // The first word of the slice result is potentially a partial
                // word read from the original array. To read it, we calculate
                // the length of that partial word and start copying that many
                // bytes into the array. The first word we copy will start with
                // data we don't care about, but the last `lengthmod` bytes will
                // land at the beginning of the contents of the new array. When
                // we're done copying, we overwrite the full first word with
                // the actual length of the slice.
                let lengthmod := and(_length, 31)

                // The multiplication in the next line is necessary
                // because when slicing multiples of 32 bytes (lengthmod == 0)
                // the following copy loop was copying the origin's length
                // and then ending prematurely not copying everything it should.
                let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))
                let end := add(mc, _length)

                for {
                    // The multiplication in the next line has the same exact purpose
                    // as the one above.
                    let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)
                } lt(mc, end) {
                    mc := add(mc, 0x20)
                    cc := add(cc, 0x20)
                } {
                    mstore(mc, mload(cc))
                }

                mstore(tempBytes, _length)

                //update free-memory pointer
                //allocating the array padded to 32 bytes like the compiler does now
                mstore(0x40, and(add(mc, 31), not(31)))
            }
            //if we want a zero-length slice let's just return a zero-length array
            default {
                tempBytes := mload(0x40)

                mstore(0x40, add(tempBytes, 0x20))
            }
        }

        return tempBytes;
    }

    function toAddress(bytes memory _bytes, uint _start) internal  pure returns (address) {
        require(_bytes.length >= (_start + 20));
        address tempAddress;

        assembly {
            tempAddress := div(mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000)
        }

        return tempAddress;
    }

    function toUint8(bytes memory _bytes, uint _start) internal  pure returns (uint8) {
        require(_bytes.length >= (_start + 1));
        uint8 tempUint;

        assembly {
            tempUint := mload(add(add(_bytes, 0x1), _start))
        }

        return tempUint;
    }

    function toUint16(bytes memory _bytes, uint _start) internal  pure returns (uint16) {
        require(_bytes.length >= (_start + 2));
        uint16 tempUint;

        assembly {
            tempUint := mload(add(add(_bytes, 0x2), _start))
        }

        return tempUint;
    }

    function toUint24(bytes memory _bytes, uint _start) internal  pure returns (uint24) {
        require(_bytes.length >= (_start + 3));
        uint24 tempUint;

        assembly {
            tempUint := mload(add(add(_bytes, 0x3), _start))
        }

        return tempUint;
    }

    function toUint32(bytes memory _bytes, uint _start) internal  pure returns (uint32) {
        require(_bytes.length >= (_start + 4));
        uint32 tempUint;

        assembly {
            tempUint := mload(add(add(_bytes, 0x4), _start))
        }

        return tempUint;
    }

    function toUint64(bytes memory _bytes, uint _start) internal  pure returns (uint64) {
        require(_bytes.length >= (_start + 8));
        uint64 tempUint;

        assembly {
            tempUint := mload(add(add(_bytes, 0x8), _start))
        }

        return tempUint;
    }

    function toUint96(bytes memory _bytes, uint _start) internal  pure returns (uint96) {
        require(_bytes.length >= (_start + 12));
        uint96 tempUint;

        assembly {
            tempUint := mload(add(add(_bytes, 0xc), _start))
        }

        return tempUint;
    }

    function toUint128(bytes memory _bytes, uint _start) internal  pure returns (uint128) {
        require(_bytes.length >= (_start + 16));
        uint128 tempUint;

        assembly {
            tempUint := mload(add(add(_bytes, 0x10), _start))
        }

        return tempUint;
    }

    function toUint(bytes memory _bytes, uint _start) internal  pure returns (uint256) {
        require(_bytes.length >= (_start + 32));
        uint256 tempUint;

        assembly {
            tempUint := mload(add(add(_bytes, 0x20), _start))
        }

        return tempUint;
    }

    function toBytes4(bytes memory _bytes, uint _start) internal  pure returns (bytes4) {
        require(_bytes.length >= (_start + 4));
        bytes4 tempBytes4;

        assembly {
            tempBytes4 := mload(add(add(_bytes, 0x20), _start))
        }

        return tempBytes4;
    }

    function toBytes32(bytes memory _bytes, uint _start) internal  pure returns (bytes32) {
        require(_bytes.length >= (_start + 32));
        bytes32 tempBytes32;

        assembly {
            tempBytes32 := mload(add(add(_bytes, 0x20), _start))
        }

        return tempBytes32;
    }

    function fastSHA256(
        bytes memory data
        )
        internal
        view
        returns (bytes32)
    {
        bytes32[] memory result = new bytes32[](1);
        bool success;
        assembly {
             let ptr := add(data, 32)
             success := staticcall(sub(gas(), 2000), 2, ptr, mload(data), add(result, 32), 32)
        }
        require(success, "SHA256_FAILED");
        return result[0];
    }
}

File 8 of 11 : AddressUtil.sol
// SPDX-License-Identifier: GPL-2.0-or-later
// Copyright 2017 Loopring Technology Limited.
pragma solidity ^0.7.0;


/// @title Utility Functions for addresses
/// @author Daniel Wang - <[email protected]>
/// @author Brecht Devos - <[email protected]>
library AddressUtil
{
    using AddressUtil for *;

    function isContract(
        address addr
        )
        internal
        view
        returns (bool)
    {
        // According to EIP-1052, 0x0 is the value returned for not-yet created accounts
        // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned
        // for accounts without code, i.e. `keccak256('')`
        bytes32 codehash;
        // solhint-disable-next-line no-inline-assembly
        assembly { codehash := extcodehash(addr) }
        return (codehash != 0x0 &&
                codehash != 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470);
    }

    function toPayable(
        address addr
        )
        internal
        pure
        returns (address payable)
    {
        return payable(addr);
    }

    // Works like address.send but with a customizable gas limit
    // Make sure your code is safe for reentrancy when using this function!
    function sendETH(
        address to,
        uint    amount,
        uint    gasLimit
        )
        internal
        returns (bool success)
    {
        if (amount == 0) {
            return true;
        }
        address payable recipient = to.toPayable();
        /* solium-disable-next-line */
        (success,) = recipient.call{value: amount, gas: gasLimit}("");
    }

    // Works like address.transfer but with a customizable gas limit
    // Make sure your code is safe for reentrancy when using this function!
    function sendETHAndVerify(
        address to,
        uint    amount,
        uint    gasLimit
        )
        internal
        returns (bool success)
    {
        success = to.sendETH(amount, gasLimit);
        require(success, "TRANSFER_FAILURE");
    }

    // Works like call but is slightly more efficient when data
    // needs to be copied from memory to do the call.
    function fastCall(
        address to,
        uint    gasLimit,
        uint    value,
        bytes   memory data
        )
        internal
        returns (bool success, bytes memory returnData)
    {
        if (to != address(0)) {
            assembly {
                // Do the call
                success := call(gasLimit, to, value, add(data, 32), mload(data), 0, 0)
                // Copy the return data
                let size := returndatasize()
                returnData := mload(0x40)
                mstore(returnData, size)
                returndatacopy(add(returnData, 32), 0, size)
                // Update free memory pointer
                mstore(0x40, add(returnData, add(32, size)))
            }
        }
    }

    // Like fastCall, but throws when the call is unsuccessful.
    function fastCallAndVerify(
        address to,
        uint    gasLimit,
        uint    value,
        bytes   memory data
        )
        internal
        returns (bytes memory returnData)
    {
        bool success;
        (success, returnData) = fastCall(to, gasLimit, value, data);
        if (!success) {
            assembly {
                revert(add(returnData, 32), mload(returnData))
            }
        }
    }
}

File 9 of 11 : ERC1271.sol
// SPDX-License-Identifier: GPL-2.0-or-later
// Copyright 2017 Loopring Technology Limited.
pragma solidity ^0.7.0;

abstract contract ERC1271 {
    // bytes4(keccak256("isValidSignature(bytes32,bytes)")
    bytes4 constant internal ERC1271_MAGICVALUE = 0x1626ba7e;

    function isValidSignature(
        bytes32      _hash,
        bytes memory _signature)
        public
        view
        virtual
        returns (bytes4 magicValue);
}

File 10 of 11 : MathUint.sol
// SPDX-License-Identifier: GPL-2.0-or-later
// Copyright 2017 Loopring Technology Limited.
pragma solidity ^0.7.0;


/// @title Utility Functions for uint
/// @author Daniel Wang - <[email protected]>
library MathUint
{
    function mul(
        uint a,
        uint b
        )
        internal
        pure
        returns (uint c)
    {
        c = a * b;
        require(a == 0 || c / a == b, "MUL_OVERFLOW");
    }

    function sub(
        uint a,
        uint b
        )
        internal
        pure
        returns (uint)
    {
        require(b <= a, "SUB_UNDERFLOW");
        return a - b;
    }

    function add(
        uint a,
        uint b
        )
        internal
        pure
        returns (uint c)
    {
        c = a + b;
        require(c >= a, "ADD_OVERFLOW");
    }
}

File 11 of 11 : Create2.sol
// SPDX-License-Identifier: UNLICENSED
// Taken from: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/970f687f04d20e01138a3e8ccf9278b1d4b3997b/contracts/utils/Create2.sol

pragma solidity ^0.7.0;

/**
 * @dev Helper to make usage of the `CREATE2` EVM opcode easier and safer.
 * `CREATE2` can be used to compute in advance the address where a smart
 * contract will be deployed, which allows for interesting new mechanisms known
 * as 'counterfactual interactions'.
 *
 * See the https://eips.ethereum.org/EIPS/eip-1014#motivation[EIP] for more
 * information.
 */
library Create2 {
    /**
     * @dev Deploys a contract using `CREATE2`. The address where the contract
     * will be deployed can be known in advance via {computeAddress}. Note that
     * a contract cannot be deployed twice using the same salt.
     */
    function deploy(bytes32 salt, bytes memory bytecode) internal returns (address payable) {
        address payable addr;
        // solhint-disable-next-line no-inline-assembly
        assembly {
            addr := create2(0, add(bytecode, 0x20), mload(bytecode), salt)
        }
        require(addr != address(0), "CREATE2_FAILED");
        return addr;
    }

    /**
     * @dev Returns the address where a contract will be stored if deployed via {deploy}. Any change in the `bytecode`
     * or `salt` will result in a new destination address.
     */
    function computeAddress(bytes32 salt, bytes memory bytecode) internal view returns (address) {
        return computeAddress(salt, bytecode, address(this));
    }

    /**
     * @dev Returns the address where a contract will be stored if deployed via {deploy} from a contract located at
     * `deployer`. If `deployer` is this contract's address, returns the same value as {computeAddress}.
     */
    function computeAddress(bytes32 salt, bytes memory bytecodeHash, address deployer) internal pure returns (address) {
        bytes32 bytecodeHashHash = keccak256(bytecodeHash);
        bytes32 _data = keccak256(
            abi.encodePacked(bytes1(0xff), deployer, salt, bytecodeHashHash)
        );
        return address(bytes20(_data << 96));
    }
}

File 12 of 11 : WalletProxy.sol
// SPDX-License-Identifier: LGPL-3.0-or-later
// Taken from: https://github.com/gnosis/safe-contracts/blob/development/contracts/proxies/GnosisSafeProxy.sol
pragma solidity ^0.7.0;

/// @title IProxy - Helper interface to access masterCopy of the Proxy on-chain
/// @author Richard Meissner - <[email protected]>
interface IProxy {
    function masterCopy() external view returns (address);
}

/// @title WalletProxy - Generic proxy contract allows to execute all transactions applying the code of a master contract.
/// @author Stefan George - <[email protected]>
/// @author Richard Meissner - <[email protected]>
contract WalletProxy {

    // masterCopy always needs to be first declared variable, to ensure that it is at the same location in the contracts to which calls are delegated.
    // To reduce deployment costs this variable is internal and needs to be retrieved via `getStorageAt`
    address internal masterCopy;

    /// @dev Constructor function sets address of master copy contract.
    /// @param _masterCopy Master copy address.
    constructor(address _masterCopy)
    {
        require(_masterCopy != address(0), "Invalid master copy address provided");
        masterCopy = _masterCopy;
    }

    /// @dev Fallback function forwards all transactions and returns all received return data.
    fallback()
        payable
        external
    {
        // solium-disable-next-line security/no-inline-assembly
        assembly {
            let _masterCopy := and(sload(0), 0xffffffffffffffffffffffffffffffffffffffff)
            // 0xa619486e == keccak("masterCopy()"). The value is right padded to 32-bytes with 0s
            if eq(calldataload(0), 0xa619486e00000000000000000000000000000000000000000000000000000000) {
                mstore(0, _masterCopy)
                return(0, 0x20)
            }
            calldatacopy(0, 0, calldatasize())
            let success := delegatecall(gas(), _masterCopy, 0, calldatasize(), 0, 0)
            returndatacopy(0, 0, returndatasize())
            if eq(success, 0) { revert(0, returndatasize()) }
            return(0, returndatasize())
        }
    }
}

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 100000
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  },
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_walletImplementation","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"wallet","type":"address"},{"indexed":false,"internalType":"address","name":"owner","type":"address"}],"name":"WalletCreated","type":"event"},{"inputs":[],"name":"CREATE_WALLET_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WALLET_CREATION","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"salt","type":"uint256"}],"name":"computeWalletAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"salt","type":"uint256"}],"name":"computeWalletSalt","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address[]","name":"guardians","type":"address[]"},{"internalType":"uint256","name":"quota","type":"uint256"},{"internalType":"address","name":"inheritor","type":"address"},{"internalType":"address","name":"feeRecipient","type":"address"},{"internalType":"address","name":"feeToken","type":"address"},{"internalType":"uint256","name":"maxFeeAmount","type":"uint256"},{"internalType":"uint256","name":"salt","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"internalType":"struct WalletFactory.WalletConfig","name":"config","type":"tuple"},{"internalType":"uint256","name":"feeAmount","type":"uint256"}],"name":"createWallet","outputs":[{"internalType":"address","name":"wallet","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getWalletCode","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"walletImplementation","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]

60c060405234801561001057600080fd5b5060405161167a38038061167a83398101604081905261002f91610146565b80806001600160a01b03166080816001600160a01b031660601b81525050506100c660405180606001604052806040518060400160405280600d81526020016c57616c6c6574466163746f727960981b8152508152602001604051806040016040528060058152602001640322e302e360dc1b8152508152602001306001600160a01b03168152506100cf60201b61037e1760201c565b60a052506101a0565b6000804690507f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f836000015180519060200120846020015180519060200120838660400151604051602001610128959493929190610174565b60405160208183030381529060405280519060200120915050919050565b600060208284031215610157578081fd5b81516001600160a01b038116811461016d578182fd5b9392505050565b9485526020850193909352604084019190915260608301526001600160a01b0316608082015260a00190565b60805160601c60a0516114aa6101d0600039806101205280610555525080610168528061028d52506114aa6000f3fe608060405234801561001057600080fd5b50600436106100885760003560e01c8063b6830d8f1161005b578063b6830d8f146100dd578063ce158612146100f0578063d70e200014610103578063d92d1f561461010b57610088565b80633644e5151461008d5780634c30d6c9146100ab5780638117abc1146100b357806390610b0e146100c8575b600080fd5b61009561011e565b6040516100a29190611079565b60405180910390f35b610095610142565b6100bb610166565b6040516100a29190610fa8565b6100d061018a565b6040516100a2919061114e565b6100956100eb366004610db9565b6101c3565b6100bb6100fe366004610db9565b61022e565b6100d0610242565b6100bb610119366004610de2565b610305565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f4392cdd6c9d91e0896c5def13bad6473db5d21e2b0def85ab8c2475c3e60d14c81565b7f000000000000000000000000000000000000000000000000000000000000000081565b6040518060400160405280600f81526020017f57414c4c45545f4352454154494f4e000000000000000000000000000000000081525081565b60006040518060400160405280600f81526020017f57414c4c45545f4352454154494f4e0000000000000000000000000000000000815250838360405160200161020f93929190610efe565b6040516020818303038152906040528051906020012090505b92915050565b600061023b8383306103f6565b9392505050565b60606040518060200161025490610d6e565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f9091011660408190526102b5907f000000000000000000000000000000000000000000000000000000000000000090602001610fa8565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290526102f19291602001610ecf565b604051602081830303815290604052905090565b60008260c0013582111561034e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161034590611161565b60405180910390fd5b6103578361041b565b6103716103676020850185610d9f565b8460e00135610613565b905061022881848461062f565b6000804690507f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f8360000151805190602001208460200151805190602001208386604001516040516020016103d79594939291906110de565b604051602081830303815290604052805190602001209150505b919050565b600061041361040585856101c3565b61040d610242565b8461073d565b949350505050565b600061042a6020830183610d9f565b73ffffffffffffffffffffffffffffffffffffffff161415610478576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610345906111cf565b60007f4392cdd6c9d91e0896c5def13bad6473db5d21e2b0def85ab8c2475c3e60d14c6104a86020840184610d9f565b6104b56020850185611206565b6040516020016104c6929190610e66565b6040516020818303038152906040528051906020012084604001358560600160208101906104f49190610d9f565b61050460a0880160808901610d9f565b61051460c0890160a08a01610d9f565b8860c001358960e0013560405160200161053699989796959493929190611082565b604051602081830303815290604052805190602001209050600061057a7f0000000000000000000000000000000000000000000000000000000000000000836107dc565b90506105d861058c6020850185610d9f565b61059a610100860186611272565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508694939250506108289050565b61060e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161034590611198565b505050565b600061023b61062284846101c3565b61062a610242565b61088b565b73ffffffffffffffffffffffffffffffffffffffff831663d6bb65c26106586020850185610d9f565b6106656020860186611206565b604087013561067a6080890160608a01610d9f565b61068a60a08a0160808b01610d9f565b61069a60c08b0160a08c01610d9f565b896040518963ffffffff1660e01b81526004016106be989796959493929190610ff0565b600060405180830381600087803b1580156106d857600080fd5b505af11580156106ec573d6000803e3d6000fd5b507f5b03bfed1c14a02bdeceb5fa582eb1a5765fc0bc64ca0e6af4c20afc9487f081925085915061072290506020850185610d9f565b604051610730929190610fc9565b60405180910390a1505050565b8151602092830120604080517fff000000000000000000000000000000000000000000000000000000000000008186015260609390931b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660218401526035830194909452605580830191909152835180830390910181526075909101909252815191012073ffffffffffffffffffffffffffffffffffffffff1690565b60006040518060400160405280600281526020017f1901000000000000000000000000000000000000000000000000000000000000815250838360405160200161020f93929190610f50565b600073ffffffffffffffffffffffffffffffffffffffff831661084d5750600061023b565b61086c8373ffffffffffffffffffffffffffffffffffffffff1661091c565b6108805761087b848484610953565b610413565b610413848484610a8d565b600080838351602085016000f5905073ffffffffffffffffffffffffffffffffffffffff811661023b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f435245415445325f4641494c4544000000000000000000000000000000000000604482015290519081900360640190fd5b6000813f801580159061023b57507fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470141592915050565b600073ffffffffffffffffffffffffffffffffffffffff83166109785750600061023b565b8151600090610988906001610be7565b905060006109968483610c5e565b60ff1660048111156109a457fe5b828552905060028160048111156109b757fe5b14156109fc576109c78685610c7a565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16149250610a80565b6003816004811115610a0a57fe5b1415610a7b57600086604051602001610a239190610f77565b604051602081830303815290604052805190602001209050610a458186610c7a565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614935050610a80565b600092505b5060010182529392505050565b600080631626ba7e60e01b8584604051602401610aab929190611117565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505090506000808573ffffffffffffffffffffffffffffffffffffffff1683604051610b329190610eb3565b600060405180830381855afa9150503d8060008114610b6d576040519150601f19603f3d011682016040523d82523d6000602084013e610b72565b606091505b5091509150818015610b85575080516020145b8015610bdc57507f1626ba7e00000000000000000000000000000000000000000000000000000000610bb8826000610d52565b7fffffffff0000000000000000000000000000000000000000000000000000000016145b979650505050505050565b600082821115610c5857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f5355425f554e444552464c4f5700000000000000000000000000000000000000604482015290519081900360640190fd5b50900390565b60008160010183511015610c7157600080fd5b50016001015190565b60008151604114610c8d57506000610228565b60208201516040830151604184015160ff167f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0821115610cd35760009350505050610228565b8060ff16601b1480610ce857508060ff16601c145b15610d465760018682858560405160008152602001604052604051610d109493929190611130565b6020604051602081039080840390855afa158015610d32573d6000803e3d6000fd5b505050602060405103519350505050610228565b60009350505050610228565b60008160040183511015610d6557600080fd5b50016020015190565b61016f8061130683390190565b803573ffffffffffffffffffffffffffffffffffffffff811681146103f157600080fd5b600060208284031215610db0578081fd5b61023b82610d7b565b60008060408385031215610dcb578081fd5b610dd483610d7b565b946020939093013593505050565b60008060408385031215610df4578182fd5b823567ffffffffffffffff811115610e0a578283fd5b83016101208186031215610dd4578283fd5b60008151808452610e348160208601602086016112d5565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60008184825b85811015610ea85773ffffffffffffffffffffffffffffffffffffffff610e9283610d7b565b1683526020928301929190910190600101610e6c565b509095945050505050565b60008251610ec58184602087016112d5565b9190910192915050565b60008351610ee18184602088016112d5565b835190830190610ef58183602088016112d5565b01949350505050565b60008451610f108184602089016112d5565b60609490941b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001691909301908152601481019190915260340192915050565b60008451610f628184602089016112d5565b91909101928352506020820152604001919050565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152601c810191909152603c0190565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff898116825260e060208084018290529083018990526000918a916101008501845b8c81101561104b578361103886610d7b565b1682529382019390820190600101611026565b50604086019a909a5250968716606084015250509284166080840152921660a082015260c001529392505050565b90815260200190565b98895273ffffffffffffffffffffffffffffffffffffffff97881660208a0152604089019690965260608801949094529185166080870152841660a086015290921660c084015260e08301919091526101008201526101200190565b94855260208501939093526040840191909152606083015273ffffffffffffffffffffffffffffffffffffffff16608082015260a00190565b6000838252604060208301526104136040830184610e1c565b93845260ff9290921660208401526040830152606082015260800190565b60006020825261023b6020830184610e1c565b60208082526012908201527f494e56414c49445f4645455f414d4f554e540000000000000000000000000000604082015260600190565b60208082526011908201527f494e56414c49445f5349474e4154555245000000000000000000000000000000604082015260600190565b6020808252600d908201527f494e56414c49445f4f574e455200000000000000000000000000000000000000604082015260600190565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261123a578283fd5b83018035915067ffffffffffffffff821115611254578283fd5b602090810192508102360382131561126b57600080fd5b9250929050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126112a6578283fd5b83018035915067ffffffffffffffff8211156112c0578283fd5b60200191503681900382131561126b57600080fd5b60005b838110156112f05781810151838201526020016112d8565b838111156112ff576000848401525b5050505056fe608060405234801561001057600080fd5b5060405161016f38038061016f8339818101604052602081101561003357600080fd5b50516001600160a01b03811661007a5760405162461bcd60e51b815260040180806020018281038252602481526020018061014b6024913960400191505060405180910390fd5b600080546001600160a01b039092166001600160a01b031990921691909117905560a2806100a96000396000f3fe6080604052600073ffffffffffffffffffffffffffffffffffffffff8154167fa619486e0000000000000000000000000000000000000000000000000000000082351415604e57808252602082f35b3682833781823684845af490503d82833e806067573d82fd5b503d81f3fea2646970667358221220676404d5a2e50e328cc18fc786619f9629ae43d7ff695286c941717f0a1541e564736f6c63430007060033496e76616c6964206d617374657220636f707920616464726573732070726f7669646564a2646970667358221220031af176f2c7f9ed4a814027955ffc95f97cc7923eee4ae25a9960c5ba61130564736f6c634300070600330000000000000000000000005fc8a17dded0a4da0f9a1e44e6c26f80aa514145

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106100885760003560e01c8063b6830d8f1161005b578063b6830d8f146100dd578063ce158612146100f0578063d70e200014610103578063d92d1f561461010b57610088565b80633644e5151461008d5780634c30d6c9146100ab5780638117abc1146100b357806390610b0e146100c8575b600080fd5b61009561011e565b6040516100a29190611079565b60405180910390f35b610095610142565b6100bb610166565b6040516100a29190610fa8565b6100d061018a565b6040516100a2919061114e565b6100956100eb366004610db9565b6101c3565b6100bb6100fe366004610db9565b61022e565b6100d0610242565b6100bb610119366004610de2565b610305565b7f44b0e1bf0ffabd0a1bf70b2f6fb3293e5e083e1faae650bb590234bf1950621f81565b7f4392cdd6c9d91e0896c5def13bad6473db5d21e2b0def85ab8c2475c3e60d14c81565b7f0000000000000000000000005fc8a17dded0a4da0f9a1e44e6c26f80aa51414581565b6040518060400160405280600f81526020017f57414c4c45545f4352454154494f4e000000000000000000000000000000000081525081565b60006040518060400160405280600f81526020017f57414c4c45545f4352454154494f4e0000000000000000000000000000000000815250838360405160200161020f93929190610efe565b6040516020818303038152906040528051906020012090505b92915050565b600061023b8383306103f6565b9392505050565b60606040518060200161025490610d6e565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f9091011660408190526102b5907f0000000000000000000000005fc8a17dded0a4da0f9a1e44e6c26f80aa51414590602001610fa8565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290526102f19291602001610ecf565b604051602081830303815290604052905090565b60008260c0013582111561034e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161034590611161565b60405180910390fd5b6103578361041b565b6103716103676020850185610d9f565b8460e00135610613565b905061022881848461062f565b6000804690507f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f8360000151805190602001208460200151805190602001208386604001516040516020016103d79594939291906110de565b604051602081830303815290604052805190602001209150505b919050565b600061041361040585856101c3565b61040d610242565b8461073d565b949350505050565b600061042a6020830183610d9f565b73ffffffffffffffffffffffffffffffffffffffff161415610478576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610345906111cf565b60007f4392cdd6c9d91e0896c5def13bad6473db5d21e2b0def85ab8c2475c3e60d14c6104a86020840184610d9f565b6104b56020850185611206565b6040516020016104c6929190610e66565b6040516020818303038152906040528051906020012084604001358560600160208101906104f49190610d9f565b61050460a0880160808901610d9f565b61051460c0890160a08a01610d9f565b8860c001358960e0013560405160200161053699989796959493929190611082565b604051602081830303815290604052805190602001209050600061057a7f44b0e1bf0ffabd0a1bf70b2f6fb3293e5e083e1faae650bb590234bf1950621f836107dc565b90506105d861058c6020850185610d9f565b61059a610100860186611272565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508694939250506108289050565b61060e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161034590611198565b505050565b600061023b61062284846101c3565b61062a610242565b61088b565b73ffffffffffffffffffffffffffffffffffffffff831663d6bb65c26106586020850185610d9f565b6106656020860186611206565b604087013561067a6080890160608a01610d9f565b61068a60a08a0160808b01610d9f565b61069a60c08b0160a08c01610d9f565b896040518963ffffffff1660e01b81526004016106be989796959493929190610ff0565b600060405180830381600087803b1580156106d857600080fd5b505af11580156106ec573d6000803e3d6000fd5b507f5b03bfed1c14a02bdeceb5fa582eb1a5765fc0bc64ca0e6af4c20afc9487f081925085915061072290506020850185610d9f565b604051610730929190610fc9565b60405180910390a1505050565b8151602092830120604080517fff000000000000000000000000000000000000000000000000000000000000008186015260609390931b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660218401526035830194909452605580830191909152835180830390910181526075909101909252815191012073ffffffffffffffffffffffffffffffffffffffff1690565b60006040518060400160405280600281526020017f1901000000000000000000000000000000000000000000000000000000000000815250838360405160200161020f93929190610f50565b600073ffffffffffffffffffffffffffffffffffffffff831661084d5750600061023b565b61086c8373ffffffffffffffffffffffffffffffffffffffff1661091c565b6108805761087b848484610953565b610413565b610413848484610a8d565b600080838351602085016000f5905073ffffffffffffffffffffffffffffffffffffffff811661023b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f435245415445325f4641494c4544000000000000000000000000000000000000604482015290519081900360640190fd5b6000813f801580159061023b57507fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470141592915050565b600073ffffffffffffffffffffffffffffffffffffffff83166109785750600061023b565b8151600090610988906001610be7565b905060006109968483610c5e565b60ff1660048111156109a457fe5b828552905060028160048111156109b757fe5b14156109fc576109c78685610c7a565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16149250610a80565b6003816004811115610a0a57fe5b1415610a7b57600086604051602001610a239190610f77565b604051602081830303815290604052805190602001209050610a458186610c7a565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614935050610a80565b600092505b5060010182529392505050565b600080631626ba7e60e01b8584604051602401610aab929190611117565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505090506000808573ffffffffffffffffffffffffffffffffffffffff1683604051610b329190610eb3565b600060405180830381855afa9150503d8060008114610b6d576040519150601f19603f3d011682016040523d82523d6000602084013e610b72565b606091505b5091509150818015610b85575080516020145b8015610bdc57507f1626ba7e00000000000000000000000000000000000000000000000000000000610bb8826000610d52565b7fffffffff0000000000000000000000000000000000000000000000000000000016145b979650505050505050565b600082821115610c5857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f5355425f554e444552464c4f5700000000000000000000000000000000000000604482015290519081900360640190fd5b50900390565b60008160010183511015610c7157600080fd5b50016001015190565b60008151604114610c8d57506000610228565b60208201516040830151604184015160ff167f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0821115610cd35760009350505050610228565b8060ff16601b1480610ce857508060ff16601c145b15610d465760018682858560405160008152602001604052604051610d109493929190611130565b6020604051602081039080840390855afa158015610d32573d6000803e3d6000fd5b505050602060405103519350505050610228565b60009350505050610228565b60008160040183511015610d6557600080fd5b50016020015190565b61016f8061130683390190565b803573ffffffffffffffffffffffffffffffffffffffff811681146103f157600080fd5b600060208284031215610db0578081fd5b61023b82610d7b565b60008060408385031215610dcb578081fd5b610dd483610d7b565b946020939093013593505050565b60008060408385031215610df4578182fd5b823567ffffffffffffffff811115610e0a578283fd5b83016101208186031215610dd4578283fd5b60008151808452610e348160208601602086016112d5565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60008184825b85811015610ea85773ffffffffffffffffffffffffffffffffffffffff610e9283610d7b565b1683526020928301929190910190600101610e6c565b509095945050505050565b60008251610ec58184602087016112d5565b9190910192915050565b60008351610ee18184602088016112d5565b835190830190610ef58183602088016112d5565b01949350505050565b60008451610f108184602089016112d5565b60609490941b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001691909301908152601481019190915260340192915050565b60008451610f628184602089016112d5565b91909101928352506020820152604001919050565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152601c810191909152603c0190565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff92831681529116602082015260400190565b73ffffffffffffffffffffffffffffffffffffffff898116825260e060208084018290529083018990526000918a916101008501845b8c81101561104b578361103886610d7b565b1682529382019390820190600101611026565b50604086019a909a5250968716606084015250509284166080840152921660a082015260c001529392505050565b90815260200190565b98895273ffffffffffffffffffffffffffffffffffffffff97881660208a0152604089019690965260608801949094529185166080870152841660a086015290921660c084015260e08301919091526101008201526101200190565b94855260208501939093526040840191909152606083015273ffffffffffffffffffffffffffffffffffffffff16608082015260a00190565b6000838252604060208301526104136040830184610e1c565b93845260ff9290921660208401526040830152606082015260800190565b60006020825261023b6020830184610e1c565b60208082526012908201527f494e56414c49445f4645455f414d4f554e540000000000000000000000000000604082015260600190565b60208082526011908201527f494e56414c49445f5349474e4154555245000000000000000000000000000000604082015260600190565b6020808252600d908201527f494e56414c49445f4f574e455200000000000000000000000000000000000000604082015260600190565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261123a578283fd5b83018035915067ffffffffffffffff821115611254578283fd5b602090810192508102360382131561126b57600080fd5b9250929050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126112a6578283fd5b83018035915067ffffffffffffffff8211156112c0578283fd5b60200191503681900382131561126b57600080fd5b60005b838110156112f05781810151838201526020016112d8565b838111156112ff576000848401525b5050505056fe608060405234801561001057600080fd5b5060405161016f38038061016f8339818101604052602081101561003357600080fd5b50516001600160a01b03811661007a5760405162461bcd60e51b815260040180806020018281038252602481526020018061014b6024913960400191505060405180910390fd5b600080546001600160a01b039092166001600160a01b031990921691909117905560a2806100a96000396000f3fe6080604052600073ffffffffffffffffffffffffffffffffffffffff8154167fa619486e0000000000000000000000000000000000000000000000000000000082351415604e57808252602082f35b3682833781823684845af490503d82833e806067573d82fd5b503d81f3fea2646970667358221220676404d5a2e50e328cc18fc786619f9629ae43d7ff695286c941717f0a1541e564736f6c63430007060033496e76616c6964206d617374657220636f707920616464726573732070726f7669646564a2646970667358221220031af176f2c7f9ed4a814027955ffc95f97cc7923eee4ae25a9960c5ba61130564736f6c63430007060033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

0000000000000000000000005fc8a17dded0a4da0f9a1e44e6c26f80aa514145

-----Decoded View---------------
Arg [0] : _walletImplementation (address): 0x5fC8A17DdED0a4dA0f9a1E44E6C26F80Aa514145

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000005fc8a17dded0a4da0f9a1e44e6c26f80aa514145


Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
[ 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.