Skip to content

Protocol control structure ​

Fuel Credit separates administrative authority, price signing, and permissionless protocol actions. No single role can rewrite loan terms or bypass contract accounting.

V10 replaces V9's immediate owner transfer with owner proposal, exact-nominee acceptance, and owner cancellation. Proposal grants no authority. V10 also preserves borrower-claimable pro-rata collateral as a liability after partial-loan finalization; neither owner nor manager may withdraw or deploy it. V9 retains its deployed legacy rules.

Control map ​

CapabilityWho can actContract guard
Add FUEL or USDC liquidityAny walletOnly configured assets and positive amounts are accepted
Open a loanAny borrowerValid current price attestation, supported term, exact FUEL payment, and sufficient USDC liquidity
Repay a loanIts borrowerActive loan, USDC payment, and strictly before maturity; collateral remains locked
Claim collateralIts borrowerAt/after maturity: full V10 share after repayment or finalized pro-rata share; not previously claimed
Finalize a matured loanAny wallet or botActive loan and timestamp at or after maturity; no grace/cure period
Withdraw idle pool fundsCurrent ownerCannot withdraw locked borrower collateral or unavailable balances
Propose/cancel V10 ownership transferCurrent ownerNominee must be nonzero and different; proposal grants no authority
Accept V10 ownershipExact pending nomineePending proposal must exist
Replace the price oracleCurrent ownerNew address must be nonzero and different
Sign FUEL pricesCurrent price oracleAttestation is domain-, chain-, contract-, price-, and timestamp-bound

Owner ​

INITIAL_OWNER sets the owner at deployment. Thereafter, owner() is authoritative.

The current V10 owner can:

  • withdraw only idle supported assets;
  • propose or cancel ownership transfer with propose_ownership(new_owner) and cancel_ownership_transfer();
  • replace the validated rolling oracle with set_oracle(new_oracle); and
  • manage manager proposals and the strategy allowlist.

Only the pending nominee can complete ownership transfer with accept_ownership(). Deployed V9 retains its immediate transfer_ownership(new_owner) behavior.

The owner cannot:

  • modify existing loan terms;
  • withdraw locked borrower collateral;
  • repay a borrower's loan, claim a borrower's fully repaid collateral, or seize an active loan early;
  • mark a loan delinquent before maturity;
  • bypass asset, balance, status, or accounting checks.

A V10 ownership proposal does not change authority. Transfer takes effect only when the exact nominee accepts; the former owner then loses all owner authority immediately. V9 transfer remains immediate.

Owner administration page ​

The unlinked /admin route reads authoritative contract balances, pool statistics, immutable asset IDs, owner, oracle signer, and chain ID on testnet or mainnet. It also checks the selected network's oracle service.

Administrative controls appear according to authoritative V10 owner(), pending_owner(), and manager() reads. Wallet-confirmed actions can fund assets, withdraw only contract-reported available liquidity, rotate the oracle, propose/cancel ownership, or let the exact nominee accept. The contract remains the security boundary: hiding the route is convenience, not authorization. Confirmed transactions trigger a fresh onchain read.

The page never receives deployment or oracle private keys. Rotating the onchain signer does not configure the corresponding Worker.

Price oracle ​

INITIAL_PRICE_ORACLE sets the first signer. Thereafter, price_oracle() is authoritative.

The oracle signs only a current FUEL price and timestamp. It does not choose the borrower, collateral amount, term, LTV, principal, fee, maturity, or repayment rules; the contract computes and enforces those values.

The oracle key does not need transaction funds because signing occurs offchain. If the key is lost or compromised, the current owner can replace it. Old-key signatures stop verifying immediately after rotation, including otherwise-unexpired attestations.

/v1/health exposes bounded monitoring state: selected source, market and signature age, last attempt, consecutive failures, and a sanitized failure category. Refreshes emit structured success/failure logs. Three consecutive failures make health return 503. The mainnet monitoring Worker uses a secret TELEGRAM_BOT_TOKEN and non-secret numeric TELEGRAM_CHAT_ID configuration to send sanitized failure alerts at three failures and every tenth failure thereafter, plus a combined testnet/mainnet health report every twelve hours. Reports contain no keys, addresses, raw errors, or transaction data. Refresh and reporting execute independently, and health includes bounded report configuration, attempt, delivery-age, and failure-category state.

Permissionless actions ​

Pool funding and matured-loan finalization do not require a privileged wallet. This allows independent liquidity providers and automation bots to participate without receiving administrative authority. All callers pass the same contract checks.

Recovery boundaries ​

Loss scenarioRecovery path
Oracle key lost or compromisedOwner rotates to a new oracle address
Owner key lostNo onchain recovery unless ownership was transferred beforehand
Both keys lostNo privileged recovery path
Indexer or application unavailableContract state and direct contract calls remain authoritative

Owner and oracle keys must remain separate, with encrypted offline recovery backups. A production owner should use custody appropriate for its withdrawal and rotation authority.

Deployment and verification ​

Deployment tooling records the initial owner and oracle. Because both can change, deployment files are historical configuration—not proof of current authority. Verify live control with:

text
owner()
price_oracle()

The release build is deployed on testnet; owner() and price_oracle() were verified after deployment. Valueless testnet pools have been funded for lifecycle validation and mainnet remains gated by the prerequisites listed in Deployments.

Open-source infrastructure on Fuel.