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/gnKey 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 / totalBorrowedTimesSqrtDaysOnly 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