The QCIs platform is a decentralized system for the QiDAO community to propose, discuss, and track community ideas and protocol improvements. Ideas are stored on IPFS with an on-chain registry on Base, ensuring transparency, permanence, and permissionless access.
QCIs now use a fully on-chain system instead of GitHub PRs:
- Create ideas directly through the web interface
- Store content permanently on IPFS
- Track status via on-chain registry
- Submit to Snapshot with one click
See NEW_QCI_WORKFLOW.md for detailed instructions.
- Draft: Initial proposal submission for community review.
- Discussion: Open forum for community feedback and deliberation.
- Voting: Community vote to approve or reject the proposal.
- Accepted: Approved proposals awaiting implementation.
- Queued: In Progress of being implemented
- Implemented: Successfully integrated proposals into the QiDAO protocol.
- Rejected: Proposals that were not approved by the community.
-
Homepage:
- Overview of QCIs, recent ideas, and a guide on how to contribute.
-
All Proposals Page:
- A comprehensive list of proposals with filtering and sorting options.
-
Individual Proposal Pages:
- Detailed view of each proposal, its status, discussion threads, and voting results.
-
Contribution Guide Page:
- Step-by-step guide on how to submit new proposals and participate in discussions.
-
FAQ/Help Page:
- Assistance for common queries and guidelines on community conduct.
- Start local test environment:
# Basic setup with test QCIs (249-251)
bun run dev:local
# Or with migration of existing QCIs (209-248)
bun run dev:local -- --migrateThis will:
- Start IPFS daemon (required for local development)
- Start Anvil (local Ethereum node forked from Base)
- Deploy the QCIRegistry contract (starting at QCI 209)
- Create sample QCIs (249-251) with different statuses
- Optionally migrate existing QCIs (209-248) with their original numbers
- Set up test accounts with roles (governance, editor, authors)
- Start Gatsby development server
- Run the TypeScript test client:
bun run src/localQCITest.ts| Role | Address | Private Key (first 16 chars) |
|---|---|---|
| Governance | 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266 | 0xac0974bec39a17... |
| Editor | 0x70997970C51812dc3A010C7d01b50e0d17dc79C8 | 0x47e179ec197488... |
| Author1 | 0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC | 0x59c6995e998f97... |
| Author2 | 0x90F79bf6EB2c4f870365E785982E1f101E93b906 | 0x5de4111afa1a4b... |
| Author3 | 0x15d34AAf54267DB7D7c367839AAf71A00a2C6A65 | 0x7c852118294e51... |
The setup script creates several QCIs to demonstrate different states:
- QCI-249: Dynamic Interest Rates (Draft → Implemented)
- QCI-250: Multi-Collateral Support (Draft → ReviewPending)
- QCI-251: Staking Rewards (Draft → Withdrawn)
- QCI-100: Historical - Protocol Launch (Implemented)
- QCI-150: Historical - Rejected Proposal (Rejected)
- QCI-200: Historical - Superseded Update (Superseded)
- Create a new QCI:
import { generateQCIContent } from './src/testHelpers';
const qciData = generateQCIContent(252, 'technicalUpgrade');
await registry.write.createQCI([
qciData.title,
qciData.network,
qciData.contentHash,
qciData.ipfsUrl
]);- Update QCI status (Editor only):
cast send $REGISTRY_ADDRESS "updateStatus(uint256,uint8)" 249 3 \
--private-key $EDITOR_KEY --rpc-url http://localhost:8545- Query QCIs:
# Get QCIs by status (e.g., Draft = 0)
cast call $REGISTRY_ADDRESS "getQCIsByStatus(uint8)" 0 --rpc-url http://localhost:8545
# Get QCIs by author
cast call $REGISTRY_ADDRESS "getQCIsByAuthor(address)" $AUTHOR1 --rpc-url http://localhost:8545Use the test helpers for complex scenarios:
import { TestScenarios, createBatchQCIs } from './src/testHelpers';
// Create multiple QCIs at once
const results = await createBatchQCIs(registry, 260, 5);
// Run predefined test scenarios
// See TestScenarios in testHelpers.ts for available scenarios