Skip to content

Abdicate Gates

This guide explains why and how curators can abdicate the three critical gates to guarantee users always have access to their funds, preserving the vault's non-custodial properties.

Why Abdicate Gates?

Morpho Vault V2 implements four gates that control access to vault operations. Three of these gates are critical because they can potentially block users from accessing their funds:

GateRiskWhy It's Critical
Receive Shares GateCan prevent users from receiving shares during depositsUsers could deposit assets but not receive shares
Send Shares GateCan lock users out of withdrawals and transfersUsers cannot exit the vault
Receive Assets GateCan prevent users from receiving assets on withdrawalUsers can burn shares but not receive their assets

The fourth gate (Send Assets Gate) is non-critical because it only restricts who can deposit—it cannot block existing users from withdrawing.

Non-Custodial Guarantee

By abdicating the three critical gates to address(0), a curator permanently guarantees that:

  • No access restrictions can ever be imposed on withdrawals
  • Users can always exit the vault and receive their assets
  • The vault remains truly non-custodial

This is an irreversible action that provides depositors with the strongest possible assurance.

Prerequisites

Before abdicating, ensure:

  1. All three critical gates are set to address(0) (no gate configured)
  2. You are connected with the Curator wallet
  3. You understand this action is permanent and irreversible

Tutorial: Abdicate Gates via Etherscan

Abdication follows a two-step timelocked process: first submit, wait for the timelock, then execute.

Step 1: Verify Current Gate Settings

  1. Go to your vault's contract on Etherscan
  2. Navigate to Read Contract
  3. Check the following functions return 0x0000000000000000000000000000000000000000:
    • receiveSharesGate()
    • sendSharesGate()
    • receiveAssetsGate()

If any gate is not address(0), you must first set it to zero using the corresponding setter function (also timelocked).

Step 2: Submit Abdication

Navigate to Write Contract and connect your Curator wallet.

For each gate you want to abdicate, call the submit function with the encoded abdicate call data:

Gate to AbdicateData to Submit
Receive Shares Gate0xb2e328482cb19f9800000000000000000000000000000000000000000000000000000000
Send Shares Gate0xb2e32848c21ad02800000000000000000000000000000000000000000000000000000000
Receive Assets Gate0xb2e3284804dbf0ce00000000000000000000000000000000000000000000000000000000
  1. Find the submit function
  2. Enter the data from the table above
  3. Click Write and confirm the transaction
  4. Repeat for each gate

Step 3: Wait for Timelock

After submitting, you must wait for the vault's timelock period to elapse before executing.

To check the timelock duration, call timelock(bytes4 selector) with the abdicate selector: 0xb2e32848.

Step 4: Execute Abdication

Once the timelock has passed, execute each abdication:

  1. Find the abdicate function
  2. Enter the gate setter selector:
    • Receive Shares Gate: 0x2cb19f98
    • Send Shares Gate: 0xc21ad028
    • Receive Assets Gate: 0x04dbf0ce
  3. Click Write and confirm the transaction

Function Selector Reference

Gate Setter FunctionSelector
setReceiveSharesGate(address)0x2cb19f98
setSendSharesGate(address)0xc21ad028
setReceiveAssetsGate(address)0x04dbf0ce
setSendAssetsGate(address)0x871c979c

Step 5: Verify Abdication

After all transactions confirm, verify the abdication was successful:

  1. Go to Read Contract
  2. Call abdicated(bytes4 selector) with each gate setter selector
  3. Confirm all three return true

Using Solidity

Step 1: Submit Abdications

import {IVaultV2} from "@morpho-org/vault-v2/interfaces/IVaultV2.sol";
 
// Submit abdication for all three critical gates
vault.submit(abi.encodeCall(IVaultV2.abdicate, (IVaultV2.setReceiveSharesGate.selector)));
vault.submit(abi.encodeCall(IVaultV2.abdicate, (IVaultV2.setSendSharesGate.selector)));
vault.submit(abi.encodeCall(IVaultV2.abdicate, (IVaultV2.setReceiveAssetsGate.selector)));

Step 2: Execute After Timelock

// After timelock has passed, execute each abdication
vault.abdicate(IVaultV2.setReceiveSharesGate.selector);
vault.abdicate(IVaultV2.setSendSharesGate.selector);
vault.abdicate(IVaultV2.setReceiveAssetsGate.selector);