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