ERC-3643: The Security Token Standard (T-REX)
The standard that makes regulated financial assets work on Ethereum. Identity verification and transfer restrictions baked into the token itself.
Adam's role
Co-author. I helped design the compliance architecture that makes on-chain securities regulation actually enforceable.
What is it?
ERC-3643 defines how security tokens work on Ethereum. It adds identity verification and transfer restrictions so tokens automatically comply with securities laws. Think of it as the bridge between traditional finance regulation and blockchain programmability.
Simple analogy
Regular tokens are like cash. Anyone can pass them around. ERC-3643 tokens are like regulated stocks. You need to prove who you are before you can own or trade them.
How it works
Identity Verification
Users register their on-chain identity (via ONCHAINID) and complete KYC. Their verified claims are stored in the Identity Registry.
Compliance Module Setup
The token issuer configures compliance rules: which countries are allowed, investor accreditation requirements, maximum holder counts, lock-up periods.
Token Issuance
Tokens are minted and distributed to verified investors. Each recipient must already be in the Identity Registry with valid claims.
Transfer Validation
When someone tries to transfer tokens, the contract checks: Is the receiver verified? Do they meet all compliance rules? If yes, transfer executes. If no, it reverts.
Ongoing Management
Agents can freeze tokens, force transfers for legal compliance, update compliance rules, and manage the identity registry as regulations evolve.
Key concepts
Identity Registry
An on-chain registry that maps wallet addresses to verified identities. Before any transfer happens, the contract checks this registry to confirm both sender and receiver have passed KYC.
Compliance Rules
Modular smart contracts that define who can hold, trade, and transfer tokens. Rules can enforce country restrictions, investor accreditation, maximum holder counts, and more.
Agent Roles
Designated addresses with special permissions. Agents can freeze tokens, force transfers (for legal compliance), and manage the token lifecycle. Think of them as on-chain compliance officers.
Transfer Restrictions
Every transfer goes through automatic compliance checks. The token contract calls the compliance module before allowing any movement. If a transfer would violate any rule, it reverts.
Use cases
Real Estate Tokenization
Fractional ownership of property with automatic regulatory compliance.
Real Estate Tokenization
Fractional ownership of property with automatic regulatory compliance.
Equity Tokens
Company shares on-chain with built-in cap table management.
Equity Tokens
Company shares on-chain with built-in cap table management.
Bond Tokens
Fixed-income instruments with automated coupon distribution.
Bond Tokens
Fixed-income instruments with automated coupon distribution.
Carbon Credits
Verified carbon offset certificates with transparent provenance.
Carbon Credits
Verified carbon offset certificates with transparent provenance.
Technical specification
The core interface that defines ERC-3643.
// SPDX-License-Identifier: MIT
interface IERC3643 {
// Token transfers with compliance checks
function transfer(address to, uint256 amount) external returns (bool);
function transferFrom(address from, address to, uint256 amount) external returns (bool);
// Identity registry
function identityRegistry() external view returns (IIdentityRegistry);
function setIdentityRegistry(address _identityRegistry) external;
// Compliance
function compliance() external view returns (IModularCompliance);
function setCompliance(address _compliance) external;
// Agent actions (freeze, force transfer)
function freezePartialTokens(address addr, uint256 amount) external;
function unfreezePartialTokens(address addr, uint256 amount) external;
function forcedTransfer(address from, address to, uint256 amount) external returns (bool);
// Recovery
function recoveryAddress(address lostWallet, address newWallet, address investorOnchainID) external returns (bool);
}