Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
LANDRegistry
Compiler Version
v0.4.24+commit.e67f0147
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2018-08-30
*/
pragma solidity ^0.4.24;
// File: contracts/estate/IEstateRegistry.sol
contract IEstateRegistry {
function mint(address to, string metadata) external returns (uint256);
// Events
event CreateEstate(
address indexed _owner,
uint256 indexed _estateId,
string _data
);
event AddLand(
uint256 indexed _estateId,
uint256 indexed _landId
);
event RemoveLand(
uint256 indexed _estateId,
uint256 indexed _landId,
address indexed _destinatary
);
event Update(
uint256 indexed _assetId,
address indexed _holder,
address indexed _operator,
string _data
);
event UpdateOperator(
uint256 indexed _estateId,
address indexed _operator
);
event SetLANDRegistry(
address indexed _registry
);
}
// File: contracts/land/LANDStorage.sol
contract LANDStorage {
mapping (address => uint) public latestPing;
uint256 constant clearLow = 0xffffffffffffffffffffffffffffffff00000000000000000000000000000000;
uint256 constant clearHigh = 0x00000000000000000000000000000000ffffffffffffffffffffffffffffffff;
uint256 constant factor = 0x100000000000000000000000000000000;
mapping (address => bool) public authorizedDeploy;
mapping (uint256 => address) public updateOperator;
IEstateRegistry public estateRegistry;
}
// File: contracts/upgradable/OwnableStorage.sol
contract OwnableStorage {
address public owner;
constructor() internal {
owner = msg.sender;
}
}
// File: contracts/upgradable/ProxyStorage.sol
contract ProxyStorage {
/**
* Current contract to which we are proxing
*/
address public currentContract;
address public proxyOwner;
}
// File: erc821/contracts/AssetRegistryStorage.sol
contract AssetRegistryStorage {
string internal _name;
string internal _symbol;
string internal _description;
/**
* Stores the total count of assets managed by this registry
*/
uint256 internal _count;
/**
* Stores an array of assets owned by a given account
*/
mapping(address => uint256[]) internal _assetsOf;
/**
* Stores the current holder of an asset
*/
mapping(uint256 => address) internal _holderOf;
/**
* Stores the index of an asset in the `_assetsOf` array of its holder
*/
mapping(uint256 => uint256) internal _indexOfAsset;
/**
* Stores the data associated with an asset
*/
mapping(uint256 => string) internal _assetData;
/**
* For a given account, for a given operator, store whether that operator is
* allowed to transfer and modify assets on behalf of them.
*/
mapping(address => mapping(address => bool)) internal _operators;
/**
* Approval array
*/
mapping(uint256 => address) internal _approval;
}
// File: contracts/Storage.sol
contract Storage is ProxyStorage, OwnableStorage, AssetRegistryStorage, LANDStorage {
}
// File: erc821/contracts/ERC165.sol
interface ERC165 {
function supportsInterface(bytes4 interfaceID) external view returns (bool);
}
// File: contracts/metadata/IMetadataHolder.sol
contract IMetadataHolder is ERC165 {
function getMetadata(uint256 /* assetId */) external view returns (string);
}
// File: contracts/upgradable/IApplication.sol
contract IApplication {
function initialize(bytes data) public;
}
// File: contracts/upgradable/Ownable.sol
contract Ownable is Storage {
event OwnerUpdate(address _prevOwner, address _newOwner);
modifier onlyOwner {
assert(msg.sender == owner);
_;
}
function transferOwnership(address _newOwner) public onlyOwner {
require(_newOwner != owner, "Cannot transfer to yourself");
owner = _newOwner;
}
}
// File: contracts/land/ILANDRegistry.sol
interface ILANDRegistry {
// LAND can be assigned by the owner
function assignNewParcel(int x, int y, address beneficiary) external;
function assignMultipleParcels(int[] x, int[] y, address beneficiary) external;
// After one year, LAND can be claimed from an inactive public key
function ping() external;
// LAND-centric getters
function encodeTokenId(int x, int y) external pure returns (uint256);
function decodeTokenId(uint value) external pure returns (int, int);
function exists(int x, int y) external view returns (bool);
function ownerOfLand(int x, int y) external view returns (address);
function ownerOfLandMany(int[] x, int[] y) external view returns (address[]);
function landOf(address owner) external view returns (int[], int[]);
function landData(int x, int y) external view returns (string);
// Transfer LAND
function transferLand(int x, int y, address to) external;
function transferManyLand(int[] x, int[] y, address to) external;
// Update LAND
function updateLandData(int x, int y, string data) external;
function updateManyLandData(int[] x, int[] y, string data) external;
// Events
event Update(
uint256 indexed assetId,
address indexed holder,
address indexed operator,
string data
);
event UpdateOperator(
uint256 indexed assetId,
address indexed operator
);
}
// File: erc821/contracts/IERC721Base.sol
interface IERC721Base {
function totalSupply() external view returns (uint256);
// function exists(uint256 assetId) external view returns (bool);
function ownerOf(uint256 assetId) external view returns (address);
function balanceOf(address holder) external view returns (uint256);
function safeTransferFrom(address from, address to, uint256 assetId) external;
function safeTransferFrom(address from, address to, uint256 assetId, bytes userData) external;
function transferFrom(address from, address to, uint256 assetId) external;
function approve(address operator, uint256 assetId) external;
function setApprovalForAll(address operator, bool authorized) external;
function getApprovedAddress(uint256 assetId) external view returns (address);
function isApprovedForAll(address operator, address assetOwner) external view returns (bool);
function isAuthorized(address operator, uint256 assetId) external view returns (bool);
/**
* @dev Deprecated transfer event. Now we use the standard with three parameters
* It is only used in the ABI to get old transfer events. Do not remove
*/
event Transfer(
address indexed from,
address indexed to,
uint256 indexed assetId,
address operator,
bytes userData
);
event Transfer(
address indexed from,
address indexed to,
uint256 indexed assetId
);
event ApprovalForAll(
address indexed operator,
address indexed holder,
bool authorized
);
event Approval(
address indexed owner,
address indexed operator,
uint256 indexed assetId
);
}
// File: erc821/contracts/IERC721Receiver.sol
interface IERC721Receiver {
function onERC721Received(
address _operator,
address _from,
uint256 _tokenId,
bytes _userData
) external returns (bytes4);
}
// File: openzeppelin-solidity/contracts/math/SafeMath.sol
/**
* @title SafeMath
* @dev Math operations with safety checks that throw on error
*/
library SafeMath {
/**
* @dev Multiplies two numbers, throws on overflow.
*/
function mul(uint256 _a, uint256 _b) internal pure returns (uint256 c) {
// Gas optimization: this is cheaper than asserting 'a' not being zero, but the
// benefit is lost if 'b' is also tested.
// See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522
if (_a == 0) {
return 0;
}
c = _a * _b;
assert(c / _a == _b);
return c;
}
/**
* @dev Integer division of two numbers, truncating the quotient.
*/
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 _a / _b;
}
/**
* @dev Subtracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend).
*/
function sub(uint256 _a, uint256 _b) internal pure returns (uint256) {
assert(_b <= _a);
return _a - _b;
}
/**
* @dev Adds two numbers, throws on overflow.
*/
function add(uint256 _a, uint256 _b) internal pure returns (uint256 c) {
c = _a + _b;
assert(c >= _a);
return c;
}
}
// File: erc821/contracts/ERC721Base.sol
contract ERC721Base is AssetRegistryStorage, IERC721Base, ERC165 {
using SafeMath for uint256;
// Equals to `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`
bytes4 private constant ERC721_RECEIVED = 0x150b7a02;
//
// Global Getters
//
/**
* @dev Gets the total amount of assets stored by the contract
* @return uint256 representing the total amount of assets
*/
function totalSupply() external view returns (uint256) {
return _totalSupply();
}
function _totalSupply() internal view returns (uint256) {
return _count;
}
//
// Asset-centric getter functions
//
/**
* @dev Queries what address owns an asset. This method does not throw.
* In order to check if the asset exists, use the `exists` function or check if the
* return value of this call is `0`.
* @return uint256 the assetId
*/
function ownerOf(uint256 assetId) external view returns (address) {
return _ownerOf(assetId);
}
function _ownerOf(uint256 assetId) internal view returns (address) {
return _holderOf[assetId];
}
//
// Holder-centric getter functions
//
/**
* @dev Gets the balance of the specified address
* @param owner address to query the balance of
* @return uint256 representing the amount owned by the passed address
*/
function balanceOf(address owner) external view returns (uint256) {
return _balanceOf(owner);
}
function _balanceOf(address owner) internal view returns (uint256) {
return _assetsOf[owner].length;
}
//
// Authorization getters
//
/**
* @dev Query whether an address has been authorized to move any assets on behalf of someone else
* @param operator the address that might be authorized
* @param assetHolder the address that provided the authorization
* @return bool true if the operator has been authorized to move any assets
*/
function isApprovedForAll(address assetHolder, address operator)
external view returns (bool)
{
return _isApprovedForAll(assetHolder, operator);
}
function _isApprovedForAll(address assetHolder, address operator)
internal view returns (bool)
{
return _operators[assetHolder][operator];
}
/**
* @dev Query what address has been particularly authorized to move an asset
* @param assetId the asset to be queried for
* @return bool true if the asset has been approved by the holder
*/
function getApproved(uint256 assetId) external view returns (address) {
return _getApprovedAddress(assetId);
}
function getApprovedAddress(uint256 assetId) external view returns (address) {
return _getApprovedAddress(assetId);
}
function _getApprovedAddress(uint256 assetId) internal view returns (address) {
return _approval[assetId];
}
/**
* @dev Query if an operator can move an asset.
* @param operator the address that might be authorized
* @param assetId the asset that has been `approved` for transfer
* @return bool true if the asset has been approved by the holder
*/
function isAuthorized(address operator, uint256 assetId) external view returns (bool) {
return _isAuthorized(operator, assetId);
}
function _isAuthorized(address operator, uint256 assetId) internal view returns (bool)
{
require(operator != 0);
address owner = _ownerOf(assetId);
if (operator == owner) {
return true;
}
return _isApprovedForAll(owner, operator) || _getApprovedAddress(assetId) == operator;
}
//
// Authorization
//
/**
* @dev Authorize a third party operator to manage (send) msg.sender's asset
* @param operator address to be approved
* @param authorized bool set to true to authorize, false to withdraw authorization
*/
function setApprovalForAll(address operator, bool authorized) external {
return _setApprovalForAll(operator, authorized);
}
function _setApprovalForAll(address operator, bool authorized) internal {
if (authorized) {
require(!_isApprovedForAll(msg.sender, operator));
_addAuthorization(operator, msg.sender);
} else {
require(_isApprovedForAll(msg.sender, operator));
_clearAuthorization(operator, msg.sender);
}
emit ApprovalForAll(msg.sender, operator, authorized);
}
/**
* @dev Authorize a third party operator to manage one particular asset
* @param operator address to be approved
* @param assetId asset to approve
*/
function approve(address operator, uint256 assetId) external {
address holder = _ownerOf(assetId);
require(msg.sender == holder || _isApprovedForAll(msg.sender, holder));
require(operator != holder);
if (_getApprovedAddress(assetId) != operator) {
_approval[assetId] = operator;
emit Approval(holder, operator, assetId);
}
}
function _addAuthorization(address operator, address holder) private {
_operators[holder][operator] = true;
}
function _clearAuthorization(address operator, address holder) private {
_operators[holder][operator] = false;
}
//
// Internal Operations
//
function _addAssetTo(address to, uint256 assetId) internal {
_holderOf[assetId] = to;
uint256 length = _balanceOf(to);
_assetsOf[to].push(assetId);
_indexOfAsset[assetId] = length;
_count = _count.add(1);
}
function _removeAssetFrom(address from, uint256 assetId) internal {
uint256 assetIndex = _indexOfAsset[assetId];
uint256 lastAssetIndex = _balanceOf(from).sub(1);
uint256 lastAssetId = _assetsOf[from][lastAssetIndex];
_holderOf[assetId] = 0;
// Insert the last asset into the position previously occupied by the asset to be removed
_assetsOf[from][assetIndex] = lastAssetId;
// Resize the array
_assetsOf[from][lastAssetIndex] = 0;
_assetsOf[from].length--;
// Remove the array if no more assets are owned to prevent pollution
if (_assetsOf[from].length == 0) {
delete _assetsOf[from];
}
// Update the index of positions for the asset
_indexOfAsset[assetId] = 0;
_indexOfAsset[lastAssetId] = assetIndex;
_count = _count.sub(1);
}
function _clearApproval(address holder, uint256 assetId) internal {
if (_ownerOf(assetId) == holder && _approval[assetId] != 0) {
_approval[assetId] = 0;
emit Approval(holder, 0, assetId);
}
}
//
// Supply-altering functions
//
function _generate(uint256 assetId, address beneficiary) internal {
require(_holderOf[assetId] == 0);
_addAssetTo(beneficiary, assetId);
emit Transfer(0, beneficiary, assetId);
}
function _destroy(uint256 assetId) internal {
address holder = _holderOf[assetId];
require(holder != 0);
_removeAssetFrom(holder, assetId);
emit Transfer(holder, 0, assetId);
}
//
// Transaction related operations
//
modifier onlyHolder(uint256 assetId) {
require(_ownerOf(assetId) == msg.sender);
_;
}
modifier onlyAuthorized(uint256 assetId) {
require(_isAuthorized(msg.sender, assetId));
_;
}
modifier isCurrentOwner(address from, uint256 assetId) {
require(_ownerOf(assetId) == from);
_;
}
modifier isDestinataryDefined(address destinatary) {
require(destinatary != 0);
_;
}
modifier destinataryIsNotHolder(uint256 assetId, address to) {
require(_ownerOf(assetId) != to);
_;
}
/**
* @dev Alias of `safeTransferFrom(from, to, assetId, '')`
*
* @param from address that currently owns an asset
* @param to address to receive the ownership of the asset
* @param assetId uint256 ID of the asset to be transferred
*/
function safeTransferFrom(address from, address to, uint256 assetId) external {
return _doTransferFrom(from, to, assetId, '', true);
}
/**
* @dev Securely transfers the ownership of a given asset from one address to
* another address, calling the method `onNFTReceived` on the target address if
* there's code associated with it
*
* @param from address that currently owns an asset
* @param to address to receive the ownership of the asset
* @param assetId uint256 ID of the asset to be transferred
* @param userData bytes arbitrary user information to attach to this transfer
*/
function safeTransferFrom(address from, address to, uint256 assetId, bytes userData) external {
return _doTransferFrom(from, to, assetId, userData, true);
}
/**
* @dev Transfers the ownership of a given asset from one address to another address
* Warning! This function does not attempt to verify that the target address can send
* tokens.
*
* @param from address sending the asset
* @param to address to receive the ownership of the asset
* @param assetId uint256 ID of the asset to be transferred
*/
function transferFrom(address from, address to, uint256 assetId) external {
return _doTransferFrom(from, to, assetId, '', false);
}
function _doTransferFrom(
address from,
address to,
uint256 assetId,
bytes userData,
bool doCheck
)
onlyAuthorized(assetId)
internal
{
_moveToken(from, to, assetId, userData, doCheck);
}
function _moveToken(
address from,
address to,
uint256 assetId,
bytes userData,
bool doCheck
)
isDestinataryDefined(to)
destinataryIsNotHolder(assetId, to)
isCurrentOwner(from, assetId)
internal
{
address holder = _holderOf[assetId];
_removeAssetFrom(holder, assetId);
_clearApproval(holder, assetId);
_addAssetTo(to, assetId);
if (doCheck && _isContract(to)) {
// Equals to `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))
require(
IERC721Receiver(to).onERC721Received(
msg.sender, holder, assetId, userData
) == ERC721_RECEIVED
);
}
emit Transfer(holder, to, assetId);
}
/**
* Internal function that moves an asset from one holder to another
*/
/**
* @dev Returns `true` if the contract implements `interfaceID` and `interfaceID` is not 0xffffffff, `false` otherwise
* @param _interfaceID The interface identifier, as specified in ERC-165
*/
function supportsInterface(bytes4 _interfaceID) external view returns (bool) {
if (_interfaceID == 0xffffffff) {
return false;
}
return (_interfaceID == 0x01ffc9a7) || (_interfaceID == 0x7c0633c6);
}
//
// Utilities
//
function _isContract(address addr) internal view returns (bool) {
uint size;
assembly { size := extcodesize(addr) }
return size > 0;
}
}
// File: erc821/contracts/IERC721Enumerable.sol
contract IERC721Enumerable {
/**
* @notice Enumerate active tokens
* @dev Throws if `index` >= `totalSupply()`, otherwise SHALL NOT throw.
* @param index A counter less than `totalSupply()`
* @return The identifier for the `index`th asset, (sort order not
* specified)
*/
// TODO (eordano): Not implemented
// function tokenByIndex(uint256 index) public view returns (uint256 _assetId);
/**
* @notice Count of owners which own at least one asset
* Must not throw.
* @return A count of the number of owners which own asset
*/
// TODO (eordano): Not implemented
// function countOfOwners() public view returns (uint256 _count);
/**
* @notice Enumerate owners
* @dev Throws if `index` >= `countOfOwners()`, otherwise must not throw.
* @param index A counter less than `countOfOwners()`
* @return The address of the `index`th owner (sort order not specified)
*/
// TODO (eordano): Not implemented
// function ownerByIndex(uint256 index) public view returns (address owner);
/**
* @notice Get all tokens of a given address
* @dev This is not intended to be used on-chain
* @param owner address of the owner to query
* @return a list of all assetIds of a user
*/
function tokensOf(address owner) external view returns (uint256[]);
/**
* @notice Enumerate tokens assigned to an owner
* @dev Throws if `index` >= `balanceOf(owner)` or if
* `owner` is the zero address, representing invalid assets.
* Otherwise this must not throw.
* @param owner An address where we are interested in assets owned by them
* @param index A counter less than `balanceOf(owner)`
* @return The identifier for the `index`th asset assigned to `owner`,
* (sort order not specified)
*/
function tokenOfOwnerByIndex(
address owner, uint256 index
) external view returns (uint256 tokenId);
}
// File: erc821/contracts/ERC721Enumerable.sol
contract ERC721Enumerable is AssetRegistryStorage, IERC721Enumerable {
/**
* @notice Get all tokens of a given address
* @dev This is not intended to be used on-chain
* @param owner address of the owner to query
* @return a list of all assetIds of a user
*/
function tokensOf(address owner) external view returns (uint256[]) {
return _assetsOf[owner];
}
/**
* @notice Enumerate tokens assigned to an owner
* @dev Throws if `index` >= `balanceOf(owner)` or if
* `owner` is the zero address, representing invalid assets.
* Otherwise this must not throw.
* @param owner An address where we are interested in assets owned by them
* @param index A counter less than `balanceOf(owner)`
* @return The identifier for the `index`th asset assigned to `owner`,
* (sort order not specified)
*/
function tokenOfOwnerByIndex(
address owner, uint256 index
)
external
view
returns (uint256 assetId)
{
require(index < _assetsOf[owner].length);
require(index < (1<<127));
return _assetsOf[owner][index];
}
}
// File: erc821/contracts/IERC721Metadata.sol
contract IERC721Metadata {
/**
* @notice A descriptive name for a collection of NFTs in this contract
*/
function name() external view returns (string);
/**
* @notice An abbreviated name for NFTs in this contract
*/
function symbol() external view returns (string);
/**
* @notice A description of what this DAR is used for
*/
function description() external view returns (string);
/**
* Stores arbitrary info about a token
*/
function tokenMetadata(uint256 assetId) external view returns (string);
}
// File: erc821/contracts/ERC721Metadata.sol
contract ERC721Metadata is AssetRegistryStorage, IERC721Metadata {
function name() external view returns (string) {
return _name;
}
function symbol() external view returns (string) {
return _symbol;
}
function description() external view returns (string) {
return _description;
}
function tokenMetadata(uint256 assetId) external view returns (string) {
return _assetData[assetId];
}
function _update(uint256 assetId, string data) internal {
_assetData[assetId] = data;
}
}
// File: erc821/contracts/FullAssetRegistry.sol
contract FullAssetRegistry is ERC721Base, ERC721Enumerable, ERC721Metadata {
constructor() public {
}
/**
* @dev Method to check if an asset identified by the given id exists under this DAR.
* @return uint256 the assetId
*/
function exists(uint256 assetId) external view returns (bool) {
return _exists(assetId);
}
function _exists(uint256 assetId) internal view returns (bool) {
return _holderOf[assetId] != 0;
}
function decimals() external pure returns (uint256) {
return 0;
}
}
// File: contracts/land/LANDRegistry.sol
/* solium-disable function-order */
contract LANDRegistry is Storage, Ownable, FullAssetRegistry, ILANDRegistry {
bytes4 constant public GET_METADATA = bytes4(keccak256("getMetadata(uint256)"));
function initialize(bytes) external {
_name = "Decentraland LAND";
_symbol = "LAND";
_description = "Contract that stores the Decentraland LAND registry";
}
modifier onlyProxyOwner() {
require(msg.sender == proxyOwner, "This function can only be called by the proxy owner");
_;
}
//
// LAND Create and destroy
//
modifier onlyOwnerOf(uint256 assetId) {
require(
msg.sender == _ownerOf(assetId),
"This function can only be called by the owner of the asset"
);
_;
}
modifier onlyUpdateAuthorized(uint256 tokenId) {
require(
msg.sender == _ownerOf(tokenId) || _isUpdateAuthorized(msg.sender, tokenId),
"msg.sender is not authorized to update"
);
_;
}
function isUpdateAuthorized(address operator, uint256 assetId) external view returns (bool) {
return _isUpdateAuthorized(operator, assetId);
}
function _isUpdateAuthorized(address operator, uint256 assetId) internal view returns (bool) {
return operator == _ownerOf(assetId) || updateOperator[assetId] == operator;
}
function authorizeDeploy(address beneficiary) external onlyProxyOwner {
authorizedDeploy[beneficiary] = true;
}
function forbidDeploy(address beneficiary) external onlyProxyOwner {
authorizedDeploy[beneficiary] = false;
}
function assignNewParcel(int x, int y, address beneficiary) external onlyProxyOwner {
_generate(_encodeTokenId(x, y), beneficiary);
}
function assignMultipleParcels(int[] x, int[] y, address beneficiary) external onlyProxyOwner {
for (uint i = 0; i < x.length; i++) {
_generate(_encodeTokenId(x[i], y[i]), beneficiary);
}
}
//
// Inactive keys after 1 year lose ownership
//
function ping() external {
// solium-disable-next-line security/no-block-members
latestPing[msg.sender] = block.timestamp;
}
function setLatestToNow(address user) external {
require(msg.sender == proxyOwner || _isApprovedForAll(msg.sender, user), "Unauthorized user");
// solium-disable-next-line security/no-block-members
latestPing[user] = block.timestamp;
}
//
// LAND Getters
//
function encodeTokenId(int x, int y) external pure returns (uint) {
return _encodeTokenId(x, y);
}
function _encodeTokenId(int x, int y) internal pure returns (uint result) {
require(
-1000000 < x && x < 1000000 && -1000000 < y && y < 1000000,
"The coordinates should be inside bounds"
);
return _unsafeEncodeTokenId(x, y);
}
function _unsafeEncodeTokenId(int x, int y) internal pure returns (uint) {
return ((uint(x) * factor) & clearLow) | (uint(y) & clearHigh);
}
function decodeTokenId(uint value) external pure returns (int, int) {
return _decodeTokenId(value);
}
function _unsafeDecodeTokenId(uint value) internal pure returns (int x, int y) {
x = expandNegative128BitCast((value & clearLow) >> 128);
y = expandNegative128BitCast(value & clearHigh);
}
function _decodeTokenId(uint value) internal pure returns (int x, int y) {
(x, y) = _unsafeDecodeTokenId(value);
require(
-1000000 < x && x < 1000000 && -1000000 < y && y < 1000000,
"The coordinates should be inside bounds"
);
}
function expandNegative128BitCast(uint value) internal pure returns (int) {
if (value & (1<<127) != 0) {
return int(value | clearLow);
}
return int(value);
}
function exists(int x, int y) external view returns (bool) {
return _exists(x, y);
}
function _exists(int x, int y) internal view returns (bool) {
return _exists(_encodeTokenId(x, y));
}
function ownerOfLand(int x, int y) external view returns (address) {
return _ownerOfLand(x, y);
}
function _ownerOfLand(int x, int y) internal view returns (address) {
return _ownerOf(_encodeTokenId(x, y));
}
function ownerOfLandMany(int[] x, int[] y) external view returns (address[]) {
require(x.length > 0, "You should supply at least one coordinate");
require(x.length == y.length, "The coordinates should have the same length");
address[] memory addrs = new address[](x.length);
for (uint i = 0; i < x.length; i++) {
addrs[i] = _ownerOfLand(x[i], y[i]);
}
return addrs;
}
function landOf(address owner) external view returns (int[], int[]) {
uint256 len = _assetsOf[owner].length;
int[] memory x = new int[](len);
int[] memory y = new int[](len);
int assetX;
int assetY;
for (uint i = 0; i < len; i++) {
(assetX, assetY) = _decodeTokenId(_assetsOf[owner][i]);
x[i] = assetX;
y[i] = assetY;
}
return (x, y);
}
function tokenMetadata(uint256 assetId) external view returns (string) {
return _tokenMetadata(assetId);
}
function _tokenMetadata(uint256 assetId) internal view returns (string) {
address _owner = _ownerOf(assetId);
if (_isContract(_owner) && _owner != address(estateRegistry)) {
if ((ERC165(_owner)).supportsInterface(GET_METADATA)) {
return IMetadataHolder(_owner).getMetadata(assetId);
}
}
return _assetData[assetId];
}
function landData(int x, int y) external view returns (string) {
return _tokenMetadata(_encodeTokenId(x, y));
}
//
// LAND Transfer
//
function transferFrom(address from, address to, uint256 assetId) external {
require(to != address(estateRegistry), "EstateRegistry unsafe transfers are not allowed");
return _doTransferFrom(
from,
to,
assetId,
"",
false
);
}
function transferLand(int x, int y, address to) external {
uint256 tokenId = _encodeTokenId(x, y);
_doTransferFrom(
_ownerOf(tokenId),
to,
tokenId,
"",
true
);
}
function transferManyLand(int[] x, int[] y, address to) external {
require(x.length > 0, "You should supply at least one coordinate");
require(x.length == y.length, "The coordinates should have the same length");
for (uint i = 0; i < x.length; i++) {
uint256 tokenId = _encodeTokenId(x[i], y[i]);
_doTransferFrom(
_ownerOf(tokenId),
to,
tokenId,
"",
true
);
}
}
function transferLandToEstate(int x, int y, uint256 estateId) external {
uint256 tokenId = _encodeTokenId(x, y);
_doTransferFrom(
_ownerOf(tokenId),
address(estateRegistry),
tokenId,
toBytes(estateId),
true
);
}
function transferManyLandToEstate(int[] x, int[] y, uint256 estateId) external {
require(x.length > 0, "You should supply at least one coordinate");
require(x.length == y.length, "The coordinates should have the same length");
for (uint i = 0; i < x.length; i++) {
uint256 tokenId = _encodeTokenId(x[i], y[i]);
_doTransferFrom(
_ownerOf(tokenId),
address(estateRegistry),
tokenId,
toBytes(estateId),
true
);
}
}
function setUpdateOperator(uint256 assetId, address operator) external onlyOwnerOf(assetId) {
updateOperator[assetId] = operator;
emit UpdateOperator(assetId, operator);
}
//
// Estate generation
//
event EstateRegistrySet(address indexed registry);
function setEstateRegistry(address registry) external onlyProxyOwner {
estateRegistry = IEstateRegistry(registry);
emit EstateRegistrySet(registry);
}
function createEstate(int[] x, int[] y, address beneficiary) external returns (uint256) {
// solium-disable-next-line arg-overflow
return _createEstate(x, y, beneficiary, "");
}
function createEstateWithMetadata(
int[] x,
int[] y,
address beneficiary,
string metadata
)
external
returns (uint256)
{
// solium-disable-next-line arg-overflow
return _createEstate(x, y, beneficiary, metadata);
}
function _createEstate(
int[] x,
int[] y,
address beneficiary,
string metadata
)
internal
returns (uint256)
{
require(x.length > 0, "You should supply at least one coordinate");
require(x.length == y.length, "The coordinates should have the same length");
require(address(estateRegistry) != 0, "The Estate registry should be set");
uint256 estateTokenId = estateRegistry.mint(beneficiary, metadata);
bytes memory estateTokenIdBytes = toBytes(estateTokenId);
for (uint i = 0; i < x.length; i++) {
uint256 tokenId = _encodeTokenId(x[i], y[i]);
_doTransferFrom(
_ownerOf(tokenId),
address(estateRegistry),
tokenId,
estateTokenIdBytes,
true
);
}
return estateTokenId;
}
function toBytes(uint256 x) internal pure returns (bytes b) {
b = new bytes(32);
// solium-disable-next-line security/no-inline-assembly
assembly { mstore(add(b, 32), x) }
}
//
// LAND Update
//
function updateLandData(
int x,
int y,
string data
)
external
onlyUpdateAuthorized(_encodeTokenId(x, y))
{
return _updateLandData(x, y, data);
}
function _updateLandData(
int x,
int y,
string data
)
internal
onlyUpdateAuthorized(_encodeTokenId(x, y))
{
uint256 assetId = _encodeTokenId(x, y);
address owner = _holderOf[assetId];
_update(assetId, data);
emit Update(
assetId,
owner,
msg.sender,
data
);
}
function updateManyLandData(int[] x, int[] y, string data) external {
require(x.length > 0, "You should supply at least one coordinate");
require(x.length == y.length, "The coordinates should have the same length");
for (uint i = 0; i < x.length; i++) {
_updateLandData(x[i], y[i], data);
}
}
function _doTransferFrom(
address from,
address to,
uint256 assetId,
bytes userData,
bool doCheck
)
internal
{
updateOperator[assetId] = address(0);
super._doTransferFrom(
from,
to,
assetId,
userData,
doCheck
);
}
function _isContract(address addr) internal view returns (bool) {
uint size;
// solium-disable-next-line security/no-inline-assembly
assembly { size := extcodesize(addr) }
return size > 0;
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"constant":true,"inputs":[{"name":"_interfaceID","type":"bytes4"}],"name":"supportsInterface","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"proxyOwner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"assetId","type":"uint256"}],"name":"getApproved","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"operator","type":"address"},{"name":"assetId","type":"uint256"}],"name":"approve","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"x","type":"int256"},{"name":"y","type":"int256"}],"name":"ownerOfLand","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"user","type":"address"}],"name":"setLatestToNow","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"x","type":"int256"},{"name":"y","type":"int256"},{"name":"beneficiary","type":"address"}],"name":"assignNewParcel","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"x","type":"int256[]"},{"name":"y","type":"int256[]"}],"name":"ownerOfLandMany","outputs":[{"name":"","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"latestPing","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"x","type":"int256[]"},{"name":"y","type":"int256[]"},{"name":"data","type":"string"}],"name":"updateManyLandData","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"from","type":"address"},{"name":"to","type":"address"},{"name":"assetId","type":"uint256"}],"name":"transferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"operator","type":"address"},{"name":"assetId","type":"uint256"}],"name":"isAuthorized","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"authorizedDeploy","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"owner","type":"address"},{"name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"name":"assetId","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[{"name":"beneficiary","type":"address"}],"name":"authorizeDeploy","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"x","type":"int256"},{"name":"y","type":"int256"},{"name":"to","type":"address"}],"name":"transferLand","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"from","type":"address"},{"name":"to","type":"address"},{"name":"assetId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"","type":"bytes"}],"name":"initialize","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"x","type":"int256"},{"name":"y","type":"int256"}],"name":"landData","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"x","type":"int256[]"},{"name":"y","type":"int256[]"},{"name":"to","type":"address"}],"name":"transferManyLand","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"assetId","type":"uint256"}],"name":"exists","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"owner","type":"address"}],"name":"tokensOf","outputs":[{"name":"","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"ping","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"assetId","type":"uint256"}],"name":"ownerOf","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"GET_METADATA","outputs":[{"name":"","type":"bytes4"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"operator","type":"address"},{"name":"assetId","type":"uint256"}],"name":"isUpdateAuthorized","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"assetId","type":"uint256"}],"name":"tokenMetadata","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"x","type":"int256"},{"name":"y","type":"int256"}],"name":"encodeTokenId","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"currentContract","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"description","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"value","type":"uint256"}],"name":"decodeTokenId","outputs":[{"name":"","type":"int256"},{"name":"","type":"int256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[{"name":"x","type":"int256[]"},{"name":"y","type":"int256[]"},{"name":"beneficiary","type":"address"}],"name":"assignMultipleParcels","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"x","type":"int256[]"},{"name":"y","type":"int256[]"},{"name":"beneficiary","type":"address"},{"name":"metadata","type":"string"}],"name":"createEstateWithMetadata","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"owner","type":"address"}],"name":"landOf","outputs":[{"name":"","type":"int256[]"},{"name":"","type":"int256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"registry","type":"address"}],"name":"setEstateRegistry","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"updateOperator","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"operator","type":"address"},{"name":"authorized","type":"bool"}],"name":"setApprovalForAll","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"x","type":"int256"},{"name":"y","type":"int256"}],"name":"exists","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"assetId","type":"uint256"},{"name":"operator","type":"address"}],"name":"setUpdateOperator","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"from","type":"address"},{"name":"to","type":"address"},{"name":"assetId","type":"uint256"},{"name":"userData","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"x","type":"int256[]"},{"name":"y","type":"int256[]"},{"name":"beneficiary","type":"address"}],"name":"createEstate","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"x","type":"int256"},{"name":"y","type":"int256"},{"name":"data","type":"string"}],"name":"updateLandData","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"estateRegistry","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"assetHolder","type":"address"},{"name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"assetId","type":"uint256"}],"name":"getApprovedAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"x","type":"int256[]"},{"name":"y","type":"int256[]"},{"name":"estateId","type":"uint256"}],"name":"transferManyLandToEstate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"x","type":"int256"},{"name":"y","type":"int256"},{"name":"estateId","type":"uint256"}],"name":"transferLandToEstate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"beneficiary","type":"address"}],"name":"forbidDeploy","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"anonymous":false,"inputs":[{"indexed":true,"name":"registry","type":"address"}],"name":"EstateRegistrySet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"assetId","type":"uint256"},{"indexed":true,"name":"holder","type":"address"},{"indexed":true,"name":"operator","type":"address"},{"indexed":false,"name":"data","type":"string"}],"name":"Update","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"assetId","type":"uint256"},{"indexed":true,"name":"operator","type":"address"}],"name":"UpdateOperator","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":true,"name":"assetId","type":"uint256"},{"indexed":false,"name":"operator","type":"address"},{"indexed":false,"name":"userData","type":"bytes"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":true,"name":"assetId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"operator","type":"address"},{"indexed":true,"name":"holder","type":"address"},{"indexed":false,"name":"authorized","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"operator","type":"address"},{"indexed":true,"name":"assetId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_prevOwner","type":"address"},{"indexed":false,"name":"_newOwner","type":"address"}],"name":"OwnerUpdate","type":"event"}]Contract Creation Code
608060405260028054600160a060020a0319163317905561333f806100256000396000f3006080604052600436106102795763ffffffff60e060020a60003504166301ffc9a7811461027e578063025313a2146102b457806306fdde03146102e5578063081812fc1461036f578063095ea7b3146103875780631080f251146103ad578063133cbe3a146103c857806318160ddd146103e95780631cc69ac1146104105780631d4b11e4146104375780631e375901146104b35780631e4c7736146104d457806323b872dd1461050c5780632972b0f01461053657806329ffab3b1461055a5780632f745c591461057b578063313ce5671461059f578063341f13f2146105b457806335e64aaa146105d557806342842e0e146105fc578063439fab91146106265780634c4bf936146106465780634dad9003146106615780634f558e79146106995780635a3f2672146106b15780635c36b186146106d25780636352211e146106e757806365181ad3146106ff57806365937ab9146107315780636914db60146107555780636fb7e5881461076d57806370a0823114610788578063721d7d8e146107a95780637284e416146107be5780637efd9112146107d35780638668a41614610804578063881eeaa51461083c578063885363eb146108815780638da5cb5b1461093b5780638de74aa11461095057806395d89b41146109715780639d40b85014610986578063a22cb4651461099e578063a8d88127146109c4578063b0b02c60146109df578063b88d4fde14610a03578063ca8a2c0814610a3c578063d4dd159414610a74578063e387d31a14610a9c578063e985e9c514610ab1578063eca4742a1461036f578063f2fde38b14610ad8578063f5f83a6114610af9578063f9cbec4314610b28578063fd7a1b0014610b46575b600080fd5b34801561028a57600080fd5b506102a0600160e060020a031960043516610b67565b604080519115158252519081900360200190f35b3480156102c057600080fd5b506102c9610bec565b60408051600160a060020a039092168252519081900360200190f35b3480156102f157600080fd5b506102fa610bfb565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561033457818101518382015260200161031c565b50505050905090810190601f1680156103615780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561037b57600080fd5b506102c9600435610c92565b34801561039357600080fd5b506103ab600160a060020a0360043516602435610c9d565b005b3480156103b957600080fd5b506102c9600435602435610d68565b3480156103d457600080fd5b506103ab600160a060020a0360043516610d7b565b3480156103f557600080fd5b506103fe610e0b565b60408051918252519081900360200190f35b34801561041c57600080fd5b506103ab600435602435600160a060020a0360443516610e1a565b34801561044357600080fd5b506104636024600480358281019290820135918135918201910135610e91565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561049f578181015183820152602001610487565b505050509050019250505060405180910390f35b3480156104bf57600080fd5b506103fe600160a060020a0360043516610fe8565b3480156104e057600080fd5b506103ab6024600480358281019290820135918135808301929082013591604435918201910135610ffa565b34801561051857600080fd5b506103ab600160a060020a036004358116906024351660443561112c565b34801561054257600080fd5b506102a0600160a060020a03600435166024356111d6565b34801561056657600080fd5b506102a0600160a060020a03600435166111e2565b34801561058757600080fd5b506103fe600160a060020a03600435166024356111f7565b3480156105ab57600080fd5b506103fe61126e565b3480156105c057600080fd5b506103ab600160a060020a0360043516611273565b3480156105e157600080fd5b506103ab600435602435600160a060020a03604435166112fb565b34801561060857600080fd5b506103ab600160a060020a0360043581169060243516604435611335565b34801561063257600080fd5b506103ab6004803560248101910135611353565b34801561065257600080fd5b506102fa600435602435611447565b34801561066d57600080fd5b506103ab6024600480358281019290820135918135918201910135600160a060020a036044351661145b565b3480156106a557600080fd5b506102a0600435611580565b3480156106bd57600080fd5b50610463600160a060020a036004351661158b565b3480156106de57600080fd5b506103ab6115f7565b3480156106f357600080fd5b506102c960043561160b565b34801561070b57600080fd5b50610714611616565b60408051600160e060020a03199092168252519081900360200190f35b34801561073d57600080fd5b506102a0600160a060020a036004351660243561164b565b34801561076157600080fd5b506102fa600435611657565b34801561077957600080fd5b506103fe600435602435611662565b34801561079457600080fd5b506103fe600160a060020a036004351661166e565b3480156107b557600080fd5b506102c9611679565b3480156107ca57600080fd5b506102fa611688565b3480156107df57600080fd5b506107eb6004356116e9565b6040805192835260208301919091528051918290030190f35b34801561081057600080fd5b506103ab6024600480358281019290820135918135918201910135600160a060020a03604435166116ff565b34801561084857600080fd5b506103fe6024600480358281019290820135918135808301929082013591600160a060020a03604435169160643590810191013561179a565b34801561088d57600080fd5b506108a2600160a060020a0360043516611839565b604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b838110156108e65781810151838201526020016108ce565b50505050905001838103825284818151815260200191508051906020019060200280838360005b8381101561092557818101518382015260200161090d565b5050505090500194505050505060405180910390f35b34801561094757600080fd5b506102c961194f565b34801561095c57600080fd5b506103ab600160a060020a036004351661195e565b34801561097d57600080fd5b506102fa611a0c565b34801561099257600080fd5b506102c9600435611a6d565b3480156109aa57600080fd5b506103ab600160a060020a03600435166024351515611a88565b3480156109d057600080fd5b506102a0600435602435611a96565b3480156109eb57600080fd5b506103ab600435600160a060020a0360243516611aa2565b348015610a0f57600080fd5b506103ab600160a060020a0360048035821691602480359091169160443591606435908101910135611b79565b348015610a4857600080fd5b506103fe6024600480358281019290820135918135918201910135600160a060020a0360443516611bbf565b348015610a8057600080fd5b506103ab60048035906024803591604435918201910135611c3e565b348015610aa857600080fd5b506102c9611d2c565b348015610abd57600080fd5b506102a0600160a060020a0360043581169060243516611d3b565b348015610ae457600080fd5b506103ab600160a060020a0360043516611d47565b348015610b0557600080fd5b506103ab6024600480358281019290820135918135918201910135604435611de3565b348015610b3457600080fd5b506103ab600435602435604435611eea565b348015610b5257600080fd5b506103ab600160a060020a0360043516611f1a565b6000600160e060020a03198083161415610b8357506000610be7565b7f01ffc9a700000000000000000000000000000000000000000000000000000000600160e060020a031983161480610be457507f7c0633c600000000000000000000000000000000000000000000000000000000600160e060020a03198316145b90505b919050565b600154600160a060020a031681565b60038054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610c875780601f10610c5c57610100808354040283529160200191610c87565b820191906000526020600020905b815481529060010190602001808311610c6a57829003601f168201915b505050505090505b90565b6000610be482611f9f565b6000610ca882611fba565b905033600160a060020a0382161480610cc65750610cc63382611fd5565b1515610cd157600080fd5b600160a060020a038381169082161415610cea57600080fd5b82600160a060020a0316610cfd83611f9f565b600160a060020a031614610d63576000828152600c60205260408082208054600160a060020a031916600160a060020a0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a45b505050565b6000610d748383612003565b9392505050565b600154600160a060020a0316331480610d995750610d993382611fd5565b1515610def576040805160e560020a62461bcd02815260206004820152601160248201527f556e617574686f72697a65642075736572000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a03166000908152600d60205260409020429055565b6000610e15612017565b905090565b600154600160a060020a03163314610e7e576040805160e560020a62461bcd02815260206004820152603360248201526000805160206132b48339815191526044820152600080516020613254833981519152606482015290519081900360840190fd5b610d63610e8b848461201d565b826120d7565b6060806000808611610eef576040805160e560020a62461bcd02815260206004820152602960248201526000805160206132d483398151915260448201526000805160206132f4833981519152606482015290519081900360840190fd5b858414610f48576040805160e560020a62461bcd02815260206004820152602b60248201526000805160206132748339815191526044820152600080516020613294833981519152606482015290519081900360840190fd5b604080518781526020808902820101909152868015610f71578160200160208202803883390190505b509150600090505b85811015610fde57610fb1878783818110610f9057fe5b905060200201358686848181101515610fa557fe5b90506020020135612003565b8282815181101515610fbf57fe5b600160a060020a03909216602092830290910190910152600101610f79565b5095945050505050565b600d6020526000908152604090205481565b6000808611611055576040805160e560020a62461bcd02815260206004820152602960248201526000805160206132d483398151915260448201526000805160206132f4833981519152606482015290519081900360840190fd5b8584146110ae576040805160e560020a62461bcd02815260206004820152602b60248201526000805160206132748339815191526044820152600080516020613294833981519152606482015290519081900360840190fd5b5060005b858110156111235761111b8787838181106110c957fe5b9050602002013586868481811015156110de57fe5b9050602002013585858080601f01602080910402602001604051908101604052809392919081815260200183838082843750612140945050505050565b6001016110b2565b50505050505050565b601054600160a060020a03838116911614156111b8576040805160e560020a62461bcd02815260206004820152602f60248201527f457374617465526567697374727920756e73616665207472616e73666572732060448201527f617265206e6f7420616c6c6f7765640000000000000000000000000000000000606482015290519081900360840190fd5b610d63838383602060405190810160405280600081525060006122dd565b6000610d748383612306565b600e6020526000908152604090205460ff1681565b600160a060020a038216600090815260076020526040812054821061121b57600080fd5b6f80000000000000000000000000000000821061123757600080fd5b600160a060020a038316600090815260076020526040902080548390811061125b57fe5b9060005260206000200154905092915050565b600090565b600154600160a060020a031633146112d7576040805160e560020a62461bcd02815260206004820152603360248201526000805160206132b48339815191526044820152600080516020613254833981519152606482015290519081900360840190fd5b600160a060020a03166000908152600e60205260409020805460ff19166001179055565b6000611307848461201d565b905061132f61131582611fba565b8383602060405190810160405280600081525060016122dd565b50505050565b610d63838383602060405190810160405280600081525060016122dd565b6040805180820190915260118082527f446563656e7472616c616e64204c414e4400000000000000000000000000000060209092019182526113979160039161317a565b506040805180820190915260048082527f4c414e440000000000000000000000000000000000000000000000000000000060209092019182526113da918161317a565b506040805160608101825260338082527f436f6e747261637420746861742073746f7265732074686520446563656e7472602083019081527f616c616e64204c414e44207265676973747279000000000000000000000000009290930191909152610d639160059161317a565b6060610d74611456848461201d565b612384565b6000808086116114b7576040805160e560020a62461bcd02815260206004820152602960248201526000805160206132d483398151915260448201526000805160206132f4833981519152606482015290519081900360840190fd5b858414611510576040805160e560020a62461bcd02815260206004820152602b60248201526000805160206132748339815191526044820152600080516020613294833981519152606482015290519081900360840190fd5b600091505b858210156111235761154d87878481811061152c57fe5b90506020020135868685818110151561154157fe5b9050602002013561201d565b905061157561155b82611fba565b8483602060405190810160405280600081525060016122dd565b600190910190611515565b6000610be4826125fe565b600160a060020a0381166000908152600760209081526040918290208054835181840281018401909452808452606093928301828280156115eb57602002820191906000526020600020905b8154815260200190600101908083116115d7575b50505050509050919050565b336000908152600d60205260409020429055565b6000610be482611fba565b604080517f6765744d657461646174612875696e74323536290000000000000000000000008152905190819003601401902081565b6000610d74838361261b565b6060610be482612384565b6000610d74838361201d565b6000610be482612661565b600054600160a060020a031681565b60058054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610c875780601f10610c5c57610100808354040283529160200191610c87565b6000806116f58361267c565b915091505b915091565b600154600090600160a060020a03163314611766576040805160e560020a62461bcd02815260206004820152603360248201526000805160206132b48339815191526044820152600080516020613254833981519152606482015290519081900360840190fd5b5060005b848110156117925761178a61178487878481811061152c57fe5b836120d7565b60010161176a565b505050505050565b600061182d8888808060200260200160405190810160405280939291908181526020018383602002808284375050604080516020808e0282810182019093528d82529095508d94508c93508392508501908490808284375050604080516020601f8c018190048102820181019092528a81528c955093508a9250899150819084018382808284375061273b945050505050565b98975050505050505050565b600160a060020a0381166000908152600760209081526040808320548151818152818402810190930190915260609283928391829181908190868015611889578160200160208202803883390190505b509450856040519080825280602002602001820160405280156118b6578160200160208202803883390190505b509350600090505b8581101561194057600160a060020a038916600090815260076020526040902080546118ff9190839081106118ef57fe5b906000526020600020015461267c565b86519194509250839086908390811061191457fe5b602090810290910101528351829085908390811061192e57fe5b602090810290910101526001016118be565b50929791965090945050505050565b600254600160a060020a031681565b600154600160a060020a031633146119c2576040805160e560020a62461bcd02815260206004820152603360248201526000805160206132b48339815191526044820152600080516020613254833981519152606482015290519081900360840190fd5b60108054600160a060020a031916600160a060020a0383169081179091556040517f5b3ad80e09ce4c88735037542891c02fdc63b85e96a579d9260a403153c2775590600090a250565b60048054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610c875780601f10610c5c57610100808354040283529160200191610c87565b600f60205260009081526040902054600160a060020a031681565b611a928282612a0e565b5050565b6000610d748383612a9c565b81611aac81611fba565b600160a060020a03163314611b1f576040805160e560020a62461bcd02815260206004820152603a60248201526000805160206132b483398151915260448201527f20627920746865206f776e6572206f6620746865206173736574000000000000606482015290519081900360840190fd5b6000838152600f60205260408082208054600160a060020a031916600160a060020a0386169081179091559051909185917f9d9dd80a56a16f715df6eb40b771e24ff8cbea6eed9de28473ce0f28fe5602a99190a3505050565b611bb885858585858080601f01602080910402602001604051908101604052809392919081815260200183838082843750600194506122dd9350505050565b5050505050565b6000611c348686808060200260200160405190810160405280939291908181526020018383602002808284375050604080516020808c0282810182019093528b82529095508b94508a93508392508501908490808284375050604080516020810190915260008152899450925061273b915050565b9695505050505050565b611c48848461201d565b611c5181611fba565b600160a060020a031633600160a060020a03161480611c755750611c75338261261b565b1515611cf1576040805160e560020a62461bcd02815260206004820152602660248201527f6d73672e73656e646572206973206e6f7420617574686f72697a656420746f2060448201527f7570646174650000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b611bb8858585858080601f01602080910402602001604051908101604052809392919081815260200183838082843750612140945050505050565b601054600160a060020a031681565b6000610d748383611fd5565b600254600160a060020a03163314611d5b57fe5b600254600160a060020a0382811691161415611dc1576040805160e560020a62461bcd02815260206004820152601b60248201527f43616e6e6f74207472616e7366657220746f20796f757273656c660000000000604482015290519081900360640190fd5b60028054600160a060020a031916600160a060020a0392909216919091179055565b600080808611611e3f576040805160e560020a62461bcd02815260206004820152602960248201526000805160206132d483398151915260448201526000805160206132f4833981519152606482015290519081900360840190fd5b858414611e98576040805160e560020a62461bcd02815260206004820152602b60248201526000805160206132748339815191526044820152600080516020613294833981519152606482015290519081900360840190fd5b600091505b8582101561112357611eb487878481811061152c57fe5b9050611edf611ec282611fba565b601054600160a060020a031683611ed887612ab0565b60016122dd565b600190910190611e9d565b6000611ef6848461201d565b905061132f611f0482611fba565b601054600160a060020a031683611ed886612ab0565b600154600160a060020a03163314611f7e576040805160e560020a62461bcd02815260206004820152603360248201526000805160206132b48339815191526044820152600080516020613254833981519152606482015290519081900360840190fd5b600160a060020a03166000908152600e60205260409020805460ff19169055565b6000908152600c6020526040902054600160a060020a031690565b600090815260086020526040902054600160a060020a031690565b600160a060020a039182166000908152600b6020908152604080832093909416825291909152205460ff1690565b6000610d74612012848461201d565b611fba565b60065490565b600082620f423f191280156120345750620f424083125b8015612043575081620f423f19125b80156120515750620f424082125b15156120cd576040805160e560020a62461bcd02815260206004820152602760248201527f54686520636f6f7264696e617465732073686f756c6420626520696e7369646560448201527f20626f756e647300000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b610d748383612adb565b600082815260086020526040902054600160a060020a0316156120f957600080fd5b6121038183612b1c565b8181600160a060020a031660007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b60008061214d858561201d565b61215681611fba565b600160a060020a031633600160a060020a0316148061217a575061217a338261261b565b15156121f6576040805160e560020a62461bcd02815260206004820152602660248201527f6d73672e73656e646572206973206e6f7420617574686f72697a656420746f2060448201527f7570646174650000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b612200868661201d565b600081815260086020526040902054909350600160a060020a031691506122278385612ba6565b33600160a060020a031682600160a060020a0316847f47c705b9219229ad762fca605f08fb024a3415d0ae78af5d319820c72e510414876040518080602001828103825283818151815260200191508051906020019080838360005b8381101561229b578181015183820152602001612283565b50505050905090810190601f1680156122c85780820380516001836020036101000a031916815260200191505b509250505060405180910390a4505050505050565b6000838152600f602052604090208054600160a060020a0319169055611bb88585858585612bc5565b600080600160a060020a038416151561231e57600080fd5b61232783611fba565b905080600160a060020a031684600160a060020a0316141561234c576001915061237d565b6123568185611fd5565b8061237a575083600160a060020a031661236f84611f9f565b600160a060020a0316145b91505b5092915050565b6060600061239183611fba565b905061239c81612be8565b80156123b65750601054600160a060020a03828116911614155b1561255d57604080517f6765744d657461646174612875696e7432353629000000000000000000000000815281519081900360140181207f01ffc9a7000000000000000000000000000000000000000000000000000000008252600160e060020a03191660048201529051600160a060020a038316916301ffc9a79160248083019260209291908290030181600087803b15801561245357600080fd5b505af1158015612467573d6000803e3d6000fd5b505050506040513d602081101561247d57600080fd5b50511561255d5780600160a060020a031663a574cea4846040518263ffffffff1660e060020a02815260040180828152602001915050600060405180830381600087803b1580156124cd57600080fd5b505af11580156124e1573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561250a57600080fd5b81019080805164010000000081111561252257600080fd5b8201602081018481111561253557600080fd5b815164010000000081118282018710171561254f57600080fd5b509095506125f89350505050565b6000838152600a602090815260409182902080548351601f6002600019610100600186161502019093169290920491820184900484028101840190945280845290918301828280156125f05780601f106125c5576101008083540402835291602001916125f0565b820191906000526020600020905b8154815290600101906020018083116125d357829003601f168201915b505050505091505b50919050565b600090815260086020526040902054600160a060020a0316151590565b600061262682611fba565b600160a060020a031683600160a060020a03161480610d745750506000908152600f6020526040902054600160a060020a0391821691161490565b600160a060020a031660009081526007602052604090205490565b60008061268883612bf0565b9092509050620f423f19821380156126a25750620f424082125b80156126b1575080620f423f19125b80156126bf5750620f424081125b15156116fa576040805160e560020a62461bcd02815260206004820152602760248201527f54686520636f6f7264696e617465732073686f756c6420626520696e7369646560448201527f20626f756e647300000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b6000806060600080600089511115156127a0576040805160e560020a62461bcd02815260206004820152602960248201526000805160206132d483398151915260448201526000805160206132f4833981519152606482015290519081900360840190fd5b87518951146127fb576040805160e560020a62461bcd02815260206004820152602b60248201526000805160206132748339815191526044820152600080516020613294833981519152606482015290519081900360840190fd5b601054600160a060020a03161515612883576040805160e560020a62461bcd02815260206004820152602160248201527f546865204573746174652072656769737472792073686f756c6420626520736560448201527f7400000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b601054604080517fd0def521000000000000000000000000000000000000000000000000000000008152600160a060020a038a811660048301908152602483019384528a5160448401528a51919094169363d0def521938c938c93606490910190602085019080838360005b838110156129075781810151838201526020016128ef565b50505050905090810190601f1680156129345780820380516001836020036101000a031916815260200191505b509350505050602060405180830381600087803b15801561295457600080fd5b505af1158015612968573d6000803e3d6000fd5b505050506040513d602081101561297e57600080fd5b5051935061298b84612ab0565b9250600091505b8851821015612a01576129d389838151811015156129ac57fe5b9060200190602002015189848151811015156129c457fe5b9060200190602002015161201d565b90506129f66129e182611fba565b601054600160a060020a0316838660016122dd565b600190910190612992565b5091979650505050505050565b8015612a3757612a1e3383611fd5565b15612a2857600080fd5b612a328233612c46565b612a56565b612a413383611fd5565b1515612a4c57600080fd5b612a568233612c7b565b6040805182151581529051600160a060020a0384169133917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c319181900360200190a35050565b6000610d74612aab848461201d565b6125fe565b6040805160208082528183019092526060918082016104008038833950505060208101929092525090565b70010000000000000000000000000000000082026fffffffffffffffffffffffffffffffff19166fffffffffffffffffffffffffffffffff82161792915050565b60008181526008602052604081208054600160a060020a031916600160a060020a038516179055612b4c83612661565b600160a060020a0384166000908152600760209081526040808320805460018181018355918552838520018790558684526009909252909120829055600654919250612b9e919063ffffffff612cad16565b600655505050565b6000828152600a602090815260409091208251610d639284019061317a565b82612bd03382612306565b1515612bdb57600080fd5b6117928686868686612cc0565b6000903b1190565b600080612c227001000000000000000000000000000000006fffffffffffffffffffffffffffffffff19851604612f16565b9150612c3f6fffffffffffffffffffffffffffffffff8416612f16565b9050915091565b600160a060020a039081166000908152600b60209081526040808320949093168252929092529020805460ff19166001179055565b600160a060020a039081166000908152600b60209081526040808320949093168252929092529020805460ff19169055565b81810182811015612cba57fe5b92915050565b600084600160a060020a0381161515612cd857600080fd5b848680600160a060020a0316612ced83611fba565b600160a060020a03161415612d0157600080fd5b888781600160a060020a0316612d1682611fba565b600160a060020a031614612d2957600080fd5b600089815260086020526040902054600160a060020a03169550612d4d868a612f4e565b612d57868a6130cf565b612d618a8a612b1c565b868015612d725750612d728a612be8565b15612ec85763150b7a0260e060020a027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168a600160a060020a031663150b7a0233898d8d6040518563ffffffff1660e060020a0281526004018085600160a060020a0316600160a060020a0316815260200184600160a060020a0316600160a060020a0316815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015612e39578181015183820152602001612e21565b50505050905090810190601f168015612e665780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b158015612e8857600080fd5b505af1158015612e9c573d6000803e3d6000fd5b505050506040513d6020811015612eb257600080fd5b5051600160e060020a03191614612ec857600080fd5b888a600160a060020a031687600160a060020a03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050505050505050505050565b60006f80000000000000000000000000000000821615612f4a57506fffffffffffffffffffffffffffffffff198117610be7565b5090565b6000818152600960205260408120549080612f796001612f6d87612661565b9063ffffffff61316816565b600160a060020a038616600090815260076020526040902080549193509083908110612fa157fe5b60009182526020808320909101548683526008825260408084208054600160a060020a0319169055600160a060020a0389168452600790925291208054919250829185908110612fed57fe5b6000918252602080832090910192909255600160a060020a038716815260079091526040812080548490811061301f57fe5b6000918252602080832090910192909255600160a060020a03871681526007909152604090208054906130569060001983016131f4565b50600160a060020a038516600090815260076020526040902054151561309757600160a060020a038516600090815260076020526040812061309791613218565b60008481526009602052604080822082905582825290208390556006546130c590600163ffffffff61316816565b6006555050505050565b81600160a060020a03166130e282611fba565b600160a060020a031614801561310e57506000818152600c6020526040902054600160a060020a031615155b15611a92576000818152600c60205260408082208054600160a060020a031916905551829190600160a060020a038516907f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925908390a45050565b60008282111561317457fe5b50900390565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106131bb57805160ff19168380011785556131e8565b828001600101855582156131e8579182015b828111156131e85782518255916020019190600101906131cd565b50612f4a929150613239565b815481835581811115610d6357600083815260209020610d63918101908301613239565b50805460008255906000526020600020908101906132369190613239565b50565b610c8f91905b80821115612f4a576000815560010161323f5600206279207468652070726f7879206f776e65720000000000000000000000000054686520636f6f7264696e617465732073686f756c642068617665207468652073616d65206c656e677468000000000000000000000000000000000000000000546869732066756e6374696f6e2063616e206f6e6c792062652063616c6c6564596f752073686f756c6420737570706c79206174206c65617374206f6e6520636f6f7264696e6174650000000000000000000000000000000000000000000000a165627a7a7230582089d37096385abbe1dc89cff6f959c2289f3f5a78a6883924536fbcdaa7fe5a7d0029
Deployed Bytecode
0x6080604052600436106102795763ffffffff60e060020a60003504166301ffc9a7811461027e578063025313a2146102b457806306fdde03146102e5578063081812fc1461036f578063095ea7b3146103875780631080f251146103ad578063133cbe3a146103c857806318160ddd146103e95780631cc69ac1146104105780631d4b11e4146104375780631e375901146104b35780631e4c7736146104d457806323b872dd1461050c5780632972b0f01461053657806329ffab3b1461055a5780632f745c591461057b578063313ce5671461059f578063341f13f2146105b457806335e64aaa146105d557806342842e0e146105fc578063439fab91146106265780634c4bf936146106465780634dad9003146106615780634f558e79146106995780635a3f2672146106b15780635c36b186146106d25780636352211e146106e757806365181ad3146106ff57806365937ab9146107315780636914db60146107555780636fb7e5881461076d57806370a0823114610788578063721d7d8e146107a95780637284e416146107be5780637efd9112146107d35780638668a41614610804578063881eeaa51461083c578063885363eb146108815780638da5cb5b1461093b5780638de74aa11461095057806395d89b41146109715780639d40b85014610986578063a22cb4651461099e578063a8d88127146109c4578063b0b02c60146109df578063b88d4fde14610a03578063ca8a2c0814610a3c578063d4dd159414610a74578063e387d31a14610a9c578063e985e9c514610ab1578063eca4742a1461036f578063f2fde38b14610ad8578063f5f83a6114610af9578063f9cbec4314610b28578063fd7a1b0014610b46575b600080fd5b34801561028a57600080fd5b506102a0600160e060020a031960043516610b67565b604080519115158252519081900360200190f35b3480156102c057600080fd5b506102c9610bec565b60408051600160a060020a039092168252519081900360200190f35b3480156102f157600080fd5b506102fa610bfb565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561033457818101518382015260200161031c565b50505050905090810190601f1680156103615780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561037b57600080fd5b506102c9600435610c92565b34801561039357600080fd5b506103ab600160a060020a0360043516602435610c9d565b005b3480156103b957600080fd5b506102c9600435602435610d68565b3480156103d457600080fd5b506103ab600160a060020a0360043516610d7b565b3480156103f557600080fd5b506103fe610e0b565b60408051918252519081900360200190f35b34801561041c57600080fd5b506103ab600435602435600160a060020a0360443516610e1a565b34801561044357600080fd5b506104636024600480358281019290820135918135918201910135610e91565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561049f578181015183820152602001610487565b505050509050019250505060405180910390f35b3480156104bf57600080fd5b506103fe600160a060020a0360043516610fe8565b3480156104e057600080fd5b506103ab6024600480358281019290820135918135808301929082013591604435918201910135610ffa565b34801561051857600080fd5b506103ab600160a060020a036004358116906024351660443561112c565b34801561054257600080fd5b506102a0600160a060020a03600435166024356111d6565b34801561056657600080fd5b506102a0600160a060020a03600435166111e2565b34801561058757600080fd5b506103fe600160a060020a03600435166024356111f7565b3480156105ab57600080fd5b506103fe61126e565b3480156105c057600080fd5b506103ab600160a060020a0360043516611273565b3480156105e157600080fd5b506103ab600435602435600160a060020a03604435166112fb565b34801561060857600080fd5b506103ab600160a060020a0360043581169060243516604435611335565b34801561063257600080fd5b506103ab6004803560248101910135611353565b34801561065257600080fd5b506102fa600435602435611447565b34801561066d57600080fd5b506103ab6024600480358281019290820135918135918201910135600160a060020a036044351661145b565b3480156106a557600080fd5b506102a0600435611580565b3480156106bd57600080fd5b50610463600160a060020a036004351661158b565b3480156106de57600080fd5b506103ab6115f7565b3480156106f357600080fd5b506102c960043561160b565b34801561070b57600080fd5b50610714611616565b60408051600160e060020a03199092168252519081900360200190f35b34801561073d57600080fd5b506102a0600160a060020a036004351660243561164b565b34801561076157600080fd5b506102fa600435611657565b34801561077957600080fd5b506103fe600435602435611662565b34801561079457600080fd5b506103fe600160a060020a036004351661166e565b3480156107b557600080fd5b506102c9611679565b3480156107ca57600080fd5b506102fa611688565b3480156107df57600080fd5b506107eb6004356116e9565b6040805192835260208301919091528051918290030190f35b34801561081057600080fd5b506103ab6024600480358281019290820135918135918201910135600160a060020a03604435166116ff565b34801561084857600080fd5b506103fe6024600480358281019290820135918135808301929082013591600160a060020a03604435169160643590810191013561179a565b34801561088d57600080fd5b506108a2600160a060020a0360043516611839565b604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b838110156108e65781810151838201526020016108ce565b50505050905001838103825284818151815260200191508051906020019060200280838360005b8381101561092557818101518382015260200161090d565b5050505090500194505050505060405180910390f35b34801561094757600080fd5b506102c961194f565b34801561095c57600080fd5b506103ab600160a060020a036004351661195e565b34801561097d57600080fd5b506102fa611a0c565b34801561099257600080fd5b506102c9600435611a6d565b3480156109aa57600080fd5b506103ab600160a060020a03600435166024351515611a88565b3480156109d057600080fd5b506102a0600435602435611a96565b3480156109eb57600080fd5b506103ab600435600160a060020a0360243516611aa2565b348015610a0f57600080fd5b506103ab600160a060020a0360048035821691602480359091169160443591606435908101910135611b79565b348015610a4857600080fd5b506103fe6024600480358281019290820135918135918201910135600160a060020a0360443516611bbf565b348015610a8057600080fd5b506103ab60048035906024803591604435918201910135611c3e565b348015610aa857600080fd5b506102c9611d2c565b348015610abd57600080fd5b506102a0600160a060020a0360043581169060243516611d3b565b348015610ae457600080fd5b506103ab600160a060020a0360043516611d47565b348015610b0557600080fd5b506103ab6024600480358281019290820135918135918201910135604435611de3565b348015610b3457600080fd5b506103ab600435602435604435611eea565b348015610b5257600080fd5b506103ab600160a060020a0360043516611f1a565b6000600160e060020a03198083161415610b8357506000610be7565b7f01ffc9a700000000000000000000000000000000000000000000000000000000600160e060020a031983161480610be457507f7c0633c600000000000000000000000000000000000000000000000000000000600160e060020a03198316145b90505b919050565b600154600160a060020a031681565b60038054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610c875780601f10610c5c57610100808354040283529160200191610c87565b820191906000526020600020905b815481529060010190602001808311610c6a57829003601f168201915b505050505090505b90565b6000610be482611f9f565b6000610ca882611fba565b905033600160a060020a0382161480610cc65750610cc63382611fd5565b1515610cd157600080fd5b600160a060020a038381169082161415610cea57600080fd5b82600160a060020a0316610cfd83611f9f565b600160a060020a031614610d63576000828152600c60205260408082208054600160a060020a031916600160a060020a0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a45b505050565b6000610d748383612003565b9392505050565b600154600160a060020a0316331480610d995750610d993382611fd5565b1515610def576040805160e560020a62461bcd02815260206004820152601160248201527f556e617574686f72697a65642075736572000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a03166000908152600d60205260409020429055565b6000610e15612017565b905090565b600154600160a060020a03163314610e7e576040805160e560020a62461bcd02815260206004820152603360248201526000805160206132b48339815191526044820152600080516020613254833981519152606482015290519081900360840190fd5b610d63610e8b848461201d565b826120d7565b6060806000808611610eef576040805160e560020a62461bcd02815260206004820152602960248201526000805160206132d483398151915260448201526000805160206132f4833981519152606482015290519081900360840190fd5b858414610f48576040805160e560020a62461bcd02815260206004820152602b60248201526000805160206132748339815191526044820152600080516020613294833981519152606482015290519081900360840190fd5b604080518781526020808902820101909152868015610f71578160200160208202803883390190505b509150600090505b85811015610fde57610fb1878783818110610f9057fe5b905060200201358686848181101515610fa557fe5b90506020020135612003565b8282815181101515610fbf57fe5b600160a060020a03909216602092830290910190910152600101610f79565b5095945050505050565b600d6020526000908152604090205481565b6000808611611055576040805160e560020a62461bcd02815260206004820152602960248201526000805160206132d483398151915260448201526000805160206132f4833981519152606482015290519081900360840190fd5b8584146110ae576040805160e560020a62461bcd02815260206004820152602b60248201526000805160206132748339815191526044820152600080516020613294833981519152606482015290519081900360840190fd5b5060005b858110156111235761111b8787838181106110c957fe5b9050602002013586868481811015156110de57fe5b9050602002013585858080601f01602080910402602001604051908101604052809392919081815260200183838082843750612140945050505050565b6001016110b2565b50505050505050565b601054600160a060020a03838116911614156111b8576040805160e560020a62461bcd02815260206004820152602f60248201527f457374617465526567697374727920756e73616665207472616e73666572732060448201527f617265206e6f7420616c6c6f7765640000000000000000000000000000000000606482015290519081900360840190fd5b610d63838383602060405190810160405280600081525060006122dd565b6000610d748383612306565b600e6020526000908152604090205460ff1681565b600160a060020a038216600090815260076020526040812054821061121b57600080fd5b6f80000000000000000000000000000000821061123757600080fd5b600160a060020a038316600090815260076020526040902080548390811061125b57fe5b9060005260206000200154905092915050565b600090565b600154600160a060020a031633146112d7576040805160e560020a62461bcd02815260206004820152603360248201526000805160206132b48339815191526044820152600080516020613254833981519152606482015290519081900360840190fd5b600160a060020a03166000908152600e60205260409020805460ff19166001179055565b6000611307848461201d565b905061132f61131582611fba565b8383602060405190810160405280600081525060016122dd565b50505050565b610d63838383602060405190810160405280600081525060016122dd565b6040805180820190915260118082527f446563656e7472616c616e64204c414e4400000000000000000000000000000060209092019182526113979160039161317a565b506040805180820190915260048082527f4c414e440000000000000000000000000000000000000000000000000000000060209092019182526113da918161317a565b506040805160608101825260338082527f436f6e747261637420746861742073746f7265732074686520446563656e7472602083019081527f616c616e64204c414e44207265676973747279000000000000000000000000009290930191909152610d639160059161317a565b6060610d74611456848461201d565b612384565b6000808086116114b7576040805160e560020a62461bcd02815260206004820152602960248201526000805160206132d483398151915260448201526000805160206132f4833981519152606482015290519081900360840190fd5b858414611510576040805160e560020a62461bcd02815260206004820152602b60248201526000805160206132748339815191526044820152600080516020613294833981519152606482015290519081900360840190fd5b600091505b858210156111235761154d87878481811061152c57fe5b90506020020135868685818110151561154157fe5b9050602002013561201d565b905061157561155b82611fba565b8483602060405190810160405280600081525060016122dd565b600190910190611515565b6000610be4826125fe565b600160a060020a0381166000908152600760209081526040918290208054835181840281018401909452808452606093928301828280156115eb57602002820191906000526020600020905b8154815260200190600101908083116115d7575b50505050509050919050565b336000908152600d60205260409020429055565b6000610be482611fba565b604080517f6765744d657461646174612875696e74323536290000000000000000000000008152905190819003601401902081565b6000610d74838361261b565b6060610be482612384565b6000610d74838361201d565b6000610be482612661565b600054600160a060020a031681565b60058054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610c875780601f10610c5c57610100808354040283529160200191610c87565b6000806116f58361267c565b915091505b915091565b600154600090600160a060020a03163314611766576040805160e560020a62461bcd02815260206004820152603360248201526000805160206132b48339815191526044820152600080516020613254833981519152606482015290519081900360840190fd5b5060005b848110156117925761178a61178487878481811061152c57fe5b836120d7565b60010161176a565b505050505050565b600061182d8888808060200260200160405190810160405280939291908181526020018383602002808284375050604080516020808e0282810182019093528d82529095508d94508c93508392508501908490808284375050604080516020601f8c018190048102820181019092528a81528c955093508a9250899150819084018382808284375061273b945050505050565b98975050505050505050565b600160a060020a0381166000908152600760209081526040808320548151818152818402810190930190915260609283928391829181908190868015611889578160200160208202803883390190505b509450856040519080825280602002602001820160405280156118b6578160200160208202803883390190505b509350600090505b8581101561194057600160a060020a038916600090815260076020526040902080546118ff9190839081106118ef57fe5b906000526020600020015461267c565b86519194509250839086908390811061191457fe5b602090810290910101528351829085908390811061192e57fe5b602090810290910101526001016118be565b50929791965090945050505050565b600254600160a060020a031681565b600154600160a060020a031633146119c2576040805160e560020a62461bcd02815260206004820152603360248201526000805160206132b48339815191526044820152600080516020613254833981519152606482015290519081900360840190fd5b60108054600160a060020a031916600160a060020a0383169081179091556040517f5b3ad80e09ce4c88735037542891c02fdc63b85e96a579d9260a403153c2775590600090a250565b60048054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610c875780601f10610c5c57610100808354040283529160200191610c87565b600f60205260009081526040902054600160a060020a031681565b611a928282612a0e565b5050565b6000610d748383612a9c565b81611aac81611fba565b600160a060020a03163314611b1f576040805160e560020a62461bcd02815260206004820152603a60248201526000805160206132b483398151915260448201527f20627920746865206f776e6572206f6620746865206173736574000000000000606482015290519081900360840190fd5b6000838152600f60205260408082208054600160a060020a031916600160a060020a0386169081179091559051909185917f9d9dd80a56a16f715df6eb40b771e24ff8cbea6eed9de28473ce0f28fe5602a99190a3505050565b611bb885858585858080601f01602080910402602001604051908101604052809392919081815260200183838082843750600194506122dd9350505050565b5050505050565b6000611c348686808060200260200160405190810160405280939291908181526020018383602002808284375050604080516020808c0282810182019093528b82529095508b94508a93508392508501908490808284375050604080516020810190915260008152899450925061273b915050565b9695505050505050565b611c48848461201d565b611c5181611fba565b600160a060020a031633600160a060020a03161480611c755750611c75338261261b565b1515611cf1576040805160e560020a62461bcd02815260206004820152602660248201527f6d73672e73656e646572206973206e6f7420617574686f72697a656420746f2060448201527f7570646174650000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b611bb8858585858080601f01602080910402602001604051908101604052809392919081815260200183838082843750612140945050505050565b601054600160a060020a031681565b6000610d748383611fd5565b600254600160a060020a03163314611d5b57fe5b600254600160a060020a0382811691161415611dc1576040805160e560020a62461bcd02815260206004820152601b60248201527f43616e6e6f74207472616e7366657220746f20796f757273656c660000000000604482015290519081900360640190fd5b60028054600160a060020a031916600160a060020a0392909216919091179055565b600080808611611e3f576040805160e560020a62461bcd02815260206004820152602960248201526000805160206132d483398151915260448201526000805160206132f4833981519152606482015290519081900360840190fd5b858414611e98576040805160e560020a62461bcd02815260206004820152602b60248201526000805160206132748339815191526044820152600080516020613294833981519152606482015290519081900360840190fd5b600091505b8582101561112357611eb487878481811061152c57fe5b9050611edf611ec282611fba565b601054600160a060020a031683611ed887612ab0565b60016122dd565b600190910190611e9d565b6000611ef6848461201d565b905061132f611f0482611fba565b601054600160a060020a031683611ed886612ab0565b600154600160a060020a03163314611f7e576040805160e560020a62461bcd02815260206004820152603360248201526000805160206132b48339815191526044820152600080516020613254833981519152606482015290519081900360840190fd5b600160a060020a03166000908152600e60205260409020805460ff19169055565b6000908152600c6020526040902054600160a060020a031690565b600090815260086020526040902054600160a060020a031690565b600160a060020a039182166000908152600b6020908152604080832093909416825291909152205460ff1690565b6000610d74612012848461201d565b611fba565b60065490565b600082620f423f191280156120345750620f424083125b8015612043575081620f423f19125b80156120515750620f424082125b15156120cd576040805160e560020a62461bcd02815260206004820152602760248201527f54686520636f6f7264696e617465732073686f756c6420626520696e7369646560448201527f20626f756e647300000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b610d748383612adb565b600082815260086020526040902054600160a060020a0316156120f957600080fd5b6121038183612b1c565b8181600160a060020a031660007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b60008061214d858561201d565b61215681611fba565b600160a060020a031633600160a060020a0316148061217a575061217a338261261b565b15156121f6576040805160e560020a62461bcd02815260206004820152602660248201527f6d73672e73656e646572206973206e6f7420617574686f72697a656420746f2060448201527f7570646174650000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b612200868661201d565b600081815260086020526040902054909350600160a060020a031691506122278385612ba6565b33600160a060020a031682600160a060020a0316847f47c705b9219229ad762fca605f08fb024a3415d0ae78af5d319820c72e510414876040518080602001828103825283818151815260200191508051906020019080838360005b8381101561229b578181015183820152602001612283565b50505050905090810190601f1680156122c85780820380516001836020036101000a031916815260200191505b509250505060405180910390a4505050505050565b6000838152600f602052604090208054600160a060020a0319169055611bb88585858585612bc5565b600080600160a060020a038416151561231e57600080fd5b61232783611fba565b905080600160a060020a031684600160a060020a0316141561234c576001915061237d565b6123568185611fd5565b8061237a575083600160a060020a031661236f84611f9f565b600160a060020a0316145b91505b5092915050565b6060600061239183611fba565b905061239c81612be8565b80156123b65750601054600160a060020a03828116911614155b1561255d57604080517f6765744d657461646174612875696e7432353629000000000000000000000000815281519081900360140181207f01ffc9a7000000000000000000000000000000000000000000000000000000008252600160e060020a03191660048201529051600160a060020a038316916301ffc9a79160248083019260209291908290030181600087803b15801561245357600080fd5b505af1158015612467573d6000803e3d6000fd5b505050506040513d602081101561247d57600080fd5b50511561255d5780600160a060020a031663a574cea4846040518263ffffffff1660e060020a02815260040180828152602001915050600060405180830381600087803b1580156124cd57600080fd5b505af11580156124e1573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561250a57600080fd5b81019080805164010000000081111561252257600080fd5b8201602081018481111561253557600080fd5b815164010000000081118282018710171561254f57600080fd5b509095506125f89350505050565b6000838152600a602090815260409182902080548351601f6002600019610100600186161502019093169290920491820184900484028101840190945280845290918301828280156125f05780601f106125c5576101008083540402835291602001916125f0565b820191906000526020600020905b8154815290600101906020018083116125d357829003601f168201915b505050505091505b50919050565b600090815260086020526040902054600160a060020a0316151590565b600061262682611fba565b600160a060020a031683600160a060020a03161480610d745750506000908152600f6020526040902054600160a060020a0391821691161490565b600160a060020a031660009081526007602052604090205490565b60008061268883612bf0565b9092509050620f423f19821380156126a25750620f424082125b80156126b1575080620f423f19125b80156126bf5750620f424081125b15156116fa576040805160e560020a62461bcd02815260206004820152602760248201527f54686520636f6f7264696e617465732073686f756c6420626520696e7369646560448201527f20626f756e647300000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b6000806060600080600089511115156127a0576040805160e560020a62461bcd02815260206004820152602960248201526000805160206132d483398151915260448201526000805160206132f4833981519152606482015290519081900360840190fd5b87518951146127fb576040805160e560020a62461bcd02815260206004820152602b60248201526000805160206132748339815191526044820152600080516020613294833981519152606482015290519081900360840190fd5b601054600160a060020a03161515612883576040805160e560020a62461bcd02815260206004820152602160248201527f546865204573746174652072656769737472792073686f756c6420626520736560448201527f7400000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b601054604080517fd0def521000000000000000000000000000000000000000000000000000000008152600160a060020a038a811660048301908152602483019384528a5160448401528a51919094169363d0def521938c938c93606490910190602085019080838360005b838110156129075781810151838201526020016128ef565b50505050905090810190601f1680156129345780820380516001836020036101000a031916815260200191505b509350505050602060405180830381600087803b15801561295457600080fd5b505af1158015612968573d6000803e3d6000fd5b505050506040513d602081101561297e57600080fd5b5051935061298b84612ab0565b9250600091505b8851821015612a01576129d389838151811015156129ac57fe5b9060200190602002015189848151811015156129c457fe5b9060200190602002015161201d565b90506129f66129e182611fba565b601054600160a060020a0316838660016122dd565b600190910190612992565b5091979650505050505050565b8015612a3757612a1e3383611fd5565b15612a2857600080fd5b612a328233612c46565b612a56565b612a413383611fd5565b1515612a4c57600080fd5b612a568233612c7b565b6040805182151581529051600160a060020a0384169133917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c319181900360200190a35050565b6000610d74612aab848461201d565b6125fe565b6040805160208082528183019092526060918082016104008038833950505060208101929092525090565b70010000000000000000000000000000000082026fffffffffffffffffffffffffffffffff19166fffffffffffffffffffffffffffffffff82161792915050565b60008181526008602052604081208054600160a060020a031916600160a060020a038516179055612b4c83612661565b600160a060020a0384166000908152600760209081526040808320805460018181018355918552838520018790558684526009909252909120829055600654919250612b9e919063ffffffff612cad16565b600655505050565b6000828152600a602090815260409091208251610d639284019061317a565b82612bd03382612306565b1515612bdb57600080fd5b6117928686868686612cc0565b6000903b1190565b600080612c227001000000000000000000000000000000006fffffffffffffffffffffffffffffffff19851604612f16565b9150612c3f6fffffffffffffffffffffffffffffffff8416612f16565b9050915091565b600160a060020a039081166000908152600b60209081526040808320949093168252929092529020805460ff19166001179055565b600160a060020a039081166000908152600b60209081526040808320949093168252929092529020805460ff19169055565b81810182811015612cba57fe5b92915050565b600084600160a060020a0381161515612cd857600080fd5b848680600160a060020a0316612ced83611fba565b600160a060020a03161415612d0157600080fd5b888781600160a060020a0316612d1682611fba565b600160a060020a031614612d2957600080fd5b600089815260086020526040902054600160a060020a03169550612d4d868a612f4e565b612d57868a6130cf565b612d618a8a612b1c565b868015612d725750612d728a612be8565b15612ec85763150b7a0260e060020a027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168a600160a060020a031663150b7a0233898d8d6040518563ffffffff1660e060020a0281526004018085600160a060020a0316600160a060020a0316815260200184600160a060020a0316600160a060020a0316815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015612e39578181015183820152602001612e21565b50505050905090810190601f168015612e665780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b158015612e8857600080fd5b505af1158015612e9c573d6000803e3d6000fd5b505050506040513d6020811015612eb257600080fd5b5051600160e060020a03191614612ec857600080fd5b888a600160a060020a031687600160a060020a03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050505050505050505050565b60006f80000000000000000000000000000000821615612f4a57506fffffffffffffffffffffffffffffffff198117610be7565b5090565b6000818152600960205260408120549080612f796001612f6d87612661565b9063ffffffff61316816565b600160a060020a038616600090815260076020526040902080549193509083908110612fa157fe5b60009182526020808320909101548683526008825260408084208054600160a060020a0319169055600160a060020a0389168452600790925291208054919250829185908110612fed57fe5b6000918252602080832090910192909255600160a060020a038716815260079091526040812080548490811061301f57fe5b6000918252602080832090910192909255600160a060020a03871681526007909152604090208054906130569060001983016131f4565b50600160a060020a038516600090815260076020526040902054151561309757600160a060020a038516600090815260076020526040812061309791613218565b60008481526009602052604080822082905582825290208390556006546130c590600163ffffffff61316816565b6006555050505050565b81600160a060020a03166130e282611fba565b600160a060020a031614801561310e57506000818152600c6020526040902054600160a060020a031615155b15611a92576000818152600c60205260408082208054600160a060020a031916905551829190600160a060020a038516907f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925908390a45050565b60008282111561317457fe5b50900390565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106131bb57805160ff19168380011785556131e8565b828001600101855582156131e8579182015b828111156131e85782518255916020019190600101906131cd565b50612f4a929150613239565b815481835581811115610d6357600083815260209020610d63918101908301613239565b50805460008255906000526020600020908101906132369190613239565b50565b610c8f91905b80821115612f4a576000815560010161323f5600206279207468652070726f7879206f776e65720000000000000000000000000054686520636f6f7264696e617465732073686f756c642068617665207468652073616d65206c656e677468000000000000000000000000000000000000000000546869732066756e6374696f6e2063616e206f6e6c792062652063616c6c6564596f752073686f756c6420737570706c79206174206c65617374206f6e6520636f6f7264696e6174650000000000000000000000000000000000000000000000a165627a7a7230582089d37096385abbe1dc89cff6f959c2289f3f5a78a6883924536fbcdaa7fe5a7d0029
Swarm Source
bzzr://89d37096385abbe1dc89cff6f959c2289f3f5a78a6883924536fbcdaa7fe5a7d
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 34 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.