For the complete documentation index, see llms.txt. This page is also available as Markdown.

Estates Marketplace Integrations

Important things to have in mind if you want to integrate the Decentraland's Estate in your marketplace

Integrating Decentraland's Estate in your Marketplace

The Decentraland's Estate is an ERC721 compliant NFT and runs in Ethereum Mainnet. Therefore a lot of third party marketplaces can trade them. In order to do so, this marketplace must follow certain rules in order to make keep trades secure for the users.

As you may know, each Estate is a group of LANDs and it have a bytes hash associated to the group that it call fingerprint. Everytime the Estate changes by adding or removing a LAND, its fingerprint changes too.

For marketplaces, especially the ones without an escrow system, it is 100% recommended to have a record of the Estate's fingerprint when someone list it for sale or makes an offer. That way, when the order/offer is successfully executed, the current owner can't change the estate by trying to front-run the order execution.

It is not recommended to list empty Estates. The Estate smart contract has a method getEstateSize that returns the number of LANDs in the Estate. If the result is 0, we recommend not listing that Estate. If you want to list them anyways, you will see an image like this one:

Example

Not using the Estate fingerprint

  • Bob has the Estate1 with LAND (1,1) and (1,2). Estate1 fingerprint: hash1

  • Bob adds the LAND (1,3) to Estate1. The Estate1 has the LANDs: (1,1), (1,2), and (1,3). Estate1 fingerprint: hash2 (Fingerprint changed)

  • Bob removes the LAND (1,1) from Estate1. The Estate1 has the LANDs: (1,2) and (1,3). Estate1 fingerprint: hash3 (Fingerprint changed)

  • Bob puts on sale the Estate1. The list is created onchain in the Ethereum mainnet with the Estate smart contract address, the Estate id, the price, and the expiration date.

  • Alice sends a transaction to buy the Estate specifying the estate id and the price expected to pay.

  • Bob detects that someone is trying to buy his Estate1 and sends a transaction with higher gas fees than Alice to remove the LANDs (1,2) and (1,3) from Estate1.

  • Bob's transactions is mined first. Estate1 has 0 LANDs. Estate1 fingerprint: hash4 (Fingerprint changed)

  • Alice's transaction is mined later. Alice bought the Estate1 with 0 LANDs on it. It means that Alice got front-runned (and stolen/scammed) by Bob.

Using the Estate fingerprint

  • Bob has the Estate1 with LAND (1,1) and (1,2). Estate1 fingerprint: hash1

  • Bob adds the LAND (1,3) to Estate1. The Estate1 has the LANDs: (1,1), (1,2), and (1,3). Estate1 fingerprint: hash2 (Fingerprint changed)

  • Bob removes the LAND (1,1) from Estate1. The Estate1 has the LANDs: (1,2) and (1,3). Estate1 fingerprint: hash3 (Fingerprint changed)

  • Bob puts on sale the Estate1. The list is created onchain in the Ethereum mainnet with the Estate smart contract address, the Estate id, the price, the expiration date.

  • Alice sends a transaction to buy the Estate specifying the estate id, the price expected to pay, and the fingerprint she saw (hash3).

  • Bob detects that someone is trying to buy his Estate1 and sends a transaction with higher gas fees than Alice to remove the LANDs (1,2) and (1,3) from Estate1.

  • Bob's transactions is mined first. Estate1 has 0 LANDs. Estate1 fingerprint: hash4 (Fingerprint changed)

  • Alice's transaction is reverted because the smart contract checked that the fingerprint in the param that Alice sent didn't match with the current Estate1 fingerprint (hash3 != hash4). This check prevented Alice to buy a non desired Estate.

Estate Smart Contract Fingerprint Interface

The Estate's smart contract is compliant with a fingerprint interface. When an Estate is listed for sale or receives an offer, record its fingerprint by calling getFingerprintV2(uint256 estateId) and store the value it returns. To check whether that order/offer is still valid at execution time, call verifyFingerprint(uint256 estateId, bytes fingerprint) with the stored value.

Always store the value returned by getFingerprintV2. The older getFingerprint method is kept only for backwards compatibility and is being phased out: starting 26 November 2026, verifyFingerprint stops accepting values produced by it. New integrations should use getFingerprintV2.

You can check a working production example here.

Last updated