ETH Price: $3,105.87 (+0.07%)

Contract

0xbFc586A34128D14ECf29d1aAEB71E08AAE5827CC
 

Overview

ETH Balance

0.095204863369883581 ETH

Eth Value

$295.69 (@ $3,105.87/ETH)

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Proxy Assert57293212018-06-04 6:19:552358 days ago1528093195IN
0xbFc586A3...AAE5827CC
0 ETH0.000701779.5
Proxy Assert57219542018-06-02 22:51:072360 days ago1527979867IN
0xbFc586A3...AAE5827CC
0 ETH0.0005623511
Proxy57219442018-06-02 22:48:152360 days ago1527979695IN
0xbFc586A3...AAE5827CC
0 ETH0.0004101711
Proxy57219312018-06-02 22:44:362360 days ago1527979476IN
0xbFc586A3...AAE5827CC
0 ETH0.0004115811
Transfer57219262018-06-02 22:43:232360 days ago1527979403IN
0xbFc586A3...AAE5827CC
0.01 ETH0.0002254510
Proxy Assert52334722018-03-11 1:38:192444 days ago1520732299IN
0xbFc586A3...AAE5827CC
0 ETH0.000119214.1
Proxy Assert52334712018-03-11 1:38:172444 days ago1520732297IN
0xbFc586A3...AAE5827CC
0 ETH0.000051081
Proxy Assert52214992018-03-09 0:53:182446 days ago1520556798IN
0xbFc586A3...AAE5827CC
0 ETH0.000147742
Proxy Assert51760142018-03-01 7:43:212453 days ago1519890201IN
0xbFc586A3...AAE5827CC
0 ETH0.000221613
Proxy Assert51672112018-02-27 19:46:062455 days ago1519760766IN
0xbFc586A3...AAE5827CC
0 ETH0.0001664

Latest 4 internal transactions

Advanced mode:
Parent Transaction Hash Block From To
132848572021-09-23 23:08:291151 days ago1632438509
0xbFc586A3...AAE5827CC
0.08720486 ETH
57219542018-06-02 22:51:072360 days ago1527979867
0xbFc586A3...AAE5827CC
0.001 ETH
57219542018-06-02 22:51:072360 days ago1527979867
0xbFc586A3...AAE5827CC
0.001 ETH
51218462018-02-20 1:52:002463 days ago1519091520  Contract Creation0 ETH
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
AuthenticatedProxy

Compiler Version
v0.4.18+commit.9cf6e910

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
/**
 *Submitted for verification at Etherscan.io on 2018-02-21
*/

pragma solidity ^0.4.13;

contract Ownable {
  address public owner;


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


  /**
   * @dev The Ownable constructor sets the original `owner` of the contract to the sender
   * account.
   */
  function Ownable() public {
    owner = msg.sender;
  }


  /**
   * @dev Throws if called by any account other than the owner.
   */
  modifier onlyOwner() {
    require(msg.sender == owner);
    _;
  }


  /**
   * @dev Allows the current owner to transfer control of the contract to a newOwner.
   * @param newOwner The address to transfer ownership to.
   */
  function transferOwnership(address newOwner) public onlyOwner {
    require(newOwner != address(0));
    OwnershipTransferred(owner, newOwner);
    owner = newOwner;
  }

}

contract ERC20Basic {
  uint256 public totalSupply;
  function balanceOf(address who) public view returns (uint256);
  function transfer(address to, uint256 value) public returns (bool);
  event Transfer(address indexed from, address indexed to, uint256 value);
}

contract ERC20 is ERC20Basic {
  function allowance(address owner, address spender) public view returns (uint256);
  function transferFrom(address from, address to, uint256 value) public returns (bool);
  function approve(address spender, uint256 value) public returns (bool);
  event Approval(address indexed owner, address indexed spender, uint256 value);
}

contract TokenRecipient {
    event ReceivedEther(address indexed sender, uint amount);
    event ReceivedTokens(address indexed from, uint256 value, address indexed token, bytes extraData);

    /**
     * @dev Receive tokens and generate a log event
     * @param from Address from which to transfer tokens
     * @param value Amount of tokens to transfer
     * @param token Address of token
     * @param extraData Additional data to log
     */
    function receiveApproval(address from, uint256 value, address token, bytes extraData) public {
        ERC20 t = ERC20(token);
        require(t.transferFrom(from, this, value));
        ReceivedTokens(from, value, token, extraData);
    }

    /**
     * @dev Receive Ether and generate a log event
     */
    function () payable public {
        ReceivedEther(msg.sender, msg.value);
    }
}

contract AuthenticatedProxy is TokenRecipient {

    /* Address which owns this proxy. */
    address public user;

    /* Associated registry with contract authentication information. */
    ProxyRegistry public registry;

    /* Whether access has been revoked. */
    bool public revoked;

    /* Delegate call could be used to atomically transfer multiple assets owned by the proxy contract with one order. */
    enum HowToCall { Call, DelegateCall }

    /* Event fired when the proxy access is revoked or unrevoked. */
    event Revoked(bool revoked);

    /**
     * Create an AuthenticatedProxy
     *
     * @param addrUser Address of user on whose behalf this proxy will act
     * @param addrRegistry Address of ProxyRegistry contract which will manage this proxy
     */
    function AuthenticatedProxy(address addrUser, ProxyRegistry addrRegistry) public {
        user = addrUser;
        registry = addrRegistry;
    }

    /**
     * Set the revoked flag (allows a user to revoke ProxyRegistry access)
     *
     * @dev Can be called by the user only
     * @param revoke Whether or not to revoke access
     */
    function setRevoke(bool revoke)
        public
    {
        require(msg.sender == user);
        revoked = revoke;
        Revoked(revoke);
    }

    /**
     * Execute a message call from the proxy contract
     *
     * @dev Can be called by the user, or by a contract authorized by the registry as long as the user has not revoked access
     * @param dest Address to which the call will be sent
     * @param howToCall Which kind of call to make
     * @param calldata Calldata to send
     * @return Result of the call (success or failure)
     */
    function proxy(address dest, HowToCall howToCall, bytes calldata)
        public
        returns (bool result)
    {
        require(msg.sender == user || (!revoked && registry.contracts(msg.sender)));
        if (howToCall == HowToCall.Call) {
            result = dest.call(calldata);
        } else if (howToCall == HowToCall.DelegateCall) {
            result = dest.delegatecall(calldata);
        }
        return result;
    }

    /**
     * Execute a message call and assert success
     * 
     * @dev Same functionality as `proxy`, just asserts the return value
     * @param dest Address to which the call will be sent
     * @param howToCall What kind of call to make
     * @param calldata Calldata to send
     */
    function proxyAssert(address dest, HowToCall howToCall, bytes calldata)
        public
    {
        require(proxy(dest, howToCall, calldata));
    }

}

contract ProxyRegistry is Ownable {

    /* Authenticated proxies by user. */
    mapping(address => AuthenticatedProxy) public proxies;

    /* Contracts pending access. */
    mapping(address => uint) public pending;

    /* Contracts allowed to call those proxies. */
    mapping(address => bool) public contracts;

    /* Delay period for adding an authenticated contract.
       This mitigates a particular class of potential attack on the Wyvern DAO (which owns this registry) - if at any point the value of assets held by proxy contracts exceeded the value of half the WYV supply (votes in the DAO),
       a malicious but rational attacker could buy half the Wyvern and grant themselves access to all the proxy contracts. A delay period renders this attack nonthreatening - given two weeks, if that happened, users would have
       plenty of time to notice and transfer their assets.
    */
    uint public DELAY_PERIOD = 2 weeks;

    /**
     * Start the process to enable access for specified contract. Subject to delay period.
     *
     * @dev ProxyRegistry owner only
     * @param addr Address to which to grant permissions
     */
    function startGrantAuthentication (address addr)
        public
        onlyOwner
    {
        require(!contracts[addr] && pending[addr] == 0);
        pending[addr] = now;
    }

    /**
     * End the process to nable access for specified contract after delay period has passed.
     *
     * @dev ProxyRegistry owner only
     * @param addr Address to which to grant permissions
     */
    function endGrantAuthentication (address addr)
        public
        onlyOwner
    {
        require(!contracts[addr] && pending[addr] != 0 && ((pending[addr] + DELAY_PERIOD) < now));
        pending[addr] = 0;
        contracts[addr] = true;
    }

    /**
     * Revoke access for specified contract. Can be done instantly.
     *
     * @dev ProxyRegistry owner only
     * @param addr Address of which to revoke permissions
     */    
    function revokeAuthentication (address addr)
        public
        onlyOwner
    {
        contracts[addr] = false;
    }

    /**
     * Register a proxy contract with this registry
     *
     * @dev Must be called by the user which the proxy is for, creates a new AuthenticatedProxy
     * @return New AuthenticatedProxy contract
     */
    function registerProxy()
        public
        returns (AuthenticatedProxy proxy)
    {
        require(proxies[msg.sender] == address(0));
        proxy = new AuthenticatedProxy(msg.sender, this);
        proxies[msg.sender] = proxy;
        return proxy;
    }

}

contract WyvernProxyRegistry is ProxyRegistry {

    string public constant name = "Project Wyvern Proxy Registry";

    /* Whether the initial auth address has been set. */
    bool public initialAddressSet = false;

    /** 
     * Grant authentication to the initial Exchange protocol contract
     *
     * @dev No delay, can only be called once - after that the standard registry process with a delay must be used
     * @param authAddress Address of the contract to grant authentication
     */
    function grantInitialAuthentication (address authAddress)
        onlyOwner
        public
    {
        require(!initialAddressSet);
        initialAddressSet = true;
        contracts[authAddress] = true;
    }

}

Contract Security Audit

Contract ABI

[{"constant":false,"inputs":[{"name":"dest","type":"address"},{"name":"howToCall","type":"uint8"},{"name":"calldata","type":"bytes"}],"name":"proxy","outputs":[{"name":"result","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"dest","type":"address"},{"name":"howToCall","type":"uint8"},{"name":"calldata","type":"bytes"}],"name":"proxyAssert","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"revoke","type":"bool"}],"name":"setRevoke","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"user","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"revoked","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"registry","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"from","type":"address"},{"name":"value","type":"uint256"},{"name":"token","type":"address"},{"name":"extraData","type":"bytes"}],"name":"receiveApproval","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[{"name":"addrUser","type":"address"},{"name":"addrRegistry","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":false,"name":"revoked","type":"bool"}],"name":"Revoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"sender","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"ReceivedEther","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":false,"name":"value","type":"uint256"},{"indexed":true,"name":"token","type":"address"},{"indexed":false,"name":"extraData","type":"bytes"}],"name":"ReceivedTokens","type":"event"}]

6060604052341561000f57600080fd5b60405160408061071a833981016040528080519190602001805160008054600160a060020a03958616600160a060020a031991821617909155600180549590921694169390931790925550506106b08061006a6000396000f3006060604052600436106100695763ffffffff60e060020a6000350416631b0f7ba981146100a85780633f801f91146101245780634c93505f1461018e5780634f8632ba146101a657806363d256ce146101d55780637b103999146101e85780638f4ffcb1146101fb575b33600160a060020a03167fa419615bc8fda4c87663805ee2a3597a6d71c1d476911d9892f340d965bc7bf13460405190815260200160405180910390a2005b34156100b357600080fd5b61011060048035600160a060020a0316906024803560ff16919060649060443590810190830135806020601f8201819004810201604051908101604052818152929190602084018383808284375094965061026795505050505050565b604051901515815260200160405180910390f35b341561012f57600080fd5b61018c60048035600160a060020a0316906024803560ff16919060649060443590810190830135806020601f8201819004810201604051908101604052818152929190602084018383808284375094965061045295505050505050565b005b341561019957600080fd5b61018c600435151561046d565b34156101b157600080fd5b6101b96104f9565b604051600160a060020a03909116815260200160405180910390f35b34156101e057600080fd5b610110610508565b34156101f357600080fd5b6101b9610529565b341561020657600080fd5b61018c60048035600160a060020a0390811691602480359260443516919060849060643590810190830135806020601f8201819004810201604051908101604052818152929190602084018383808284375094965061053895505050505050565b6000805433600160a060020a039081169116148061031b575060015474010000000000000000000000000000000000000000900460ff1615801561031b5750600154600160a060020a03166369dc9ff33360006040516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b15156102ff57600080fd5b6102c65a03f1151561031057600080fd5b505050604051805190505b151561032657600080fd5b600083600181111561033457fe5b14156103bc5783600160a060020a03168260405180828051906020019080838360005b8381101561036f578082015183820152602001610357565b50505050905090810190601f16801561039c5780820380516001836020036101000a031916815260200191505b5091505060006040518083038160008661646e5a03f1915050905061044b565b60018360018111156103ca57fe5b141561044b5783600160a060020a03168260405180828051906020019080838360005b838110156104055780820151838201526020016103ed565b50505050905090810190601f1680156104325780820380516001836020036101000a031916815260200191505b509150506000604051808303818561646e5a03f4925050505b9392505050565b61045d838383610267565b151561046857600080fd5b505050565b60005433600160a060020a0390811691161461048857600080fd5b6001805474ff0000000000000000000000000000000000000000191674010000000000000000000000000000000000000000831515021790557f2165014523a6f4135deffed62d70149aad59b64de5aac51e3abbcbe2a83e2f7e81604051901515815260200160405180910390a150565b600054600160a060020a031681565b60015474010000000000000000000000000000000000000000900460ff1681565b600154600160a060020a031681565b81600160a060020a0381166323b872dd86308760006040516020015260405160e060020a63ffffffff8616028152600160a060020a0393841660048201529190921660248201526044810191909152606401602060405180830381600087803b15156105a357600080fd5b6102c65a03f115156105b457600080fd5b5050506040518051905015156105c957600080fd5b82600160a060020a031685600160a060020a03167fd65b48fd35864b3528d38e44760be5553248f89bf3ff6b06cca57817cc2650bf868560405182815260406020820181815290820183818151815260200191508051906020019080838360005b8381101561064257808201518382015260200161062a565b50505050905090810190601f16801561066f5780820380516001836020036101000a031916815260200191505b50935050505060405180910390a350505050505600a165627a7a72305820f03453619e690e4369306b62975f07ada1749fb20451bf692ceafeede289aefd00290000000000000000000000000084a81668b9a978416abeb88bc1572816cc7cac000000000000000000000000a4306692b00795f97010ec7237980141d08c6d56

Deployed Bytecode

0x6060604052600436106100695763ffffffff60e060020a6000350416631b0f7ba981146100a85780633f801f91146101245780634c93505f1461018e5780634f8632ba146101a657806363d256ce146101d55780637b103999146101e85780638f4ffcb1146101fb575b33600160a060020a03167fa419615bc8fda4c87663805ee2a3597a6d71c1d476911d9892f340d965bc7bf13460405190815260200160405180910390a2005b34156100b357600080fd5b61011060048035600160a060020a0316906024803560ff16919060649060443590810190830135806020601f8201819004810201604051908101604052818152929190602084018383808284375094965061026795505050505050565b604051901515815260200160405180910390f35b341561012f57600080fd5b61018c60048035600160a060020a0316906024803560ff16919060649060443590810190830135806020601f8201819004810201604051908101604052818152929190602084018383808284375094965061045295505050505050565b005b341561019957600080fd5b61018c600435151561046d565b34156101b157600080fd5b6101b96104f9565b604051600160a060020a03909116815260200160405180910390f35b34156101e057600080fd5b610110610508565b34156101f357600080fd5b6101b9610529565b341561020657600080fd5b61018c60048035600160a060020a0390811691602480359260443516919060849060643590810190830135806020601f8201819004810201604051908101604052818152929190602084018383808284375094965061053895505050505050565b6000805433600160a060020a039081169116148061031b575060015474010000000000000000000000000000000000000000900460ff1615801561031b5750600154600160a060020a03166369dc9ff33360006040516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b15156102ff57600080fd5b6102c65a03f1151561031057600080fd5b505050604051805190505b151561032657600080fd5b600083600181111561033457fe5b14156103bc5783600160a060020a03168260405180828051906020019080838360005b8381101561036f578082015183820152602001610357565b50505050905090810190601f16801561039c5780820380516001836020036101000a031916815260200191505b5091505060006040518083038160008661646e5a03f1915050905061044b565b60018360018111156103ca57fe5b141561044b5783600160a060020a03168260405180828051906020019080838360005b838110156104055780820151838201526020016103ed565b50505050905090810190601f1680156104325780820380516001836020036101000a031916815260200191505b509150506000604051808303818561646e5a03f4925050505b9392505050565b61045d838383610267565b151561046857600080fd5b505050565b60005433600160a060020a0390811691161461048857600080fd5b6001805474ff0000000000000000000000000000000000000000191674010000000000000000000000000000000000000000831515021790557f2165014523a6f4135deffed62d70149aad59b64de5aac51e3abbcbe2a83e2f7e81604051901515815260200160405180910390a150565b600054600160a060020a031681565b60015474010000000000000000000000000000000000000000900460ff1681565b600154600160a060020a031681565b81600160a060020a0381166323b872dd86308760006040516020015260405160e060020a63ffffffff8616028152600160a060020a0393841660048201529190921660248201526044810191909152606401602060405180830381600087803b15156105a357600080fd5b6102c65a03f115156105b457600080fd5b5050506040518051905015156105c957600080fd5b82600160a060020a031685600160a060020a03167fd65b48fd35864b3528d38e44760be5553248f89bf3ff6b06cca57817cc2650bf868560405182815260406020820181815290820183818151815260200191508051906020019080838360005b8381101561064257808201518382015260200161062a565b50505050905090810190601f16801561066f5780820380516001836020036101000a031916815260200191505b50935050505060405180910390a350505050505600a165627a7a72305820f03453619e690e4369306b62975f07ada1749fb20451bf692ceafeede289aefd0029

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

0000000000000000000000000084a81668b9a978416abeb88bc1572816cc7cac000000000000000000000000a4306692b00795f97010ec7237980141d08c6d56

-----Decoded View---------------
Arg [0] : addrUser (address): 0x0084a81668B9A978416aBEB88bC1572816cc7cAC
Arg [1] : addrRegistry (address): 0xa4306692b00795f97010ec7237980141d08c6D56

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000000084a81668b9a978416abeb88bc1572816cc7cac
Arg [1] : 000000000000000000000000a4306692b00795f97010ec7237980141d08c6d56


Swarm Source

bzzr://f03453619e690e4369306b62975f07ada1749fb20451bf692ceafeede289aefd

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