Protobuf Messages
All messages are defined in plugin/go/proto/canoliq.proto.
Deposit & Redeem
MessageCanoliqDeposit
Deposits CNPY into the canoLiq pool and mints cCNPY.
message MessageCanoliqDeposit {
bytes from_address = 1; // 20-byte address
uint64 amount = 2; // CNPY amount (uCNPY)
}
MessageCanoliqRedeem
Burns cCNPY and queues a CNPY redemption.
message MessageCanoliqRedeem {
bytes from_address = 1; // 20-byte address
uint64 ccnpy_amount = 2; // cCNPY to burn (uCCNPY)
}
MessageCanoliqClaimRedemption
Withdraws a matured CNPY redemption.
message MessageCanoliqClaimRedemption {
bytes from_address = 1; // 20-byte address
uint64 redemption_id = 2;
}
CPLQ Operations
MessageCPLQTransfer
Transfers liquid CPLQ.
message MessageCPLQTransfer {
bytes from_address = 1;
bytes to_address = 2;
uint64 amount = 3; // CPLQ amount (uCPLQ)
}
MessageCPLQClaimVested
Unlocks vested CPLQ.
message MessageCPLQClaimVested {
bytes from_address = 1;
}
MessageCPLQStake
Locks CPLQ for governance weight. An optional lock_tier commits the stake to a
vote-escrow lock for a higher voting multiplier and reward
boost; LOCK_NONE leaves the stake unstakeable after the standard unbond window.
message MessageCPLQStake {
bytes from_address = 1;
uint64 amount = 2;
LockTier lock_tier = 3; // LOCK_NONE | LOCK_3M | LOCK_6M | LOCK_12M | LOCK_24M
}
MessageCPLQUnstake
Queues CPLQ unstaking.
message MessageCPLQUnstake {
bytes from_address = 1;
uint64 amount = 2;
}
MessageCPLQClaimUnstake
Claims matured CPLQ unstake.
message MessageCPLQClaimUnstake {
bytes from_address = 1;
uint64 unstake_id = 2;
}
Governance
MessageCPLQProposalCreate
Opens a governance proposal.
message MessageCPLQProposalCreate {
bytes from_address = 1;
google.protobuf.Any payload = 2; // param_change | buyback | treasury_spend
string description = 3; // ≤ 256 bytes
}
MessageCPLQVote
Votes on a proposal.
message MessageCPLQVote {
bytes from_address = 1;
uint64 proposal_id = 2;
VoteChoice choice = 3; // VOTE_YES | VOTE_NO | VOTE_ABSTAIN
}
MessageBuybackExecute
Executes a passed buyback proposal.
message MessageBuybackExecute {
bytes from_address = 1;
uint64 proposal_id = 2;
}
MessageDAOTreasurySpend
Executes a passed treasury spend.
message MessageDAOTreasurySpend {
bytes from_address = 1;
uint64 proposal_id = 2;
}
MessageMultisigApprove
Approves an above-threshold spend.
message MessageMultisigApprove {
bytes from_address = 1;
uint64 spend_id = 2;
}
Proposal Payloads
A MessageCPLQProposalCreate carries one of these payload types in its payload
(google.protobuf.Any) field. The payload type determines the proposal's
action type / governance tier and what executes on
pass.
ProposalParamChange
Atomically replaces the entire CanoliqParams set (the fee-split fields must still sum to
10,000). → ACTION_FEE_CHANGE.
message ProposalParamChange {
CanoliqParams params = 1;
}
ProposalBuyback
Authorizes one buyback. cplq_acquired = cnpy_amount × 1_000_000 ÷ price_micro_cnpy_per_cplq.
→ executed later by MessageBuybackExecute.
message ProposalBuyback {
uint64 cnpy_amount = 1; // drawn from buyback pool (clamped to available)
uint64 price_micro_cnpy_per_cplq = 2; // price denominator
BuybackMode mode = 3; // BUYBACK_BURN | BUYBACK_DISTRIBUTE_STAKERS
}
ProposalTreasurySpend
Authorizes a transfer from a treasury bucket. Amounts above treasury_threshold require
multisig + timelock. → ACTION_TREASURY_SPEND_SMALL or _LARGE by amount.
message ProposalTreasurySpend {
bytes recipient = 1;
uint64 amount = 2;
SpendDenomination denomination = 3; // SPEND_CNPY | SPEND_CPLQ
}
ProposalValidatorEject
Removes a validator from the committee registry on pass. → ACTION_VALIDATOR_EJECT.
message ProposalValidatorEject {
bytes validator_address = 1;
}
ProposalEmergency
A security-critical action on the fast-track tier (24h voting, no timelock), optionally
carrying a param change applied immediately on pass. → ACTION_EMERGENCY.
message ProposalEmergency {
string description = 1;
ProposalParamChange param_change = 2; // optional
}
ProposalProtocolUpgrade
Signals an off-chain coordinated upgrade; the payload is opaque and recorded for audit (no
on-chain dispatch). → ACTION_PROTOCOL_UPGRADE.
message ProposalProtocolUpgrade {
string version = 1;
bytes payload = 2; // opaque upgrade descriptor
}