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

README.md

6.01 Kb · 206 lines

GNFT

GRC721-compatible NFT contract for GnoSwap LP positions.

Overview

GNFT represents each liquidity position as a unique NFT. It exposes ownership, transfer, approval, and metadata operations while generating compact SVG artwork for tokens whose URI is stored in GNFT's parameter format.

GNFT implements the position-NFT surface used by GnoSwap; it does not expose every optional GRC721 extension. In particular, this package has no token enumeration API and does not expose safeTransferFrom.

Core Features

Ownership and approvals

  • Transfer, single-token approval, and operator approval
  • Owner, balance, existence, and approval queries
  • Staked tokens are locked to the staker contract
  • Other transfers use the GRC721 owner and approval checks

Dynamic SVG generation

  • Generated tokens store compact gradient parameters
  • Parameters are rendered to SVG and returned as a base64-encoded data URI
  • Rendering occurs on TokenURI reads rather than storing the full SVG
  • A custom non-empty URI set with SetTokenURI is returned unchanged when it is not in GNFT parameter format

Storage

  • Compact parameter storage reduces per-token metadata size
  • Template-based SVG generation avoids storing repeated markup

Key Functions

Mint

Mints a new NFT for an LP position. Only the position role may call it.

Parameters:

  • cur realm: Current realm context
  • to address: Recipient address
  • tid grc721.TokenID: Token ID to mint

Returns: grc721.TokenID

Burn

Burns an NFT when its position is closed. Only the position role may call it.

Parameters:

  • cur realm: Current realm context
  • tid grc721.TokenID: Token ID to burn

TransferFrom

Transfers NFT ownership.

Parameters:

  • cur realm: Current realm context
  • from address: Current owner
  • to address: New owner
  • tid grc721.TokenID: Token ID to transfer

For a token held by the staker contract, only the staker can move it. For other tokens, the owner, token approval, or operator approval must authorize the transfer.

TokenURI

Returns metadata for a token. When the stored URI parses as GNFT image parameters (x1,y1,x2,y2,color1,color2), GNFT renders those parameters as an SVG and returns a base64-encoded data URI. A custom non-empty URI that is not in that parameter format is returned unchanged.

Parameters:

  • tid grc721.TokenID: Token ID

Returns: Token URI string and an error when the token or metadata is missing

SetTokenURI

Sets a non-empty token URI. Only the position role may call it.

Parameters:

  • cur realm: Current realm context
  • tid grc721.TokenID: Token ID
  • tURI string: Non-empty metadata URI

Approve

Approves an address to manage a specific token.

Parameters:

  • cur realm: Current realm context
  • approved address: Address to approve
  • tid grc721.TokenID: Token ID

SetApprovalForAll

Approves or revokes an operator for all tokens owned by the caller.

Parameters:

  • cur realm: Current realm context
  • operator address: Operator address
  • approved bool: Approval status

Queries

  • Name() string: Collection name
  • Symbol() string: Collection symbol
  • TotalSupply() int64: Number of minted NFTs
  • BalanceOf(owner address) (int64, error): Number of NFTs owned
  • OwnerOf(tid grc721.TokenID) (address, error): Current owner
  • MustOwnerOf(tid grc721.TokenID) address: Owner or panic on error
  • Exists(tid grc721.TokenID) bool: Whether a token exists
  • GetApproved(tid grc721.TokenID) (address, error): Token approval
  • IsApprovedForAll(owner, operator address) bool: Operator approval

SVG Generation

Parameter Format

Generated token URIs store compact parameters:

"x1,y1,x2,y2,#COLOR1,#COLOR2"
Example: "10,12,125,123,#FF5733,#33B5FF"

Parameter Ranges

  • x1: 7-13
  • y1: 7-13
  • x2: 121-126
  • y2: 121-126
  • colors: 6-digit hex (#RRGGBB)

Rendering Process

  1. Mint: Generate pseudo-random parameters and store them as a CSV string
  2. TokenURI: Parse the CSV, generate SVG, encode it as base64, and return a data URI
  3. Display: The browser decodes the data URI and renders the SVG

The parameters use time-seeded math/rand; this is pseudo-random artwork generation, not a security or cryptographic randomness source.

Usage

These helpers illustrate calls from an integrating realm. mintExample and burnExample require that realm to hold the position role; transferExample requires the caller to satisfy the ownership/approval rules described above.

 1import (
 2    "gno.land/p/nt/grc721/v0"
 3    "gno.land/r/gnoswap/gnft"
 4)
 5
 6func mintExample(cur realm, owner address, tokenID grc721.TokenID) grc721.TokenID {
 7    return gnft.Mint(cross(cur), owner, tokenID)
 8}
 9
10func metadataExample(tokenID grc721.TokenID) (string, error) {
11    return gnft.TokenURI(tokenID)
12}
13
14func transferExample(cur realm, from, to address, tokenID grc721.TokenID) error {
15    return gnft.TransferFrom(cross(cur), from, to, tokenID)
16}
17
18func burnExample(cur realm, tokenID grc721.TokenID) {
19    gnft.Burn(cross(cur), tokenID)
20}

Security and Access Control

  • Mint, SetTokenURI, and Burn require the position role
  • Staker-held tokens can only be moved by the staker contract
  • Other transfers are checked by the owner/approval rules in the GRC721 ledger
  • Token URI parameters are validated before generated artwork is rendered
  • Generated artwork uses pseudo-random, time-seeded parameters and must not be treated as a source of secure randomness

Architecture

Dependencies

  • gno.land/p/nt/grc721/v0: GRC721 token and ledger implementation
  • gno.land/p/nt/grc721/metadata/v0: Metadata storage
  • gno.land/r/gnoswap/rbac/v1: Access control
  • gno.land/r/gnoswap/access/v1: Position-role authorization and role mirror

State Variables

  • token: GRC721 token metadata and supply state
  • ledger: Ownership, transfer, and approval ledger
  • meta: Token URI metadata
  • metaLedger: Metadata update ledger

Generated image tokens store compact parameters in metadata; the full SVG data URI is generated when TokenURI is called.