ERC-5679: Token Minting and Burning
ERC-5679 standardises the mint and burn function surfaces across ERC-20, ERC-721, and ERC-1155. Pre-5679, every token shipped its own naming (mint / _mint / mintTo / safeMint / …) and own authorization model. The ERC picks one signature per standard and asks implementations to converge:
// ERC-20 / ERC-1155
interface IERC5679Mint {
function mint(address to, uint256 amountOrId, bytes calldata data) external;
}
interface IERC5679Burn {
function burn(address from, uint256 amountOrId, bytes calldata data) external;
}
// ERC-721 (no amount, just tokenId)
interface IERC5679Mint721 {
function safeMint(address to, uint256 tokenId, bytes calldata data) external;
}
interface IERC5679Burn721 {
function burn(address from, uint256 tokenId, bytes calldata data) external;
}Indexers, asset-explorers, and inventory tools can recognise these selectors uniformly across token types. The data parameter is opaque to the spec — typically used for IPFS metadata pointers, off-chain proof hashes, or empty.
Neo Equivalent: NEP-17 / NEP-11 Mint Helper Convention
Neo's NEP-17 and NEP-11 base classes already include Mint and Burn internal helpers — most production tokens expose them via thin public wrappers. ERC-5679 is the formalisation of that wrapper shape. This mirror page proposes a Neo equivalent vocabulary (paired with the ERC-6093 error vocabulary):
| ERC-5679 (Ethereum) | Neo Equivalent | Notes |
|---|---|---|
IERC5679Mint.mint(to, amount, data) (ERC-20) | Mint(UInt160 to, BigInteger amount, object data) on NEP-17 | NEP-17 base provides internal Mint; expose via public wrapper |
IERC5679Burn.burn(from, amount, data) (ERC-20) | Burn(UInt160 from, BigInteger amount, object data) on NEP-17 | Witness-checked on from; gates by admin or holder |
IERC5679Mint721.safeMint(to, tokenId, data) | Mint(UInt160 to, ByteString tokenId, object data) on NEP-11 | Includes tokenId; data flows to recipient's OnNEP11Payment |
IERC5679Burn721.burn(from, tokenId, data) | Burn(UInt160 from, ByteString tokenId, object data) on NEP-11 | Witness-checked on from |
| ERC-1155 (amount + id) | Mint(UInt160 to, ByteString tokenId, BigInteger amount, object data) on a NEP-11 divisible | Combined shape |
The "data" Parameter
ERC-5679 leaves data opaque. Typical use:
- NFT metadata — IPFS CID or HTTPS metadata URL appended at mint; the contract stores it for
tokenURI(tokenId). - Mint authorisation proof — off-chain signature from a permitted minter, verified inside
Mint. - Inflation rationale — encoded reason string for governance audit trails on stablecoin / RWA mints.
On Neo, the same data becomes the third argument to OnNEP17Payment / OnNEP11Payment if the recipient is a contract, so the parameter threads through the existing callback flow — no extra plumbing.
Authorization
ERC-5679 explicitly does not standardise who can call mint/burn. Implementations choose: a single owner (ERC-173), a role (AccessControl roles), a multisig, governance, etc. The Neo equivalent is the same: Runtime.CheckWitness(authorisedMinter) where authorisedMinter comes from whatever the contract's authorization model is.
Migration Notes
For Solidity contracts using OpenZeppelin's _mint / _burn:
- Replace
_mint/_burnwith the public ERC-5679 selectors if you want indexer-friendly external minting. - For Neo C# ports, expose
Mint(to, amount, data)andBurn(from, amount, data)as thin wrappers around the inherited internal Mint / Burn. Witness-check the caller against the contract's owner / minter-role storage. - For
neo-solcports, the Soliditymint/burnshape compiles cleanly; thedataparameter is ignored if not used. For NEP-17 wrappers, route the data argument into the recipient'sOnNEP17Paymentcallback for full ERC-5679 compatibility.
Why The Mirror Matters
NEP-17 / NEP-11 base classes already provide internal Mint / Burn, but the public surface varies wildly across deployed Neo tokens (Issue, MintTo, MintAndCall, …). Adopting the ERC-5679 vocabulary gives indexers one selector to look for, regardless of whether the token was authored in C# or via neo-solc.
