Vault Operations

Updated

The SDK provides four vault primitives that work across vault protocols such as Morpho, Kamino, Jupiter JLP, and curated ERC-4626 vaults.

ConstantType StringPurpose
PRIMITIVE_VAULT_DEPOSIT"vault_deposit"Deposit assets into a vault
PRIMITIVE_VAULT_WITHDRAW"vault_withdraw"Withdraw assets from a vault
PRIMITIVE_VAULT_BORROW"vault_borrow"Borrow against a vault position
PRIMITIVE_VAULT_REPAY"vault_repay"Repay vault debt

All four primitives share a common params shape with fields including amount, asset, chain, protocol, vault_address, vault_name, and shares. When protocol is provided, the request is routed to a specific vault protocol. When omitted, the curated ERC-4626 vault logic is used.

Deposit into a Vault

vault-deposit.ts
import {
  Chaos,
  WALLET_MODEL,
  extractPrimitives,
  isVaultDepositPrimitive,
  PRIMITIVE_VAULT_DEPOSIT,
} from '@chaoslabs/ai-sdk';
 
const chaos = new Chaos({ apiKey: process.env.CHAOS_API_KEY! });
 
const response = await chaos.chat.responses.create({
  model: WALLET_MODEL,
  input: [
    {
      type: 'message',
      role: 'user',
      content: 'Deposit 1000 USDC into the Morpho USDC vault on Ethereum',
    },
  ],
  metadata: {
    user_id: 'user-1',
    session_id: 'session-1',
    wallets: [{ address: '0xYourWallet', chain: 'ethereum' }],
  },
});
 
const primitives = extractPrimitives(response);
 
for (const primitive of primitives) {
  if (isVaultDepositPrimitive(primitive)) {
    // TypeScript knows this is VaultDepositPrimitive
    console.log('Vault deposit:');
    console.log('  Amount:', primitive.params.amount);
    console.log('  Asset:', primitive.params.asset);
    console.log('  Chain:', primitive.params.chain);
    console.log('  Protocol:', primitive.params.protocol);
    console.log('  Vault:', primitive.params.vault_name ?? primitive.params.vault_address);
  }
}

Withdraw from a Vault

vault-withdraw.ts
import {
  Chaos,
  WALLET_MODEL,
  extractPrimitives,
  isVaultWithdrawPrimitive,
} from '@chaoslabs/ai-sdk';
 
const chaos = new Chaos({ apiKey: process.env.CHAOS_API_KEY! });
 
const response = await chaos.chat.responses.create({
  model: WALLET_MODEL,
  input: [
    {
      type: 'message',
      role: 'user',
      content: 'Withdraw 500 USDC from my Morpho vault on Ethereum',
    },
  ],
  metadata: {
    user_id: 'user-1',
    session_id: 'session-1',
    wallets: [{ address: '0xYourWallet', chain: 'ethereum' }],
  },
});
 
const primitives = extractPrimitives(response);
 
for (const primitive of primitives) {
  if (isVaultWithdrawPrimitive(primitive)) {
    console.log('Vault withdraw:');
    console.log('  Amount:', primitive.params.amount);
    console.log('  Asset:', primitive.params.asset);
    console.log('  Shares:', primitive.params.shares);
    console.log('  Vault:', primitive.params.vault_name ?? primitive.params.vault_address);
  }
}

Borrow Against a Vault Position

vault-borrow.ts
import {
  Chaos,
  WALLET_MODEL,
  extractPrimitives,
  isVaultBorrowPrimitive,
} from '@chaoslabs/ai-sdk';
 
const chaos = new Chaos({ apiKey: process.env.CHAOS_API_KEY! });
 
const response = await chaos.chat.responses.create({
  model: WALLET_MODEL,
  input: [
    {
      type: 'message',
      role: 'user',
      content: 'Borrow 2000 USDC against my vault position on Morpho Blue',
    },
  ],
  metadata: {
    user_id: 'user-1',
    session_id: 'session-1',
    wallets: [{ address: '0xYourWallet', chain: 'ethereum' }],
  },
});
 
const primitives = extractPrimitives(response);
 
for (const primitive of primitives) {
  if (isVaultBorrowPrimitive(primitive)) {
    console.log('Vault borrow:');
    console.log('  Amount:', primitive.params.amount);
    console.log('  Asset:', primitive.params.asset);
    console.log('  Chain:', primitive.params.chain);
    console.log('  Protocol:', primitive.params.protocol);
    console.log('  Vault:', primitive.params.vault_name ?? primitive.params.vault_address);
  }
}

Repay Vault Debt

vault-repay.ts
import {
  Chaos,
  WALLET_MODEL,
  extractPrimitives,
  isVaultRepayPrimitive,
} from '@chaoslabs/ai-sdk';
 
const chaos = new Chaos({ apiKey: process.env.CHAOS_API_KEY! });
 
const response = await chaos.chat.responses.create({
  model: WALLET_MODEL,
  input: [
    {
      type: 'message',
      role: 'user',
      content: 'Repay 1000 USDC of my Morpho Blue vault debt',
    },
  ],
  metadata: {
    user_id: 'user-1',
    session_id: 'session-1',
    wallets: [{ address: '0xYourWallet', chain: 'ethereum' }],
  },
});
 
const primitives = extractPrimitives(response);
 
for (const primitive of primitives) {
  if (isVaultRepayPrimitive(primitive)) {
    console.log('Vault repay:');
    console.log('  Amount:', primitive.params.amount);
    console.log('  Asset:', primitive.params.asset);
    console.log('  Chain:', primitive.params.chain);
    console.log('  Protocol:', primitive.params.protocol);
  }
}

Filter All Vault Primitives

Use the category-level helpers when you want to handle all vault operations at once.

vault-filter-all.ts
import {
  Chaos,
  WALLET_MODEL,
  extractPrimitives,
  isVaultPrimitive,
  VAULT_PRIMITIVES,
} from '@chaoslabs/ai-sdk';
 
const chaos = new Chaos({ apiKey: process.env.CHAOS_API_KEY! });
 
const response = await chaos.chat.responses.create({
  model: WALLET_MODEL,
  input: [
    {
      type: 'message',
      role: 'user',
      content: 'Deposit 5000 USDC into the Morpho vault and borrow 2000 USDC against it',
    },
  ],
  metadata: {
    user_id: 'user-1',
    session_id: 'session-1',
    wallets: [{ address: '0xYourWallet', chain: 'ethereum' }],
  },
});
 
// Category check: is this any vault primitive?
const allPrimitives = extractPrimitives(response);
const vaultPrimitives = allPrimitives.filter(p => isVaultPrimitive(p.type));
 
console.log(`Found ${vaultPrimitives.length} vault primitives:`);
for (const p of vaultPrimitives) {
  console.log(`  ${p.type}${p.params.amount} ${p.params.asset}`);
}
 
// Available vault primitive types for reference
console.log('\nAll vault primitive types:', VAULT_PRIMITIVES);
// => ['vault_deposit', 'vault_withdraw', 'vault_borrow', 'vault_repay']
[@portabletext/react] Unknown block type "callout", specify a component for it in the `components.types` prop
Was this helpful?