BlockchainSolidity12 min readUpdated

Real Estate Tokenization on ERC721: Architecture and Patterns

By Mudassir Khan — Agentic AI Consultant & AI Systems Architect, Islamabad, Pakistan

Cover illustration for: Real Estate Tokenization on ERC721: Architecture and Patterns

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.

solidity
// 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.

Five layer architecture diagram from physical property at the bottom up through the off chain SPV legal entity holding title, the custodian wallet holding the ERC721 deed NFT that references the SPV, the per property ERC20 share token tracking fractional ownership, and individual investor wallets at the top holding share balances after passing KYC.
The five layer stack from physical property to investor wallet. Every layer above the property maps to one on chain or off chain artifact.

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 03 · Fractional Shares

A per property ERC20 with KYC gated transfers

The share token is where investors interact with the property. The KYC modifier on the transfer hook is the contract surface that enforces compliance.

solidity
// Per property ERC20 share token — KYC gated transfers
contract PropertyShares is ERC20, AccessControl {
    bytes32 public constant KYC_ROLE = keccak256("KYC_ROLE");
    bytes32 public constant ISSUER_ROLE = keccak256("ISSUER_ROLE");

    uint256 public immutable deedTokenId;
    address public immutable deedContract;

    mapping(address => bool) public kycPassed;

    constructor(
        string memory name_,
        string memory symbol_,
        uint256 initialSupply,
        uint256 _deedTokenId,
        address _deedContract,
        address issuer
    ) ERC20(name_, symbol_) {
        deedTokenId = _deedTokenId;
        deedContract = _deedContract;
        _grantRole(DEFAULT_ADMIN_ROLE, issuer);
        _grantRole(ISSUER_ROLE, issuer);
        _mint(issuer, initialSupply);
    }

    function setKyc(address holder, bool passed) external onlyRole(KYC_ROLE) {
        kycPassed[holder] = passed;
    }

    function _beforeTokenTransfer(address from, address to, uint256)
        internal
        override
    {
        if (from != address(0)) require(kycPassed[from], "Shares: sender not KYC");
        if (to != address(0))   require(kycPassed[to], "Shares: receiver not KYC");
    }
}

Each share token instance is deployed once per property. Total supply is fixed at issuance — typically 100,000 or 1,000,000 shares per property — and represents the economic claim on net rent plus resale proceeds.

The KYC mapping is the heart of the compliance model. A KYC oracle wallet (operated by the issuer or a compliance vendor) calls setKyc(holder, true) after the holder passes off chain identity verification. The transfer hook reverts any transfer where either party has not passed KYC. The hook runs on direct transfers and on transfers initiated by a DEX router, so shares cannot leak to unverified wallets through a swap.

Production deployments combine this with a transfer agent role that can force transfer shares to resolve disputes or enforce court orders. The transfer agent is usually a regulated entity in the jurisdiction where the property sits.

Per property fractional share contract — typical role layout.
RoleHeld byCapability
DEFAULT_ADMIN_ROLEIssuer multisigGrant and revoke other roles
KYC_ROLEKYC oracle walletMark addresses as passed or not
ISSUER_ROLEIssuer multisigMint new shares for property recapitalization
TRANSFER_AGENT_ROLERegulated transfer agentForce transfer to resolve disputes or court orders

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.

solidity
// 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);
    }
}
Six step rent distribution flow: tenant pays rent off chain, custodian converts to USDC and calls depositRent on the distributor, distributor snapshots the share token and records the round, share holders independently call claim on the distributor, distributor pays each holder their pro rata share based on the snapshot balance, claimed flag prevents double claim.
The pull payment dividend flow. Each holder pays their own gas to claim, which keeps the deposit transaction constant cost.

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.

Production tokenized real estate platforms — model summary.
PlatformDeed tokenShare tokenKYC enforcement
RealTOff chain SPV LLC per propertyERC20 RealToken, one per propertyWhitelist on transfer, Gnosis Chain
LoftyWyoming SPV per property, deed pointer on chainLofty SPL token, one per property, AlgorandIdentity gate at sign up, transfer agent enforced
PropyERC721 PropyKey deed NFT on EthereumOptional fractional layerOff 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.

Written by Mudassir Khan

Agentic AI consultant and AI systems architect based in Islamabad, Pakistan. CEO of Cube A Cloud. 38+ agentic AI launches delivered for global founders and CTOs.

View blockchain development serviceSee ChainTrust case study

Related service

Blockchain Development

See scope & pricing →

Related case study

ChainTrust Compliance Engine

Read case study →

More on this topic

Need an AI systems architect?

Book a 30-minute architecture call. I will sketch the high-level design for your use case and give you an honest view of the trade-offs.

Book a strategy call →