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 |
|---|---|
| Principal of the user |
| Pool canister ID |
| Asset type (BTC, ETH, USDC, etc.) |
| Supply shares |
| Debt shares |
| Index at last update |
| Index at last update |
Core Operations
All operations follow the same pattern:
- Sync pool indices to current time
- Validate preconditions (caps, liquidity)
- Update shares (mint or burn)
- Validate postconditions (health factor)
- 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 mintingRepaymentConfirmed- 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 |
|---|---|---|
| 600s | Update pool indices |
| 300s | Refresh price cache |
| 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.