This guide explains how to supply tokens to Morpho Vaults and earn yield using Crossmint wallets. Morpho is a decentralized lending protocol deployed across multiple EVM chains, offering ERC-4626 compliant vaults that optimize yield across lending markets.Documentation Index
Fetch the complete documentation index at: https://docs.crossmint.com/llms.txt
Use this file to discover all available pages before exploring further.
Prerequisites
To use Morpho Vaults with Crossmint wallets, you need:- A Crossmint wallet on Base
- A production API Key with the scope:
wallets:transactions.create(create in the Production Console)
- USDC on Base mainnet in the wallet
- ETH on Base for gas fees (not required if gas sponsorship is enabled)
Discover Vaults
Morpho exposes a public GraphQL API for discovering available vaults, their APYs, and total deposits. No API key is required.const MORPHO_API = "https://api.morpho.org/graphql";
const query = `{
vaultV2s(
first: 10,
where: { chainId_in: [8453], assetAddress_in: ["0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"] },
orderBy: TotalAssetsUsd,
orderDirection: Desc
) {
items {
address
name
avgNetApy
totalAssetsUsd
}
}
}`;
const response = await fetch(MORPHO_API, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ query }),
});
const data = await response.json();
const vaults = data.data.vaultV2s.items;
Supply Tokens
High-level steps to supply tokens to a Morpho Vault:- Query the Morpho API to select a vault
- Approve the vault contract to spend your tokens (ERC-20
approve) - Deposit tokens into the vault (ERC-4626
deposit)
Morpho Vaults operate on mainnet only. The wallet must hold sufficient tokens on the target chain and ETH for gas fees.
- React
- Node.js
- React Native
- Swift
- Kotlin
- REST
import { useWallet, EVMWallet } from "@crossmint/client-sdk-react-ui";
import { encodeFunctionData, erc20Abi, parseUnits } from "viem";
const USDC_ADDRESS = "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913";
const USDC_DECIMALS = 6;
const VAULT_ADDRESS = "0xbeef0e0834849aCC03f0089F01f4F1Eeb06873C9"; // Steakhouse USDC on Base
const vaultAbi = [
{
name: "deposit",
type: "function",
inputs: [
{ name: "assets", type: "uint256" },
{ name: "receiver", type: "address" },
],
outputs: [{ name: "shares", type: "uint256" }],
stateMutability: "nonpayable",
},
] as const;
export function SupplyComponent() {
const { wallet } = useWallet();
async function supply(amount: string) {
if (!wallet) return;
const evmWallet = EVMWallet.from(wallet);
const depositAmount = parseUnits(amount, USDC_DECIMALS);
// 1. Approve the vault to spend USDC
await evmWallet.sendTransaction({
to: USDC_ADDRESS,
data: encodeFunctionData({
abi: erc20Abi,
functionName: "approve",
args: [VAULT_ADDRESS, depositAmount],
}),
});
// 2. Deposit USDC into the Morpho vault
const tx = await evmWallet.sendTransaction({
to: VAULT_ADDRESS,
data: encodeFunctionData({
abi: vaultAbi,
functionName: "deposit",
args: [depositAmount, wallet.address as `0x${string}`],
}),
});
console.log("Supply complete!", tx.hash);
}
return (
<button onClick={() => supply("10")}>Supply 10 USDC</button>
);
}
import { CrossmintWallets, createCrossmint, EVMWallet } from "@crossmint/wallets-sdk";
import { encodeFunctionData, erc20Abi, parseUnits } from "viem";
const crossmint = createCrossmint({
apiKey: "YOUR_SERVER_API_KEY",
});
const crossmintWallets = CrossmintWallets.from(crossmint);
const wallet = await crossmintWallets.getWallet(
"email:user@example.com",
{ chain: "base" }
);
if (!wallet) throw new Error("Wallet not found");
await wallet.useSigner({ type: "email", email: "user@example.com" });
const evmWallet = EVMWallet.from(wallet);
const USDC_ADDRESS = "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913";
const USDC_DECIMALS = 6;
const VAULT_ADDRESS = "0xbeef0e0834849aCC03f0089F01f4F1Eeb06873C9"; // Steakhouse USDC on Base
const amount = "10";
const vaultAbi = [
{
name: "deposit",
type: "function",
inputs: [
{ name: "assets", type: "uint256" },
{ name: "receiver", type: "address" },
],
outputs: [{ name: "shares", type: "uint256" }],
stateMutability: "nonpayable",
},
] as const;
const depositAmount = parseUnits(amount, USDC_DECIMALS);
// 1. Approve the vault to spend USDC
await evmWallet.sendTransaction({
to: USDC_ADDRESS,
data: encodeFunctionData({
abi: erc20Abi,
functionName: "approve",
args: [VAULT_ADDRESS, depositAmount],
}),
});
// 2. Deposit USDC into the Morpho vault
const tx = await evmWallet.sendTransaction({
to: VAULT_ADDRESS,
data: encodeFunctionData({
abi: vaultAbi,
functionName: "deposit",
args: [depositAmount, wallet.address as `0x${string}`],
}),
});
console.log("Supply complete!", tx.hash);
import { useWallet, EVMWallet } from "@crossmint/client-sdk-react-native-ui";
import { View, Button } from "react-native";
import { encodeFunctionData, erc20Abi, parseUnits } from "viem";
const USDC_ADDRESS = "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913";
const USDC_DECIMALS = 6;
const VAULT_ADDRESS = "0xbeef0e0834849aCC03f0089F01f4F1Eeb06873C9"; // Steakhouse USDC on Base
const vaultAbi = [
{
name: "deposit",
type: "function",
inputs: [
{ name: "assets", type: "uint256" },
{ name: "receiver", type: "address" },
],
outputs: [{ name: "shares", type: "uint256" }],
stateMutability: "nonpayable",
},
] as const;
export function SupplyComponent() {
const { wallet } = useWallet();
async function supply(amount: string) {
if (!wallet) return;
const evmWallet = EVMWallet.from(wallet);
const depositAmount = parseUnits(amount, USDC_DECIMALS);
// 1. Approve the vault to spend USDC
await evmWallet.sendTransaction({
to: USDC_ADDRESS,
data: encodeFunctionData({
abi: erc20Abi,
functionName: "approve",
args: [VAULT_ADDRESS, depositAmount],
}),
});
// 2. Deposit USDC into the Morpho vault
const tx = await evmWallet.sendTransaction({
to: VAULT_ADDRESS,
data: encodeFunctionData({
abi: vaultAbi,
functionName: "deposit",
args: [depositAmount, wallet.address as `0x${string}`],
}),
});
console.log("Supply complete!", tx.hash);
}
return (
<View>
<Button title="Supply 10 USDC" onPress={() => supply("10")} />
</View>
);
}
import CrossmintClient
import Wallet
import Foundation
let sdk = CrossmintSDK.shared
let wallet = try await sdk.crossmintWallets
.getOrCreateWallet(
chain: .base,
signer: .email(email: "user@example.com")
)
let evmWallet = try EVMWallet.from(wallet: wallet)
let usdcAddress = "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"
let vaultAddress = "0xbeef0e0834849aCC03f0089F01f4F1Eeb06873C9"
let amount = "10000000" // 10 USDC (6 decimals)
// 1. Approve the vault to spend USDC
// Encodes ERC-20 approve(address,uint256) — selector 0x095ea7b3
func leftPad(_ str: String, toLength len: Int) -> String {
String(repeating: "0", count: max(0, len - str.count)) + str
}
let addr = leftPad(String(vaultAddress.dropFirst(2)), toLength: 64)
let amt = leftPad(String(UInt64(amount)!, radix: 16), toLength: 64)
let approveData = "0x095ea7b3" + addr + amt
let _ = try await evmWallet.sendTransaction(
to: usdcAddress,
value: "0",
data: approveData
)
// 2. Deposit USDC into the Morpho vault
// Encodes ERC-4626 deposit(uint256,address) — selector 0x6e553f65
let walletAddr = leftPad(String(wallet.address.dropFirst(2)), toLength: 64)
let depositData = "0x6e553f65" + amt + walletAddr
let result = try await evmWallet.sendTransaction(
to: vaultAddress,
value: "0",
data: depositData
)
import com.crossmint.kotlin.compose.LocalCrossmintSDK
import com.crossmint.kotlin.types.EVMChain
import com.crossmint.kotlin.types.SignerData
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.runBlocking
import kotlinx.coroutines.withContext
import kotlinx.serialization.json.Json
import kotlinx.serialization.json.buildJsonObject
import kotlinx.serialization.json.jsonObject
import kotlinx.serialization.json.jsonPrimitive
import kotlinx.serialization.json.put
import kotlinx.serialization.json.putJsonArray
import kotlinx.serialization.json.putJsonObject
import java.net.HttpURLConnection
import java.net.URL
val API_KEY = "YOUR_API_KEY"
val SIGNER_EMAIL = "user@example.com"
val CROSSMINT_API = "https://www.crossmint.com/api/2025-06-09"
val USDC_ADDRESS = "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"
val VAULT_ADDRESS = "0xbeef0e0834849aCC03f0089F01f4F1Eeb06873C9"
val AMOUNT = "10000000" // 10 USDC (6 decimals)
val sdk = LocalCrossmintSDK.current
val wallet = sdk.crossmintWallets
.getOrCreateWallet(EVMChain.Base, SignerData.Email(SIGNER_EMAIL))
.getOrThrow()
val json = Json { ignoreUnknownKeys = true }
suspend fun sendEvmTransaction(to: String, data: String, value: String = "0"): String {
val body = buildJsonObject {
putJsonObject("params") {
put("chain", "base")
put("signer", "email:$SIGNER_EMAIL")
putJsonArray("calls") {
add(buildJsonObject {
put("to", to)
put("value", value)
put("data", data)
})
}
}
}.toString()
val responseText = withContext(Dispatchers.IO) {
val conn = URL("$CROSSMINT_API/wallets/${wallet.address}/transactions")
.openConnection() as HttpURLConnection
conn.requestMethod = "POST"
conn.setRequestProperty("X-API-KEY", API_KEY)
conn.setRequestProperty("Content-Type", "application/json")
conn.doOutput = true
conn.outputStream.write(body.toByteArray())
val code = conn.responseCode
if (code !in 200..299) {
val err = conn.errorStream?.bufferedReader()?.readText()
error("Transaction request failed ($code): $err")
}
conn.inputStream.bufferedReader().readText()
}
val transactionId = json.parseToJsonElement(responseText)
.jsonObject["id"]!!.jsonPrimitive.content
val tx = wallet.approve(transactionId).getOrThrow()
return tx.onChain.txId ?: tx.onChain.userOperationHash
?: error("Transaction completed but no hash was returned")
}
// 1. Approve the vault to spend USDC
// Encodes ERC-20 approve(address,uint256) — selector 0x095ea7b3
val addr = VAULT_ADDRESS.removePrefix("0x").padStart(64, '0')
val amt = AMOUNT.toLong().toString(16).padStart(64, '0')
// 2. Deposit USDC into the Morpho vault
// Encodes ERC-4626 deposit(uint256,address) — selector 0x6e553f65
val walletAddr = wallet.address.removePrefix("0x").padStart(64, '0')
runBlocking {
sendEvmTransaction(to = USDC_ADDRESS, data = "0x095ea7b3$addr$amt")
val txHash = sendEvmTransaction(to = VAULT_ADDRESS, data = "0x6e553f65$amt$walletAddr")
}
Transactions must be approved by one of the wallet’s signers.
The SDK handles this automatically, but with the REST API you must approve the transaction to complete it.
Create the ERC-20 approve transaction
Send an ERC-20
approve transaction to allow the Morpho vault to pull tokens.curl --request POST \
--url https://www.crossmint.com/api/2025-06-09/wallets/WALLET_ADDRESS/transactions \
--header 'Content-Type: application/json' \
--header 'X-API-KEY: YOUR_API_KEY' \
--data '{
"params": {
"chain": "base",
"signer": "email:USER_EMAIL",
"calls": [{
"to": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
"value": "0",
"data": "0x095ea7b3000000000000000000000000beef0e0834849acc03f0089f01f4f1eeb06873c90000000000000000000000000000000000000000000000000000000000989680"
}]
}
}'
Approve the transaction
Use the transaction ID from the previous step to approve the transaction so it settles on-chain.
curl --request POST \
--url https://www.crossmint.com/api/2025-06-09/wallets/WALLET_ADDRESS/transactions/TRANSACTION_ID/approve \
--header 'Content-Type: application/json' \
--header 'X-API-KEY: YOUR_API_KEY'
Create the deposit transaction
Send an ERC-4626
deposit transaction to the Morpho vault. The data field encodes deposit(uint256 assets, address receiver) where:0x6e553f65is the function selector- Next 32 bytes: the deposit amount (10 USDC =
0x989680) - Last 32 bytes: the receiver wallet address, zero-padded to 32 bytes
curl --request POST \
--url https://www.crossmint.com/api/2025-06-09/wallets/WALLET_ADDRESS/transactions \
--header 'Content-Type: application/json' \
--header 'X-API-KEY: YOUR_API_KEY' \
--data '{
"params": {
"chain": "base",
"signer": "email:USER_EMAIL",
"calls": [{
"to": "0xbeef0e0834849aCC03f0089F01f4F1Eeb06873C9",
"value": "0",
"data": "0x6e553f6500000000000000000000000000000000000000000000000000000000009896800000000000000000000000001234567890abcdef1234567890abcdef12345678"
}]
}
}'
Approve the deposit transaction
Approve the deposit transaction using the ID returned in the previous step.
curl --request POST \
--url https://www.crossmint.com/api/2025-06-09/wallets/WALLET_ADDRESS/transactions/TRANSACTION_ID/approve \
--header 'Content-Type: application/json' \
--header 'X-API-KEY: YOUR_API_KEY'
Withdraw Tokens
To withdraw tokens from a Morpho Vault, call the ERC-4626withdraw function. This redeems your shares and returns the underlying tokens.
- React
- Node.js
- React Native
- Swift
- Kotlin
- REST
import { useWallet, EVMWallet } from "@crossmint/client-sdk-react-ui";
import { encodeFunctionData, parseUnits } from "viem";
const VAULT_ADDRESS = "0xbeef0e0834849aCC03f0089F01f4F1Eeb06873C9";
const USDC_DECIMALS = 6;
const withdrawAbi = [
{
name: "withdraw",
type: "function",
inputs: [
{ name: "assets", type: "uint256" },
{ name: "receiver", type: "address" },
{ name: "owner", type: "address" },
],
outputs: [{ name: "shares", type: "uint256" }],
stateMutability: "nonpayable",
},
] as const;
export function WithdrawComponent() {
const { wallet } = useWallet();
async function withdraw(amount: string) {
if (!wallet) return;
const evmWallet = EVMWallet.from(wallet);
const walletAddress = wallet.address as `0x${string}`;
const tx = await evmWallet.sendTransaction({
to: VAULT_ADDRESS,
data: encodeFunctionData({
abi: withdrawAbi,
functionName: "withdraw",
args: [parseUnits(amount, USDC_DECIMALS), walletAddress, walletAddress],
}),
});
console.log("Withdrawal complete!", tx.hash);
}
return (
<button onClick={() => withdraw("10")}>Withdraw 10 USDC</button>
);
}
import { CrossmintWallets, createCrossmint, EVMWallet } from "@crossmint/wallets-sdk";
import { encodeFunctionData, parseUnits } from "viem";
const crossmint = createCrossmint({
apiKey: "YOUR_SERVER_API_KEY",
});
const crossmintWallets = CrossmintWallets.from(crossmint);
const wallet = await crossmintWallets.getWallet(
"email:user@example.com",
{ chain: "base" }
);
if (!wallet) throw new Error("Wallet not found");
await wallet.useSigner({ type: "email", email: "user@example.com" });
const evmWallet = EVMWallet.from(wallet);
const VAULT_ADDRESS = "0xbeef0e0834849aCC03f0089F01f4F1Eeb06873C9";
const USDC_DECIMALS = 6;
const amount = "10";
const walletAddress = wallet.address as `0x${string}`;
const withdrawAbi = [
{
name: "withdraw",
type: "function",
inputs: [
{ name: "assets", type: "uint256" },
{ name: "receiver", type: "address" },
{ name: "owner", type: "address" },
],
outputs: [{ name: "shares", type: "uint256" }],
stateMutability: "nonpayable",
},
] as const;
const tx = await evmWallet.sendTransaction({
to: VAULT_ADDRESS,
data: encodeFunctionData({
abi: withdrawAbi,
functionName: "withdraw",
args: [parseUnits(amount, USDC_DECIMALS), walletAddress, walletAddress],
}),
});
console.log("Withdrawal complete!", tx.hash);
import { useWallet, EVMWallet } from "@crossmint/client-sdk-react-native-ui";
import { View, Button } from "react-native";
import { encodeFunctionData, parseUnits } from "viem";
const VAULT_ADDRESS = "0xbeef0e0834849aCC03f0089F01f4F1Eeb06873C9";
const USDC_DECIMALS = 6;
const withdrawAbi = [
{
name: "withdraw",
type: "function",
inputs: [
{ name: "assets", type: "uint256" },
{ name: "receiver", type: "address" },
{ name: "owner", type: "address" },
],
outputs: [{ name: "shares", type: "uint256" }],
stateMutability: "nonpayable",
},
] as const;
export function WithdrawComponent() {
const { wallet } = useWallet();
async function withdraw(amount: string) {
if (!wallet) return;
const evmWallet = EVMWallet.from(wallet);
const walletAddress = wallet.address as `0x${string}`;
const tx = await evmWallet.sendTransaction({
to: VAULT_ADDRESS,
data: encodeFunctionData({
abi: withdrawAbi,
functionName: "withdraw",
args: [parseUnits(amount, USDC_DECIMALS), walletAddress, walletAddress],
}),
});
console.log("Withdrawal complete!", tx.hash);
}
return (
<View>
<Button title="Withdraw 10 USDC" onPress={() => withdraw("10")} />
</View>
);
}
import CrossmintClient
import Wallet
import Foundation
let sdk = CrossmintSDK.shared
let wallet = try await sdk.crossmintWallets
.getOrCreateWallet(
chain: .base,
signer: .email(email: "user@example.com")
)
let evmWallet = try EVMWallet.from(wallet: wallet)
let vaultAddress = "0xbeef0e0834849aCC03f0089F01f4F1Eeb06873C9"
let amount = "10000000" // 10 USDC (6 decimals)
func leftPad(_ str: String, toLength len: Int) -> String {
String(repeating: "0", count: max(0, len - str.count)) + str
}
// Encodes ERC-4626 withdraw(uint256,address,address) — selector 0xb460af94
let amt = leftPad(String(UInt64(amount)!, radix: 16), toLength: 64)
let walletAddr = leftPad(String(wallet.address.dropFirst(2)), toLength: 64)
let withdrawData = "0xb460af94" + amt + walletAddr + walletAddr
let result = try await evmWallet.sendTransaction(
to: vaultAddress,
value: "0",
data: withdrawData
)
import com.crossmint.kotlin.compose.LocalCrossmintSDK
import com.crossmint.kotlin.types.EVMChain
import com.crossmint.kotlin.types.SignerData
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.runBlocking
import kotlinx.coroutines.withContext
import kotlinx.serialization.json.Json
import kotlinx.serialization.json.buildJsonObject
import kotlinx.serialization.json.jsonObject
import kotlinx.serialization.json.jsonPrimitive
import kotlinx.serialization.json.put
import kotlinx.serialization.json.putJsonArray
import kotlinx.serialization.json.putJsonObject
import java.net.HttpURLConnection
import java.net.URL
val API_KEY = "YOUR_API_KEY"
val SIGNER_EMAIL = "user@example.com"
val CROSSMINT_API = "https://www.crossmint.com/api/2025-06-09"
val VAULT_ADDRESS = "0xbeef0e0834849aCC03f0089F01f4F1Eeb06873C9"
val AMOUNT = "10000000" // 10 USDC (6 decimals)
val sdk = LocalCrossmintSDK.current
val wallet = sdk.crossmintWallets
.getOrCreateWallet(EVMChain.Base, SignerData.Email(SIGNER_EMAIL))
.getOrThrow()
val json = Json { ignoreUnknownKeys = true }
suspend fun sendEvmTransaction(to: String, data: String, value: String = "0"): String {
val body = buildJsonObject {
putJsonObject("params") {
put("chain", "base")
put("signer", "email:$SIGNER_EMAIL")
putJsonArray("calls") {
add(buildJsonObject {
put("to", to)
put("value", value)
put("data", data)
})
}
}
}.toString()
val responseText = withContext(Dispatchers.IO) {
val conn = URL("$CROSSMINT_API/wallets/${wallet.address}/transactions")
.openConnection() as HttpURLConnection
conn.requestMethod = "POST"
conn.setRequestProperty("X-API-KEY", API_KEY)
conn.setRequestProperty("Content-Type", "application/json")
conn.doOutput = true
conn.outputStream.write(body.toByteArray())
val code = conn.responseCode
if (code !in 200..299) {
val err = conn.errorStream?.bufferedReader()?.readText()
error("Transaction request failed ($code): $err")
}
conn.inputStream.bufferedReader().readText()
}
val transactionId = json.parseToJsonElement(responseText)
.jsonObject["id"]!!.jsonPrimitive.content
val tx = wallet.approve(transactionId).getOrThrow()
return tx.onChain.txId ?: tx.onChain.userOperationHash
?: error("Transaction completed but no hash was returned")
}
// Encodes ERC-4626 withdraw(uint256,address,address) — selector 0xb460af94
val amt = AMOUNT.toLong().toString(16).padStart(64, '0')
val walletAddr = wallet.address.removePrefix("0x").padStart(64, '0')
runBlocking {
val txHash = sendEvmTransaction(to = VAULT_ADDRESS, data = "0xb460af94$amt$walletAddr$walletAddr")
}
Transactions must be approved by one of the wallet’s signers.
The SDK handles this automatically, but with the REST API you must approve the transaction to complete it.
Create the withdraw transaction
Send an ERC-4626
withdraw transaction. The data field encodes withdraw(uint256 assets, address receiver, address owner) where:0xb460af94is the function selector- Next 32 bytes: the withdraw amount (10 USDC =
0x989680) - Next 32 bytes: the receiver address, zero-padded to 32 bytes
- Last 32 bytes: the owner address (same as receiver), zero-padded to 32 bytes
curl --request POST \
--url https://www.crossmint.com/api/2025-06-09/wallets/WALLET_ADDRESS/transactions \
--header 'Content-Type: application/json' \
--header 'X-API-KEY: YOUR_API_KEY' \
--data '{
"params": {
"chain": "base",
"signer": "email:USER_EMAIL",
"calls": [{
"to": "0xbeef0e0834849aCC03f0089F01f4F1Eeb06873C9",
"value": "0",
"data": "0xb460af9400000000000000000000000000000000000000000000000000000000009896800000000000000000000000001234567890abcdef1234567890abcdef123456780000000000000000000000001234567890abcdef1234567890abcdef12345678"
}]
}
}'
Approve the withdraw transaction
Approve the transaction using the ID returned in the previous step.
curl --request POST \
--url https://www.crossmint.com/api/2025-06-09/wallets/WALLET_ADDRESS/transactions/TRANSACTION_ID/approve \
--header 'Content-Type: application/json' \
--header 'X-API-KEY: YOUR_API_KEY'
Customizing the Vault
The example above uses the Steakhouse Prime Instant USDC vault on Base. You can adapt this to any Morpho vault by:- Changing the vault address — Use the Discover Vaults query to find vaults for different tokens or chains
- Changing the chain — Morpho is deployed on Ethereum, Base, Arbitrum, Polygon, and other EVM chains. Update the
chainId_infilter and the wallet chain accordingly. - Changing the token — Update the
assetAddress_infilter and token decimals to match the vault’s underlying asset
Troubleshooting
`approve` transaction reverts
`approve` transaction reverts
Ensure the wallet holds enough of the token to cover the deposit amount.
`deposit` transaction reverts
`deposit` transaction reverts
Verify the approval was confirmed before calling deposit. Check that the vault has not been paused.
Vault not found in API
Vault not found in API
Confirm the chain ID and asset address are correct. Some vaults may be delisted.
Shares not appearing
Shares not appearing
Vault shares are minted to the
receiver address. Verify the wallet address is correct.Next Steps
Yield Strategies
Learn how vaults generate returns and which strategies fit your users.
Gas Sponsorship
Remove the ETH requirement for gas fees so users only need the supply token.
Morpho SDK
Explore advanced use cases like direct market lending and borrowing.

