State Decoders
All decoders are in lib/veil/state.ts.
LendingPool
import { decodeLendingPool, LendingPoolData } from './lib/veil/state';
const accountInfo = await connection.getAccountInfo(poolAddress);
const pool: LendingPoolData = decodeLendingPool(accountInfo.data);
console.log(pool.totalDeposits); // bigint
console.log(pool.totalBorrows); // bigint
console.log(pool.supplyIndex); // bigint (WAD-scaled)
console.log(pool.borrowIndex); // bigint (WAD-scaled)
console.log(pool.paused); // boolean
console.log(pool.flashFeeRateBps); // number
console.log(pool.oraclePrice); // bigint (raw Pyth price)
console.log(pool.oracleExpo); // number (negative exponent)Compute the current USD price from cache:
const priceUsd = Number(pool.oraclePrice) * Math.pow(10, pool.oracleExpo);UserPosition
import { decodeUserPosition, UserPositionData } from './lib/veil/state';
import { findUserPositionPda } from './lib/veil/pda';
const [positionPda] = await findUserPositionPda(userPubkey, poolPubkey);
const info = await connection.getAccountInfo(positionPda);
const pos: UserPositionData = decodeUserPosition(info.data);
console.log(pos.depositShares); // bigint
console.log(pos.borrowPrincipal); // bigint
console.log(pos.borrowIndexSnapshot); // bigint (WAD-scaled)Compute current balances:
const WAD = 1_000_000_000_000_000_000n;
const depositBalance = (pos.depositShares * pool.supplyIndex) / WAD;
const currentDebt = (pos.borrowPrincipal * pool.borrowIndex) / pos.borrowIndexSnapshot;
const healthFactor = currentDebt === 0n
? BigInt('0xFFFFFFFFFFFFFFFF')
: (depositBalance * pool.liquidationThreshold) / currentDebt;IkaDwalletPosition
import { decodeIkaPosition } from './lib/veil/state';
import { findIkaPosition } from './lib/ika/pda';
import { PROGRAM_ID } from './lib/veil/constants';
const [ikaPda] = await findIkaPosition(poolPubkey, userPubkey, PROGRAM_ID);
const info = await connection.getAccountInfo(ikaPda);
const ikaPos = decodeIkaPosition(info.data);
console.log(ikaPos.owner); // PublicKey
console.log(ikaPos.dwallet); // PublicKey (Ika dWallet address)
console.log(ikaPos.usdValue); // bigint (USD cents)
console.log(ikaPos.curve); // number
console.log(ikaPos.signatureScheme); // number
console.log(ikaPos.status); // 0=Active 1=Released 2=LiquidatedEncryptedPosition
import { decodeEncryptedPosition } from './lib/veil/state';
const encPos = decodeEncryptedPosition(info.data);
console.log(encPos.encDeposit); // Uint8Array(32) — ciphertext account pubkey
console.log(encPos.encDebt); // Uint8Array(32) — ciphertext account pubkey
// Amounts are hidden — only the position owner can decrypt via FHE keyLast updated on