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

v1 source realm

Package splitter is a share-based payment splitter for gno.land.

Readme View source

Payment Splitter

⚠️ Experimental — generated with no human supervision. This realm was produced automatically by an MCP-driven agent to exercise the gno MCP server and tooling, and to generate test content for gno compilers, linters and formatters. Not audited. Not for production. Full context & folder README: r/moul/x/daily


A share-based payment splitter for gno.land — an accounting-only port of the Solidity PaymentSplitter. No real coins move: each group tracks payees, their integer shares, and a pooled income figure, and computes what each payee is owed as amount * share / totalShares.

Register a group with comma-separated payee addresses and matching shares, record income against it, and Render shows every group's per-payee owed amounts (integer division; any rounding remainder is displayed separately).

Realm path: gno.land/r/REPLACE_ADDR/splitter

Example calls

# Create a group: alice gets 3 shares, bob gets 1 -> returns group id 0
Register("g1alice...,g1bob...", "3,1")

# Record 100 units of income into group 0
RecordIncome(0, 100)

# View the ledger (alice owed 75, bob owed 25)
gnokey query vm/qrender --data "gno.land/r/REPLACE_ADDR/splitter:"

What changed in v1

State moved from a hand-rolled avl.Tree + nextID + zero-padding helper to p/moul/kit/store, which keys entries by seqid instead of a fixed-width decimal string.

v0 padded ids to width 12. Past that width the padding stops and the tree orders "1000000000000" before "999999999999", so every list this realm renders would be wrong from that entry on. store keys are 8 big-endian bytes whose order is numeric for every uint64, so there is no width left to outgrow.

group loses its id field, which the store now owns, and group ids start at 1 where v0 handed out 0 for the first group.

This is a storage change, which under this repo's versioning rule is a compatibility change, hence a new version rather than an edit in place. v0 stays live and untouched.


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:

gno.land/r/moul/x/daily/splitter/v1 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.

Overview

Package splitter is a share-based payment splitter for gno.land.

It is an accounting-only port of the Solidity PaymentSplitter pattern: no real coins move. A group is registered with a list of payees and a matching list of integer shares. Income recorded against a group is pooled, and each payee is owed a slice of that pool proportional to their shares: owed = pool * share / totalShares.

Functions 3

func RecordIncome

crossing Action
1func RecordIncome(cur realm, id int, amount int)
source

RecordIncome adds amount to the pool of group id. amount must be positive.

func Register

crossing Action
1func Register(cur realm, payees string, shares string) int
source

Register creates a new group from comma-separated payees and shares. payees: "g1abc...,g1def..." (addresses) shares: "3,1" (positive integers, same count as payees) Returns the new group id. Panics on malformed input.

func Render

1func Render(path string) string
source

Render shows all groups, their payees, shares, and computed owed amounts.

Imports 6

Source Files 5