Skip to content

paltalabs/defindex-sdk

Repository files navigation

DeFindex SDK

Official TypeScript SDK for DeFindex - A decentralized vault management system built on Stellar using Soroban smart contracts.

🌟 Features

  • πŸ” API Key Authentication: Secure API key authentication with Bearer tokens (recommended)
  • 🏦 Vault Operations: Create, deposit, withdraw, and manage decentralized vaults
  • 🏭 Factory Operations: Deploy new vaults with custom configurations
  • πŸ‘‘ Admin Operations: Emergency rescue, strategy management for vault operators
  • πŸ“Š Real-time Data: Vault balances, APY tracking, and comprehensive vault information
  • πŸ”’ Server-Side Focused: Secure handling of credentials and sensitive operations
  • πŸ“ TypeScript Support: Full type safety with comprehensive interfaces
  • ⚑ Lightweight: Simple authentication and comprehensive error handling
  • πŸ§ͺ Well Tested: Comprehensive unit and integration test coverage
  • πŸ“š Complete Examples: Functional TypeScript examples and comprehensive documentation

πŸš€ Installation

pnpm install @defindex/sdk

πŸ“– Quick Start

import { DefindexSDK, SupportedNetworks } from '@defindex/sdk';

// Initialize with API key
const sdk = new DefindexSDK({
  apiKey: 'sk_your_api_key_here',
  baseUrl: 'https://api.defindex.io'
});

// Check API health
const health = await sdk.healthCheck();
console.log('API Status:', health.status.reachable);

// Get factory address
const factory = await sdk.getFactoryAddress(SupportedNetworks.TESTNET);
console.log('Factory Address:', factory.address);

// Get vault information
const vaultAddress = 'CVAULT_CONTRACT_ADDRESS...';
const vaultInfo = await sdk.getVaultInfo(vaultAddress, SupportedNetworks.TESTNET);
console.log(`Vault: ${vaultInfo.name} (${vaultInfo.symbol})`);

// Deposit to vault
const depositResponse = await sdk.depositToVault(vaultAddress, {
  amounts: [1000000], // Amount for each asset (considering decimals)
  caller: 'GUSER_ADDRESS...',
  invest: true,
  slippageBps: 100 // 1% slippage tolerance
}, SupportedNetworks.TESTNET);

// Sign the XDR with your wallet and submit
const signedXdr = await yourWallet.sign(depositResponse.xdr);
const result = await sdk.sendTransaction(signedXdr, SupportedNetworks.TESTNET, false);

πŸš€ Running the Example

The SDK includes a comprehensive functional example:

# Install dependencies
pnpm install

# Copy environment configuration
cp .env.example .env

# Edit .env with your credentials
# DEFINDEX_API_KEY=sk_your_api_key_here

# Run the example
pnpm run example

The example demonstrates:

  • SDK initialization and authentication
  • API health checking
  • Factory operations
  • Vault creation, deposits, and withdrawals
  • Administrative vault management
  • Error handling and best practices

πŸ”§ Configuration

SDK Configuration Options

interface DefindexSDKConfig {
  apiKey?: string;         // API key for authentication (recommended)
  baseUrl?: string;        // Custom API base URL (defaults to 'https://api.defindex.io')
  timeout?: number;        // Request timeout in ms (defaults to 30000)
}

Environment Variables

For better security, use environment variables:

// Using API key (recommended)
const sdk = new DefindexSDK({
  apiKey: process.env.DEFINDEX_API_KEY,
  baseUrl: process.env.DEFINDEX_API_URL || 'https://api.defindex.io'
});

βœ… Current Status

Great News! The DeFindex API is now fully operational on testnet:

  • βœ… Health Check: Working correctly
  • βœ… SDK Authentication: API key authentication implemented
  • βœ… Factory Operations: Factory deployed and working on testnet
  • βœ… Vault Creation: Create vaults with custom configurations
  • βœ… Vault Operations: Full deposit, withdrawal, and balance operations
  • βœ… Vault Management: Administrative operations (pause/unpause strategies, emergency rescue)
  • βœ… Transaction Building: All operations return signed XDR for wallet integration
  • ⚠️ APY Calculation: Working but some fields may be undefined for new vaults

Recent Updates

  1. βœ… Factory Deployed: Factory contract now available on testnet
  2. βœ… Full Vault Operations: Create, manage, and interact with vaults
  3. βœ… Complete Example: Run pnpm run example to see all functionality
  4. βœ… Ready for Production: All core functionality is operational

πŸ“š API Reference

System Operations

Health Check

const health = await sdk.healthCheck();
if (health.status.reachable) {
  console.log('API is healthy');
}

Factory Operations

Get Factory Address

const factory = await sdk.getFactoryAddress(SupportedNetworks.TESTNET);
console.log('Factory address:', factory.address);

Create Vault

const vaultConfig: CreateDefindexVault = {
  roles: {
    0: "GEMERGENCY_MANAGER_ADDRESS...",  // Emergency Manager
    1: "GFEE_RECEIVER_ADDRESS...",       // Fee Receiver
    2: "GVAULT_MANAGER_ADDRESS...",      // Vault Manager
    3: "GREBALANCE_MANAGER_ADDRESS..."   // Rebalance Manager
  },
  vault_fee_bps: 100, // 1% fee
  assets: [{
    address: "CXLM_CONTRACT_ADDRESS...",
    strategies: [{
      address: "GSTRATEGY_CONTRACT_ADDRESS...",
      name: "XLM Strategy",
      paused: false
    }]
  }],
  name_symbol: { 
    name: "My DeFi Vault", 
    symbol: "MDV" 
  },
  upgradable: true,
  caller: "GCREATOR_ADDRESS..."
};

const response = await sdk.createVault(vaultConfig, SupportedNetworks.TESTNET);
console.log('Vault XDR:', response.xdr);

Vault Operations

Get Vault Information

const vaultInfo = await sdk.getVaultInfo(vaultAddress, SupportedNetworks.TESTNET);
console.log(`Total Assets: ${vaultInfo.totalAssets}`);
console.log(`Vault Fee: ${vaultInfo.feesBps.vaultFee / 100}%`);

Get Vault Balance

const balance = await sdk.getVaultBalance(
  vaultAddress, 
  userAddress, 
  SupportedNetworks.TESTNET
);
console.log(`Vault Shares: ${balance.dfTokens}`);

Deposit to Vault

const depositResponse = await sdk.depositToVault(vaultAddress, {
  amounts: [1000000, 2000000],
  caller: 'GUSER_ADDRESS...',
  invest: true,
  slippageBps: 100
}, SupportedNetworks.TESTNET);

Withdraw from Vault

// Withdraw specific amounts
const withdrawResponse = await sdk.withdrawFromVault(vaultAddress, {
  amounts: [500000, 1000000],
  caller: 'GUSER_ADDRESS...',
  slippageBps: 100
}, SupportedNetworks.TESTNET);

// Withdraw by shares
const shareResponse = await sdk.withdrawShares(vaultAddress, {
  shares: 1000000,
  caller: 'GUSER_ADDRESS...',
  slippageBps: 100
}, SupportedNetworks.TESTNET);

Get Vault APY

const apy = await sdk.getVaultAPY(vaultAddress, SupportedNetworks.TESTNET);
console.log(`Current APY: ${apy.apyPercent}%`);

Vault Management (Admin Operations)

Emergency Rescue

// Requires Emergency Manager role
const response = await sdk.emergencyRescue(vaultAddress, {
  strategy_address: 'GSTRATEGY_TO_RESCUE...',
  caller: 'GEMERGENCY_MANAGER_ADDRESS...'
}, SupportedNetworks.TESTNET);

Pause/Unpause Strategy

// Requires Strategy Manager role
await sdk.pauseStrategy(vaultAddress, {
  strategy_address: 'GSTRATEGY_TO_PAUSE...',
  caller: 'GSTRATEGY_MANAGER_ADDRESS...'
}, SupportedNetworks.TESTNET);

await sdk.unpauseStrategy(vaultAddress, {
  strategy_address: 'GSTRATEGY_TO_UNPAUSE...',
  caller: 'GSTRATEGY_MANAGER_ADDRESS...'
}, SupportedNetworks.TESTNET);

Transaction Management

Send Transaction

// Submit via Stellar directly
const response = await sdk.sendTransaction(
  signedXDR, 
  SupportedNetworks.TESTNET,
  false // Don't use LaunchTube
);

// Submit via LaunchTube (faster, more reliable)
const response = await sdk.sendTransaction(
  signedXDR, 
  SupportedNetworks.TESTNET,
  true // Use LaunchTube
);

System Operations

Health Check

const health = await sdk.healthCheck();
if (health.status.reachable) {
  console.log('API is healthy');
}

πŸ” Security Best Practices

  1. Environment Variables: Store credentials in environment variables, not in code
  2. Server-Side Only: This SDK is designed for server-side use only
  3. Credential Security: Keep credentials secure and never commit them to version control
  4. Error Handling: Always wrap API calls in try-catch blocks
  5. Token Management: Use refresh tokens for long-running applications
try {
  const vaultInfo = await sdk.getVaultInfo(vaultAddress, network);
  // Handle success
} catch (error) {
  console.error('Operation failed:', error.message);
  // Handle error appropriately
}

πŸ”’ Vault Management Roles

The SDK supports different operational roles:

  • Vault Managers: Can create and configure vaults
  • Emergency Managers: Can execute emergency rescues
  • Strategy Managers: Can pause/unpause individual strategies
  • Regular Users: Can deposit, withdraw, and view vault information

πŸ—οΈ Development

Building

pnpm run build

Testing

Unit Tests (Mocked)

# Run unit tests
pnpm test

# Run with coverage
pnpm run test:coverage

# Watch mode
pnpm run test:watch

# Run integration tests
pnpm run test:integration

# Run all tests
pnpm run test:all

Code Quality

pnpm run lint
pnpm run lint:fix

πŸ“Š Type Definitions

The SDK exports comprehensive TypeScript types:

import {
  DefindexSDK,
  DefindexSDKConfig,
  SupportedNetworks,
  CreateDefindexVault,
  DepositToVaultParams,
  WithdrawFromVaultParams,
  WithdrawSharesParams,
  VaultInfo,
  VaultBalance,
  VaultAPY,
  // ... and many more
} from '@defindex/sdk';

🌐 Frontend Integration

While server-side focused, you can create secure frontend integrations:

// Backend API endpoint using API key
app.post('/api/vault-info', async (req, res) => {
  try {
    const sdk = new DefindexSDK({
      apiKey: process.env.DEFINDEX_API_KEY
    });
    
    const vaultInfo = await sdk.getVaultInfo(req.body.vaultAddress, req.body.network);
    res.json(vaultInfo);
  } catch (error) {
    res.status(500).json({ error: error.message });
  }
});

πŸ“– Documentation

For comprehensive examples and detailed API documentation, see:

πŸ”— Links


Built with ❀️ by the PaltaLabs team.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 2

  •  
  •