ETH Price: $2,478.95 (+0.09%)

Contract

0x000000000D38df53b45C5733c7b34000dE0BDF52
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Transfer Ownersh...89286962019-11-13 21:27:201810 days ago1573680440IN
0x00000000...0dE0BDF52
0 ETH0.0004361210.1
Set Global Key88793032019-11-05 19:11:221818 days ago1572981082IN
0x00000000...0dE0BDF52
0 ETH0.0006737711.1

Latest 1 internal transaction

Advanced mode:
Parent Transaction Hash Block From To
88477772019-10-31 17:29:461823 days ago1572542986  Contract Creation0 ETH
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
DharmaKeyRegistryV2

Compiler Version
v0.5.11+commit.c082d0b4

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license
/**
 *Submitted for verification at Etherscan.io on 2019-10-31
*/

pragma solidity 0.5.11; // optimization runs: 200, evm version: petersburg


interface DharmaKeyRegistryInterface {
  event NewGlobalKey(address oldGlobalKey, address newGlobalKey);
  event NewSpecificKey(
    address indexed account, address oldSpecificKey, address newSpecificKey
  );

  function setGlobalKey(address globalKey, bytes calldata signature) external;
  function setSpecificKey(address account, address specificKey) external;
  function getKey() external view returns (address key);
  function getKeyForUser(address account) external view returns (address key);
  function getGlobalKey() external view returns (address globalKey);
  function getSpecificKey(address account) external view returns (address specificKey);
}


library ECDSA {
    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
        if (signature.length != 65) {
            return (address(0));
        }

        bytes32 r;
        bytes32 s;
        uint8 v;

        assembly {
            r := mload(add(signature, 0x20))
            s := mload(add(signature, 0x40))
            v := byte(0, mload(add(signature, 0x60)))
        }

        if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {
            return address(0);
        }

        if (v != 27 && v != 28) {
            return address(0);
        }

        return ecrecover(hash, v, r, s);
    }

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


/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be aplied to your functions to restrict their use to
 * the owner.
 *
 * In order to transfer ownership, a recipient must be specified, at which point
 * the specified recipient can call `acceptOwnership` and take ownership.
 */
contract TwoStepOwnable {
  address private _owner;

  address private _newPotentialOwner;

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

  /**
   * @dev Initialize contract by setting transaction submitter as initial owner.
   */
  constructor() internal {
    _owner = tx.origin;
    emit OwnershipTransferred(address(0), _owner);
  }

  /**
   * @dev Returns the address of the current owner.
   */
  function owner() public view returns (address) {
    return _owner;
  }

  /**
   * @dev Throws if called by any account other than the owner.
   */
  modifier onlyOwner() {
    require(isOwner(), "TwoStepOwnable: caller is not the owner.");
    _;
  }

  /**
   * @dev Returns true if the caller is the current owner.
   */
  function isOwner() public view returns (bool) {
    return msg.sender == _owner;
  }

  /**
   * @dev Allows a new account (`newOwner`) to accept ownership.
   * Can only be called by the current owner.
   */
  function transferOwnership(address newOwner) public onlyOwner {
    require(
      newOwner != address(0),
      "TwoStepOwnable: new potential owner is the zero address."
    );

    _newPotentialOwner = newOwner;
  }

  /**
   * @dev Cancel a transfer of ownership to a new account.
   * Can only be called by the current owner.
   */
  function cancelOwnershipTransfer() public onlyOwner {
    delete _newPotentialOwner;
  }

  /**
   * @dev Transfers ownership of the contract to the caller.
   * Can only be called by a new potential owner set by the current owner.
   */
  function acceptOwnership() public {
    require(
      msg.sender == _newPotentialOwner,
      "TwoStepOwnable: current owner must set caller as new potential owner."
    );

    delete _newPotentialOwner;

    emit OwnershipTransferred(_owner, msg.sender);

    _owner = msg.sender;
  }
}


/**
 * @title DharmaKeyRegistryV2
 * @author 0age
 * @notice The Dharma Key Registry is an owned contract that holds the public
 * user signing keys that will be used by the Dharma Smart Wallet. Each time a
 * particular Dharma Smart Wallet instance needs to validate a signature, it
 * will first retrieve the public address for the secondary signing key
 * associated with that wallet from the Dharma Key Registry. If a specific key
 * has not been set for that smart wallet, it will return the global public key.
 * Otherwise, it will return the specific signing key. Additional view functions
 * are also provided for retrieving public keys directly. Only the owner may
 * update these keys. Also, note that the V2 key registry includes an additional
 * mapping to track all keys that have been used, and only allows a given key to
 * be set one time.
 */
contract DharmaKeyRegistryV2 is TwoStepOwnable, DharmaKeyRegistryInterface {
  using ECDSA for bytes32;

  // The global public key serves as the default signing key.
  address private _globalKey;

  // Specific keys may also be set on a per-caller basis.
  mapping (address => address) private _specificKeys;

  // Maintain a mapping of all used keys (to prevent reuse).
  mapping (address => bool) private _usedKeys;

  /**
   * @notice In the constructor, set the initial global key and the initial
   * owner to tx.origin.
   */
  constructor() public {
    // Initially set the global key to the account of the transaction submitter.
    _registerGlobalKey(tx.origin);
  }

  /**
   * @notice Set a new global key. This method may only be called by the owner,
   * and a signature must also be provided in order to verify that the provided
   * global public key has a corresponding private key that can be used to sign
   * messages.
   * @param globalKey address The new global public key.
   * @param signature bytes A signature of a message hash containing the address
   * of this contract, the new global key, and a specific message, that must
   * resolve to the supplied global key.
   */
  function setGlobalKey(
    address globalKey, bytes calldata signature
  ) external onlyOwner {
    // Ensure that the provided global key is not the null address.
    require(globalKey != address(0), "A global key must be supplied.");

    // Message hash constructed according to EIP-191-0x45 to prevent replays.
    bytes32 messageHash = keccak256(
      abi.encodePacked(
        address(this),
        globalKey,
        "This signature demonstrates that the supplied signing key is valid."
      )
    );

    // Recover the signer of the message hash using the provided signature.
    address signer = messageHash.toEthSignedMessageHash().recover(signature);

    // Ensure that the provided signature resolves to the provided global key.
    require(globalKey == signer, "Invalid signature for supplied global key.");

    // Update global key to the provided global key and prevent future reuse.
    _registerGlobalKey(globalKey);
  }

  /**
   * @notice Set a new specific key for a particular account. This method may
   * only be called by the owner. Signatures are not required in order to make
   * setting specific keys more efficient at scale. Providing the null address
   * for the specific key will remove a specific key from the given account.
   * @param account address The account to set the new specific public key for.
   * @param specificKey address The new specific public key.
   */
  function setSpecificKey(
    address account, address specificKey
  ) external onlyOwner {
    // Ensure that the key has not been used previously.
    require(!_usedKeys[specificKey], "Key has been used previously.");

    // Emit an event signifying that the specific key has been modified.
    emit NewSpecificKey(account, _specificKeys[account], specificKey);

    // Update specific key for provided account to the provided specific key.
    _specificKeys[account] = specificKey;

    // Mark the key as having been used previously.
    _usedKeys[specificKey] = true;
  }

  /**
   * @notice Get the public key associated with the caller of this function. If
   * a specific key is set for the caller, it will be returned; otherwise, the
   * global key will be returned.
   * @return The public key to use for the caller.
   */
  function getKey() external view returns (address key) {
    // Retrieve the specific key, if any, for the caller.
    key = _specificKeys[msg.sender];

    // Fall back to the global key in the event that no specific key is set.
    if (key == address(0)) {
      key = _globalKey;
    }
  }

  /**
   * @notice Get the public key associated with a particular account. If a
   * specific key is set for the account, it will be returned; otherwise, the
   * global key will be returned.
   * @param account address The account to find the public key for.
   * @return The public key to use for the provided account.
   */
  function getKeyForUser(address account) external view returns (address key) {
    // Retrieve the specific key, if any, for the specified account.
    key = _specificKeys[account];

    // Fall back to the global key in the event that no specific key is set.
    if (key == address(0)) {
      key = _globalKey;
    }
  }

  /**
   * @notice Get the global public key.
   * @return The global public key.
   */
  function getGlobalKey() external view returns (address globalKey) {
    // Retrieve and return the global key.
    globalKey = _globalKey;
  }

  /**
   * @notice Get the specific public key associated with the supplied account.
   * The call will revert if a specific public key is not set for the account.
   * @param account address The account to find the specific public key for.
   * @return The specific public key set on the provided account, if one exists.
   */
  function getSpecificKey(
    address account
  ) external view returns (address specificKey) {
    // Retrieve the specific key, if any, for the account.
    specificKey = _specificKeys[account];

    // Revert in the event that there is no specific key set.
    require(
      specificKey != address(0),
      "No specific key set for the provided account."
    );
  }

  /**
   * @notice Internal function to set a new global key once contract ownership
   * and signature validity have both been checked, or during contract creation.
   * The provided global key must not have been used previously, and once set it
   * will be registered as having been used.
   * @param globalKey address The new global public key.
   */
  function _registerGlobalKey(address globalKey) internal {
    // Ensure that the key has not been used previously.
    require(!_usedKeys[globalKey], "Key has been used previously.");

    // Emit an event signifying that the global key has been modified.
    emit NewGlobalKey(_globalKey, globalKey);

    // Update the global key to the provided global key.
    _globalKey = globalKey;

    // Mark the key as having been used previously.
    _usedKeys[globalKey] = true;
  }
}

Contract Security Audit

Contract ABI

[{"constant":false,"inputs":[],"name":"cancelOwnershipTransfer","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getSpecificKey","outputs":[{"internalType":"address","name":"specificKey","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"globalKey","type":"address"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"setGlobalKey","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"acceptOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getKey","outputs":[{"internalType":"address","name":"key","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getGlobalKey","outputs":[{"internalType":"address","name":"globalKey","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getKeyForUser","outputs":[{"internalType":"address","name":"key","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"specificKey","type":"address"}],"name":"setSpecificKey","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldGlobalKey","type":"address"},{"indexed":false,"internalType":"address","name":"newGlobalKey","type":"address"}],"name":"NewGlobalKey","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"oldSpecificKey","type":"address"},{"indexed":false,"internalType":"address","name":"newSpecificKey","type":"address"}],"name":"NewSpecificKey","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"}]

608060405234801561001057600080fd5b50600080546001600160a01b03191632178082556040516001600160a01b039190911691907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a361006c326001600160e01b0361007116565b61017b565b6001600160a01b03811660009081526004602052604090205460ff16156100f957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f4b657920686173206265656e20757365642070726576696f75736c792e000000604482015290519081900360640190fd5b600254604080516001600160a01b039283168152918316602083015280517fa32b0a8ef3ffb88c03a342b78b72361e1338ec8943e550c93ddae4f45bab4a769281900390910190a1600280546001600160a01b039092166001600160a01b0319909216821790556000908152600460205260409020805460ff19166001179055565b610b728061018a6000396000f3fe608060405234801561001057600080fd5b50600436106100a95760003560e01c806385d162ad1161007157806385d162ad1461018a5780638da5cb5b146101925780638f32d59b1461019a578063a00b6dd4146101b6578063a8f3a371146101dc578063f2fde38b1461020a576100a9565b806323452b9c146100ae5780635f98cd6c146100b85780636951e6da146100fa57806379ba50971461017a57806382678dd614610182575b600080fd5b6100b6610230565b005b6100de600480360360208110156100ce57600080fd5b50356001600160a01b0316610285565b604080516001600160a01b039092168252519081900360200190f35b6100b66004803603604081101561011057600080fd5b6001600160a01b03823516919081019060408101602082013564010000000081111561013b57600080fd5b82018360208201111561014d57600080fd5b8035906020019184600183028401116401000000008311171561016f57600080fd5b5090925090506102e1565b6100b661049c565b6100de610541565b6100de610570565b6100de61057f565b6101a261058e565b604080519115158252519081900360200190f35b6100de600480360360208110156101cc57600080fd5b50356001600160a01b031661059f565b6100b6600480360360408110156101f257600080fd5b506001600160a01b03813581169160200135166105d0565b6100b66004803603602081101561022057600080fd5b50356001600160a01b0316610724565b61023861058e565b6102735760405162461bcd60e51b8152600401808060200182810382526028815260200180610a876028913960400191505060405180910390fd5b600180546001600160a01b0319169055565b6001600160a01b0380821660009081526003602052604090205416806102dc5760405162461bcd60e51b815260040180806020018281038252602d815260200180610b11602d913960400191505060405180910390fd5b919050565b6102e961058e565b6103245760405162461bcd60e51b8152600401808060200182810382526028815260200180610a876028913960400191505060405180910390fd5b6001600160a01b03831661037f576040805162461bcd60e51b815260206004820152601e60248201527f4120676c6f62616c206b6579206d75737420626520737570706c6965642e0000604482015290519081900360640190fd5b6000308460405160200180836001600160a01b03166001600160a01b031660601b8152601401826001600160a01b03166001600160a01b031660601b8152601401806109ff6043913960430192505050604051602081830303815290604052805190602001209050600061043a84848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061042e92508691506107ce9050565b9063ffffffff61081f16565b9050806001600160a01b0316856001600160a01b03161461048c5760405162461bcd60e51b815260040180806020018281038252602a815260200180610ae7602a913960400191505060405180910390fd5b6104958561090e565b5050505050565b6001546001600160a01b031633146104e55760405162461bcd60e51b8152600401808060200182810382526045815260200180610a426045913960600191505060405180910390fd5b600180546001600160a01b03191690556000805460405133926001600160a01b03909216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b03191633179055565b336000908152600360205260409020546001600160a01b03168061056d57506002546001600160a01b03165b90565b6002546001600160a01b031690565b6000546001600160a01b031690565b6000546001600160a01b0316331490565b6001600160a01b0380821660009081526003602052604090205416806102dc5750506002546001600160a01b031690565b6105d861058e565b6106135760405162461bcd60e51b8152600401808060200182810382526028815260200180610a876028913960400191505060405180910390fd5b6001600160a01b03811660009081526004602052604090205460ff1615610681576040805162461bcd60e51b815260206004820152601d60248201527f4b657920686173206265656e20757365642070726576696f75736c792e000000604482015290519081900360640190fd5b6001600160a01b03808316600081815260036020908152604091829020548251908516815293851690840152805191927f717e9e0e6039224cf9af30797a54e3a2cf19353d31e08c7e6544b199c3e6bc44929081900390910190a26001600160a01b03918216600090815260036020908152604080832080546001600160a01b03191694909516938417909455918152600490915220805460ff19166001179055565b61072c61058e565b6107675760405162461bcd60e51b8152600401808060200182810382526028815260200180610a876028913960400191505060405180910390fd5b6001600160a01b0381166107ac5760405162461bcd60e51b8152600401808060200182810382526038815260200180610aaf6038913960400191505060405180910390fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b604080517f19457468657265756d205369676e6564204d6573736167653a0a333200000000602080830191909152603c8083019490945282518083039094018452605c909101909152815191012090565b6000815160411461083257506000610908565b60208201516040830151606084015160001a7f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08211156108785760009350505050610908565b8060ff16601b1415801561089057508060ff16601c14155b156108a15760009350505050610908565b6040805160008152602080820180845289905260ff8416828401526060820186905260808201859052915160019260a0808401939192601f1981019281900390910190855afa1580156108f8573d6000803e3d6000fd5b5050506020604051035193505050505b92915050565b6001600160a01b03811660009081526004602052604090205460ff161561097c576040805162461bcd60e51b815260206004820152601d60248201527f4b657920686173206265656e20757365642070726576696f75736c792e000000604482015290519081900360640190fd5b600254604080516001600160a01b039283168152918316602083015280517fa32b0a8ef3ffb88c03a342b78b72361e1338ec8943e550c93ddae4f45bab4a769281900390910190a1600280546001600160a01b039092166001600160a01b0319909216821790556000908152600460205260409020805460ff1916600117905556fe54686973207369676e61747572652064656d6f6e7374726174657320746861742074686520737570706c696564207369676e696e67206b65792069732076616c69642e54776f537465704f776e61626c653a2063757272656e74206f776e6572206d757374207365742063616c6c6572206173206e657720706f74656e7469616c206f776e65722e54776f537465704f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65722e54776f537465704f776e61626c653a206e657720706f74656e7469616c206f776e657220697320746865207a65726f20616464726573732e496e76616c6964207369676e617475726520666f7220737570706c69656420676c6f62616c206b65792e4e6f207370656369666963206b65792073657420666f72207468652070726f7669646564206163636f756e742ea265627a7a72315820202020202020446861726d614b6579526567697374727956322020202020202064736f6c634300050b0032

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106100a95760003560e01c806385d162ad1161007157806385d162ad1461018a5780638da5cb5b146101925780638f32d59b1461019a578063a00b6dd4146101b6578063a8f3a371146101dc578063f2fde38b1461020a576100a9565b806323452b9c146100ae5780635f98cd6c146100b85780636951e6da146100fa57806379ba50971461017a57806382678dd614610182575b600080fd5b6100b6610230565b005b6100de600480360360208110156100ce57600080fd5b50356001600160a01b0316610285565b604080516001600160a01b039092168252519081900360200190f35b6100b66004803603604081101561011057600080fd5b6001600160a01b03823516919081019060408101602082013564010000000081111561013b57600080fd5b82018360208201111561014d57600080fd5b8035906020019184600183028401116401000000008311171561016f57600080fd5b5090925090506102e1565b6100b661049c565b6100de610541565b6100de610570565b6100de61057f565b6101a261058e565b604080519115158252519081900360200190f35b6100de600480360360208110156101cc57600080fd5b50356001600160a01b031661059f565b6100b6600480360360408110156101f257600080fd5b506001600160a01b03813581169160200135166105d0565b6100b66004803603602081101561022057600080fd5b50356001600160a01b0316610724565b61023861058e565b6102735760405162461bcd60e51b8152600401808060200182810382526028815260200180610a876028913960400191505060405180910390fd5b600180546001600160a01b0319169055565b6001600160a01b0380821660009081526003602052604090205416806102dc5760405162461bcd60e51b815260040180806020018281038252602d815260200180610b11602d913960400191505060405180910390fd5b919050565b6102e961058e565b6103245760405162461bcd60e51b8152600401808060200182810382526028815260200180610a876028913960400191505060405180910390fd5b6001600160a01b03831661037f576040805162461bcd60e51b815260206004820152601e60248201527f4120676c6f62616c206b6579206d75737420626520737570706c6965642e0000604482015290519081900360640190fd5b6000308460405160200180836001600160a01b03166001600160a01b031660601b8152601401826001600160a01b03166001600160a01b031660601b8152601401806109ff6043913960430192505050604051602081830303815290604052805190602001209050600061043a84848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061042e92508691506107ce9050565b9063ffffffff61081f16565b9050806001600160a01b0316856001600160a01b03161461048c5760405162461bcd60e51b815260040180806020018281038252602a815260200180610ae7602a913960400191505060405180910390fd5b6104958561090e565b5050505050565b6001546001600160a01b031633146104e55760405162461bcd60e51b8152600401808060200182810382526045815260200180610a426045913960600191505060405180910390fd5b600180546001600160a01b03191690556000805460405133926001600160a01b03909216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b03191633179055565b336000908152600360205260409020546001600160a01b03168061056d57506002546001600160a01b03165b90565b6002546001600160a01b031690565b6000546001600160a01b031690565b6000546001600160a01b0316331490565b6001600160a01b0380821660009081526003602052604090205416806102dc5750506002546001600160a01b031690565b6105d861058e565b6106135760405162461bcd60e51b8152600401808060200182810382526028815260200180610a876028913960400191505060405180910390fd5b6001600160a01b03811660009081526004602052604090205460ff1615610681576040805162461bcd60e51b815260206004820152601d60248201527f4b657920686173206265656e20757365642070726576696f75736c792e000000604482015290519081900360640190fd5b6001600160a01b03808316600081815260036020908152604091829020548251908516815293851690840152805191927f717e9e0e6039224cf9af30797a54e3a2cf19353d31e08c7e6544b199c3e6bc44929081900390910190a26001600160a01b03918216600090815260036020908152604080832080546001600160a01b03191694909516938417909455918152600490915220805460ff19166001179055565b61072c61058e565b6107675760405162461bcd60e51b8152600401808060200182810382526028815260200180610a876028913960400191505060405180910390fd5b6001600160a01b0381166107ac5760405162461bcd60e51b8152600401808060200182810382526038815260200180610aaf6038913960400191505060405180910390fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b604080517f19457468657265756d205369676e6564204d6573736167653a0a333200000000602080830191909152603c8083019490945282518083039094018452605c909101909152815191012090565b6000815160411461083257506000610908565b60208201516040830151606084015160001a7f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08211156108785760009350505050610908565b8060ff16601b1415801561089057508060ff16601c14155b156108a15760009350505050610908565b6040805160008152602080820180845289905260ff8416828401526060820186905260808201859052915160019260a0808401939192601f1981019281900390910190855afa1580156108f8573d6000803e3d6000fd5b5050506020604051035193505050505b92915050565b6001600160a01b03811660009081526004602052604090205460ff161561097c576040805162461bcd60e51b815260206004820152601d60248201527f4b657920686173206265656e20757365642070726576696f75736c792e000000604482015290519081900360640190fd5b600254604080516001600160a01b039283168152918316602083015280517fa32b0a8ef3ffb88c03a342b78b72361e1338ec8943e550c93ddae4f45bab4a769281900390910190a1600280546001600160a01b039092166001600160a01b0319909216821790556000908152600460205260409020805460ff1916600117905556fe54686973207369676e61747572652064656d6f6e7374726174657320746861742074686520737570706c696564207369676e696e67206b65792069732076616c69642e54776f537465704f776e61626c653a2063757272656e74206f776e6572206d757374207365742063616c6c6572206173206e657720706f74656e7469616c206f776e65722e54776f537465704f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65722e54776f537465704f776e61626c653a206e657720706f74656e7469616c206f776e657220697320746865207a65726f20616464726573732e496e76616c6964207369676e617475726520666f7220737570706c69656420676c6f62616c206b65792e4e6f207370656369666963206b65792073657420666f72207468652070726f7669646564206163636f756e742ea265627a7a72315820202020202020446861726d614b6579526567697374727956322020202020202064736f6c634300050b0032

Deployed Bytecode Sourcemap

5003:6331:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5003:6331:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3573:90;;;:::i;:::-;;10094:380;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;10094:380:0;-1:-1:-1;;;;;10094:380:0;;:::i;:::-;;;;-1:-1:-1;;;;;10094:380:0;;;;;;;;;;;;;;6238:966;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;6238:966:0;;;;;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;6238:966:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;6238:966:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;-1:-1;6238:966:0;;-1:-1:-1;6238:966:0;-1:-1:-1;6238:966:0;:::i;3821:298::-;;;:::i;8542:299::-;;;:::i;9609:145::-;;;:::i;2660:73::-;;;:::i;3002:86::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;9182:329;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;9182:329:0;-1:-1:-1;;;;;9182:329:0;;:::i;7684:590::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;7684:590:0;;;;;;;;;;:::i;3221:225::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;3221:225:0;-1:-1:-1;;;;;3221:225:0;;:::i;3573:90::-;2854:9;:7;:9::i;:::-;2846:62;;;;-1:-1:-1;;;2846:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3639:18;3632:25;;-1:-1:-1;;;;;;3632:25:0;;;3573:90::o;10094:380::-;-1:-1:-1;;;;;10270:22:0;;;10168:19;10270:22;;;:13;:22;;;;;;;10380:25;10364:104;;;;-1:-1:-1;;;10364:104:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10094:380;;;:::o;6238:966::-;2854:9;:7;:9::i;:::-;2846:62;;;;-1:-1:-1;;;2846:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;6418:23:0;;6410:66;;;;;-1:-1:-1;;;6410:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;6564:19;6639:4;6655:9;6604:149;;;;;;-1:-1:-1;;;;;6604:149:0;-1:-1:-1;;;;;6604:149:0;;;;;;;;-1:-1:-1;;;;;6604:149:0;-1:-1:-1;;;;;6604:149:0;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;6604:149:0;;;6586:174;;;;;;6564:196;;6846:14;6863:55;6908:9;;6863:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;6863:36:0;;-1:-1:-1;6863:11:0;;-1:-1:-1;6863:34:0;;-1:-1:-1;6863:36:0:i;:::-;:44;:55;:44;:55;:::i;:::-;6846:72;;7028:6;-1:-1:-1;;;;;7015:19:0;:9;-1:-1:-1;;;;;7015:19:0;;7007:74;;;;-1:-1:-1;;;7007:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7169:29;7188:9;7169:18;:29::i;:::-;2915:1;;6238:966;;;:::o;3821:298::-;3892:18;;-1:-1:-1;;;;;3892:18:0;3878:10;:32;3862:135;;;;-1:-1:-1;;;3862:135:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4013:18;4006:25;;-1:-1:-1;;;;;;4006:25:0;;;-1:-1:-1;4066:6:0;;4045:40;;4074:10;;-1:-1:-1;;;;;4066:6:0;;;;4045:40;;;4094:6;:19;;-1:-1:-1;;;;;;4094:19:0;4103:10;4094:19;;;3821:298::o;8542:299::-;8682:10;8583:11;8668:25;;;:13;:25;;;;;;-1:-1:-1;;;;;8668:25:0;8784:17;8780:56;;-1:-1:-1;8818:10:0;;-1:-1:-1;;;;;8818:10:0;8780:56;8542:299;:::o;9609:145::-;9738:10;;-1:-1:-1;;;;;9738:10:0;;9609:145::o;2660:73::-;2698:7;2721:6;-1:-1:-1;;;;;2721:6:0;2660:73;:::o;3002:86::-;3042:4;3076:6;-1:-1:-1;;;;;3076:6:0;3062:10;:20;;3002:86::o;9182:329::-;-1:-1:-1;;;;;9341:22:0;;;9245:11;9341:22;;;:13;:22;;;;;;;9454:17;9450:56;;-1:-1:-1;;9488:10:0;;-1:-1:-1;;;;;9488:10:0;;9182:329::o;7684:590::-;2854:9;:7;:9::i;:::-;2846:62;;;;-1:-1:-1;;;2846:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;7849:22:0;;;;;;:9;:22;;;;;;;;7848:23;7840:65;;;;;-1:-1:-1;;;7840:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;7993:60:0;;;8017:22;;;;:13;:22;;;;;;;;;;7993:60;;8017:22;;;7993:60;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;8141:22:0;;;;;;;:13;:22;;;;;;;;:36;;-1:-1:-1;;;;;;8141:36:0;;;;;;;;;;;8239:22;;;:9;:22;;;;:29;;-1:-1:-1;;8239:29:0;-1:-1:-1;8239:29:0;;;7684:590::o;3221:225::-;2854:9;:7;:9::i;:::-;2846:62;;;;-1:-1:-1;;;2846:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3306:22:0;;3290:112;;;;-1:-1:-1;;;3290:112:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3411:18;:29;;-1:-1:-1;;;;;;3411:29:0;-1:-1:-1;;;;;3411:29:0;;;;;;;;;;3221:225::o;1469:173::-;1575:58;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;1575:58:0;;;;;;;1565:69;;;;;;1469:173::o;777:684::-;855:7;879:9;:16;899:2;879:22;875:74;;-1:-1:-1;934:1:0;918:19;;875:74;1071:4;1056:20;;1050:27;1117:4;1102:20;;1096:27;1171:4;1156:20;;1150:27;961:9;1142:36;1218:66;1205:79;;1201:129;;;1316:1;1301:17;;;;;;;1201:129;1346:1;:7;;1351:2;1346:7;;:18;;;;;1357:1;:7;;1362:2;1357:7;;1346:18;1342:68;;;1396:1;1381:17;;;;;;;1342:68;1429:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;1429:24:0;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;1429:24:0;;;;;;;;1422:31;;;;;777:684;;;;;:::o;10842:489::-;-1:-1:-1;;;;;10972:20:0;;;;;;:9;:20;;;;;;;;10971:21;10963:63;;;;;-1:-1:-1;;;10963:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;11125:10;;11112:35;;;-1:-1:-1;;;;;11125:10:0;;;11112:35;;;;;;;;;;;;;;;;;;;;;11214:10;:22;;-1:-1:-1;;;;;11214:22:0;;;-1:-1:-1;;;;;;11214:22:0;;;;;;;:10;11298:20;;;:9;:20;;;;;:27;;-1:-1:-1;;11298:27:0;11214:22;11298:27;;;10842:489::o

Swarm Source

bzzr://202020202020446861726d614b65795265676973747279563220202020202020

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.