# `gno.land/p/nym-moultest123/udao` Minimal DAO interfaces, written from the **outside**. `udao` deliberately does not expose members or votes: those are implementation details that differ per DAO and that non-members cannot act on anyway. What it exposes is the part an outside observer needs: which proposals exist and where they stand. ```go type DAO interface { Propose(prop Proposal) (uint64, error) GetProposal(id uint64) (Proposal, error) GetProposalStatus(id uint64) (ProposalStatus, error) Execute(id uint64) error } ``` `ProposalState` is the lifecycle: `Pending`, `Active`, `Passed`, `Rejected`, `Executed`, `Expired`. ## Constraints The composable half of the package. A proposal can carry constraints, and `ValidateConstraints` reports whether all of them hold, returning the list of reasons when they do not: ```go func ValidateConstraints(p Proposal) (bool, []string) ``` That is what lets DAO behaviour be assembled from parts (a quorum constraint, a time-window constraint, a whitelist constraint) instead of baked into one implementation. This package is interfaces plus `ValidateConstraints`; it has no DAO of its own. [`p/moul/xdao`](../xdao) is a (partial) implementation of it. --- 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. > ⚠️ **Disclaimer:** provided as-is, without warranty; not security-audited. Full disclaimer: [DISCLAIMER](https://github.com/moul/gno-contracts/blob/main/DISCLAIMER.md).