Search Apps Documentation Source Content File Folder Download Copy Actions Download State String Boolean Number Struct Map Slice Pointer Function Closure Reference Nil Package Type Interface Unknown

README.md

3.62 Kb · 71 lines

erc721 — NFT (ERC-721 port)

⚠️ Experimental — generated with no human supervision by the daily MCP pipeline (Solidity→Gno port). Not audited. See r/moul/x/daily.


An idiomatic gno.land port of the Solidity ERC-721 non-fungible token standard. Each token is a unique, sequentially-minted integer id owned by exactly one address. Ownership, per-owner balances and single-token approvals live in ordered avl.Trees, so Render can list every token deterministically. msg.sender maps to unsafe.PreviousRealm().Address(), require to panic, and Solidity events to chain.Emit (Mint, Transfer, Approval).

Transactions

  • Mint(cur realm, to address) int64 — mint the next token id to to; returns the id.
  • Transfer(cur realm, to address, id int64) — move a token you own (or are approved for) to to; clears the approval.
  • Approve(cur realm, spender address, id int64) — owner grants spender the right to transfer token id.

Read-only

  • OwnerOf(id int64) address — owner of a token (panics if it does not exist).
  • BalanceOf(owner address) uint64 — number of tokens held by owner.
  • TotalSupply() int64 — total tokens in circulation.
  • Render(path string) — Markdown: total supply + a token → owner → approved table.

Example

Mint(cur, g1alice...)          // -> tokenID 1
Mint(cur, g1alice...)          // -> tokenID 2
Approve(cur, g1bob..., 1)      // alice approves bob for token 1
Transfer(cur, g1carol..., 1)   // owner alice sends token 1 to carol
OwnerOf(1)                     // -> g1carol...
BalanceOf(g1alice...)          // -> 1
TotalSupply()                  // -> 2

What changed in v1

State moved from a hand-rolled avl.Tree + nextID + zero-padding helper to p/moul/kit/store, which keys entries by seqid instead of a fixed-width decimal string.

v0 padded token ids to width 12. Past that width the padding stops and the tree orders "1000000000000" before "999999999999", so every list this realm renders would be wrong from that entry on. store keys are 8 big-endian bytes whose order is numeric for every uint64, so there is no width left to outgrow.

approvals, the secondary index on the same ids, is keyed with store.ID.Key() so the two trees cannot drift apart. balances keeps its own address-keyed tree, which the store does not cover. minted is gone: with no burn, the highest id ever assigned is the supply, so LastID() answers it.

Token ids stay plain integers and the rendered output is unchanged. This is a storage change, which under this repo's versioning rule is a compatibility change, hence a new version rather than an edit in place. v0 stays live and untouched.


Part of moul/gno-contracts — moul's versioned gno.land contracts. See the repository for the full catalog, build/test tooling, and usage.

Dependency graph:

gno.land/r/moul/x/daily/erc721/v1 dependency graph

🧪 Highly experimental — potentially vibe-coded. Not audited; may break, change, or be removed at any time. Do not use with anything of value. Full disclaimer: DISCLAIMER.