Install
pnpm add @blend-money/sdk-core
npm install @blend-money/sdk-core
yarn add @blend-money/sdk-core
Features
- Type-safe HTTP client with automatic retries and comprehensive error handling
- Safe module for Gnosis Safe operations and address resolution
- Strategy module for vault data, yields, and strategy information
- Decimal.js integration for precise financial calculations without floating-point errors
- Cross-chain utilities for LiFi, Garden, and other bridge integrations
- Comprehensive error handling with user-friendly error messages
Quick Start
import { BlendClient } from "@blend-money/sdk-core";
const client = new BlendClient({
baseUrl: "https://api.blend.money",
userAddress: "0x1234567890abcdef1234567890abcdef12345678",
integratorId: "example-app",
});
// Resolve Safe address for a specific chain
const safe = await client.safe.resolveSafeAddress(
client.getConfig().userAddress,
8453, // Base chain ID
);
console.log("Safe address:", safe.address);
Safe Operations
Resolve Safe Address
// Get Safe address for a user on a specific chain
const safe = await client.safe.resolveSafeAddress(
"0x1234567890abcdef1234567890abcdef12345678",
8453
);
if (safe.isDeployed) {
console.log("Safe is deployed at:", safe.address);
} else {
console.log("Safe needs to be deployed");
console.log("Deployment instructions:", safe.deploymentInstructions);
}
Current Balance for a Vault
import { Integrations } from "@blend-money/sdk-types";
// Discover strategies for an integration
const strategies = await client.strategy.getAvailableStrategies(Integrations.USX);
// Pick one strategy (vault) and fetch current balance
const summary = await client.strategy.getCurrentBalance(strategies[0]);
console.log("Safe:", summary.safeAddress);
console.log("Balance:", summary.formattedBalance);
Strategy Operations
Get Available Integrations and Strategies
// List integrations, then fetch strategies for one
const integrations = await client.strategy.getAvailableIntegrations();
// e.g., ["USX", "BOTANIX", ...]
const strategies = await client.strategy.getAvailableStrategies(integrations[0]);
console.log("Strategies:", strategies.map(s => `${s.name}@${s.chainId}`));
Get Vault Yields
// Get yield information for a specific vault
const vaultYields = await client.strategy.getAllYieldsFromVault({
chainId: 8453,
address: "0x1234567890abcdef1234567890abcdef12345678"
});
console.log("Vault yields:", vaultYields);
Get Integration TVL
import { Integrations } from "@blend-money/sdk-types";
const tvl = await client.strategy.getIntegrationTvl(Integrations.USX);
console.log("USX TVL:", tvl.formattedValue);
Cross-Chain Utilities
LiFi Integration (catalog + route)
import { LiFiAdapter } from "@blend-money/sdk-core";
const liFi = new LiFiAdapter({ baseUrl: "https://li.quest", chainTypesFilter: "EVM" });
// Discover supported chains/tokens
const { chains, tokens } = await liFi.getTokenCatalog();
// Build a cross-chain route as an ActionPlan
const plan = await liFi.buildCrossChainRoute({
fromToken: { address: "0x0000000000000000000000000000000000000000", symbol: "ETH", decimals: 18, chainId: 1 },
toToken: { address: "0x0000000000000000000000000000000000000000", symbol: "ETH", decimals: 18, chainId: 8453 },
amount: 1_000_000_000_000_000_000n,
fromAddress: "0x1234567890abcdef1234567890abcdef12345678",
toAddress: "0x1234567890abcdef1234567890abcdef12345678",
slippageBps: 50,
});
console.log("Plan txns:", plan.requiredTxns.length);
Garden Integration (catalog + route)
import { GardenAdapter } from "@blend-money/sdk-core";
const garden = new GardenAdapter({ baseUrl: "https://api.garden.finance/v2" });
// Discover supported chains/tokens
const { chains: gChains, tokens: gTokens } = await garden.getTokenCatalog();
// Build a cross-chain route as an ActionPlan
const gPlan = await garden.buildCrossChainRoute({
fromToken: { address: "0x0000000000000000000000000000000000000000", symbol: "ETH", decimals: 18, chainId: 1 },
toToken: { address: "0x0000000000000000000000000000000000000000", symbol: "ETH", decimals: 18, chainId: 8453 },
amount: 1_000_000_000_000_000_000n,
fromAddress: "0x1234567890abcdef1234567890abcdef12345678",
toAddress: "0x1234567890abcdef1234567890abcdef12345678",
slippageBps: 50,
});
console.log("Plan approvals:", gPlan.requiredApprovals.length);
Error Handling
The SDK provides comprehensive error handling with user-friendly messages:
Decimal.js Integration
All financial calculations use Decimal.js for precision:
import { Decimal } from "decimal.js";
import { parseAmount, formatAmount } from "@blend-money/sdk-core";
// Parse amounts with precision
const amount = parseAmount("1000.123456789", 18);
console.log("Parsed amount:", amount.toString());
// Format amounts for display
const formatted = formatAmount(amount, 6); // 6 decimal places
console.log("Formatted:", formatted); // "1000.123457"
Configuration
Client Configuration
const client = new BlendClient({
baseUrl: "https://api.blend.money", // API base URL
userAddress: "0x1234567890abcdef1234567890abcdef12345678", // User's EOA
integratorId: "example-app", // Your app identifier
timeout: 30000, // Request timeout in ms
retries: 3, // Number of retries for failed requests
});
Environment Variables
// Use environment variables for configuration
const client = new BlendClient({
baseUrl: process.env.BLEND_API_URL || "https://api.blend.money",
userAddress: process.env.USER_ADDRESS!,
integratorId: process.env.INTEGRATOR_ID!,
});
Types and Interfaces
Core Types
import type {
BlendClientConfig,
SafeInfo,
StrategyInfo,
VaultConfig,
YieldInfo,
SdkError
} from "@blend-money/sdk-core";
// Type-safe configuration
const config: BlendClientConfig = {
baseUrl: "https://api.blend.money",
userAddress: "0x1234567890abcdef1234567890abcdef12345678",
integratorId: "example-app"
};
// Type-safe responses
const safe: SafeInfo = await client.safe.resolveSafeAddress(
config.userAddress,
8453
);
Best Practices
1. Error Handling
Always wrap API calls in try-catch blocks and handle SdkError specifically:
try {
const result = await client.safe.resolveSafeAddress(address, chainId);
return result;
} catch (error) {
if (error instanceof SdkError) {
// Handle SDK-specific errors
throw new Error(`Failed to resolve Safe: ${error.getUserMessage()}`);
}
throw error;
}
2. Amount Precision
Always use Decimal.js for financial calculations:
import { Decimal } from "decimal.js";
// ❌ Don't use native numbers for financial calculations
const badAmount = 1000.123456789 * 1.1;
// ✅ Use Decimal.js for precision
const goodAmount = new Decimal("1000.123456789").mul("1.1");
3. Type Safety
Leverage TypeScript for type safety:
// ✅ Use proper types
const strategies: StrategyInfo[] = await client.strategy.getAllStrategies();
// ✅ Type-safe configuration
const config: BlendClientConfig = {
baseUrl: "https://api.blend.money",
userAddress: "0x1234567890abcdef1234567890abcdef12345678",
integratorId: "example-app"
};
References
Last modified on February 6, 2026