Skip to content

useProposals

Get the list of governance proposals with vote receipts.

Usage

typescript
import { useProposals } from 'levr-sdk/client'

function ProposalsList() {
  const { data, isLoading } = useProposals()

  if (isLoading) return <div>Loading proposals...</div>
  if (!data) return <div>No proposals</div>

  return (
    <div>
      <h2>Cycle {data.cycleId.toString()} Proposals</h2>
      {data.winner > 0n && <p>Winner: Proposal #{data.winner.toString()}</p>}

      {data.proposals.map((proposal) => (
        <div key={proposal.id.toString()}>
          <h3>Proposal #{proposal.id.toString()}</h3>
          <p>{proposal.description}</p>
          <p>Yes: {proposal.yesVotes.formatted} | No: {proposal.noVotes.formatted}</p>
          <p>Amount: {proposal.amount.formatted} {proposal.amount.usd && `($${proposal.amount.usd})`}</p>
          <p>Meets Quorum: {proposal.meetsQuorum ? 'Yes' : 'No'}</p>
          <p>Meets Approval: {proposal.meetsApproval ? 'Yes' : 'No'}</p>
          <p>State: {proposal.state}</p>

          {/* Vote receipt (if user is connected) */}
          {proposal.voteReceipt?.hasVoted && (
            <p>
              You voted: {proposal.voteReceipt.support ? 'Yes' : 'No'}
              {' '}({proposal.voteReceipt.votes.toString()} voting power)
            </p>
          )}
        </div>
      ))}
    </div>
  )
}

Data Structure

typescript
{
  proposals: Array<{
    id: bigint
    proposalType: number // 0 = boost, 1 = transfer
    proposer: `0x${string}`
    amount: BalanceResult
    recipient: `0x${string}`
    description: string
    createdAt: { timestamp: bigint; date: Date }
    votingStartsAt: { timestamp: bigint; date: Date }
    votingEndsAt: { timestamp: bigint; date: Date }
    yesVotes: BalanceResult
    noVotes: BalanceResult
    totalBalanceVoted: bigint
    executed: boolean
    cycleId: bigint
    meetsQuorum: boolean
    meetsApproval: boolean
    state: number
    voteReceipt?: {
      hasVoted: boolean
      support: boolean
      votes: bigint
    }
  }>
  cycleId: bigint
  winner: bigint
}

Notes

  • Proposals automatically include vote receipts when user is connected
  • Vote receipts are fetched in the same multicall as proposal data (no extra RPC calls)
  • Refetches when user connects/disconnects wallet