ERC-1643 is a small interface, part of the ERC-1400 family, that lets a token publish named documents — each with a URI, a content hash and a last-modified timestamp. Investors, auditors and venues can read the current prospectus, term sheet or notice straight from the token contract and verify that the file they downloaded is exactly the one the issuer published. For real-world assets, where the token’s value depends entirely on off-chain legal documents, that link is essential.
Key takeaways
- Four functions:
getDocument,setDocument,removeDocument,getAllDocuments, plusDocumentUpdated/DocumentRemovedevents. - Each document has a name (
bytes32), a URI and a hash, so content can live off-chain while integrity is provable on-chain. - Use it for prospectuses, legends, valuations, audit reports, title deeds and corporate-action notices.
- The pattern works with any token standard — we apply it to ERC-1155 and ERC-3643 tokens, and on Hedera via consensus-service anchoring.
The interface
function getDocument(bytes32 name) external view returns (string memory uri, bytes32 documentHash, uint256 lastModified);
function setDocument(bytes32 name, string calldata uri, bytes32 documentHash) external;
function removeDocument(bytes32 name) external;
function getAllDocuments() external view returns (bytes32[] memory);
event DocumentUpdated(bytes32 indexed name, string uri, bytes32 documentHash);
event DocumentRemoved(bytes32 indexed name, string uri, bytes32 documentHash);
Only authorised roles (issuer, transfer agent) should be able to call setDocument and removeDocument.
Why document integrity matters for RWAs
A real estate token is only as good as the title deed, valuation and lease schedule behind it. A bond token is only as good as its indenture. If investors cannot prove which version of a document applied at the time they invested, disputes become expensive. ERC-1643 creates a public, timestamped trail: every update emits an event, so the full history of disclosures is reconstructable.
How we implement it
On our real estate tokenization platform, property documents are uploaded during onboarding, stored on IPFS, and their hashes are recorded on the ledger. Reconciliation jobs cross-check IPFS, the off-chain database and the chain so the three never drift apart. A typical setup:
- Upload the document to IPFS (public) or to encrypted storage (confidential), obtaining a content identifier.
- Hash the file with SHA-256 or keccak256.
- Call
setDocumentwith a name such as"PROSPECTUS_V2", the URI and the hash. - Display documents in the investor portal, recomputing the hash client-side to show a “verified” badge.
- Version by name (
TERMSHEET_2026_Q4) or keep a stable name and rely on events for history.
Confidential documents
Many RWA documents contain personal or commercially sensitive data. Do not put them on public IPFS. Instead store them encrypted or in an access-controlled data room and publish only the hash and a gated URI on-chain. Investors with access can still verify integrity; the public sees only that a document exists and when it changed.
Typical documents to register
| Document | Name example |
|---|---|
| Prospectus / offering memorandum | PROSPECTUS |
| Term sheet | TERM_SHEET |
| Transfer restriction legend | LEGEND |
| Valuation report | VALUATION_2026 |
| Audit / attestation report | AUDIT_FY2025 |
| Title deed or registry extract | TITLE_DEED |
| Corporate action notice | NOTICE_DIVIDEND_Q3 |
Beyond ERC-1643
ERC-1643 is deliberately simple. For richer needs, combine it with: verifiable credentials for document issuers, proof-of-reserve and oracle feeds for live data, and Hedera Consensus Service or similar anchoring for high-frequency records such as meter readings.
Example: adding ERC-1643 to an existing token
// Illustrative mixin — not audited.
abstract contract DocumentRegistry is AccessControl {
bytes32 public constant DOCS_ROLE = keccak256("DOCS_ROLE");
struct Doc { string uri; bytes32 docHash; uint256 lastModified; }
mapping(bytes32 => Doc) private _docs;
bytes32[] private _names;
event DocumentUpdated(bytes32 indexed name, string uri, bytes32 documentHash);
event DocumentRemoved(bytes32 indexed name, string uri, bytes32 documentHash);
function setDocument(bytes32 name, string calldata uri, bytes32 docHash) external onlyRole(DOCS_ROLE) {
if (_docs[name].lastModified == 0) _names.push(name);
_docs[name] = Doc(uri, docHash, block.timestamp);
emit DocumentUpdated(name, uri, docHash);
}
function getDocument(bytes32 name) external view returns (string memory, bytes32, uint256) {
Doc memory d = _docs[name];
return (d.uri, d.docHash, d.lastModified);
}
function getAllDocuments() external view returns (bytes32[] memory) { return _names; }
}
A document governance policy
Technology is the easy part. Agree a written policy covering:
- Who may publish each document type (issuer, administrator, legal counsel).
- Approval workflow before a hash is written on-chain.
- Naming and versioning conventions so integrators can find the latest version.
- Retention of superseded documents (keep them accessible for investors who relied on them).
- Confidentiality classification: public, investor-only, regulator-only.
Verifying documents in the investor portal
A good investor experience makes verification invisible:
- Portal fetches
getAllDocuments()and displays names and dates. - When an investor opens a document, the portal downloads it and computes its hash in the browser.
- If the hash matches the on-chain record, a “Verified on-chain” badge appears with a link to the transaction.
- If not, the portal warns the investor and alerts the operator.
Beyond issuance: ongoing disclosures
Use the same mechanism for quarterly reports, valuation updates, audited accounts, rent rolls, ESG reports and corporate-action notices. Over time, the token becomes a verifiable disclosure archive — valuable in disputes and audits.
Frequently asked questions
No. The interface can be added to any token contract, including ERC-20, ERC-1155 and ERC-3643 tokens.
No — only URIs and hashes. Storing full documents on-chain is expensive and exposes their content permanently.
They download the file, compute its hash and compare it with the hash returned by getDocument. Investor portals can do this automatically.
Yes. Each update emits an event with the new URI and hash, creating an auditable history of disclosures.
SHA-256 is widely understood by auditors; keccak256 is native to the EVM. Either works if you document the choice.
Yes. Content-addressed storage complements on-chain hashes well; pin or replicate content to keep it available.
This article is for general information only and is not legal, tax or investment advice. Token standards evolve — always confirm the current status of an ERC at eips.ethereum.org and take advice from qualified counsel in each jurisdiction before issuing tokens.


