Skip to main content

When you need events

The SDK’s views.* helpers give you current state. For historical data or transaction feeds, you need to index events. Common use cases:
  • Transaction history (deposits, borrows, repays, withdrawals)
  • Lender earnings (reconstruct principal vs interest)
  • Liquidation monitoring
  • Pool analytics over time

SDK events module

import { events } from "@varla/sdk/events";
The events module provides:
  • ABI fragments for all emitted events
  • Decoding helpers for typed parsing
  • Filter builders for RPC log queries

Key events

VarlaCore

EventWhen emitted
DepositUser deposits ERC1155 collateral
WithdrawUser withdraws collateral
BorrowUser borrows from pool
RepayUser repays debt
LiquidateCollateral seized during liquidation
LiquidationDebtRepaidDebt repaid on behalf during liquidation
BadDebtHandledBad debt written off

VarlaPool

EventWhen emitted
Deposit (ERC4626)Lender deposits assets
Withdraw (ERC4626)Lender withdraws assets
DrawCore draws funds for borrower
RepayCore returns funds to pool
AccrueInterestInterest index updated
ReserveFeeCollectedReserve fee taken

VarlaOracle

EventWhen emitted
PriceUpdatedOracle price pushed
PositionConfiguredPosition metadata set
PositionInvalidatedManual invalidation
PositionFinalizedMarket marked as resolved

Example: fetch borrow history

import { createPublicClient, http, parseAbiItem } from "viem";
import { polygon } from "viem/chains";
import { addresses } from "@varla/sdk/addresses";

const client = createPublicClient({ chain: polygon, transport: http() });
const core = addresses.polygon.VarlaCore;

const logs = await client.getLogs({
  address: core,
  event: parseAbiItem("event Borrow(address indexed user, uint256 amount, uint256 scaledAmount)"),
  fromBlock: 0n,
  toBlock: "latest",
});

for (const log of logs) {
  console.log(`User ${log.args.user} borrowed ${log.args.amount}`);
}
For production, use reasonable block ranges and paginate. RPC providers often limit log query size.

Reconstructing lender earnings

ERC4626 doesn’t track per-user principal. To show “interest earned”:
  1. Index all Deposit events for the user (assets in)
  2. Index all Withdraw events for the user (assets out)
  3. Get current assets via views.readLenderSnapshot
  4. Earnings = current assets + withdrawn - deposited
// Pseudocode
const deposited = sumOfDepositEvents(user);
const withdrawn = sumOfWithdrawEvents(user);
const current = (await views.readLenderSnapshot({ client, pool, user })).assets;

const earnings = current + withdrawn - deposited;

Liquidation monitoring

For a liquidation bot or dashboard:
import { parseAbiItem } from "viem";

const logs = await client.getLogs({
  address: core,
  event: parseAbiItem(
    "event Liquidate(address indexed user, address indexed liquidator, uint256[] positionIds, uint256[] amounts, uint256 debtRepaid)"
  ),
  fromBlock: recentBlock,
});
Or use views.readBorrowers to get all borrowers, then check health factors in a loop.