Decentraland LAND
About
Stats
Public Functions
49
Event Types
12
Code Size
39,966 bytes
Events (12) keyboard_arrow_up
Constants (8) keyboard_arrow_up
State Variables (19) keyboard_arrow_up
Functions
name keyboard_arrow_up
symbol keyboard_arrow_up
description keyboard_arrow_up
tokenMetadata keyboard_arrow_up
tokensOf keyboard_arrow_up
tokenOfOwnerByIndex keyboard_arrow_up
Requirements help
Source Code
function tokenOfOwnerByIndex(address owner, uint256 index)
external
view
returns (uint256 assetId)
{
require(index < _assetsOf[owner].length);
require(index < (1 << 127));
return _assetsOf[owner][index];
}
totalSupply keyboard_arrow_up
ownerOf keyboard_arrow_up
balanceOf keyboard_arrow_up
isApprovedForAll keyboard_arrow_up
getApproved keyboard_arrow_up
getApprovedAddress keyboard_arrow_up
isAuthorized keyboard_arrow_up
Source Code
function isAuthorized(address operator, uint256 assetId)
external
view
returns (bool)
{
return _isAuthorized(operator, assetId);
}
setApprovalForAll keyboard_arrow_up
approve keyboard_arrow_up
Requirements help
Source Code
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);
}
}
safeTransferFrom keyboard_arrow_up
safeTransferFrom keyboard_arrow_up
Parameters help
Source Code
function safeTransferFrom(
address from,
address to,
uint256 assetId,
bytes userData
) external {
return _doTransferFrom(from, to, assetId, userData, true);
}
transferFrom keyboard_arrow_up
Source Code
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);
}
supportsInterface keyboard_arrow_up
Source Code
function supportsInterface(bytes4 _interfaceID) external view returns (bool) {
if (_interfaceID == 0xffffffff) {
return false;
}
return
_interfaceID == InterfaceId_ERC165 ||
_interfaceID == Old_InterfaceId_ERC721 ||
_interfaceID == InterfaceId_ERC721;
}
exists keyboard_arrow_up
decimals keyboard_arrow_up
transferOwnership keyboard_arrow_up
Modifiers help
onlyOwner checks for the following:
Source Code
function transferOwnership(address _newOwner) public onlyOwner {
require(_newOwner != owner, "Cannot transfer to yourself");
owner = _newOwner;
}
initialize keyboard_arrow_up
isUpdateAuthorized keyboard_arrow_up
authorizeDeploy keyboard_arrow_up
forbidDeploy keyboard_arrow_up
Modifiers help
onlyProxyOwner checks for the following:
Requirements help
Source Code
function forbidDeploy(address beneficiary) external onlyProxyOwner {
require(beneficiary != address(0), "invalid address");
require(authorizedDeploy[beneficiary], "address is already forbidden");
authorizedDeploy[beneficiary] = false;
emit DeployForbidden(msg.sender, beneficiary);
}
assignNewParcel keyboard_arrow_up
assignMultipleParcels keyboard_arrow_up
Modifiers help
onlyDeployer checks for the following:
Source Code
function assignMultipleParcels(
int256[] x,
int256[] y,
address beneficiary
) external onlyDeployer {
for (uint256 i = 0; i < x.length; i++) {
_generate(_encodeTokenId(x[i], y[i]), beneficiary);
}
}
ping keyboard_arrow_up
setLatestToNow keyboard_arrow_up
Requirements help
Source Code
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;
}
encodeTokenId keyboard_arrow_up
Requirements help
Source Code
function encodeTokenId(int256 x, int256 y) external pure returns (uint256) {
return _encodeTokenId(x, y);
}
decodeTokenId keyboard_arrow_up
Requirements help
Source Code
function decodeTokenId(uint256 value) external pure returns (int256, int256) {
return _decodeTokenId(value);
}
exists keyboard_arrow_up
ownerOfLand keyboard_arrow_up
ownerOfLandMany keyboard_arrow_up
Requirements help
Source Code
function ownerOfLandMany(int256[] x, int256[] 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 (uint256 i = 0; i < x.length; i++) {
addrs[i] = _ownerOfLand(x[i], y[i]);
}
return addrs;
}
landOf keyboard_arrow_up
Source Code
function landOf(address owner) external view returns (int256[], int256[]) {
uint256 len = _assetsOf[owner].length;
int256[] memory x = new int256[](len);
int256[] memory y = new int256[](len);
int256 assetX;
int256 assetY;
for (uint256 i = 0; i < len; i++) {
(assetX, assetY) = _decodeTokenId(_assetsOf[owner][i]);
x[i] = assetX;
y[i] = assetY;
}
return (x, y);
}
landData keyboard_arrow_up
transferLand keyboard_arrow_up
Source Code
function transferLand(
int256 x,
int256 y,
address to
) external {
uint256 tokenId = _encodeTokenId(x, y);
_doTransferFrom(_ownerOf(tokenId), to, tokenId, "", true);
}
transferManyLand keyboard_arrow_up
Requirements help
Source Code
function transferManyLand(
int256[] x,
int256[] 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 (uint256 i = 0; i < x.length; i++) {
uint256 tokenId = _encodeTokenId(x[i], y[i]);
_doTransferFrom(_ownerOf(tokenId), to, tokenId, "", true);
}
}
transferLandToEstate keyboard_arrow_up
Requirements help
Source Code
function transferLandToEstate(
int256 x,
int256 y,
uint256 estateId
) external {
require(
estateRegistry.ownerOf(estateId) == msg.sender,
"You must own the Estate you want to transfer to"
);
uint256 tokenId = _encodeTokenId(x, y);
_doTransferFrom(
_ownerOf(tokenId),
address(estateRegistry),
tokenId,
toBytes(estateId),
true
);
}
transferManyLandToEstate keyboard_arrow_up
Requirements help
Source Code
function transferManyLandToEstate(
int256[] x,
int256[] 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");
require(
estateRegistry.ownerOf(estateId) == msg.sender,
"You must own the Estate you want to transfer to"
);
for (uint256 i = 0; i < x.length; i++) {
uint256 tokenId = _encodeTokenId(x[i], y[i]);
_doTransferFrom(
_ownerOf(tokenId),
address(estateRegistry),
tokenId,
toBytes(estateId),
true
);
}
}
setUpdateOperator keyboard_arrow_up
Modifiers help
canSetUpdateOperator checks for the following:
One or more of the following:
-null
Source Code
function setUpdateOperator(uint256 assetId, address operator)
public
canSetUpdateOperator(assetId)
{
updateOperator[assetId] = operator;
emit UpdateOperator(assetId, operator);
}
setManyUpdateOperator keyboard_arrow_up
Source Code
function setManyUpdateOperator(uint256[] _assetIds, address _operator) public {
for (uint256 i = 0; i < _assetIds.length; i++) {
setUpdateOperator(_assetIds[i], _operator);
}
}
setUpdateManager keyboard_arrow_up
Requirements help
Source Code
function setUpdateManager(
address _owner,
address _operator,
bool _approved
) external {
require(
_operator != msg.sender,
"The operator should be different from owner"
);
require(
_owner == msg.sender || _isApprovedForAll(_owner, msg.sender),
"Unauthorized user"
);
updateManager[_owner][_operator] = _approved;
emit UpdateManager(_owner, _operator, msg.sender, _approved);
}
setEstateRegistry keyboard_arrow_up
Modifiers help
onlyProxyOwner checks for the following:
Source Code
function setEstateRegistry(address registry) external onlyProxyOwner {
estateRegistry = IEstateRegistry(registry);
emit EstateRegistrySet(registry);
}
createEstate keyboard_arrow_up
Requirements help
UNKNOWN VALUE
must not be equal to
0
Source Code
function createEstate(
int256[] x,
int256[] y,
address beneficiary
) external returns (uint256) {
// solium-disable-next-line arg-overflow
return _createEstate(x, y, beneficiary, "");
}
createEstateWithMetadata keyboard_arrow_up
Requirements help
UNKNOWN VALUE
must not be equal to
0
Source Code
function createEstateWithMetadata(
int256[] x,
int256[] y,
address beneficiary,
string metadata
) external returns (uint256) {
// solium-disable-next-line arg-overflow
return _createEstate(x, y, beneficiary, metadata);
}
updateLandData keyboard_arrow_up
updateManyLandData keyboard_arrow_up
Requirements help
Source Code
function updateManyLandData(
int256[] x,
int256[] 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 (uint256 i = 0; i < x.length; i++) {
_updateLandData(x[i], y[i], data);
}
}
Internal Functions
Internal functions are parts of the contract that can't be used directly, but instead are used by the public functions listed above.
internal LANDRegistry._isUpdateAuthorized keyboard_arrow_up
Source Code
function _isUpdateAuthorized(address operator, uint256 assetId)
internal
view
returns (bool)
{
address owner = _ownerOf(assetId);
return
owner == operator ||
updateOperator[assetId] == operator ||
updateManager[owner][operator];
}
internal LANDRegistry._encodeTokenId keyboard_arrow_up
Requirements help
Source Code
function _encodeTokenId(int256 x, int256 y)
internal
pure
returns (uint256 result)
{
require(
-1000000 < x && x < 1000000 && -1000000 < y && y < 1000000,
"The coordinates should be inside bounds"
);
return _unsafeEncodeTokenId(x, y);
}
internal LANDRegistry._unsafeEncodeTokenId keyboard_arrow_up
internal LANDRegistry._unsafeDecodeTokenId keyboard_arrow_up
Source Code
function _unsafeDecodeTokenId(uint256 value)
internal
pure
returns (int256 x, int256 y)
{
x = expandNegative128BitCast((value & clearLow) >> 128);
y = expandNegative128BitCast(value & clearHigh);
}
internal LANDRegistry._decodeTokenId keyboard_arrow_up
Requirements help
Source Code
function _decodeTokenId(uint256 value)
internal
pure
returns (int256 x, int256 y)
{
(x, y) = _unsafeDecodeTokenId(value);
require(
-1000000 < x && x < 1000000 && -1000000 < y && y < 1000000,
"The coordinates should be inside bounds"
);
}
internal LANDRegistry.expandNegative128BitCast keyboard_arrow_up
internal LANDRegistry._exists keyboard_arrow_up
internal LANDRegistry._ownerOfLand keyboard_arrow_up
internal LANDRegistry._tokenMetadata keyboard_arrow_up
Source Code
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];
}
internal LANDRegistry._createEstate keyboard_arrow_up
Requirements help
UNKNOWN VALUE
must not be equal to
0
Source Code
function _createEstate(
int256[] x,
int256[] 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 (uint256 i = 0; i < x.length; i++) {
uint256 tokenId = _encodeTokenId(x[i], y[i]);
_doTransferFrom(
_ownerOf(tokenId),
address(estateRegistry),
tokenId,
estateTokenIdBytes,
true
);
}
return estateTokenId;
}
internal LANDRegistry.toBytes keyboard_arrow_up
internal LANDRegistry._updateLandData keyboard_arrow_up
Modifiers help
onlyUpdateAuthorized checks for the following:
One or more of the following:
-null - ORnull - OR
the sender's address
must be equal to
the result of calling _ownerOf with UNKNOWN ARGUMENT
Source Code
function _updateLandData(
int256 x,
int256 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);
}
internal LANDRegistry._doTransferFrom keyboard_arrow_up
Parameters help
Source Code
function _doTransferFrom(
address from,
address to,
uint256 assetId,
bytes userData,
bool doCheck
) internal {
updateOperator[assetId] = address(0);
super._doTransferFrom(from, to, assetId, userData, doCheck);
}
internal LANDRegistry._isContract keyboard_arrow_up
Source Code
function _isContract(address addr) internal view returns (bool) {
uint256 size;
// solium-disable-next-line security/no-inline-assembly
assembly {
size := extcodesize(addr)
}
return size > 0;
}
internal OwnableStorage.constructor keyboard_arrow_up
internal OwnableStorage.constructor keyboard_arrow_up
internal FullAssetRegistry._exists keyboard_arrow_up
internal ERC721Base._totalSupply keyboard_arrow_up
internal ERC721Base._ownerOf keyboard_arrow_up
internal ERC721Base._balanceOf keyboard_arrow_up
internal ERC721Base._isApprovedForAll keyboard_arrow_up
internal ERC721Base._getApprovedAddress keyboard_arrow_up
internal ERC721Base._isAuthorized keyboard_arrow_up
Source Code
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;
}
internal ERC721Base._setApprovalForAll keyboard_arrow_up
Source Code
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);
}
internal ERC721Base._addAuthorization keyboard_arrow_up
internal ERC721Base._clearAuthorization keyboard_arrow_up
internal ERC721Base._addAssetTo keyboard_arrow_up
Source Code
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);
}
internal ERC721Base._removeAssetFrom keyboard_arrow_up
Source Code
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);
}
internal ERC721Base._clearApproval keyboard_arrow_up
Source Code
function _clearApproval(address holder, uint256 assetId) internal {
if (_ownerOf(assetId) == holder && _approval[assetId] != 0) {
_approval[assetId] = 0;
emit Approval(holder, 0, assetId);
}
}
internal ERC721Base._generate keyboard_arrow_up
Requirements help
Source Code
function _generate(uint256 assetId, address beneficiary) internal {
require(_holderOf[assetId] == 0);
_addAssetTo(beneficiary, assetId);
emit Transfer(0, beneficiary, assetId);
}
internal ERC721Base._destroy keyboard_arrow_up
Source Code
function _destroy(uint256 assetId) internal {
address holder = _holderOf[assetId];
require(holder != 0);
_removeAssetFrom(holder, assetId);
emit Transfer(holder, 0, assetId);
}
internal ERC721Base._doTransferFrom keyboard_arrow_up
internal ERC721Base._moveToken keyboard_arrow_up
Parameters help
Modifiers help
Source Code
function _moveToken(
address from,
address to,
uint256 assetId,
bytes userData,
bool doCheck
)
private
isDestinataryDefined(to)
destinataryIsNotHolder(assetId, to)
isCurrentOwner(from, assetId)
{
address holder = _holderOf[assetId];
_clearApproval(holder, assetId);
_removeAssetFrom(holder, assetId);
_addAssetTo(to, assetId);
emit Transfer(holder, 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
);
}
}