|
| 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