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
| Event | When emitted |
|---|
Deposit | User deposits ERC1155 collateral |
Withdraw | User withdraws collateral |
Borrow | User borrows from pool |
Repay | User repays debt |
Liquidate | Collateral seized during liquidation |
LiquidationDebtRepaid | Debt repaid on behalf during liquidation |
BadDebtHandled | Bad debt written off |
VarlaPool
| Event | When emitted |
|---|
Deposit (ERC4626) | Lender deposits assets |
Withdraw (ERC4626) | Lender withdraws assets |
Draw | Core draws funds for borrower |
Repay | Core returns funds to pool |
AccrueInterest | Interest index updated |
ReserveFeeCollected | Reserve fee taken |
VarlaOracle
| Event | When emitted |
|---|
PriceUpdated | Oracle price pushed |
PositionConfigured | Position metadata set |
PositionInvalidated | Manual invalidation |
PositionFinalized | Market 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”:
- Index all
Deposit events for the user (assets in)
- Index all
Withdraw events for the user (assets out)
- Get current
assets via views.readLenderSnapshot
- 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.