Skip to content

Commit 5431cda

Browse files
committed
Initial version of CIP for introducing a default SPO vote
1 parent 21c3a58 commit 5431cda

File tree

1 file changed

+116
-0
lines changed

1 file changed

+116
-0
lines changed

CIP-XXXX/README.md

Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
---
2+
CIP: XXXX
3+
Title: Default SPO vote
4+
Category: Ledger
5+
Authors:
6+
- Teodora Danciu <[email protected]>
7+
- Alexey Kuleshevich <[email protected]>
8+
Implementors: N/A
9+
Status: Proposed
10+
Discussions:
11+
- https://github.com/cardano-foundation/CIPs/pull/1108
12+
- https://github.com/IntersectMBO/cardano-ledger/issues/4645
13+
Created: 2025-10-28
14+
License: CC-BY-4.0
15+
---
16+
17+
## Abstract
18+
19+
We propose introducing an explicit mechanism for SPOs to define their default governance vote as part of their pool's registration parameters.
20+
This would replace the current indirect approach, which relies on delegating the pool’s reward account to predefined DReps AlwaysNoConfidence and AlwaysAbstain.
21+
22+
## Motivation: why is this CIP necessary?
23+
24+
The current approach was always intended as a temporary workaround. While it solved the immediate problem (as discussed in [cardano-ledger#4645](https://github.com/IntersectMBO/cardano-ledger/issues/4645)), it introduces several issues:
25+
* It is not transparent or easily inspectable what a pool’s default vote actually is, making it difficult to understand how undelegated or non-voting stake will behave in governance actions.
26+
* It couples operational reward accounts with governance semantics, constraining how SPOs can use their reward accounts.
27+
* It can distort governance outcomes, as SPOs who do not configure their reward accounts may unintentionally default to voting No, potentially skewing proposal results.
28+
29+
By contrast, providing SPOs with a clear, explicit default vote parameter allows them to opt in or out of governance participation transparently, mitigating the coupling between financial and governance mechanisms and reducing long-term bias in voting behaviour.
30+
31+
## Specification
32+
33+
### Current behaviour
34+
35+
The "default vote" determines how *not voting* counts toward the ratification of a proposal.
36+
For SPOs, this is currently implemented as folllows:
37+
* `HardForkInitiation` proposals: default is `No`
38+
* `NoConfidence` proposals:
39+
- if the pool's reward account is delegated to `AlwaysNoConfidence`, the default is `Yes`
40+
- otherwise, `No`
41+
* `UpdateCommittee` and `ParameterUpdate` (for security-group parameters) proposals:
42+
- if the pool reward account is delegated to `AlwaysAbstain`, the default is `Abstain`
43+
- otherwise, `No`
44+
45+
### Proposed changes
46+
47+
Add a new non-optional field to the pool parameters that specifies the SPO's default vote, with 3 possible values:
48+
* `DefaultNoConfidence`: `Yes` on `NoConfidence`, `No` on all other actions (matches delegation to `AlwaysNoConfidence`)
49+
* `DefaultAbstain`: `Abstain` on all actions (matches delegation to `AlwaysAbstain`)
50+
* `NoDefault`: `No` on all actions (matches no delegation to a default DRep)
51+
52+
<br>
53+
54+
Currently the pool parameters are specified in cddl like this:
55+
56+
```cddl
57+
pool_params =
58+
( operator : pool_keyhash
59+
, vrf_keyhash : vrf_keyhash
60+
, pledge : coin
61+
, cost : coin
62+
, margin : unit_interval
63+
, reward_account : reward_account
64+
, pool_owners : set<addr_keyhash>
65+
, relays : [* relay]
66+
, pool_metadata : pool_metadata/ nil
67+
)
68+
```
69+
70+
The proposed definition is:
71+
```cddl
72+
pool_params =
73+
( operator : pool_keyhash
74+
, vrf_keyhash : vrf_keyhash
75+
, pledge : coin
76+
, cost : coin
77+
, margin : unit_interval
78+
, reward_account : reward_account
79+
, pool_owners : set<addr_keyhash>
80+
, relays : [* relay]
81+
, pool_metadata : pool_metadata/ nil
82+
, default_vote : stakepool_default_vote
83+
)
84+
85+
stakepool_default_vote = default_vote_abstain / default_vote_no_confidence / no_default_vote
86+
default_vote_abstain = 0
87+
default_vote_no_confidence = 1
88+
no_default_vote = 2
89+
```
90+
91+
This change requires a hard fork, since it modifies transaction serialization.
92+
93+
### Migration of currently configured default votes
94+
95+
At the hard-fork boundary, the pool parameters of each existing pool will be updated to reflect the implicit preference currently expressed through its reward account delegation.
96+
For each pool, we'll set the new `defaultVote` parameter to:
97+
* `DefaultAbstain`, if the reward account is delegated to `AlwaysAbstain`
98+
* `DefaultNoConfidence`, if the reward account is delegated to `AlwaysNoConfidence`
99+
* `NoDefault`, if the reward account is not delegated to a defaul DRep
100+
101+
## Path to Active
102+
103+
### Acceptance Criteria
104+
105+
- [ ] Transaction serializers and deserializers in [cardano-ledger](https://github.com/IntersectMBO/cardano-ledger) are implemented such that they follow the cddl specification described above, and reflected in the cddl specs
106+
- [ ] The migration of the existing default vote preferences is implemented in ledger
107+
- [ ] The feature is integrated into [cardano-node](https://github.com/IntersectMBO/cardano-node) with necessary adjustments made to [ouroboros-consensus](https://github.com/IntersectMBO/ouroboros-consensus) and released as part of the Dijkstra era hard fork
108+
109+
### Implementation Plan
110+
111+
- [ ] Add support for a new pool parameter without changing serialization in existing eras
112+
- [ ] Implement and test migration logic to populate the new parameter at the hard-fork boundary.
113+
114+
## Copyright
115+
116+
This CIP is licensed under [CC-BY-4.0](https://creativecommons.org/licenses/by/4.0/legalcode).

0 commit comments

Comments
 (0)