ERC-7943: Universal Real World Asset Interface
ERC-7943 (uRWA) provides a token-type-agnostic interface for real-world assets. Where ERC-3643 (T-REX) is fungible-only and shipped as a heavy framework, uRWA is the umbrella interface that any RWA token — fungible (ERC-20), non-fungible (ERC-721), semi-fungible (ERC-3525), or multi-token (ERC-1155) — can declare. Its surface is the minimum set every regulated asset needs:
- Asset capability flags (transferable, recoverable, freezable, …).
- A standardised "is this transfer compliant?" view.
- Issuer-controlled freeze / recovery operations.
- Cross-token-type asset metadata.
Adopted as the convergence layer over the fragmented RWA standards — T-REX (3643), bonds (3475 / 7092), tokenised funds (5117), regulated exchanges. Closes Last Call in late 2025.
Required Interface (abridged)
interface IERC7943 {
enum Capability {
Transferable, // 0
Recoverable, // 1
Freezable, // 2
ForcedTransferable, // 3
Issuable, // 4
Burnable // 5
}
event AssetCapabilitySet(Capability cap, bool enabled);
event ComplianceCheckFailed(address from, address to, uint256 amountOrId, string reason);
function hasCapability(Capability cap) external view returns (bool);
function tokenType() external view returns (string memory); // "erc20" | "erc721" | "erc1155" | "erc3525"
function isTransferCompliant(address from, address to, uint256 amountOrId)
external view returns (bool, string memory);
// Issuer ops (gated on access control)
function freeze(address account, bool frozen) external;
function recover(address from, address to, uint256 amountOrId) external;
function forceTransfer(address from, address to, uint256 amountOrId) external;
}The capability flags are read-once-at-deploy (the token tells the world what it supports); the compliance hook fires per-transfer (returning a reason string for off-chain debugging when blocked). The issuer operations are the same set ERC-3643 ships, made available across token types.
Neo Equivalent: NEP-17 / NEP-11 + Capability Flags + Compliance Hook
The Neo port composes existing pieces:
- Capability flags stored as a bitmap at deploy.
- Compliance hook — calls out to an ERC-7144-style validator contract before each transfer.
- Freeze / recover / forceTransfer as issuer-only methods (witness- checked against the issuer admin slot).
public static bool HasCapability(int cap)
=> ((BigInteger)(Storage.Get(Storage.CurrentContext, new byte[] { Prefix_Caps }) ?? ByteString.Empty) & (BigInteger.One << cap)) != 0;
public static (bool, string) IsTransferCompliant(UInt160 from, UInt160 to, BigInteger amountOrId)
{
if (!HasCapability(0)) return (false, "non-transferable");
if (IsFrozen(from)) return (false, "sender frozen");
if (IsFrozen(to)) return (false, "recipient frozen");
var validator = ValidatorAddress();
if (validator is not null)
{
var ok = (bool)Contract.Call(validator, "isTransferValid", CallFlags.ReadOnly,
new object[] { Runtime.ExecutingScriptHash, from, to, amountOrId });
if (!ok) return (false, "validator rejected");
}
return (true, "");
}| ERC-7943 (Ethereum) | Neo Equivalent | Notes |
|---|---|---|
hasCapability(cap) | HasCapability(int cap) reading the deploy-time bitmap | Direct port |
tokenType() | Read from manifest's supportedstandards (NEP-11 / NEP-17 / NEP-24) | Same intent |
isTransferCompliant(...) | IsTransferCompliant(...) returning (bool, string) | Wrapper around ERC-7144 validator + freeze list |
freeze(account, bool) | Freeze(account, bool) issuer-witness-checked | Same |
recover(from, to, id) | Recover(from, to, idOrAmount) issuer-witness-checked | Lost-key recovery |
forceTransfer(...) | ForceTransfer(...) issuer-witness-checked, bypasses freeze + compliance | Reg-required override |
Issuable capability | Tied to whether Mint is exposed | Wire convention |
Burnable capability | Tied to whether Burn is exposed | Wire convention |
Composition
- ERC-3643 — T-REX framework. uRWA is the umbrella interface; T-REX is the fungible specialisation. Implement both: T-REX gives you the heavy compliance machinery, uRWA gives you the cross-type vocabulary.
- ERC-7144 — transfer validation hook. uRWA's
isTransferCompliantis naturally backed by an ERC-7144 validator. - ERC-3475 + ERC-7092 — bonds. Both are uRWA-conformant when wrapped with the capability flags.
- ERC-6093 — error vocabulary. Compliance failure reasons should match the standardised codes.
Migration Notes
For existing T-REX (ERC-3643) deployments adding uRWA:
- Implement
hasCapability(cap)returning the relevant flags from your existing T-REX feature set. - Implement
tokenType()returning"erc20". - Implement
isTransferCompliant(from, to, amount)by wrapping your existing T-REX compliance + identity-registry checks. - The freeze/recover/forceTransfer methods already exist in T-REX; map the names directly.
For greenfield Neo RWA tokens, prefer uRWA over T-REX as the canonical interface unless you specifically need T-REX's identity registry. The uRWA + ERC-7144 validator combination is lighter and expresses the same capabilities without identity-claim infrastructure.
