1package hlmailbox23import (4 "strconv"5 "strings"67 "gno.land/p/nt/avl/v0"8 "gno.land/p/g1zdaz6sypk5tdsjc2fzsqrrn4ttn8qzmnl4waqp/decisions/v0"9 hl "gno.land/p/g1zdaz6sypk5tdsjc2fzsqrrn4ttn8qzmnl4waqp/hyperlane/v0"10)1112const (13 pageMax = 20 // messages a "msgs/" page holds14 verifiersMax = 20 // registered verifier paths (and announced successors) the page and "json" name, and a "verifiers/" ("successors/") page holds15)1617// Render:18//19// "" the mailbox's page: the launch values live or waiting, verifiers, signers, seats, flags20// "decisions" the decisions page: the last 100 pending and executed per kind21// "json" domain, hook, count, root, live, signers, verifiers (the first 20 registered paths and the22// count), seats, flags, routes (each with its predecessor and successor, and the height and23// time of the kind 6 that enrolled it on Solana: enrolled, enrolledAt), successors (the24// first 20 announced paths, the count, and successorRoutes: the route each announced for),25// for the agents26// "decisions.json" every decision, as a JSON array27// "msg/<nonce>" one dispatched message: {"nonce","id","root","height","message"}; "null" if none28// "msgs/<from>" up to 20 messages from nonce <from> on, as a JSON array29// "verifiers/<from>" up to 20 registered verifier paths from offset <from> on, in path order, as a JSON array30// "successors/<from>" up to 20 announced successor paths from offset <from> on, in path order, as a JSON array31// "delivered/<id>" the block height a message id (hex) was delivered at here, 0 if never32func Render(path string) string {33 switch {34 case path == "":35 return page()36 case path == "decisions":37 return "# Decisions\n\n" + ledger.Page()38 case path == "json":39 return summaryJSON()40 case path == "decisions.json":41 return ledger.JSON()42 case strings.HasPrefix(path, "msg/"):43 n, ok := parseNonce(path[len("msg/"):])44 if !ok {45 return "null"46 }47 return msgJSON(n)48 case strings.HasPrefix(path, "msgs/"):49 from, ok := parseNonce(path[len("msgs/"):])50 if !ok {51 return "[]"52 }53 var b strings.Builder54 b.WriteString("[")55 for i := uint32(0); i < pageMax && uint64(from)+uint64(i) < uint64(tree.Count); i++ {56 if i > 0 {57 b.WriteString(",")58 }59 b.WriteString(msgJSON(from + i))60 }61 b.WriteString("]")62 return b.String()63 case strings.HasPrefix(path, "verifiers/"):64 from, ok := parseNonce(path[len("verifiers/"):])65 if !ok {66 return "[]"67 }68 return pathsJSON(&verifiers, int(from))69 case strings.HasPrefix(path, "successors/"):70 from, ok := parseNonce(path[len("successors/"):])71 if !ok {72 return "[]"73 }74 return pathsJSON(&successors, int(from))75 case strings.HasPrefix(path, "delivered/"):76 return strconv.FormatInt(Delivered(path[len("delivered/"):]), 10)77 }78 return "unknown path; see the mailbox's page"79}8081func parseNonce(s string) (uint32, bool) {82 n, err := strconv.ParseUint(s, 10, 32)83 return uint32(n), err == nil84}8586func q(s string) string { return strconv.Quote(s) }8788func msgJSON(n uint32) string {89 v := sent.Get(nonceKey(n))90 if v == nil {91 return "null"92 }93 s := v.(*sentMsg)94 id := hl.ID([]byte(s.raw))95 return "{\"nonce\":" + u32(n) + ",\"id\":" + q(hx(id[:])) + ",\"root\":" + q(hx(s.root[:])) +96 ",\"height\":" + strconv.FormatInt(s.height, 10) + ",\"message\":" + q(hx([]byte(s.raw))) + "}"97}9899func keysJSON(ks []Key) string {100 parts := make([]string, len(ks))101 for i, k := range ks {102 parts[i] = q(hx(k[:]))103 }104 return "[" + strings.Join(parts, ",") + "]"105}106107// pathsJSON is up to verifiersMax keys of a tree of pkgpaths (the registered verifiers, the announced successors)108// from offset from on, in path order: the listing is bounded whatever the count, since nothing is ever removed.109func pathsJSON(t *avl.Tree, from int) string {110 var b strings.Builder111 b.WriteString("[")112 first := true113 t.IterateByOffset(from, verifiersMax, func(k string, _ any) bool {114 if !first {115 b.WriteString(",")116 }117 first = false118 b.WriteString(q(k))119 return false120 })121 b.WriteString("]")122 return b.String()123}124125// pathsLine is a tree of pkgpaths on the page: the first verifiersMax in path order and, past them, where the rest126// are (page is the Render path that pages them); "none" for an empty tree.127func pathsLine(t *avl.Tree, page string) string {128 n := t.Size()129 if n == 0 {130 return "none"131 }132 var b strings.Builder133 i := 0134 t.IterateByOffset(0, verifiersMax, func(k string, _ any) bool {135 if i > 0 {136 b.WriteString(", ")137 }138 i++139 b.WriteString("`" + k + "`")140 return false141 })142 if n > verifiersMax {143 m := strconv.Itoa(verifiersMax)144 b.WriteString(", … (the first " + m + "; the rest at [" + page + "/" + m + "](" + pkgPathLink() + ":" + page + "/" + m + "))")145 }146 return b.String()147}148149func summaryJSON() string {150 var b strings.Builder151 b.WriteString("{\"domain\":" + u32(localDomain) + ",\"hook\":" + q(Hook()) + ",\"address\":" + q(string(Address())) +152 ",\"count\":" + u32(tree.Count) + ",\"root\":" + q(Root()) + ",\"delivered\":" + strconv.Itoa(done.Size()) +153 ",\"live\":" + strconv.FormatBool(live) + ",\"launchedAt\":" + strconv.FormatInt(launchedAt, 10) +154 "," + decisions.GovernorJSON(launchGovernor, yielded) +155 ",\"launchOrigin\":" + u32(launchOrigin) + ",\"clocks\":" + decisions.ClocksJSON() + ",\"decisions\":" + strconv.FormatInt(ledger.Last(), 10) +156 ",\"signers\":{\"keys\":" + keysJSON(signerKeys) + ",\"threshold\":" + strconv.Itoa(signerRule.Threshold) +157 ",\"groupA\":" + keysJSON(signerRule.GroupA) + ",\"groupB\":" + keysJSON(signerRule.GroupB) + "}" +158 ",\"verifiers\":{")159 first := true160 active.Iterate("", "", func(k string, v any) bool {161 origin, _ := strconv.ParseUint(k, 10, 32)162 if !first {163 b.WriteString(",")164 }165 first = false166 b.WriteString(q(strconv.FormatUint(origin, 10)) + ":{\"pkgpath\":" + q(v.(string)) + ",\"registered\":" + strconv.FormatBool(verifiers.Has(v.(string))) + "}")167 return false168 })169 b.WriteString("},\"registered\":" + pathsJSON(&verifiers, 0) + ",\"registeredCount\":" + strconv.Itoa(verifiers.Size()) + ",\"seats\":[")170 for i := 1; i <= seatCount; i++ {171 if i > 1 {172 b.WriteString(",")173 }174 b.WriteString(q(string(seats[i])))175 }176 b.WriteString("],\"routes\":{")177 first = true178 routes.Iterate("", "", func(k string, v any) bool {179 r := v.(*routeRec)180 if !first {181 b.WriteString(",")182 }183 first = false184 b.WriteString(q(k) + ":{\"epoch\":" + strconv.FormatInt(r.epoch, 10) + ",\"epochAt\":" + strconv.FormatInt(r.epochAt, 10) +185 ",\"sends\":" + strconv.FormatBool(Paused(k, FnSends)) + ",\"credits\":" + strconv.FormatBool(Paused(k, FnCredits)) +186 ",\"payouts\":" + strconv.FormatBool(Paused(k, FnPayouts)) + ",\"flags\":[")187 for i, f := range Flags(k) {188 if i > 0 {189 b.WriteString(",")190 }191 b.WriteString(q(f))192 }193 b.WriteString("],\"predecessor\":" + q(r.predecessor) + ",\"successor\":" + q(r.successor) +194 ",\"enrolled\":" + strconv.FormatInt(r.enrolled, 10) + ",\"enrolledAt\":" + strconv.FormatInt(r.enrolledAt, 10) +195 ",\"pulled\":" + strconv.FormatBool(r.pulled) + ",\"dropped\":" + quotedJSON(r.dropped) + "}")196 return false197 })198 b.WriteString("},\"droppedRoutes\":" + droppedRoutesJSON() + ",\"successors\":" + pathsJSON(&successors, 0) + ",\"successorCount\":" + strconv.Itoa(successors.Size()) + ",\"successorRoutes\":" + successorRoutesJSON() + "}")199 return b.String()200}201202// quotedJSON is a list of strings as a JSON array.203func quotedJSON(ss []string) string {204 parts := make([]string, len(ss))205 for i, s := range ss {206 parts[i] = q(s)207 }208 return "[" + strings.Join(parts, ",") + "]"209}210211// droppedRoutesJSON is every dropped successor (R35) with the predecessor whose re-point dropped it, as an object212// of pkgpath → pkgpath: the tombstones, bounded by the migrations a bridge sees in its life.213func droppedRoutesJSON() string {214 var b strings.Builder215 b.WriteString("{")216 first := true217 droppedRoutes.Iterate("", "", func(k string, v any) bool {218 if !first {219 b.WriteString(",")220 }221 first = false222 b.WriteString(q(k) + ":" + q(v.(string)))223 return false224 })225 b.WriteString("}")226 return b.String()227}228229// droppedLine is the dropped successors on the page, each with the predecessor that re-pointed away from it; ""230// when none.231func droppedLine() string {232 if droppedRoutes.Size() == 0 {233 return ""234 }235 var parts []string236 droppedRoutes.Iterate("", "", func(k string, v any) bool {237 parts = append(parts, "`"+k+"` (by `"+v.(string)+"`)")238 return false239 })240 return "- dropped (routes no more, re-pointed away): " + strings.Join(parts, ", ") + "\n"241}242243// successorRoutesJSON is the first verifiersMax announced successors with the route each announced for (AQ5), as244// an object of pkgpath → "GNOT" or "BUBBLE".245func successorRoutesJSON() string {246 var b strings.Builder247 b.WriteString("{")248 first := true249 successors.IterateByOffset(0, verifiersMax, func(k string, v any) bool {250 if !first {251 b.WriteString(",")252 }253 first = false254 b.WriteString(q(k) + ":" + q(v.(string)))255 return false256 })257 b.WriteString("}")258 return b.String()259}260261// successorsLine is the announced successors on the page, each with the route it announced for (AQ5): the first262// verifiersMax in path order and, past them, where the rest are; "none" for an empty tree.263func successorsLine() string {264 n := successors.Size()265 if n == 0 {266 return "none"267 }268 var b strings.Builder269 i := 0270 successors.IterateByOffset(0, verifiersMax, func(k string, v any) bool {271 if i > 0 {272 b.WriteString(", ")273 }274 i++275 b.WriteString("`" + k + "` (" + v.(string) + ")")276 return false277 })278 if n > verifiersMax {279 m := strconv.Itoa(verifiersMax)280 b.WriteString(", … (the first " + m + "; the rest at [successors/" + m + "](" + pkgPathLink() + ":successors/" + m + "))")281 }282 return b.String()283}284285func page() string {286 var b strings.Builder287 b.WriteString("# The bridge's mailbox\n\n")288 b.WriteString("gno.land's end of the GNOT and BUBBLE bridge to Solana: messages out to Solana (the Dispatch event the light client proves), and in from it under the active verifier. Every setting here moves only by a decision made with this realm's builders — the governor's own until it yields, a GovDAO proposal after; the guardians and watch keys can only pause.\n\n")289 if live {290 b.WriteString("- **live** since " + strconv.FormatInt(launchedAt, 10) + " (the Launch decision executed)\n")291 } else {292 b.WriteString("- **not launched**: the values below are the compiled launch values, waiting for the Launch decision; the routes refuse sends and credits. A passed Launch executes within 14 days of its proposal, like every decision; one nobody executed by then lapses and is proposed again\n")293 }294 b.WriteString("- " + decisions.GovernorLine(launchGovernor, yielded) + "\n")295 b.WriteString("- a proposal made with a builder (of this realm, a route, r/hlfees or r/hlgov) is executed with r/gov/dao's `ExecuteOrRejectProposal`: the one error a closure returns — the 14-day deadline — then denies it for good; under `ExecuteProposal` that error reverts the transaction instead and the proposal stands, every retry failing the same way. Anything else a closure refuses is a panic, which leaves the proposal for a retry under either call\n")296 b.WriteString("- domain: " + u32(localDomain) + "; Solana: " + u32(launchOrigin) + "\n")297 b.WriteString("- " + decisions.Clocks() + "\n")298 b.WriteString("- merkle tree hook: `" + Hook() + "`\n")299 b.WriteString("- messages out: " + u32(tree.Count) + ", root `" + Root() + "`; in: " + strconv.Itoa(done.Size()) + "\n")300 b.WriteString("- decisions: " + strconv.FormatInt(ledger.Last(), 10) + " ([page](" + pkgPathLink() + ":decisions))\n")301 b.WriteString("\n## Verifiers\n\n")302 active.Iterate("", "", func(k string, v any) bool {303 origin, _ := strconv.ParseUint(k, 10, 32)304 note := ""305 if !verifiers.Has(v.(string)) {306 note = " (**not registered**: nothing from this origin is taken until it is)"307 }308 b.WriteString("- from " + strconv.FormatUint(origin, 10) + ": `" + v.(string) + "`" + note + "\n")309 return false310 })311 b.WriteString("- registered (" + strconv.Itoa(verifiers.Size()) + "): " + pathsLine(&verifiers, "verifiers"))312 b.WriteString("\n\n## Signers\n\n- rule: " + signerRule.String() + "\n")313 for i, k := range signerKeys {314 b.WriteString("- " + strconv.Itoa(i) + ": `" + hx(k[:]) + "`\n")315 }316 b.WriteString("\n## Seats\n\n")317 for i := 1; i <= seatCount; i++ {318 kind := "guardian"319 if !IsGuardianSeat(i) {320 kind = "watch key"321 }322 a := string(seats[i])323 if a == "" {324 a = "(empty)"325 }326 b.WriteString("- seat " + strconv.Itoa(i) + " (" + kind + "): " + a + "\n")327 }328 b.WriteString("\n## Routes and flags\n\n")329 routes.Iterate("", "", func(k string, v any) bool {330 r := v.(*routeRec)331 b.WriteString("- `" + k + "`: payouts epoch " + strconv.FormatInt(r.epoch, 10))332 if r.predecessor != "" {333 b.WriteString(", successor of `" + r.predecessor + "`")334 }335 if r.pulled {336 b.WriteString(", page 0 pulled")337 }338 if r.successor != "" {339 b.WriteString(", migrated to `" + r.successor + "`")340 }341 if len(r.dropped) > 0 {342 b.WriteString(", dropped `" + strings.Join(r.dropped, "`, `") + "`")343 }344 if r.enrolled != 0 {345 b.WriteString(", enrolled on Solana by kind 6 at height " + strconv.FormatInt(r.enrolled, 10) + " (" + strconv.FormatInt(r.enrolledAt, 10) + ")")346 }347 fs := Flags(k)348 if len(fs) == 0 {349 b.WriteString(", no flag\n")350 } else {351 b.WriteString("\n")352 for _, f := range fs {353 b.WriteString(" - **paused** " + f + "\n")354 }355 }356 return false357 })358 b.WriteString(droppedLine())359 b.WriteString("- successors announced (" + strconv.Itoa(successors.Size()) + "): " + successorsLine() + " (a route's migrate names only one of them, announced for its own route)\n")360 if tree.Count > 0 {361 b.WriteString("\n## Latest out\n\n")362 sent.ReverseIterateByOffset(0, 10, func(k string, v any) bool {363 s := v.(*sentMsg)364 m, _ := hl.ParseMessage([]byte(s.raw))365 id := hl.ID([]byte(s.raw))366 b.WriteString("- #" + u32(m.Nonce) + " to " + u32(m.Destination) + " at block " + strconv.FormatInt(s.height, 10) + ": `" + hx(id[:]) + "`\n")367 return false368 })369 }370 return b.String()371}372373func pkgPathLink() string { return strings.TrimPrefix(pkgPath, "gno.land") }374ActiveVerifier(origin uint32) string
Address() string
AddRoute(cur interface {.seal func(); Address func() .uverse.address; IsCode func() bool; IsCurrent func() bool; IsEphemeral func() bool; IsUser func() bool; IsUserCall func() bool; IsUserRun func() bool; PkgPath func() string; Previous func() .uverse.realm; String func() string; Sub func(string) .uverse.realm; Subpath func() string}, path string)
AnnounceSuccessor(cur interface {.seal func(); Address func() .uverse.address; IsCode func() bool; IsCurrent func() bool; IsEphemeral func() bool; IsUser func() bool; IsUserCall func() bool; IsUserRun func() bool; PkgPath func() string; Previous func() .uverse.realm; String func() string; Sub func(string) .uverse.realm; Subpath func() string}, symbol string)
ClearEnrolled(cur interface {.seal func(); Address func() .uverse.address; IsCode func() bool; IsCurrent func() bool; IsEphemeral func() bool; IsUser func() bool; IsUserCall func() bool; IsUserRun func() bool; PkgPath func() string; Previous func() .uverse.realm; String func() string; Sub func(string) .uverse.realm; Subpath func() string}, path string)
ClearFlag(cur interface {.seal func(); Address func() .uverse.address; IsCode func() bool; IsCurrent func() bool; IsEphemeral func() bool; IsUser func() bool; IsUserCall func() bool; IsUserRun func() bool; PkgPath func() string; Previous func() .uverse.realm; String func() string; Sub func(string) .uverse.realm; Subpath func() string}, route string, fn string)
ClearFlags(cur interface {.seal func(); Address func() .uverse.address; IsCode func() bool; IsCurrent func() bool; IsEphemeral func() bool; IsUser func() bool; IsUserCall func() bool; IsUserRun func() bool; PkgPath func() string; Previous func() .uverse.realm; String func() string; Sub func(string) .uverse.realm; Subpath func() string}, fn string) bool
Count() uint32
Delivered(id string) int64
Dispatch(cur interface {.seal func(); Address func() .uverse.address; IsCode func() bool; IsCurrent func() bool; IsEphemeral func() bool; IsUser func() bool; IsUserCall func() bool; IsUserRun func() bool; PkgPath func() string; Previous func() .uverse.realm; String func() string; Sub func(string) .uverse.realm; Subpath func() string}, destination uint32, recipient [32]uint8, body []uint8) [32]uint8
Dropped(path string) string
DroppedRoutes() []string
Enrolled(path string) (height int64, at int64)
Execute(cur interface {.seal func(); Address func() .uverse.address; IsCode func() bool; IsCurrent func() bool; IsEphemeral func() bool; IsUser func() bool; IsUserCall func() bool; IsUserRun func() bool; PkgPath func() string; Previous func() .uverse.realm; String func() string; Sub func(string) .uverse.realm; Subpath func() string}, id int64)
Flagged(route string, id string, height int64, verifier bool) bool
Flags(route string) []string
Govern(cur interface {.seal func(); Address func() .uverse.address; IsCode func() bool; IsCurrent func() bool; IsEphemeral func() bool; IsUser func() bool; IsUserCall func() bool; IsUserRun func() bool; PkgPath func() string; Previous func() .uverse.realm; String func() string; Sub func(string) .uverse.realm; Subpath func() string}, r struct{proposal gno.land/r/gov/dao.ProposalRequest; text string; decide func(.uverse.realm) .uverse.error})
Governor() string
Hook() string
IsGuardianSeat(n int) bool
IsRoute(path string) bool
LaunchedAt() int64
LaunchOrigin() uint32
Live() bool
LocalDomain() uint32
MarkDone(cur interface {.seal func(); Address func() .uverse.address; IsCode func() bool; IsCurrent func() bool; IsEphemeral func() bool; IsUser func() bool; IsUserCall func() bool; IsUserRun func() bool; PkgPath func() string; Previous func() .uverse.realm; String func() string; Sub func(string) .uverse.realm; Subpath func() string}, id string)
Message(nonce uint32) (message string, root string)
NewCancelRequest(cur interface {.seal func(); Address func() .uverse.address; IsCode func() bool; IsCurrent func() bool; IsEphemeral func() bool; IsUser func() bool; IsUserCall func() bool; IsUserRun func() bool; PkgPath func() string; Previous func() .uverse.realm; String func() string; Sub func(string) .uverse.realm; Subpath func() string}, id int64) struct{proposal gno.land/r/gov/dao.ProposalRequest; text string; decide func(.uverse.realm) .uverse.error}
NewLaunchRequest(cur interface {.seal func(); Address func() .uverse.address; IsCode func() bool; IsCurrent func() bool; IsEphemeral func() bool; IsUser func() bool; IsUserCall func() bool; IsUserRun func() bool; PkgPath func() string; Previous func() .uverse.realm; String func() string; Sub func(string) .uverse.realm; Subpath func() string}) struct{proposal gno.land/r/gov/dao.ProposalRequest; text string; decide func(.uverse.realm) .uverse.error}
NewRotateSeatsRequest(cur interface {.seal func(); Address func() .uverse.address; IsCode func() bool; IsCurrent func() bool; IsEphemeral func() bool; IsUser func() bool; IsUserCall func() bool; IsUserRun func() bool; PkgPath func() string; Previous func() .uverse.realm; String func() string; Sub func(string) .uverse.realm; Subpath func() string}, changes string) struct{proposal gno.land/r/gov/dao.ProposalRequest; text string; decide func(.uverse.realm) .uverse.error}
NewRotateSignersRequest(cur interface {.seal func(); Address func() .uverse.address; IsCode func() bool; IsCurrent func() bool; IsEphemeral func() bool; IsUser func() bool; IsUserCall func() bool; IsUserRun func() bool; PkgPath func() string; Previous func() .uverse.realm; String func() string; Sub func(string) .uverse.realm; Subpath func() string}, keys string, threshold int, groupA string, groupB string) struct{proposal gno.land/r/gov/dao.ProposalRequest; text string; decide func(.uverse.realm) .uverse.error}
NewSetVerifierRequest(cur interface {.seal func(); Address func() .uverse.address; IsCode func() bool; IsCurrent func() bool; IsEphemeral func() bool; IsUser func() bool; IsUserCall func() bool; IsUserRun func() bool; PkgPath func() string; Previous func() .uverse.realm; String func() string; Sub func(string) .uverse.realm; Subpath func() string}, origin uint32, path string) struct{proposal gno.land/r/gov/dao.ProposalRequest; text string; decide func(.uverse.realm) .uverse.error}
NewUnpauseRequest(cur interface {.seal func(); Address func() .uverse.address; IsCode func() bool; IsCurrent func() bool; IsEphemeral func() bool; IsUser func() bool; IsUserCall func() bool; IsUserRun func() bool; PkgPath func() string; Previous func() .uverse.realm; String func() string; Sub func(string) .uverse.realm; Subpath func() string}, routePath string, fns string, removeSeat int) struct{proposal gno.land/r/gov/dao.ProposalRequest; text string; decide func(.uverse.realm) .uverse.error}
NoteEnrolled(cur interface {.seal func(); Address func() .uverse.address; IsCode func() bool; IsCurrent func() bool; IsEphemeral func() bool; IsUser func() bool; IsUserCall func() bool; IsUserRun func() bool; PkgPath func() string; Previous func() .uverse.realm; String func() string; Sub func(string) .uverse.realm; Subpath func() string}, path string, height int64)
NotePulled(cur interface {.seal func(); Address func() .uverse.address; IsCode func() bool; IsCurrent func() bool; IsEphemeral func() bool; IsUser func() bool; IsUserCall func() bool; IsUserRun func() bool; PkgPath func() string; Previous func() .uverse.realm; String func() string; Sub func(string) .uverse.realm; Subpath func() string}, path string)
Paused(route string, fn string) bool
PayoutsEpoch(route string) (epoch int64, at int64)
Predecessor(path string) string
Process(cur interface {.seal func(); Address func() .uverse.address; IsCode func() bool; IsCurrent func() bool; IsEphemeral func() bool; IsUser func() bool; IsUserCall func() bool; IsUserRun func() bool; PkgPath func() string; Previous func() .uverse.realm; String func() string; Sub func(string) .uverse.realm; Subpath func() string}, metadata []uint8, message []uint8) (origin uint32, sender [32]uint8, body []uint8)
Pulled(path string) bool
Reemit(cur interface {.seal func(); Address func() .uverse.address; IsCode func() bool; IsCurrent func() bool; IsEphemeral func() bool; IsUser func() bool; IsUserCall func() bool; IsUserRun func() bool; PkgPath func() string; Previous func() .uverse.realm; String func() string; Sub func(string) .uverse.realm; Subpath func() string}, nonce uint32)
RegisterVerifier(cur interface {.seal func(); Address func() .uverse.address; IsCode func() bool; IsCurrent func() bool; IsEphemeral func() bool; IsUser func() bool; IsUserCall func() bool; IsUserRun func() bool; PkgPath func() string; Previous func() .uverse.realm; String func() string; Sub func(string) .uverse.realm; Subpath func() string}, v interface {Satisfiable func([]gno.land/r/g1zdaz6sypk5tdsjc2fzsqrrn4ttn8qzmnl4waqp/hlmailbox.Key) bool; Verify func(uint32, []uint8, []uint8) .uverse.error})
Render(path string) string
Root() string
Routes() []string
RouteSymbol(path string) string
Seat(n int) string
SeatOf(a string) int
SetFlag(cur interface {.seal func(); Address func() .uverse.address; IsCode func() bool; IsCurrent func() bool; IsEphemeral func() bool; IsUser func() bool; IsUserCall func() bool; IsUserRun func() bool; PkgPath func() string; Previous func() .uverse.realm; String func() string; Sub func(string) .uverse.realm; Subpath func() string}, route string, fn string, ids string)
SignerKeys() string
Signers() ([]gno.land/r/g1zdaz6sypk5tdsjc2fzsqrrn4ttn8qzmnl4waqp/hlmailbox.Key, struct{Threshold int; GroupA []gno.land/r/g1zdaz6sypk5tdsjc2fzsqrrn4ttn8qzmnl4waqp/hlmailbox.Key; GroupB []gno.land/r/g1zdaz6sypk5tdsjc2fzsqrrn4ttn8qzmnl4waqp/hlmailbox.Key})
Successor(path string) string
SuccessorAnnounced(path string) bool
SuccessorFor(path string) string
VacateSeat(cur interface {.seal func(); Address func() .uverse.address; IsCode func() bool; IsCurrent func() bool; IsEphemeral func() bool; IsUser func() bool; IsUserCall func() bool; IsUserRun func() bool; PkgPath func() string; Previous func() .uverse.realm; String func() string; Sub func(string) .uverse.realm; Subpath func() string}, seat int, holder string) bool
VerifierRegistered(path string) bool
Yield(cur interface {.seal func(); Address func() .uverse.address; IsCode func() bool; IsCurrent func() bool; IsEphemeral func() bool; IsUser func() bool; IsUserCall func() bool; IsUserRun func() bool; PkgPath func() string; Previous func() .uverse.realm; String func() string; Sub func(string) .uverse.realm; Subpath func() string})
Yielded() int64
Signatures reconstructed verbatim from vm/qfuncs — interface params keep their inline definitions.
vm/qrender output, sanitized (docs/render-security.md) and displayed in an empty-sandbox iframe — scripts, forms and popups cannot run. Links stay inert in-preview; right-click to open.