ERC7540DepositManager
Documentation for eth_defi.erc_7540.deposit_redeem.ERC7540DepositManager Python class.
- class ERC7540DepositManager
Bases:
eth_defi.vault.deposit_redeem.VaultDepositManagerProtocol-neutral asynchronous ERC-7540 deposit and redemption flow.
Generic manager for ERC-7540 request-based vaults, where deposits and redemptions are two-phase: a request transaction registers the intent, an operator settles it off-interface, and a later claim transaction moves the tokens. Protocol adapters such as Lagoon subclass this manager to add their settlement driver and access policies; the generic manager only builds the standard request and claim calls.
Deposit process
Asynchronous. The owner first
approve()``s the ERC-20 denomination token to the vault (the default :meth:`get_deposit_approval_target`). :meth:`create_deposit_request` builds the standard ``requestDeposit(assets, owner, owner)call (the request is controller-scoped, soowneris both controller and receiver — a separatetois unsupported). Broadcasting it emits aDepositRequestevent whoserequestIdis parsed into anERC7540DepositTicket. Once the operator settles,can_finish_deposit()(readingclaimableDepositRequest) turnsTrueandfinish_deposit()builds the three-argumentdeposit(assets, to, owner)claim that mints the shares.Redemption process
Asynchronous.
create_redemption_request()builds the standardrequestRedeemcall (viavault.request_redeem), controller-scoped toowner; a separatetois unsupported. Broadcasting emits aRedeemRequestevent whoserequestIdis parsed into anERC7540RedemptionTicket. After operator settlementcan_finish_redeem()(readingclaimableRedeemRequest) turnsTrueandfinish_redemption()builds the three-argumentredeem(shares, to, owner)claim. A request is identified by its ERC-7540requestIdcarried on the ticket.Queues and settlement
Requests are queued onchain and settled by the vault operator; the timing and mechanism are outside the ERC-7540 standard. Status is derived from the request-specific claimable views:
get_deposit_request_status()andget_redemption_request_status()check the ticket’s claimable amount first (an aggregatependingDepositRequest(0, owner)/pendingRedeemRequest(0, owner)query lumps all of an owner’s requests together), then fall back to the aggregate pending query, returningclaimable/pending/none. The generic layer has no reclaim signal, soreclaimableis never returned.fetch_vault_flow_events()streamsDepositRequestandRedeemRequestevents from Hypersync.Lockups and cooldowns
No deterministic protocol-level delay: settlement cadence is operator-driven.
estimate_redemption_delay()returns zero andget_redemption_delay_over()returns the Unix epoch sentinel.can_create_deposit_request()andcan_create_redemption_request()reflect only the vault’s optionalpaused()flag.Whitelisting / access control
Deposit admission is checked in
_assert_deposit_request_available(), called at the start ofcreate_deposit_request(): it first rejects a paused vault withVaultFlowUnavailable, then runs the sharedcheck_deposit_whitelist()preflight (raisingWhitelistingRequiredfor an unpermitted owner). The pause flag is read defensively — a missingpaused()view is treated as unpaused. Protocol-specific admission policies belong in subclasses.Anvil settlement (force_settle)
Settlement is operator-specific, so the generic manager deliberately has no Anvil settlement driver: the inherited
force_settle()raisesUnsupportedVaultSimulationfor an async ticket. Protocol subclasses (such as Lagoon) override it to drive settlement on a fork.Initialise the manager for an ERC-7540 vault adapter.
Protocol-specific subclasses may reuse this constructor after validating a narrower vault type.
- Parameters
vault – Protocol adapter implementing the ERC-7540 vault interface.
Attributes summary
web3Methods summary
__init__(vault)Initialise the manager for an ERC-7540 vault adapter.
analyse_deposit(claim_tx_hash, deposit_ticket)Analyse a completed ERC-7540 deposit claim.
analyse_redemption(claim_tx_hash, ...)Analyse a completed ERC-7540 redemption claim.
can_create_deposit_request(owner)Return whether the vault is currently open for a deposit request.
Return whether the vault is currently open for a redemption request.
can_finish_deposit(deposit_ticket)Check whether a deposit request is ready to claim.
can_finish_redeem(redemption_ticket)Check whether a redemption request is ready to claim.
check_deposit_whitelist(owner)Reject a deposit when the vault's whitelist excludes the owner.
create_deposit_request(owner[, to, amount, ...])Build the standard ERC-7540
requestDeposittransaction.Build deposit calldata for a closed-vault GuardV0 policy check.
create_redemption_request(owner[, to, ...])Build the standard ERC-7540
requestRedeemtransaction.estimate_deposit(owner, amount[, ...])Estimate shares for a denomination-token amount.
estimate_redeem(owner, shares[, ...])Estimate denomination tokens for a vault-share amount.
Return no deterministic protocol-level redemption delay.
Find an operator-owned terminal redemption transaction when available.
fetch_vault_flow_events(hypersync_client, ...)Fetch standard ERC-7540 request events using Hypersync.
finish_deposit(deposit_ticket)Build the ERC-7540 transaction that claims deposit shares.
finish_redemption(redemption_ticket)Build the ERC-7540 transaction that claims redeemed assets.
force_redemption_liquidity(owner, ...)Provision an unavailable synchronous redemption on an Anvil fork.
force_settle(ticket, *[, mock, ignore_liquidity])Refuse generic ERC-7540 operator settlement before a fork broadcast.
Return the ERC-20 spender required for a deposit request.
get_deposit_delay_over(address)Estimate when a pending async deposit request will settle.
Return accepted claim-deposit event signatures.
get_deposit_request_status(ticket)Map ERC-7540 deposit state to the generic status enum.
get_max_deposit(owner)How much we can deposit
get_redemption_delay_over(address)Return the legacy sentinel for an unknown account deadline.
Return accepted claim-redemption event signatures.
get_redemption_request_status(ticket)Map ERC-7540 redemption state to the generic status enum.
Report that deposits use the asynchronous request lifecycle.
Report that redemptions use the asynchronous request lifecycle.
is_deposit_in_progress(owner)Check pending ERC-7540 request.
is_redemption_in_progress(owner)Check whether a controller has pending redemption shares.
reclaim_deposit(ticket)Return a function to recover funds after a failed async deposit settlement.
reclaim_withdrawal(ticket)Return a function to recover shares after a failed async withdrawal settlement.
Reconstruct a deposit ticket from persistent data.
Reconstruct a redemption ticket from persistent data.
serialize_deposit_ticket(ticket)Serialise an ERC-7540 deposit ticket.
serialize_redemption_ticket(ticket)Serialise an ERC-7540 redemption ticket.
- deposit_request_class
Request wrapper used for deposits. Protocol subclasses may replace it.
alias of
eth_defi.erc_7540.deposit_redeem.ERC7540DepositRequest
- redemption_request_class
Request wrapper used for redemptions. Protocol subclasses may replace it.
alias of
eth_defi.erc_7540.deposit_redeem.ERC7540RedemptionRequest
- __init__(vault)
Initialise the manager for an ERC-7540 vault adapter.
Protocol-specific subclasses may reuse this constructor after validating a narrower vault type.
- Parameters
vault (eth_defi.erc_7540.vault.ERC7540Vault) – Protocol adapter implementing the ERC-7540 vault interface.
- fetch_vault_flow_events(hypersync_client, start_block, end_block)
Fetch standard ERC-7540 request events using Hypersync.
ERC-7540 vaults emit
DepositRequestfor deposit requests andRedeemRequestfor redemption requests. Protocol-specific legacy events must be handled by a protocol manager subclass.- Parameters
- Returns
Iterator of indexed pending vault flow events in chain order.
- Return type
collections.abc.Iterator[eth_defi.vault.flow_events.PendingVaultFlow]
- create_deposit_request(owner, to=None, amount=None, raw_amount=None, check_max_deposit=True, check_enough_token=True)
Build the standard ERC-7540
requestDeposittransaction.- Parameters
owner (eth_typing.evm.HexAddress) – Controller and owner of the request.
to (eth_typing.evm.HexAddress) – Unsupported separate receiver; ERC-7540 requests use
owner.amount (decimal.Decimal) – Human-readable denomination-token amount.
raw_amount (int) – Raw denomination-token amount, overriding
amount.check_max_deposit – Reserved for parity with the common manager API.
check_enough_token – Reserved for parity with the common manager API.
- Returns
Request wrapper ready for signing and parsing.
- Raises
VaultFlowUnavailable – If the vault’s optional pause view reports that requests are paused.
- Return type
- create_redemption_request(owner, to=None, shares=None, raw_shares=None, check_max_deposit=True, check_enough_token=True)
Build the standard ERC-7540
requestRedeemtransaction.- Parameters
owner (eth_typing.evm.HexAddress) – Controller and owner of the request.
to (eth_typing.evm.HexAddress) – Unsupported separate receiver; ERC-7540 requests use
owner.shares (decimal.Decimal) – Human-readable vault-share amount.
raw_shares (int) – Raw vault-share amount, overriding
shares.check_max_deposit – Reserved for parity with the common manager API.
check_enough_token – Whether to verify that the owner still holds the requested shares.
- Returns
Request wrapper ready for signing and parsing.
- Return type
- finish_deposit(deposit_ticket)
Build the ERC-7540 transaction that claims deposit shares.
The request must already be settled. The ticket supplies the controller, receiver and settled asset amount.
- Parameters
deposit_ticket (eth_defi.vault.deposit_redeem.DepositTicket) – Settled asynchronous deposit ticket.
- Returns
Bound three-argument
depositclaim function.- Return type
web3.contract.contract.ContractFunction
- can_finish_deposit(deposit_ticket)
Check whether a deposit request is ready to claim.
The ERC-7540
claimableDepositRequestview returns a positive asset amount after the operator has settled the request.- Parameters
deposit_ticket (eth_defi.erc_7540.deposit_redeem.ERC7540DepositTicket) – Deposit request to inspect.
- Returns
Truewhen the request has claimable assets.- Return type
- can_finish_redeem(redemption_ticket)
Check whether a redemption request is ready to claim.
The ERC-7540
claimableRedeemRequestview returns a positive share amount after the operator has settled the request.- Parameters
redemption_ticket (eth_defi.erc_7540.deposit_redeem.ERC7540RedemptionTicket) – Redemption request to inspect.
- Returns
Truewhen the request has claimable shares.- Return type
- serialize_deposit_ticket(ticket)
Serialise an ERC-7540 deposit ticket.
The generic base ticket payload is extended with the ERC-7540 request identifier needed for later status checks.
- Parameters
ticket (eth_defi.erc_7540.deposit_redeem.ERC7540DepositTicket) – Deposit ticket to serialise.
- Returns
Persistent ticket data including
vault_request_id.- Return type
- reconstruct_deposit_ticket(data)
Reconstruct a deposit ticket from persistent data.
Both the current string form and the legacy integer form of raw token amounts are accepted for backwards compatibility.
- Parameters
data (dict) – Data produced by
serialize_deposit_ticket().- Returns
Reconstructed ERC-7540 deposit ticket.
- Return type
- serialize_redemption_ticket(ticket)
Serialise an ERC-7540 redemption ticket.
The ERC-7540 request identifier is retained so a restarted process can query the request-specific claimable amount.
- Parameters
ticket (eth_defi.erc_7540.deposit_redeem.ERC7540RedemptionTicket) – Redemption ticket to serialise.
- Returns
Persistent ticket data including
vault_request_id.- Return type
- reconstruct_redemption_ticket(data)
Reconstruct a redemption ticket from persistent data.
Both the current string form and the legacy integer form of raw share amounts are accepted for backwards compatibility.
- Parameters
data (dict) – Data produced by
serialize_redemption_ticket().- Returns
Reconstructed ERC-7540 redemption ticket.
- Return type
- get_deposit_request_status(ticket)
Map ERC-7540 deposit state to the generic status enum.
Check the request-specific claimable amount first: an aggregate
pendingDepositRequest(0, owner)query lumps together all of the owner’s requests, so probing it first would report an already-settled request as still pending whenever another request is outstanding. The generic interface has no reclaim signal, soreclaimableis never returned.- Parameters
ticket (eth_defi.erc_7540.deposit_redeem.ERC7540DepositTicket) – Deposit request to inspect.
- Returns
Claimable, pending or empty request status.
- Return type
- get_redemption_request_status(ticket)
Map ERC-7540 redemption state to the generic status enum.
Request-specific claimable is checked before the aggregate pending query for the same reason as
get_deposit_request_status().- Parameters
ticket (eth_defi.erc_7540.deposit_redeem.ERC7540RedemptionTicket) – Redemption request to inspect.
- Returns
Claimable, pending or empty request status.
- Return type
- can_create_deposit_request(owner)
Return whether the vault is currently open for a deposit request.
The generic ERC-7540 layer checks only the optional pause flag. Protocol-specific admission policies belong in manager subclasses.
- Parameters
owner (eth_typing.evm.HexAddress) – Request owner and controller used by
requestDeposit.- Returns
Falsewhen the vault reports that requests are paused.- Return type
- can_create_redemption_request(owner)
Return whether the vault is currently open for a redemption request.
The generic ERC-7540 layer checks only the optional pause flag; protocol-specific redemption rules belong in manager subclasses.
- Parameters
owner (eth_typing.evm.HexAddress) – Request owner and controller.
- Returns
Falsewhen the vault reports that requests are paused.- Return type
- force_settle(ticket, *, mock=None, ignore_liquidity=False)
Refuse generic ERC-7540 operator settlement before a fork broadcast.
ERC-7540 standardises request and claim interfaces but not the operator action which makes a particular ticket claimable. Protocol-specific managers must implement and prove that action before advertising an Anvil settlement capability.
- Parameters
ticket (Optional[Union[eth_defi.vault.deposit_redeem.DepositTicket, eth_defi.vault.deposit_redeem.RedemptionTicket]]) – Asynchronous deposit or redemption ticket whose settlement is not implemented by this protocol-neutral manager.
mock (Optional[object]) – Optional local protocol mock. Generic ERC-7540 does not define an operator settlement action, so no mock driver is available.
ignore_liquidity (bool) – Unsupported for the protocol-neutral ERC-7540 manager. Concrete protocol managers must opt in explicitly.
- Returns
This method never returns because both generic ERC-7540 directions are asynchronous.
- Raises
UnsupportedVaultSimulation – Always, with the generic capability’s stable reason.
- Return type
- has_synchronous_deposit()
Report that deposits use the asynchronous request lifecycle.
- Returns
Always
Falsefor ERC-7540.- Return type
- has_synchronous_redemption()
Report that redemptions use the asynchronous request lifecycle.
- Returns
Always
Falsefor ERC-7540.- Return type
- estimate_redemption_delay()
Return no deterministic protocol-level redemption delay.
Settlement timing is controlled by each vault operator and is outside the ERC-7540 standard.
- Returns
Zero-duration sentinel for an unspecified delay.
- Return type
- get_redemption_delay_over(address)
Return the legacy sentinel for an unknown account deadline.
Generic ERC-7540 vaults do not expose a deterministic per-account settlement deadline.
- Parameters
address (Union[eth_typing.evm.HexAddress, str]) – Request controller.
- Returns
Naive Unix epoch sentinel retained for backwards compatibility.
- Return type
- is_redemption_in_progress(owner)
Check whether a controller has pending redemption shares.
Request identifier zero aggregates the controller’s pending redemption shares under ERC-7540.
- Parameters
owner (eth_typing.evm.HexAddress) – Controller address to inspect.
- Returns
Trueif the controller has pending redemption shares.- Return type
- is_deposit_in_progress(owner)
Check pending ERC-7540 request.
Query
pendingDepositRequest(0, owner)when the request identifier is not known. Per ERC-7540, request identifier zero aggregates the controller’s pending deposit assets. A value greater than zero means at least one request remains unsettled.- Parameters
owner (eth_typing.evm.HexAddress) – Controller address to inspect.
- Returns
Trueif the controller has pending deposit assets.- Return type
- finish_redemption(redemption_ticket)
Build the ERC-7540 transaction that claims redeemed assets.
The request must already be settled. The ticket supplies the controller, receiver and settled share amount.
- Parameters
redemption_ticket (eth_defi.vault.deposit_redeem.RedemptionTicket) – Settled asynchronous redemption ticket.
- Returns
Bound three-argument
redeemclaim function.- Return type
web3.contract.contract.ContractFunction
- estimate_deposit(owner, amount, block_identifier='latest')
Estimate shares for a denomination-token amount.
ERC-7540 retains the ERC-4626
convertToSharespreview used here; the estimate does not imply that the request is currently admissible.- Parameters
owner (eth_typing.evm.HexAddress) – Request controller. The standard preview is not owner-specific.
amount (decimal.Decimal) – Human-readable denomination-token amount.
block_identifier (Union[Literal['latest', 'earliest', 'pending', 'safe', 'finalized'], eth_typing.evm.BlockNumber, eth_typing.evm.Hash32, eth_typing.encoding.HexStr, int]) – Block at which to read the conversion rate.
- Returns
Estimated human-readable share amount.
- Return type
- estimate_redeem(owner, shares, block_identifier='latest')
Estimate denomination tokens for a vault-share amount.
ERC-7540 retains the ERC-4626
convertToAssetspreview used here; the estimate does not imply that the request is currently admissible.- Parameters
owner (eth_typing.evm.HexAddress) – Request controller. The standard preview is not owner-specific.
shares (decimal.Decimal) – Human-readable vault-share amount.
block_identifier (Union[Literal['latest', 'earliest', 'pending', 'safe', 'finalized'], eth_typing.evm.BlockNumber, eth_typing.evm.Hash32, eth_typing.encoding.HexStr, int]) – Block at which to read the conversion rate.
- Returns
Estimated human-readable denomination-token amount.
- Return type
- analyse_deposit(claim_tx_hash, deposit_ticket)
Analyse a completed ERC-7540 deposit claim.
The method decodes the ERC-4626
Depositevent emitted by the second-stage claim transaction. Protocol subclasses may extend the accepted event signatures for legacy deployments.- Parameters
claim_tx_hash (Union[hexbytes.main.HexBytes, str]) – Deposit-claim transaction hash.
deposit_ticket (Optional[eth_defi.vault.deposit_redeem.DepositTicket]) – Original asynchronous request ticket.
- Returns
Decoded token movement, or a failed-transaction diagnostic.
- Raises
RuntimeError – If a successful receipt does not contain an accepted event.
- Return type
Union[eth_defi.vault.deposit_redeem.DepositRedeemEventAnalysis, eth_defi.vault.deposit_redeem.DepositRedeemEventFailure]
- get_deposit_event_signatures()
Return accepted claim-deposit event signatures.
ERC-7540 claims retain the ERC-4626
Depositevent shape.- Returns
Standard ERC-4626
Deposittopic emitted by ERC-7540 claims.- Return type
- analyse_redemption(claim_tx_hash, redemption_ticket)
Analyse a completed ERC-7540 redemption claim.
The method decodes the ERC-4626
Withdrawevent emitted by the second-stage claim transaction. Protocol subclasses may extend the accepted event signatures for legacy deployments.- Parameters
claim_tx_hash (Union[hexbytes.main.HexBytes, str]) – Redemption-claim transaction hash.
redemption_ticket (Optional[eth_defi.vault.deposit_redeem.RedemptionTicket]) – Original asynchronous request ticket.
- Returns
Decoded token movement, or a failed-transaction diagnostic.
- Raises
RuntimeError – If a successful receipt does not contain an accepted event.
- Return type
Union[eth_defi.vault.deposit_redeem.DepositRedeemEventAnalysis, eth_defi.vault.deposit_redeem.DepositRedeemEventFailure]
- get_redemption_event_signatures()
Return accepted claim-redemption event signatures.
ERC-7540 claims retain the ERC-4626
Withdrawevent shape.- Returns
Standard ERC-4626
Withdrawtopic emitted by ERC-7540 claims.- Return type
- check_deposit_whitelist(owner)
Reject a deposit when the vault’s whitelist excludes the owner.
Shared deposit-preflight helper implementing the whitelisting contract every manager must honour: when a vault applies a deposit whitelist policy that is applicable and queryable, and
owneris not a member of it, raiseWhitelistingRequiredbefore any transaction is broadcast so the caller can surface a “whitelisting required” state instead of paying gas for a guaranteed revert.The check is intentionally conservative — it only raises when the whitelist information can be obtained and is applicable:
if
is_whitelisted_deposit()raisesNotImplementedError, the vault-wide policy cannot be determined for this adapter/version, so no exception is raised;if the vault is permissionless, no exception is raised;
if
is_account_whitelisted()raisesNotImplementedError, per-account membership cannot be queried, so no exception is raised;only when the policy is applicable and the owner is provably not admitted is
WhitelistingRequiredraised.
Adapters that need a stricter fail-closed policy for an unknown admission state should override their own preflight and raise
VaultFlowUnavailablein addition to calling this helper (see the Lagoon manager for an example).- Parameters
owner (eth_typing.evm.HexAddress) – Deposit owner and controller whose whitelist membership is checked.
- Raises
WhitelistingRequired – When the vault applies an applicable, queryable whitelist policy and
owneris not permitted to deposit.- Return type
None
- create_deposit_request_for_guard_validation(owner, raw_amount)
Build deposit calldata for a closed-vault GuardV0 policy check.
This Anvil-only diagnostic path is for a consumer that has already received a typed
deposit_closedordeposit_pausedpreflight result. Adapters must override it only after proving that their typed result represents a temporary vault closure rather than a capacity or amount restriction. The returned calls must be supplied individually toGuardV0.validateCall(); callers must never broadcast them to the closed protocol vault.- Parameters
owner (eth_typing.evm.HexAddress) – SimpleVaultV0/Safe address that would own the shares.
raw_amount (int) – Denomination-token amount in the selected asset’s raw unit.
- Returns
Manager-generated deposit request suitable only for isolated GuardV0 validation.
- Raises
UnsupportedVaultSimulation – Unless the protocol-specific manager implements this diagnostic path.
- Return type
- fetch_completed_redemption_tx_hash(ticket)
Find an operator-owned terminal redemption transaction when available.
Claim-based protocols finish through
finish_redemption()and do not need this lookup. Operator-finalised protocols override the hook to find and validate the transaction that paid the requested receiver.- Parameters
ticket (eth_defi.vault.deposit_redeem.RedemptionTicket) – Persisted redemption request to locate.
- Returns
Terminal transaction hash, or
Noneif the protocol has not observed one yet.- Return type
Optional[hexbytes.main.HexBytes]
- force_redemption_liquidity(owner, raw_shares, failure)
Provision an unavailable synchronous redemption on an Anvil fork.
Concrete managers may implement this only for a source-proven liquidity failure. The default is deliberately unsupported: this hook must never bypass admission, minimums, maturity or time locks.
- Parameters
owner (eth_typing.evm.HexAddress) – Redemption owner.
raw_shares (int) – Exact raw share quantity requested.
failure (eth_defi.vault.deposit_redeem.VaultFlowUnavailable) – Typed preflight failure that prompted the intervention request.
- Returns
Structured intervention evidence from a concrete manager.
- Raises
UnsupportedVaultSimulation – Always for managers without a protocol-specific implementation.
- Return type
eth_defi.vault.deposit_redeem.VaultRedemptionSimulationIntervention
- get_deposit_approval_target()
Return the ERC-20 spender required for a deposit request.
Standard ERC-4626 and the currently supported async adapters pull denomination tokens from the vault address itself. An adapter using a different router or silo must override this method; guarded callers use it to whitelist and validate the exact approval calldata.
- Returns
ERC-20 approval spender address.
- Return type
- get_deposit_delay_over(address)
Estimate when a pending async deposit request will settle.
Mirror of
get_redemption_delay_over()for the deposit side.Used to show an estimated settlement time for unsettled deposits (e.g. in the trade-executor
trade-uitable).Default returns
None: the protocol has no deterministic onchain settlement schedule (e.g. operator-driven ERC-7540 vaults like Lagoon). Subclasses with a predictable settlement cadence (e.g. Ostium V1.5) override this to return an estimated UTC timestamp.
- Parameters
address (Union[eth_typing.evm.HexAddress, str]) – Owner of the pending deposit request.
- Returns
Naive UTC timestamp when the deposit is expected to settle, or
Nonewhen no onchain estimate is available.- Return type
- get_max_deposit(owner)
How much we can deposit
- Parameters
owner (eth_typing.evm.HexAddress) –
- Return type
- reclaim_deposit(ticket)
Return a function to recover funds after a failed async deposit settlement.
Returns
Noneif the protocol does not support reclaim.- Parameters
ticket (eth_defi.vault.deposit_redeem.DepositTicket) –
- Return type
Optional[web3.contract.contract.ContractFunction]
- reclaim_withdrawal(ticket)
Return a function to recover shares after a failed async withdrawal settlement.
Returns
Noneif the protocol does not support reclaim.- Parameters
- Return type
Optional[web3.contract.contract.ContractFunction]