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

g18 package

Overview

Package nftminter is a single-collection GRC721 NFT minter realm.

Minting is public -- anyone can call MintAssembled, no allowlist, no curation. Every mint randomly assembles a small trait selection (traitPreset) from on-chain rosters (chainRoster, gemsart's ShapeNames/MetalNames/stone color palettes) and calls gemsart to render the actual image on every read -- storage cost is dominated by gemsart's own one-time deployment, not by how many tokens exist. No owner curation step, no preset pool, and no way for anyone -- including the collection owner -- to choose, influence, or later change what a token looks like once minted: no function in this realm can rewrite a token's traits, image, or attributes after the fact. Metadata is stored fully on-chain per token, following the OpenSea metadata standard.

An earlier version of this realm also shipped a second, owner-curated mint path (Mint/AddPresetToken, plus owner-only metadata-editing functions) for hand-authored art instead of on-the-fly assembly. Removed entirely, not just left unused -- a curated, editable path sitting next to the fair-random one invited a reasonable question ("could the owner just hand themselves something hand-picked through that?") that no amount of the pool being empty could fully answer just by reading the deployed bytecode. See git history if a future collection wants it back.

Uniqueness + reveal: MintAssembled retries with a fresh random draw on collision against an already-minted combination (see assembleUniqueTraits) -- chain state is publicly readable, so this alone doesn't stop someone computing in advance what a future draw might land on. What actually prevents sniping a specific outcome is the delayed reveal: each token's real name/image/attributes stay sealed behind a shared placeholder for RevealDelayBlocks blocks after mint, so nobody -- including the minter -- can see what they got until reveal, with one narrow exception: burning a token reconstructs and exposes its real traits immediately (see Burn), since burning is only ever available to that token's own current owner and destroys it in the same step.

Migration/provenance: every token carries an original-chain/original-token-id/original-mint-height record (Provenance). AddMigrationSnapshotEntry + AdminDeliverMigrated let the owner carry a previous chain's holder list forward onto a new deployment while preserving that provenance -- administrator-only end to end, and a migrated token's new id is always its original token's id, never drawn from nextID (see AddMigrationBurnGap for how an already-burned original index stays reserved too).

The realm's public functions deliberately mirror the standard GRC721 shape (Mint/OwnerOf/TokenURI/SafeTransferFrom/BalanceOf/...) so that tooling built against any GRC721 collection -- a marketplace, an explorer/observer -- can interact with this one without special-casing it. See gno.land/p/g1gn6t0q9wenwhdda47rkrpfd63kcxjvyp7eqwku/grc721 for the underlying token implementation.

Functions

AddChain

func AddChain(cur realm, chainName string)

AddChain appends a new chain to the roster MintAssembled draws from. Owner-only. Does not itself assign a stone/color palette -- pair with SetStoneForChain + AddStoneColor if the new chain should get its own exclusive colors; otherwise it defaults to the shared "Not Set" palette like every other chain without an assignment.

Param

Command

# WARNING: This command is running in an INSECURE mode.
# It is strongly recommended to use a hardware device for signing
# and avoid trusting any computer connected to the internet,
# as your private keys could be exposed.

gnokey maketx call -pkgpath "gno.land/r/g17cjym5e9hhws46lt6329pv2gtx2ay0503hgems/g18" -func "AddChain" -args $'' -gas-fee 1000000ugnot -gas-wanted 1_000_000_000 -send "" -chainid "pearl-1" -remote "https://rpc.pearl.testnets.gno.land" ADDRESSgnokey query -remote "https://rpc.pearl.testnets.gno.land" auth/accounts/ADDRESS
gnokey maketx call -pkgpath "gno.land/r/g17cjym5e9hhws46lt6329pv2gtx2ay0503hgems/g18" -func "AddChain" -args $'' -gas-fee 1000000ugnot -gas-wanted 1_000_000_000 -send "" -broadcast=false ADDRESS > call.tx
gnokey sign -tx-path call.tx -chainid "pearl-1" -account-number ACCOUNTNUMBER -account-sequence SEQUENCENUMBER ADDRESS
gnokey broadcast -remote "https://rpc.pearl.testnets.gno.land" call.tx
  

AddMigrationBurnGap

func AddMigrationBurnGap( cur realm, originalChain, originalTokenID string, originalMintHeight int64, traitChain, metal string, shapeIdx, colorIdx int, active bool, )

AddMigrationBurnGap records an original token ID as permanently unavailable in this collection -- for a token that was already burned on the previous chain before migration, so its exact index doesn't silently stay available to a fresh mint or a different migrated token over here (see AddMigrationSnapshotEntry's own doc comment on why migrated indices need this). There is no holder to deliver to and nothing to self-serve claim, so this mints a token carrying the same trait tuple/provenance a real migration would have produced, straight to the collection owner, and burns it immediately through the same nft.Burn/burnedRecords path Burn itself uses -- so the gap shows up in the burned-tokens list/count and OwnerOf/TokenURI behave exactly like any other burned token, with no separate "reserved but never existed" state to keep in sync with the real thing. Owner-only, same authorization/validation/reservation shape as AddMigrationSnapshotEntry.

Params

Command

# WARNING: This command is running in an INSECURE mode.
# It is strongly recommended to use a hardware device for signing
# and avoid trusting any computer connected to the internet,
# as your private keys could be exposed.

gnokey maketx call -pkgpath "gno.land/r/g17cjym5e9hhws46lt6329pv2gtx2ay0503hgems/g18" -func "AddMigrationBurnGap" -args $'' -args $'' -args $'' -args $'' -args $'' -args $'' -args $'' -args $'' -gas-fee 1000000ugnot -gas-wanted 1_000_000_000 -send "" -chainid "pearl-1" -remote "https://rpc.pearl.testnets.gno.land" ADDRESSgnokey query -remote "https://rpc.pearl.testnets.gno.land" auth/accounts/ADDRESS
gnokey maketx call -pkgpath "gno.land/r/g17cjym5e9hhws46lt6329pv2gtx2ay0503hgems/g18" -func "AddMigrationBurnGap" -args $'' -args $'' -args $'' -args $'' -args $'' -args $'' -args $'' -args $'' -gas-fee 1000000ugnot -gas-wanted 1_000_000_000 -send "" -broadcast=false ADDRESS > call.tx
gnokey sign -tx-path call.tx -chainid "pearl-1" -account-number ACCOUNTNUMBER -account-sequence SEQUENCENUMBER ADDRESS
gnokey broadcast -remote "https://rpc.pearl.testnets.gno.land" call.tx
  

AddMigrationSnapshotEntry

func AddMigrationSnapshotEntry( cur realm, originalOwner address, originalChain, originalTokenID string, originalMintHeight int64, traitChain, metal string, shapeIdx, colorIdx int, active bool, )

AddMigrationSnapshotEntry seeds one holder's record from a previous chain deployment of this collection, so the owner can later deliver an equivalent token here via AdminDeliverMigrated. Owner-only: verifying "this address really held this exact token on the old chain" isn't something this contract can check trustlessly (gno.land chains don't share state or expose light-client proofs to each other) -- the owner is expected to read the old chain's real holder list off-chain (e.g. via CollectionSummary/WalletSummary there) and re-enter it here faithfully.

Migration is administrator-only end to end: no self-serve claim path (see AdminDeliverMigrated) -- the owner alone decides when a seeded entry actually mints.

originalTokenID becomes this token's EXACT id on this realm too (see mintMigratedToken) -- not drawn from nextID -- so a migrated token's index matches the original collection's numbering one-for-one, regardless of delivery order. Validated here as a real seqid-decodable ID (and reserved against nextID immediately) so a typo fails at seed time. A gap in the original numbering (a token already burned there before migration) needs its own AddMigrationBurnGap call, or that index would silently stay available to a fresh or different migrated token here.

The trait combination is also reserved into mintedTraitCombos immediately (see registerMigrationCombo) -- panics if a live MintAssembled mint already claimed it.

originalMintHeight is that token's ORIGINAL mint height on the chain it came from (see Provenance) -- not this call's height.

traitChain/metal/shapeIdx/colorIdx/active are this token's small trait tuple (see traitPreset) -- NOT the same thing as originalChain above: traitChain is the gem's own thematic "Chain" trait (e.g. "TEST-3"), a fictional testnet-generation name baked into the piece itself, while originalChain is the real blockchain the previous deployment lived on (e.g. "sapphire-1"). A source realm never exposes the raw shapeIdx/colorIdx directly (only rendered trait strings via CollectionSummary) -- reverse-map those with this realm's own FindShapeIndex/FindColorIndex before calling this. Panics if shapeIdx/colorIdx/metal don't check out against this realm's own current tables.

Calling this again for a key that hasn't been delivered yet corrects the seeded entry in place (releasing its previous trait-combo reservation first). Calling it again for an already-delivered key panics -- re-seeding would make it deliverable a second time.

Params

Command

# WARNING: This command is running in an INSECURE mode.
# It is strongly recommended to use a hardware device for signing
# and avoid trusting any computer connected to the internet,
# as your private keys could be exposed.

gnokey maketx call -pkgpath "gno.land/r/g17cjym5e9hhws46lt6329pv2gtx2ay0503hgems/g18" -func "AddMigrationSnapshotEntry" -args $'' -args $'' -args $'' -args $'' -args $'' -args $'' -args $'' -args $'' -args $'' -gas-fee 1000000ugnot -gas-wanted 1_000_000_000 -send "" -chainid "pearl-1" -remote "https://rpc.pearl.testnets.gno.land" ADDRESSgnokey query -remote "https://rpc.pearl.testnets.gno.land" auth/accounts/ADDRESS
gnokey maketx call -pkgpath "gno.land/r/g17cjym5e9hhws46lt6329pv2gtx2ay0503hgems/g18" -func "AddMigrationSnapshotEntry" -args $'' -args $'' -args $'' -args $'' -args $'' -args $'' -args $'' -args $'' -args $'' -gas-fee 1000000ugnot -gas-wanted 1_000_000_000 -send "" -broadcast=false ADDRESS > call.tx
gnokey sign -tx-path call.tx -chainid "pearl-1" -account-number ACCOUNTNUMBER -account-sequence SEQUENCENUMBER ADDRESS
gnokey broadcast -remote "https://rpc.pearl.testnets.gno.land" call.tx
  

AddStoneColor

func AddStoneColor(cur realm, stone, hex, name string)

AddStoneColor appends one exclusive color to a stone's palette -- bootstraps a brand-new stone (its first color) or extends an existing one. Owner-only. Always appends, never overwrites or reorders: a colorIdx already used by a queued or minted preset keeps meaning the same color for its whole lifetime.

Params

Command

# WARNING: This command is running in an INSECURE mode.
# It is strongly recommended to use a hardware device for signing
# and avoid trusting any computer connected to the internet,
# as your private keys could be exposed.

gnokey maketx call -pkgpath "gno.land/r/g17cjym5e9hhws46lt6329pv2gtx2ay0503hgems/g18" -func "AddStoneColor" -args $'' -args $'' -args $'' -gas-fee 1000000ugnot -gas-wanted 1_000_000_000 -send "" -chainid "pearl-1" -remote "https://rpc.pearl.testnets.gno.land" ADDRESSgnokey query -remote "https://rpc.pearl.testnets.gno.land" auth/accounts/ADDRESS
gnokey maketx call -pkgpath "gno.land/r/g17cjym5e9hhws46lt6329pv2gtx2ay0503hgems/g18" -func "AddStoneColor" -args $'' -args $'' -args $'' -gas-fee 1000000ugnot -gas-wanted 1_000_000_000 -send "" -broadcast=false ADDRESS > call.tx
gnokey sign -tx-path call.tx -chainid "pearl-1" -account-number ACCOUNTNUMBER -account-sequence SEQUENCENUMBER ADDRESS
gnokey broadcast -remote "https://rpc.pearl.testnets.gno.land" call.tx
  

AdminDeliverMigrated

func AdminDeliverMigrated(cur realm, originalChain, originalTokenID string) grc721.TokenID

AdminDeliverMigrated delivers an already-seeded migration entry directly to its recorded original holder -- the ONLY way a seeded entry ever becomes a real token here. An earlier ClaimMigrated let any address self-serve claim its own matching entry; removed so migration is administrator-only end to end, per request -- the owner alone decides when a seeded entry actually mints. Delivery order no longer matters for index-matching (see mintMigratedToken: a migrated token's id is taken directly from originalTokenID, not drawn sequentially), so there's no ordering requirement here beyond the owner's own judgment. One call per token; batch many into a single multi-message transaction client-side, the same pattern this realm already uses for AddMigrationSnapshotEntry and MintAssembled.

Params

Command

# WARNING: This command is running in an INSECURE mode.
# It is strongly recommended to use a hardware device for signing
# and avoid trusting any computer connected to the internet,
# as your private keys could be exposed.

gnokey maketx call -pkgpath "gno.land/r/g17cjym5e9hhws46lt6329pv2gtx2ay0503hgems/g18" -func "AdminDeliverMigrated" -args $'' -args $'' -gas-fee 1000000ugnot -gas-wanted 1_000_000_000 -send "" -chainid "pearl-1" -remote "https://rpc.pearl.testnets.gno.land" ADDRESSgnokey query -remote "https://rpc.pearl.testnets.gno.land" auth/accounts/ADDRESS
gnokey maketx call -pkgpath "gno.land/r/g17cjym5e9hhws46lt6329pv2gtx2ay0503hgems/g18" -func "AdminDeliverMigrated" -args $'' -args $'' -gas-fee 1000000ugnot -gas-wanted 1_000_000_000 -send "" -broadcast=false ADDRESS > call.tx
gnokey sign -tx-path call.tx -chainid "pearl-1" -account-number ACCOUNTNUMBER -account-sequence SEQUENCENUMBER ADDRESS
gnokey broadcast -remote "https://rpc.pearl.testnets.gno.land" call.tx
  

Age

func Age(tid grc721.TokenID) int64

Age returns real blocks elapsed since tid was minted (MintAssembled only -- migrated-in tokens have no seal step, hence no meaningful age), or -1 if it doesn't exist / was never sealed.

Param

Command

gnokey query vm/qeval -remote "https://rpc.pearl.testnets.gno.land" -data "gno.land/r/g17cjym5e9hhws46lt6329pv2gtx2ay0503hgems/g18.Age()"

Result

Approve

func Approve(cur realm, to address, tid grc721.TokenID)

Params

Command

# WARNING: This command is running in an INSECURE mode.
# It is strongly recommended to use a hardware device for signing
# and avoid trusting any computer connected to the internet,
# as your private keys could be exposed.

gnokey maketx call -pkgpath "gno.land/r/g17cjym5e9hhws46lt6329pv2gtx2ay0503hgems/g18" -func "Approve" -args $'' -args $'' -gas-fee 1000000ugnot -gas-wanted 1_000_000_000 -send "" -chainid "pearl-1" -remote "https://rpc.pearl.testnets.gno.land" ADDRESSgnokey query -remote "https://rpc.pearl.testnets.gno.land" auth/accounts/ADDRESS
gnokey maketx call -pkgpath "gno.land/r/g17cjym5e9hhws46lt6329pv2gtx2ay0503hgems/g18" -func "Approve" -args $'' -args $'' -gas-fee 1000000ugnot -gas-wanted 1_000_000_000 -send "" -broadcast=false ADDRESS > call.tx
gnokey sign -tx-path call.tx -chainid "pearl-1" -account-number ACCOUNTNUMBER -account-sequence SEQUENCENUMBER ADDRESS
gnokey broadcast -remote "https://rpc.pearl.testnets.gno.land" call.tx
  

BalanceOf

func BalanceOf(owner address) (int64, error)

Param

Command

gnokey query vm/qeval -remote "https://rpc.pearl.testnets.gno.land" -data "gno.land/r/g17cjym5e9hhws46lt6329pv2gtx2ay0503hgems/g18.BalanceOf()"

Result

Burn

func Burn(cur realm, tid grc721.TokenID)

Burn destroys a token. Caller must be its current owner. nft.Burn itself now frees the token's real metadata storage too (see grc721v2's own Burn doc comment) -- but sealedData/mintProvenance/ mintHeight are this realm's OWN per-token state, outside grc721 entirely, so they need their own cleanup here. mintedTraitCombos is deliberately NOT touched -- it's a permanent record so a burned token's exact trait combination can never be re-minted (see its own doc comment); freeing it on burn would be a uniqueness regression, not a storage-cost fix.

Param

Command

# WARNING: This command is running in an INSECURE mode.
# It is strongly recommended to use a hardware device for signing
# and avoid trusting any computer connected to the internet,
# as your private keys could be exposed.

gnokey maketx call -pkgpath "gno.land/r/g17cjym5e9hhws46lt6329pv2gtx2ay0503hgems/g18" -func "Burn" -args $'' -gas-fee 1000000ugnot -gas-wanted 1_000_000_000 -send "" -chainid "pearl-1" -remote "https://rpc.pearl.testnets.gno.land" ADDRESSgnokey query -remote "https://rpc.pearl.testnets.gno.land" auth/accounts/ADDRESS
gnokey maketx call -pkgpath "gno.land/r/g17cjym5e9hhws46lt6329pv2gtx2ay0503hgems/g18" -func "Burn" -args $'' -gas-fee 1000000ugnot -gas-wanted 1_000_000_000 -send "" -broadcast=false ADDRESS > call.tx
gnokey sign -tx-path call.tx -chainid "pearl-1" -account-number ACCOUNTNUMBER -account-sequence SEQUENCENUMBER ADDRESS
gnokey broadcast -remote "https://rpc.pearl.testnets.gno.land" call.tx
  

BurnedTokenSummary

func BurnedTokenSummary(tid grc721.TokenID) (string, error)

BurnedTokenSummary returns a permanent snapshot of one burned token as a pipe-delimited raw line -- same field convention as rawTokenSummary (base64 name/description/image/externalURL/traits-CSV/backgroundColor), with owner swapped for burnedBy/burnHeight and the three provenance fields (survives Burn's own erasure -- see burnRecord's own doc comment) prepended. Meant for a future migration sourcing FROM this realm to recover a token that was already burned here before that migration -- the same problem AddMigrationBurnGap exists to solve when sourcing from an EARLIER realm today, except this realm's own burns are actually queryable this way instead of needing manual entry.

Public (not owner-gated), unlike RawCollectionSummary: there's no seal left to bypass here -- a token can only be burned by its own current owner, well after any reveal delay would have already elapsed, so nothing this exposes wasn't already visible to whoever burned it.

Param

Command

gnokey query vm/qeval -remote "https://rpc.pearl.testnets.gno.land" -data "gno.land/r/g17cjym5e9hhws46lt6329pv2gtx2ay0503hgems/g18.BurnedTokenSummary()"

Result

ChainRosterCSV

func ChainRosterCSV() string

ChainRosterCSV lists every chain currently in the roster, semicolon-separated, in roster order -- lets tooling/frontends introspect what's currently known instead of hardcoding it.

Command

gnokey query vm/qeval -remote "https://rpc.pearl.testnets.gno.land" -data "gno.land/r/g17cjym5e9hhws46lt6329pv2gtx2ay0503hgems/g18.ChainRosterCSV()"

Result

ChainRosterSize

func ChainRosterSize() int64

ChainRosterSize reports how many chains MintAssembled currently draws from.

Command

gnokey query vm/qeval -remote "https://rpc.pearl.testnets.gno.land" -data "gno.land/r/g17cjym5e9hhws46lt6329pv2gtx2ay0503hgems/g18.ChainRosterSize()"

Result

CollectionSummary

func CollectionSummary(page int) string

CollectionSummary returns one TokenSummary line per currently-existing token on the given page (1-indexed, newest first, homeRenderLimit per page -- same page size as renderMintedListPage, confirmed live to fit a single qeval call's gas budget), newline-separated. Used to be unbounded (every token in one call) -- confirmed live that this starts failing with "out of gas in location: CPUCycles" at just 21 minted tokens, since TokenSummary regenerates a full SVG per token (currentMetadata -> renderTokenSVG). Paginating the same way the gnoweb listing already does keeps every call's cost bounded regardless of collection size.

Param

Command

gnokey query vm/qeval -remote "https://rpc.pearl.testnets.gno.land" -data "gno.land/r/g17cjym5e9hhws46lt6329pv2gtx2ay0503hgems/g18.CollectionSummary()"

Result

ColorPaletteCSV

func ColorPaletteCSV(stone string) string

ColorPaletteCSV lists stone's full color palette as "hex:name;hex:name;...", in colorIdx order -- lets tooling build a picker for AddTraitPreset's colorIdx argument without hardcoding what colors currently exist.

Param

Command

gnokey query vm/qeval -remote "https://rpc.pearl.testnets.gno.land" -data "gno.land/r/g17cjym5e9hhws46lt6329pv2gtx2ay0503hgems/g18.ColorPaletteCSV()"

Result

ColorPaletteSize

func ColorPaletteSize(stone string) int64

ColorPaletteSize reports how many colors are currently valid for stone -- the range of colorIdx values AddTraitPreset will accept for it. Public read accessor for gemsart's ColorPaletteSize.

Param

Command

gnokey query vm/qeval -remote "https://rpc.pearl.testnets.gno.land" -data "gno.land/r/g17cjym5e9hhws46lt6329pv2gtx2ay0503hgems/g18.ColorPaletteSize()"

Result

Getter

func Getter() grc721.NFTGetter

Getter returns a reader-only view of the collection, safe to register with cross-realm aggregators (marketplace, observer) without risking a captured cur.

Command

gnokey query vm/qeval -remote "https://rpc.pearl.testnets.gno.land" -data "gno.land/r/g17cjym5e9hhws46lt6329pv2gtx2ay0503hgems/g18.Getter()"

Result

IsApprovedForAll

func IsApprovedForAll(owner, operator address) bool

Params

Command

gnokey query vm/qeval -remote "https://rpc.pearl.testnets.gno.land" -data "gno.land/r/g17cjym5e9hhws46lt6329pv2gtx2ay0503hgems/g18.IsApprovedForAll(,)"

Result

IsMigrationClaimed

func IsMigrationClaimed(originalChain, originalTokenID string) bool

IsMigrationClaimed reports whether the given original chain/token combination has already been claimed here.

Params

Command

gnokey query vm/qeval -remote "https://rpc.pearl.testnets.gno.land" -data "gno.land/r/g17cjym5e9hhws46lt6329pv2gtx2ay0503hgems/g18.IsMigrationClaimed(,)"

Result

IsRevealed

func IsRevealed(tid grc721.TokenID) bool

IsRevealed reports whether tid's real metadata is visible yet. Tokens that were never sealed (migrated-in) report true -- there's nothing left to reveal.

Param

Command

gnokey query vm/qeval -remote "https://rpc.pearl.testnets.gno.land" -data "gno.land/r/g17cjym5e9hhws46lt6329pv2gtx2ay0503hgems/g18.IsRevealed()"

Result

IsTraitComboAvailable

func IsTraitComboAvailable(chainName string, shapeIdx, colorIdx int, metal string, active bool) bool

IsTraitComboAvailable reports whether the given exact trait combination has already been minted. Mostly useful for tooling that wants to display/verify a specific combination's status; MintAssembled itself never calls this -- it just retries on collision (see assembleUniqueTraits).

Params

Command

gnokey query vm/qeval -remote "https://rpc.pearl.testnets.gno.land" -data "gno.land/r/g17cjym5e9hhws46lt6329pv2gtx2ay0503hgems/g18.IsTraitComboAvailable(,,,,)"

Result

MaxMintsPerWallet

func MaxMintsPerWallet() int64

MaxMintsPerWallet returns the current per-recipient cap on MintAssembled mints -- 0 means unlimited. Never applies when the collection owner is the one calling MintAssembled (see its own doc comment) -- this reports the cap everyone else is held to.

Command

gnokey query vm/qeval -remote "https://rpc.pearl.testnets.gno.land" -data "gno.land/r/g17cjym5e9hhws46lt6329pv2gtx2ay0503hgems/g18.MaxMintsPerWallet()"

Result

MaxUniqueTraitCombos

func MaxUniqueTraitCombos() int64

MaxUniqueTraitCombos reports the total size of the assembled-on-read trait space right now -- every (chain, stone, color) triple the current chainRoster/stone assignments allow, times every shape times every metal times the two active states. This is the collection's real ceiling (there's no fixed MaxSupply): once mintedTraitCombos reaches this count, MintAssembled has nothing left to draw. Grows automatically whenever AddChain/AddStoneColor extend the rosters it reads from.

Command

gnokey query vm/qeval -remote "https://rpc.pearl.testnets.gno.land" -data "gno.land/r/g17cjym5e9hhws46lt6329pv2gtx2ay0503hgems/g18.MaxUniqueTraitCombos()"

Result

MetalToneHex

func MetalToneHex(metalName string) string

MetalToneHex reports metalName's current hi/lo gradient tones as "hi;lo", or "" if metalName isn't recognized. Public read accessor so tooling/frontends can introspect the current values instead of hardcoding them.

Param

Command

gnokey query vm/qeval -remote "https://rpc.pearl.testnets.gno.land" -data "gno.land/r/g17cjym5e9hhws46lt6329pv2gtx2ay0503hgems/g18.MetalToneHex()"

Result

MigrationClaimedCount

func MigrationClaimedCount() int64

Command

gnokey query vm/qeval -remote "https://rpc.pearl.testnets.gno.land" -data "gno.land/r/g17cjym5e9hhws46lt6329pv2gtx2ay0503hgems/g18.MigrationClaimedCount()"

Result

MigrationSnapshotSize

func MigrationSnapshotSize() int64

MigrationSnapshotSize and MigrationClaimedCount report how many migration records have been seeded in total, and how many of those have been claimed so far.

Command

gnokey query vm/qeval -remote "https://rpc.pearl.testnets.gno.land" -data "gno.land/r/g17cjym5e9hhws46lt6329pv2gtx2ay0503hgems/g18.MigrationSnapshotSize()"

Result

MintAssembled

func MintAssembled(cur realm, to address) grc721.TokenID

MintAssembled is the collection's only mint path: no owner-curated pool at all -- every mint randomly assembles a fresh (chain, shape, color, metal, active) combination from the on-chain rosters (chainRoster/shapeNames/metalNames, with color drawn from whichever palette the chosen chain's stone uses), rejecting and re-drawing on the rare collision against a combination that's already been minted (see assembleUniqueTraits). No curation step means no control over rarity pacing or which combinations exist and when -- every valid combination in the whole trait space is mintable from the start, and nobody, including the collection owner, can choose or later change what a specific mint produces. That's deliberate, not an oversight: see the package doc comment for the curated-pool alternative this used to sit alongside (git history) and why it was removed rather than left dormant. Public -- no authorization check, no caller-supplied metadata of any kind -- but DOES require payment if the owner has set one (see MintPrice/SetMintPrice and the payment check inlined below): the caller's attached "ugnot" send must match the current price exactly, or the whole call reverts (including the attempted payment -- a panic here rolls back the entire message, confirmed against this project's actual SDK message-processing code, not assumed).

Param

Command

# WARNING: This command is running in an INSECURE mode.
# It is strongly recommended to use a hardware device for signing
# and avoid trusting any computer connected to the internet,
# as your private keys could be exposed.

gnokey maketx call -pkgpath "gno.land/r/g17cjym5e9hhws46lt6329pv2gtx2ay0503hgems/g18" -func "MintAssembled" -args $'' -gas-fee 1000000ugnot -gas-wanted 1_000_000_000 -send "" -chainid "pearl-1" -remote "https://rpc.pearl.testnets.gno.land" ADDRESSgnokey query -remote "https://rpc.pearl.testnets.gno.land" auth/accounts/ADDRESS
gnokey maketx call -pkgpath "gno.land/r/g17cjym5e9hhws46lt6329pv2gtx2ay0503hgems/g18" -func "MintAssembled" -args $'' -gas-fee 1000000ugnot -gas-wanted 1_000_000_000 -send "" -broadcast=false ADDRESS > call.tx
gnokey sign -tx-path call.tx -chainid "pearl-1" -account-number ACCOUNTNUMBER -account-sequence SEQUENCENUMBER ADDRESS
gnokey broadcast -remote "https://rpc.pearl.testnets.gno.land" call.tx
  

MintPrice

func MintPrice() int64

MintPrice returns the current price, in ugnot, that MintAssembled charges. 0 means free.

Command

gnokey query vm/qeval -remote "https://rpc.pearl.testnets.gno.land" -data "gno.land/r/g17cjym5e9hhws46lt6329pv2gtx2ay0503hgems/g18.MintPrice()"

Result

MintingOpen

func MintingOpen() bool

MintingOpen reports whether Mint/MintAssembled currently accept new mints. Toggled by SetMintingOpen -- this collection has no fixed supply cap (see MaxSupply), so this is the owner's actual mechanism for ending the mint, independent of whether presets remain queued.

Command

gnokey query vm/qeval -remote "https://rpc.pearl.testnets.gno.land" -data "gno.land/r/g17cjym5e9hhws46lt6329pv2gtx2ay0503hgems/g18.MintingOpen()"

Result

MintsByWallet

func MintsByWallet(owner address) int64

MintsByWallet reports how many MintAssembled tokens owner has ever received (see mintCountByWallet's doc comment for why this isn't the same as current holdings).

Param

Command

gnokey query vm/qeval -remote "https://rpc.pearl.testnets.gno.land" -data "gno.land/r/g17cjym5e9hhws46lt6329pv2gtx2ay0503hgems/g18.MintsByWallet()"

Result

Name

func Name() string

Command

gnokey query vm/qeval -remote "https://rpc.pearl.testnets.gno.land" -data "gno.land/r/g17cjym5e9hhws46lt6329pv2gtx2ay0503hgems/g18.Name()"

Result

Provenance

func Provenance(tid grc721.TokenID) (originalChain string, originalTokenID string, originalMintHeight int64, err error)

Provenance returns tid's original-chain/original-token-id/original-mint- height record -- populated for every token, whether it was minted here directly or carried forward from a previous chain via AdminDeliverMigrated.

Param

Command

gnokey query vm/qeval -remote "https://rpc.pearl.testnets.gno.land" -data "gno.land/r/g17cjym5e9hhws46lt6329pv2gtx2ay0503hgems/g18.Provenance()"

Result

RawCollectionSummary

func RawCollectionSummary(cur realm, page int) string

RawCollectionSummary is CollectionSummary's owner-only counterpart, same line format and same page-based pagination (see CollectionSummary's own comment on why an unbounded version runs out of gas), but bypasses the reveal seal entirely so a complete, authoritative backup can be taken at any moment -- e.g. right after a testnet deprecation is announced, without needing to wait out individual tokens' remaining reveal delay first. Meant specifically for disaster-recovery/migration snapshots (see AddMigrationSnapshotEntry) -- exposing this to anyone but the owner would defeat the point of sealing in the first place, hence `cur realm` + assertOwner rather than a plain query function, matching this realm's other owner-gated calls.

Param

Command

# WARNING: This command is running in an INSECURE mode.
# It is strongly recommended to use a hardware device for signing
# and avoid trusting any computer connected to the internet,
# as your private keys could be exposed.

gnokey maketx call -pkgpath "gno.land/r/g17cjym5e9hhws46lt6329pv2gtx2ay0503hgems/g18" -func "RawCollectionSummary" -args $'' -gas-fee 1000000ugnot -gas-wanted 1_000_000_000 -send "" -chainid "pearl-1" -remote "https://rpc.pearl.testnets.gno.land" ADDRESSgnokey query -remote "https://rpc.pearl.testnets.gno.land" auth/accounts/ADDRESS
gnokey maketx call -pkgpath "gno.land/r/g17cjym5e9hhws46lt6329pv2gtx2ay0503hgems/g18" -func "RawCollectionSummary" -args $'' -gas-fee 1000000ugnot -gas-wanted 1_000_000_000 -send "" -broadcast=false ADDRESS > call.tx
gnokey sign -tx-path call.tx -chainid "pearl-1" -account-number ACCOUNTNUMBER -account-sequence SEQUENCENUMBER ADDRESS
gnokey broadcast -remote "https://rpc.pearl.testnets.gno.land" call.tx
  

Render

func Render(path string) string

Param

Command

gnokey query vm/qeval -remote "https://rpc.pearl.testnets.gno.land" -data "gno.land/r/g17cjym5e9hhws46lt6329pv2gtx2ay0503hgems/g18.Render()"

Result

SafeTransferFrom

func SafeTransferFrom(cur realm, from, to address, tid grc721.TokenID)

Params

Command

# WARNING: This command is running in an INSECURE mode.
# It is strongly recommended to use a hardware device for signing
# and avoid trusting any computer connected to the internet,
# as your private keys could be exposed.

gnokey maketx call -pkgpath "gno.land/r/g17cjym5e9hhws46lt6329pv2gtx2ay0503hgems/g18" -func "SafeTransferFrom" -args $'' -args $'' -args $'' -gas-fee 1000000ugnot -gas-wanted 1_000_000_000 -send "" -chainid "pearl-1" -remote "https://rpc.pearl.testnets.gno.land" ADDRESSgnokey query -remote "https://rpc.pearl.testnets.gno.land" auth/accounts/ADDRESS
gnokey maketx call -pkgpath "gno.land/r/g17cjym5e9hhws46lt6329pv2gtx2ay0503hgems/g18" -func "SafeTransferFrom" -args $'' -args $'' -args $'' -gas-fee 1000000ugnot -gas-wanted 1_000_000_000 -send "" -broadcast=false ADDRESS > call.tx
gnokey sign -tx-path call.tx -chainid "pearl-1" -account-number ACCOUNTNUMBER -account-sequence SEQUENCENUMBER ADDRESS
gnokey broadcast -remote "https://rpc.pearl.testnets.gno.land" call.tx
  

SetApprovalForAll

func SetApprovalForAll(cur realm, operator address, approved bool)

Params

Command

# WARNING: This command is running in an INSECURE mode.
# It is strongly recommended to use a hardware device for signing
# and avoid trusting any computer connected to the internet,
# as your private keys could be exposed.

gnokey maketx call -pkgpath "gno.land/r/g17cjym5e9hhws46lt6329pv2gtx2ay0503hgems/g18" -func "SetApprovalForAll" -args $'' -args $'' -gas-fee 1000000ugnot -gas-wanted 1_000_000_000 -send "" -chainid "pearl-1" -remote "https://rpc.pearl.testnets.gno.land" ADDRESSgnokey query -remote "https://rpc.pearl.testnets.gno.land" auth/accounts/ADDRESS
gnokey maketx call -pkgpath "gno.land/r/g17cjym5e9hhws46lt6329pv2gtx2ay0503hgems/g18" -func "SetApprovalForAll" -args $'' -args $'' -gas-fee 1000000ugnot -gas-wanted 1_000_000_000 -send "" -broadcast=false ADDRESS > call.tx
gnokey sign -tx-path call.tx -chainid "pearl-1" -account-number ACCOUNTNUMBER -account-sequence SEQUENCENUMBER ADDRESS
gnokey broadcast -remote "https://rpc.pearl.testnets.gno.land" call.tx
  

SetMaxMintsPerWallet

func SetMaxMintsPerWallet(cur realm, max int64)

SetMaxMintsPerWallet updates the per-recipient cap. Owner-only. Does not retroactively affect wallets already at or past a lower new cap -- it only blocks further mints TO them going forward. Never affects the owner's own unlimited minting (see MintAssembled).

Param

Command

# WARNING: This command is running in an INSECURE mode.
# It is strongly recommended to use a hardware device for signing
# and avoid trusting any computer connected to the internet,
# as your private keys could be exposed.

gnokey maketx call -pkgpath "gno.land/r/g17cjym5e9hhws46lt6329pv2gtx2ay0503hgems/g18" -func "SetMaxMintsPerWallet" -args $'' -gas-fee 1000000ugnot -gas-wanted 1_000_000_000 -send "" -chainid "pearl-1" -remote "https://rpc.pearl.testnets.gno.land" ADDRESSgnokey query -remote "https://rpc.pearl.testnets.gno.land" auth/accounts/ADDRESS
gnokey maketx call -pkgpath "gno.land/r/g17cjym5e9hhws46lt6329pv2gtx2ay0503hgems/g18" -func "SetMaxMintsPerWallet" -args $'' -gas-fee 1000000ugnot -gas-wanted 1_000_000_000 -send "" -broadcast=false ADDRESS > call.tx
gnokey sign -tx-path call.tx -chainid "pearl-1" -account-number ACCOUNTNUMBER -account-sequence SEQUENCENUMBER ADDRESS
gnokey broadcast -remote "https://rpc.pearl.testnets.gno.land" call.tx
  

SetMintPrice

func SetMintPrice(cur realm, ugnot int64)

SetMintPrice updates the price MintAssembled charges. Owner-only, callable at any time -- meant to be re-set whenever GNOT/USD moves enough to matter, and independently per chain this realm is deployed to (testnet vs. eventual mainnet each hold their own state). Does not affect any token already minted.

Param

Command

# WARNING: This command is running in an INSECURE mode.
# It is strongly recommended to use a hardware device for signing
# and avoid trusting any computer connected to the internet,
# as your private keys could be exposed.

gnokey maketx call -pkgpath "gno.land/r/g17cjym5e9hhws46lt6329pv2gtx2ay0503hgems/g18" -func "SetMintPrice" -args $'' -gas-fee 1000000ugnot -gas-wanted 1_000_000_000 -send "" -chainid "pearl-1" -remote "https://rpc.pearl.testnets.gno.land" ADDRESSgnokey query -remote "https://rpc.pearl.testnets.gno.land" auth/accounts/ADDRESS
gnokey maketx call -pkgpath "gno.land/r/g17cjym5e9hhws46lt6329pv2gtx2ay0503hgems/g18" -func "SetMintPrice" -args $'' -gas-fee 1000000ugnot -gas-wanted 1_000_000_000 -send "" -broadcast=false ADDRESS > call.tx
gnokey sign -tx-path call.tx -chainid "pearl-1" -account-number ACCOUNTNUMBER -account-sequence SEQUENCENUMBER ADDRESS
gnokey broadcast -remote "https://rpc.pearl.testnets.gno.land" call.tx
  

SetMintingOpen

func SetMintingOpen(cur realm, open bool)

SetMintingOpen opens or closes new mints. Owner-only. Does not affect AdminDeliverMigrated (see mintingOpen's doc comment) or any token that already exists.

Param

Command

# WARNING: This command is running in an INSECURE mode.
# It is strongly recommended to use a hardware device for signing
# and avoid trusting any computer connected to the internet,
# as your private keys could be exposed.

gnokey maketx call -pkgpath "gno.land/r/g17cjym5e9hhws46lt6329pv2gtx2ay0503hgems/g18" -func "SetMintingOpen" -args $'' -gas-fee 1000000ugnot -gas-wanted 1_000_000_000 -send "" -chainid "pearl-1" -remote "https://rpc.pearl.testnets.gno.land" ADDRESSgnokey query -remote "https://rpc.pearl.testnets.gno.land" auth/accounts/ADDRESS
gnokey maketx call -pkgpath "gno.land/r/g17cjym5e9hhws46lt6329pv2gtx2ay0503hgems/g18" -func "SetMintingOpen" -args $'' -gas-fee 1000000ugnot -gas-wanted 1_000_000_000 -send "" -broadcast=false ADDRESS > call.tx
gnokey sign -tx-path call.tx -chainid "pearl-1" -account-number ACCOUNTNUMBER -account-sequence SEQUENCENUMBER ADDRESS
gnokey broadcast -remote "https://rpc.pearl.testnets.gno.land" call.tx
  

SetStoneForChain

func SetStoneForChain(cur realm, chainName, stone string)

SetStoneForChain assigns (or reassigns) which stone a chain maps to. Owner-only. A chain's stone (and therefore its color palette) is resolved fresh by MintAssembled on every mint, so changing this mapping takes effect on the very next mint for that chain -- it does not affect any token already minted.

Params

Command

# WARNING: This command is running in an INSECURE mode.
# It is strongly recommended to use a hardware device for signing
# and avoid trusting any computer connected to the internet,
# as your private keys could be exposed.

gnokey maketx call -pkgpath "gno.land/r/g17cjym5e9hhws46lt6329pv2gtx2ay0503hgems/g18" -func "SetStoneForChain" -args $'' -args $'' -gas-fee 1000000ugnot -gas-wanted 1_000_000_000 -send "" -chainid "pearl-1" -remote "https://rpc.pearl.testnets.gno.land" ADDRESSgnokey query -remote "https://rpc.pearl.testnets.gno.land" auth/accounts/ADDRESS
gnokey maketx call -pkgpath "gno.land/r/g17cjym5e9hhws46lt6329pv2gtx2ay0503hgems/g18" -func "SetStoneForChain" -args $'' -args $'' -gas-fee 1000000ugnot -gas-wanted 1_000_000_000 -send "" -broadcast=false ADDRESS > call.tx
gnokey sign -tx-path call.tx -chainid "pearl-1" -account-number ACCOUNTNUMBER -account-sequence SEQUENCENUMBER ADDRESS
gnokey broadcast -remote "https://rpc.pearl.testnets.gno.land" call.tx
  

SetTokenURI

func SetTokenURI(cur realm, tid grc721.TokenID, uri string)

SetTokenURI sets an (optional) off-chain pointer alongside the on-chain metadata. Owner-only (see tokenOwnerAsCaller). The one remaining owner-editable per-token field -- not a trait, just a supplementary external link separate from Attributes/Image/Name.

Params

Command

# WARNING: This command is running in an INSECURE mode.
# It is strongly recommended to use a hardware device for signing
# and avoid trusting any computer connected to the internet,
# as your private keys could be exposed.

gnokey maketx call -pkgpath "gno.land/r/g17cjym5e9hhws46lt6329pv2gtx2ay0503hgems/g18" -func "SetTokenURI" -args $'' -args $'' -gas-fee 1000000ugnot -gas-wanted 1_000_000_000 -send "" -chainid "pearl-1" -remote "https://rpc.pearl.testnets.gno.land" ADDRESSgnokey query -remote "https://rpc.pearl.testnets.gno.land" auth/accounts/ADDRESS
gnokey maketx call -pkgpath "gno.land/r/g17cjym5e9hhws46lt6329pv2gtx2ay0503hgems/g18" -func "SetTokenURI" -args $'' -args $'' -gas-fee 1000000ugnot -gas-wanted 1_000_000_000 -send "" -broadcast=false ADDRESS > call.tx
gnokey sign -tx-path call.tx -chainid "pearl-1" -account-number ACCOUNTNUMBER -account-sequence SEQUENCENUMBER ADDRESS
gnokey broadcast -remote "https://rpc.pearl.testnets.gno.land" call.tx
  

ShapeNamesForStone

func ShapeNamesForStone(stone string) string

ShapeNamesForStone lists the valid shape names for stone, semicolon- separated, in shapeIdx order -- Pearl draws from a completely different vocabulary (PearlShapeNames: Round/Oval/Button/Drop/Baroque/Circled, real pearl shape categories) than every other stone (ShapeNames: cut terminology like Round Brilliant/Emerald Cut/Rose Cut), since a pearl is never faceted the way a crystal is. Lets tooling build a picker without hardcoding which vocabulary applies to which stone.

Param

Command

gnokey query vm/qeval -remote "https://rpc.pearl.testnets.gno.land" -data "gno.land/r/g17cjym5e9hhws46lt6329pv2gtx2ay0503hgems/g18.ShapeNamesForStone()"

Result

StoneForChain

func StoneForChain(chainName string) string

StoneForChain reports what stone (if any) chainName currently maps to -- "Not Set" if none. Public read accessor for gemsart's StoneForChain.

Param

Command

gnokey query vm/qeval -remote "https://rpc.pearl.testnets.gno.land" -data "gno.land/r/g17cjym5e9hhws46lt6329pv2gtx2ay0503hgems/g18.StoneForChain()"

Result

StoneNames

func StoneNames() string

StoneNames lists every stone name currently registered (has a chain mapped to it, a color in its palette, or both), semicolon-separated, in the order each was first introduced.

Command

gnokey query vm/qeval -remote "https://rpc.pearl.testnets.gno.land" -data "gno.land/r/g17cjym5e9hhws46lt6329pv2gtx2ay0503hgems/g18.StoneNames()"

Result

Symbol

func Symbol() string

Command

gnokey query vm/qeval -remote "https://rpc.pearl.testnets.gno.land" -data "gno.land/r/g17cjym5e9hhws46lt6329pv2gtx2ay0503hgems/g18.Symbol()"

Result

TokenCount

func TokenCount() int64

Command

gnokey query vm/qeval -remote "https://rpc.pearl.testnets.gno.land" -data "gno.land/r/g17cjym5e9hhws46lt6329pv2gtx2ay0503hgems/g18.TokenCount()"

Result

TokenMetadata

func TokenMetadata(tid grc721.TokenID) (grc721.Metadata, error)

Param

Command

gnokey query vm/qeval -remote "https://rpc.pearl.testnets.gno.land" -data "gno.land/r/g17cjym5e9hhws46lt6329pv2gtx2ay0503hgems/g18.TokenMetadata()"

Result

TokenSummary

func TokenSummary(tid grc721.TokenID) (string, error)

TokenSummary returns tid, its current owner, and its metadata's name/description/image/externalURL/attributes as one line: fields separated by "|", each value (other than the plain tokenID/owner) base64-encoded. Base64 rather than plain text specifically so a description or name containing "|", a newline, or anything else can never be mistaken for a field boundary -- a plain-text delimited format would be one user-supplied "|" away from corrupting whatever parses it. Meant for simple off-chain UIs (this project's own web/ console) to build a gallery view without decoding Gno's own struct value syntax.

Param

Command

gnokey query vm/qeval -remote "https://rpc.pearl.testnets.gno.land" -data "gno.land/r/g17cjym5e9hhws46lt6329pv2gtx2ay0503hgems/g18.TokenSummary()"

Result

TokenURI

func TokenURI(tid grc721.TokenID) (string, error)

Param

Command

gnokey query vm/qeval -remote "https://rpc.pearl.testnets.gno.land" -data "gno.land/r/g17cjym5e9hhws46lt6329pv2gtx2ay0503hgems/g18.TokenURI()"

Result

TotalBurned

func TotalBurned() int64

TotalBurned reports how many tokens this realm has ever burned.

Command

gnokey query vm/qeval -remote "https://rpc.pearl.testnets.gno.land" -data "gno.land/r/g17cjym5e9hhws46lt6329pv2gtx2ay0503hgems/g18.TotalBurned()"

Result

TransferFrom

func TransferFrom(cur realm, from, to address, tid grc721.TokenID)

Params

Command

# WARNING: This command is running in an INSECURE mode.
# It is strongly recommended to use a hardware device for signing
# and avoid trusting any computer connected to the internet,
# as your private keys could be exposed.

gnokey maketx call -pkgpath "gno.land/r/g17cjym5e9hhws46lt6329pv2gtx2ay0503hgems/g18" -func "TransferFrom" -args $'' -args $'' -args $'' -gas-fee 1000000ugnot -gas-wanted 1_000_000_000 -send "" -chainid "pearl-1" -remote "https://rpc.pearl.testnets.gno.land" ADDRESSgnokey query -remote "https://rpc.pearl.testnets.gno.land" auth/accounts/ADDRESS
gnokey maketx call -pkgpath "gno.land/r/g17cjym5e9hhws46lt6329pv2gtx2ay0503hgems/g18" -func "TransferFrom" -args $'' -args $'' -args $'' -gas-fee 1000000ugnot -gas-wanted 1_000_000_000 -send "" -broadcast=false ADDRESS > call.tx
gnokey sign -tx-path call.tx -chainid "pearl-1" -account-number ACCOUNTNUMBER -account-sequence SEQUENCENUMBER ADDRESS
gnokey broadcast -remote "https://rpc.pearl.testnets.gno.land" call.tx
  

WalletSummary

func WalletSummary(owner address, startIdx int64) (summary string, nextIdx int64)

WalletSummary is CollectionSummary filtered to tokens currently owned by owner, scanning at most walletScanChunk of mintedIDs starting at startIdx (0-based, newest-first ordering -- same as CollectionSummary). Returns the matching TokenSummary lines found in that window plus nextIdx to resume the scan from; nextIdx == TokenCount() once nothing is left to check. A caller that wants "all of this wallet's tokens" calls repeatedly with nextIdx until it stops advancing -- the same chunked-calls pattern this collection's migrate/deliver flows already use for writes, applied here to a read that can no longer be a single unbounded call.

Params

Command

gnokey query vm/qeval -remote "https://rpc.pearl.testnets.gno.land" -data "gno.land/r/g17cjym5e9hhws46lt6329pv2gtx2ay0503hgems/g18.WalletSummary(,)"

Result

WithdrawFunds

func WithdrawFunds(cur realm, amountUgnot int64)

WithdrawFunds sends amount ugnot from this realm's own balance to the collection owner. Owner-only. Necessary because MintAssembled's payments accumulate in the realm's own account automatically (the chain credits it as part of processing the same message, before MintAssembled's code even runs) -- nothing forwards them onward without an explicit call like this.

Param

Command

# WARNING: This command is running in an INSECURE mode.
# It is strongly recommended to use a hardware device for signing
# and avoid trusting any computer connected to the internet,
# as your private keys could be exposed.

gnokey maketx call -pkgpath "gno.land/r/g17cjym5e9hhws46lt6329pv2gtx2ay0503hgems/g18" -func "WithdrawFunds" -args $'' -gas-fee 1000000ugnot -gas-wanted 1_000_000_000 -send "" -chainid "pearl-1" -remote "https://rpc.pearl.testnets.gno.land" ADDRESSgnokey query -remote "https://rpc.pearl.testnets.gno.land" auth/accounts/ADDRESS
gnokey maketx call -pkgpath "gno.land/r/g17cjym5e9hhws46lt6329pv2gtx2ay0503hgems/g18" -func "WithdrawFunds" -args $'' -gas-fee 1000000ugnot -gas-wanted 1_000_000_000 -send "" -broadcast=false ADDRESS > call.tx
gnokey sign -tx-path call.tx -chainid "pearl-1" -account-number ACCOUNTNUMBER -account-sequence SEQUENCENUMBER ADDRESS
gnokey broadcast -remote "https://rpc.pearl.testnets.gno.land" call.tx