Skip to main content
Package: @blend-money/sdk-coreGitHub · npm · Monorepo: sdks

Install

  • pnpm
  • npm
  • yarn
pnpm 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