Transaction
A27A0831598B8E…7A3570384F6F
Block 26,114 · index 0 · indexed
Summary
- Hash
- A27A0831598B8E58248C259770F38869F23EBE1F2B6BBC6702E77A3570384F6F
- Block
- 26,114
- Size
- 4632 bytes
- Gas used
- 8,967,044 / 10,760,512
- Fee
- 1000000ugnot
- Memo
- gnopublish
- Status
- success
Messages
Arguments · 9
- #1soundexdemo
- #2README.md
- #3# Soundex > ⚠️ **Experimental — generated with no human supervision** by the daily MCP pipeline to exercise gno tooling. Not audited. See [r/moul/x/daily](https://github.com/moul/gno-contracts/blob/main/r/moul/x/daily/README.md). --- Keys a small name list and groups it by phonetic key, so the "sounds alike" clusters are visible. ``` /r/moul/x/daily/soundexdemo/v0 → the table + clusters /r/moul/x/daily/soundexdemo/v0:Ashcroft → one name's key ``` Demo of the [`p/moul/x/daily/soundex`](https://github.com/moul/gno-contracts/tree/main/p/moul/x/daily/soundex/v0) library — no phonetic logic lives here. Stateless, so `Render` is deterministic: names are grouped in **first-seen order**, never by iterating a map. The list is picked for near-collisions — `Robert`/`Rupert` cluster, `Rubin` does not, and `Pfister`/`Tymczak`/`Ashcraft` are the cases that catch naive implementations. Built for gno 0.9. <!-- BEGIN GNOCONTRACTS FOOTER (generated by `make readmes`; do not edit below) --> --- Part of **[moul/gno-contracts](https://github.com/moul/gno-contracts)** — moul's versioned gno.land contracts. See the repository for the full catalog, build/test tooling, and usage. **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](https://github.com/moul/gno-contracts/blob/main/DISCLAIMER.md). <!-- END GNOCONTRACTS FOOTER -->
- #4gnomod.toml
- #5module = "gno.land/r/moul/x/daily/soundexdemo/v0" gno = "0.9"
- #6soundexdemo.gno
- #7// Package soundexdemo is a small gnoweb demo of the Soundex phonetic algorithm // provided by the [p/moul/x/daily/soundex](/p/moul/x/daily/soundex/v0) library: // it groups a small name list by phonetic key so the "sounds alike" clusters // are visible. // // It contains no phonetic logic of its own. Stateless, so Render is // deterministic — names are grouped in first-seen order, never by iterating a // map. package soundexdemo import ( "strings" "gno.land/p/moul/x/daily/soundex/v0" ) // names include several deliberate near-collisions. var names = []string{ "Robert", "Rupert", "Rubin", "Ashcraft", "Ashcroft", "Tymczak", "Pfister", "Honeyman", } // Render renders the demo for gnoweb. // // Render("") / Render("/") -> the name table + clusters // Render("/<name>") -> that name's key func Render(path string) string { var b strings.Builder b.WriteString("# Soundex\n\n") b.WriteString("Phonetic keys for English names, demoing the ") b.WriteString("[`p/moul/x/daily/soundex`](/p/moul/x/daily/soundex/v0) library.\n\n") if q := parseArg(path); q != "" { k := soundex.Encode(q) b.WriteString("## `") b.WriteString(q) b.WriteString("`\n\n") if k == "" { b.WriteString("_No ASCII letters — no key._\n") } else { b.WriteString("key: **") b.WriteString(k) b.WriteString("** (normalized: `") b.WriteString(soundex.Normalize(q)) b.WriteString("`)\n") } return b.String() } b.WriteString("| name | key |\n|---|---|\n") for _, n := range names { b.WriteString("| ") b.WriteString(n) b.WriteString(" | `") b.WriteString(soundex.Encode(n)) b.WriteString("` |\n") } // group by key, preserving first-seen order (never iterate a map) b.WriteString("\n## Sounds alike\n\n") keys := []string{} byKey := map[string][]string{} for _, n := range names { k := soundex.Encode(n) if _, seen := byKey[k]; !seen { keys = append(keys, k) } byKey[k] = append(byKey[k], n) } for _, k := range keys { if len(byKey[k]) < 2 { continue } b.WriteString("- **") b.WriteString(k) b.WriteString("**: ") b.WriteString(strings.Join(byKey[k], ", ")) b.WriteString("\n") } b.WriteString("\n> A *blocking* key for finding candidates, never proof that two names match.\n") return b.String() } func parseArg(path string) string { s := strings.TrimSpace(path) s = strings.TrimPrefix(s, "/") if i := strings.IndexByte(s, '/'); i >= 0 { s = s[:i] } return s }
- #8/gno.MemPackageType
- #9 MPUserProd
Result log
msg:0,success:true,log:,events:[]