Skip to content

Get Data

Before Starting

In this tutorial, you might see different ways to fetch data for Morpho Vaults:

  • API: Using the Morpho public API (see endpoint below). This is the easiest and most direct way for most applications. Note that only a subset of chains are supported.
  • Typescript: Using Typescript snippet. For Developers expecting to perform offchain computation.
  • Smart Contract: Fetching data directly onchain. This is best for real-time or trustless data.
  • SDK: [Examples Incoming] Using the Morpho SDKs for pre-built abstractions and faster development.

For each topic below, you'll find short guides for each method (where possible). This avoids redundancy and helps you choose the best approach for your use case.

Basics

Vaults List

How to retrieve all deployed vaults?

API
query {
  vaults(first: 1000, where: { chainId_in: [1, 8453] }) {
    items {
      address
      symbol
      name
      whitelisted
      asset {
        id
        address
        decimals
      }
      chain {
        id
        network
      }
    }
  }
}

Total Deposits & Assets


All vaults

All Vaults
query {
  vaults(first: 100, orderBy: TotalAssetsUsd, orderDirection: Desc) {
    items {
      address
      state {
        totalAssets
        totalAssetsUsd
        totalSupply
      }
    }
  }
}


Unique vault

Unique Vault
query {
  vaultByAddress(
    address: "0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB"
    chainId: 1
  ) {
    address
    state {
      totalAssets
      totalAssetsUsd
      totalSupply
    }
  }
}

APY (Native + Rewards)



All Vaults
query {
  vaults(first: 100, orderBy: TotalAssetsUsd, orderDirection: Desc) {
    items {
      address
      asset {
        yield {
          apr
        }
      }
      state {
        apy
        netApy
        netApyWithoutRewards
        dailyApy
        dailyNetApy
        weeklyApy
        weeklyNetApy
        monthlyApy
        monthlyNetApy
        rewards {
          asset {
            address
          }
          supplyApr
          yearlySupplyTokens
        }
        allocation {
          supplyAssets
          supplyAssetsUsd
          market {
            uniqueKey
            state {
              rewards {
                asset {
                  address
                }
                supplyApr
                borrowApr
              }
            }
          }
        }
      }
    }
  }
}


Unique Vault
query {
  vaultByAddress(
    address: "0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB"
    chainId: 1
  ) {
    address
    asset {
      yield {
        apr
      }
    }
    state {
      apy
      netApy
      netApyWithoutRewards
      dailyApy
      dailyNetApy
      weeklyApy
      weeklyNetApy
      monthlyApy
      monthlyNetApy
      rewards {
        asset {
          address
        }
        supplyApr
        yearlySupplyTokens
      }
      allocation {
        supplyAssets
        supplyAssetsUsd
        market {
          uniqueKey
          state {
            rewards {
              asset {
                address
              }
              supplyApr
              borrowApr
            }
          }
        }
      }
    }
  }
}

Markets Allocation

All Vaults
query {
  vaults(first: 100, orderBy: TotalAssetsUsd, orderDirection: Desc) {
    items {
      address
      state {
        allocation {
          market {
            uniqueKey
            loanAsset {
              name
            }
            collateralAsset {
              name
            }
            oracleAddress
            irmAddress
            lltv
          }
          supplyCap
          supplyAssets
          supplyAssetsUsd
        }
      }
    }
  }
}


Unique Vault
query {
  vaultByAddress(
    address: "0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB"
    chainId: 1
  ) {
    address
    state {
      allocation {
        market {
          uniqueKey
          loanAsset {
            name
          }
          collateralAsset {
            name
          }
          oracleAddress
          irmAddress
          lltv
        }
        supplyCap
        supplyAssets
        supplyAssetsUsd
      }
    }
  }
}

Historical

APY Historical state

All Vaults
query VaultApys($options: TimeseriesOptions) {
  vaults(first: 10, orderBy: TotalAssetsUsd, orderDirection: Desc) {
    items {
      address
      historicalState {
        apy(options: $options) {
          x
          y
        }
        netApy(options: $options) {
          x
          y
        }
      }
    }
  }
}


Unique Vault
query VaultApys($options: TimeseriesOptions) {
  vaultByAddress(address: "0x73e65DBD630f90604062f6E02fAb9138e713edD9") {
    address
    historicalState {
      apy(options: $options) {
        x
        y
      }
      netApy(options: $options) {
        x
        y
      }
    }
  }
}


with those variables

{
  "options": {
    "startTimestamp": 1740000000,
    "endTimestamp": 1742564817,
    "interval": "DAY"
  }
}

Advanced

Price of a vault token

All Vaults
query {
  vaults(first: 100, orderBy: TotalAssetsUsd, orderDirection: Desc) {
    items {
      address
      state {
        sharePrice
        sharePriceUsd
      }
    }
  }
}


Unique Vault
query {
  vaultByAddress(
    address: "0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB"
    chainId: 1
  ) {
    address
    state {
      sharePrice
      sharePriceUsd
    }
  }
}

Vault Configuration

All Vaults
query {
  vaults(first: 100, orderBy: TotalAssetsUsd, orderDirection: Desc) {
    items {
      address
      name
      whitelisted
      metadata {
        description
        forumLink
        image
        curators {
          image
          name
          url
        }
      }
      allocators {
        address
      }
      state {
        owner
        curator
        guardian
        timelock
      }
    }
  }
}


Unique Vault
query {
  vaultByAddress(
    address: "0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB"
    chainId: 1
  ) {
    address
    name
    whitelisted
    metadata {
      description
      forumLink
      image
      curators {
        image
        name
        url
      }
    }
    allocators {
      address
    }
    state {
      owner
      curator
      guardian
      timelock
    }
  }
}

Depositors

Set of Vaults
query {
  vaultPositions(
    first: 10
    orderBy: Shares
    orderDirection: Desc
    where: {
      vaultAddress_in: [
        "0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB"
        "0x73e65DBD630f90604062f6E02fAb9138e713edD9"
      ]
    }
  ) {
    items {
      vault {
        address
      }
      user {
        address
      }
      state {
        shares
        assets
        assetsUsd
      }
    }
  }
}


Unique Vault
query {
  vaultPositions(
    first: 10
    orderBy: Shares
    orderDirection: Desc
    where: { vaultAddress_in: ["0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB"] }
  ) {
    items {
      user {
        address
      }
      state {
        shares
        assets
        assetsUsd
      }
    }
  }
}

Transaction history

Unique Vault
query {
  transactions(
    first: 10
    orderBy: Timestamp
    orderDirection: Desc
    where: { vaultAddress_in: ["0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB"] }
  ) {
    items {
      blockNumber
      hash
      type
      user {
        address
      }
    }
  }
}

Vault Queues

All Vaults
query {
  vaults(first: 100, orderBy: TotalAssetsUsd, orderDirection: Desc) {
    items {
      address
      state {
        totalAssets
        lastTotalAssets
        allocation {
          supplyQueueIndex
          withdrawQueueIndex
          market {
            uniqueKey
          }
        }
      }
    }
  }
}


Unique Vault
query {
  vaultByAddress(
    address: "0xBEEF01735c132Ada46AA9aA4c54623cAA92A64CB"
    chainId: 1
  ) {
    address
    state {
      totalAssets
      lastTotalAssets
      allocation {
        supplyQueueIndex
        withdrawQueueIndex
        market {
          uniqueKey
        }
      }
    }
  }
}

Vaults Warnings

Warnings type are:

  • unrecognized_deposit_asset,
  • unrecognized_vault_curator,
  • not_whitelisted

Warning level is either:

  • YELLOW,
  • RED.


API
query {
  vaults {
    items {
      name
      warnings {
        type
        level
      }
    }
  }
}

User all Vaults Position

query GetAllUserPositions($chainId: Int!, $userAddress: String!) {
  vaultPositions(
    where: {
      chainId_in: [$chainId]
      shares_gte: 0
      userAddress_in: [$userAddress]
    }
  ) {
    items {
      id
      assets
      vault {
        id
        address
      }
    }
  }
}

Onchain & API combination - Vaults

In this tutorial, we'll explore how to compute the APY and rewards for Morpho Vaults. We'll cover both the calculation of the vault's APY based on allocated assets across markets and the computation of rewards.

First one has to get the Rate (of Native APY or Reward APR) on the markets belonging to the vault and apply the weight method to get the final values.



Native APY Computation

To compute the Annual Percentage Yield (APY) of Morpho Vaults, one has to follow a weighted approach based on the liquidity allocated in each market within the vault's withdraw queue.

1. Retrieve Liquidity: Identify the liquidity allocated in each market in the vault's withdrawal queue.
2. Get APYs: Retrieve the APY of each market thanks to this tutorial.
3. Compute the Weighted APY:

Native APY=APYmarketAassets allocatedInMarketA+APYmarketBassets allocatedInMarketB+totalAssetsAllocated\text{Native APY} = \small{ \frac{\text{APY}_{\text{marketA}} \cdot \text{assets}_{\text{ allocatedInMarketA}} + \text{APY}_{\text{marketB}} \cdot \text{assets}_{\text{ allocatedInMarketB}} + \ldots}{\text{totalAssetsAllocated}} }

where:

  • APYMarketX refers to the APY of market X.
  • assetsAllocatedInMarketA is the amount of assets the vault has allocated in market X.
  • totalAssetsAllocated is the sum of all assets allocated across markets.


Rewards Computation
A. Get Reward Emission

Retrieve the reward emission rate. Refer to the dedicated rewards section or the Morpho API section related to rewards.

B. Calculate Reward ValueRewardValue=(emissionRate perYearpriceRewardToken USD)10assetDecimalsrewardTokenDecimals(marketTotalAssetsassetPriceUSD)\small{ \text{RewardValue} = \frac{\left(\text{emissionRate}_{\text{ perYear}} \cdot \text{priceRewardToken}_{\text{ USD}}\right) \cdot 10^{\text{assetDecimals}-{\text{rewardTokenDecimals}}}}{\left(\text{marketTotalAssets} \cdot \text{assetPriceUSD}\right) }}
  • emissionRatePerYear is the annual rate of reward emission. Potentially, there are supply, borrow, and collateral emission rates. In the case of Morpho Vaults, only the supply emission rate matters.
  • priceRewardTokenUSD is the price of the reward token in USD.
  • rewardTokenDecimals is the decimal places of the reward token.
  • marketTotalAssets is the total supply of assets in the market.
  • assetPriceUSD is the price of the asset in USD.
  • assetDecimals is the decimal of the asset.
RewardsAPY=rewardsmarketAassets allocatedInMarketA+RewardsmarketBassets allocatedInMarketB+totalAssetsAllocated\small{ \frac{\text{rewards}_{\text{marketA}} \cdot \text{assets}_{\text{ allocatedInMarketA}} + \text{Rewards}_{\text{marketB}} \cdot \text{assets}_{\text{ allocatedInMarketB}} + \ldots}{\text{totalAssetsAllocated}} }