erc_4626.vault_protocol.nara.deposit_redeem

Documentation for eth_defi.erc_4626.vault_protocol.nara.deposit_redeem Python module.

NaraUSD+ synchronous deposits and cooldown-based redemptions.

Classes

NaraDepositManager

NaraUSD+ manager with direct deposits and claimed cooldown redemptions.

NaraRedemptionRequest

Parse a completed NaraUSD+ cooldownShares transaction.

NaraRedemptionTicket

Persist a NaraUSD+ cooldown redemption request.

class NaraRedemptionTicket

Bases: eth_defi.vault.deposit_redeem.RedemptionTicket

Persist a NaraUSD+ cooldown redemption request.

The vault keeps one active cooldown per owner and does not assign request identifiers, so the request transaction hash provides a stable identity. The observed cooldown state binds the ticket to that specific request.

cooldown_end: datetime.datetime

Naive UTC deadline recorded by the vault after cooldownShares.

raw_assets: int

Raw NaraUSD assets escrowed for this cooldown.

get_request_id()

Return the request transaction hash as an integer identity.

Returns

Unique integer derived from the request transaction hash.

Return type

int

__init__(vault_address, owner, to, raw_shares, tx_hash, cooldown_end, raw_assets)
Parameters
Return type

None

class NaraRedemptionRequest

Bases: eth_defi.vault.deposit_redeem.RedemptionRequest

Parse a completed NaraUSD+ cooldownShares transaction.

parse_redeem_transaction(tx_hashes)

Create a persistent ticket after the request succeeds.

Parameters

tx_hashes (list[hexbytes.main.HexBytes]) – Broadcast transaction hashes; the final hash is cooldownShares.

Returns

Persistable ticket for the later unstake claim.

Return type

eth_defi.erc_4626.vault_protocol.nara.deposit_redeem.NaraRedemptionTicket

__init__(vault, owner, to, shares, raw_shares, funcs)
Parameters
Return type

None

broadcast(from_=None, gas=1000000)

Broadcast all the transactions in this request.

Parameters
Returns

List of transaction hashes

Return type

list[hexbytes.main.HexBytes]

class NaraDepositManager

Bases: eth_defi.erc_4626.deposit_redeem.ERC4626DepositManager

NaraUSD+ manager with direct deposits and claimed cooldown redemptions.

create_redemption_request(owner, to=None, shares=None, raw_shares=None, check_max_deposit=True, check_enough_token=True)

Start the owner-specific NaraUSD+ share cooldown.

Parameters
  • owner (eth_typing.evm.HexAddress) – NaraUSD+ share owner initiating the cooldown.

  • to (Optional[eth_typing.evm.HexAddress]) – Final NaraUSD receiver, defaulting to the share owner.

  • shares (Optional[decimal.Decimal]) – Decimal NaraUSD+ share amount, exclusive with raw_shares.

  • raw_shares (Optional[int]) – Raw NaraUSD+ share amount, exclusive with shares.

  • check_max_deposit (bool) – Retained inherited argument; Nara controls redemption through cooldown state.

  • check_enough_token (bool) – Check the owner’s current NaraUSD+ balance.

Returns

One-call cooldown request to settle through finish_redemption().

Return type

eth_defi.erc_4626.vault_protocol.nara.deposit_redeem.NaraRedemptionRequest

has_synchronous_redemption()

Return whether NaraUSD+ redemptions settle immediately.

Returns

Always False because the owner must complete a cooldown first.

Return type

bool

is_redemption_in_progress(owner)

Check whether an owner has an unclaimed NaraUSD+ cooldown.

Parameters

owner (eth_typing.evm.HexAddress) – Share owner to inspect.

Returns

True when the vault records a non-zero cooldown deadline.

Return type

bool

can_create_deposit_request(owner)

Check NaraUSD+’s current ERC-4626 deposit maximum.

Parameters

owner (eth_typing.evm.HexAddress) – Prospective deposit receiver.

Returns

True when the current maximum is positive.

Return type

bool

can_create_redemption_request(owner)

Check whether the owner can start a NaraUSD+ cooldown.

Parameters

owner (eth_typing.evm.HexAddress) – Share owner to inspect.

Returns

True when the owner has shares and no active cooldown.

Return type

bool

estimate_redemption_delay()

Read the currently configured NaraUSD+ cooldown duration.

Returns

Current cooldown as a timedelta.

Return type

datetime.timedelta

fetch_cooldown(address)

Read an owner’s current NaraUSD+ cooldown state.

Parameters

address (Union[eth_typing.evm.HexAddress, str]) – NaraUSD+ share owner.

Returns

Cooldown expiry timestamp and raw escrowed NaraUSD assets.

Return type

tuple[int, int]

get_redemption_delay_over(address)

Return an owner’s cooldown expiry, when one exists.

Parameters

address (Union[eth_typing.evm.HexAddress, str]) – NaraUSD+ share owner.

Returns

Naive UTC cooldown expiry, or None when no claim is pending.

Return type

Optional[datetime.datetime]

can_finish_redeem(redemption_ticket)

Check whether a NaraUSD+ cooldown claim can now be submitted.

Parameters

redemption_ticket (eth_defi.erc_4626.vault_protocol.nara.deposit_redeem.NaraRedemptionTicket) – Persisted cooldown request.

Returns

True when the current chain timestamp has reached the deadline.

Return type

bool

reconstruct_redemption_ticket(data)

Reconstruct a NaraUSD+ cooldown ticket after a process restart.

Parameters

data (dict) – Data produced by serialize_redemption_ticket().

Returns

NaraUSD+ cooldown ticket.

Return type

eth_defi.erc_4626.vault_protocol.nara.deposit_redeem.NaraRedemptionTicket

serialize_redemption_ticket(ticket)

Serialise a NaraUSD+ ticket with its exact cooldown identity.

Parameters

ticket (eth_defi.erc_4626.vault_protocol.nara.deposit_redeem.NaraRedemptionTicket) – NaraUSD+ cooldown ticket.

Returns

JSON-compatible persistent ticket data.

Return type

dict

get_redemption_request_status(ticket)

Report whether a NaraUSD+ cooldown is pending or claimable.

Parameters

ticket (eth_defi.erc_4626.vault_protocol.nara.deposit_redeem.NaraRedemptionTicket) – NaraUSD+ cooldown ticket.

Returns

pending before maturity, claimable afterwards, or none when the cooldown was claimed, removed, or superseded by another cooldown for the same owner.

Return type

eth_defi.vault.deposit_redeem.AsyncVaultRequestStatus

finish_redemption(redemption_ticket)

Build the NaraUSD+ post-cooldown claim transaction.

Parameters

redemption_ticket (eth_defi.erc_4626.vault_protocol.nara.deposit_redeem.NaraRedemptionTicket) – Matured cooldown ticket.

Returns

unstake contract call that sends NaraUSD to the requested receiver.

Return type

web3.contract.contract.ContractFunction

__init__(vault)
Parameters

vault (ERC4626Vault) –

analyse_deposit(claim_tx_hash, deposit_ticket)

Analyse a mined ERC-4626 deposit or guarded SimpleVault wrapper.

A ticket identifies an expected SimpleVault wrapper by address. The event analyser still filters events by the underlying vault address.

Parameters
Returns

Decoded executed deposit quantities or a revert description.

Return type

Union[eth_defi.vault.deposit_redeem.DepositRedeemEventAnalysis, eth_defi.vault.deposit_redeem.DepositRedeemEventFailure]

analyse_redemption(claim_tx_hash, redemption_ticket)

Analyse a mined ERC-4626 redemption or guarded SimpleVault wrapper.

A ticket identifies the wrapper only for the transaction-target check; the decoded Withdraw event must still originate from this vault.

Parameters
Returns

Decoded executed redemption quantities or a revert description.

Return type

Union[eth_defi.vault.deposit_redeem.DepositRedeemEventAnalysis, eth_defi.vault.deposit_redeem.DepositRedeemEventFailure]

can_finish_deposit(deposit_ticket)

Synchronous deposits can be finished immediately.

Parameters

deposit_ticket (eth_defi.erc_4626.deposit_redeem.ERC4626DepositTicket) –

estimate_deposit(owner, amount, block_identifier='latest')

How many shares we get for a deposit.

Parameters
Return type

decimal.Decimal

estimate_redeem(owner, shares, block_identifier='latest')

How many denomination tokens we get for a redeem.

Parameters
Return type

decimal.Decimal

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 None if the protocol has not observed one yet.

Return type

Optional[hexbytes.main.HexBytes]

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
  • hypersync_client – Configured Hypersync client for this vault’s chain.

  • start_block (int) – Inclusive start block.

  • end_block (int) – Inclusive end block.

Returns

Iterator of protocol-neutral pending vault flow events.

Return type

collections.abc.Iterator[eth_defi.vault.flow_events.PendingVaultFlow]

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

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

eth_typing.evm.HexAddress

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-ui table).

  • Default returns None: the protocol has no deterministic on-chain 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 None when no on-chain estimate is available.

Return type

Optional[datetime.datetime]

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. distinguishing reclaimable from pending).

Parameters

ticket (eth_defi.vault.deposit_redeem.DepositTicket) –

Return type

eth_defi.vault.deposit_redeem.AsyncVaultRequestStatus

get_max_deposit(owner)

How much we can deposit

Parameters

owner (eth_typing.evm.HexAddress) –

Return type

Optional[decimal.Decimal]

has_synchronous_deposit()

Does this vault support synchronous deposits?

  • E.g. ERC-4626 vaults

Return type

bool

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

bool

reclaim_deposit(ticket)

Return a function to recover funds after a failed async deposit settlement.

Returns None if 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 None if the protocol does not support reclaim.

Parameters

ticket (eth_defi.vault.deposit_redeem.RedemptionTicket) –

Return type

Optional[web3.contract.contract.ContractFunction]

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

eth_defi.vault.deposit_redeem.DepositTicket

serialize_deposit_ticket(ticket)

Serialise a deposit ticket to a dict for persistence.

The trade-executor stores this in trade.other_data so that the settlement retry module can reconstruct the ticket after a process restart.

Default implementation stores base DepositTicket fields. Subclasses override to add protocol-specific fields (e.g. settlement_id for Ostium, requestId for ERC-7540).

Parameters

ticket (eth_defi.vault.deposit_redeem.DepositTicket) –

Return type

dict