ERC-7092: Financial Bonds
ERC-7092 is the business-facing counterpart to ERC-3475. Where ERC-3475 abstracts arbitrary bond storage by class/nonce, ERC-7092 bakes in the most common bond fields (issue date, maturity date, coupon rate, currency, denomination, ISIN) and the operations issuers / investors expect (transfer, approve, principal/coupon claim). Better fit for "let me deploy a bond contract and start trading" workflows than ERC-3475's abstract storage.
Required Interface (abridged)
interface IERC7092 {
struct IssueData {
bytes32 isin;
string name;
string symbol;
address currency; // ERC-20 of the denomination currency
uint256 denomination;
uint256 issueVolume;
uint256 couponRate; // basis points
uint256 issueDate;
uint256 maturityDate;
}
function issue(IssueData calldata data, address[] calldata investors, uint256[] calldata amounts) external;
function transfer(address to, uint256 amount, bytes calldata data) external;
function approve(address spender, uint256 amount) external;
function transferFrom(address from, address to, uint256 amount, bytes calldata data) external;
function principalOf(address holder) external view returns (uint256);
function balanceOf(address holder) external view returns (uint256);
function isin() external view returns (bytes32);
function name() external view returns (string memory);
function symbol() external view returns (string memory);
function currency() external view returns (address);
function denomination() external view returns (uint256);
function issueVolume() external view returns (uint256);
function couponRate() external view returns (uint256);
function issueDate() external view returns (uint256);
function maturityDate() external view returns (uint256);
event Issued(IssueData data, address[] investors, uint256[] amounts);
event Transferred(address indexed from, address indexed to, uint256 amount, bytes data);
event Redeemed(address indexed holder, uint256 amount);
}The standard intentionally limits what's encoded on-chain — fields are the minimum set every bond needs. Coupon schedules, amortisation tables, and call/put options are out of scope (those go in extension contracts).
Neo Equivalent: Neo C# Port
The shape ports cleanly. Bond fields live in single-key storage slots (set at issuance, immutable thereafter); per-holder state lives in a balance/principal map. The denomination currency is a NEP-17 contract hash instead of an ERC-20 address; coupon claims are NEP-17 transfers back to holders.
| ERC-7092 (Ethereum) | Neo Equivalent | Notes |
|---|---|---|
IssueData struct | Map<string, object> stored at issuance, sealed | Bond identity and economic terms |
currency (ERC-20) | currency (NEP-17 contract hash) | GAS, USDC port, or any NEP-17 |
issue(data, investors, amounts) | Issue(data, investors, amounts) issuer-only | Witness-checked issuer |
transfer(to, amount, data) | Transfer(to, amount, data) with NEP-17-style holder witness | Includes data callback |
transferFrom(from, to, ...) | TransferFrom(from, to, ...) if approval extension is used | Optional approval layer |
| Coupon/principal claim flows | Issuer-side PayCoupon / Redeem pushing NEP-17 transfers to holders | Application-specific scheduling |
Issued / Transferred / Redeemed events | NEP notifications with same fields | Wire-format equivalent |
Composition
- ERC-3475 — abstract storage bonds. Use 7092 as the business surface for a single bond series; use 3475 when a single contract issues many series.
- ERC-3643 — T-REX regulated token. Wrap 7092 with T-REX compliance for tokenised securities.
- ERC-7540 + ERC-7944 — async vault
- cancel. Use for delayed-redemption bond repayment flows.
Migration Notes
The cleanest port from a Solidity ERC-7092 bond:
- Replace the ERC-20 inheritance with NEP-17 base.
- Encode
IssueDataas aMap<string, object>and store at deploy. - Mint principal balances per investor in the constructor /
_deploy. - Replace
block.timestampwithRuntime.Time(millisecond precision). - For coupon payments, schedule off-chain or wire a periodic
PayCouponmethod that the issuer calls each period.
The Neo port is shorter than the Solidity source because NEP-17's OnNEP17Payment callback handles the "data" parameter in transfers without an extra interface declaration.
