# Async Deposit and Redeem

Though [deposit and redeem handlers are totally arbitrary](https://docs.enzyme.finance/onyx-protocol/architecture/deposit-and-redeem), most will follow an asynchronous approach with 3 steps:

1. Create request
2. Execute batched requests
3. Distribute shares (deposit) or assets (redeem); can be synchronous with (2)

## Deposit

### Request

{% @mermaid/diagram content="sequenceDiagram
actor U as Investor
participant DQ as DepositHandler
participant Asset as ERC20

```
U->>DQ: request deposit:<br/>- $assetAmount
DQ-->>DQ: validate request
DQ->>DQ: record request
DQ->>Asset: transferFrom()
Asset->>DQ: transfer $assetAmount" %}
```

### Fulfillment

{% @mermaid/diagram content="sequenceDiagram
actor Admin as Admin
participant DQ as DepositHandler
participant VH as ValuationHandler
participant FH as FeeHandler
participant Asset as DepositAsset
participant S as Shares
actor User as Investor

```
Admin->>DQ: execute requests:<br />- $requests
DQ->>VH: get:<br/>- share price<br />- asset rate
VH-->>DQ: share price, asset rate
DQ-->>DQ: calculate shares due for $requests
DQ-->>DQ: calculate total assets for $requests
DQ->>FH: settle entrance fee
DQ->>Asset: transfer()
Asset->>S: transfer total assets
DQ->>S: mint
Note over S, User: possibly separate claim step
S->>User: transfer shares" %}
```
