Proposal Types Reference
Full index and individual docs live in docs/PROPOSAL_TYPES.md and docs/proposal-types/.
Type Detection Cheatsheet
// STANDARD
source === "dao_node" && voting_module_name === "standard" && hybrid === false
// HYBRID_STANDARD
source === "dao_node" && voting_module_name === "standard" && hybrid === true && govless_proposal !== undefined
// APPROVAL
source === "dao_node" && voting_module_name === "approval" && hybrid === false
// HYBRID_APPROVAL
source === "dao_node" && voting_module_name === "approval" && hybrid === true
// OPTIMISTIC (onchain)
source === "dao_node" && voting_module_name === "optimistic"
// HYBRID_OPTIMISTIC_TIERED
source === "dao_node" && hybrid === true && govless_proposal?.tiers?.length > 0
// OFFCHAIN_OPTIMISTIC (pure citizen, no tiers)
source === "eas-atlas" && proposal_type === "OPTIMISTIC" && tiers.length === 0 && 0
// OFFCHAIN_OPTIMISTIC_TIERED
source === "eas-atlas" && proposal_type === "OPTIMISTIC_TIERED"
// OFFCHAIN_STANDARD
source === "eas-oodao"
Shared Constants
const HYBRID_VOTE_WEIGHTS = {
delegates: 0.5, // 50%
apps: 1 / 6, // ~16.67%
users: 1 / 6, // ~16.67%
chains: 1 / 6, // ~16.67%
};
const OFFCHAIN_THRESHOLDS = { USER: 1000, APP: 100, CHAIN: 15 };
const OFFCHAIN_OPTIMISTIC_THRESHOLD = [20, 20, 20]; // flat 20% per tier
Status Derivation Order (all types)
cancel_event→CANCELLEDexecute_event→EXECUTEDqueue_event+ >10 days →PASSED; + has actions →QUEUEDcurrentBlock < start_block→PENDINGcurrentBlock < end_block→ACTIVE- After voting ends → vote-based calculation (type-specific, see below)
Vote-Based Status by Type
STANDARD (dao_node)
- Quorum check:
calculateQuorumBigInt(for, against, abstain) >= thresholds.quorum - Approval check:
for / (for + against) >= approvalThreshold / 100 - Pass condition: quorum AND approval both met
- Optimism edge: if
quorum === 0nandforVotes < againstVotes→DEFEATED
HYBRID_STANDARD (dao_node + eas-atlas)
- Computes weighted % for each vote type:
delegatePct*0.5 + userPct/6 + appPct/6 + chainPct/6 eligibleDelegates=total_voting_power_at_start(full supply, not quorum-derived)- Pass condition: threshold OR quorum met (OR, not AND)
- See
HYBRID_STANDARD.md
APPROVAL / HYBRID_APPROVAL
- Voters pick N options from a set of choices
- Approved options = those meeting
approval_thresholdandmax_approvalscap - See
APPROVAL.md/HYBRID_APPROVAL.md
OPTIMISTIC (onchain) / OFFCHAIN_OPTIMISTIC / OFFCHAIN_OPTIMISTIC_TIERED / HYBRID_OPTIMISTIC_TIERED
- Default:
SUCCEEDED— veto must be triggered toDEFEATED - Veto via
calculateTieredVeto: checks how many groups exceed each tier threshold - OFFCHAIN_OPTIMISTIC: flat
[20, 20, 20]thresholds, 2+ groups must each hit threshold - TIERED: tier values from
tiersfield on govless_proposal - See individual docs for exact thresholds and coalition logic
OFFCHAIN_STANDARD (eas-oodao)
- Uses
outcome["token-holders"]vote totals - Same approval + quorum logic as dao_node STANDARD
- See
OFFCHAIN_STANDARD.md
Vote Data Shapes
Onchain (dao_node) — totals
totals["no-param"] = { "0": string, "1": string, "2": string } // against, for, abstain (wei)
Offchain citizen (eas-atlas) — outcome
outcome = {
USER: { "0": number, "1": number, "2": number }, // against, for, abstain
APP?: { "0"?: number, "1"?: number, "2"?: number },
CHAIN?: { "0"?: number, "1"?: number, "2"?: number }
}
Approval choices — totals
totals[optionKey] = { "1": string } // for votes per option (wei)
Key Source Files
| File | Purpose |
|---|---|
src/lib/proposals/normalizeArchive.ts |
Type detection + normalization |
src/lib/proposals/thresholds.ts |
resolveArchiveThresholds |
src/lib/types/archiveProposal.ts |
Archive data types |
src/lib/types.d.ts |
ProposalType enum |
Individual Type Docs
STANDARD.mdHYBRID_STANDARD.mdAPPROVAL.mdHYBRID_APPROVAL.mdOPTIMISTIC.mdHYBRID_OPTIMISTIC_TIERED.mdOFFCHAIN_OPTIMISTIC.mdOFFCHAIN_OPTIMISTIC_TIERED.mdOFFCHAIN_STANDARD.md
Source: voteagora/agora-next — distributed by TomeVault.