ETH Price: $3,086.20 (-0.08%)
Gas: 5 Gwei

Contract

0x3A19d73f124151f1A4A251dfE9DBfF2332dA6C00
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Value
Set Wallet Facto...102698022020-06-15 10:38:161485 days ago1592217496IN
0x3A19d73f...332dA6C00
0 ETH0.0016245355
Set Wallet Facto...101938502020-06-03 16:19:431497 days ago1591201183IN
0x3A19d73f...332dA6C00
0 ETH0.0010337935
Set Wallet Facto...101842472020-06-02 4:35:231499 days ago1591072523IN
0x3A19d73f...332dA6C00
0 ETH0.0015587935
0x60806040101707132020-05-31 1:45:381501 days ago1590889538IN
 Create: WalletRegistryImpl
0 ETH0.0136306527

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
WalletRegistryImpl

Compiler Version
v0.6.6+commit.6c089d02

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
/**
 *Submitted for verification at Etherscan.io on 2020-06-01
*/

/**
Author: Loopring Foundation (Loopring Project Ltd)
*/

pragma solidity ^0.6.6;


contract AddressSet {
    struct Set
    {
        address[] addresses;
        mapping (address => uint) positions;
        uint count;
    }
    mapping (bytes32 => Set) private sets;

    function addAddressToSet(
        bytes32 key,
        address addr,
        bool maintainList
        ) internal
    {
        Set storage set = sets[key];
        require(set.positions[addr] == 0, "ALREADY_IN_SET");
        
        if (maintainList) {
            require(set.addresses.length == set.count, "PREVIOUSLY_NOT_MAINTAILED");
            set.addresses.push(addr);
        } else {
            require(set.addresses.length == 0, "MUST_MAINTAIN");
        }

        set.count += 1;
        set.positions[addr] = set.count;
    }

    function removeAddressFromSet(
        bytes32 key,
        address addr
        )
        internal
    {
        Set storage set = sets[key];
        uint pos = set.positions[addr];
        require(pos != 0, "NOT_IN_SET");

        delete set.positions[addr];
        set.count -= 1;

        if (set.addresses.length > 0) {
            address lastAddr = set.addresses[set.count];
            if (lastAddr != addr) {
                set.addresses[pos - 1] = lastAddr;
                set.positions[lastAddr] = pos;
            }
            set.addresses.pop();
        }
    }

    function removeSet(bytes32 key)
        internal
    {
        delete sets[key];
    }

    function isAddressInSet(
        bytes32 key,
        address addr
        )
        internal
        view
        returns (bool)
    {
        return sets[key].positions[addr] != 0;
    }

    function numAddressesInSet(bytes32 key)
        internal
        view
        returns (uint)
    {
        Set storage set = sets[key];
        return set.count;
    }

    function addressesInSet(bytes32 key)
        internal
        view
        returns (address[] memory)
    {
        Set storage set = sets[key];
        require(set.count == set.addresses.length, "NOT_MAINTAINED");
        return sets[key].addresses;
    }
}

contract Ownable {
    address public owner;

    event OwnershipTransferred(
        address indexed previousOwner,
        address indexed newOwner
    );

    
    
    constructor()
        public
    {
        owner = msg.sender;
    }

    
    modifier onlyOwner()
    {
        require(msg.sender == owner, "UNAUTHORIZED");
        _;
    }

    
    
    
    function transferOwnership(
        address newOwner
        )
        public
        virtual
        onlyOwner
    {
        require(newOwner != address(0), "ZERO_ADDRESS");
        emit OwnershipTransferred(owner, newOwner);
        owner = newOwner;
    }

    function renounceOwnership()
        public
        onlyOwner
    {
        emit OwnershipTransferred(owner, address(0));
        owner = address(0);
    }
}

contract Claimable is Ownable
{
    address public pendingOwner;

    
    modifier onlyPendingOwner() {
        require(msg.sender == pendingOwner, "UNAUTHORIZED");
        _;
    }

    
    
    function transferOwnership(
        address newOwner
        )
        public
        override
        onlyOwner
    {
        require(newOwner != address(0) && newOwner != owner, "INVALID_ADDRESS");
        pendingOwner = newOwner;
    }

    
    function claimOwnership()
        public
        onlyPendingOwner
    {
        emit OwnershipTransferred(owner, pendingOwner);
        owner = pendingOwner;
        pendingOwner = address(0);
    }
}

interface WalletRegistry {
    function registerWallet(address wallet) external;
    function isWalletRegistered(address addr) external view returns (bool);
    function numOfWallets() external view returns (uint);
}

contract WalletRegistryImpl is Claimable, AddressSet, WalletRegistry
{
    bytes32 internal constant WALLET = keccak256("__WALLET__");

    address internal factory;

    event WalletRegistered      (address indexed wallet);
    event WalletFactoryUpdated  (address indexed factory);

    modifier onlyFactory()
    {
        require(msg.sender == factory, "FACTORY_UNAUTHORIZED");
        _;
    }

    constructor() public Claimable() {}

    function setWalletFactory(address _factory)
        external
        onlyOwner
    {
        require(_factory != address(0), "ZERO_ADDRESS");
        factory = _factory;
        emit WalletFactoryUpdated(factory);
    }

    function registerWallet(address wallet)
        external
        override
        onlyFactory
    {
        addAddressToSet(WALLET, wallet, false);
        emit WalletRegistered(wallet);
    }

    function isWalletRegistered(address addr)
        public
        view
        override
        returns (bool)
    {
        return isAddressInSet(WALLET, addr);
    }

    function numOfWallets()
        public
        view
        override
        returns (uint)
    {
        return numAddressesInSet(WALLET);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"factory","type":"address"}],"name":"WalletFactoryUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"wallet","type":"address"}],"name":"WalletRegistered","type":"event"},{"inputs":[],"name":"claimOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"isWalletRegistered","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numOfWallets","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"registerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_factory","type":"address"}],"name":"setWalletFactory","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405234801561001057600080fd5b50600080546001600160a01b031916331790556107c9806100326000396000f3fe608060405234801561001057600080fd5b50600436106100935760003560e01c80637ebf879c116100665780637ebf879c146100ea5780637f247e49146101105780638da5cb5b1461014a578063e30c39781461016e578063f2fde38b1461017657610093565b80634e71e0c8146100985780634f7a6580146100a2578063715018a6146100bc578063779beedf146100c4575b600080fd5b6100a061019c565b005b6100aa61024e565b60408051918252519081900360200190f35b6100a061027e565b6100a0600480360360208110156100da57600080fd5b50356001600160a01b0316610316565b6100a06004803603602081101561010057600080fd5b50356001600160a01b03166103ce565b6101366004803603602081101561012657600080fd5b50356001600160a01b03166104b6565b604080519115158252519081900360200190f35b6101526104e8565b604080516001600160a01b039092168252519081900360200190f35b6101526104f7565b6100a06004803603602081101561018c57600080fd5b50356001600160a01b0316610506565b6001546001600160a01b031633146101ea576040805162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b604482015290519081900360640190fd5b600154600080546040516001600160a01b0393841693909116917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a360018054600080546001600160a01b03199081166001600160a01b03841617909155169055565b60408051695f5f57414c4c45545f5f60b01b8152905190819003600a019020600090610279906105df565b905090565b6000546001600160a01b031633146102cc576040805162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6003546001600160a01b0316331461036c576040805162461bcd60e51b8152602060048201526014602482015273119050d513d49657d5539055551213d49256915160621b604482015290519081900360640190fd5b60408051695f5f57414c4c45545f5f60b01b8152905190819003600a019020610397908260006105f5565b6040516001600160a01b038216907faa2be1d5cb66e5596a57cf0d001b117127b2873efd19309d4aa609784c16124890600090a250565b6000546001600160a01b0316331461041c576040805162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b604482015290519081900360640190fd5b6001600160a01b038116610466576040805162461bcd60e51b815260206004820152600c60248201526b5a45524f5f4144445245535360a01b604482015290519081900360640190fd5b600380546001600160a01b0319166001600160a01b0383811691909117918290556040519116907f276bc6b7f3a3bf51ef77c951554906c71c845188820b58292b7bbca5b010a9d190600090a250565b60408051695f5f57414c4c45545f5f60b01b8152905190819003600a0190206000906104e29083610765565b92915050565b6000546001600160a01b031681565b6001546001600160a01b031681565b6000546001600160a01b03163314610554576040805162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b604482015290519081900360640190fd5b6001600160a01b0381161580159061057a57506000546001600160a01b03828116911614155b6105bd576040805162461bcd60e51b815260206004820152600f60248201526e494e56414c49445f4144445245535360881b604482015290519081900360640190fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6000908152600260208190526040909120015490565b60008381526002602090815260408083206001600160a01b0386168452600181019092529091205415610660576040805162461bcd60e51b815260206004820152600e60248201526d1053149150511657d25397d4d15560921b604482015290519081900360640190fd5b81156106ef5760028101548154146106bf576040805162461bcd60e51b815260206004820152601960248201527f50524556494f55534c595f4e4f545f4d41494e5441494c454400000000000000604482015290519081900360640190fd5b80546001810182556000828152602090200180546001600160a01b0319166001600160a01b038516179055610733565b805415610733576040805162461bcd60e51b815260206004820152600d60248201526c26aaa9aa2fa6a0a4a72a20a4a760991b604482015290519081900360640190fd5b6002810180546001908101918290556001600160a01b0390941660009081529190930160205260409020919091555050565b60008281526002602090815260408083206001600160a01b038516845260010190915290205415159291505056fea26469706673582212203a0246414799ae695990f75b0803298596ede36834f7b6161dc8ed6b2d911cc964736f6c63430006060033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106100935760003560e01c80637ebf879c116100665780637ebf879c146100ea5780637f247e49146101105780638da5cb5b1461014a578063e30c39781461016e578063f2fde38b1461017657610093565b80634e71e0c8146100985780634f7a6580146100a2578063715018a6146100bc578063779beedf146100c4575b600080fd5b6100a061019c565b005b6100aa61024e565b60408051918252519081900360200190f35b6100a061027e565b6100a0600480360360208110156100da57600080fd5b50356001600160a01b0316610316565b6100a06004803603602081101561010057600080fd5b50356001600160a01b03166103ce565b6101366004803603602081101561012657600080fd5b50356001600160a01b03166104b6565b604080519115158252519081900360200190f35b6101526104e8565b604080516001600160a01b039092168252519081900360200190f35b6101526104f7565b6100a06004803603602081101561018c57600080fd5b50356001600160a01b0316610506565b6001546001600160a01b031633146101ea576040805162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b604482015290519081900360640190fd5b600154600080546040516001600160a01b0393841693909116917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a360018054600080546001600160a01b03199081166001600160a01b03841617909155169055565b60408051695f5f57414c4c45545f5f60b01b8152905190819003600a019020600090610279906105df565b905090565b6000546001600160a01b031633146102cc576040805162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6003546001600160a01b0316331461036c576040805162461bcd60e51b8152602060048201526014602482015273119050d513d49657d5539055551213d49256915160621b604482015290519081900360640190fd5b60408051695f5f57414c4c45545f5f60b01b8152905190819003600a019020610397908260006105f5565b6040516001600160a01b038216907faa2be1d5cb66e5596a57cf0d001b117127b2873efd19309d4aa609784c16124890600090a250565b6000546001600160a01b0316331461041c576040805162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b604482015290519081900360640190fd5b6001600160a01b038116610466576040805162461bcd60e51b815260206004820152600c60248201526b5a45524f5f4144445245535360a01b604482015290519081900360640190fd5b600380546001600160a01b0319166001600160a01b0383811691909117918290556040519116907f276bc6b7f3a3bf51ef77c951554906c71c845188820b58292b7bbca5b010a9d190600090a250565b60408051695f5f57414c4c45545f5f60b01b8152905190819003600a0190206000906104e29083610765565b92915050565b6000546001600160a01b031681565b6001546001600160a01b031681565b6000546001600160a01b03163314610554576040805162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b604482015290519081900360640190fd5b6001600160a01b0381161580159061057a57506000546001600160a01b03828116911614155b6105bd576040805162461bcd60e51b815260206004820152600f60248201526e494e56414c49445f4144445245535360881b604482015290519081900360640190fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6000908152600260208190526040909120015490565b60008381526002602090815260408083206001600160a01b0386168452600181019092529091205415610660576040805162461bcd60e51b815260206004820152600e60248201526d1053149150511657d25397d4d15560921b604482015290519081900360640190fd5b81156106ef5760028101548154146106bf576040805162461bcd60e51b815260206004820152601960248201527f50524556494f55534c595f4e4f545f4d41494e5441494c454400000000000000604482015290519081900360640190fd5b80546001810182556000828152602090200180546001600160a01b0319166001600160a01b038516179055610733565b805415610733576040805162461bcd60e51b815260206004820152600d60248201526c26aaa9aa2fa6a0a4a72a20a4a760991b604482015290519081900360640190fd5b6002810180546001908101918290556001600160a01b0390941660009081529190930160205260409020919091555050565b60008281526002602090815260408083206001600160a01b038516845260010190915290205415159291505056fea26469706673582212203a0246414799ae695990f75b0803298596ede36834f7b6161dc8ed6b2d911cc964736f6c63430006060033

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
Loading...
Loading
[ 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.