Skip to main content
Governance owns the controller. Protocol-admin changes are scheduled as typed AdminOperation values and executed after the timelock delay.

Roles

RolePurpose
PROPOSERSchedules operations.
EXECUTORExecutes ready operations when execution is restricted.
CANCELLERCancels pending operations.
ORACLEGovernance operational role for oracle-related administration.

Entry Points

FunctionPurpose
deploy_controller(wasm_hash)One-time controller deployment.
controller()Returns deployed controller address.
propose(proposer, op, salt)Validates and schedules an AdminOperation.
execute(executor, target, function, args, predecessor, salt)Executes a ready controller-targeted operation.
cancel(canceller, operation_id)Cancels a pending operation.
get_min_delay()Returns timelock delay in ledgers.
get_operation_state(operation_id)Returns operation lifecycle state.
get_operation_ledger(operation_id)Returns ready ledger, done marker, or unset marker.
hash_operation(target, function, args, predecessor, salt)Computes operation id.
resolve_market_oracle_config(asset, cfg)Read-only helper matching proposal-time oracle resolution.
resolve_oracle_tolerance(tolerance)Read-only helper matching proposal-time tolerance resolution.

AdminOperation Groups

Controller-targeted variants include:
  • aggregator and accumulator;
  • pool template, pool deployment, pool upgrade, and pool params;
  • token approval and Blend pool approval;
  • hub creation;
  • spoke creation, deprecation, and spoke-asset changes;
  • market creation;
  • oracle config, oracle disable, and oracle tolerance;
  • position limits and minimum borrow collateral;
  • position manager registration;
  • controller upgrade, migration, and ownership transfer.
Governance-self variants include:
  • governance upgrade;
  • delay update;
  • governance role grant/revoke;
  • governance ownership transfer.

Execution Model

Controller-targeted operations execute through execute. Governance-self operations use typed inline execution because Soroban does not allow the generic self-call pattern used for controller calls. Testing-only immediate forwarders are gated by #[cfg(any(test, feature = "testing"))] and are not part of the production admin path.