func Couples
ActionCouples returns how many distinct token couples are represented.
Package pairreg is the registry every AMM pair instance announces itself to, and the unified frontend over all of them.
gno.land/r/moul/x/pairreg/v0The registry every AMM pair instance announces itself to, and the unified
frontend over all of them. Third artifact of the instance-per-realm pattern; the
logic is in p/moul/x/pair/v0.
init, so a single addpkg
both creates a pair and lists it.cur.Previous().PkgPath(), so an instance cannot claim a path that is not its
own.*pair.Pair, not an address, so Render shows every
instance's real reserves from one vm/qrender. No indexer, no multicall.Nothing on chain can read a package's source, so the registry cannot check that
an instance runs the shared template. Reserves shown in the index are claimed.
Several instances may exist for the same couple, on purpose: there is no
canonical pair and no factory to enforce one. Verify an instance by diffing its
source (vm/qfile) against freshly generated output before funding it.
Part of 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.
Package pairreg is the registry every AMM pair instance announces itself to, and the unified frontend over all of them.
It is the third artifact of the instance-per-realm pattern: one shared p/moul/x/pair/v0 holding the logic, N tiny realms holding one pair each, and this realm knowing all of them.
Register keys an instance by cur.Previous().PkgPath(), which the runtime supplies, so an instance cannot claim a path that is not its own. That is the whole on-chain guarantee. It is NOT a guarantee about the code at that path: gno has no way to read another package's source from inside a realm, so nothing here can check that an instance really runs the shared template. The mirror image of Ethereum's CREATE2, which proves the code and says nothing legible about who deployed it.
Consequences a reader of the index must keep in mind:
Instances register a *pair.Pair pointer, not an address, the way grc20reg registers a *grc20.Token. One vm/qrender here therefore renders the real state of every instance, with no indexer and no multicall. It is safe because pair.Pair holds only concrete types: an interface or a func field would let a hostile instance hand foreign code to this realm's frame.
Couples returns how many distinct token couples are represented.
InstancesFor returns the instance paths claiming a given couple id.
Register records the calling realm as an instance. Call it from the instance's init, so that deploying and listing are one transaction:
1func init(cur realm) {
2 p = pair.New(keyA, keyB, grc20reg.MustGet(keyA), grc20reg.MustGet(keyB))
3 pairreg.Register(cross(cur), p)
4}
Permissionless by design: anyone may deploy an instance under their own address namespace and land here. Spam is self funded, since the registering transaction pays for the storage it adds.
Render is the unified frontend: the index of every instance with its live state, or one instance's own page when path is an instance path.
Size returns how many instances are registered.
Get returns the entry for an instance path, or nil.