Skip to content

Commit 0b58ff1

Browse files
committed
docs(soterika#409): add governance documentation and voting guide
- Governance overview: participants (admin multisig, share holders, keepers) - Proposal lifecycle: Draft → Comment → Voting → Timelock → Executed - Step-by-step creating a proposal via UI and contract (CLI) - Voting power calculation: shares at snapshot, delegation planned - Quorum and approval thresholds (current multisig + planned on-chain) - Timelock explanation (48h for fees, 7 days for upgrades) - Emergency pause and incident response - Governance roadmap (Stage 1→4) Closes soterika#409
1 parent 76f1d1a commit 0b58ff1

1 file changed

Lines changed: 383 additions & 0 deletions

File tree

GOVERNANCE.md

Lines changed: 383 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,383 @@
1+
# Aura Vault — Governance Documentation & Voting Guide
2+
3+
> **Issue**: #409
4+
> **Version**: 0.2.0
5+
> **Last Updated**: 2026-08-28
6+
7+
---
8+
9+
## Table of Contents
10+
11+
1. [Overview](#overview)
12+
2. [Governance Participants](#governance-participants)
13+
3. [Proposal Lifecycle](#proposal-lifecycle)
14+
4. [Creating a Proposal](#creating-a-proposal)
15+
5. [Voting Power Calculation](#voting-power-calculation)
16+
6. [Quorum and Approval Thresholds](#quorum-and-approval-thresholds)
17+
7. [Timelock](#timelock)
18+
8. [Step-by-Step: Participating via UI](#step-by-step-participating-via-ui)
19+
9. [Step-by-Step: Participating via Contract](#step-by-step-participating-via-contract)
20+
10. [What Can Be Governed](#what-can-be-governed)
21+
11. [Emergency Actions](#emergency-actions)
22+
12. [Governance Roadmap](#governance-roadmap)
23+
24+
---
25+
26+
## Overview
27+
28+
Aura Vault governance allows **vault share holders** to collectively control protocol parameters, fee settings, contract upgrades, and treasury management. Governance is designed to be progressive — starting with admin multisig and evolving toward full on-chain token governance as the protocol matures.
29+
30+
### Current Governance Stage (v0.2.0)
31+
32+
**Stage 1 — Admin Multisig**
33+
34+
All protocol changes are currently controlled by a 3-of-5 admin multisig. Major changes (fee adjustments, contract upgrades) require a public comment period of at least 7 days before execution.
35+
36+
The path to on-chain governance is documented in the [Governance Roadmap](#governance-roadmap) section. Share holders can participate in off-chain signalling at any time using GitHub Discussions or community calls.
37+
38+
---
39+
40+
## Governance Participants
41+
42+
### Admin (Multisig)
43+
44+
- **Who**: A 3-of-5 multisig of founding contributors.
45+
- **Powers**: Execute all on-chain parameter changes, contract upgrades, treasury withdrawals.
46+
- **Constraints**: Cannot set fees outside the contract-enforced bounds (performance fee 10–20%, management fee 0–1%). Cannot change these bounds without deploying a new contract.
47+
48+
### Vault Share Holders
49+
50+
- **Who**: Any address holding Aura Vault shares (`balance_of(address) > 0`).
51+
- **Current powers**: Off-chain signalling via GitHub Discussions and community calls.
52+
- **Future powers**: On-chain proposal creation and voting (see [Governance Roadmap](#governance-roadmap)).
53+
54+
### Keepers
55+
56+
- **Who**: Anyone who calls `harvest()`.
57+
- **Powers**: Trigger yield injection (permissionless). No governance power.
58+
59+
### Integrators
60+
61+
- **Who**: Protocols or individuals who build on top of Aura Vault.
62+
- **Powers**: Off-chain signalling. No on-chain governance power in the current stage.
63+
64+
---
65+
66+
## Proposal Lifecycle
67+
68+
```
69+
DRAFT → OPEN FOR COMMENT → VOTING → TIMELOCK → EXECUTED
70+
↘ DEFEATED
71+
↘ CANCELLED
72+
```
73+
74+
| Stage | Duration | Description |
75+
|---|---|---|
76+
| **Draft** | Unlimited | Author refines the proposal in GitHub Discussions |
77+
| **Open for Comment** | ≥ 7 days | Public comment period; community feedback |
78+
| **Voting** | 5 days | (On-chain governance) Votes cast by share holders |
79+
| **Timelock** | 48 hours | Mandatory delay between approval and execution |
80+
| **Executed** || Admin (or on-chain executor) applies the change |
81+
| **Defeated** || Did not reach quorum or approval threshold |
82+
| **Cancelled** || Author or admin withdraws before execution |
83+
84+
---
85+
86+
## Creating a Proposal
87+
88+
### Off-Chain Proposal (Current Process)
89+
90+
1. **Open a GitHub Discussion** in the `governance` category at:
91+
`https://github.com/soterika/aura-vault-protocol/discussions`
92+
93+
2. **Use the proposal template**:
94+
95+
```markdown
96+
## Proposal: [Short Title]
97+
98+
**Type**: [Fee Change | Contract Upgrade | Treasury | Parameter Change]
99+
**Author**: [Your GitHub username or Stellar address]
100+
**Status**: Draft
101+
102+
### Summary
103+
One paragraph describing what the proposal does and why.
104+
105+
### Motivation
106+
Why is this change needed? What problem does it solve?
107+
108+
### Specification
109+
Exact on-chain call(s) that would be made:
110+
- Function: `set_fees(perf_fee_bps=1500, mgmt_fee_bps=50)`
111+
- Network: mainnet
112+
- Contract: <CONTRACT_ID>
113+
114+
### Risks & Mitigations
115+
What could go wrong and how it is mitigated.
116+
117+
### Voting Options
118+
- For: Apply the change as specified.
119+
- Against: Keep current parameters.
120+
- Abstain: No preference.
121+
```
122+
123+
3. **Comment period**: The proposal must stay open for community comment for a minimum of **7 days**.
124+
125+
4. **Admin review**: After the comment period, the multisig reviews and — if there is clear consensus — executes the change.
126+
127+
5. **Execution announcement**: The admin posts the TX hash in the same Discussion thread.
128+
129+
### On-Chain Proposal (Planned — See Roadmap)
130+
131+
Once on-chain governance is deployed, proposals will be submitted directly via the governance contract. See [Step-by-Step: Participating via Contract](#step-by-step-participating-via-contract) for the planned flow.
132+
133+
---
134+
135+
## Voting Power Calculation
136+
137+
### Current Stage (Off-Chain)
138+
139+
Voting weight is calculated by **vault share balance at snapshot time**. Snapshot is taken at the block height when the proposal enters the voting stage.
140+
141+
```
142+
voting_power(address) = balance_of(address) at snapshot_block
143+
```
144+
145+
Shares represent proportional ownership of the vault, so voting power scales with economic stake.
146+
147+
### Example
148+
149+
```
150+
Total shares: 1,000,000
151+
Alice: 250,000 shares → 25% voting power
152+
Bob: 100,000 shares → 10% voting power
153+
Carol: 650,000 shares → 65% voting power
154+
```
155+
156+
### Delegation (Planned)
157+
158+
In the on-chain governance system, share holders will be able to delegate their voting power to another address without transferring shares:
159+
160+
```bash
161+
# Delegate to another address
162+
stellar contract invoke \
163+
--id <GOVERNANCE_CONTRACT_ID> \
164+
--source <YOUR_KEYPAIR> \
165+
--network mainnet \
166+
-- delegate \
167+
--delegatee <DELEGATEE_ADDRESS>
168+
```
169+
170+
Delegation is revocable at any time. Delegating to yourself reclaims your own voting power.
171+
172+
---
173+
174+
## Quorum and Approval Thresholds
175+
176+
### Current Thresholds (Admin Multisig)
177+
178+
| Change Type | Signers Required | Comment Period |
179+
|---|---|---|
180+
| Fee parameter change | 3 of 5 | 7 days |
181+
| Contract upgrade | 4 of 5 | 14 days |
182+
| Treasury withdrawal | 3 of 5 | 7 days |
183+
| Emergency pause | 2 of 5 | None (immediate) |
184+
185+
### Planned On-Chain Thresholds
186+
187+
| Change Type | Quorum | Approval | Timelock |
188+
|---|---|---|---|
189+
| Fee parameter change | 10% of supply | >50% yes | 48 hours |
190+
| Contract upgrade | 20% of supply | >66% yes | 7 days |
191+
| Treasury withdrawal | 15% of supply | >60% yes | 48 hours |
192+
| Emergency pause | 5% of supply | >50% yes | None |
193+
| Threshold change | 30% of supply | >75% yes | 14 days |
194+
195+
**Quorum** is the minimum percentage of total shares that must vote (for, against, or abstain) for the result to be binding.
196+
**Approval** is the percentage of non-abstain votes that must be "for" to pass.
197+
198+
---
199+
200+
## Timelock
201+
202+
All non-emergency governance actions are subject to a **mandatory timelock** between approval and execution. This gives users time to exit the vault before a change they disagree with takes effect.
203+
204+
### Timelock Periods
205+
206+
| Action | Timelock |
207+
|---|---|
208+
| Fee change | 48 hours |
209+
| Treasury withdrawal | 48 hours |
210+
| Contract upgrade | 7 days |
211+
| Emergency pause | 0 (immediate) |
212+
213+
### How Timelock Works
214+
215+
1. A proposal is approved (meets quorum and approval threshold).
216+
2. The `execute_after` timestamp is set to `now + timelock_period`.
217+
3. Anyone can call `execute(proposal_id)` after this timestamp.
218+
4. The admin multisig (or on-chain executor) cannot execute before the timelock expires.
219+
5. During the timelock window, any user who disagrees can withdraw their shares.
220+
221+
---
222+
223+
## Step-by-Step: Participating via UI
224+
225+
> The governance UI is planned for a future release. The following describes the intended flow.
226+
227+
### Viewing Proposals
228+
229+
1. Navigate to the Aura Vault app at `https://app.aura-vault.dev`.
230+
2. Click **Governance** in the top navigation.
231+
3. Active proposals are displayed with their current vote counts, quorum progress, and time remaining.
232+
233+
### Voting on a Proposal
234+
235+
1. Connect your Stellar wallet (Freighter or compatible).
236+
2. Open the proposal you want to vote on.
237+
3. Review the specification, discussion, and risks.
238+
4. Click **Vote For**, **Vote Against**, or **Abstain**.
239+
5. Sign the transaction in your wallet. Your voting power equals your share balance at the snapshot block.
240+
6. Confirmation appears in the toast notification.
241+
242+
### Creating a Proposal via UI
243+
244+
1. Connect your wallet. You must hold at least **1,000 shares** (planned minimum) to create a proposal.
245+
2. Click **New Proposal**.
246+
3. Fill in: Title, Type, Summary, Specification (exact contract call), Motivation, and Risks.
247+
4. Click **Submit Proposal**. This posts it as a Draft.
248+
5. After your 7-day comment period, click **Open for Voting** to start the voting period.
249+
250+
---
251+
252+
## Step-by-Step: Participating via Contract
253+
254+
These commands use the Stellar CLI directly. Replace placeholders with actual values.
255+
256+
### Check Your Voting Power
257+
258+
```bash
259+
# Your share balance = your voting power at snapshot
260+
stellar contract invoke \
261+
--id <VAULT_CONTRACT_ID> \
262+
--network mainnet \
263+
-- balance_of \
264+
--address <YOUR_ADDRESS>
265+
```
266+
267+
### Query Total Supply (for power percentage)
268+
269+
```bash
270+
# Total shares outstanding
271+
stellar contract invoke \
272+
--id <VAULT_CONTRACT_ID> \
273+
--network mainnet \
274+
-- total_assets
275+
# Note: total_shares is a separate storage query; use the block explorer for this.
276+
```
277+
278+
### Cast a Vote (Planned On-Chain Governance)
279+
280+
```bash
281+
stellar contract invoke \
282+
--id <GOVERNANCE_CONTRACT_ID> \
283+
--source <YOUR_KEYPAIR> \
284+
--network mainnet \
285+
-- cast_vote \
286+
--proposal_id <PROPOSAL_ID> \
287+
--support 1 # 0=Against, 1=For, 2=Abstain
288+
```
289+
290+
### Execute an Approved Proposal
291+
292+
```bash
293+
# Anyone can call this after the timelock expires
294+
stellar contract invoke \
295+
--id <GOVERNANCE_CONTRACT_ID> \
296+
--source <ANY_KEYPAIR> \
297+
--network mainnet \
298+
-- execute \
299+
--proposal_id <PROPOSAL_ID>
300+
```
301+
302+
### Cancel a Proposal (Author or Admin Only)
303+
304+
```bash
305+
stellar contract invoke \
306+
--id <GOVERNANCE_CONTRACT_ID> \
307+
--source <AUTHOR_OR_ADMIN_KEYPAIR> \
308+
--network mainnet \
309+
-- cancel \
310+
--proposal_id <PROPOSAL_ID>
311+
```
312+
313+
---
314+
315+
## What Can Be Governed
316+
317+
### In Scope
318+
319+
| Parameter | Current Value | Bounds |
320+
|---|---|---|
321+
| Performance fee (`perf_fee_bps`) | 1500 (15%) | 1000–2000 |
322+
| Management fee (`mgmt_fee_bps`) | 0 (0%) | 0–100 |
323+
| Treasury address | Multisig | Any valid address |
324+
| Contract upgrade (new WASM hash) | v0.2.0 | Admin + governance |
325+
| Emergency pause | Unpaused | Admin only |
326+
327+
### Out of Scope (Not Governable)
328+
329+
These properties are hard-coded in the contract and cannot be changed without deploying a new contract:
330+
331+
- Maximum performance fee ceiling (20%)
332+
- Maximum management fee ceiling (1%)
333+
- Minimum performance fee floor (10%)
334+
- CEI ordering and flash loan guard logic
335+
- Overflow protection (`checked_mul`, `checked_div`)
336+
337+
---
338+
339+
## Emergency Actions
340+
341+
### Emergency Pause
342+
343+
The admin can pause the vault immediately without a governance vote in the event of a detected exploit or critical vulnerability.
344+
345+
```bash
346+
stellar contract invoke \
347+
--id <CONTRACT_ID> \
348+
--source <ADMIN_KEYPAIR> \
349+
--network mainnet \
350+
-- pause
351+
```
352+
353+
While paused:
354+
- `deposit()` is blocked (returns `VaultError::VaultPaused`)
355+
- `withdraw()` is blocked (returns `VaultError::VaultPaused`)
356+
- `harvest()` is blocked (returns `VaultError::VaultPaused`)
357+
- Read operations (`total_assets`, `balance_of`, `is_paused`) remain available
358+
359+
**Unpausing** requires a governance proposal and 48-hour timelock (unless the emergency was a false alarm, in which case the admin multisig can unpause with a 3-of-5 vote after posting an incident report).
360+
361+
### Incident Response
362+
363+
If you notice suspicious behavior:
364+
1. Report immediately in the `#security` channel or via email to `security@aura-vault.dev`.
365+
2. Do **not** share exploit details publicly before the team has responded.
366+
3. The team will assess within 24 hours and post a public incident report within 72 hours.
367+
368+
---
369+
370+
## Governance Roadmap
371+
372+
| Stage | Target | Description |
373+
|---|---|---|
374+
| **Stage 1** (current) | v0.2.0 | Admin multisig + off-chain signalling |
375+
| **Stage 2** | v0.3.0 | On-chain proposal contract; voting by share holders; results advisory |
376+
| **Stage 3** | v0.4.0 | Binding on-chain governance; timelock enforced; admin multisig becomes executor |
377+
| **Stage 4** | v1.0.0 | Full DAO: admin multisig abolished; governance contract is sole admin |
378+
379+
Community feedback on the timeline and design is tracked in GitHub Discussions under the `governance` label.
380+
381+
---
382+
383+
*For fee governance details see [/docs/fees.md](docs/fees.md). For contract upgrade procedures see [/docs/UPGRADE_PLAYBOOK.md](docs/UPGRADE_PLAYBOOK.md).*

0 commit comments

Comments
 (0)