Skip to main content

Morpho SDK Tutorial

Introduction

The blue-sdk is the core SDK in the Morpho Stack. It provides the foundational components necessary to interact with Morpho's (formerly known as Morpho Blue) offchain ecosystem. This SDK is framework-agnostic, making it versatile for various applications. Key features include:

  • Market configuration management
  • Market data manipulation
  • User position management

Installation

First, install the necessary dependencies:

npm install @morpho-org/blue-sdk @morpho-org/morpho-ts

Setup

Import the necessary modules and set up your environment:

import {
MarketConfig,
Market,
AccrualPosition,
Position,
} from "@morpho-org/blue-sdk";
import { Time } from "@morpho-org/morpho-ts";

Basic Usage

Here's a script that demonstrates the basic usage of the blue-sdk:

// Create a new market configuration
const config = new MarketConfig({
loanToken: "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", // WETH
collateralToken: "0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0", // wstETH
oracle: "0x2a01EB9496094dA03c4E364Def50f5aD1280AD72",
irm: "0x870aC11D48B15DB9a138Cf899d20F13F79Ba00BC", // AdaptiveCurveIrm
lltv: 94_5000000000000000n, // 94.5%
});

console.log("Market Config ID:", config.id);

// Create a new market with the specified configuration
const market = new Market({
config,
totalSupplyAssets: 1000_000000000000000000n,
totalBorrowAssets: 920_000000000000000000n,
totalSupplyShares: 1000_000000000000000000000000n,
totalBorrowShares: 920_000000000000000000000000n,
lastUpdate: 1721000000n,
fee: 0n,
price: 1_100000000000000000000000000000000000n,
rateAtTarget: 94850992095n,
});

console.log("Market Utilization:", market.utilization);
console.log("Market Liquidity:", market.liquidity);
console.log("Market APY at Target:", market.apyAtTarget);

// Accrue interest to the latest timestamp
const accruedMarket = market.accrueInterest(Time.timestamp());

// Convert supply shares to assets
const shares = 1000000000000000000n;
console.log("Supply Assets for Shares:", accruedMarket.toSupplyAssets(shares));

// Create a new position in the market
const position = new AccrualPosition(
new Position({
user: "0xCDB238D68d8Da74487711bC1F8f13f3d00667D1A", // Replace with actual user address
marketId: market.id,
supplyShares: 0n,
borrowShares: 20_000000000000000000000000n,
collateral: 27_000000000000000000n,
}),
market
);

console.log("Borrow Assets:", position.borrowAssets);
console.log("Is Position Healthy:", position.isHealthy);
console.log("Max Borrowable Assets:", position.maxBorrowableAssets);

// Accrue interest for the position to the latest timestamp
const accruedPosition = position.accrueInterest(Time.timestamp());
console.log("Accrued Borrow Assets:", accruedPosition.borrowAssets);

Advanced Usage

Integrating with Other SDKs

  • Integrate with blue-sdk-ethers or blue-sdk-viem for on-chain interactions.

Error Handling

  • Implement error handling and input validation.

Complex Scenarios

  • Explore more complex scenarios, such as multi-market interactions.

Conclusion

This tutorial provides a basic overview of how to use the blue-sdk to interact with Morpho markets and positions. For more detailed information, refer to the official Morpho documentation.

Full Code Example

import {
MarketConfig,
Market,
AccrualPosition,
Position,
} from "@morpho-org/blue-sdk";
import { Time } from "@morpho-org/morpho-ts";
// Create a new market configuration
const config = new MarketConfig({
loanToken: "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", // WETH
collateralToken: "0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0", // wstETH
oracle: "0x2a01EB9496094dA03c4E364Def50f5aD1280AD72",
irm: "0x870aC11D48B15DB9a138Cf899d20F13F79Ba00BC", // AdaptiveCurveIrm
lltv: 94_5000000000000000n, // 94.5%
});

console.log("Market Config ID:", config.id);

// Create a new market with the specified configuration
const market = new Market({
config,
totalSupplyAssets: 1000_000000000000000000n,
totalBorrowAssets: 920_000000000000000000n,
totalSupplyShares: 1000_000000000000000000000000n,
totalBorrowShares: 920_000000000000000000000000n,
lastUpdate: 1721000000n,
fee: 0n,
price: 1_100000000000000000000000000000000000n,
rateAtTarget: 94850992095n,
});

console.log("Market Utilization:", market.utilization);
console.log("Market Liquidity:", market.liquidity);
console.log("Market APY at Target:", market.apyAtTarget);

// Accrue interest to the latest timestamp
const accruedMarket = market.accrueInterest(Time.timestamp());

// Convert supply shares to assets
const shares = 1000000000000000000n;
console.log("Supply Assets for Shares:", accruedMarket.toSupplyAssets(shares));

// Create a new position in the market
const position = new AccrualPosition(
new Position({
user: "0xCDB238D68d8Da74487711bC1F8f13f3d00667D1A", // Replace with actual user address
marketId: market.id,
supplyShares: 0n,
borrowShares: 20_000000000000000000000000n,
collateral: 27_000000000000000000n,
}),
market
);

console.log("Borrow Assets:", position.borrowAssets);
console.log("Is Position Healthy:", position.isHealthy);
console.log("Max Borrowable Assets:", position.maxBorrowableAssets);

// Accrue interest for the position to the latest timestamp
const accruedPosition = position.accrueInterest(Time.timestamp());
console.log("Accrued Borrow Assets:", accruedPosition.borrowAssets);