ERC-7540: Asynchronous ERC-4626 Tokenized Vaults

·

Extension of ERC-4626 with Asynchronous Deposit and Redemption Support

| Authors | Jeroen Offerijns, Alina Sinelnikova, Vikram Arun, Joey Santoro, Farhaan Ali, João Martins |
| Created | 2023-10-18 |
| Requires | EIP-20, EIP-165, EIP-4626, EIP-7575 |


Abstract

ERC-7540 extends ERC-4626 by introducing asynchronous deposit and redemption flows, termed Requests. This standard enables non-atomic interactions with tokenized vaults, accommodating use cases like cross-chain protocols, liquid staking, and real-world asset integrations.

Key Features


Specification

Core Definitions

Method Overrides

  1. Async Deposit Vaults:

    • deposit/mint skip asset transfers (previously handled in requestDeposit).
    • previewDeposit and previewMint always revert.
  2. Async Redemption Vaults:

    • redeem/withdraw skip share transfers (handled in requestRedeem).
    • previewRedeem and previewWithdraw always revert.

Workflow Example (Deposit)

  1. Pending: User calls requestDeposit(assets, controller, owner).
  2. Claimable: Vault internally fulfills the request.
  3. Claimed: Controller calls deposit(assets, receiver, controller) to receive shares.

👉 Explore advanced vault strategies for optimizing async flows.


Rationale

Design Choices

Security Considerations


FAQs

Q: Can a vault support both async deposit and redemption?

A: Yes. ERC-7540 allows implementations to choose one or both async flows.

Q: How are exchange rates determined for async claims?

A: Rates are vault-specific and may differ from the initial request time.

Q: Is ERC-4626 compatibility preserved?

A: Absolutely. Sync methods remain unchanged, with async flows as opt-in extensions.

👉 Learn more about vault interoperability in DeFi ecosystems.


Reference Implementation

// Simplified pseudocode  
function requestDeposit(uint256 assets, address controller, address owner) external {
    asset.transferFrom(owner, address(this), assets);  
    pendingDepositRequest[controller] += assets;  
    emit DepositRequest(controller, owner, 0, msg.sender, assets);  
}  

function deposit(uint256 assets, address receiver, address controller) external {
    claimableDepositRequest[controller] -= assets;  
    uint256 shares = convertToShares(assets);  
    _mint(receiver, shares);  
}  

For full implementation details, refer to the ERC-7540 EIP.


Copyright: CC0 (Public Domain).