Proposal Types
canoLiq supports three proposal types, each carried as a google.protobuf.Any payload.
Param Change
Updates the entire CanoliqParams set. This is a full-set replacement, not a delta.
message ProposalParamChange {
CanoliqParams params = 1;
}
All ValidateParams invariants are checked:
- Fee split BPS must total 10,000
insurance_bps ≤ 10,000quorum_bps ≤ 10,000pass_threshold_bps ≤ 10,000multisig_threshold ≤ len(multisig_signers)when signers presentcplq_unstaking_blocks ≥ voting_period_blocks
Buyback
Authorizes a single buyback execution:
message ProposalBuyback {
uint64 cnpy_amount = 1;
uint64 price_micro_cnpy_per_cplq = 2;
BuybackMode mode = 3; // BURN or DISTRIBUTE_STAKERS
}
- Drains CNPY from
canoliq/buyback/pool - Computes
cplq_acquired = cnpy_amount * 1_000_000 / price_micro_cnpy_per_cplq - Debts CPLQ from
canoliq/treasury/cplq
Treasury Spend
Authorizes a transfer from a treasury bucket:
message ProposalTreasurySpend {
bytes recipient = 1;
uint64 amount = 2;
SpendDenomination denomination = 3; // CNPY or CPLQ
}
- Below
treasury_threshold: Executes directly - Above threshold: Requires timelock + multisig approvals
Creating a Proposal
canoliqctl vote <address> <proposal-id> yes
note
proposal-create is intentionally not yet wired as a standalone CLI command. Its payload is a google.protobuf.Any carrying one of three sub-types, each with a distinct argument surface. Construct proposals via in-process tests or hand-built JSON.