Skip to main content
This guide covers the operational aspects of managing fee vaults on your OP Stack chain. For a conceptual overview of how fee vaults work, see Fee vaults.

Prerequisites

  • Access to the ProxyAdminOwner account (required for configuration changes)
  • An RPC endpoint for your L2 chain
  • cast CLI tool installed (Foundry)

Fee vault addresses

VaultAddress
SequencerFeeVault0x4200000000000000000000000000000000000011
BaseFeeVault0x4200000000000000000000000000000000000019
L1FeeVault0x420000000000000000000000000000000000001A
OperatorFeeVault0x420000000000000000000000000000000000001B

Checking vault state

View current balance

export L2_RPC=<L2_RPC>
export VAULT=<VAULT_ADDRESS>

cast balance $VAULT --rpc-url $L2_RPC

View configuration

# Recipient address
cast call $VAULT "recipient()" --rpc-url $L2_RPC

# Minimum withdrawal amount (in wei)
cast call $VAULT "minWithdrawalAmount()" --rpc-url $L2_RPC

# Withdrawal network (0 = L1, 1 = L2)
cast call $VAULT "withdrawalNetwork()" --rpc-url $L2_RPC

# Total ETH withdrawn historically
cast call $VAULT "totalProcessed()" --rpc-url $L2_RPC

Updating configuration

Configuration changes require the ProxyAdminOwner account. If your chain uses a multisig as the ProxyAdminOwner, these calls must be executed through the multisig.

Set recipient

export L2_RPC=<L2_RPC>
export VAULT=<VAULT_ADDRESS>
export PK=<PROXY_ADMIN_OWNER_PRIVATE_KEY>

cast send --rpc-url $L2_RPC --private-key $PK \
  $VAULT "setRecipient(address)" <NEW_RECIPIENT_ADDRESS>

Set minimum withdrawal amount

cast send --rpc-url $L2_RPC --private-key $PK \
  $VAULT "setMinWithdrawalAmount(uint256)" <AMOUNT_IN_WEI>

Set withdrawal network

# 0 = L1, 1 = L2
cast send --rpc-url $L2_RPC --private-key $PK \
  $VAULT "setWithdrawalNetwork(uint8)" <0_OR_1>

Withdrawing fees

Withdrawals are permissionless — anyone can trigger them once the vault balance meets the minimum threshold.

Trigger a withdrawal

cast send --rpc-url $L2_RPC --private-key $PK \
  $VAULT "withdraw()"
This withdraws the entire vault balance to the configured recipient.

Withdrawal behavior by network

  • L2 withdrawal (withdrawalNetwork = 1): Funds are transferred immediately to the recipient on L2. The transaction completes in a single step.
  • L1 withdrawal (withdrawalNetwork = 0): An L2-to-L1 withdrawal is initiated via the L2ToL1MessagePasser. After calling withdraw(), you must still:
    1. Wait for the withdrawal to be included in an L2 output root
    2. Prove the withdrawal on L1
    3. Wait for the finalization period
    4. Finalize the withdrawal on L1
    For details on completing L1 withdrawals, see Withdrawal flow.

Initial configuration during deployment

Fee vault recipients, minimum withdrawal amounts, and withdrawal networks are configured during chain deployment with op-deployer. For details on setting these parameters, see the op-deployer setup guide.

Monitoring

It’s good practice to monitor your fee vaults regularly:
  • Vault balances: Track balances to know when withdrawals can be triggered.
  • totalProcessed: Monitor cumulative withdrawals over time to understand revenue trends.

Next steps