Skip to main content

TextDAO Subgraph Specification

This document provides a detailed specification of the TextDAO subgraph, including its schema, entities, and relationships.

Schema Overview​

The TextDAO subgraph schema defines the structure of the data that is indexed from the TextDAO smart contracts. The main entities in the schema are:

  • Proposal
  • Vote
  • Member
  • Text
  • DeliberationConfig

Entities​

  • Proposal: Represents a proposal in the TextDAO system.
    • Header: Represents a proposal header.
    • Command: Represents a proposal command.
      • Action: Represents an action within a command.
    • Vote: Represents a vote cast on a proposal.
  • Member: Represents a member of the TextDAO.
  • Text: Represents a text document in the TextDAO system.
  • DeliberationConfig: Represents the configuration for the deliberation process.

Relationships​

  • A Proposal has many Headers, Commands, and Votes.
  • A Command has many Actions.
  • A Vote belongs to a Proposal and a Member.

Indexing Strategy​

The subgraph indexes the following events from the TextDAO smart contracts:

  • DeliberationConfigUpdated((uint256,uint256,uint256,uint256))
  • DeliberationConfigUpdatedByProposal(uint256,(uint256,uint256,uint256,uint256))
  • CommandCreated(uint256,uint256,(string,bytes)[])
  • HeaderCreated(uint256,uint256,string)
  • ProposalExecuted(uint256,uint256)
  • ProposalSnapped(uint256,uint256,uint256[],uint256[])
  • ProposalTallied(uint256,uint256,uint256)
  • ProposalTalliedWithTie(uint256,uint256,uint256[],uint256[],uint256)
  • Proposed(uint256,address,uint256,uint256,uint256)
  • RepresentativesAssigned(uint256,address[])
  • TextCreated(uint256,string)
  • TextUpdated(uint256,string)
  • TextDeleted(uint256)
  • TextCreatedByProposal(uint256,uint256,string)
  • TextUpdatedByProposal(uint256,uint256,string)
  • TextDeletedByProposal(uint256,uint256)
  • Voted(uint256,address,(uint256[3],uint256[3]))
  • VRFRequested(uint256,uint256)
  • MemberAdded(uint256,address,string)
  • MemberUpdated(uint256,address,string)
  • MemberAddedByProposal(uint256,uint256,address,string)
  • MemberUpdatedByProposal(uint256,uint256,address,string)

Each event is processed by a corresponding handler function that updates the relevant entities in the subgraph.

Query Examples​

Here are some example queries that can be performed on this subgraph:

  1. Fetch recent proposals with their headers and commands:
query RecentProposals {
proposals(first: 10, orderBy: createdAt, orderDirection: desc) {
id
proposer
createdAt
headers {
title
body
}
commands {
actions {
func
status
}
}
}
}
  1. Get votes for a specific proposal:
query ProposalVotes($proposalId: ID!) {
proposal(id: $proposalId) {
votes {
voter
rankedHeaderIds
rankedCommandIds
}
}
}
  1. Fetch member details:
query MemberDetails($memberId: ID!) {
member(id: $memberId) {
addr
name
image
bio
}
}

Future Considerations​

  • Implementing more complex aggregations for proposal statistics.
  • Adding support for tagging and categorizing proposals.
  • Enhancing the member entity with participation metrics.

For implementation details and best practices, please refer to the Coding Standards document.