At a glance
- Resource:
sdk.deposits
- Most common flow:
quote → create → wait({ for: 'l2' })
- Auto-routing: ETH vs ERC-20 and base-token vs non-base handled internally
- Error style: Throwing methods (
quote, prepare, create, wait) + result variants (tryQuote, tryPrepare, tryCreate, tryWait)
Import
Quick start
Deposit 0.1 ETH from L1 → L2 and wait for L2 execution:
For UX that never throws, use the try* variants and branch on ok.
Route selection (automatic)
eth-base — ETH when L2 base token is ETH
eth-nonbase — ETH when L2 base token ≠ ETH
erc20-base — ERC-20 that is the L2 base token
erc20-nonbase — ERC-20 that is not the L2 base token
You do not pass a route; it’s derived from network metadata + token.
Method reference
quote(p: DepositParams) → Promise<DepositQuote>
Estimate the operation (route, approvals, gas hints). Does not send txs.
Returns: DepositQuote
If approvalsNeeded is non-empty (ERC-20), create will include those
steps automatically.
tryQuote(p) → Promise<{ ok: true; value: DepositQuote } | { ok: false; error }>
Result-style quote.
prepare(p: DepositParams) → Promise<DepositPlan<TransactionRequest>>
Builds the plan (ordered steps + unsigned txs) without sending.
Returns: DepositPlan
tryPrepare(p) → Promise<{ ok: true; value: DepositPlan } | { ok: false; error }>
Result-style prepare.
create(p: DepositParams) → Promise<DepositHandle<TransactionRequest>>
Prepares and executes all required L1 steps. Returns a handle (with L1 tx hash and per-step hashes).
Returns: DepositHandle
If any step reverts, create throws a typed error. Prefer tryCreate to
avoid exceptions.
tryCreate(p) → Promise<{ ok: true; value: DepositHandle } | { ok: false; error }>
Result-style create.
status(handleOrHash) → Promise<DepositStatus>
Resolve current phase for a deposit. Accepts the DepositHandle from create or a raw L1 tx hash.
Phases
UNKNOWN — no L1 hash provided
L1_PENDING — L1 receipt not yet found
L1_INCLUDED — included on L1; L2 hash not derivable yet
L2_PENDING — L2 hash known; waiting for L2 receipt
L2_EXECUTED — L2 receipt found with status === 1
L2_FAILED — L2 receipt found with status !== 1
wait(handleOrHash, { for: 'l1' | 'l2' }) → Promise<TransactionReceipt | null>
Block until the chosen checkpoint.
{ for: 'l1' } → L1 receipt (or null if no L1 hash available)
{ for: 'l2' } → L2 receipt after canonical execution (or null if no L1 hash)
tryWait(handleOrHash, opts) → Result<TransactionReceipt>
Result-style wait.
End-to-end examples
ETH deposit (typical)
ERC-20 deposit (with automatic approvals)
Types (overview)
Prefer the try* variants if you want to avoid exceptions and work with result
objects.
Notes & pitfalls
- ETH sentinel: use the canonical
0x…00 address when passing ETH as token.
- Receipts timing:
wait({ for: 'l2' }) resolves on canonical L2 execution; it can take longer than L1 inclusion.
- Gas hints:
suggestedL2GasLimit and gasPerPubdata are hints; advanced users may override via low-level calls from the plan.