Skip to main content

Roles and Permissions of stVault with DeFi Wrapper

This page describes DeFi Wrapper-specific roles for pooled staking products. For stVaults roles, see stVaults Roles and permissions.

DeFi Wrapper is deployed as a set of on-chain contracts (Pool, Withdrawal Queue, Distributor, optional Strategy) connected to a stVault (Vault + Dashboard). Access is controlled by a combination of:

  • TimelockController governance (proposer/executor with a mandatory delay)
  • Role-based access control (AccessControl roles on Pool/WithdrawalQueue/Distributor/Dashboard)
  • Emergency Committee (fast “pause” capabilities)

TimelockController roles (governance)

info

Use CLI yarn start defi-wrapper use-cases timelock-governance --help to get list of commands to operate TimelockController. There are shortcut commands for governing roles and other common operations for the DeFi wrapper.

TimelockController is deployed together with the pool and becomes the admin for most DeFi Wrapper components. It is self-administered, meaning role changes and privileged actions should go through timelocked proposals.

Proposer – schedules operations, and may also cancel a scheduled one. Executor – runs an operation once its delay has elapsed. Both are set at deployment, and we recommend splitting them as described in Non-Custodial Operational Setup.

The Emergency Committee is then granted CANCELLER_ROLE, so it can drop a scheduled operation without being able to schedule or run one. The factory grants only the proposer and executor, so that role has to be added afterwards by a proposal through the timelock itself.

RoleWherePermissions
PROPOSER_ROLETimelockControllerSchedule operations (schedule); proposers also get CANCELLER_ROLE (can cancel scheduled operations).
EXECUTOR_ROLETimelockControllerExecute ready operations (execute).

Pool roles

The Pool is an ERC20 share token contract (StvPool / StvStETHPool) where users deposit ETH and receive STV shares.

RoleWhen applicablePermissionsDefault assignment
DEFAULT_ADMIN_ROLEalwaysAdmin for pool roles and configurationTimelockController
ALLOW_LIST_MANAGER_ROLEallowlist pools (non-strategy)Manage the deposit allowlist: add and remove accounts, which is what DEPOSIT_ROLE recordsthe allowlist manager from the deploy config; nobody on strategy pools
DEPOSITS_PAUSE_ROLEalwaysPause ETH deposits into the poolEmergency Committee
DEPOSITS_RESUME_ROLEalwaysResume ETH depositsnobody
MINTING_PAUSE_ROLEminting pools (StvStETHPool)Pause (w)stETH mintingEmergency Committee
MINTING_RESUME_ROLEminting pools (StvStETHPool)Resume (w)stETH mintingnobody
LOSS_SOCIALIZER_ROLEminting pools (StvStETHPool)Call forceRebalanceAndSocializeLoss(...) to close an undercollateralized account, spreading the shortfall over everyone elsenobody

Allowlist specifics

  • If allowlist is enabled for StvPool / StvStETHPool, the address is granted ALLOW_LIST_MANAGER_ROLE.
  • For strategy pools the Strategy contract is added to the allowlist during deployment, and users are expected to supply via the Strategy (not via the Pool directly).
warning

Every role marked nobody on this page is unassigned at deployment. Each implementation starts with its features paused and the factory hands out only the pause halves, so resuming takes two calls: one to grant the resume role, another to use it. Both fit in a single scheduleBatch operation on the Timelock Controller, so it is one delay rather than two — but pausing is immediate, and resuming always waits out that delay.

Withdrawal Queue roles

Withdrawal Queue (WithdrawalQueue) manages withdrawal requests, finalization, and claiming.

RolePermissionsDefault assignment
DEFAULT_ADMIN_ROLEAdmin for queue rolesTimelockController
FINALIZE_ROLEFinalize withdrawals, and set the finalization gas cost coveragenodeOperator
WITHDRAWALS_PAUSE_ROLEPause new withdrawal requestsEmergency Committee
WITHDRAWALS_RESUME_ROLEResume new withdrawal requestsnobody
FINALIZE_PAUSE_ROLEPause finalizationEmergency Committee
FINALIZE_RESUME_ROLEResume finalizationnobody

Distributor roles

Distributor (Distributor) is used for Merkle-based token distributions (e.g., incentives).

RolePermissionsDefault assignment
DEFAULT_ADMIN_ROLEAdmin for distributor rolesTimelockController
MANAGER_ROLEAdd supported tokens, and update the Merkle root and CIDnodeOperatorManager

EarnETH strategy roles

A pool with the EarnETH connector adds one more contract with its own roles.

RolePermissionsDefault assignment
DEFAULT_ADMIN_ROLEAdmin for strategy rolesTimelockController
ALLOW_LIST_MANAGER_ROLEManage who may supply through the strategy, when its allowlist is enabledTimelockController
SUPPLY_PAUSE_ROLEPause entering the strategyEmergency Committee
SUPPLY_RESUME_ROLEResume entering the strategynobody
REDEEM_PAUSE_ROLEPause exiting the strategynobody
REDEEM_RESUME_ROLEResume exiting the strategynobody

The strategy carries its own allowlist, separate from the pool's. Whether it is enforced is fixed in the constructor and cannot be switched off by a transaction — turning a private strategy pool public means upgrading to an implementation deployed with the flag off.

How DeFi Wrapper wires stVault permissions

During deployment, the Factory grants the DeFi Wrapper contracts the minimum required stVault Dashboard permissions:

RolePermissionsDefault assignment
DEFAULT_ADMIN_ROLEAdmin for Dashboard rolesTimelockController
FUND_ROLE / REBALANCE_ROLE / MINT_ROLE / BURN_ROLEMove ETH into the vault, rebalance it, and mint or burn stETH against itthe pool (StvPool / StvStETHPool)
WITHDRAW_ROLETake ETH out of the vault to settle finalized requeststhe Withdrawal Queue
PAUSE_BEACON_CHAIN_DEPOSITS_ROLEStop deposits to validatorsEmergency Committee