Search Apps Documentation Source Content File Folder Download Copy Actions Download

users package

Functions

AddControllerAtGenesis

func AddControllerAtGenesis(_ realm, addr address)

AddControllerAtGenesis allows adding a controller during chain genesis (height 0). This is mostly useful for testing.

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/sys/users" -func "AddControllerAtGenesis" -args $'' -gas-fee 1000000ugnot -gas-wanted 1_000_000_000 -send "" -chainid "dev" -remote "https://api.gno.berty.io:443" ADDRESSgnokey query -remote "https://api.gno.berty.io:443" auth/accounts/ADDRESS
gnokey maketx call -pkgpath "gno.land/r/sys/users" -func "AddControllerAtGenesis" -args $'' -gas-fee 1000000ugnot -gas-wanted 1_000_000_000 -send "" -broadcast=false ADDRESS > call.tx
gnokey sign -tx-path call.tx -chainid "dev" -account-number ACCOUNTNUMBER -account-sequence SEQUENCENUMBER ADDRESS
gnokey broadcast -remote "https://api.gno.berty.io:443" call.tx
  

Canonicalize

func Canonicalize(name string) string

Canonicalize returns the canonical form of a name. The substitutions collapse single-character visual confusables that arise across the allowed [a-z0-9] character set, and strip the three separators that can sneak between identical alphanumeric runs.

  • {l, i, 1} → i
  • {0, o} → o
  • {-, ., _} → stripped
  • all other characters unchanged

CONTRACT: stable. Future controllers that want to share this canonical namespace MUST use this exact function — do not roll your own. Adding new substitutions later is a breaking change because it would silently re-key existing entries in canonicalStore.

Input contract: ASCII-only. r/sys/users.validateName already rejects non-ASCII at the registration boundary, so by the time a name reaches Canonicalize through the standard write path it is guaranteed to be ASCII. Direct callers from other realms must honor this contract; non-ASCII bytes are passed through as-is and will produce undefined collision behavior.

Multi-char confusables (m↔rn, nn↔m, cl↔d) are NOT canonicalized. They require fixed-point substring substitution rounds, which is out of scope for the unified store.

Pure: no state access. Safe to call from anywhere.

Param

Command

gnokey query vm/qeval -remote "https://api.gno.berty.io:443" -data "gno.land/r/sys/users.Canonicalize()"

Result

GetReadOnlyNameStore

func GetReadOnlyNameStore() *rotree.ReadOnlyTree

GetReadOnlyNameStore exposes the name store in readonly mode

Command

gnokey query vm/qeval -remote "https://api.gno.berty.io:443" -data "gno.land/r/sys/users.GetReadOnlyNameStore()"

Result

GetReadonlyAddrStore

func GetReadonlyAddrStore() *rotree.ReadOnlyTree

GetReadonlyAddrStore exposes the address store in readonly mode

Command

gnokey query vm/qeval -remote "https://api.gno.berty.io:443" -data "gno.land/r/sys/users.GetReadonlyAddrStore()"

Result

IsCanonicalTaken

func IsCanonicalTaken(name string) (existing string, taken bool)

IsCanonicalTaken reports whether the given name's canonical form is already registered. Pass the raw name; canonicalization is applied internally. The first return is the original (non-canonical) name that owns the canonical key, for UX in collision messages.

When a bypass write (RegisterUserIgnoreCanonical or the bypass path through ProposeRegisterUser/ProposeUpdateName) overwrites a prior canonical entry, this returns the most-recently-written original.

Param

Command

gnokey query vm/qeval -remote "https://api.gno.berty.io:443" -data "gno.land/r/sys/users.IsCanonicalTaken()"

Result

IsController

func IsController(addr address) bool

IsController reports whether the given address is currently in the controller whitelist. Returns the same boolean that gating checks (RegisterUser, UpdateName, Delete) use internally — useful for off-chain monitoring and for governance proposals to inspect state before voting.

Param

Command

gnokey query vm/qeval -remote "https://api.gno.berty.io:443" -data "gno.land/r/sys/users.IsController()"

Result

IsNameTaken

func IsNameTaken(name string) bool

IsNameTaken reports whether the exact-string name exists in nameStore. Returns true for any name ever registered, including:

  • active registrations
  • tombstoned (deleted) users' names — Delete() sets `deleted=true` but does not remove the nameStore entry (anti-revival policy)
  • old aliases from renames — UpdateName inserts the new name alongside the old; the old key stays (anti-rename-squat policy)

In short: IsNameTaken(name) answers "would RegisterUser(name, _) fail with ErrNameTaken?" — same answer for active, deleted, or aliased-away names. Pairs with IsCanonicalTaken (canonical-match) and ResolveName (active-current-user lookup with full UserData).

No canonicalization is applied. For controllers that want exact- match uniqueness without pulling in canonical-collision logic.

Param

Command

gnokey query vm/qeval -remote "https://api.gno.berty.io:443" -data "gno.land/r/sys/users.IsNameTaken()"

Result

ProposeControllerAdditionAndRemoval

func ProposeControllerAdditionAndRemoval(toAdd, toRemove address) dao.ProposalRequest

ProposeControllerAdditionAndRemoval allows GovDAO to add a new caller and remove an old caller in the same proposal.

Params

Command

gnokey query vm/qeval -remote "https://api.gno.berty.io:443" -data "gno.land/r/sys/users.ProposeControllerAdditionAndRemoval(,)"

Result

ProposeControllerRemoval

func ProposeControllerRemoval(addr address) dao.ProposalRequest

ProposeControllerRemoval allows GovDAO to add a whitelisted caller

Param

Command

gnokey query vm/qeval -remote "https://api.gno.berty.io:443" -data "gno.land/r/sys/users.ProposeControllerRemoval()"

Result

ProposeDeleteUser

func ProposeDeleteUser(addr address) dao.ProposalRequest

ProposeDeleteUser allows GovDAO to delete a user without checking controllers

Param

Command

gnokey query vm/qeval -remote "https://api.gno.berty.io:443" -data "gno.land/r/sys/users.ProposeDeleteUser()"

Result

ProposeNewController

func ProposeNewController(addr address) dao.ProposalRequest

ProposeNewController allows GovDAO to add a whitelisted caller

Param

Command

gnokey query vm/qeval -remote "https://api.gno.berty.io:443" -data "gno.land/r/sys/users.ProposeNewController()"

Result

ProposeRegisterUser

func ProposeRegisterUser(name string, addr address) dao.ProposalRequest

ProposeRegisterUser allows GovDAO to register a name without checking controllers. The executor closure runs with ignoreCanonical=true (decision #3): DAO grants always bypass canonical-collision detection. Voters see any collision in the proposal description and can vote NO if unintended.

Params

Command

gnokey query vm/qeval -remote "https://api.gno.berty.io:443" -data "gno.land/r/sys/users.ProposeRegisterUser(,)"

Result

ProposeUpdateName

func ProposeUpdateName(addr address, newName string) dao.ProposalRequest

ProposeUpdateName allows GovDAO to update a name with an alias without checking controllers. Like ProposeRegisterUser, the executor runs with ignoreCanonical=true (decision #3).

Params

Command

gnokey query vm/qeval -remote "https://api.gno.berty.io:443" -data "gno.land/r/sys/users.ProposeUpdateName(,)"

Result

RegisterUser

func RegisterUser(cur realm, name string, address_XXX address) error

RegisterUser adds a new user to the system. Enforces canonical- collision detection: a name whose Canonicalize-form matches a prior registration returns ErrCanonicalCollision.

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/sys/users" -func "RegisterUser" -args $'' -args $'' -gas-fee 1000000ugnot -gas-wanted 1_000_000_000 -send "" -chainid "dev" -remote "https://api.gno.berty.io:443" ADDRESSgnokey query -remote "https://api.gno.berty.io:443" auth/accounts/ADDRESS
gnokey maketx call -pkgpath "gno.land/r/sys/users" -func "RegisterUser" -args $'' -args $'' -gas-fee 1000000ugnot -gas-wanted 1_000_000_000 -send "" -broadcast=false ADDRESS > call.tx
gnokey sign -tx-path call.tx -chainid "dev" -account-number ACCOUNTNUMBER -account-sequence SEQUENCENUMBER ADDRESS
gnokey broadcast -remote "https://api.gno.berty.io:443" call.tx
  

RegisterUserIgnoreCanonical

func RegisterUserIgnoreCanonical(cur realm, name string, address_XXX address) error

RegisterUserIgnoreCanonical is the bypass path: same controller- whitelist gate, but ErrCanonicalCollision is suppressed. The canonical store is still written; a prior entry with the same canonical key is silently overwritten (decision #14, later-wins). Use sparingly — names registered here can canonical-collide with existing ones, weakening confusable protection for everyone.

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/sys/users" -func "RegisterUserIgnoreCanonical" -args $'' -args $'' -gas-fee 1000000ugnot -gas-wanted 1_000_000_000 -send "" -chainid "dev" -remote "https://api.gno.berty.io:443" ADDRESSgnokey query -remote "https://api.gno.berty.io:443" auth/accounts/ADDRESS
gnokey maketx call -pkgpath "gno.land/r/sys/users" -func "RegisterUserIgnoreCanonical" -args $'' -args $'' -gas-fee 1000000ugnot -gas-wanted 1_000_000_000 -send "" -broadcast=false ADDRESS > call.tx
gnokey sign -tx-path call.tx -chainid "dev" -account-number ACCOUNTNUMBER -account-sequence SEQUENCENUMBER ADDRESS
gnokey broadcast -remote "https://api.gno.berty.io:443" call.tx
  

Render

func Render(_ string) string

Param

Command

gnokey query vm/qeval -remote "https://api.gno.berty.io:443" -data "gno.land/r/sys/users.Render()"

Result

NewErrNotWhitelisted

func NewErrNotWhitelisted() ErrNotWhitelisted

Command

gnokey query vm/qeval -remote "https://api.gno.berty.io:443" -data "gno.land/r/sys/users.NewErrNotWhitelisted()"

Result

ResolveAddress

func ResolveAddress(addr address) *UserData

ResolveAddress returns the latest UserData of a specific user by address

Param

Command

gnokey query vm/qeval -remote "https://api.gno.berty.io:443" -data "gno.land/r/sys/users.ResolveAddress()"

Result

ResolveAny

func ResolveAny(input string) (*UserData, bool)

ResolveAny tries to resolve any given string to *UserData If the input is not found in the registry in any form, nil is returned

Param

Command

gnokey query vm/qeval -remote "https://api.gno.berty.io:443" -data "gno.land/r/sys/users.ResolveAny()"

Result

ResolveName

func ResolveName(name string) (data *UserData, isCurrent bool)

ResolveName returns the latest UserData of a specific user by name or alias

Param

Command

gnokey query vm/qeval -remote "https://api.gno.berty.io:443" -data "gno.land/r/sys/users.ResolveName()"

Result