Governance Lifecycle
This is the end-to-end operational flow for publishing a new dapp version.
1. Start prerequisites
- Start local IPFS.
- Start contracts devnet.
- Ensure CLI ABIs are refreshed.
2. Package dapp content
cd cli
bun run src/index.ts package \
--path ../dapp-examples/uniswap-v2 \
--name "Uniswap V2" \
--dapp-version "0.0.1" \
--description "Uniswap V2 example" \
--json
Capture the returned rootCid.
3. Propose publication
bun run src/index.ts dapp:propose \
--root-cid <rootCid> \
--name "Uniswap V2" \
--dapp-version "0.0.1" \
--description "Uniswap V2 example"
4. Vote and finalize
Wait for each governance phase before running the next command:
- After
dapp:propose, wait for the proposal to becomeActive(voting delay). - After
vote:cast, wait for the proposal to becomeSucceeded(voting period + quorum/pass checks). - After
proposals:queue, wait for timelock delay beforeproposals:execute.
Current Sepolia deployment parameters:
votingDelay = 1blockvotingPeriod = 50blockstimelockDelay = 60seconds
bun run src/index.ts vote:cast <proposalId> --support for
bun run src/index.ts proposals:queue <proposalId>
bun run src/index.ts proposals:execute <proposalId>
Use this to check proposal state between steps:
bun run src/index.ts proposals:show <proposalId> --network sepolia --json
5. Validate registry state
bun run src/index.ts dapp:list --json
6. Retrieve and run in client
bun run src/index.ts dapp:fetch --root-cid <rootCid> --out .vibefi/cache
cd ../client
cargo run -- --bundle ../cli/.vibefi/cache/<rootCid>
Security controls in this flow
- Proposal eligibility is contract-enforced.
- Governance executes through timelock.
- Security Council can pause/deprecate and cancel queued operations.
- Client runtime prevents arbitrary network exfiltration from frontend bundles.