Contract 0xd4Df33983FF82CE4469c6ea3CFf390403E58d90A 2

 

Contract Overview

Balance:
0 Ether

EtherValue:
$0.00

Token:
Txn Hash Method
Block
From
To
Value
0x8244427f7fa86d4b12ef043748f86077d0a7cdc0e25165a85e5262fc5bb4fe3eClaim Plot With ...50365002018-02-05 17:46:341329 days 6 hrs ago0x5cf54fbb769f64007120e008d02c261a61a3600c IN  0xd4df33983ff82ce4469c6ea3cff390403e58d90a0.0125 Ether0.000296297511.5
0x5550665bbf5a2e15355eb6f06c324ac12e7842fe8f3cadd3852b5c7c83dcd7e5Claim Plot With ...50364752018-02-05 17:41:591329 days 6 hrs ago0x5cf54fbb769f64007120e008d02c261a61a3600c IN  0xd4df33983ff82ce4469c6ea3cff390403e58d90a0.0125 Ether0.000296297511.5
0xe5d727ba290f6788dd6eeabf404cfd0450d9c6e3d0f3f4f29a51246c10589c68Claim Plot With ...50364702018-02-05 17:40:481329 days 6 hrs ago0x5cf54fbb769f64007120e008d02c261a61a3600c IN  0xd4df33983ff82ce4469c6ea3cff390403e58d90a0.0125 Ether0.000296297511.5
0x33465879e25260e3e87f58cc3a1be807a4367f53c4abc7751f082a2fe399930cCreate Rent Auct...50305462018-02-04 17:57:271330 days 6 hrs ago0xdd976b013cc7f3d47015e323fa1cf030859cca08 IN  0xd4df33983ff82ce4469c6ea3cff390403e58d90a0 Ether0.00028501611.5
0x10872deff7c00df2fc4988819916a515b19947693a045c41888b43770f4ba2dfClaim Plot With ...50262782018-02-04 0:59:341330 days 23 hrs ago0x46f7bb5adbb74f35b86df10d1fc3ef09f09bed33 IN  0xd4df33983ff82ce4469c6ea3cff390403e58d90a0.0125 Ether0.0000978924
0x9c2adb951e5663001de3c36078699616c952de2df5751a09f1141ea937c33079Claim Plot With ...50262772018-02-04 0:59:171330 days 23 hrs ago0x46f7bb5adbb74f35b86df10d1fc3ef09f09bed33 IN  0xd4df33983ff82ce4469c6ea3cff390403e58d90a0.0125 Ether0.0000978924
0x55496259f7336a6355aa7afe414af49cc53dc6af1d0ba48fde77ce07ec362c58Withdraw Balance50232832018-02-03 12:42:121331 days 11 hrs ago0x0659836869772cf479cfcedb659ce6099560b1e5 IN  0xd4df33983ff82ce4469c6ea3cff390403e58d90a0 Ether0.0001528055
0xc675b1ef54cc5c079e6cc2b1ad10f2a6593c54a946f3bee1af4b9b916d43cf80Pause50218112018-02-03 6:56:241331 days 17 hrs ago0xd91e15f8bf4e71ae5142406d15a6bfc1a9c4a1d7 IN  0xd4df33983ff82ce4469c6ea3cff390403e58d90a0 Ether0.0000877182
0x73bf33cb3293b9b7434b2efb28a2faab308e466548b94c5bb26814a8abfb166eClaim Plot With ...50217072018-02-03 6:30:161331 days 17 hrs ago0xc67fee4b69f5710e5848f0f7c2ba476bc22160c4 IN  0xd4df33983ff82ce4469c6ea3cff390403e58d90a0.0125 Ether0.00152741420.5
0x1ac0c9977307191618c9a193dbd1edfa3eb834a8e2432a6b11c429a44f61eb5bSet Plot Data50216482018-02-03 6:18:311331 days 17 hrs ago0x60d92c79058fb39b4f70e3fd7d0704c28556074e IN  0xd4df33983ff82ce4469c6ea3cff390403e58d90a0 Ether0.00006214951.5
0x6d53e333faee1926e3a7487a5a111400b87c23f42641ea5443054917649885ceCreate Sale Auct...50216192018-02-03 6:12:571331 days 17 hrs ago0x60d92c79058fb39b4f70e3fd7d0704c28556074e IN  0xd4df33983ff82ce4469c6ea3cff390403e58d90a0 Ether0.00031730252.5
0x64fbfcde0d99fc22c4c2a30d279c99475a82d545ede003b217574278b9ac6f61Create Sale Auct...50216082018-02-03 6:10:181331 days 17 hrs ago0x60d92c79058fb39b4f70e3fd7d0704c28556074e IN  0xd4df33983ff82ce4469c6ea3cff390403e58d90a0 Ether0.00082498656.5
0x1ad09436c3182b2df1aa33b7d15e0b4b2f8464e3e2737fba709f59a03c3951a2Claim Plot With ...50215332018-02-03 5:52:191331 days 18 hrs ago0xff2f0f12d41ac1d47623f75f6cdbdf1cc5e2c108 IN  0xd4df33983ff82ce4469c6ea3cff390403e58d90a0.0125 Ether0.0001069621.5
0x6458c147eea8d3592b89abe356f2f2c760949241735096615c1c9cf359a7d8c7Claim Plot With ...50215332018-02-03 5:52:191331 days 18 hrs ago0xff2f0f12d41ac1d47623f75f6cdbdf1cc5e2c108 IN  0xd4df33983ff82ce4469c6ea3cff390403e58d90a0.0125 Ether0.0001069621.5
0x5e7a471b352687c792ed70780e912c44fbe83829db0620d48e3f979cf8e0d51aClaim Plot With ...50215272018-02-03 5:51:031331 days 18 hrs ago0xff2f0f12d41ac1d47623f75f6cdbdf1cc5e2c108 IN  0xd4df33983ff82ce4469c6ea3cff390403e58d90a0.0125 Ether0.0001069621.5
0x38d7fbe1733698359da3aa69d1f6ca5b5f9b74b8ce01b78a4bdb78e309884e12Claim Plot With ...50215182018-02-03 5:47:591331 days 18 hrs ago0xff2f0f12d41ac1d47623f75f6cdbdf1cc5e2c108 IN  0xd4df33983ff82ce4469c6ea3cff390403e58d90a0.0125 Ether0.0001069621.5
0x59ddc3a3ca04e31b03a03e9beb1c00d49b9fc933f1a0fdb58d44d9166cc03d09Claim Plot With ...50215182018-02-03 5:47:591331 days 18 hrs ago0x1f2672e17fd7ec4b52b7f40d41ec5c477fe85c0c IN  0xd4df33983ff82ce4469c6ea3cff390403e58d90a0.0125 Ether0.00085095411.5
0x5636394314c5b9174413df6ee71811f71b5bca59147a5c9f87fc13d0c28ff202Claim Plot With ...50204302018-02-03 1:29:031331 days 22 hrs ago0x049bed1598655b64f09e4835084fbc502ab1ad86 IN  0xd4df33983ff82ce4469c6ea3cff390403e58d90a0.0125 Ether0.000444095
0xb8a37fa01963818237478fde0dc5edf1c951e6e4647129a88aacf89b970337d8Claim Plot With ...50203932018-02-03 1:21:141331 days 22 hrs ago0x049bed1598655b64f09e4835084fbc502ab1ad86 IN  0xd4df33983ff82ce4469c6ea3cff390403e58d90a0.0125 Ether0.000354625
0x66f95144cae6fe8cf97d93e1b56188843fdc759a416910e7b6de685185da4646Claim Plot With ...50203632018-02-03 1:12:591331 days 22 hrs ago0x6564a5639e17e186f749e493af98a51fd3092048 IN  0xd4df33983ff82ce4469c6ea3cff390403e58d90a0.0125 Ether0.0001765322
0xb067fc24514e7dae94761421241fe3ded85a9e2781f837b17cb41035b24b2d82Set Plot Data50203172018-02-03 1:03:211331 days 23 hrs ago0x644d0dac1cc451c4e987b1ea7e599f6d70d14831 IN  0xd4df33983ff82ce4469c6ea3cff390403e58d90a0 Ether0.000462357511.5
0x97bc8523da8ca9c491b786f7faf3dcba0bbee91ea5102cfce90a7715709c3a31Claim Plot With ...50203112018-02-03 1:00:511331 days 23 hrs ago0x644d0dac1cc451c4e987b1ea7e599f6d70d14831 IN  0xd4df33983ff82ce4469c6ea3cff390403e58d90a0.0125 Ether0.00080164211.5
0xe9bd791057ab60be160b293d1067b583566bcd7db014dd30a28787f723f73874Claim Plot With ...50202082018-02-03 0:35:121331 days 23 hrs ago0x6564a5639e17e186f749e493af98a51fd3092048 IN  0xd4df33983ff82ce4469c6ea3cff390403e58d90a0.0125 Ether0.0001819322
0xaabb16d1163645b389dd49e1c7c3ee5fd370b45705b0c84e7e3cdbf6340f8964Claim Plot With ...50201982018-02-03 0:33:251331 days 23 hrs ago0x6564a5639e17e186f749e493af98a51fd3092048 IN  0xd4df33983ff82ce4469c6ea3cff390403e58d90a0.0125 Ether0.0001819322
0x170539cabcbd4e8c25382f111040903def1cec62bf23a5c0d6af6ff40d59bd20Claim Plot With ...50201592018-02-03 0:24:001331 days 23 hrs ago0x6564a5639e17e186f749e493af98a51fd3092048 IN  0xd4df33983ff82ce4469c6ea3cff390403e58d90a0.0125 Ether0.0000698361
[ Download CSV Export 
Latest 6 internal transactions
Parent Txn Hash Block From To Value
0x55496259f7336a6355aa7afe414af49cc53dc6af1d0ba48fde77ce07ec362c5850232832018-02-03 12:42:121331 days 11 hrs ago 0xd4df33983ff82ce4469c6ea3cff390403e58d90a0x0659836869772cf479cfcedb659ce6099560b1e50.475 Ether
0x83afc1874450368a8d7333561e73d5aea59efa2f5a711d8177cb9e5ecaa0c25850177552018-02-02 14:34:401332 days 9 hrs ago 0xd4df33983ff82ce4469c6ea3cff390403e58d90a0x0659836869772cf479cfcedb659ce6099560b1e57.745 Ether
0xfce87a337a27df80b9d19a67ca976fddb3a41cb5407e079b21b87a9a2f95631550009662018-01-30 17:48:021335 days 6 hrs ago 0xd4df33983ff82ce4469c6ea3cff390403e58d90a0x0659836869772cf479cfcedb659ce6099560b1e51.89 Ether
0x3fd34744e2cadcf20f8296b8f2ea7f56ae2c3c519825e48caa736f8e515734fa49984372018-01-30 7:11:061335 days 16 hrs ago 0xd4df33983ff82ce4469c6ea3cff390403e58d90a0x0659836869772cf479cfcedb659ce6099560b1e51.46 Ether
0x8859d9d68df24e9ddf22f692e356fe93e4027514b95794c43188d6d7671fb03b49978902018-01-30 4:50:111335 days 19 hrs ago 0xd4df33983ff82ce4469c6ea3cff390403e58d90a0x0659836869772cf479cfcedb659ce6099560b1e50.62 Ether
0xc650314eb262afa39c5e3cb56f197d14f95eaf4a46e85ac688d41f48de5ca5ce49972682018-01-30 2:15:141335 days 21 hrs ago 0xd4df33983ff82ce4469c6ea3cff390403e58d90a0x0659836869772cf479cfcedb659ce6099560b1e50.0825 Ether
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
DWorldCore

Compiler Version
v0.4.18+commit.9cf6e910

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2018-01-27
*/

pragma solidity ^0.4.18;


/**
 * @title SafeMath
 * @dev Math operations with safety checks that throw on error
 */
library SafeMath {
  function mul(uint256 a, uint256 b) internal pure returns (uint256) {
    if (a == 0) {
      return 0;
    }
    uint256 c = a * b;
    assert(c / a == b);
    return c;
  }

  function div(uint256 a, uint256 b) internal pure returns (uint256) {
    // assert(b > 0); // Solidity automatically throws when dividing by 0
    uint256 c = a / b;
    // assert(a == b * c + a % b); // There is no case in which this doesn't hold
    return c;
  }

  function sub(uint256 a, uint256 b) internal pure returns (uint256) {
    assert(b <= a);
    return a - b;
  }

  function add(uint256 a, uint256 b) internal pure returns (uint256) {
    uint256 c = a + b;
    assert(c >= a);
    return c;
  }
}


/**
 * @title Ownable
 * @dev The Ownable contract has an owner address, and provides basic authorization control
 * functions, this simplifies the implementation of "user permissions".
 */
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;
  }

}


/**
 * @title Claimable
 * @dev Extension for the Ownable contract, where the ownership needs to be claimed.
 * This allows the new owner to accept the transfer.
 */
contract Claimable is Ownable {
  address public pendingOwner;

  /**
   * @dev Modifier throws if called by any account other than the pendingOwner.
   */
  modifier onlyPendingOwner() {
    require(msg.sender == pendingOwner);
    _;
  }

  /**
   * @dev Allows the current owner to set the pendingOwner address.
   * @param newOwner The address to transfer ownership to.
   */
  function transferOwnership(address newOwner) onlyOwner public {
    pendingOwner = newOwner;
  }

  /**
   * @dev Allows the pendingOwner address to finalize the transfer.
   */
  function claimOwnership() onlyPendingOwner public {
    OwnershipTransferred(owner, pendingOwner);
    owner = pendingOwner;
    pendingOwner = address(0);
  }
}


/**
 * @title Pausable
 * @dev Base contract which allows children to implement an emergency stop mechanism.
 */
contract Pausable is Ownable {
  event Pause();
  event Unpause();

  bool public paused = false;


  /**
   * @dev Modifier to make a function callable only when the contract is not paused.
   */
  modifier whenNotPaused() {
    require(!paused);
    _;
  }

  /**
   * @dev Modifier to make a function callable only when the contract is paused.
   */
  modifier whenPaused() {
    require(paused);
    _;
  }

  /**
   * @dev called by the owner to pause, triggers stopped state
   */
  function pause() onlyOwner whenNotPaused public {
    paused = true;
    Pause();
  }

  /**
   * @dev called by the owner to unpause, returns to normal state
   */
  function unpause() onlyOwner whenPaused public {
    paused = false;
    Unpause();
  }
}


/**
 * @title ERC20Basic
 * @dev Simpler version of ERC20 interface
 * @dev see https://github.com/ethereum/EIPs/issues/179
 */
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);
}


/**
 * @title ERC20 interface
 * @dev see https://github.com/ethereum/EIPs/issues/20
 */
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);
}


/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure.
 * To use this library you can add a `using SafeERC20 for ERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
  function safeTransfer(ERC20Basic token, address to, uint256 value) internal {
    assert(token.transfer(to, value));
  }

  function safeTransferFrom(ERC20 token, address from, address to, uint256 value) internal {
    assert(token.transferFrom(from, to, value));
  }

  function safeApprove(ERC20 token, address spender, uint256 value) internal {
    assert(token.approve(spender, value));
  }
}


/**
 * @title Contracts that should be able to recover tokens
 * @author SylTi
 * @dev This allow a contract to recover any ERC20 token received in a contract by transferring the balance to the contract owner.
 * This will prevent any accidental loss of tokens.
 */
contract CanReclaimToken is Ownable {
  using SafeERC20 for ERC20Basic;

  /**
   * @dev Reclaim all ERC20Basic compatible tokens
   * @param token ERC20Basic The address of the token contract
   */
  function reclaimToken(ERC20Basic token) external onlyOwner {
    uint256 balance = token.balanceOf(this);
    token.safeTransfer(owner, balance);
  }

}


/// @title Interface for contracts conforming to ERC-721: Deed Standard
/// @author William Entriken (https://phor.net), et al.
/// @dev Specification at https://github.com/ethereum/EIPs/pull/841 (DRAFT)
interface ERC721 {

    // COMPLIANCE WITH ERC-165 (DRAFT) /////////////////////////////////////////

    /// @dev ERC-165 (draft) interface signature for itself
    // bytes4 internal constant INTERFACE_SIGNATURE_ERC165 = // 0x01ffc9a7
    //     bytes4(keccak256('supportsInterface(bytes4)'));

    /// @dev ERC-165 (draft) interface signature for ERC721
    // bytes4 internal constant INTERFACE_SIGNATURE_ERC721 = // 0xda671b9b
    //     bytes4(keccak256('ownerOf(uint256)')) ^
    //     bytes4(keccak256('countOfDeeds()')) ^
    //     bytes4(keccak256('countOfDeedsByOwner(address)')) ^
    //     bytes4(keccak256('deedOfOwnerByIndex(address,uint256)')) ^
    //     bytes4(keccak256('approve(address,uint256)')) ^
    //     bytes4(keccak256('takeOwnership(uint256)'));

    /// @notice Query a contract to see if it supports a certain interface
    /// @dev Returns `true` the interface is supported and `false` otherwise,
    ///  returns `true` for INTERFACE_SIGNATURE_ERC165 and
    ///  INTERFACE_SIGNATURE_ERC721, see ERC-165 for other interface signatures.
    function supportsInterface(bytes4 _interfaceID) external pure returns (bool);

    // PUBLIC QUERY FUNCTIONS //////////////////////////////////////////////////

    /// @notice Find the owner of a deed
    /// @param _deedId The identifier for a deed we are inspecting
    /// @dev Deeds assigned to zero address are considered destroyed, and
    ///  queries about them do throw.
    /// @return The non-zero address of the owner of deed `_deedId`, or `throw`
    ///  if deed `_deedId` is not tracked by this contract
    function ownerOf(uint256 _deedId) external view returns (address _owner);

    /// @notice Count deeds tracked by this contract
    /// @return A count of the deeds tracked by this contract, where each one of
    ///  them has an assigned and queryable owner
    function countOfDeeds() public view returns (uint256 _count);

    /// @notice Count all deeds assigned to an owner
    /// @dev Throws if `_owner` is the zero address, representing destroyed deeds.
    /// @param _owner An address where we are interested in deeds owned by them
    /// @return The number of deeds owned by `_owner`, possibly zero
    function countOfDeedsByOwner(address _owner) public view returns (uint256 _count);

    /// @notice Enumerate deeds assigned to an owner
    /// @dev Throws if `_index` >= `countOfDeedsByOwner(_owner)` or if
    ///  `_owner` is the zero address, representing destroyed deeds.
    /// @param _owner An address where we are interested in deeds owned by them
    /// @param _index A counter between zero and `countOfDeedsByOwner(_owner)`,
    ///  inclusive
    /// @return The identifier for the `_index`th deed assigned to `_owner`,
    ///   (sort order not specified)
    function deedOfOwnerByIndex(address _owner, uint256 _index) external view returns (uint256 _deedId);

    // TRANSFER MECHANISM //////////////////////////////////////////////////////

    /// @dev This event emits when ownership of any deed changes by any
    ///  mechanism. This event emits when deeds are created (`from` == 0) and
    ///  destroyed (`to` == 0). Exception: during contract creation, any
    ///  transfers may occur without emitting `Transfer`.
    event Transfer(address indexed from, address indexed to, uint256 indexed deedId);

    /// @dev This event emits on any successful call to
    ///  `approve(address _spender, uint256 _deedId)`. Exception: does not emit
    ///  if an owner revokes approval (`_to` == 0x0) on a deed with no existing
    ///  approval.
    event Approval(address indexed owner, address indexed approved, uint256 indexed deedId);

    /// @notice Approve a new owner to take your deed, or revoke approval by
    ///  setting the zero address. You may `approve` any number of times while
    ///  the deed is assigned to you, only the most recent approval matters.
    /// @dev Throws if `msg.sender` does not own deed `_deedId` or if `_to` ==
    ///  `msg.sender`.
    /// @param _deedId The deed you are granting ownership of
    function approve(address _to, uint256 _deedId) external;

    /// @notice Become owner of a deed for which you are currently approved
    /// @dev Throws if `msg.sender` is not approved to become the owner of
    ///  `deedId` or if `msg.sender` currently owns `_deedId`.
    /// @param _deedId The deed that is being transferred
    function takeOwnership(uint256 _deedId) external;
    
    // SPEC EXTENSIONS /////////////////////////////////////////////////////////
    
    /// @notice Transfer a deed to a new owner.
    /// @dev Throws if `msg.sender` does not own deed `_deedId` or if
    ///  `_to` == 0x0.
    /// @param _to The address of the new owner.
    /// @param _deedId The deed you are transferring.
    function transfer(address _to, uint256 _deedId) external;
}


/// @title Metadata extension to ERC-721 interface
/// @author William Entriken (https://phor.net)
/// @dev Specification at https://github.com/ethereum/EIPs/pull/841 (DRAFT)
interface ERC721Metadata {

    /// @dev ERC-165 (draft) interface signature for ERC721
    // bytes4 internal constant INTERFACE_SIGNATURE_ERC721Metadata = // 0x2a786f11
    //     bytes4(keccak256('name()')) ^
    //     bytes4(keccak256('symbol()')) ^
    //     bytes4(keccak256('deedUri(uint256)'));

    /// @notice A descriptive name for a collection of deeds managed by this
    ///  contract
    /// @dev Wallets and exchanges MAY display this to the end user.
    function name() public pure returns (string _deedName);

    /// @notice An abbreviated name for deeds managed by this contract
    /// @dev Wallets and exchanges MAY display this to the end user.
    function symbol() public pure returns (string _deedSymbol);

    /// @notice A distinct URI (RFC 3986) for a given token.
    /// @dev If:
    ///  * The URI is a URL
    ///  * The URL is accessible
    ///  * The URL points to a valid JSON file format (ECMA-404 2nd ed.)
    ///  * The JSON base element is an object
    ///  then these names of the base element SHALL have special meaning:
    ///  * "name": A string identifying the item to which `_deedId` grants
    ///    ownership
    ///  * "description": A string detailing the item to which `_deedId` grants
    ///    ownership
    ///  * "image": A URI pointing to a file of image/* mime type representing
    ///    the item to which `_deedId` grants ownership
    ///  Wallets and exchanges MAY display this to the end user.
    ///  Consider making any images at a width between 320 and 1080 pixels and
    ///  aspect ratio between 1.91:1 and 4:5 inclusive.
    function deedUri(uint256 _deedId) external pure returns (string _uri);
}


/// @dev Implements access control to the DWorld contract.
contract DWorldAccessControl is Claimable, Pausable, CanReclaimToken {
    address public cfoAddress;

    function DWorldAccessControl() public {
        // The creator of the contract is the initial CFO.
        cfoAddress = msg.sender;
    }
    
    /// @dev Access modifier for CFO-only functionality.
    modifier onlyCFO() {
        require(msg.sender == cfoAddress);
        _;
    }

    /// @dev Assigns a new address to act as the CFO. Only available to the current contract owner.
    /// @param _newCFO The address of the new CFO.
    function setCFO(address _newCFO) external onlyOwner {
        require(_newCFO != address(0));

        cfoAddress = _newCFO;
    }
}


/// @dev Defines base data structures for DWorld.
contract DWorldBase is DWorldAccessControl {
    using SafeMath for uint256;
    
    /// @dev All minted plots (array of plot identifiers). There are
    /// 2^16 * 2^16 possible plots (covering the entire world), thus
    /// 32 bits are required. This fits in a uint32. Storing
    /// the identifiers as uint32 instead of uint256 makes storage
    /// cheaper. (The impact of this in mappings is less noticeable,
    /// and using uint32 in the mappings below actually *increases*
    /// gas cost for minting).
    uint32[] public plots;
    
    mapping (uint256 => address) identifierToOwner;
    mapping (uint256 => address) identifierToApproved;
    mapping (address => uint256) ownershipDeedCount;
    
    /// @dev Event fired when a plot's data are changed. The plot
    /// data are not stored in the contract directly, instead the
    /// data are logged to the block. This gives significant
    /// reductions in gas requirements (~75k for minting with data
    /// instead of ~180k). However, it also means plot data are
    /// not available from *within* other contracts.
    event SetData(uint256 indexed deedId, string name, string description, string imageUrl, string infoUrl);
    
    /// @notice Get all minted plots.
    function getAllPlots() external view returns(uint32[]) {
        return plots;
    }
    
    /// @dev Represent a 2D coordinate as a single uint.
    /// @param x The x-coordinate.
    /// @param y The y-coordinate.
    function coordinateToIdentifier(uint256 x, uint256 y) public pure returns(uint256) {
        require(validCoordinate(x, y));
        
        return (y << 16) + x;
    }
    
    /// @dev Turn a single uint representation of a coordinate into its x and y parts.
    /// @param identifier The uint representation of a coordinate.
    function identifierToCoordinate(uint256 identifier) public pure returns(uint256 x, uint256 y) {
        require(validIdentifier(identifier));
    
        y = identifier >> 16;
        x = identifier - (y << 16);
    }
    
    /// @dev Test whether the coordinate is valid.
    /// @param x The x-part of the coordinate to test.
    /// @param y The y-part of the coordinate to test.
    function validCoordinate(uint256 x, uint256 y) public pure returns(bool) {
        return x < 65536 && y < 65536; // 2^16
    }
    
    /// @dev Test whether an identifier is valid.
    /// @param identifier The identifier to test.
    function validIdentifier(uint256 identifier) public pure returns(bool) {
        return identifier < 4294967296; // 2^16 * 2^16
    }
    
    /// @dev Set a plot's data.
    /// @param identifier The identifier of the plot to set data for.
    function _setPlotData(uint256 identifier, string name, string description, string imageUrl, string infoUrl) internal {
        SetData(identifier, name, description, imageUrl, infoUrl);
    }
}


/// @dev Holds deed functionality such as approving and transferring. Implements ERC721.
contract DWorldDeed is DWorldBase, ERC721, ERC721Metadata {
    
    /// @notice Name of the collection of deeds (non-fungible token), as defined in ERC721Metadata.
    function name() public pure returns (string _deedName) {
        _deedName = "DWorld Plots";
    }
    
    /// @notice Symbol of the collection of deeds (non-fungible token), as defined in ERC721Metadata.
    function symbol() public pure returns (string _deedSymbol) {
        _deedSymbol = "DWP";
    }
    
    /// @dev ERC-165 (draft) interface signature for itself
    bytes4 internal constant INTERFACE_SIGNATURE_ERC165 = // 0x01ffc9a7
        bytes4(keccak256('supportsInterface(bytes4)'));

    /// @dev ERC-165 (draft) interface signature for ERC721
    bytes4 internal constant INTERFACE_SIGNATURE_ERC721 = // 0xda671b9b
        bytes4(keccak256('ownerOf(uint256)')) ^
        bytes4(keccak256('countOfDeeds()')) ^
        bytes4(keccak256('countOfDeedsByOwner(address)')) ^
        bytes4(keccak256('deedOfOwnerByIndex(address,uint256)')) ^
        bytes4(keccak256('approve(address,uint256)')) ^
        bytes4(keccak256('takeOwnership(uint256)'));
        
    /// @dev ERC-165 (draft) interface signature for ERC721
    bytes4 internal constant INTERFACE_SIGNATURE_ERC721Metadata = // 0x2a786f11
        bytes4(keccak256('name()')) ^
        bytes4(keccak256('symbol()')) ^
        bytes4(keccak256('deedUri(uint256)'));
    
    /// @notice Introspection interface as per ERC-165 (https://github.com/ethereum/EIPs/issues/165).
    /// Returns true for any standardized interfaces implemented by this contract.
    /// (ERC-165 and ERC-721.)
    function supportsInterface(bytes4 _interfaceID) external pure returns (bool) {
        return (
            (_interfaceID == INTERFACE_SIGNATURE_ERC165)
            || (_interfaceID == INTERFACE_SIGNATURE_ERC721)
            || (_interfaceID == INTERFACE_SIGNATURE_ERC721Metadata)
        );
    }
    
    /// @dev Checks if a given address owns a particular plot.
    /// @param _owner The address of the owner to check for.
    /// @param _deedId The plot identifier to check for.
    function _owns(address _owner, uint256 _deedId) internal view returns (bool) {
        return identifierToOwner[_deedId] == _owner;
    }
    
    /// @dev Approve a given address to take ownership of a deed.
    /// @param _from The address approving taking ownership.
    /// @param _to The address to approve taking ownership.
    /// @param _deedId The identifier of the deed to give approval for.
    function _approve(address _from, address _to, uint256 _deedId) internal {
        identifierToApproved[_deedId] = _to;
        
        // Emit event.
        Approval(_from, _to, _deedId);
    }
    
    /// @dev Checks if a given address has approval to take ownership of a deed.
    /// @param _claimant The address of the claimant to check for.
    /// @param _deedId The identifier of the deed to check for.
    function _approvedFor(address _claimant, uint256 _deedId) internal view returns (bool) {
        return identifierToApproved[_deedId] == _claimant;
    }
    
    /// @dev Assigns ownership of a specific deed to an address.
    /// @param _from The address to transfer the deed from.
    /// @param _to The address to transfer the deed to.
    /// @param _deedId The identifier of the deed to transfer.
    function _transfer(address _from, address _to, uint256 _deedId) internal {
        // The number of plots is capped at 2^16 * 2^16, so this cannot
        // be overflowed.
        ownershipDeedCount[_to]++;
        
        // Transfer ownership.
        identifierToOwner[_deedId] = _to;
        
        // When a new deed is minted, the _from address is 0x0, but we
        // do not track deed ownership of 0x0.
        if (_from != address(0)) {
            ownershipDeedCount[_from]--;
            
            // Clear taking ownership approval.
            delete identifierToApproved[_deedId];
        }
        
        // Emit the transfer event.
        Transfer(_from, _to, _deedId);
    }
    
    // ERC 721 implementation
    
    /// @notice Returns the total number of deeds currently in existence.
    /// @dev Required for ERC-721 compliance.
    function countOfDeeds() public view returns (uint256) {
        return plots.length;
    }
    
    /// @notice Returns the number of deeds owned by a specific address.
    /// @param _owner The owner address to check.
    /// @dev Required for ERC-721 compliance
    function countOfDeedsByOwner(address _owner) public view returns (uint256) {
        return ownershipDeedCount[_owner];
    }
    
    /// @notice Returns the address currently assigned ownership of a given deed.
    /// @dev Required for ERC-721 compliance.
    function ownerOf(uint256 _deedId) external view returns (address _owner) {
        _owner = identifierToOwner[_deedId];

        require(_owner != address(0));
    }
    
    /// @notice Approve a given address to take ownership of a deed.
    /// @param _to The address to approve taking owernship.
    /// @param _deedId The identifier of the deed to give approval for.
    /// @dev Required for ERC-721 compliance.
    function approve(address _to, uint256 _deedId) external whenNotPaused {
        uint256[] memory _deedIds = new uint256[](1);
        _deedIds[0] = _deedId;
        
        approveMultiple(_to, _deedIds);
    }
    
    /// @notice Approve a given address to take ownership of multiple deeds.
    /// @param _to The address to approve taking ownership.
    /// @param _deedIds The identifiers of the deeds to give approval for.
    function approveMultiple(address _to, uint256[] _deedIds) public whenNotPaused {
        // Ensure the sender is not approving themselves.
        require(msg.sender != _to);
    
        for (uint256 i = 0; i < _deedIds.length; i++) {
            uint256 _deedId = _deedIds[i];
            
            // Require the sender is the owner of the deed.
            require(_owns(msg.sender, _deedId));
            
            // Perform the approval.
            _approve(msg.sender, _to, _deedId);
        }
    }
    
    /// @notice Transfer a deed to another address. If transferring to a smart
    /// contract be VERY CAREFUL to ensure that it is aware of ERC-721, or your
    /// deed may be lost forever.
    /// @param _to The address of the recipient, can be a user or contract.
    /// @param _deedId The identifier of the deed to transfer.
    /// @dev Required for ERC-721 compliance.
    function transfer(address _to, uint256 _deedId) external whenNotPaused {
        uint256[] memory _deedIds = new uint256[](1);
        _deedIds[0] = _deedId;
        
        transferMultiple(_to, _deedIds);
    }
    
    /// @notice Transfers multiple deeds to another address. If transferring to
    /// a smart contract be VERY CAREFUL to ensure that it is aware of ERC-721,
    /// or your deeds may be lost forever.
    /// @param _to The address of the recipient, can be a user or contract.
    /// @param _deedIds The identifiers of the deeds to transfer.
    function transferMultiple(address _to, uint256[] _deedIds) public whenNotPaused {
        // Safety check to prevent against an unexpected 0x0 default.
        require(_to != address(0));
        
        // Disallow transfers to this contract to prevent accidental misuse.
        require(_to != address(this));
    
        for (uint256 i = 0; i < _deedIds.length; i++) {
            uint256 _deedId = _deedIds[i];
            
            // One can only transfer their own plots.
            require(_owns(msg.sender, _deedId));

            // Transfer ownership
            _transfer(msg.sender, _to, _deedId);
        }
    }
    
    /// @notice Transfer a deed owned by another address, for which the calling
    /// address has previously been granted transfer approval by the owner.
    /// @param _deedId The identifier of the deed to be transferred.
    /// @dev Required for ERC-721 compliance.
    function takeOwnership(uint256 _deedId) external whenNotPaused {
        uint256[] memory _deedIds = new uint256[](1);
        _deedIds[0] = _deedId;
        
        takeOwnershipMultiple(_deedIds);
    }
    
    /// @notice Transfer multiple deeds owned by another address, for which the
    /// calling address has previously been granted transfer approval by the owner.
    /// @param _deedIds The identifier of the deed to be transferred.
    function takeOwnershipMultiple(uint256[] _deedIds) public whenNotPaused {
        for (uint256 i = 0; i < _deedIds.length; i++) {
            uint256 _deedId = _deedIds[i];
            address _from = identifierToOwner[_deedId];
            
            // Check for transfer approval
            require(_approvedFor(msg.sender, _deedId));

            // Reassign ownership (also clears pending approvals and emits Transfer event).
            _transfer(_from, msg.sender, _deedId);
        }
    }
    
    /// @notice Returns a list of all deed identifiers assigned to an address.
    /// @param _owner The owner whose deeds we are interested in.
    /// @dev This method MUST NEVER be called by smart contract code. It's very
    /// expensive and is not supported in contract-to-contract calls as it returns
    /// a dynamic array (only supported for web3 calls).
    function deedsOfOwner(address _owner) external view returns(uint256[]) {
        uint256 deedCount = countOfDeedsByOwner(_owner);

        if (deedCount == 0) {
            // Return an empty array.
            return new uint256[](0);
        } else {
            uint256[] memory result = new uint256[](deedCount);
            uint256 totalDeeds = countOfDeeds();
            uint256 resultIndex = 0;
            
            for (uint256 deedNumber = 0; deedNumber < totalDeeds; deedNumber++) {
                uint256 identifier = plots[deedNumber];
                if (identifierToOwner[identifier] == _owner) {
                    result[resultIndex] = identifier;
                    resultIndex++;
                }
            }

            return result;
        }
    }
    
    /// @notice Returns a deed identifier of the owner at the given index.
    /// @param _owner The address of the owner we want to get a deed for.
    /// @param _index The index of the deed we want.
    function deedOfOwnerByIndex(address _owner, uint256 _index) external view returns (uint256) {
        // The index should be valid.
        require(_index < countOfDeedsByOwner(_owner));

        // Loop through all plots, accounting the number of plots of the owner we've seen.
        uint256 seen = 0;
        uint256 totalDeeds = countOfDeeds();
        
        for (uint256 deedNumber = 0; deedNumber < totalDeeds; deedNumber++) {
            uint256 identifier = plots[deedNumber];
            if (identifierToOwner[identifier] == _owner) {
                if (seen == _index) {
                    return identifier;
                }
                
                seen++;
            }
        }
    }
    
    /// @notice Returns an (off-chain) metadata url for the given deed.
    /// @param _deedId The identifier of the deed to get the metadata
    /// url for.
    /// @dev Implementation of optional ERC-721 functionality.
    function deedUri(uint256 _deedId) external pure returns (string uri) {
        require(validIdentifier(_deedId));
    
        var (x, y) = identifierToCoordinate(_deedId);
    
        // Maximum coordinate length in decimals is 5 (65535)
        uri = "https://dworld.io/plot/xxxxx/xxxxx";
        bytes memory _uri = bytes(uri);
        
        for (uint256 i = 0; i < 5; i++) {
            _uri[27 - i] = byte(48 + (x / 10 ** i) % 10);
            _uri[33 - i] = byte(48 + (y / 10 ** i) % 10);
        }
    }
}


/// @dev Implements renting functionality.
contract DWorldRenting is DWorldDeed {
    event Rent(address indexed renter, uint256 indexed deedId, uint256 rentPeriodEndTimestamp, uint256 rentPeriod);
    mapping (uint256 => address) identifierToRenter;
    mapping (uint256 => uint256) identifierToRentPeriodEndTimestamp;

    /// @dev Checks if a given address rents a particular plot.
    /// @param _renter The address of the renter to check for.
    /// @param _deedId The plot identifier to check for.
    function _rents(address _renter, uint256 _deedId) internal view returns (bool) {
        return identifierToRenter[_deedId] == _renter && identifierToRentPeriodEndTimestamp[_deedId] >= now;
    }
    
    /// @dev Rent out a deed to an address.
    /// @param _to The address to rent the deed out to.
    /// @param _rentPeriod The rent period in seconds.
    /// @param _deedId The identifier of the deed to rent out.
    function _rentOut(address _to, uint256 _rentPeriod, uint256 _deedId) internal {
        // Set the renter and rent period end timestamp
        uint256 rentPeriodEndTimestamp = now.add(_rentPeriod);
        identifierToRenter[_deedId] = _to;
        identifierToRentPeriodEndTimestamp[_deedId] = rentPeriodEndTimestamp;
        
        Rent(_to, _deedId, rentPeriodEndTimestamp, _rentPeriod);
    }
    
    /// @notice Rents a plot out to another address.
    /// @param _to The address of the renter, can be a user or contract.
    /// @param _rentPeriod The rent time period in seconds.
    /// @param _deedId The identifier of the plot to rent out.
    function rentOut(address _to, uint256 _rentPeriod, uint256 _deedId) external whenNotPaused {
        uint256[] memory _deedIds = new uint256[](1);
        _deedIds[0] = _deedId;
        
        rentOutMultiple(_to, _rentPeriod, _deedIds);
    }
    
    /// @notice Rents multiple plots out to another address.
    /// @param _to The address of the renter, can be a user or contract.
    /// @param _rentPeriod The rent time period in seconds.
    /// @param _deedIds The identifiers of the plots to rent out.
    function rentOutMultiple(address _to, uint256 _rentPeriod, uint256[] _deedIds) public whenNotPaused {
        // Safety check to prevent against an unexpected 0x0 default.
        require(_to != address(0));
        
        // Disallow transfers to this contract to prevent accidental misuse.
        require(_to != address(this));
        
        for (uint256 i = 0; i < _deedIds.length; i++) {
            uint256 _deedId = _deedIds[i];
            
            require(validIdentifier(_deedId));
        
            // There should not be an active renter.
            require(identifierToRentPeriodEndTimestamp[_deedId] < now);
            
            // One can only rent out their own plots.
            require(_owns(msg.sender, _deedId));
            
            _rentOut(_to, _rentPeriod, _deedId);
        }
    }
    
    /// @notice Returns the address of the currently assigned renter and
    /// end time of the rent period of a given plot.
    /// @param _deedId The identifier of the deed to get the renter and 
    /// rent period for.
    function renterOf(uint256 _deedId) external view returns (address _renter, uint256 _rentPeriodEndTimestamp) {
        require(validIdentifier(_deedId));
    
        if (identifierToRentPeriodEndTimestamp[_deedId] < now) {
            // There is no active renter
            _renter = address(0);
            _rentPeriodEndTimestamp = 0;
        } else {
            _renter = identifierToRenter[_deedId];
            _rentPeriodEndTimestamp = identifierToRentPeriodEndTimestamp[_deedId];
        }
    }
}


/// @title The internal clock auction functionality.
/// Inspired by CryptoKitties' clock auction
contract ClockAuctionBase {

    // Address of the ERC721 contract this auction is linked to.
    ERC721 public deedContract;

    // Fee per successful auction in 1/1000th of a percentage.
    uint256 public fee;
    
    // Total amount of ether yet to be paid to auction beneficiaries.
    uint256 public outstandingEther = 0 ether;
    
    // Amount of ether yet to be paid per beneficiary.
    mapping (address => uint256) public addressToEtherOwed;
    
    /// @dev Represents a deed auction.
    /// Care has been taken to ensure the auction fits in
    /// two 256-bit words.
    struct Auction {
        address seller;
        uint128 startPrice;
        uint128 endPrice;
        uint64 duration;
        uint64 startedAt;
    }

    mapping (uint256 => Auction) identifierToAuction;
    
    // Events
    event AuctionCreated(address indexed seller, uint256 indexed deedId, uint256 startPrice, uint256 endPrice, uint256 duration);
    event AuctionSuccessful(address indexed buyer, uint256 indexed deedId, uint256 totalPrice);
    event AuctionCancelled(uint256 indexed deedId);
    
    /// @dev Modifier to check whether the value can be stored in a 64 bit uint.
    modifier fitsIn64Bits(uint256 _value) {
        require (_value == uint256(uint64(_value)));
        _;
    }
    
    /// @dev Modifier to check whether the value can be stored in a 128 bit uint.
    modifier fitsIn128Bits(uint256 _value) {
        require (_value == uint256(uint128(_value)));
        _;
    }
    
    function ClockAuctionBase(address _deedContractAddress, uint256 _fee) public {
        deedContract = ERC721(_deedContractAddress);
        
        // Contract must indicate support for ERC721 through its interface signature.
        require(deedContract.supportsInterface(0xda671b9b));
        
        // Fee must be between 0 and 100%.
        require(0 <= _fee && _fee <= 100000);
        fee = _fee;
    }
    
    /// @dev Checks whether the given auction is active.
    /// @param auction The auction to check for activity.
    function _activeAuction(Auction storage auction) internal view returns (bool) {
        return auction.startedAt > 0;
    }
    
    /// @dev Put the deed into escrow, thereby taking ownership of it.
    /// @param _deedId The identifier of the deed to place into escrow.
    function _escrow(uint256 _deedId) internal {
        // Throws if the transfer fails
        deedContract.takeOwnership(_deedId);
    }
    
    /// @dev Create the auction.
    /// @param _deedId The identifier of the deed to create the auction for.
    /// @param auction The auction to create.
    function _createAuction(uint256 _deedId, Auction auction) internal {
        // Add the auction to the auction mapping.
        identifierToAuction[_deedId] = auction;
        
        // Trigger auction created event.
        AuctionCreated(auction.seller, _deedId, auction.startPrice, auction.endPrice, auction.duration);
    }
    
    /// @dev Bid on an auction.
    /// @param _buyer The address of the buyer.
    /// @param _value The value sent by the sender (in ether).
    /// @param _deedId The identifier of the deed to bid on.
    function _bid(address _buyer, uint256 _value, uint256 _deedId) internal {
        Auction storage auction = identifierToAuction[_deedId];
        
        // The auction must be active.
        require(_activeAuction(auction));
        
        // Calculate the auction's current price.
        uint256 price = _currentPrice(auction);
        
        // Make sure enough funds were sent.
        require(_value >= price);
        
        address seller = auction.seller;
    
        if (price > 0) {
            uint256 totalFee = _calculateFee(price);
            uint256 proceeds = price - totalFee;
            
            // Assign the proceeds to the seller.
            // We do not send the proceeds directly, as to prevent
            // malicious sellers from denying auctions (and burning
            // the buyer's gas).
            _assignProceeds(seller, proceeds);
        }
        
        AuctionSuccessful(_buyer, _deedId, price);
        
        // The bid was won!
        _winBid(seller, _buyer, _deedId, price);
        
        // Remove the auction (we do this at the end, as
        // winBid might require some additional information
        // that will be removed when _removeAuction is
        // called. As we do not transfer funds here, we do
        // not have to worry about re-entry attacks.
        _removeAuction(_deedId);
    }

    /// @dev Perform the bid win logic (in this case: transfer the deed).
    /// @param _seller The address of the seller.
    /// @param _winner The address of the winner.
    /// @param _deedId The identifier of the deed.
    /// @param _price The price the auction was bought at.
    function _winBid(address _seller, address _winner, uint256 _deedId, uint256 _price) internal {
        _transfer(_winner, _deedId);
    }
    
    /// @dev Cancel an auction.
    /// @param _deedId The identifier of the deed for which the auction should be cancelled.
    /// @param auction The auction to cancel.
    function _cancelAuction(uint256 _deedId, Auction auction) internal {
        // Remove the auction
        _removeAuction(_deedId);
        
        // Transfer the deed back to the seller
        _transfer(auction.seller, _deedId);
        
        // Trigger auction cancelled event.
        AuctionCancelled(_deedId);
    }
    
    /// @dev Remove an auction.
    /// @param _deedId The identifier of the deed for which the auction should be removed.
    function _removeAuction(uint256 _deedId) internal {
        delete identifierToAuction[_deedId];
    }
    
    /// @dev Transfer a deed owned by this contract to another address.
    /// @param _to The address to transfer the deed to.
    /// @param _deedId The identifier of the deed.
    function _transfer(address _to, uint256 _deedId) internal {
        // Throws if the transfer fails
        deedContract.transfer(_to, _deedId);
    }
    
    /// @dev Assign proceeds to an address.
    /// @param _to The address to assign proceeds to.
    /// @param _value The proceeds to assign.
    function _assignProceeds(address _to, uint256 _value) internal {
        outstandingEther += _value;
        addressToEtherOwed[_to] += _value;
    }
    
    /// @dev Calculate the current price of an auction.
    function _currentPrice(Auction storage _auction) internal view returns (uint256) {
        require(now >= _auction.startedAt);
        
        uint256 secondsPassed = now - _auction.startedAt;
        
        if (secondsPassed >= _auction.duration) {
            return _auction.endPrice;
        } else {
            // Negative if the end price is higher than the start price!
            int256 totalPriceChange = int256(_auction.endPrice) - int256(_auction.startPrice);
            
            // Calculate the current price based on the total change over the entire
            // auction duration, and the amount of time passed since the start of the
            // auction.
            int256 currentPriceChange = totalPriceChange * int256(secondsPassed) / int256(_auction.duration);
            
            // Calculate the final price. Note this once again
            // is representable by a uint256, as the price can
            // never be negative.
            int256 price = int256(_auction.startPrice) + currentPriceChange;
            
            // This never throws.
            assert(price >= 0);
            
            return uint256(price);
        }
    }
    
    /// @dev Calculate the fee for a given price.
    /// @param _price The price to calculate the fee for.
    function _calculateFee(uint256 _price) internal view returns (uint256) {
        // _price is guaranteed to fit in a uint128 due to the createAuction entry
        // modifiers, so this cannot overflow.
        return _price * fee / 100000;
    }
}


contract ClockAuction is ClockAuctionBase, Pausable {
    function ClockAuction(address _deedContractAddress, uint256 _fee) 
        ClockAuctionBase(_deedContractAddress, _fee)
        public
    {}
    
    /// @notice Update the auction fee.
    /// @param _fee The new fee.
    function setFee(uint256 _fee) external onlyOwner {
        require(0 <= _fee && _fee <= 100000);
    
        fee = _fee;
    }
    
    /// @notice Get the auction for the given deed.
    /// @param _deedId The identifier of the deed to get the auction for.
    /// @dev Throws if there is no auction for the given deed.
    function getAuction(uint256 _deedId) external view returns (
            address seller,
            uint256 startPrice,
            uint256 endPrice,
            uint256 duration,
            uint256 startedAt
        )
    {
        Auction storage auction = identifierToAuction[_deedId];
        
        // The auction must be active
        require(_activeAuction(auction));
        
        return (
            auction.seller,
            auction.startPrice,
            auction.endPrice,
            auction.duration,
            auction.startedAt
        );
    }

    /// @notice Create an auction for a given deed.
    /// Must previously have been given approval to take ownership of the deed.
    /// @param _deedId The identifier of the deed to create an auction for.
    /// @param _startPrice The starting price of the auction.
    /// @param _endPrice The ending price of the auction.
    /// @param _duration The duration in seconds of the dynamic pricing part of the auction.
    function createAuction(uint256 _deedId, uint256 _startPrice, uint256 _endPrice, uint256 _duration)
        public
        fitsIn128Bits(_startPrice)
        fitsIn128Bits(_endPrice)
        fitsIn64Bits(_duration)
        whenNotPaused
    {
        // Get the owner of the deed to be auctioned
        address deedOwner = deedContract.ownerOf(_deedId);
    
        // Caller must either be the deed contract or the owner of the deed
        // to prevent abuse.
        require(
            msg.sender == address(deedContract) ||
            msg.sender == deedOwner
        );
    
        // The duration of the auction must be at least 60 seconds.
        require(_duration >= 60);
    
        // Throws if placing the deed in escrow fails (the contract requires
        // transfer approval prior to creating the auction).
        _escrow(_deedId);
        
        // Auction struct
        Auction memory auction = Auction(
            deedOwner,
            uint128(_startPrice),
            uint128(_endPrice),
            uint64(_duration),
            uint64(now)
        );
        
        _createAuction(_deedId, auction);
    }
    
    /// @notice Cancel an auction
    /// @param _deedId The identifier of the deed to cancel the auction for.
    function cancelAuction(uint256 _deedId) external whenNotPaused {
        Auction storage auction = identifierToAuction[_deedId];
        
        // The auction must be active.
        require(_activeAuction(auction));
        
        // The auction can only be cancelled by the seller
        require(msg.sender == auction.seller);
        
        _cancelAuction(_deedId, auction);
    }
    
    /// @notice Bid on an auction.
    /// @param _deedId The identifier of the deed to bid on.
    function bid(uint256 _deedId) external payable whenNotPaused {
        // Throws if the bid does not succeed.
        _bid(msg.sender, msg.value, _deedId);
    }
    
    /// @dev Returns the current price of an auction.
    /// @param _deedId The identifier of the deed to get the currency price for.
    function getCurrentPrice(uint256 _deedId) external view returns (uint256) {
        Auction storage auction = identifierToAuction[_deedId];
        
        // The auction must be active.
        require(_activeAuction(auction));
        
        return _currentPrice(auction);
    }
    
    /// @notice Withdraw ether owed to a beneficiary.
    /// @param beneficiary The address to withdraw the auction balance for.
    function withdrawAuctionBalance(address beneficiary) external {
        // The sender must either be the beneficiary or the core deed contract.
        require(
            msg.sender == beneficiary ||
            msg.sender == address(deedContract)
        );
        
        uint256 etherOwed = addressToEtherOwed[beneficiary];
        
        // Ensure ether is owed to the beneficiary.
        require(etherOwed > 0);
         
        // Set ether owed to 0   
        delete addressToEtherOwed[beneficiary];
        
        // Subtract from total outstanding balance. etherOwed is guaranteed
        // to be less than or equal to outstandingEther, so this cannot
        // underflow.
        outstandingEther -= etherOwed;
        
        // Transfer ether owed to the beneficiary (not susceptible to re-entry
        // attack, as the ether owed is set to 0 before the transfer takes place).
        beneficiary.transfer(etherOwed);
    }
    
    /// @notice Withdraw (unowed) contract balance.
    function withdrawFreeBalance() external {
        // Calculate the free (unowed) balance. This never underflows, as
        // outstandingEther is guaranteed to be less than or equal to the
        // contract balance.
        uint256 freeBalance = this.balance - outstandingEther;
        
        address deedContractAddress = address(deedContract);

        require(
            msg.sender == owner ||
            msg.sender == deedContractAddress
        );
        
        deedContractAddress.transfer(freeBalance);
    }
}


contract SaleAuction is ClockAuction {
    function SaleAuction(address _deedContractAddress, uint256 _fee) ClockAuction(_deedContractAddress, _fee) public {}
    
    /// @dev Allows other contracts to check whether this is the expected contract.
    bool public isSaleAuction = true;
}


contract RentAuction is ClockAuction {
    function RentAuction(address _deedContractAddress, uint256 _fee) ClockAuction(_deedContractAddress, _fee) public {}
    
    /// @dev Allows other contracts to check whether this is the expected contract.
    bool public isRentAuction = true;
    
    mapping (uint256 => uint256) public identifierToRentPeriod;
    
    /// @notice Create an auction for a given deed. Be careful when calling
    /// createAuction for a RentAuction, that this overloaded function (including
    /// the _rentPeriod parameter) is used. Otherwise the rent period defaults to
    /// a week.
    /// Must previously have been given approval to take ownership of the deed.
    /// @param _deedId The identifier of the deed to create an auction for.
    /// @param _startPrice The starting price of the auction.
    /// @param _endPrice The ending price of the auction.
    /// @param _duration The duration in seconds of the dynamic pricing part of the auction.
    /// @param _rentPeriod The rent period in seconds being auctioned.
    function createAuction(
        uint256 _deedId,
        uint256 _startPrice,
        uint256 _endPrice,
        uint256 _duration,
        uint256 _rentPeriod
    )
        external
    {
        // Require the rent period to be at least one hour.
        require(_rentPeriod >= 3600);
        
        // Require there to be no active renter.
        DWorldRenting dWorldRentingContract = DWorldRenting(deedContract);
        var (renter,) = dWorldRentingContract.renterOf(_deedId);
        require(renter == address(0));
    
        // Set the rent period.
        identifierToRentPeriod[_deedId] = _rentPeriod;
    
        // Throws (reverts) if creating the auction fails.
        createAuction(_deedId, _startPrice, _endPrice, _duration);
    }
    
    /// @dev Perform the bid win logic (in this case: give renter status to the winner).
    /// @param _seller The address of the seller.
    /// @param _winner The address of the winner.
    /// @param _deedId The identifier of the deed.
    /// @param _price The price the auction was bought at.
    function _winBid(address _seller, address _winner, uint256 _deedId, uint256 _price) internal {
        DWorldRenting dWorldRentingContract = DWorldRenting(deedContract);
    
        uint256 rentPeriod = identifierToRentPeriod[_deedId];
        if (rentPeriod == 0) {
            rentPeriod = 604800; // 1 week by default
        }
    
        // Rent the deed out to the winner.
        dWorldRentingContract.rentOut(_winner, identifierToRentPeriod[_deedId], _deedId);
        
        // Transfer the deed back to the seller.
        _transfer(_seller, _deedId);
    }
    
    /// @dev Remove an auction.
    /// @param _deedId The identifier of the deed for which the auction should be removed.
    function _removeAuction(uint256 _deedId) internal {
        delete identifierToAuction[_deedId];
        delete identifierToRentPeriod[_deedId];
    }
}


/// @dev Holds functionality for minting new plot deeds.
contract DWorldMinting is DWorldRenting {
    uint256 public unclaimedPlotPrice = 0.0025 ether;
    mapping (address => uint256) freeClaimAllowance;
    
    /// @notice Sets the new price for unclaimed plots.
    /// @param _unclaimedPlotPrice The new price for unclaimed plots.
    function setUnclaimedPlotPrice(uint256 _unclaimedPlotPrice) external onlyCFO {
        unclaimedPlotPrice = _unclaimedPlotPrice;
    }
    
    /// @notice Set the free claim allowance for an address.
    /// @param addr The address to set the free claim allowance for.
    /// @param allowance The free claim allowance to set.
    function setFreeClaimAllowance(address addr, uint256 allowance) external onlyCFO {
        freeClaimAllowance[addr] = allowance;
    }
    
    /// @notice Get the free claim allowance of an address.
    /// @param addr The address to get the free claim allowance of.
    function freeClaimAllowanceOf(address addr) external view returns (uint256) {
        return freeClaimAllowance[addr];
    }
       
    /// @notice Buy an unclaimed plot.
    /// @param _deedId The unclaimed plot to buy.
    function claimPlot(uint256 _deedId) external payable whenNotPaused {
        claimPlotWithData(_deedId, "", "", "", "");
    }
       
    /// @notice Buy an unclaimed plot.
    /// @param _deedId The unclaimed plot to buy.
    /// @param name The name to give the plot.
    /// @param description The description to add to the plot.
    /// @param imageUrl The image url for the plot.
    /// @param infoUrl The info url for the plot.
    function claimPlotWithData(uint256 _deedId, string name, string description, string imageUrl, string infoUrl) public payable whenNotPaused {
        uint256[] memory _deedIds = new uint256[](1);
        _deedIds[0] = _deedId;
        
        claimPlotMultipleWithData(_deedIds, name, description, imageUrl, infoUrl);
    }
    
    /// @notice Buy unclaimed plots.
    /// @param _deedIds The unclaimed plots to buy.
    function claimPlotMultiple(uint256[] _deedIds) external payable whenNotPaused {
        claimPlotMultipleWithData(_deedIds, "", "", "", "");
    }
    
    /// @notice Buy unclaimed plots.
    /// @param _deedIds The unclaimed plots to buy.
    /// @param name The name to give the plots.
    /// @param description The description to add to the plots.
    /// @param imageUrl The image url for the plots.
    /// @param infoUrl The info url for the plots.
    function claimPlotMultipleWithData(uint256[] _deedIds, string name, string description, string imageUrl, string infoUrl) public payable whenNotPaused {
        uint256 buyAmount = _deedIds.length;
        uint256 etherRequired;
        if (freeClaimAllowance[msg.sender] > 0) {
            // The sender has a free claim allowance.
            if (freeClaimAllowance[msg.sender] > buyAmount) {
                // Subtract from allowance.
                freeClaimAllowance[msg.sender] -= buyAmount;
                
                // No ether is required.
                etherRequired = 0;
            } else {
                uint256 freeAmount = freeClaimAllowance[msg.sender];
                
                // The full allowance has been used.
                delete freeClaimAllowance[msg.sender];
                
                // The subtraction cannot underflow, as freeAmount <= buyAmount.
                etherRequired = unclaimedPlotPrice.mul(buyAmount - freeAmount);
            }
        } else {
            // The sender does not have a free claim allowance.
            etherRequired = unclaimedPlotPrice.mul(buyAmount);
        }
        
        // Ensure enough ether is supplied.
        require(msg.value >= etherRequired);
        
        uint256 offset = plots.length;
        
        // Allocate additional memory for the plots array
        // (this is more efficient than .push-ing each individual
        // plot, as that requires multiple dynamic allocations).
        plots.length = plots.length.add(_deedIds.length);
        
        for (uint256 i = 0; i < _deedIds.length; i++) { 
            uint256 _deedId = _deedIds[i];
            require(validIdentifier(_deedId));
            
            // The plot must be unowned (a plot deed cannot be transferred to
            // 0x0, so once a plot is claimed it will always be owned by a
            // non-zero address).
            require(identifierToOwner[_deedId] == address(0));
            
            // Create the plot
            plots[offset + i] = uint32(_deedId);
            
            // Transfer the new plot to the sender.
            _transfer(address(0), msg.sender, _deedId);
            
            // Set the plot data.
            _setPlotData(_deedId, name, description, imageUrl, infoUrl);
        }
        
        // Calculate the excess ether sent
        // msg.value is greater than or equal to etherRequired,
        // so this cannot underflow.
        uint256 excess = msg.value - etherRequired;
        
        if (excess > 0) {
            // Refund any excess ether (not susceptible to re-entry attack, as
            // the owner is assigned before the transfer takes place).
            msg.sender.transfer(excess);
        }
    }
}


/// @dev Implements DWorld auction functionality.
contract DWorldAuction is DWorldMinting {
    SaleAuction public saleAuctionContract;
    RentAuction public rentAuctionContract;
    
    /// @notice set the contract address of the sale auction.
    /// @param _address The address of the sale auction.
    function setSaleAuctionContractAddress(address _address) external onlyOwner {
        SaleAuction _contract = SaleAuction(_address);
    
        require(_contract.isSaleAuction());
        
        saleAuctionContract = _contract;
    }
    
    /// @notice Set the contract address of the rent auction.
    /// @param _address The address of the rent auction.
    function setRentAuctionContractAddress(address _address) external onlyOwner {
        RentAuction _contract = RentAuction(_address);
    
        require(_contract.isRentAuction());
        
        rentAuctionContract = _contract;
    }
    
    /// @notice Create a sale auction.
    /// @param _deedId The identifier of the deed to create a sale auction for.
    /// @param _startPrice The starting price of the sale auction.
    /// @param _endPrice The ending price of the sale auction.
    /// @param _duration The duration in seconds of the dynamic pricing part of the sale auction.
    function createSaleAuction(uint256 _deedId, uint256 _startPrice, uint256 _endPrice, uint256 _duration)
        external
        whenNotPaused
    {
        require(_owns(msg.sender, _deedId));
        
        // Prevent creating a sale auction if no sale auction contract is configured.
        require(address(saleAuctionContract) != address(0));
    
        // Approve the deed for transferring to the sale auction.
        _approve(msg.sender, address(saleAuctionContract), _deedId);
    
        // Auction contract checks input values (throws if invalid) and places the deed into escrow.
        saleAuctionContract.createAuction(_deedId, _startPrice, _endPrice, _duration);
    }
    
    /// @notice Create a rent auction.
    /// @param _deedId The identifier of the deed to create a rent auction for.
    /// @param _startPrice The starting price of the rent auction.
    /// @param _endPrice The ending price of the rent auction.
    /// @param _duration The duration in seconds of the dynamic pricing part of the rent auction.
    /// @param _rentPeriod The rent period in seconds being auctioned.
    function createRentAuction(uint256 _deedId, uint256 _startPrice, uint256 _endPrice, uint256 _duration, uint256 _rentPeriod)
        external
        whenNotPaused
    {
        require(_owns(msg.sender, _deedId));
        
        // Prevent creating a rent auction if no rent auction contract is configured.
        require(address(rentAuctionContract) != address(0));
        
        // Approve the deed for transferring to the rent auction.
        _approve(msg.sender, address(rentAuctionContract), _deedId);
        
        // Throws if the auction is invalid (e.g. deed is already rented out),
        // and places the deed into escrow.
        rentAuctionContract.createAuction(_deedId, _startPrice, _endPrice, _duration, _rentPeriod);
    }
    
    /// @notice Allow the CFO to capture the free balance available
    /// in the auction contracts.
    function withdrawFreeAuctionBalances() external onlyCFO {
        saleAuctionContract.withdrawFreeBalance();
        rentAuctionContract.withdrawFreeBalance();
    }
    
    /// @notice Allow withdrawing balances from the auction contracts
    /// in a single step.
    function withdrawAuctionBalances() external {
        // Withdraw from the sale contract if the sender is owed Ether.
        if (saleAuctionContract.addressToEtherOwed(msg.sender) > 0) {
            saleAuctionContract.withdrawAuctionBalance(msg.sender);
        }
        
        // Withdraw from the rent contract if the sender is owed Ether.
        if (rentAuctionContract.addressToEtherOwed(msg.sender) > 0) {
            rentAuctionContract.withdrawAuctionBalance(msg.sender);
        }
    }
    
    /// @dev This contract is only payable by the auction contracts.
    function() public payable {
        require(
            msg.sender == address(saleAuctionContract) ||
            msg.sender == address(rentAuctionContract)
        );
    }
}


/// @dev Implements highest-level DWorld functionality.
contract DWorldCore is DWorldAuction {
    /// If this contract is broken, this will be used to publish the address at which an upgraded contract can be found
    address public upgradedContractAddress;
    event ContractUpgrade(address upgradedContractAddress);

    /// @notice Only to be used when this contract is significantly broken,
    /// and an upgrade is required.
    function setUpgradedContractAddress(address _upgradedContractAddress) external onlyOwner whenPaused {
        upgradedContractAddress = _upgradedContractAddress;
        ContractUpgrade(_upgradedContractAddress);
    }

    /// @notice Set the data associated with a plot.
    function setPlotData(uint256 _deedId, string name, string description, string imageUrl, string infoUrl)
        public
        whenNotPaused
    {
        // The sender requesting the data update should be
        // the owner (without an active renter) or should
        // be the active renter.
        require(_owns(msg.sender, _deedId) && identifierToRentPeriodEndTimestamp[_deedId] < now || _rents(msg.sender, _deedId));
    
        // Set the data
        _setPlotData(_deedId, name, description, imageUrl, infoUrl);
    }
    
    /// @notice Set the data associated with multiple plots.
    function setPlotDataMultiple(uint256[] _deedIds, string name, string description, string imageUrl, string infoUrl)
        external
        whenNotPaused
    {
        for (uint256 i = 0; i < _deedIds.length; i++) {
            uint256 _deedId = _deedIds[i];
        
            setPlotData(_deedId, name, description, imageUrl, infoUrl);
        }
    }
    
    /// @notice Allow the CFO to withdraw balance available to this contract.
    function withdrawBalance() external onlyCFO {
        cfoAddress.transfer(this.balance);
    }
}

Contract Security Audit

Contract ABI

[{"constant":true,"inputs":[{"name":"_interfaceID","type":"bytes4"}],"name":"supportsInterface","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"saleAuctionContract","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"cfoAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"_deedName","type":"string"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_deedId","type":"uint256"}],"name":"approve","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"upgradedContractAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"identifier","type":"uint256"}],"name":"validIdentifier","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[{"name":"_deedIds","type":"uint256[]"},{"name":"name","type":"string"},{"name":"description","type":"string"},{"name":"imageUrl","type":"string"},{"name":"infoUrl","type":"string"}],"name":"setPlotDataMultiple","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"token","type":"address"}],"name":"reclaimToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_deedIds","type":"uint256[]"}],"name":"transferMultiple","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_deedIds","type":"uint256[]"}],"name":"approveMultiple","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"withdrawFreeAuctionBalances","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_unclaimedPlotPrice","type":"uint256"}],"name":"setUnclaimedPlotPrice","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"x","type":"uint256"},{"name":"y","type":"uint256"}],"name":"coordinateToIdentifier","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[{"name":"_deedId","type":"uint256"},{"name":"name","type":"string"},{"name":"description","type":"string"},{"name":"imageUrl","type":"string"},{"name":"infoUrl","type":"string"}],"name":"claimPlotWithData","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"deedsOfOwner","outputs":[{"name":"","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_deedId","type":"uint256"},{"name":"_startPrice","type":"uint256"},{"name":"_endPrice","type":"uint256"},{"name":"_duration","type":"uint256"}],"name":"createSaleAuction","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_deedId","type":"uint256"}],"name":"renterOf","outputs":[{"name":"_renter","type":"address"},{"name":"_rentPeriodEndTimestamp","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"unpause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_deedIds","type":"uint256[]"}],"name":"claimPlotMultiple","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"addr","type":"address"},{"name":"allowance","type":"uint256"}],"name":"setFreeClaimAllowance","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newCFO","type":"address"}],"name":"setCFO","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"claimOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"rentAuctionContract","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_index","type":"uint256"}],"name":"deedOfOwnerByIndex","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_deedId","type":"uint256"},{"name":"name","type":"string"},{"name":"description","type":"string"},{"name":"imageUrl","type":"string"},{"name":"infoUrl","type":"string"}],"name":"setPlotData","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_deedId","type":"uint256"}],"name":"claimPlot","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"paused","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"withdrawBalance","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"plots","outputs":[{"name":"","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_deedId","type":"uint256"}],"name":"ownerOf","outputs":[{"name":"_owner","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"unclaimedPlotPrice","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"identifier","type":"uint256"}],"name":"identifierToCoordinate","outputs":[{"name":"x","type":"uint256"},{"name":"y","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[],"name":"pause","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":"withdrawAuctionBalances","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getAllPlots","outputs":[{"name":"","type":"uint32[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"countOfDeedsByOwner","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"_deedSymbol","type":"string"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"name":"x","type":"uint256"},{"name":"y","type":"uint256"}],"name":"validCoordinate","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_deedId","type":"uint256"}],"name":"transfer","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_rentPeriod","type":"uint256"},{"name":"_deedId","type":"uint256"}],"name":"rentOut","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_deedId","type":"uint256"}],"name":"takeOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_deedId","type":"uint256"}],"name":"deedUri","outputs":[{"name":"uri","type":"string"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"countOfDeeds","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_address","type":"address"}],"name":"setRentAuctionContractAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_upgradedContractAddress","type":"address"}],"name":"setUpgradedContractAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_rentPeriod","type":"uint256"},{"name":"_deedIds","type":"uint256[]"}],"name":"rentOutMultiple","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"addr","type":"address"}],"name":"freeClaimAllowanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_deedId","type":"uint256"},{"name":"_startPrice","type":"uint256"},{"name":"_endPrice","type":"uint256"},{"name":"_duration","type":"uint256"},{"name":"_rentPeriod","type":"uint256"}],"name":"createRentAuction","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"pendingOwner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_address","type":"address"}],"name":"setSaleAuctionContractAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_deedIds","type":"uint256[]"}],"name":"takeOwnershipMultiple","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_deedIds","type":"uint256[]"},{"name":"name","type":"string"},{"name":"description","type":"string"},{"name":"imageUrl","type":"string"},{"name":"infoUrl","type":"string"}],"name":"claimPlotMultipleWithData","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":false,"name":"upgradedContractAddress","type":"address"}],"name":"ContractUpgrade","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"renter","type":"address"},{"indexed":true,"name":"deedId","type":"uint256"},{"indexed":false,"name":"rentPeriodEndTimestamp","type":"uint256"},{"indexed":false,"name":"rentPeriod","type":"uint256"}],"name":"Rent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":true,"name":"deedId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"approved","type":"address"},{"indexed":true,"name":"deedId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"deedId","type":"uint256"},{"indexed":false,"name":"name","type":"string"},{"indexed":false,"name":"description","type":"string"},{"indexed":false,"name":"imageUrl","type":"string"},{"indexed":false,"name":"infoUrl","type":"string"}],"name":"SetData","type":"event"},{"anonymous":false,"inputs":[],"name":"Pause","type":"event"},{"anonymous":false,"inputs":[],"name":"Unpause","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"}]

60606040526001805460a060020a60ff02191690556608e1bc9bf0400060095560008054600160a060020a033316600160a060020a03199182168117909255600280549091169091179055612ecf806100596000396000f3006060604052600436106102795763ffffffff60e060020a60003504166301ffc9a781146102b157806303850848146102fd5780630519ce791461032c57806306fdde031461033f578063095ea7b3146103c95780630da2e088146103eb5780630ec6b08d146103fe5780631680a0701461041457806317ffc320146104625780631d976e05146104815780631f5c3a3c146104de5780631f8077361461053b578063249830d81461054e578063258a61d6146105645780632748d7e41461058f5780632d620e1e146106a05780633d7d3f5a146107125780633d9f01fb146107315780633f4ba83a1461076957806345a88ff61461077c5780634830e6361461078f5780634e0a3379146107b15780634e71e0c8146107d057806352d3a9dd146107e357806353270910146107f65780635b0088fb146108185780635bfc61c0146109345780635c975abb1461093f5780635fd8c7101461095257806361bf49ee146109655780636352211e14610994578063689f3f99146109aa5780636d6bc5f5146109bd5780638456cb59146109eb5780638da5cb5b146109fe57806391876e5714610a11578063925074ca14610a2457806392efd27714610a3757806395d89b4114610a56578063a6da54a314610a69578063a9059cbb14610a82578063b0f6952314610aa4578063b2e6ceeb14610ac9578063b95d2a5314610adf578063c34588ba14610af5578063c4ef18fc14610b08578063c78e139a14610b27578063ccb60e3914610b46578063cfdb2eb714610ba9578063df4c98b514610bc8578063e30c397814610bea578063e3a531a314610bfd578063e435f2c914610c1c578063e658d22114610c6b578063f2fde38b14610db7575b600b5433600160a060020a03908116911614806102a45750600c5433600160a060020a039081169116145b15156102af57600080fd5b005b34156102bc57600080fd5b6102e97fffffffff0000000000000000000000000000000000000000000000000000000060043516610dd6565b604051901515815260200160405180910390f35b341561030857600080fd5b610310611047565b604051600160a060020a03909116815260200160405180910390f35b341561033757600080fd5b610310611056565b341561034a57600080fd5b610352611065565b60405160208082528190810183818151815260200191508051906020019080838360005b8381101561038e578082015183820152602001610376565b50505050905090810190601f1680156103bb5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156103d457600080fd5b6102af600160a060020a03600435166024356110a6565b34156103f657600080fd5b61031061110e565b341561040957600080fd5b6102e960043561111d565b341561041f57600080fd5b6102af6024600480358281019290820135918135808301929082013591604435808301929082013591606435808301929082013591608435918201910135611128565b341561046d57600080fd5b6102af600160a060020a036004351661124e565b341561048c57600080fd5b6102af60048035600160a060020a031690604460248035908101908301358060208082020160405190810160405280939291908181526020018383602002808284375094965061130295505050505050565b34156104e957600080fd5b6102af60048035600160a060020a03169060446024803590810190830135806020808202016040519081016040528093929190818152602001838360200280828437509496506113ab95505050505050565b341561054657600080fd5b6102af611439565b341561055957600080fd5b6102af6004356114f8565b341561056f57600080fd5b61057d600435602435611518565b60405190815260200160405180910390f35b6102af600480359060446024803590810190830135806020601f8201819004810201604051908101604052818152929190602084018383808284378201915050505050509190803590602001908201803590602001908080601f01602080910402602001604051908101604052818152929190602084018383808284378201915050505050509190803590602001908201803590602001908080601f01602080910402602001604051908101604052818152929190602084018383808284378201915050505050509190803590602001908201803590602001908080601f01602080910402602001604051908101604052818152929190602084018383808284375094965061153995505050505050565b34156106ab57600080fd5b6106bf600160a060020a03600435166115a7565b60405160208082528190810183818151815260200191508051906020019060200280838360005b838110156106fe5780820151838201526020016106e6565b505050509050019250505060405180910390f35b341561071d57600080fd5b6102af6004356024356044356064356116c3565b341561073c57600080fd5b610747600435611795565b604051600160a060020a03909216825260208201526040908101905180910390f35b341561077457600080fd5b6102af6117fd565b6102af600480356024810191013561187c565b341561079a57600080fd5b6102af600160a060020a036004351660243561190c565b34156107bc57600080fd5b6102af600160a060020a0360043516611943565b34156107db57600080fd5b6102af611995565b34156107ee57600080fd5b610310611a16565b341561080157600080fd5b61057d600160a060020a0360043516602435611a25565b341561082357600080fd5b6102af600480359060446024803590810190830135806020601f8201819004810201604051908101604052818152929190602084018383808284378201915050505050509190803590602001908201803590602001908080601f01602080910402602001604051908101604052818152929190602084018383808284378201915050505050509190803590602001908201803590602001908080601f01602080910402602001604051908101604052818152929190602084018383808284378201915050505050509190803590602001908201803590602001908080601f016020809104026020016040519081016040528181529291906020840183838082843750949650611adf95505050505050565b6102af600435611b49565b341561094a57600080fd5b6102e9611bae565b341561095d57600080fd5b6102af611bbe565b341561097057600080fd5b61097b600435611c14565b60405163ffffffff909116815260200160405180910390f35b341561099f57600080fd5b610310600435611c4c565b34156109b557600080fd5b61057d611c70565b34156109c857600080fd5b6109d3600435611c76565b60405191825260208201526040908101905180910390f35b34156109f657600080fd5b6102af611c9f565b3415610a0957600080fd5b610310611d23565b3415610a1c57600080fd5b6102af611d32565b3415610a2f57600080fd5b6106bf611edf565b3415610a4257600080fd5b61057d600160a060020a0360043516611f6a565b3415610a6157600080fd5b610352611f85565b3415610a7457600080fd5b6102e9600435602435611fc6565b3415610a8d57600080fd5b6102af600160a060020a0360043516602435611fe3565b3415610aaf57600080fd5b6102af600160a060020a0360043516602435604435612046565b3415610ad457600080fd5b6102af6004356120aa565b3415610aea57600080fd5b61035260043561210c565b3415610b0057600080fd5b61057d6122c1565b3415610b1357600080fd5b6102af600160a060020a03600435166122c7565b3415610b3257600080fd5b6102af600160a060020a0360043516612374565b3415610b5157600080fd5b6102af60048035600160a060020a031690602480359190606490604435908101908301358060208082020160405190810160405280939291908181526020018383602002808284375094965061240295505050505050565b3415610bb457600080fd5b61057d600160a060020a03600435166124d4565b3415610bd357600080fd5b6102af6004356024356044356064356084356124ef565b3415610bf557600080fd5b6103106125cb565b3415610c0857600080fd5b6102af600160a060020a03600435166125da565b3415610c2757600080fd5b6102af600460248135818101908301358060208181020160405190810160405280939291908181526020018383602002808284375094965061268795505050505050565b6102af600460248135818101908301358060208181020160405190810160405280939291908181526020018383602002808284378201915050505050509190803590602001908201803590602001908080601f01602080910402602001604051908101604052818152929190602084018383808284378201915050505050509190803590602001908201803590602001908080601f01602080910402602001604051908101604052818152929190602084018383808284378201915050505050509190803590602001908201803590602001908080601f01602080910402602001604051908101604052818152929190602084018383808284378201915050505050509190803590602001908201803590602001908080601f01602080910402602001604051908101604052818152929190602084018383808284375094965061271195505050505050565b3415610dc257600080fd5b6102af600160a060020a036004351661292e565b60006040517f737570706f727473496e7465726661636528627974657334290000000000000081526019016040518091039020600160e060020a03191682600160e060020a0319161480610f8d57506040517f74616b654f776e6572736869702875696e743235362900000000000000000000815260160160405180910390206040517f617070726f766528616464726573732c75696e74323536290000000000000000815260180160405180910390206040517f646565644f664f776e65724279496e64657828616464726573732c75696e743281527f3536290000000000000000000000000000000000000000000000000000000000602082015260230160405180910390206040517f636f756e744f66446565647342794f776e6572286164647265737329000000008152601c0160405180910390206040517f636f756e744f66446565647328290000000000000000000000000000000000008152600e0160405180910390206040517f6f776e65724f662875696e743235362900000000000000000000000000000000815260100160405180910390201818181818600160e060020a03191682600160e060020a031916145b8061103f57506040517f646565645572692875696e743235362900000000000000000000000000000000815260100160405180910390206040517f73796d626f6c2829000000000000000000000000000000000000000000000000815260080160405180910390206040517f6e616d6528290000000000000000000000000000000000000000000000000000815260060160405180910390201818600160e060020a03191682600160e060020a031916145b90505b919050565b600b54600160a060020a031681565b600254600160a060020a031681565b61106d612e49565b60408051908101604052600c81527f44576f726c6420506c6f747300000000000000000000000000000000000000006020820152919050565b6110ae612e49565b60015460a060020a900460ff16156110c557600080fd5b60016040518059106110d45750595b9080825280602002602001820160405250905081816000815181106110f557fe5b6020908102909101015261110983826113ab565b505050565b600d54600160a060020a031681565b640100000000901090565b600154600090819060a060020a900460ff161561114457600080fd5b600091505b8a821015611240578b8b8381811061115d57fe5b905060200201359050611235818b8b8080601f01602080910402602001604051908101604052818152929190602084018383808284378201915050505050508a8a8080601f016020809104026020016040519081016040528181529291906020840183838082843782019150505050505089898080601f016020809104026020016040519081016040528181529291906020840183838082843782019150505050505088888080601f016020809104026020016040519081016040528181529291906020840183838082843750611adf945050505050565b600190910190611149565b505050505050505050505050565b6000805433600160a060020a0390811691161461126a57600080fd5b81600160a060020a03166370a082313060006040516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b15156112c157600080fd5b6102c65a03f115156112d257600080fd5b50505060405180516000549092506112fe9150600160a060020a0384811691168363ffffffff61296b16565b5050565b600154600090819060a060020a900460ff161561131e57600080fd5b600160a060020a038416151561133357600080fd5b30600160a060020a031684600160a060020a03161415151561135457600080fd5b600091505b82518210156113a55782828151811061136e57fe5b90602001906020020151905061138433826129eb565b151561138f57600080fd5b61139a338583612a0b565b600190910190611359565b50505050565b600154600090819060a060020a900460ff16156113c757600080fd5b83600160a060020a031633600160a060020a0316141515156113e857600080fd5b600091505b82518210156113a55782828151811061140257fe5b90602001906020020151905061141833826129eb565b151561142357600080fd5b61142e338583612ad2565b6001909101906113ed565b60025433600160a060020a0390811691161461145457600080fd5b600b54600160a060020a031663ee8b39f66040518163ffffffff1660e060020a028152600401600060405180830381600087803b151561149357600080fd5b6102c65a03f115156114a457600080fd5b5050600c54600160a060020a0316905063ee8b39f66040518163ffffffff1660e060020a028152600401600060405180830381600087803b15156114e757600080fd5b6102c65a03f1151561110957600080fd5b60025433600160a060020a0390811691161461151357600080fd5b600955565b60006115248383611fc6565b151561152f57600080fd5b5062010000020190565b611541612e49565b60015460a060020a900460ff161561155857600080fd5b60016040518059106115675750595b90808252806020026020018201604052509050858160008151811061158857fe5b6020908102909101015261159f8186868686612711565b505050505050565b6115af612e49565b60006115b9612e49565b6000806000806115c888611f6a565b95508515156115f85760006040518059106115e05750595b908082528060200260200182016040525096506116b8565b856040518059106116065750595b908082528060200260200182016040525094506116216122c1565b935060009250600091505b838210156116b457600380548390811061164257fe5b60009182526020808320600880840490910154920660049081026101000a90920463ffffffff16808452919052604090912054909150600160a060020a03898116911614156116a9578085848151811061169857fe5b602090810290910101526001909201915b60019091019061162c565b8496505b505050505050919050565b60015460a060020a900460ff16156116da57600080fd5b6116e433856129eb565b15156116ef57600080fd5b600b54600160a060020a0316151561170657600080fd5b600b5461171e903390600160a060020a031686612ad2565b600b54600160a060020a031663431f21da8585858560405160e060020a63ffffffff87160281526004810194909452602484019290925260448301526064820152608401600060405180830381600087803b151561177b57600080fd5b6102c65a03f1151561178c57600080fd5b50505050505050565b6000806117a18361111d565b15156117ac57600080fd5b600083815260086020526040902054429010156117ce575060009050806117f8565b5050600081815260076020908152604080832054600890925290912054600160a060020a03909116905b915091565b60005433600160a060020a0390811691161461181857600080fd5b60015460a060020a900460ff16151561183057600080fd5b6001805474ff0000000000000000000000000000000000000000191690557f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a1565b60015460a060020a900460ff161561189357600080fd5b6112fe8282808060200260200160405190810160405280939291908181526020018383602002808284375060209450604093505050505190810160405280600081525060206040519081016040528060008152506020604051908101604052806000815250602060405190810160405260008152612711565b60025433600160a060020a0390811691161461192757600080fd5b600160a060020a039091166000908152600a6020526040902055565b60005433600160a060020a0390811691161461195e57600080fd5b600160a060020a038116151561197357600080fd5b60028054600160a060020a031916600160a060020a0392909216919091179055565b60015433600160a060020a039081169116146119b057600080fd5b600154600054600160a060020a0391821691167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36001805460008054600160a060020a0319908116600160a060020a03841617909155169055565b600c54600160a060020a031681565b6000806000806000611a3687611f6a565b8610611a4157600080fd5b60009350611a4d6122c1565b9250600091505b82821015611ad5576003805483908110611a6a57fe5b60009182526020808320600880840490910154920660049081026101000a90920463ffffffff16808452919052604090912054909150600160a060020a0388811691161415611aca5785841415611ac357809450611ad5565b6001909301925b600190910190611a54565b5050505092915050565b60015460a060020a900460ff1615611af657600080fd5b611b0033866129eb565b8015611b1a57506000858152600860205260409020544290105b80611b2a5750611b2a3386612b36565b1515611b3557600080fd5b611b428585858585612b73565b5050505050565b60015460a060020a900460ff1615611b6057600080fd5b611bab81602060405190810160405280600081525060206040519081016040528060008152506020604051908101604052806000815250602060405190810160405260008152611539565b50565b60015460a060020a900460ff1681565b60025433600160a060020a03908116911614611bd957600080fd5b600254600160a060020a039081169030163180156108fc0290604051600060405180830381858888f193505050501515611c1257600080fd5b565b6003805482908110611c2257fe5b9060005260206000209060089182820401919006600402915054906101000a900463ffffffff1681565b600081815260046020526040902054600160a060020a031680151561104257600080fd5b60095481565b600080611c828361111d565b1515611c8d57600080fd5b50506201000080820490810290910391565b60005433600160a060020a03908116911614611cba57600080fd5b60015460a060020a900460ff1615611cd157600080fd5b6001805474ff0000000000000000000000000000000000000000191660a060020a1790557f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a1565b600054600160a060020a031681565b600b54600090600160a060020a031663b8fd1ffa33836040516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b1515611d8d57600080fd5b6102c65a03f11515611d9e57600080fd5b505050604051805190501115611e1357600b54600160a060020a0316630c60223e3360405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b1515611dfe57600080fd5b6102c65a03f11515611e0f57600080fd5b5050505b600c54600090600160a060020a031663b8fd1ffa33836040516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b1515611e6e57600080fd5b6102c65a03f11515611e7f57600080fd5b505050604051805190501115611c1257600c54600160a060020a0316630c60223e3360405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b15156114e757600080fd5b611ee7612e49565b6003805480602002602001604051908101604052809291908181526020018280548015611f5f57602002820191906000526020600020906000905b82829054906101000a900463ffffffff1663ffffffff1681526020019060040190602082600301049283019260010382029150808411611f225790505b505050505090505b90565b600160a060020a031660009081526006602052604090205490565b611f8d612e49565b60408051908101604052600381527f44575000000000000000000000000000000000000000000000000000000000006020820152919050565b60006201000083108015611fdc57506201000082105b9392505050565b611feb612e49565b60015460a060020a900460ff161561200257600080fd5b60016040518059106120115750595b90808252806020026020018201604052509050818160008151811061203257fe5b602090810290910101526111098382611302565b61204e612e49565b60015460a060020a900460ff161561206557600080fd5b60016040518059106120745750595b90808252806020026020018201604052509050818160008151811061209557fe5b602090810290910101526113a5848483612402565b6120b2612e49565b60015460a060020a900460ff16156120c957600080fd5b60016040518059106120d85750595b9080825280602002602001820160405250905081816000815181106120f957fe5b602090810290910101526112fe81612687565b612114612e49565b60008061211f612e49565b600061212a8661111d565b151561213557600080fd5b61213e86611c76565b93509350606060405190810160405280602281526020017f68747470733a2f2f64776f726c642e696f2f706c6f742f78787878782f78787881526020017f78780000000000000000000000000000000000000000000000000000000000008152509450849150600090505b60058110156122b857600a81600a0a858115156121c257fe5b048115156121cc57fe5b066030017f0100000000000000000000000000000000000000000000000000000000000000028282601b038151811061220157fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a81600a0a8481151561224157fe5b0481151561224b57fe5b066030017f01000000000000000000000000000000000000000000000000000000000000000282826021038151811061228057fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506001016121a9565b50505050919050565b60035490565b6000805433600160a060020a039081169116146122e357600080fd5b5080600160a060020a03811663d381c67e6000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b151561232b57600080fd5b6102c65a03f1151561233c57600080fd5b50505060405180519050151561235157600080fd5b600c8054600160a060020a031916600160a060020a039290921691909117905550565b60005433600160a060020a0390811691161461238f57600080fd5b60015460a060020a900460ff1615156123a757600080fd5b600d8054600160a060020a031916600160a060020a0383161790557f450db8da6efbe9c22f2347f7c2021231df1fc58d3ae9a2fa75d39fa44619930581604051600160a060020a03909116815260200160405180910390a150565b600154600090819060a060020a900460ff161561241e57600080fd5b600160a060020a038516151561243357600080fd5b30600160a060020a031685600160a060020a03161415151561245457600080fd5b600091505b8251821015611b425782828151811061246e57fe5b9060200190602002015190506124838161111d565b151561248e57600080fd5b6000818152600860205260409020544290106124a957600080fd5b6124b333826129eb565b15156124be57600080fd5b6124c9858583612d52565b600190910190612459565b600160a060020a03166000908152600a602052604090205490565b60015460a060020a900460ff161561250657600080fd5b61251033866129eb565b151561251b57600080fd5b600c54600160a060020a0316151561253257600080fd5b600c5461254a903390600160a060020a031687612ad2565b600c54600160a060020a0316638a157df3868686868660405160e060020a63ffffffff88160281526004810195909552602485019390935260448401919091526064830152608482015260a401600060405180830381600087803b15156125b057600080fd5b6102c65a03f115156125c157600080fd5b5050505050505050565b600154600160a060020a031681565b6000805433600160a060020a039081169116146125f657600080fd5b5080600160a060020a03811663d25c07676000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b151561263e57600080fd5b6102c65a03f1151561264f57600080fd5b50505060405180519050151561266457600080fd5b600b8054600160a060020a031916600160a060020a039290921691909117905550565b6001546000908190819060a060020a900460ff16156126a557600080fd5b600092505b83518310156113a5578383815181106126bf57fe5b90602001906020020151600081815260046020526040902054909250600160a060020a031690506126f03383612de4565b15156126fb57600080fd5b612706813384612a0b565b6001909201916126aa565b6000806000806000806000600160149054906101000a900460ff1615151561273857600080fd5b8b51600160a060020a0333166000908152600a60205260408120549198509011156127e157600160a060020a0333166000908152600a6020526040902054879011156127a457600160a060020a0333166000908152600a602052604081208054899003905595506127dc565b600160a060020a0333166000908152600a6020526040812080549190556009549095506127d99086890363ffffffff612e0416565b95505b6127f7565b6009546127f4908863ffffffff612e0416565b95505b348690101561280557600080fd5b600354935061281e8c516003549063ffffffff612e3a16565b612829600382612e5b565b50600092505b8b518310156128ef578b838151811061284457fe5b9060200190602002015191506128598261111d565b151561286457600080fd5b600082815260046020526040902054600160a060020a03161561288657600080fd5b81600384860181548110151561289857fe5b90600052602060002090600891828204019190066004026101000a81548163ffffffff021916908363ffffffff1602179055506128d760003384612a0b565b6128e4828c8c8c8c612b73565b60019092019161282f565b8534039050600081111561124057600160a060020a03331681156108fc0282604051600060405180830381858888f19350505050151561124057600080fd5b60005433600160a060020a0390811691161461294957600080fd5b60018054600160a060020a031916600160a060020a0392909216919091179055565b82600160a060020a031663a9059cbb838360006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b15156129c857600080fd5b6102c65a03f115156129d957600080fd5b50505060405180519050151561110957fe5b600090815260046020526040902054600160a060020a0391821691161490565b600160a060020a03808316600081815260066020908152604080832080546001019055858352600490915290208054600160a060020a0319169091179055831615612a8c57600160a060020a03831660009081526006602090815260408083208054600019019055838352600590915290208054600160a060020a03191690555b8082600160a060020a031684600160a060020a03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600081815260056020526040908190208054600160a060020a031916600160a060020a03858116918217909255839290918616907f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925905160405180910390a4505050565b600081815260076020526040812054600160a060020a038481169116148015611fdc57505060009081526008602052604090205442901015919050565b847f494fb6227df1321e7605ad3dbe7f91fa4bb839754feeb2e2dcdb0a4c5cfc7fc7858585856040518080602001806020018060200180602001858103855289818151815260200191508051906020019080838360005b83811015612be2578082015183820152602001612bca565b50505050905090810190601f168015612c0f5780820380516001836020036101000a031916815260200191505b50858103845288818151815260200191508051906020019080838360005b83811015612c45578082015183820152602001612c2d565b50505050905090810190601f168015612c725780820380516001836020036101000a031916815260200191505b50858103835287818151815260200191508051906020019080838360005b83811015612ca8578082015183820152602001612c90565b50505050905090810190601f168015612cd55780820380516001836020036101000a031916815260200191505b50858103825286818151815260200191508051906020019080838360005b83811015612d0b578082015183820152602001612cf3565b50505050905090810190601f168015612d385780820380516001836020036101000a031916815260200191505b509850505050505050505060405180910390a25050505050565b6000612d64428463ffffffff612e3a16565b60008381526007602090815260408083208054600160a060020a031916600160a060020a038a169081179091556008909252918290208390559192508391907fcdebf885a8d6b40fb0883b31fdbee6a8b4fadc5ddef539ac0ff90c104046f8a890849087905191825260208201526040908101905180910390a350505050565b600090815260056020526040902054600160a060020a0391821691161490565b600080831515612e175760009150612e33565b50828202828482811515612e2757fe5b0414612e2f57fe5b8091505b5092915050565b600082820183811015612e2f57fe5b60206040519081016040526000815290565b8154818355818115116111095760008381526020902061110991611f679160086007928301819004820192860104015b80821115612e9f5760008155600101612e8b565b50905600a165627a7a7230582080cd2619ba5a77250eb66af759f9408e8fa204971b8096f7fa91dfc6b0b60ab70029

Swarm Source

bzzr://80cd2619ba5a77250eb66af759f9408e8fa204971b8096f7fa91dfc6b0b60ab7
Block Transaction Difficulty Gas Used Reward
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.