Skip to main content
The controller stores protocol configuration and account positions. The pool stores each market’s parameters and accounting state. Renew storage before it expires. Restore archived entries as required by the transaction footprint.

Controller instance keys

Instance storage shares the contract instance’s lifetime: Pool deployment and upgrade receive the Wasm hash as an argument. They do not require a stored pool template.

Controller persistent keys

Shared records hold protocol, hub, and spoke state. User records hold account state and have a shorter renewal target. Account ownership lives in the Position NFT contract. Oracle configuration lives in the price aggregator under PriceKey::Token(address) or PriceKey::Ref(symbol), as described in Oracles.

Pool persistent keys

Market storage uses both hub id and token address. Keep both fields when building keeper footprints; the same token under two hubs has two distinct market rows.

TTL

Time to live (TTL) is extended only on paths that call renewal helpers. A read or transaction does not automatically renew every related entry. The table uses approximately 17,280 ledgers per day. TTL is measured in ledgers, so these day counts depend on ledger cadence. The network’s maximum entry TTL also limits extensions. A simulation does not commit a TTL extension. renew_account(caller, account_id) requires the account owner to authorize. It extends the controller instance, existing account records, and NFT Owner and holder Balance entries. It moves no funds and remains callable during global pause. Direct permissionless NFT renew(token_id) renews only NFT state. account_exists(id) checks controller metadata. A successful call can renew that entry through the storage read helper, but it does not prove or renew the position maps, delegates, or NFT state. Use the owner, account attributes, and position views for those checks. An integrating contract owns its local account-id key and instance. Renew both on successful use; protocol account renewal cannot extend them. After an action that can delete the lending account, clear the local key only when try_account_exists returns Ok(Ok(false)). Abort on a lookup failure. A zero token balance or an empty indexed response does not prove account deletion. For a contract-owned account, expose an authenticated renewal entrypoint that uses the owner and controller addresses stored by your contract. It can call renew_account as the current contract after renewing its own instance and key. Do not accept an arbitrary controller address for account reconciliation. The off-chain keeper extends or restores its configured instances, code, and shared entries: controller, governance, pool, price aggregator, hub/spoke listings, pool market rows, oracle configuration, and access-control records. Dormant accounts also need account renewal. Archived persistent entries remain restorable with RestoreFootprint. Renewal and restoration procedures are in the RPC disruption runbook.