Liquidium

Lending Canister

The protocol orchestrator managing accounts, positions, and coordination

Responsibilities

  • Account Management: Multi-chain wallet authentication and profile linking
  • Position Tracking: User collateral and debt positions using share-based accounting
  • Interest Accrual: Calculating and applying interest via global indices
  • Health Enforcement: Validating health factors before operations
  • Pool Coordination: Orchestrating deposits, withdrawals, borrows, and repayments
  • Price Integration: Fetching and caching asset prices from oracles
  • Liquidation API: Exposing interfaces for external liquidator bots

Architecture

Account Management

Multi-Chain Authentication

Users authenticate using their existing blockchain wallets - no Internet Identity required:

Wallet Abstraction

A wallet is simply a (Chain, Address) tuple - for example (Bitcoin, "bc1q...") or (Ethereum, "0x..."). The account is derived by hashing the wallet, and the principal is derived from the first wallet's hash.

Benefits:

  • Use existing wallets (no new keys)
  • Strong cryptographic identity
  • Multi-wallet support per profile
  • Unified positions across wallets

Position Management

Each user's position in a pool is tracked using shares:

Field

Description

user_profile

Principal of the user

pool_id

Pool canister ID

asset

Asset type (BTC, ETH, USDC, etc.)

deposit_scaled

Supply shares

debt_scaled

Debt shares

lending_index_snapshot

Index at last update

borrow_index_snapshot

Index at last update

Core Operations

All operations follow the same pattern:

  1. Sync pool indices to current time
  2. Validate preconditions (caps, liquidity)
  3. Update shares (mint or burn)
  4. Validate postconditions (health factor)
  5. Schedule async execution if needed

Operation

Share Action

Health Check

Deposit

Mint supply shares

No (improves health)

Withdraw

Burn supply shares

Yes (must stay healthy)

Borrow

Mint debt shares

Yes (must stay healthy)

Repay

Burn debt shares

No (improves health)

Pool Registry

The lending canister maintains a registry of all pools with their configuration:

Category

Fields

Identity

Principal, asset, chain

Caps

Supply cap, borrow cap

Share Totals

Total supply, total debt, treasury shares

Interest Rates

Base rate, slope before, slope after, optimal utilization

Indices

Borrow index, lending index

Risk Parameters

Reserve factor, liquidation threshold, liquidation bonus

Event Handling

The lending canister receives events from pool canisters via notify_pool_event(). Events include:

  • DepositConfirmed - triggers supply share minting
  • RepaymentConfirmed - triggers debt share burning

Each event includes a ledger transaction ID for idempotency - if the same transaction ID is processed twice, the duplicate is ignored.

Background Tasks

Task

Interval

Purpose

sync_pools

600s

Update pool indices

update_prices

300s

Refresh price cache

process_wal_ops

15s

Execute pending operations

Price Integration

Prices are fetched from the price oracle and cached with a 60-second expiry. The cache prevents price manipulation attacks and reduces request overhead.