Section 01 · Introduction
Why real estate tokenization needs two tokens
Real world assets need both a unique identifier (the property) and a divisible economic claim (the shares). One token cannot do both jobs cleanly.
Quick answer
How does real estate tokenization work? A tokenized property uses an ERC721 deed NFT to represent the legal pointer to the property and an ERC20 share token to represent fractional economic ownership. A custodian entity holds the actual title off chain. The contract enforces KYC at transfer time so shares cannot move to unverified wallets. Rent and resale proceeds flow to share holders through a pull payment dividend contract.
RealT, Lofty, and Propy each ship variants of the same architecture. The property gets its own deed NFT. The deed NFT references a per property ERC20 share token. The shares are sold to investors after KYC. The on chain shares are backed by an off chain legal entity — usually a Special Purpose Vehicle (SPV) or LLC formed specifically to own the property.
The interesting engineering is in the seams. How does the deed contract know that the off chain entity really holds title. How do the share transfers stay compliant. How does rent flow from the property to thousands of small holders without blowing the gas budget. This post walks through the contract patterns each of those questions resolves into.
If you have not read the ERC standards overview, the two token model below will feel arbitrary. With the standards in mind, it is the only shape that maps cleanly onto how real estate actually transfers.
The deed NFT does not transfer the property
A blockchain entry cannot transfer real world title by itself. The deed NFT is a pointer to the legal entity that holds title. When the property is sold, the legal entity sells the title off chain and the deed NFT is burned or transferred to the new custodian. The chain follows the law, not the other way around.
Section 02 · Deed NFT
One ERC721 token per property
The deed contract issues one tokenId per property. The token always sits in a custodian wallet. The metadata holds the pointer to the off chain legal wrapper.
// Deed NFT — one tokenId per property, points to the off chain legal pointer
contract PropertyDeed is ERC721, AccessControl {
bytes32 public constant CUSTODIAN_ROLE = keccak256("CUSTODIAN_ROLE");
struct Property {
bytes32 legalEntityHash; // hash of the off chain SPV / LLC documents
address fractionalToken; // ERC20 share token for this property
uint128 appraisedValueUsd; // last appraisal, off chain attested
uint64 lastAppraisedAt; // unix timestamp
}
mapping(uint256 => Property) public property;
constructor() ERC721("Property Deed", "DEED") {
_grantRole(DEFAULT_ADMIN_ROLE, msg.sender);
}
function registerProperty(
uint256 tokenId,
address custodian,
Property calldata p
) external onlyRole(DEFAULT_ADMIN_ROLE) {
property[tokenId] = p;
_safeMint(custodian, tokenId);
}
// Only the custodian role can ever transfer the deed
function _beforeTokenTransfer(
address from,
address to,
uint256 tokenId,
uint256 batchSize
) internal override {
super._beforeTokenTransfer(from, to, tokenId, batchSize);
if (from == address(0)) return; // mint always allowed
require(hasRole(CUSTODIAN_ROLE, to), "Deed: receiver not a custodian");
}
}The Property struct compresses the per property data: a hash of the legal entity documents, the address of the share token, the last appraised value, and the appraisal timestamp. Storing the legal hash on chain gives auditors and regulators a tamper proof reference to the off chain paperwork without putting the documents themselves on chain.
The transfer hook restricts who can hold the deed. Only addresses with the CUSTODIAN_ROLE can receive a deed NFT. This prevents a deed from ending up in a random wallet — which would create a mismatch between the on chain pointer and the off chain title holder. When custodians need to change (sale of the property, change of trustee), the deed transfers from one custodian wallet to another.
The on chain hash does not replace the legal documents
Recording a hash of the SPV documents on chain is an audit aid, not a substitute for the documents themselves. The legal title still sits in a filing cabinet (or its digital equivalent) in the jurisdiction where the property is located. The chain is the index, not the registry.
Section 04 · Dividends
Pull payment rent distribution
Pushing dividends to every share holder in a loop runs out of gas. The pull payment pattern using ERC20 snapshots scales to any number of holders.
When rent is collected off chain (or paid in stablecoin on chain), the issuer deposits the rent into the distributor contract. The distributor takes a snapshot of the share token, records the round, and waits. Each holder claims their share by calling the distributor — once per round.
// Pull payment dividend distributor — gas safe even with thousands of holders
contract RentDistributor {
IERC20Snapshot public immutable shares;
IERC20 public immutable stablecoin;
struct Round {
uint256 snapshotId;
uint256 totalDeposited;
uint256 totalSupplyAtSnapshot;
mapping(address => bool) claimed;
}
mapping(uint256 => Round) public rounds;
uint256 public currentRound;
function depositRent(uint256 amount) external {
stablecoin.transferFrom(msg.sender, address(this), amount);
currentRound += 1;
Round storage r = rounds[currentRound];
r.snapshotId = shares.snapshot();
r.totalDeposited = amount;
r.totalSupplyAtSnapshot = shares.totalSupplyAt(r.snapshotId);
emit RentDeposited(currentRound, amount);
}
function claim(uint256 roundId) external {
Round storage r = rounds[roundId];
require(!r.claimed[msg.sender], "already claimed");
uint256 bal = shares.balanceOfAt(msg.sender, r.snapshotId);
require(bal > 0, "no shares at snapshot");
uint256 owed = (r.totalDeposited * bal) / r.totalSupplyAtSnapshot;
r.claimed[msg.sender] = true;
stablecoin.transfer(msg.sender, owed);
emit RentClaimed(roundId, msg.sender, owed);
}
}The pattern has three properties that matter. First, the deposit is constant cost regardless of holder count — the issuer never loops. Second, holders who never claim simply leave their pro rata share in the distributor; the issuer can sweep unclaimed balances after a long timeout. Third, the snapshot at deposit time fixes who gets paid, so trading shares mid round does not create a dispute.
Pay rent in stablecoin where possible
USDC is the natural settlement currency. Off chain rent in dollars converts to USDC, the distributor pays out in USDC, and holders receive a balance they understand without an exchange step. The stablecoins overview at /blog/stablecoins-erc20-use-cases covers the integration surface for the issuer.
Capex and special assessments use the same pattern in reverse
When the property needs a roof repair, the issuer can issue a pro rata capital call — a second contract that calculates holder owed amounts from the same snapshot. The accounting symmetry is one of the reasons the snapshot pattern is worth the gas cost.
Resale proceeds run through the same distributor
When the underlying property is sold, the SPV liquidates and the net proceeds land in the distributor as a final round. Holders claim their final payout the same way they claimed rent. The share token is then frozen or burned.
Section 05 · Comparison
Three production platforms, three model variants
The two token architecture is the common spine. The variations live in where each platform draws the line between on chain and off chain enforcement.
| Platform | Deed token | Share token | KYC enforcement |
|---|---|---|---|
| RealT | Off chain SPV LLC per property | ERC20 RealToken, one per property | Whitelist on transfer, Gnosis Chain |
| Lofty | Wyoming SPV per property, deed pointer on chain | Lofty SPL token, one per property, Algorand | Identity gate at sign up, transfer agent enforced |
| Propy | ERC721 PropyKey deed NFT on Ethereum | Optional fractional layer | Off chain KYC tied to on chain wallet |
RealT runs the simplest model — every property gets its own ERC20 with a transfer whitelist, deployed on a cheap chain to keep dividend gas low. Lofty pushes most of the policy off chain through a regulated transfer agent. Propy focuses on the deed NFT and treats fractionalization as optional. None of them has fully on chain title transfer because no jurisdiction recognizes that yet.
The legal wrapper is the bottleneck
The contracts are tractable. The expensive part of launching a tokenized real estate platform is the per property SPV formation, the broker dealer registration, the transfer agent relationship, and the audit on the SPV books. Most teams underestimate this by an order of magnitude.
Section 06 · Integration
How to design the deed plus shares contract pair
If you are building this from scratch, three design decisions front load most of the future pain.
Decide whether the deed NFT is on the same chain as the share token. Some platforms keep the deed on Ethereum (for legitimacy in legal disputes) and the shares on a cheap L2 (for affordable dividend payouts). The two contracts reference each other through bridge attestations, which adds complexity but separates the audit surfaces.
Pick a fixed total share supply per property up front. Variable supply complicates capital structure and confuses retail holders. The standard pattern is to mint the full supply at issuance, hold the unsold portion in an issuer treasury, and release through primary sales.
Treat the KYC oracle as the most attacked surface. A compromised KYC wallet can mark adversary addresses as passed and exfiltrate shares. The oracle should be a multisig with rate limits, not a hot wallet. Most production platforms move the KYC role to a regulated entity over time.
Section 07 · FAQ
Common questions about ERC721 real estate tokenization
The questions founders ask before they commit to building the first tokenized property.
How does real estate tokenization work?
A tokenized property uses an ERC721 deed NFT held by a custodian to point at an off chain legal entity (usually an SPV), plus an ERC20 share token that represents fractional economic ownership. Shares are sold to investors after KYC. Rent flows from the property to share holders through a pull payment dividend contract.
Why use ERC721 plus ERC20 instead of just one token?
The property itself is unique, which maps cleanly to ERC721. The economic claim is divisible across thousands of investors, which maps cleanly to ERC20. Trying to do both with one token forces awkward compromises — either the property loses its unique identity or the shares lose divisibility.
Who holds the legal title in a tokenized property?
A custodian entity — typically a Special Purpose Vehicle (SPV) or LLC formed specifically to own the single property — holds legal title in the jurisdiction where the property sits. The deed NFT on chain is a pointer to that entity, not the title itself. The chain follows the law; it does not replace it.
How are rents distributed to share holders on chain?
Through a pull payment dividend distributor. The issuer deposits rent (usually in USDC) into the distributor, which takes a snapshot of the share token and records the round. Each holder calls claim on the distributor and receives their pro rata share. The pattern stays gas safe regardless of holder count because the issuer never loops over holders.
Can tokenized real estate shares be transferred freely?
No. Production share contracts enforce KYC at the transfer hook level. The hook reverts any transfer where either party has not passed identity verification with the issuer or a delegated compliance vendor. This means shares cannot leak to unverified wallets even through a decentralized exchange swap.
Section 08 · Next Steps
Build the legal wrapper before you build the contract
The Solidity is a few weeks of work. The SPV formation, broker dealer registration, transfer agent relationship, and audit setup typically take six to twelve months.
We help teams ship tokenized real world asset systems end to end — the deed and share contracts, the KYC oracle, the dividend distributor, the integration with the off chain custodian, and the operational playbook for the first 100 properties. The adjacent NFT ticketing deep dive covers the other major ERC721 use case where transfer hooks do most of the operational work.