1package dao23import (4 "chain/runtime/unsafe"5 "testing"67 "gno.land/p/nt/testutils/v0"8 "gno.land/p/nt/urequire/v0"9)1011// cur is a zero-value realm used as a placeholder when forwarding to12// uassert/urequire dispatch helpers that gained an `rlm realm` param.13// These tests pass `func()` callbacks (no crossing inside the callback),14// so rlm is ignored — a nil realm here is safe.15var cur realm1617const (18 v0 = "gno.land/r/gov/dao/impl/v0"19 v1 = "gno.land/r/gov/dao/v1/impl"20 v2 = "gno.land/r/gov/dao/v2/impl"21 v3 = "gno.land/r/gov/dao/v3/impl"22)2324const invalid = "gno.land/r/invalid/dao"2526var alice = testutils.TestAddress("alice")2728func TestProxy_Functions(cur realm, t *testing.T) {29 // initialize tests30 UpdateImpl(cross(cur), UpdateRequest{31 DAO: &dummyDao{},32 AllowedDAOs: []string{v0},33 })3435 // invalid package cannot add a new dao in charge36 testing.SetRealm(testing.NewCodeRealm(invalid))37 urequire.AbortsWithMessage(t, cur, "permission denied for prev realm: gno.land/r/invalid/dao", func() {38 UpdateImpl(cross(cur), UpdateRequest{39 DAO: &dummyDao{},40 })41 })4243 // dao in charge can add a new dao44 testing.SetRealm(testing.NewCodeRealm(v0))45 urequire.NotPanics(t, cur, func() {46 UpdateImpl(cross(cur), UpdateRequest{47 DAO: &dummyDao{},48 })49 })5051 // v0 that is in charge adds v2 in charge52 testing.SetRealm(testing.NewCodeRealm(v0))53 urequire.NotPanics(t, cur, func() {54 UpdateImpl(cross(cur), UpdateRequest{55 DAO: &dummyDao{},56 AllowedDAOs: []string{v0, v2},57 })58 })5960 // v0 can still do updates61 testing.SetRealm(testing.NewCodeRealm(v0))62 urequire.NotPanics(t, cur, func() {63 UpdateImpl(cross(cur), UpdateRequest{64 AllowedDAOs: []string{v1},65 })66 })6768 // not after removing himself from allowedDAOs list69 testing.SetRealm(testing.NewCodeRealm(v0))70 urequire.AbortsWithMessage(t, cur, "permission denied for prev realm: gno.land/r/gov/dao/impl/v0", func() {71 UpdateImpl(cross(cur), UpdateRequest{72 AllowedDAOs: []string{v0},73 })74 })7576 var pid ProposalID77 testing.SetRealm(testing.NewUserRealm(alice))78 urequire.NotPanics(t, cur, func() {79 e := NewSimpleExecutor(0, cur,80 func(realm) error {81 return nil82 },83 "",84 )85 pid = MustCreateProposal(cross(cur), NewProposalRequest("Proposal Title", "Description", e))86 })8788 p, err := GetProposal(1000)89 if p != nil || err == nil {90 panic("proposal should not exist and should return an error")91 }92 p = MustGetProposal(pid)93 urequire.Equal(t, "Proposal Title", p.Title())94 urequire.Equal(t, p.Author().String(), alice.String())9596 // need to switch the context back to v197 testing.SetRealm(testing.NewCodeRealm(v1))98 urequire.Equal(99 t,100 "Render: gno.land/r/gov/dao/test",101 Render(cross(cur), "test"),102 )103104 // reset state105 testing.SetRealm(testing.NewCodeRealm(v1))106 UpdateImpl(cross(cur), UpdateRequest{107 DAO: &dummyDao{},108 })109 // UpdateImpl deliberately ignores an empty AllowedDAOs, so it can no110 // longer be used to restore the bootstrap-open state — that is the point111 // of the guard. Reset the package var directly instead; we are in the112 // same package.113 allowedDAOs = nil114}115116type dummyDao struct{}117118func (dd *dummyDao) PreCreateProposal(_ int, rlm realm, r ProposalRequest) (address, error) {119 return unsafe.OriginCaller(), nil120}121122func (dd *dummyDao) PostCreateProposal(_ int, rlm realm, r ProposalRequest, pid ProposalID) {123}124125func (dd *dummyDao) VoteOnProposal(_ int, rlm realm, r VoteRequest) error {126 return nil127}128129func (dd *dummyDao) PreExecuteProposal(_ int, rlm realm, pid ProposalID) (bool, error) {130 return true, nil131}132133func (dd *dummyDao) ExecuteProposal(_ int, rlm realm, pid ProposalID, e Executor) error {134 return nil135}136137func (dd *dummyDao) Render(cur realm, pkgpath string, path string) string {138 return "Render: " + pkgpath + "/" + path139}140AllowedDAOs() []string
CreateProposal(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{title string; description string; executor gno.land/r/gov/dao.Executor; filter gno.land/r/gov/dao.Filter}) (int64, interface {Error func() string})
ExecuteOrRejectProposal(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}, pid int64) bool
ExecuteProposal(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}, pid int64) bool
GetProposal(pid int64) (*gno.land/r/gov/dao.Proposal, interface {Error func() string})
InAllowedDAOs(pkg string) bool
MustCreateProposal(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{title string; description string; executor gno.land/r/gov/dao.Executor; filter gno.land/r/gov/dao.Filter}) int64
MustGetProposal(pid int64) *gno.land/r/gov/dao.Proposal
MustVoteOnProposal(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{Option gno.land/r/gov/dao.VoteOption; ProposalID gno.land/r/gov/dao.ProposalID; Metadata interface {}})
MustVoteOnProposalSimple(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}, pid int64, option string)
NewProposalRequest(title string, description string, executor interface {CreationRealm func() string; Execute func(.uverse.realm) .uverse.error; String func() string}) struct{title string; description string; executor gno.land/r/gov/dao.Executor; filter gno.land/r/gov/dao.Filter}
NewProposalRequestWithFilter(title string, description string, executor interface {CreationRealm func() string; Execute func(.uverse.realm) .uverse.error; String func() string}, filter interface {}) struct{title string; description string; executor gno.land/r/gov/dao.Executor; filter gno.land/r/gov/dao.Filter}
NewProposals() *gno.land/r/gov/dao.Proposals
NewSafeExecutor(e interface {CreationRealm func() string; Execute func(.uverse.realm) .uverse.error; String func() string}) *gno.land/r/gov/dao.SafeExecutor
NewSimpleExecutor(int, rlm 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}, callback func(.uverse.realm) .uverse.error, description string) *gno.land/r/gov/dao.SimpleExecutor
NewUpdateRequest(d interface {ExecuteProposal func(int, .uverse.realm, gno.land/r/gov/dao.ProposalID, gno.land/r/gov/dao.Executor) .uverse.error; PostCreateProposal func(int, .uverse.realm, gno.land/r/gov/dao.ProposalRequest, gno.land/r/gov/dao.ProposalID); PreCreateProposal func(int, .uverse.realm, gno.land/r/gov/dao.ProposalRequest) (.uverse.address, .uverse.error); PreExecuteProposal func(int, .uverse.realm, gno.land/r/gov/dao.ProposalID) (bool, .uverse.error); Render func(.uverse.realm, string, string) string; VoteOnProposal func(int, .uverse.realm, gno.land/r/gov/dao.VoteRequest) .uverse.error}, allowedDAOs []string) struct{DAO gno.land/r/gov/dao.DAO; AllowedDAOs []string}
NewVoteRequest(option string, proposalID int64) struct{Option gno.land/r/gov/dao.VoteOption; ProposalID gno.land/r/gov/dao.ProposalID; Metadata interface {}}
NewVoteRequestWithMetadata(option string, proposalID int64, metadata interface {}) struct{Option gno.land/r/gov/dao.VoteOption; ProposalID gno.land/r/gov/dao.ProposalID; Metadata interface {}}
Render(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}, p string) string
UpdateImpl(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{DAO gno.land/r/gov/dao.DAO; AllowedDAOs []string})
VoteOnProposal(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{Option gno.land/r/gov/dao.VoteOption; ProposalID gno.land/r/gov/dao.ProposalID; Metadata interface {}}) interface {Error func() string}
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.