ETH Price: $2,041.23 (+0.71%)

Contract

0x4E9D7f37EADc6fef64B5F5DCcC4deB6224667677
 

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
New Account109869742020-10-04 3:32:521984 days ago1601782372IN
Nuo Network: Account Factory v2
0 ETH0.0112210832
New Account107490982020-08-28 12:17:432021 days ago1598617063IN
Nuo Network: Account Factory v2
0 ETH0.0164809747
New Account107434202020-08-27 15:34:292022 days ago1598542469IN
Nuo Network: Account Factory v2
0 ETH0.03997512114
New Account107383432020-08-26 20:32:492023 days ago1598473969IN
Nuo Network: Account Factory v2
0 ETH0.0287540382
New Account107376312020-08-26 18:02:182023 days ago1598464938IN
Nuo Network: Account Factory v2
0 ETH0.04628698132
New Account107357992020-08-26 11:25:362023 days ago1598441136IN
Nuo Network: Account Factory v2
0 ETH0.0261804678
New Account107357992020-08-26 11:25:362023 days ago1598441136IN
Nuo Network: Account Factory v2
0 ETH0.0273504678
New Account107357382020-08-26 11:14:562023 days ago1598440496IN
Nuo Network: Account Factory v2
0 ETH0.0273504678
New Account107339712020-08-26 4:42:502023 days ago1598416970IN
Nuo Network: Account Factory v2
0 ETH0.0248387674
New Account107339702020-08-26 4:42:452023 days ago1598416965IN
Nuo Network: Account Factory v2
0 ETH0.0259487674
New Account107330262020-08-26 1:18:452024 days ago1598404725IN
Nuo Network: Account Factory v2
0 ETH0.0210388260
New Account107279302020-08-25 6:19:522024 days ago1598336392IN
Nuo Network: Account Factory v2
0 ETH0.03962446113
New Account107271382020-08-25 3:18:202024 days ago1598325500IN
Nuo Network: Account Factory v2
0 ETH0.0082524483
New Account107263592020-08-25 0:17:562025 days ago1598314676IN
Nuo Network: Account Factory v2
0 ETH0.0220907663.00000123
New Account107222692020-08-24 9:33:112025 days ago1598261591IN
Nuo Network: Account Factory v2
0 ETH0.0287540382.00000134
New Account107222312020-08-24 9:25:182025 days ago1598261118IN
Nuo Network: Account Factory v2
0 ETH0.0041862278.98545454
New Account107188472020-08-23 20:44:232026 days ago1598215463IN
Nuo Network: Account Factory v2
0 ETH0.0213894661
New Account107179432020-08-23 17:28:582026 days ago1598203738IN
Nuo Network: Account Factory v2
0 ETH0.00239292
New Account107178642020-08-23 17:10:432026 days ago1598202643IN
Nuo Network: Account Factory v2
0 ETH0.0340139297
New Account107169882020-08-23 14:00:272026 days ago1598191227IN
Nuo Network: Account Factory v2
0 ETH0.0315593190
Transfer107169872020-08-23 14:00:122026 days ago1598191212IN
Nuo Network: Account Factory v2
0.01 ETH0.0018990
New Account107142162020-08-23 3:46:012026 days ago1598154361IN
Nuo Network: Account Factory v2
0 ETH0.0245461370
New Account107102562020-08-22 13:16:572027 days ago1598102217IN
Nuo Network: Account Factory v2
0 ETH0.0302093190
New Account107102502020-08-22 13:15:592027 days ago1598102159IN
Nuo Network: Account Factory v2
0 ETH0.0315593190
New Account106989962020-08-20 19:28:592029 days ago1597951739IN
Nuo Network: Account Factory v2
0 ETH0.0322606292
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Method Block
From
To
-109869742020-10-04 3:32:521984 days ago1601782372
Nuo Network: Account Factory v2
 Contract Creation0 ETH
-107490982020-08-28 12:17:432021 days ago1598617063
Nuo Network: Account Factory v2
 Contract Creation0 ETH
-107434202020-08-27 15:34:292022 days ago1598542469
Nuo Network: Account Factory v2
 Contract Creation0 ETH
-107383432020-08-26 20:32:492023 days ago1598473969
Nuo Network: Account Factory v2
 Contract Creation0 ETH
-107376312020-08-26 18:02:182023 days ago1598464938
Nuo Network: Account Factory v2
 Contract Creation0 ETH
-107357992020-08-26 11:25:362023 days ago1598441136
Nuo Network: Account Factory v2
 Contract Creation0 ETH
-107357992020-08-26 11:25:362023 days ago1598441136
Nuo Network: Account Factory v2
 Contract Creation0 ETH
-107357382020-08-26 11:14:562023 days ago1598440496
Nuo Network: Account Factory v2
 Contract Creation0 ETH
-107339712020-08-26 4:42:502023 days ago1598416970
Nuo Network: Account Factory v2
 Contract Creation0 ETH
-107339702020-08-26 4:42:452023 days ago1598416965
Nuo Network: Account Factory v2
 Contract Creation0 ETH
-107330262020-08-26 1:18:452024 days ago1598404725
Nuo Network: Account Factory v2
 Contract Creation0 ETH
-107279302020-08-25 6:19:522024 days ago1598336392
Nuo Network: Account Factory v2
 Contract Creation0 ETH
-107271382020-08-25 3:18:202024 days ago1598325500
Nuo Network: Account Factory v2
 Contract Creation0 ETH
-107263592020-08-25 0:17:562025 days ago1598314676
Nuo Network: Account Factory v2
 Contract Creation0 ETH
-107222692020-08-24 9:33:112025 days ago1598261591
Nuo Network: Account Factory v2
 Contract Creation0 ETH
-107188472020-08-23 20:44:232026 days ago1598215463
Nuo Network: Account Factory v2
 Contract Creation0 ETH
-107178642020-08-23 17:10:432026 days ago1598202643
Nuo Network: Account Factory v2
 Contract Creation0 ETH
-107169882020-08-23 14:00:272026 days ago1598191227
Nuo Network: Account Factory v2
 Contract Creation0 ETH
-107142162020-08-23 3:46:012026 days ago1598154361
Nuo Network: Account Factory v2
 Contract Creation0 ETH
-107102562020-08-22 13:16:572027 days ago1598102217
Nuo Network: Account Factory v2
 Contract Creation0 ETH
-107102502020-08-22 13:15:592027 days ago1598102159
Nuo Network: Account Factory v2
 Contract Creation0 ETH
-106989962020-08-20 19:28:592029 days ago1597951739
Nuo Network: Account Factory v2
 Contract Creation0 ETH
-106988182020-08-20 18:54:142029 days ago1597949654
Nuo Network: Account Factory v2
 Contract Creation0 ETH
-106976212020-08-20 14:36:462029 days ago1597934206
Nuo Network: Account Factory v2
 Contract Creation0 ETH
-106960562020-08-20 8:42:242029 days ago1597912944
Nuo Network: Account Factory v2
 Contract Creation0 ETH
View All Internal Transactions
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
AccountFactoryV2

Compiler Version
v0.4.24+commit.e67f0147

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
/**
 *Submitted for verification at Etherscan.io on 2019-04-17
*/

pragma solidity 0.4.24;

contract Utils {

    modifier addressValid(address _address) {
        require(_address != address(0), "Utils::_ INVALID_ADDRESS");
        _;
    }

}
contract DSMath {
    function add(uint x, uint y) internal pure returns (uint z) {
        require((z = x + y) >= x);
    }
    function sub(uint x, uint y) internal pure returns (uint z) {
        require((z = x - y) <= x);
    }
    function mul(uint x, uint y) internal pure returns (uint z) {
        require(y == 0 || (z = x * y) / y == x);
    }

    // custom : not in original DSMath, putting it here for consistency, copied from SafeMath
    function div(uint x, uint y) internal pure returns (uint z) {
        z = x / y;
    }

    function min(uint x, uint y) internal pure returns (uint z) {
        return x <= y ? x : y;
    }
    function max(uint x, uint y) internal pure returns (uint z) {
        return x >= y ? x : y;
    }
    function imin(int x, int y) internal pure returns (int z) {
        return x <= y ? x : y;
    }
    function imax(int x, int y) internal pure returns (int z) {
        return x >= y ? x : y;
    }

    uint constant WAD = 10 ** 18;
    uint constant RAY = 10 ** 27;

    function wmul(uint x, uint y) internal pure returns (uint z) {
        z = add(mul(x, y), WAD / 2) / WAD;
    }
    function rmul(uint x, uint y) internal pure returns (uint z) {
        z = add(mul(x, y), RAY / 2) / RAY;
    }
    function wdiv(uint x, uint y) internal pure returns (uint z) {
        z = add(mul(x, WAD), y / 2) / y;
    }
    function rdiv(uint x, uint y) internal pure returns (uint z) {
        z = add(mul(x, RAY), y / 2) / y;
    }

    // This famous algorithm is called "exponentiation by squaring"
    // and calculates x^n with x as fixed-point and n as regular unsigned.
    //
    // It's O(log n), instead of O(n) for naive repeated multiplication.
    //
    // These facts are why it works:
    //
    //  If n is even, then x^n = (x^2)^(n/2).
    //  If n is odd,  then x^n = x * x^(n-1),
    //   and applying the equation for even x gives
    //    x^n = x * (x^2)^((n-1) / 2).
    //
    //  Also, EVM division is flooring and
    //    floor[(n-1) / 2] = floor[n / 2].
    //
    function rpow(uint x, uint n) internal pure returns (uint z) {
        z = n % 2 != 0 ? x : RAY;

        for (n /= 2; n != 0; n /= 2) {
            x = rmul(x, x);

            if (n % 2 != 0) {
                z = rmul(z, x);
            }
        }
    }
}
contract SelfAuthorized {
    modifier authorized() {
        require(msg.sender == address(this), "Method can only be called from this contract");
        _;
    }
}
contract Proxy {

    // 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.
    address masterCopy;

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

    /// @dev Fallback function forwards all transactions and returns all received return data.
    function ()
        external
        payable
    {
        // solium-disable-next-line security/no-inline-assembly
        assembly {
            let masterCopy := and(sload(0), 0xffffffffffffffffffffffffffffffffffffffff)
            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())
        }
    }

    function implementation()
        public
        view
        returns (address)
    {
        return masterCopy;
    }

    function proxyType()
        public
        pure
        returns (uint256)
    {
        return 2;
    }
}

contract WETH9 {
    string public name     = "Wrapped Ether";
    string public symbol   = "WETH";
    uint8  public decimals = 18;

    event  Approval(address indexed _owner, address indexed _spender, uint _value);
    event  Transfer(address indexed _from, address indexed _to, uint _value);
    event  Deposit(address indexed _owner, uint _value);
    event  Withdrawal(address indexed _owner, uint _value);

    mapping (address => uint)                       public  balanceOf;
    mapping (address => mapping (address => uint))  public  allowance;

    function() public payable {
        deposit();
    }

    function deposit() public payable {
        balanceOf[msg.sender] += msg.value;
        Deposit(msg.sender, msg.value);
    }

    function withdraw(uint wad) public {
        require(balanceOf[msg.sender] >= wad);
        balanceOf[msg.sender] -= wad;
        msg.sender.transfer(wad);
        Withdrawal(msg.sender, wad);
    }

    function totalSupply() public view returns (uint) {
        return this.balance;
    }

    function approve(address guy, uint wad) public returns (bool) {
        allowance[msg.sender][guy] = wad;
        Approval(msg.sender, guy, wad);
        return true;
    }

    function transfer(address dst, uint wad) public returns (bool) {
        return transferFrom(msg.sender, dst, wad);
    }

    function transferFrom(address src, address dst, uint wad)
        public
        returns (bool)
    {
        require(balanceOf[src] >= wad);

        if (src != msg.sender && allowance[src][msg.sender] != uint(-1)) {
            require(allowance[src][msg.sender] >= wad);
            allowance[src][msg.sender] -= wad;
        }

        balanceOf[src] -= wad;
        balanceOf[dst] += wad;

        Transfer(src, dst, wad);

        return true;
    }
}

contract DSNote {
    event LogNote(
        bytes4   indexed  sig,
        address  indexed  guy,
        bytes32  indexed  foo,
        bytes32  indexed  bar,
        uint              wad,
        bytes             fax
    ) anonymous;

    modifier note {
        bytes32 foo;
        bytes32 bar;

        assembly {
            foo := calldataload(4)
            bar := calldataload(36)
        }

        emit LogNote(msg.sig, msg.sender, foo, bar, msg.value, msg.data);

        _;
    }
}
interface ERC20 {

    function name() public view returns(string);
    function symbol() public view returns(string);
    function decimals() public view returns(uint8);
    function totalSupply() public view returns (uint);

    function balanceOf(address tokenOwner) public view returns (uint balance);
    function allowance(address tokenOwner, address spender) public view returns (uint remaining);
    function transfer(address to, uint tokens) public returns (bool success);
    function approve(address spender, uint tokens) public returns (bool success);
    function transferFrom(address from, address to, uint tokens) public returns (bool success);

    event Transfer(address indexed from, address indexed to, uint tokens);
    event Approval(address indexed tokenOwner, address indexed spender, uint tokens);
}
contract DSAuthority {
    function canCall(address src, address dst, bytes4 sig) public view returns (bool);
}

contract DSAuthEvents {
    event LogSetAuthority (address indexed authority);
    event LogSetOwner     (address indexed owner);
}

contract DSAuth is DSAuthEvents {
    DSAuthority  public  authority;
    address      public  owner;

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

    function setOwner(address owner_)
        public
        auth
    {
        owner = owner_;
        emit LogSetOwner(owner);
    }

    function setAuthority(DSAuthority authority_)
        public
        auth
    {
        authority = authority_;
        emit LogSetAuthority(authority);
    }

    modifier auth {
        require(isAuthorized(msg.sender, msg.sig), "DSAuth::_ SENDER_NOT_AUTHORIZED");
        _;
    }

    function isAuthorized(address src, bytes4 sig) internal view returns (bool) {
        if (src == address(this)) {
            return true;
        } else if (src == owner) {
            return true;
        } else if (authority == DSAuthority(0)) {
            return false;
        } else {
            return authority.canCall(src, this, sig);
        }
    }
}
contract ErrorUtils {

    event LogError(string methodSig, string errMsg);
    event LogErrorWithHintBytes32(bytes32 indexed bytes32Value, string methodSig, string errMsg);
    event LogErrorWithHintAddress(address indexed addressValue, string methodSig, string errMsg);

}
contract MasterCopy is SelfAuthorized {
  // masterCopy always needs to be first declared variable, to ensure that it is at the same location as in the Proxy contract.
  // It should also always be ensured that the address is stored alone (uses a full word)
    address masterCopy;

  /// @dev Allows to upgrade the contract. This can only be done via a Safe transaction.
  /// @param _masterCopy New contract address.
    function changeMasterCopy(address _masterCopy)
        public
        authorized
    {
        // Master copy address cannot be null.
        require(_masterCopy != 0, "Invalid master copy address provided");
        masterCopy = _masterCopy;
    }
}


library ECRecovery {

    function recover(bytes32 _hash, bytes _sig)
        internal
        pure
    returns (address)
    {
        bytes32 r;
        bytes32 s;
        uint8 v;

        if (_sig.length != 65) {
            return (address(0));
        }

        assembly {
            r := mload(add(_sig, 32))
            s := mload(add(_sig, 64))
            v := byte(0, mload(add(_sig, 96)))
        }

        if (v < 27) {
            v += 27;
        }

        if (v != 27 && v != 28) {
            return (address(0));
        } else {
            return ecrecover(_hash, v, r, s);
        }
    }

    function toEthSignedMessageHash(bytes32 _hash)
        internal
        pure
    returns (bytes32)
    {
        return keccak256(
            abi.encodePacked("\x19Ethereum Signed Message:\n32", _hash)
        );
    }
}


contract Utils2 {
    using ECRecovery for bytes32;
    
    function _recoverSigner(bytes32 _hash, bytes _signature) 
        internal
        pure
        returns(address _signer)
    {
        return _hash.toEthSignedMessageHash().recover(_signature);
    }

}
contract Config is DSNote, DSAuth, Utils {

    WETH9 public weth9;
    mapping (address => bool) public isAccountHandler;
    mapping (address => bool) public isAdmin;
    address[] public admins;
    bool public disableAdminControl = false;
    
    event LogAdminAdded(address indexed _admin, address _by);
    event LogAdminRemoved(address indexed _admin, address _by);

    constructor() public {
        admins.push(msg.sender);
        isAdmin[msg.sender] = true;
    }

    modifier onlyAdmin(){
        require(isAdmin[msg.sender], "Config::_ SENDER_NOT_AUTHORIZED");
        _;
    }

    function setWETH9
    (
        address _weth9
    ) 
        public
        auth
        note
        addressValid(_weth9) 
    {
        weth9 = WETH9(_weth9);
    }

    function setAccountHandler
    (
        address _accountHandler,
        bool _isAccountHandler
    )
        public
        auth
        note
        addressValid(_accountHandler)
    {
        isAccountHandler[_accountHandler] = _isAccountHandler;
    }

    function toggleAdminsControl() 
        public
        auth
        note
    {
        disableAdminControl = !disableAdminControl;
    }

    function isAdminValid(address _admin)
        public
        view
        returns (bool)
    {
        if(disableAdminControl) {
            return true;
        } else {
            return isAdmin[_admin];
        }
    }

    function getAllAdmins()
        public
        view
        returns(address[])
    {
        return admins;
    }

    function addAdmin
    (
        address _admin
    )
        external
        note
        onlyAdmin
        addressValid(_admin)
    {   
        require(!isAdmin[_admin], "Config::addAdmin ADMIN_ALREADY_EXISTS");

        admins.push(_admin);
        isAdmin[_admin] = true;

        emit LogAdminAdded(_admin, msg.sender);
    }

    function removeAdmin
    (
        address _admin
    ) 
        external
        note
        onlyAdmin
        addressValid(_admin)
    {   
        require(isAdmin[_admin], "Config::removeAdmin ADMIN_DOES_NOT_EXIST");
        require(msg.sender != _admin, "Config::removeAdmin ADMIN_NOT_AUTHORIZED");

        isAdmin[_admin] = false;

        for (uint i = 0; i < admins.length - 1; i++) {
            if (admins[i] == _admin) {
                admins[i] = admins[admins.length - 1];
                admins.length -= 1;
                break;
            }
        }

        emit LogAdminRemoved(_admin, msg.sender);
    }
}
contract DSThing is DSNote, DSAuth, DSMath {

    function S(string s) internal pure returns (bytes4) {
        return bytes4(keccak256(s));
    }

}
contract DSStop is DSNote, DSAuth {

    bool public stopped = false;

    modifier whenNotStopped {
        require(!stopped, "DSStop::_ FEATURE_STOPPED");
        _;
    }

    modifier whenStopped {
        require(stopped, "DSStop::_ FEATURE_NOT_STOPPED");
        _;
    }

    function stop() public auth note {
        stopped = true;
    }
    function start() public auth note {
        stopped = false;
    }

}
contract Account is MasterCopy, DSNote, Utils, Utils2, ErrorUtils {

    address[] public users;
    mapping (address => bool) public isUser;
    mapping (bytes32 => bool) public actionCompleted;

    WETH9 public weth9;
    Config public config;
    bool public isInitialized = false;

    event LogTransferBySystem(address indexed token, address indexed to, uint value, address by);
    event LogTransferByUser(address indexed token, address indexed to, uint value, address by);
    event LogUserAdded(address indexed user, address by);
    event LogUserRemoved(address indexed user, address by);
    event LogImplChanged(address indexed newImpl, address indexed oldImpl);

    modifier initialized() {
        require(isInitialized, "Account::_ ACCOUNT_NOT_INITIALIZED");
        _;
    }

    modifier notInitialized() {
        require(!isInitialized, "Account::_ ACCOUNT_ALREADY_INITIALIZED");
        _;
    }

    modifier userExists(address _user) {
        require(isUser[_user], "Account::_ INVALID_USER");
        _;
    }

    modifier userDoesNotExist(address _user) {
        require(!isUser[_user], "Account::_ USER_DOES_NOT_EXISTS");
        _;
    }

    modifier onlyAdmin() {
        require(config.isAdminValid(msg.sender), "Account::_ INVALID_ADMIN_ACCOUNT");
        _;
    }

    modifier onlyHandler(){
        require(config.isAccountHandler(msg.sender), "Account::_ INVALID_ACC_HANDLER");
        _;
    }

    function init(address _user, address _config)
        public 
        notInitialized
    {
        users.push(_user);
        isUser[_user] = true;
        config = Config(_config);
        weth9 = config.weth9();
        isInitialized = true;
    }
    
    function getAllUsers() public view returns (address[]) {
        return users;
    }

    function balanceFor(address _token) public view returns (uint _balance){
        _balance = ERC20(_token).balanceOf(this);
    }
    
    function transferBySystem
    (   
        address _token,
        address _to,
        uint _value
    ) 
        external 
        onlyHandler
        note 
        initialized
    {
        require(ERC20(_token).balanceOf(this) >= _value, "Account::transferBySystem INSUFFICIENT_BALANCE_IN_ACCOUNT");
        ERC20(_token).transfer(_to, _value);

        emit LogTransferBySystem(_token, _to, _value, msg.sender);
    }
    
    function transferByUser
    (   
        address _token,
        address _to,
        uint _value,
        uint _salt,
        bytes _signature
    )
        external
        addressValid(_to)
        note
        initialized
        onlyAdmin
    {
        bytes32 actionHash = _getTransferActionHash(_token, _to, _value, _salt);

        if(actionCompleted[actionHash]) {
            emit LogError("Account::transferByUser", "ACTION_ALREADY_PERFORMED");
            return;
        }

        if(ERC20(_token).balanceOf(this) < _value){
            emit LogError("Account::transferByUser", "INSUFFICIENT_BALANCE_IN_ACCOUNT");
            return;
        }

        address signer = _recoverSigner(actionHash, _signature);

        if(!isUser[signer]) {
            emit LogError("Account::transferByUser", "SIGNER_NOT_AUTHORIZED_WITH_ACCOUNT");
            return;
        }

        actionCompleted[actionHash] = true;
        
        if (_token == address(weth9)) {
            weth9.withdraw(_value);
            _to.transfer(_value);
        } else {
            require(ERC20(_token).transfer(_to, _value), "Account::transferByUser TOKEN_TRANSFER_FAILED");
        }

        emit LogTransferByUser(_token, _to, _value, signer);
    }

    function addUser
    (
        address _user,
        uint _salt,
        bytes _signature
    )
        external 
        note 
        addressValid(_user)
        userDoesNotExist(_user)
        initialized
        onlyAdmin
    {   
        bytes32 actionHash = _getUserActionHash(_user, "ADD_USER", _salt);
        if(actionCompleted[actionHash])
        {
            emit LogError("Account::addUser", "ACTION_ALREADY_PERFORMED");
            return;
        }

        address signer = _recoverSigner(actionHash, _signature);

        if(!isUser[signer]) {
            emit LogError("Account::addUser", "SIGNER_NOT_AUTHORIZED_WITH_ACCOUNT");
            return;
        }

        actionCompleted[actionHash] = true;

        users.push(_user);
        isUser[_user] = true;

        emit LogUserAdded(_user, signer);
    }

    function removeUser
    (
        address _user,
        uint _salt,
        bytes _signature
    ) 
        external
        note
        userExists(_user) 
        initialized
        onlyAdmin
    {   
        bytes32 actionHash = _getUserActionHash(_user, "REMOVE_USER", _salt);

        if(actionCompleted[actionHash]) {
            emit LogError("Account::removeUser", "ACTION_ALREADY_PERFORMED");
            return;
        }

        address signer = _recoverSigner(actionHash, _signature);
        
        if(users.length == 1){
            emit LogError("Account::removeUser",  "ACC_SHOULD_HAVE_ATLEAST_ONE_USER");
            return;
        }
        
        if(!isUser[signer]){
            emit LogError("Account::removeUser", "SIGNER_NOT_AUTHORIZED_WITH_ACCOUNT");
            return;
        }
        
        actionCompleted[actionHash] = true;

        // should delete value from isUser map? delete isUser[_user]?
        isUser[_user] = false;
        for (uint i = 0; i < users.length - 1; i++) {
            if (users[i] == _user) {
                users[i] = users[users.length - 1];
                users.length -= 1;
                break;
            }
        }

        emit LogUserRemoved(_user, signer);
    }

    function _getTransferActionHash
    ( 
        address _token,
        address _to,
        uint _value,
        uint _salt
    ) 
        internal
        view
        returns (bytes32)
    {
        return keccak256(
            abi.encodePacked(
                address(this),
                _token,
                _to,
                _value,
                _salt
            )
        );
    }

    function _getUserActionHash
    ( 
        address _user,
        string _action,
        uint _salt
    ) 
        internal
        view
        returns (bytes32)
    {
        return keccak256(
            abi.encodePacked(
                address(this),
                _user,
                _action,
                _salt
            )
        );
    }

    // to directly send ether to contract
    function() external payable {
        require(msg.data.length == 0 && msg.value > 0, "Account::fallback INVALID_ETHER_TRANSFER");

        if(msg.sender != address(weth9)){
            weth9.deposit.value(msg.value)();
        }
    }

    function changeImpl
    (
        address _to,
        uint _salt,
        bytes _signature
    )
        external 
        note 
        addressValid(_to)
        initialized
        onlyAdmin
    {   
        bytes32 actionHash = _getUserActionHash(_to, "CHANGE_ACCOUNT_IMPLEMENTATION", _salt);
        if(actionCompleted[actionHash])
        {
            emit LogError("Account::changeImpl", "ACTION_ALREADY_PERFORMED");
            return;
        }

        address signer = _recoverSigner(actionHash, _signature);

        if(!isUser[signer]) {
            emit LogError("Account::changeImpl", "SIGNER_NOT_AUTHORIZED_WITH_ACCOUNT");
            return;
        }

        actionCompleted[actionHash] = true;

        address oldImpl = masterCopy;
        this.changeMasterCopy(_to);
        
        emit LogImplChanged(_to, oldImpl);
    }

}
contract AccountFactory is DSStop, Utils {
    Config public config;
    mapping (address => bool) public isAccount;
    mapping (address => address[]) public userToAccounts;
    address[] public accounts;

    address public accountMaster;

    constructor
    (
        Config _config, 
        address _accountMaster
    ) 
    public 
    {
        config = _config;
        accountMaster = _accountMaster;
    }

    event LogAccountCreated(address indexed user, address indexed account, address by);

    modifier onlyAdmin() {
        require(config.isAdminValid(msg.sender), "AccountFactory::_ INVALID_ADMIN_ACCOUNT");
        _;
    }

    function setConfig(Config _config) external note auth addressValid(_config) {
        config = _config;
    }

    function setAccountMaster(address _accountMaster) external note auth addressValid(_accountMaster) {
        accountMaster = _accountMaster;
    }

    function newAccount(address _user)
        public
        note
        onlyAdmin
        addressValid(config)
        addressValid(accountMaster)
        whenNotStopped
        returns 
        (
            Account _account
        ) 
    {
        address proxy = new Proxy(accountMaster);
        _account = Account(proxy);
        _account.init(_user, config);

        accounts.push(_account);
        userToAccounts[_user].push(_account);
        isAccount[_account] = true;

        emit LogAccountCreated(_user, _account, msg.sender);
    }
    
    function batchNewAccount(address[] _users) public note onlyAdmin {
        for (uint i = 0; i < _users.length; i++) {
            newAccount(_users[i]);
        }
    }

    function getAllAccounts() public view returns (address[]) {
        return accounts;
    }

    function getAccountsForUser(address _user) public view returns (address[]) {
        return userToAccounts[_user];
    }

}
contract AccountFactoryV2 is DSStop, Utils {
    Config public config;
    mapping (address => bool) public isAccountValid;
    mapping (address => address[]) public userToAccounts;
    address[] public accounts;

    address public accountMaster;
    AccountFactory accountFactoryV1;

    constructor
    (
        Config _config, 
        address _accountMaster,
        AccountFactory _accountFactoryV1
    ) 
    public 
    {
        config = _config;
        accountMaster = _accountMaster;
        accountFactoryV1 = _accountFactoryV1;
    }

    event LogAccountCreated(address indexed user, address indexed account, address by);

    modifier onlyAdmin() {
        require(config.isAdminValid(msg.sender), "AccountFactory::_ INVALID_ADMIN_ACCOUNT");
        _;
    }

    function setConfig(Config _config) external note auth addressValid(_config) {
        config = _config;
    }

    function setAccountMaster(address _accountMaster) external note auth addressValid(_accountMaster) {
        accountMaster = _accountMaster;
    }

    function setAccountFactoryV1(AccountFactory _accountFactoryV1) external note auth addressValid(_accountFactoryV1) {
        accountFactoryV1 = _accountFactoryV1;
    }


    function newAccount(address _user)
        public
        note
        addressValid(config)
        addressValid(accountMaster)
        whenNotStopped
        returns 
        (
            Account _account
        ) 
    {
        address proxy = new Proxy(accountMaster);
        _account = Account(proxy);
        _account.init(_user, config);

        accounts.push(_account);
        userToAccounts[_user].push(_account);
        isAccountValid[_account] = true;

        emit LogAccountCreated(_user, _account, msg.sender);
    }
    
    function batchNewAccount(address[] _users) external note onlyAdmin {
        for (uint i = 0; i < _users.length; i++) {
            newAccount(_users[i]);
        }
    }

    function getAllAccounts() public view returns (address[]) {
        uint accLengthV2 = accounts.length; // 1
        uint accLengthV1 = accountFactoryV1.getAllAccounts().length; // 1
        uint accLength = accLengthV2 + accLengthV1; // 2

        address[] memory accs = new address[](accLength);

        for(uint i = 0; i < accLength; i++){
            if(i < accLengthV2) { 
                accs[i] = accounts[i];
            } else {
                accs[i] = accountFactoryV1.accounts(i - accLengthV2);
            }
        }

        return accs;
    }

    function getAccountsForUser(address _user) public view returns (address[]) {
        uint userToAccLengthV2 = userToAccounts[_user].length;
        uint userToAccLengthV1 = accountFactoryV1.getAccountsForUser(_user).length;
        uint userToAccLength = userToAccLengthV2 + userToAccLengthV1;
        
        address[] memory userToAcc = new address[](userToAccLength);

        for(uint i = 0; i < userToAccLength; i++){
            if(i < userToAccLengthV2) {
                userToAcc[i] = userToAccounts[_user][i];
            } else {
                userToAcc[i] = accountFactoryV1.userToAccounts(_user, i - userToAccLengthV2);
            }
        }

        return userToAcc;
    }

    function isAccount(address _account) public view returns (bool) {
        return isAccountValid[_account] || accountFactoryV1.isAccount(_account);
    }

}

Contract Security Audit

Contract ABI

API
[{"constant":false,"inputs":[{"name":"_user","type":"address"}],"name":"newAccount","outputs":[{"name":"_account","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"stop","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getAllAccounts","outputs":[{"name":"","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"owner_","type":"address"}],"name":"setOwner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"},{"name":"","type":"uint256"}],"name":"userToAccounts","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_user","type":"address"}],"name":"getAccountsForUser","outputs":[{"name":"","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_config","type":"address"}],"name":"setConfig","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_account","type":"address"}],"name":"isAccount","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_accountMaster","type":"address"}],"name":"setAccountMaster","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"isAccountValid","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"stopped","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"config","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"authority_","type":"address"}],"name":"setAuthority","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_users","type":"address[]"}],"name":"batchNewAccount","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_accountFactoryV1","type":"address"}],"name":"setAccountFactoryV1","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"start","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"authority","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"accountMaster","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"accounts","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"name":"_config","type":"address"},{"name":"_accountMaster","type":"address"},{"name":"_accountFactoryV1","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"user","type":"address"},{"indexed":true,"name":"account","type":"address"},{"indexed":false,"name":"by","type":"address"}],"name":"LogAccountCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"authority","type":"address"}],"name":"LogSetAuthority","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"}],"name":"LogSetOwner","type":"event"},{"anonymous":true,"inputs":[{"indexed":true,"name":"sig","type":"bytes4"},{"indexed":true,"name":"guy","type":"address"},{"indexed":true,"name":"foo","type":"bytes32"},{"indexed":true,"name":"bar","type":"bytes32"},{"indexed":false,"name":"wad","type":"uint256"},{"indexed":false,"name":"fax","type":"bytes"}],"name":"LogNote","type":"event"}]

60806040526001805460a060020a60ff021916905534801561002057600080fd5b50604051606080611a2983398101604081815282516020840151919093015160018054600160a060020a0319163390811790915591929091907fce241d7ca1f669fee44b6fc00b8eba2df3bb514eed0f6f668f8f89096e81ed9490600090a260028054600160a060020a03948516600160a060020a03199182161790915560068054938516938216939093179092556007805491909316911617905561195e806100cb6000396000f3006080604052600436106101115763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166303152429811461011657806307da68f51461015357806308e93d0a1461016a57806313af4035146101cf578063169b7012146101f05780631eb9ef911461021457806320e3dbd41461023557806325ca4c9c146102565780633e0bd52e1461028b57806373a6b2be146102ac57806375f12b21146102cd57806379502c55146102e25780637a9e5e4b146102f75780638da5cb5b146103185780639996eb641461032d578063b5ca87c41461034d578063be9a65551461036e578063bf7e214f14610383578063f0a72a8414610398578063f2a40db8146103ad575b600080fd5b34801561012257600080fd5b50610137600160a060020a03600435166103c5565b60408051600160a060020a039092168252519081900360200190f35b34801561015f57600080fd5b506101686106d8565b005b34801561017657600080fd5b5061017f6107bc565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156101bb5781810151838201526020016101a3565b505050509050019250505060405180910390f35b3480156101db57600080fd5b50610168600160a060020a0360043516610a2d565b3480156101fc57600080fd5b50610137600160a060020a0360043516602435610ae4565b34801561022057600080fd5b5061017f600160a060020a0360043516610b1b565b34801561024157600080fd5b50610168600160a060020a0360043516610dae565b34801561026257600080fd5b50610277600160a060020a0360043516610edb565b604080519115158252519081900360200190f35b34801561029757600080fd5b50610168600160a060020a0360043516610f98565b3480156102b857600080fd5b50610277600160a060020a03600435166110c5565b3480156102d957600080fd5b506102776110da565b3480156102ee57600080fd5b506101376110fb565b34801561030357600080fd5b50610168600160a060020a036004351661110a565b34801561032457600080fd5b506101376111bd565b34801561033957600080fd5b5061016860048035602481019101356111cc565b34801561035957600080fd5b50610168600160a060020a0360043516611373565b34801561037a57600080fd5b506101686114a0565b34801561038f57600080fd5b5061013761156d565b3480156103a457600080fd5b5061013761157c565b3480156103b957600080fd5b5061013760043561158b565b6040805134808252602082018381523693830184905260009384936004359360243593849386933393600160e060020a03198a35169390928a929091606082018484808284376040519201829003965090945050505050a4600254600160a060020a031680151561046e576040805160e560020a62461bcd0281526020600482015260186024820152600080516020611913833981519152604482015290519081900360640190fd5b600654600160a060020a03168015156104bf576040805160e560020a62461bcd0281526020600482015260186024820152600080516020611913833981519152604482015290519081900360640190fd5b60015474010000000000000000000000000000000000000000900460ff1615610532576040805160e560020a62461bcd02815260206004820152601960248201527f445353746f703a3a5f20464541545552455f53544f5050454400000000000000604482015290519081900360640190fd5b600654600160a060020a03166105466116ba565b600160a060020a03909116815260405190819003602001906000f080158015610573573d6000803e3d6000fd5b50600254604080517ff09a4016000000000000000000000000000000000000000000000000000000008152600160a060020a038b81166004830152928316602482015290519298508897509087169163f09a40169160448082019260009290919082900301818387803b1580156105e957600080fd5b505af11580156105fd573d6000803e3d6000fd5b50506005805460018181019092557f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db0018054600160a060020a03808c1673ffffffffffffffffffffffffffffffffffffffff1992831681179093558c1660008181526004602090815260408083208054808901825590845282842001805490951686179094558482526003815290839020805460ff19169095179094558151338152915192955093507eef0c4d7ce8d09e55441711e41dc8f1a6abbe3313f4369ea8094dbf0b7b182092908290030190a35050505050919050565b6106ee33600035600160e060020a0319166115b3565b1515610732576040805160e560020a62461bcd02815260206004820152601f60248201526000805160206118f3833981519152604482015290519081900360640190fd5b60408051348082526020820183815236938301849052600435936024359384938693339360008035600160e060020a031916949092606082018484808284376040519201829003965090945050505050a450506001805474ff0000000000000000000000000000000000000000191674010000000000000000000000000000000000000000179055565b60606000806000606060006005805490509450600760009054906101000a9004600160a060020a0316600160a060020a03166308e93d0a6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401600060405180830381600087803b15801561083b57600080fd5b505af115801561084f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561087857600080fd5b81019080805164010000000081111561089057600080fd5b820160208101848111156108a357600080fd5b81518560208202830111640100000000821117156108c057600080fd5b50509291905050505193508385019250826040519080825280602002602001820160405280156108fa578160200160208202803883390190505b509150600090505b82811015610a24578481101561096257600580548290811061092057fe5b6000918252602090912001548251600160a060020a039091169083908390811061094657fe5b600160a060020a03909216602092830290910190910152610a1c565b600754604080517ff2a40db800000000000000000000000000000000000000000000000000000000815287840360048201529051600160a060020a039092169163f2a40db8916024808201926020929091908290030181600087803b1580156109ca57600080fd5b505af11580156109de573d6000803e3d6000fd5b505050506040513d60208110156109f457600080fd5b50518251839083908110610a0457fe5b600160a060020a039092166020928302909101909101525b600101610902565b50949350505050565b610a4333600035600160e060020a0319166115b3565b1515610a87576040805160e560020a62461bcd02815260206004820152601f60248201526000805160206118f3833981519152604482015290519081900360640190fd5b6001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383811691909117918290556040519116907fce241d7ca1f669fee44b6fc00b8eba2df3bb514eed0f6f668f8f89096e81ed9490600090a250565b600460205281600052604060002081815481101515610aff57fe5b600091825260209091200154600160a060020a03169150829050565b600160a060020a0380821660008181526004602081905260408083205460075482517f1eb9ef910000000000000000000000000000000000000000000000000000000081529384019590955290516060959194849387938593921691631eb9ef9191602480820192869290919082900301818387803b158015610b9d57600080fd5b505af1158015610bb1573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015610bda57600080fd5b810190808051640100000000811115610bf257600080fd5b82016020810184811115610c0557600080fd5b8151856020820283011164010000000082111715610c2257600080fd5b5050929190505050519350838501925082604051908082528060200260200182016040528015610c5c578160200160208202803883390190505b509150600090505b82811015610da45784811015610cda57600160a060020a0387166000908152600460205260409020805482908110610c9857fe5b6000918252602090912001548251600160a060020a0390911690839083908110610cbe57fe5b600160a060020a03909216602092830290910190910152610d9c565b600754604080517f169b7012000000000000000000000000000000000000000000000000000000008152600160a060020a038a8116600483015288850360248301529151919092169163169b70129160448083019260209291908290030181600087803b158015610d4a57600080fd5b505af1158015610d5e573d6000803e3d6000fd5b505050506040513d6020811015610d7457600080fd5b50518251839083908110610d8457fe5b600160a060020a039092166020928302909101909101525b600101610c64565b5095945050505050565b60408051348082526020820183815236938301849052600435936024359384938693339360008035600160e060020a031916949092606082018484808284376040519201829003965090945050505050a4610e1533600035600160e060020a0319166115b3565b1515610e59576040805160e560020a62461bcd02815260206004820152601f60248201526000805160206118f3833981519152604482015290519081900360640190fd5b82600160a060020a0381161515610ea8576040805160e560020a62461bcd0281526020600482015260186024820152600080516020611913833981519152604482015290519081900360640190fd5b50506002805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03939093169290921790915550565b600160a060020a03811660009081526003602052604081205460ff1680610f925750600754604080517f25ca4c9c000000000000000000000000000000000000000000000000000000008152600160a060020a038581166004830152915191909216916325ca4c9c9160248083019260209291908290030181600087803b158015610f6557600080fd5b505af1158015610f79573d6000803e3d6000fd5b505050506040513d6020811015610f8f57600080fd5b50515b92915050565b60408051348082526020820183815236938301849052600435936024359384938693339360008035600160e060020a031916949092606082018484808284376040519201829003965090945050505050a4610fff33600035600160e060020a0319166115b3565b1515611043576040805160e560020a62461bcd02815260206004820152601f60248201526000805160206118f3833981519152604482015290519081900360640190fd5b82600160a060020a0381161515611092576040805160e560020a62461bcd0281526020600482015260186024820152600080516020611913833981519152604482015290519081900360640190fd5b50506006805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03939093169290921790915550565b60036020526000908152604090205460ff1681565b60015474010000000000000000000000000000000000000000900460ff1681565b600254600160a060020a031681565b61112033600035600160e060020a0319166115b3565b1515611164576040805160e560020a62461bcd02815260206004820152601f60248201526000805160206118f3833981519152604482015290519081900360640190fd5b6000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03838116919091178083556040519116917f1abebea81bfa2637f28358c371278fb15ede7ea8dd28d2e03b112ff6d936ada491a250565b600154600160a060020a031681565b604080513480825260208201838152369383018490526000936004359360243593849386933393600160e060020a03198a351693928a929190606082018484808284376040519201829003965090945050505050a4600254604080517f9c14ee290000000000000000000000000000000000000000000000000000000081523360048201529051600160a060020a0390921691639c14ee29916024808201926020929091908290030181600087803b15801561128757600080fd5b505af115801561129b573d6000803e3d6000fd5b505050506040513d60208110156112b157600080fd5b5051151561132f576040805160e560020a62461bcd02815260206004820152602760248201527f4163636f756e74466163746f72793a3a5f20494e56414c49445f41444d494e5f60448201527f4143434f554e5400000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600092505b8383101561136c5761136085858581811061134b57fe5b90506020020135600160a060020a03166103c5565b50600190920191611334565b5050505050565b60408051348082526020820183815236938301849052600435936024359384938693339360008035600160e060020a031916949092606082018484808284376040519201829003965090945050505050a46113da33600035600160e060020a0319166115b3565b151561141e576040805160e560020a62461bcd02815260206004820152601f60248201526000805160206118f3833981519152604482015290519081900360640190fd5b82600160a060020a038116151561146d576040805160e560020a62461bcd0281526020600482015260186024820152600080516020611913833981519152604482015290519081900360640190fd5b50506007805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03939093169290921790915550565b6114b633600035600160e060020a0319166115b3565b15156114fa576040805160e560020a62461bcd02815260206004820152601f60248201526000805160206118f3833981519152604482015290519081900360640190fd5b60408051348082526020820183815236938301849052600435936024359384938693339360008035600160e060020a031916949092606082018484808284376040519201829003965090945050505050a450506001805474ff000000000000000000000000000000000000000019169055565b600054600160a060020a031681565b600654600160a060020a031681565b600580548290811061159957fe5b600091825260209091200154600160a060020a0316905081565b6000600160a060020a0383163014156115ce57506001610f92565b600154600160a060020a03848116911614156115ec57506001610f92565b600054600160a060020a0316151561160657506000610f92565b60008054604080517fb7009613000000000000000000000000000000000000000000000000000000008152600160a060020a038781166004830152306024830152600160e060020a0319871660448301529151919092169263b700961392606480820193602093909283900390910190829087803b15801561168757600080fd5b505af115801561169b573d6000803e3d6000fd5b505050506040513d60208110156116b157600080fd5b50519392505050565b604051610228806116cb833901905600608060405234801561001057600080fd5b506040516020806102288339810160405251600160a060020a03811615156100be57604080517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f496e76616c6964206d617374657220636f707920616464726573732070726f7660448201527f6964656400000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b60008054600160a060020a03909216600160a060020a031990921691909117905561013a806100ee6000396000f30060806040526004361061004b5763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416634555d5c981146100885780635c60da1b146100af575b73ffffffffffffffffffffffffffffffffffffffff600054163660008037600080366000845af43d6000803e801515610083573d6000fd5b3d6000f35b34801561009457600080fd5b5061009d6100ed565b60408051918252519081900360200190f35b3480156100bb57600080fd5b506100c46100f2565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b600290565b60005473ffffffffffffffffffffffffffffffffffffffff16905600a165627a7a7230582000e8963a53396a420e260d6762a2b264be1db09b89fce92475fadd0600ddeffb00294453417574683a3a5f2053454e4445525f4e4f545f415554484f52495a4544005574696c733a3a5f20494e56414c49445f414444524553530000000000000000a165627a7a723058201fb993aeaba6d09f9605692ef881a60e2e4a0fb7b7af403218fbf79cad1092310029000000000000000000000000431f429035a1e3059d5c6a9a83208c6d3143d92500000000000000000000000078b37409628e10df0b661c6b205b872a4df8dd6e000000000000000000000000f5a38fbc26c720c79350b99d9c0bd42b3e9b8316

Deployed Bytecode

0x6080604052600436106101115763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166303152429811461011657806307da68f51461015357806308e93d0a1461016a57806313af4035146101cf578063169b7012146101f05780631eb9ef911461021457806320e3dbd41461023557806325ca4c9c146102565780633e0bd52e1461028b57806373a6b2be146102ac57806375f12b21146102cd57806379502c55146102e25780637a9e5e4b146102f75780638da5cb5b146103185780639996eb641461032d578063b5ca87c41461034d578063be9a65551461036e578063bf7e214f14610383578063f0a72a8414610398578063f2a40db8146103ad575b600080fd5b34801561012257600080fd5b50610137600160a060020a03600435166103c5565b60408051600160a060020a039092168252519081900360200190f35b34801561015f57600080fd5b506101686106d8565b005b34801561017657600080fd5b5061017f6107bc565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156101bb5781810151838201526020016101a3565b505050509050019250505060405180910390f35b3480156101db57600080fd5b50610168600160a060020a0360043516610a2d565b3480156101fc57600080fd5b50610137600160a060020a0360043516602435610ae4565b34801561022057600080fd5b5061017f600160a060020a0360043516610b1b565b34801561024157600080fd5b50610168600160a060020a0360043516610dae565b34801561026257600080fd5b50610277600160a060020a0360043516610edb565b604080519115158252519081900360200190f35b34801561029757600080fd5b50610168600160a060020a0360043516610f98565b3480156102b857600080fd5b50610277600160a060020a03600435166110c5565b3480156102d957600080fd5b506102776110da565b3480156102ee57600080fd5b506101376110fb565b34801561030357600080fd5b50610168600160a060020a036004351661110a565b34801561032457600080fd5b506101376111bd565b34801561033957600080fd5b5061016860048035602481019101356111cc565b34801561035957600080fd5b50610168600160a060020a0360043516611373565b34801561037a57600080fd5b506101686114a0565b34801561038f57600080fd5b5061013761156d565b3480156103a457600080fd5b5061013761157c565b3480156103b957600080fd5b5061013760043561158b565b6040805134808252602082018381523693830184905260009384936004359360243593849386933393600160e060020a03198a35169390928a929091606082018484808284376040519201829003965090945050505050a4600254600160a060020a031680151561046e576040805160e560020a62461bcd0281526020600482015260186024820152600080516020611913833981519152604482015290519081900360640190fd5b600654600160a060020a03168015156104bf576040805160e560020a62461bcd0281526020600482015260186024820152600080516020611913833981519152604482015290519081900360640190fd5b60015474010000000000000000000000000000000000000000900460ff1615610532576040805160e560020a62461bcd02815260206004820152601960248201527f445353746f703a3a5f20464541545552455f53544f5050454400000000000000604482015290519081900360640190fd5b600654600160a060020a03166105466116ba565b600160a060020a03909116815260405190819003602001906000f080158015610573573d6000803e3d6000fd5b50600254604080517ff09a4016000000000000000000000000000000000000000000000000000000008152600160a060020a038b81166004830152928316602482015290519298508897509087169163f09a40169160448082019260009290919082900301818387803b1580156105e957600080fd5b505af11580156105fd573d6000803e3d6000fd5b50506005805460018181019092557f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db0018054600160a060020a03808c1673ffffffffffffffffffffffffffffffffffffffff1992831681179093558c1660008181526004602090815260408083208054808901825590845282842001805490951686179094558482526003815290839020805460ff19169095179094558151338152915192955093507eef0c4d7ce8d09e55441711e41dc8f1a6abbe3313f4369ea8094dbf0b7b182092908290030190a35050505050919050565b6106ee33600035600160e060020a0319166115b3565b1515610732576040805160e560020a62461bcd02815260206004820152601f60248201526000805160206118f3833981519152604482015290519081900360640190fd5b60408051348082526020820183815236938301849052600435936024359384938693339360008035600160e060020a031916949092606082018484808284376040519201829003965090945050505050a450506001805474ff0000000000000000000000000000000000000000191674010000000000000000000000000000000000000000179055565b60606000806000606060006005805490509450600760009054906101000a9004600160a060020a0316600160a060020a03166308e93d0a6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401600060405180830381600087803b15801561083b57600080fd5b505af115801561084f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561087857600080fd5b81019080805164010000000081111561089057600080fd5b820160208101848111156108a357600080fd5b81518560208202830111640100000000821117156108c057600080fd5b50509291905050505193508385019250826040519080825280602002602001820160405280156108fa578160200160208202803883390190505b509150600090505b82811015610a24578481101561096257600580548290811061092057fe5b6000918252602090912001548251600160a060020a039091169083908390811061094657fe5b600160a060020a03909216602092830290910190910152610a1c565b600754604080517ff2a40db800000000000000000000000000000000000000000000000000000000815287840360048201529051600160a060020a039092169163f2a40db8916024808201926020929091908290030181600087803b1580156109ca57600080fd5b505af11580156109de573d6000803e3d6000fd5b505050506040513d60208110156109f457600080fd5b50518251839083908110610a0457fe5b600160a060020a039092166020928302909101909101525b600101610902565b50949350505050565b610a4333600035600160e060020a0319166115b3565b1515610a87576040805160e560020a62461bcd02815260206004820152601f60248201526000805160206118f3833981519152604482015290519081900360640190fd5b6001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383811691909117918290556040519116907fce241d7ca1f669fee44b6fc00b8eba2df3bb514eed0f6f668f8f89096e81ed9490600090a250565b600460205281600052604060002081815481101515610aff57fe5b600091825260209091200154600160a060020a03169150829050565b600160a060020a0380821660008181526004602081905260408083205460075482517f1eb9ef910000000000000000000000000000000000000000000000000000000081529384019590955290516060959194849387938593921691631eb9ef9191602480820192869290919082900301818387803b158015610b9d57600080fd5b505af1158015610bb1573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015610bda57600080fd5b810190808051640100000000811115610bf257600080fd5b82016020810184811115610c0557600080fd5b8151856020820283011164010000000082111715610c2257600080fd5b5050929190505050519350838501925082604051908082528060200260200182016040528015610c5c578160200160208202803883390190505b509150600090505b82811015610da45784811015610cda57600160a060020a0387166000908152600460205260409020805482908110610c9857fe5b6000918252602090912001548251600160a060020a0390911690839083908110610cbe57fe5b600160a060020a03909216602092830290910190910152610d9c565b600754604080517f169b7012000000000000000000000000000000000000000000000000000000008152600160a060020a038a8116600483015288850360248301529151919092169163169b70129160448083019260209291908290030181600087803b158015610d4a57600080fd5b505af1158015610d5e573d6000803e3d6000fd5b505050506040513d6020811015610d7457600080fd5b50518251839083908110610d8457fe5b600160a060020a039092166020928302909101909101525b600101610c64565b5095945050505050565b60408051348082526020820183815236938301849052600435936024359384938693339360008035600160e060020a031916949092606082018484808284376040519201829003965090945050505050a4610e1533600035600160e060020a0319166115b3565b1515610e59576040805160e560020a62461bcd02815260206004820152601f60248201526000805160206118f3833981519152604482015290519081900360640190fd5b82600160a060020a0381161515610ea8576040805160e560020a62461bcd0281526020600482015260186024820152600080516020611913833981519152604482015290519081900360640190fd5b50506002805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03939093169290921790915550565b600160a060020a03811660009081526003602052604081205460ff1680610f925750600754604080517f25ca4c9c000000000000000000000000000000000000000000000000000000008152600160a060020a038581166004830152915191909216916325ca4c9c9160248083019260209291908290030181600087803b158015610f6557600080fd5b505af1158015610f79573d6000803e3d6000fd5b505050506040513d6020811015610f8f57600080fd5b50515b92915050565b60408051348082526020820183815236938301849052600435936024359384938693339360008035600160e060020a031916949092606082018484808284376040519201829003965090945050505050a4610fff33600035600160e060020a0319166115b3565b1515611043576040805160e560020a62461bcd02815260206004820152601f60248201526000805160206118f3833981519152604482015290519081900360640190fd5b82600160a060020a0381161515611092576040805160e560020a62461bcd0281526020600482015260186024820152600080516020611913833981519152604482015290519081900360640190fd5b50506006805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03939093169290921790915550565b60036020526000908152604090205460ff1681565b60015474010000000000000000000000000000000000000000900460ff1681565b600254600160a060020a031681565b61112033600035600160e060020a0319166115b3565b1515611164576040805160e560020a62461bcd02815260206004820152601f60248201526000805160206118f3833981519152604482015290519081900360640190fd5b6000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03838116919091178083556040519116917f1abebea81bfa2637f28358c371278fb15ede7ea8dd28d2e03b112ff6d936ada491a250565b600154600160a060020a031681565b604080513480825260208201838152369383018490526000936004359360243593849386933393600160e060020a03198a351693928a929190606082018484808284376040519201829003965090945050505050a4600254604080517f9c14ee290000000000000000000000000000000000000000000000000000000081523360048201529051600160a060020a0390921691639c14ee29916024808201926020929091908290030181600087803b15801561128757600080fd5b505af115801561129b573d6000803e3d6000fd5b505050506040513d60208110156112b157600080fd5b5051151561132f576040805160e560020a62461bcd02815260206004820152602760248201527f4163636f756e74466163746f72793a3a5f20494e56414c49445f41444d494e5f60448201527f4143434f554e5400000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600092505b8383101561136c5761136085858581811061134b57fe5b90506020020135600160a060020a03166103c5565b50600190920191611334565b5050505050565b60408051348082526020820183815236938301849052600435936024359384938693339360008035600160e060020a031916949092606082018484808284376040519201829003965090945050505050a46113da33600035600160e060020a0319166115b3565b151561141e576040805160e560020a62461bcd02815260206004820152601f60248201526000805160206118f3833981519152604482015290519081900360640190fd5b82600160a060020a038116151561146d576040805160e560020a62461bcd0281526020600482015260186024820152600080516020611913833981519152604482015290519081900360640190fd5b50506007805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03939093169290921790915550565b6114b633600035600160e060020a0319166115b3565b15156114fa576040805160e560020a62461bcd02815260206004820152601f60248201526000805160206118f3833981519152604482015290519081900360640190fd5b60408051348082526020820183815236938301849052600435936024359384938693339360008035600160e060020a031916949092606082018484808284376040519201829003965090945050505050a450506001805474ff000000000000000000000000000000000000000019169055565b600054600160a060020a031681565b600654600160a060020a031681565b600580548290811061159957fe5b600091825260209091200154600160a060020a0316905081565b6000600160a060020a0383163014156115ce57506001610f92565b600154600160a060020a03848116911614156115ec57506001610f92565b600054600160a060020a0316151561160657506000610f92565b60008054604080517fb7009613000000000000000000000000000000000000000000000000000000008152600160a060020a038781166004830152306024830152600160e060020a0319871660448301529151919092169263b700961392606480820193602093909283900390910190829087803b15801561168757600080fd5b505af115801561169b573d6000803e3d6000fd5b505050506040513d60208110156116b157600080fd5b50519392505050565b604051610228806116cb833901905600608060405234801561001057600080fd5b506040516020806102288339810160405251600160a060020a03811615156100be57604080517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f496e76616c6964206d617374657220636f707920616464726573732070726f7660448201527f6964656400000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b60008054600160a060020a03909216600160a060020a031990921691909117905561013a806100ee6000396000f30060806040526004361061004b5763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416634555d5c981146100885780635c60da1b146100af575b73ffffffffffffffffffffffffffffffffffffffff600054163660008037600080366000845af43d6000803e801515610083573d6000fd5b3d6000f35b34801561009457600080fd5b5061009d6100ed565b60408051918252519081900360200190f35b3480156100bb57600080fd5b506100c46100f2565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b600290565b60005473ffffffffffffffffffffffffffffffffffffffff16905600a165627a7a7230582000e8963a53396a420e260d6762a2b264be1db09b89fce92475fadd0600ddeffb00294453417574683a3a5f2053454e4445525f4e4f545f415554484f52495a4544005574696c733a3a5f20494e56414c49445f414444524553530000000000000000a165627a7a723058201fb993aeaba6d09f9605692ef881a60e2e4a0fb7b7af403218fbf79cad1092310029

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

000000000000000000000000431f429035a1e3059d5c6a9a83208c6d3143d92500000000000000000000000078b37409628e10df0b661c6b205b872a4df8dd6e000000000000000000000000f5a38fbc26c720c79350b99d9c0bd42b3e9b8316

-----Decoded View---------------
Arg [0] : _config (address): 0x431F429035a1e3059d5c6a9a83208c6D3143D925
Arg [1] : _accountMaster (address): 0x78B37409628e10df0B661C6B205B872a4DF8DD6E
Arg [2] : _accountFactoryV1 (address): 0xF5A38FBc26c720C79350B99d9C0Bd42b3E9B8316

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 000000000000000000000000431f429035a1e3059d5c6a9a83208c6d3143d925
Arg [1] : 00000000000000000000000078b37409628e10df0b661c6b205b872a4df8dd6e
Arg [2] : 000000000000000000000000f5a38fbc26c720c79350b99d9c0bd42b3e9b8316


Swarm Source

bzzr://1fb993aeaba6d09f9605692ef881a60e2e4a0fb7b7af403218fbf79cad109231

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