vault.deposit_redeem
Documentation for eth_defi.vault.deposit_redeem Python module.
Abstraction over different deposit/redeem flows of vaults.
Functions
Create the standard no-op outcome for a synchronous vault flow. |
|
|
Extract raw EVM revert data from common Web3 exception shapes. |
Validate manager-generated closed-deposit calls through GuardV0. |
Classes
Generic async vault request status. |
|
Evidence returned after GuardV0 accepts a closed-vault deposit call. |
|
Analyse a vault deposit/redeem event. |
|
Structured failed-flow diagnostic returned by a vault manager. |
|
Wrap the different deposit functions async vaults implement. |
|
In-progress deposit request. |
|
One independently validated manager-generated call. |
|
Wrap the different redeem functions async vaults implement. |
|
In-progress redemption request. |
|
Abstract base for every vault deposit and redemption flow. |
|
Static public integration capability of a vault deposit manager. |
|
Whether deposits require KYC or comparable identity approval. |
|
Evidence for an asynchronous request settled by direct token payment. |
|
Outcome of an Anvil-only forced settlement attempt. |
|
Amount-aware immediate-redemption guidance from a vault manager. |
|
Disclosed Anvil-only intervention used before a real redemption call. |
Exceptions
We did no know how our redemption transaction went. |
|
A vault settlement simulation cannot safely run on this provider. |
|
Structured failure while preparing or executing a vault flow. |
|
A vault flow cannot be safely created before transaction broadcast. |
|
One of vault deposit/redeem transactions reverted. |
|
A deposit was attempted for a vault whose whitelist excludes the owner. |
- class VaultDepositPermission
-
Whether deposits require KYC or comparable identity approval.
This class deliberately represents only a depositor’s KYC or manual identity-approval requirement. It does not describe a particular account’s balance, allowance, token-holding eligibility, pause state, capacity, lock-up, open date, epoch window, or whether an asynchronous request is currently claimable.
The string values are persisted in vault metadata and public reports.
- whitelisted = 'whitelisted'
Deposits require prior KYC or comparable manual identity approval.
- permissionless = 'permissionless'
Deposits need no prior KYC or manual identity approval.
An open date, lock-up, epoch, cap, pause or token-holding condition does not change this status.
- unknown = 'unknown'
The adapter cannot safely determine whether KYC is required.
- __new__(value)
- capitalize()
Return a capitalized version of the string.
More specifically, make the first character have upper case and the rest lower case.
- casefold()
Return a version of the string suitable for caseless comparisons.
- center(width, fillchar=' ', /)
Return a centered string of length width.
Padding is done using the specified fill character (default is a space).
- count()
Return the number of non-overlapping occurrences of substring sub in string S[start:end].
Optional arguments start and end are interpreted as in slice notation.
- encode(encoding='utf-8', errors='strict')
Encode the string using the codec registered for encoding.
- encoding
The encoding in which to encode the string.
- errors
The error handling scheme to use for encoding errors. The default is ‘strict’ meaning that encoding errors raise a UnicodeEncodeError. Other possible values are ‘ignore’, ‘replace’ and ‘xmlcharrefreplace’ as well as any other name registered with codecs.register_error that can handle UnicodeEncodeErrors.
- endswith()
Return True if the string ends with the specified suffix, False otherwise.
- suffix
A string or a tuple of strings to try.
- start
Optional start position. Default: start of the string.
- end
Optional stop position. Default: end of the string.
- expandtabs(tabsize=8)
Return a copy where all tab characters are expanded using spaces.
If tabsize is not given, a tab size of 8 characters is assumed.
- find()
Return the lowest index in S where substring sub is found, such that sub is contained within S[start:end].
Optional arguments start and end are interpreted as in slice notation. Return -1 on failure.
- format(*args, **kwargs)
Return a formatted version of the string, using substitutions from args and kwargs. The substitutions are identified by braces (‘{’ and ‘}’).
- format_map(mapping, /)
Return a formatted version of the string, using substitutions from mapping. The substitutions are identified by braces (‘{’ and ‘}’).
- index()
Return the lowest index in S where substring sub is found, such that sub is contained within S[start:end].
Optional arguments start and end are interpreted as in slice notation. Raises ValueError when the substring is not found.
- isalnum()
Return True if the string is an alpha-numeric string, False otherwise.
A string is alpha-numeric if all characters in the string are alpha-numeric and there is at least one character in the string.
- isalpha()
Return True if the string is an alphabetic string, False otherwise.
A string is alphabetic if all characters in the string are alphabetic and there is at least one character in the string.
- isascii()
Return True if all characters in the string are ASCII, False otherwise.
ASCII characters have code points in the range U+0000-U+007F. Empty string is ASCII too.
- isdecimal()
Return True if the string is a decimal string, False otherwise.
A string is a decimal string if all characters in the string are decimal and there is at least one character in the string.
- isdigit()
Return True if the string is a digit string, False otherwise.
A string is a digit string if all characters in the string are digits and there is at least one character in the string.
- isidentifier()
Return True if the string is a valid Python identifier, False otherwise.
Call keyword.iskeyword(s) to test whether string s is a reserved identifier, such as “def” or “class”.
- islower()
Return True if the string is a lowercase string, False otherwise.
A string is lowercase if all cased characters in the string are lowercase and there is at least one cased character in the string.
- isnumeric()
Return True if the string is a numeric string, False otherwise.
A string is numeric if all characters in the string are numeric and there is at least one character in the string.
- isprintable()
Return True if all characters in the string are printable, False otherwise.
A character is printable if repr() may use it in its output.
- isspace()
Return True if the string is a whitespace string, False otherwise.
A string is whitespace if all characters in the string are whitespace and there is at least one character in the string.
- istitle()
Return True if the string is a title-cased string, False otherwise.
In a title-cased string, upper- and title-case characters may only follow uncased characters and lowercase characters only cased ones.
- isupper()
Return True if the string is an uppercase string, False otherwise.
A string is uppercase if all cased characters in the string are uppercase and there is at least one cased character in the string.
- join(iterable, /)
Concatenate any number of strings.
The string whose method is called is inserted in between each given string. The result is returned as a new string.
Example: ‘.’.join([‘ab’, ‘pq’, ‘rs’]) -> ‘ab.pq.rs’
- ljust(width, fillchar=' ', /)
Return a left-justified string of length width.
Padding is done using the specified fill character (default is a space).
- lower()
Return a copy of the string converted to lowercase.
- lstrip(chars=None, /)
Return a copy of the string with leading whitespace removed.
If chars is given and not None, remove characters in chars instead.
- static maketrans()
Return a translation table usable for str.translate().
If there is only one argument, it must be a dictionary mapping Unicode ordinals (integers) or characters to Unicode ordinals, strings or None. Character keys will be then converted to ordinals. If there are two arguments, they must be strings of equal length, and in the resulting dictionary, each character in x will be mapped to the character at the same position in y. If there is a third argument, it must be a string, whose characters will be mapped to None in the result.
- partition(sep, /)
Partition the string into three parts using the given separator.
This will search for the separator in the string. If the separator is found, returns a 3-tuple containing the part before the separator, the separator itself, and the part after it.
If the separator is not found, returns a 3-tuple containing the original string and two empty strings.
- removeprefix(prefix, /)
Return a str with the given prefix string removed if present.
If the string starts with the prefix string, return string[len(prefix):]. Otherwise, return a copy of the original string.
- removesuffix(suffix, /)
Return a str with the given suffix string removed if present.
If the string ends with the suffix string and that suffix is not empty, return string[:-len(suffix)]. Otherwise, return a copy of the original string.
- replace(old, new, /, count=- 1)
Return a copy with all occurrences of substring old replaced by new.
- count
Maximum number of occurrences to replace. -1 (the default value) means replace all occurrences.
If the optional argument count is given, only the first count occurrences are replaced.
- rfind()
Return the highest index in S where substring sub is found, such that sub is contained within S[start:end].
Optional arguments start and end are interpreted as in slice notation. Return -1 on failure.
- rindex()
Return the highest index in S where substring sub is found, such that sub is contained within S[start:end].
Optional arguments start and end are interpreted as in slice notation. Raises ValueError when the substring is not found.
- rjust(width, fillchar=' ', /)
Return a right-justified string of length width.
Padding is done using the specified fill character (default is a space).
- rpartition(sep, /)
Partition the string into three parts using the given separator.
This will search for the separator in the string, starting at the end. If the separator is found, returns a 3-tuple containing the part before the separator, the separator itself, and the part after it.
If the separator is not found, returns a 3-tuple containing two empty strings and the original string.
- rsplit(sep=None, maxsplit=- 1)
Return a list of the substrings in the string, using sep as the separator string.
- sep
The separator used to split the string.
When set to None (the default value), will split on any whitespace character (including n r t f and spaces) and will discard empty strings from the result.
- maxsplit
Maximum number of splits. -1 (the default value) means no limit.
Splitting starts at the end of the string and works to the front.
- rstrip(chars=None, /)
Return a copy of the string with trailing whitespace removed.
If chars is given and not None, remove characters in chars instead.
- split(sep=None, maxsplit=- 1)
Return a list of the substrings in the string, using sep as the separator string.
- sep
The separator used to split the string.
When set to None (the default value), will split on any whitespace character (including n r t f and spaces) and will discard empty strings from the result.
- maxsplit
Maximum number of splits. -1 (the default value) means no limit.
Splitting starts at the front of the string and works to the end.
Note, str.split() is mainly useful for data that has been intentionally delimited. With natural text that includes punctuation, consider using the regular expression module.
- splitlines(keepends=False)
Return a list of the lines in the string, breaking at line boundaries.
Line breaks are not included in the resulting list unless keepends is given and true.
- startswith()
Return True if the string starts with the specified prefix, False otherwise.
- prefix
A string or a tuple of strings to try.
- start
Optional start position. Default: start of the string.
- end
Optional stop position. Default: end of the string.
- strip(chars=None, /)
Return a copy of the string with leading and trailing whitespace removed.
If chars is given and not None, remove characters in chars instead.
- swapcase()
Convert uppercase characters to lowercase and lowercase characters to uppercase.
- title()
Return a version of the string where each word is titlecased.
More specifically, words start with uppercased characters and all remaining cased characters have lower case.
- translate(table, /)
Replace each character in the string using the given translation table.
- table
Translation table, which must be a mapping of Unicode ordinals to Unicode ordinals, strings, or None.
The table must implement lookup/indexing via __getitem__, for instance a dictionary or list. If this operation raises LookupError, the character is left untouched. Characters mapped to None are deleted.
- upper()
Return a copy of the string converted to uppercase.
- zfill(width, /)
Pad a numeric string with zeros on the left, to fill a field of the given width.
The string is never truncated.
- class VaultDepositManagerCapability
Bases:
objectStatic public integration capability of a vault deposit manager.
This describes support implemented by
eth_defi, rather than the vault’s live cap, pause, allow-list, token balance, or liquidity state. A historical probe cannot establish future acceptance: consumers must make the request against current chain state and handle a current-state revert.- Parameters
can_deposit – Whether a complete public deposit lifecycle is implemented.
can_redeem – Whether a complete public redemption lifecycle is implemented.
deposit_flow – Request lifecycle for deposits when supported.
redemption_flow – Request lifecycle for redemptions when supported.
deposit_unsupported_reason – Stable adapter reason when deposits are deliberately unsupported.
redemption_unsupported_reason – Stable adapter reason when redemptions are deliberately unsupported.
supports_anvil_settlement – Whether the advertised asynchronous lifecycle can be advanced with its protocol-specific ticket on an Anvil fork.
Nonemeans no settlement assertion is needed for the selected synchronous direction.Falsepublishes an advertised asynchronous lifecycle which cannot be safely advanced on Anvil.anvil_settlement_unsupported_reason – Stable concrete reason why an advertised asynchronous lifecycle cannot be advanced on Anvil. Required when
supports_anvil_settlement=Falseand forbidden otherwise.
- deposit_assets: tuple[eth_typing.evm.HexAddress, ...]
Accepted token addresses for an explicit multi-asset deposit flow.
- as_dict()
Convert the capability to JSON-compatible primitives.
- as_initial_public_schema()
Return the initial public capability schema.
Existing partial adapters remain fail-closed unless they explicitly opt in after their supported direction has been fork-proven.
- __init__(can_deposit, can_redeem, deposit_flow=None, redemption_flow=None, deposit_unsupported_reason=None, redemption_unsupported_reason=None, supports_anvil_settlement=None, anvil_settlement_unsupported_reason=None, deposit_assets=(), publish_partial=False)
- class VaultRedemptionPreflight
Bases:
objectAmount-aware immediate-redemption guidance from a vault manager.
The result is advisory because capacity can change before a transaction is mined. The manager’s request constructor must repeat an available-capacity check before broadcasting. It is currently returned only by adapters that can determine an immediate full-fill capacity from their authoritative protocol state, such as cSigma’s queue-adjusted reserve check.
Note
Trade-executor integrations must map an unavailable result, or a matching
VaultFlowUnavailablefrom request construction, to a capacity result before their generic receipt-analysis error handling.- Parameters
available – Whether the requested raw shares can be redeemed immediately.
requested_raw_shares – Requested vault-share amount in native units.
available_raw_shares – Current immediate capacity in native share units, when the adapter can determine it.
reason – Stable adapter reason when the request is unavailable.
- class AsyncVaultRequestStatus
Bases:
enum.EnumGeneric async vault request status.
Protocol adapters map their internal status to these values. Used by the trade-executor settlement retry module to determine the next action for a pending vault trade, without importing protocol-specific code.
- none = 'none'
No request found for this ticket
- pending = 'pending'
Request submitted, awaiting settlement
- claimable = 'claimable'
Settlement done, claim available
- reclaimable = 'reclaimable'
Settlement failed, reclaim available to recover funds/shares
- exception VaultFlowError
Bases:
ExceptionStructured failure while preparing or executing a vault flow.
Preflight failures use
VaultFlowUnavailable; mined transaction failures useVaultTransactionFailed. The common fields let a caller preserve useful context without treating a rejected request as a transaction that needs receipt handling.- Parameters
reason – Human-readable reason for the failed flow.
protocol – Protocol adapter that detected the failure, when known.
vault_address – Vault address whose flow was attempted, when known.
caller – Address for which the flow was prepared, when known.
asset_address – Input asset selected for a multi-asset flow, when known.
direction –
depositorredeemwhen known.phase – Lifecycle phase such as
requestortransaction.decoded_error – Protocol-specific decoded error name, when available.
preflight_result – Stable consumer-facing result for a predictable refusal. This is an optional migration field: callers must fall back to
decoded_errorwhile supporting older eth-defi releases that do not populate it.raw_revert_data – Raw revert payload, when available.
requested_raw_amount – Requested amount in the contract’s native raw unit, when applicable.
available_raw_amount – Available amount in the contract’s native raw unit, when applicable.
minimum_raw_amount – Protocol minimum in the contract’s native raw unit, when applicable.
function_selector – Four-byte selector of the denied protocol entry point, when known.
error_selector – Four-byte selector of the expected or decoded custom error, when known.
access_delay – Access-manager scheduling delay in seconds, when a caller is eligible only after delayed execution.
next_open – Naive UTC time at which a predictable closed protocol window next opens.
Store structured context for a vault-flow failure.
- __init__(reason, *, protocol=None, vault_address=None, caller=None, asset_address=None, direction=None, phase=None, decoded_error=None, preflight_result=None, raw_revert_data=None, requested_raw_amount=None, available_raw_amount=None, minimum_raw_amount=None, function_selector=None, error_selector=None, access_delay=None, next_open=None)
Store structured context for a vault-flow failure.
- Parameters
reason (str) –
vault_address (Optional[eth_typing.evm.HexAddress]) –
caller (Optional[eth_typing.evm.HexAddress]) –
asset_address (Optional[eth_typing.evm.HexAddress]) –
raw_revert_data (Optional[hexbytes.main.HexBytes]) –
function_selector (Optional[hexbytes.main.HexBytes]) –
error_selector (Optional[hexbytes.main.HexBytes]) –
next_open (Optional[datetime.datetime]) –
- Return type
None
- __new__(**kwargs)
- add_note(note, /)
Add a note to the exception
- with_traceback(tb, /)
Set self.__traceback__ to tb and return self.
- extract_revert_data(error)
Extract raw EVM revert data from common Web3 exception shapes.
- Parameters
error (BaseException) – Web3 exception raised by
eth_call.- Returns
Raw revert payload when exposed by the provider.
- Return type
Optional[hexbytes.main.HexBytes]
- exception VaultTransactionFailed
Bases:
eth_defi.vault.deposit_redeem.VaultFlowErrorOne of vault deposit/redeem transactions reverted.
Store structured context for a vault-flow failure.
- __init__(reason, *, protocol=None, vault_address=None, caller=None, asset_address=None, direction=None, phase=None, decoded_error=None, preflight_result=None, raw_revert_data=None, requested_raw_amount=None, available_raw_amount=None, minimum_raw_amount=None, function_selector=None, error_selector=None, access_delay=None, next_open=None)
Store structured context for a vault-flow failure.
- Parameters
reason (str) –
vault_address (Optional[eth_typing.evm.HexAddress]) –
caller (Optional[eth_typing.evm.HexAddress]) –
asset_address (Optional[eth_typing.evm.HexAddress]) –
raw_revert_data (Optional[hexbytes.main.HexBytes]) –
function_selector (Optional[hexbytes.main.HexBytes]) –
error_selector (Optional[hexbytes.main.HexBytes]) –
next_open (Optional[datetime.datetime]) –
- Return type
None
- __new__(**kwargs)
- add_note(note, /)
Add a note to the exception
- with_traceback(tb, /)
Set self.__traceback__ to tb and return self.
Bases:
eth_defi.vault.deposit_redeem.VaultFlowErrorA vault flow cannot be safely created before transaction broadcast.
Store structured context for a vault-flow failure.
Store structured context for a vault-flow failure.
- Parameters
reason (str) –
vault_address (Optional[eth_typing.evm.HexAddress]) –
caller (Optional[eth_typing.evm.HexAddress]) –
asset_address (Optional[eth_typing.evm.HexAddress]) –
raw_revert_data (Optional[hexbytes.main.HexBytes]) –
function_selector (Optional[hexbytes.main.HexBytes]) –
error_selector (Optional[hexbytes.main.HexBytes]) –
next_open (Optional[datetime.datetime]) –
- Return type
None
Add a note to the exception
Set self.__traceback__ to tb and return self.
- exception WhitelistingRequired
Bases:
eth_defi.vault.deposit_redeem.VaultFlowUnavailableA deposit was attempted for a vault whose whitelist excludes the owner.
Raised during deposit preflight when a vault applies a deposit whitelist (permissioned) policy, that policy is applicable and queryable, and the depositing account is not a member of it. The account must be whitelisted by the vault curator before a deposit can succeed.
This is a subclass of
VaultFlowUnavailableso existing callers that catch the base preflight failure keep working, while callers that want to react specifically to a missing whitelist entry — for example to surface a “whitelisting required” state instead of a generic failure — can catch this narrower type.Message contract for diagnostics: whenever this exception is raised, its
reasonmessage (the first positional argument, i.e. the text returned bystr(exc)before the structured context) must identify the failing deposit unambiguously by including all three of:the chain id the vault is deployed on (
chain_id()),the vault contract address (
address()), andthe depositor address that was denied (the request owner/caller).
These three values must be embedded in the message string itself — not only passed through the
vault_addressandcallerstructured fields — so a single logged message line is self-describing for diagnostics without the reader having to reconstruct the failing vault or account from surrounding context. Include the structuredvault_addressandcallerfields as well.VaultDepositManager.check_deposit_whitelist()produces a compliant message; adapters that raise this directly must do the same.Contract for adapter authors: every deposit manager must raise this from its deposit preflight when the vault’s whitelist policy can be determined, is applicable, and the owner is not permitted. Use
VaultDepositManager.check_deposit_whitelist()to satisfy the contract. When the policy cannot be determined (the adapter’s whitelist reads raiseNotImplementedError) this exception must not be raised; the deposit either proceeds and surfaces any genuine denial as an onchain revert, or a protocol adapter may fail closed with a plainVaultFlowUnavailableif unknown admission is unsafe.Store structured context for a vault-flow failure.
- __init__(reason, *, protocol=None, vault_address=None, caller=None, asset_address=None, direction=None, phase=None, decoded_error=None, preflight_result=None, raw_revert_data=None, requested_raw_amount=None, available_raw_amount=None, minimum_raw_amount=None, function_selector=None, error_selector=None, access_delay=None, next_open=None)
Store structured context for a vault-flow failure.
- Parameters
reason (str) –
vault_address (Optional[eth_typing.evm.HexAddress]) –
caller (Optional[eth_typing.evm.HexAddress]) –
asset_address (Optional[eth_typing.evm.HexAddress]) –
raw_revert_data (Optional[hexbytes.main.HexBytes]) –
function_selector (Optional[hexbytes.main.HexBytes]) –
error_selector (Optional[hexbytes.main.HexBytes]) –
next_open (Optional[datetime.datetime]) –
- Return type
None
- __new__(**kwargs)
- add_note(note, /)
Add a note to the exception
- with_traceback(tb, /)
Set self.__traceback__ to tb and return self.
- exception UnsupportedVaultSimulation
Bases:
RuntimeErrorA vault settlement simulation cannot safely run on this provider.
- Parameters
reason – Human-readable explanation of why the simulation cannot run.
unsupported_reason – Stable, machine-readable adapter reason. This is retained separately from
reasonso consumers never need to parse exception prose.protocol – Protocol adapter that rejected settlement, when known.
vault_address – Vault whose settlement was rejected, when known.
direction –
depositorredeemfor the rejected asynchronous ticket.phase – Lifecycle phase that was rejected. Defaults to
settlement.
Store a machine-readable settlement refusal and its vault context.
- Parameters
reason – Human-readable explanation of the refusal.
unsupported_reason – Stable adapter reason for consumer result mapping.
protocol – Protocol adapter that rejected settlement, when known.
vault_address – Vault whose settlement was rejected, when known.
direction – Rejected asynchronous ticket direction, when known.
phase – Rejected lifecycle phase.
- __init__(reason, *, unsupported_reason=None, protocol=None, vault_address=None, direction=None, phase='settlement')
Store a machine-readable settlement refusal and its vault context.
- Parameters
reason (str) – Human-readable explanation of the refusal.
unsupported_reason (Optional[str]) – Stable adapter reason for consumer result mapping.
protocol (Optional[str]) – Protocol adapter that rejected settlement, when known.
vault_address (Optional[eth_typing.evm.HexAddress]) – Vault whose settlement was rejected, when known.
direction (Optional[Literal['deposit', 'redeem']]) – Rejected asynchronous ticket direction, when known.
phase (str) – Rejected lifecycle phase.
- Return type
None
- __new__(**kwargs)
- add_note(note, /)
Add a note to the exception
- with_traceback(tb, /)
Set self.__traceback__ to tb and return self.
- class DepositRedeemEventFailure
Bases:
objectStructured failed-flow diagnostic returned by a vault manager.
- vault_address: Optional[eth_typing.evm.HexAddress]
Vault whose lifecycle was being processed, when available.
- direction: Optional[Literal['deposit', 'redeem']]
depositorredeemwhen the manager knows the direction.
- __init__(tx_hash, revert_reason, protocol=None, vault_address=None, direction=None, phase=None, receipt_status=None)
- class DepositRedeemEventAnalysis
Bases:
objectAnalyse a vault deposit/redeem event.
Done for the transaction where we get our assets into our wallet, so we can determine the actualy executed price of shares we received/sold
- __init__(from_, to, denomination_amount, share_count, tx_hash, block_number, block_timestamp)
- Parameters
from_ (eth_typing.evm.HexAddress) –
to (eth_typing.evm.HexAddress) –
denomination_amount (decimal.Decimal) –
share_count (decimal.Decimal) –
tx_hash (hexbytes.main.HexBytes) –
block_number (eth_typing.evm.BlockNumber) –
block_timestamp (datetime.datetime) –
- Return type
None
- class DepositTicket
Bases:
objectIn-progress deposit request.
- tx_hash: hexbytes.main.HexBytes
Last of transaction hashes
- block_timestamp: datetime.datetime
Last tx block timestamp
- __init__(vault_address, owner, to, raw_amount, tx_hash, gas_used, block_number, block_timestamp)
- Parameters
vault_address (eth_typing.evm.HexAddress) –
owner (eth_typing.evm.HexAddress) –
to (eth_typing.evm.HexAddress) –
raw_amount (int) –
tx_hash (hexbytes.main.HexBytes) –
gas_used (int) –
block_number (int) –
block_timestamp (datetime.datetime) –
- Return type
None
- class RedemptionTicket
Bases:
objectIn-progress redemption request.
Needs to wait until the epoch time is over or owner has settled
Serialisable class
- abstract get_request_id()
Get the redemption request id.
If vault uses some sort of request ids to track the withdrawals
Needed for settlement
- Return type
- __init__(vault_address, owner, to, raw_shares, tx_hash)
- Parameters
vault_address (eth_typing.evm.HexAddress) –
owner (eth_typing.evm.HexAddress) –
to (eth_typing.evm.HexAddress) –
raw_shares (int) –
tx_hash (hexbytes.main.HexBytes) –
- Return type
None
- class VaultDirectPayoutEvidence
Bases:
objectEvidence for an asynchronous request settled by direct token payment.
Some protocols consume a request and pay the receiver without exposing an intermediate claimable state. Such a transition is terminal only when the request-specific event and the receiver’s denomination-token balance agree. This intentionally contains no protocol-specific event payload so consumers can apply the same terminal-result rule to every adapter.
- Parameters
request_id – Identifier of the request consumed by the settlement transaction.
receiver – Receiver whose denomination-token balance was observed.
denomination_token – Token paid by the direct settlement.
raw_balance_before – Receiver balance immediately before the settlement transaction.
raw_balance_after – Receiver balance immediately after the settlement transaction.
event_name – Name of the decoded request-specific settlement event.
transaction_hash – Transaction that emitted
event_nameand paid the receiver.
- has_positive_balance_delta()
Return whether the observed direct payment increased the balance.
- Returns
Trueonly when the receiver received a positive raw amount.- Return type
- __init__(request_id, receiver, denomination_token, raw_balance_before, raw_balance_after, event_name, transaction_hash)
- Parameters
request_id (int) –
receiver (eth_typing.evm.HexAddress) –
denomination_token (eth_typing.evm.HexAddress) –
raw_balance_before (int) –
raw_balance_after (int) –
event_name (str) –
transaction_hash (hexbytes.main.HexBytes) –
- Return type
None
- class VaultForcedSettlementResult
Bases:
objectOutcome of an Anvil-only forced settlement attempt.
Synchronous managers return a no-op result because their successful request transaction already completes the lifecycle. Asynchronous managers return the ticket status before and after their protocol-specific settlement transaction(s).
- ticket: Optional[Union[eth_defi.vault.deposit_redeem.DepositTicket, eth_defi.vault.deposit_redeem.RedemptionTicket]]
Ticket progressed by the simulation, or None for synchronous flows.
- status_before: Optional[eth_defi.vault.deposit_redeem.AsyncVaultRequestStatus]
Request status before settlement, when a ticket was supplied.
- status_after: Optional[eth_defi.vault.deposit_redeem.AsyncVaultRequestStatus]
Request status after settlement, when a ticket was supplied.
- transaction_hashes: tuple[hexbytes.main.HexBytes, ...]
Transactions broadcast by the forced settlement helper.
- synthetic_assets_injected_raw: int
Denomination tokens synthetically injected on an Anvil fork to let the settlement round complete, in the denomination token’s raw units.
Zero (the default) means the settlement used only real on-fork state. A non-zero value means the driver wrote synthetic token balance into the vault (e.g. topped up a Lagoon Safe that was short of redemption liquidity) to make the ticket claimable. In that case a
claimableresult proves only that the settlement mechanism works on a fork — it does NOT prove the vault can currently pay this redemption onchain.supports_anvil_settlement=Truesimilarly means “the driver can advance tickets on a fork”, not “the vault is solvent”. Callers that need a real-liquidity guarantee must assert this is zero.
- liquidity_constraints_ignored: bool
Truewhen the Anvil-only simulation explicitly bypassed a protocol liquidity admission check. This is separate fromsynthetic_assets_injected_raw: a protocol mock can relax amaxRedeem-style gate without minting any denomination tokens.A result with this flag set proves the guarded call and settlement mechanics only. It is never evidence that the live deployment has enough immediately available redemption liquidity.
- direct_payout_evidence: Optional[eth_defi.vault.deposit_redeem.VaultDirectPayoutEvidence]
Evidence for terminal direct-payout protocols such as Ember. It is required whenever
status_afterisnonefor an asynchronous settlement result.
- is_terminal_success()
Return whether this result proves its protocol settlement finished.
Claimable tickets are terminal settlement success: the caller can now execute the ordinary protocol claim. A protocol that pays directly may instead return
noneonly with request-specific event evidence and a positive receiver balance delta. A pending, missing, or evidence-free consumed status is never a successful forced settlement. This evaluates settlement state only: callers requiring live-liquidity evidence must also assertsynthetic_assets_injected_raw == 0andnot liquidity_constraints_ignored.- Returns
Truefor a synchronous no-op, a claimable async ticket, or a validated direct-payout terminal transition.- Return type
- __init__(ticket, settlement_required, status_before, status_after, transaction_hashes=(), synthetic_assets_injected_raw=0, liquidity_constraints_ignored=False, direct_payout_evidence=None)
- Parameters
ticket (Optional[Union[eth_defi.vault.deposit_redeem.DepositTicket, eth_defi.vault.deposit_redeem.RedemptionTicket]]) –
settlement_required (bool) –
status_before (Optional[eth_defi.vault.deposit_redeem.AsyncVaultRequestStatus]) –
status_after (Optional[eth_defi.vault.deposit_redeem.AsyncVaultRequestStatus]) –
transaction_hashes (tuple[hexbytes.main.HexBytes, ...]) –
synthetic_assets_injected_raw (int) –
liquidity_constraints_ignored (bool) –
direct_payout_evidence (Optional[eth_defi.vault.deposit_redeem.VaultDirectPayoutEvidence]) –
- Return type
None
- class VaultRedemptionSimulationIntervention
Bases:
objectDisclosed Anvil-only intervention used before a real redemption call.
The intervention changes fork state only. A caller must still build, broadcast and analyse the protocol’s real redemption transaction after this result is returned. It must never be interpreted as evidence that the live vault had enough redemption liquidity.
- kind: Literal['liquidity_injected', 'redemption_capacity_increased']
Intervention type for machine-readable reports.
- token: eth_typing.evm.HexAddress
Denomination token whose forked balance was changed.
- target: eth_typing.evm.HexAddress
Vault or protocol liquidity adapter that received the token.
- original_preflight_result: Optional[str]
Original machine-readable preflight result when available.
- evidence: dict[str, str | int]
Protocol-specific, JSON-safe evidence fields.
Raw integer values are serialised as strings by
as_dict().
- as_dict()
Return JSON-safe intervention evidence.
Integer quantities are serialised as decimal strings so large token values remain exact across JSON consumers.
- __init__(kind, token, target, raw_amount, original_reason, original_preflight_result=None, evidence=<factory>)
- create_synchronous_settlement_result()
Create the standard no-op outcome for a synchronous vault flow.
Synchronous requests complete in their own transaction and therefore have no ticket or settlement status to advance. Managers exposing mixed flows reuse this value for their synchronous direction.
- Returns
A zero-transaction result indicating no settlement is required.
- Return type
- exception CannotParseRedemptionTransaction
Bases:
ExceptionWe did no know how our redemption transaction went.
- __init__(*args, **kwargs)
- __new__(**kwargs)
- add_note(note, /)
Add a note to the exception
- with_traceback(tb, /)
Set self.__traceback__ to tb and return self.
- class RedemptionRequest
Bases:
objectWrap the different redeem functions async vaults implement.
- owner: eth_typing.evm.HexAddress
Owner of the shares
- to: eth_typing.evm.HexAddress
Receiver of underlying asset
Human-readable shares
Raw amount of shares
- funcs: list[web3.contract.contract.ContractFunction]
Transactions we need to perform in order to open a redemption
It’s a list because for Gains we need 2 tx
- parse_redeem_transaction(tx_hashes)
Parse the transaction receipt to get the actual shares redeemed.
Assumes only one redemption request per vault per transaction
- Raises
CannotParseRedemptionTransaction – If we did not know how to parse the transaction
- Parameters
tx_hashes (list[hexbytes.main.HexBytes]) –
- Return type
- broadcast(from_=None, gas=1000000)
Broadcast all the transactions in this request.
- Parameters
from – Address to send the transactions from
gas (int) – Gas limit to use for each transaction
from_ (eth_typing.evm.HexAddress) –
- Returns
List of transaction hashes
- Return type
list[hexbytes.main.HexBytes]
- __init__(vault, owner, to, shares, raw_shares, funcs)
- Parameters
vault (VaultBase) –
owner (eth_typing.evm.HexAddress) –
to (eth_typing.evm.HexAddress) –
shares (decimal.Decimal) –
raw_shares (int) –
funcs (list[web3.contract.contract.ContractFunction]) –
- Return type
None
- class DepositRequest
Bases:
objectWrap the different deposit functions async vaults implement.
- owner: eth_typing.evm.HexAddress
Owner of the shares
- to: eth_typing.evm.HexAddress
Receiver of underlying asset
- amount: decimal.Decimal
Human-readable shares
- funcs: list[web3.contract.contract.ContractFunction]
Transactions we need to perform in order to open a redemption
It’s a list because for Gains we need 2 tx
- value: Optional[decimal.Decimal]
Attached ETH value to the tx
- parse_deposit_transaction(tx_hashes)
Parse the transaction receipt to get the actual shares redeemed.
Assumes only one redemption request per vault per transaction
Most throw an
- Raises
CannotParseRedemptionTransaction – If we did not know how to parse the transaction
VaultTransactionFailed – One of transactions reverted
- Parameters
tx_hashes (list[hexbytes.main.HexBytes]) –
- Return type
- broadcast(from_=None, gas=None, check_value=True)
Broadcast all the transactions in this request.
- Parameters
from – Address to send the transactions from
from_ (eth_typing.evm.HexAddress) –
- Returns
List of transaction hashes
- Raises
TransactionAssertionError – If any of the transactions revert
- Return type
- __init__(vault, owner, to, amount, raw_amount, funcs, gas=None, value=None)
- Parameters
vault (VaultBase) –
owner (eth_typing.evm.HexAddress) –
to (eth_typing.evm.HexAddress) –
amount (decimal.Decimal) –
raw_amount (int) –
funcs (list[web3.contract.contract.ContractFunction]) –
value (Optional[decimal.Decimal]) –
- Return type
None
- class GuardV0ValidationCall
Bases:
objectOne independently validated manager-generated call.
- Parameters
target – Contract address selected by the deposit manager.
calldata – Complete ABI-encoded call data, including its selector.
selector – First four bytes of
calldataretained for consumer evidence.
- target: eth_typing.evm.HexAddress
Contract selected by the vault manager.
- calldata: eth_typing.encoding.HexStr
Complete manager-generated call data.
- selector: hexbytes.main.HexBytes
Function selector extracted from the call data.
- __init__(target, calldata, selector)
- Parameters
target (eth_typing.evm.HexAddress) –
calldata (eth_typing.encoding.HexStr) –
selector (hexbytes.main.HexBytes) –
- Return type
None
- class ClosedDepositGuardValidation
Bases:
objectEvidence returned after GuardV0 accepts a closed-vault deposit call.
This proves GuardV0 compatibility of independently validated manager calls. It does not prove an ERC-20 approval sequence, a successful vault deposit or a minted share balance.
- Parameters
vault_address – Vault whose closed deposit preflight produced the call.
owner – Safe/SimpleVault address used as the deposit receiver.
raw_amount – Requested denomination amount in raw units.
closure_reason – Original typed closure prose retained for reporting.
preflight_result – Typed closure result which authorised validation-only construction.
calls – Manager-generated calls accepted by GuardV0.
- vault_address: eth_typing.evm.HexAddress
Vault that remains closed to an actual deposit.
- owner: eth_typing.evm.HexAddress
Safe/SimpleVault used as deposit owner and receiver.
- calls: tuple[eth_defi.vault.deposit_redeem.GuardV0ValidationCall, ...]
All calls which GuardV0 accepted independently.
- __init__(vault_address, owner, raw_amount, closure_reason, preflight_result, calls)
- Parameters
vault_address (eth_typing.evm.HexAddress) –
owner (eth_typing.evm.HexAddress) –
raw_amount (int) –
closure_reason (str) –
preflight_result (str) –
calls (tuple[eth_defi.vault.deposit_redeem.GuardV0ValidationCall, ...]) –
- Return type
None
- validate_closed_deposit_request_with_guard(request, closure, guard, asset_manager)
Validate manager-generated closed-deposit calls through GuardV0.
The request must come from
VaultDepositManager.create_deposit_request_for_guard_validation()after a typed closure preflight. Each manager-generated call is encoded and passed separately to the supplied GuardV0-compatible contract using a static call. The helper neither creates an ERC-20 approval nor broadcasts a transaction, so it cannot establish approval ordering or prove that the closed vault would accept a deposit.- Parameters
request (eth_defi.vault.deposit_redeem.DepositRequest) – Validation-only deposit request generated by the selected manager.
closure (eth_defi.vault.deposit_redeem.VaultFlowUnavailable) – Original typed deposit closure which authorised this diagnostic path.
guard (web3.contract.contract.Contract) – Configured GuardV0-compatible contract exposing
validateCall().asset_manager (eth_typing.evm.HexAddress) – Non-governance delegated asset-manager address to validate as.
- Returns
Closure context plus every independently GuardV0-accepted target and selector, suitable for a consumer’s persisted outcome evidence.
- Raises
ValueError – If
closureis not a matching typed closed or paused deposit result.- Return type
- class VaultDepositManager
Bases:
abc.ABCAbstract base for every vault deposit and redemption flow.
New public manager integrations must follow
eth_defi/erc_4626/README-vault-protocol-support.md: a manager is supported only after its complete lifecycle executes throughGuardV0on an Anvil fork, with a protocol-shaped mock where fork state cannot cover a required path.A deposit manager wraps one
VaultBaseand hides the differences between synchronous ERC-4626 vaults, asynchronous ERC-7540 vaults, and protocol-specific variants (Lagoon, Gains, IPOR, Ember, cSigma, and others) behind one request/settle/claim interface. This base class is policy-agnostic: it defines the contract and provides only the shared whitelist preflight and the Anvil no-op settlement; concrete subclasses supply the actual onchain behaviour.Deposit process
A deposit is built with
create_deposit_request(), which returns aDepositRequestwrapper of one or more transactions to sign and broadcast. The flow may be synchronous or asynchronous depending on the subclass —has_synchronous_deposit()reports which. The owner must firstapprove()the ERC-20 denomination token to the spender returned byget_deposit_approval_target()(the vault address by default). For a synchronous vault the request transaction mints shares immediately to the receiver. For an asynchronous vault the request transaction only registers a request; the shares are later claimed once settled viacan_finish_deposit()andfinish_deposit(). The receiver defaults toowner; a separatetoreceiver is only honoured where the protocol supports it. Progress is tracked with aDepositTicket.Redemption process
A redemption is built with
create_redemption_request(), returning aRedemptionRequestwrapper.has_synchronous_redemption()reports whether the flow is synchronous (shares burned and assets returned in the request transaction) or asynchronous (request now, settle, then claim). The asynchronous lifecycle is: create the request, broadcast, parse the resultingRedemptionTicket, wait for the redemption delay or operator settlement, then claim withfinish_redemption(). Some operator-finalised protocols pay the receiver directly and returnNonefromfinish_redemption();fetch_completed_redemption_tx_hash()locates that terminal transaction instead. A request is identified by itsRedemptionTicket(owner, receiver, raw shares, request transaction hash, and a protocol request id viaRedemptionTicket.get_request_id()).Queues and settlement
Asynchronous protocols queue pending requests and settle them off the common interface (epoch rollovers, an operator/curator transaction, a settlement silo, etc.);
get_deposit_request_status()andget_redemption_request_status()map protocol state ontoAsyncVaultRequestStatus(none/pending/claimable/reclaimable), andfetch_vault_flow_events()streams pending requests from an indexed backend. Synchronous subclasses have no queue: the request transaction is the settlement.Lockups and cooldowns
Any lockup, cooldown, redemption delay or epoch window is protocol-specific.
estimate_redemption_delay()returns the vault-wide delay (not account-specific), andget_redemption_delay_over()returns the naive UTC time an account may claim, orNonewhen there is no deterministic onchain deadline.can_create_redemption_request()reflects windows such as an epoch that only accepts requests on some days. Synchronous subclasses report a zero delay.Whitelisting / access control
Deposit admission is enforced by
check_deposit_whitelist(), the shared preflight that every subclass must call before returning a request. It raisesWhitelistingRequiredonly when the vault’s whitelist policy is applicable and queryable and the owner is provably not admitted; when the policy cannot be determined it stays silent and lets a genuine denial surface as an onchain revert. Subclasses needing a stricter fail-closed policy may additionally raiseVaultFlowUnavailable.Anvil settlement (force_settle)
force_settle()advances a pending ticket on an Anvil fork for integration tests. It requires an Anvil provider. For synchronous managers it is a no-op (called withNone, returns a not-settlement-required result) because the request transaction already completed the lifecycle. Asynchronous managers must override it with a protocol-specific driver; the base raisesUnsupportedVaultSimulationwhen no safe driver exists.ignore_liquidity=Falsepreserves a real-liquidity simulation. An explicitly documented protocol driver may override the default to enable an Anvil-only liquidity-bypass simulation; its result must markVaultForcedSettlementResult.liquidity_constraints_ignored; it is never live redemption evidence or a way to bypass production preflights.- __init__(vault)
- Parameters
vault (eth_defi.vault.base.VaultBase) –
- 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
- 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
- force_settle(ticket, *, mock=None, ignore_liquidity=False)
Force the selected ticket forward on an Anvil simulation.
Synchronous managers do not require settlement and return a no-op result when called with None. Asynchronous managers must override this method and supply their request ticket.
- Parameters
ticket (Optional[Union[eth_defi.vault.deposit_redeem.DepositTicket, eth_defi.vault.deposit_redeem.RedemptionTicket]]) – Pending async request ticket, or None for a synchronous flow.
mock (Optional[object]) – Optional deployed protocol mock used only by focused local tests. Concrete asynchronous managers may use it to execute their operator/keeper settlement path without broadening production Anvil-fork authority. Passing a mock to a manager that does not implement mock settlement remains a typed unsupported simulation.
ignore_liquidity (bool) – Permit a protocol-specific, Anvil-only mock or fork driver to bypass an otherwise unavailable redemption-liquidity gate. This base implementation defaults to
False; a documented protocol override may choose a different Anvil-only default. Managers must reject this request unless they have a tested, explicit implementation; it must never weaken a production preflight or live settlement path.
- Returns
Settlement outcome with before/after status and transaction hashes.
- Raises
UnsupportedVaultSimulation – If the provider is not Anvil or an async manager lacks a driver.
- Return type
- abstract has_synchronous_deposit()
Does this vault support synchronous deposits?
E.g. ERC-4626 vaults
- Return type
- abstract has_synchronous_redemption()
Does this vault support synchronous deposits?
E.g. ERC-4626 vaults
- Return type
- abstract estimate_deposit(owner, amount, block_identifier='latest')
How many shares we get for a deposit.
- Parameters
owner (Optional[eth_typing.evm.HexAddress]) –
amount (decimal.Decimal) –
block_identifier (Union[Literal['latest', 'earliest', 'pending', 'safe', 'finalized'], eth_typing.evm.BlockNumber, eth_typing.evm.Hash32, eth_typing.encoding.HexStr, int]) –
- Return type
- abstract estimate_redeem(owner, shares, block_identifier='latest')
How many denomination tokens we get for a redeem.
- Parameters
owner (Optional[eth_typing.evm.HexAddress]) –
shares (decimal.Decimal) –
block_identifier (Union[Literal['latest', 'earliest', 'pending', 'safe', 'finalized'], eth_typing.evm.BlockNumber, eth_typing.evm.Hash32, eth_typing.encoding.HexStr, int]) –
- Return type
- abstract create_deposit_request(owner, to=None, amount=None, raw_amount=None, check_max_deposit=True, check_enough_token=True)
Build the deposit request transaction(s) for an owner.
Abstracts the ERC-4626, ERC-7540, Lagoon and other protocol deposit flows behind a common request wrapper.
Whitelisting contract: implementations must raise
WhitelistingRequiredbefore returning a request when the vault applies a deposit whitelist policy, that policy is applicable and queryable, andowneris not permitted to deposit. Callcheck_deposit_whitelist()at the start of the preflight to satisfy this contract. When the whitelist information cannot be obtained (the adapter’s whitelist reads raiseNotImplementedError) the manager must not raiseWhitelistingRequired; it either proceeds — letting any real denial surface as an onchain revert — or fails closed with a plainVaultFlowUnavailablewhen unknown admission is unsafe.- Parameters
owner (eth_typing.evm.HexAddress) – Deposit owner and controller.
to (eth_typing.evm.HexAddress) – Optional separate receiver, where the protocol supports it.
amount (decimal.Decimal) – Human-readable denomination-token amount, converted using the denomination token decimals when
raw_amountis not given.raw_amount (int) – Raw denomination-token amount, overriding
amount.check_max_deposit – Preflight the deposit against the vault’s deposit capacity.
check_enough_token – Preflight that
ownerholds enough denomination token.
- Returns
Deposit request wrapper ready for signing and parsing.
- Raises
WhitelistingRequired – If the vault whitelist is applicable and excludes
owner.VaultFlowUnavailable – If the deposit cannot be safely prepared before broadcast.
- Return type
- 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
- abstract create_redemption_request(owner, to, shares=None, raw_shares=None, check_max_deposit=True, check_enough_token=True)
Create a redemption request.
Abstracts IPOR, Lagoon, Gains, other vault redemption flow.
See
eth_defi.gains.vault.GainsVaultfor an example usage.Flow
create_redemption_request
sign and broadcast the transaction
parse success and redemption request id from the transaction
wait until the redemption delay is over
settle the redemption request
- Parameters
owner (eth_typing.evm.HexAddress) – Deposit owner.
shares (decimal.Decimal) –
Share amount in decimal.
Will be converted to raw_shares using share_token decimals.
raw_shares (int) – Raw amount in share token
to (eth_typing.evm.HexAddress) –
- Returns
Redemption request wrapper.
- Return type
- abstract is_redemption_in_progress(owner)
Check if the owner has an active redemption request.
- Parameters
owner (eth_typing.evm.HexAddress) – Owner of the shares
- Returns
True if there is an active redemption request
- Return type
- abstract is_deposit_in_progress(owner)
Check if the owner has an active deposit request.
- Parameters
owner (eth_typing.evm.HexAddress) – Owner of the shares
- Returns
True if there is an active redemption request
- Return type
- can_create_deposit_request(owner)
Can we start depositing now.
Vault can be full?
- Parameters
owner (eth_typing.evm.HexAddress) –
- Return type
- 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
- fetch_vault_flow_events(hypersync_client, start_block, end_block)
Fetch asynchronous vault request events from an indexed backend.
The base implementation returns no events for vault managers that do not have a two-phase deposit or redemption flow.
- Parameters
- Returns
Iterator of protocol-neutral pending vault flow events.
- Return type
collections.abc.Iterator[eth_defi.vault.flow_events.PendingVaultFlow]
- get_max_deposit(owner)
How much we can deposit
- Parameters
owner (eth_typing.evm.HexAddress) –
- Return type
- abstract can_create_redemption_request(owner)
Gains allows request redepetion only two first days of three days epoch.
- Returns
True if can create a redemption request now
- Parameters
owner (eth_typing.evm.HexAddress) –
- Return type
- abstract can_finish_redeem(redemption_ticket)
Check if the redemption request can be redeemed now.
Phase 2 of redemption, after settlement
- Parameters
redemption_ticket (eth_defi.vault.deposit_redeem.RedemptionTicket) – Redemption redemption_ticket ticket from create_redemption_request()
- Returns
True if can be redeemed now
- Return type
- abstract can_finish_deposit(deposit_ticket)
Can we finish the deposit process in async reposits
- Parameters
deposit_ticket (eth_defi.vault.deposit_redeem.DepositTicket) –
- Return type
- abstract finish_deposit(deposit_ticket)
Can we finish the deposit process in async vault.
We can claim our shares from the vault now
- Parameters
deposit_ticket (eth_defi.vault.deposit_redeem.DepositTicket) –
- Return type
web3.contract.contract.ContractFunction
- abstract finish_redemption(redemption_ticket)
Build the depositor-owned final redemption transaction when one exists.
Some asynchronous vaults, such as Ember, transfer funds directly from an operator transaction. They deliberately return
Nonehere: an asset manager must not attempt to invoke an operator-only settlement method on behalf of its depositor.- Parameters
redemption_ticket (eth_defi.vault.deposit_redeem.RedemptionTicket) – Persisted asynchronous redemption request.
- Returns
Bound depositor claim call, or
Nonewhen the protocol has no depositor-owned finish action.- Return type
Optional[web3.contract.contract.ContractFunction]
- abstract estimate_redemption_delay()
Get the redemption delay for this vault.
What is overall redemption delay: not related to the current moment
How long it takes before a redemption request is allowed
This is not specific for any address, but the general vault rule
E.g. you get 0xa592703b is an IPOR Fusion error code AccountIsLocked, if you try to instantly redeem from IPOR vaults
- Returns
Redemption delay as a
datetime.timedelta- Raises
NotImplementedError – If not implemented for this vault protocoll.
- Return type
- abstract get_redemption_delay_over(address)
Get the redemption timer left for an address.
How long it takes before a redemption request is allowed
This is not specific for any address, but the general vault rule
E.g. you get 0xa592703b is an IPOR Fusion error code AccountIsLocked, if you try to instantly redeem from IPOR vaults
- Returns
UTC timestamp when the account can redeem.
Naive datetime, or
Nonewhen the protocol has no deterministic onchain deadline.- Raises
NotImplementedError – If not implemented for this vault protocoll.
- Parameters
address (Union[eth_typing.evm.HexAddress, str]) –
- 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]
- 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
- abstract analyse_deposit(claim_tx_hash, deposit_ticket)
Analyse the transaction where we claim shares
Return information of the actual executed price for which we got the shares for
- Parameters
deposit_ticket (Optional[eth_defi.vault.deposit_redeem.DepositTicket]) –
- Return type
Union[eth_defi.vault.deposit_redeem.DepositRedeemEventAnalysis, eth_defi.vault.deposit_redeem.DepositRedeemEventFailure]
- abstract analyse_redemption(claim_tx_hash, redemption_ticket)
Analyse the transaction where we claim our capital back.
Return information of the actual executed price for which we got the shares for
- Parameters
redemption_ticket (Optional[eth_defi.vault.deposit_redeem.RedemptionTicket]) –
- Return type
Union[eth_defi.vault.deposit_redeem.DepositRedeemEventAnalysis, eth_defi.vault.deposit_redeem.DepositRedeemEventFailure]
- serialize_deposit_ticket(ticket)
Serialise a deposit ticket to a dict for persistence.
The trade-executor stores this in
trade.other_dataso that the settlement retry module can reconstruct the ticket after a process restart.Default implementation stores base
DepositTicketfields. Subclasses override to add protocol-specific fields (e.g.settlement_idfor Ostium,requestIdfor ERC-7540).- Parameters
ticket (eth_defi.vault.deposit_redeem.DepositTicket) –
- Return type
- reconstruct_deposit_ticket(data)
Reconstruct a deposit ticket from a serialised dict.
Default returns a base
DepositTicket. Subclasses override for protocol-specific ticket types.- Parameters
data (dict) –
- Return type
- serialize_redemption_ticket(ticket)
Serialise a redemption ticket to a dict for persistence.
Default implementation stores base
RedemptionTicketfields. Subclasses override to add protocol-specific fields.- Parameters
- Return type
- reconstruct_redemption_ticket(data)
Reconstruct a redemption ticket from a serialised dict.
Async vault managers must override this to return their protocol-specific ticket subclass. The base implementation raises
NotImplementedErrorbecauseRedemptionTickethas abstract methods.- Parameters
data (dict) –
- Return type
- get_deposit_request_status(ticket)
Query the current status of an async deposit request.
Default implementation probes via
can_finish_deposit(). Subclasses should override for more accurate status reporting (e.g. distinguishingreclaimablefrompending).- Parameters
ticket (eth_defi.vault.deposit_redeem.DepositTicket) –
- Return type
- get_redemption_request_status(ticket)
Query the current status of an async redemption request.
Default implementation probes via
can_finish_redeem(). Subclasses should override for more accurate status reporting.- Parameters
- 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]