BakerDAO Subgraph

The BakerDAO subgraph indexes all activity relating to BREAD. It tracks loans, collateral, liquidations, and user incentive weights. If you need to query loan data, calculate user rewards, or analyze protocol metrics, this is your go-to data source.

https://api.goldsky.com/api/public/project_clpx84oel0al201r78jsl0r3i/subgraphs/bakerdao-subgraph/1.0.9/gn

Key Concepts

User Weights & Incentives

The protocol calculates user weights based on a simple formula: your borrowed amount multiplied by the square root of days remaining on your loan. This rewards longer-term positions more heavily than short-term ones.

userWeight = borrowedTimesSqrtDays / totalBorrowedTimesSqrtDays

Only loans created after block 5623025 are eligible for incentives.

Snapshot System

The subgraph creates automatic snapshots to preserve historical data:

  • User snapshots: Created every hour for all active users

  • Global snapshots: Created every 4 hours for protocol-wide metrics

  • Real-time data: Query main entities directly for current state

These snapshots are essential for reward calculations and historical analysis.

Core Entities

User

Tracks individual user data and loan history.

type User {
  id: ID!                           # User's wallet address
  activeLoan: Loan                  # Current active loan (if any)
  totalLoansCreated: BigInt!        # Lifetime loan count
  totalCollateralProvided: BigInt!  # Total collateral ever provided
  totalBorrowed: BigInt!            # Total ever borrowed
  userWeight: BigDecimal!           # Current incentive weight (0-1)
  lastUpdated: BigInt!              # Last activity timestamp
}

Loan

Individual loan positions with time-based calculations.

type Loan {
  id: ID!                        # User's wallet address
  user: User!                    # Link to user
  collateral: BigInt!            # Current collateral amount
  borrowed: BigInt!              # Current borrowed amount
  endDate: BigInt!               # When loan expires
  numberOfDays: BigInt!          # Original loan duration
  isActive: Boolean!             # Whether loan is still active
  loanType: String!              # "BORROW" or "LOOP"
  daysRemaining: BigInt!         # Days until expiration
  borrowedTimesSqrtDays: BigInt! # Borrowed * √(days remaining)
  borrowedTimesDays: BigInt!     # Borrowed * days remaining
  isEligibleForIncentives: Boolean!
}

UserLoanSnapshot

Hourly snapshots of user loan data for historical analysis.

type UserLoanSnapshot {
  id: ID!                        # "userAddress-hourTimestamp"
  user: User!
  timestamp: BigInt!             # Snapshot time
  period: BigInt!                # timestamp / 3600 (hour number)
  hasActiveLoan: Boolean!        # Whether user had active loan
  collateral: BigInt!            # Collateral at snapshot time
  borrowed: BigInt!              # Borrowed amount at snapshot time
  daysRemaining: BigInt!         # Days remaining at snapshot time
  borrowedTimesSqrtDays: BigInt! # Weight calculation component
  borrowedTimesDays: BigInt!     # Weight calculation component
  userWeight: BigDecimal!        # Weight at snapshot time
  isEligibleForIncentives: Boolean!
}

GlobalStats

Protocol-wide statistics (single entity with ID "global_v2").

type GlobalStats {
  currentActiveLoans: BigInt!           # Number of active loans
  currentTotalCollateral: BigInt!       # Total collateral locked
  currentTotalBorrowed: BigInt!         # Total amount borrowed
  totalBorrowedTimesSqrtDays: BigInt!   # Sum of all user weights
  totalLiquidations: BigInt!            # Lifetime liquidations
  incentiveEligibilityBlock: BigInt!    # Block when incentives started
  lastToastDate: BigInt!                # Last liquidation processing date
  lastUpdated: BigInt!                  # Last time stats were updated
  lastUserSnapshotHour: BigInt!         # Tracking for hourly snapshots
  lastGlobalSnapshotPeriod: BigInt!     # Tracking for 4-hour snapshots
}

ActiveUser

Tracks which users currently have active loans.

type ActiveUser {
  id: ID!                   # User's wallet address
  user: User!               # Link to user entity
  addedAt: BigInt!          # When user became active
  lastValidated: BigInt!    # Last time status was confirmed
}

Common Queries

Get Current User Weights and Positions

query GetAllUserWeights($block: Int) {
  users(
    where: { userWeight_gt: "0" }
    block: { number: $block }
    first: 1000
  ) {
    id
    userWeight
    activeLoan {
      collateral
      borrowed
      daysRemaining
      borrowedTimesSqrtDays
      isEligibleForIncentives
    }
    totalCollateralProvided
    totalBorrowed
  }
}

Get Protocol Statistics

query GetProtocolStats($block: Int) {
  globalStats(id: "global_v2", block: { number: $block }) {
    currentActiveLoans
    currentTotalCollateral
    currentTotalBorrowed
    totalBorrowedTimesSqrtDays
    totalLiquidations
  }
}

Get Active Loans

query GetActiveLoans($block: Int) {
  loans(
    where: { isActive: true }
    block: { number: $block }
    first: 1000
  ) {
    id
    user {
      id
      userWeight
    }
    collateral
    borrowed
    daysRemaining
    loanType
    isEligibleForIncentives
  }
}

Historical User Weight Analysis

query GetUserWeightHistory($userId: String!, $fromTime: Int!, $toTime: Int!) {
  userLoanSnapshots(
    where: { 
      user: $userId
      timestamp_gte: $fromTime
      timestamp_lte: $toTime 
    }
    orderBy: timestamp
    orderDirection: asc
  ) {
    timestamp
    userWeight
    borrowed
    collateral
    daysRemaining
    hasActiveLoan
  }
}

Last updated