1package forge23import (4 "strings"5 "testing"67 "gno.land/p/nt/testutils/v0"8 "gno.land/p/nt/urequire/v0"9)1011// Deterministic, checksum-valid test addresses.12var (13 alice = testutils.TestAddress("alice") // owner14 bob = testutils.TestAddress("bob") // maintainer15 carol = testutils.TestAddress("carol") // writer16 dave = testutils.TestAddress("dave") // reader17 eve = testutils.TestAddress("eve") // stranger18)1920// oid builds a well-formed 40-hex object id out of one hex digit.21func oid(c string) string { return strings.Repeat(c, 40) }2223// newRepo returns a repo owned by alice with the standard cast: bob24// maintainer, carol writer, dave reader, eve nothing.25func newRepo(t *testing.T) (*Forge, *Repo) {26 t.Helper()27 f := New()28 r, err := f.CreateRepo(alice, 100, "moul/forge", "an on-chain forge", "")29 urequire.NoError(t, err)30 urequire.NoError(t, r.SetMember(alice, bob, RoleMaintainer))31 urequire.NoError(t, r.SetMember(alice, carol, RoleWriter))32 urequire.NoError(t, r.SetMember(alice, dave, RoleReader))33 return f, r34}35Signatures reconstructed verbatim from vm/qfuncs — interface params keep their inline definitions.