MPC Tally API Server

import { GraphQLClient } from 'graphql-request'; import { getDAO } from '../organizations/getDAO.js'; export interface GetAddressVotesResponse { votes: { nodes: Array<{ id: string; type: string; amount: string; voter: { address: string; }; proposal: { id: string; }; block: { timestamp: string; number: number; }; chainId: string; txHash: string; }>; pageInfo: { firstCursor: string; lastCursor: string; count: number; }; }; } const GET_ADDRESS_VOTES_QUERY = ` query GetAddressVotes($input: VotesInput!) { votes(input: $input) { nodes { ... on Vote { id type amount voter { address } proposal { id } block { timestamp number } chainId txHash } } pageInfo { firstCursor lastCursor count } } } `; export async function getAddressVotes( client: GraphQLClient, input: { address: string; organizationSlug: string; limit?: number; afterCursor?: string; } ): Promise<GetAddressVotesResponse> { // First get the DAO to get the governor IDs const { organization: dao } = await getDAO(client, input.organizationSlug); // Get proposals for this DAO to get their IDs const proposalsResponse = await client.request<{ proposals: { nodes: Array<{ id: string }>; }; }>( `query GetProposals($input: ProposalsInput!) { proposals(input: $input) { nodes { ... on Proposal { id } } } }`, { input: { filters: { organizationId: dao.id, }, page: { limit: 100, // Get a reasonable number of proposals }, }, } ); const proposalIds = proposalsResponse.proposals.nodes.map((node) => node.id); // Now get the votes for these proposals from this voter return client.request<GetAddressVotesResponse>(GET_ADDRESS_VOTES_QUERY, { input: { filters: { proposalIds, voter: input.address, }, page: { limit: input.limit || 20, afterCursor: input.afterCursor, }, }, }); }