One runtime supplies every address in the call path. Keep that object intact instead of selecting contracts one by one. Use Current deployment for the exact pinned values.

Contract responsibilities

Deposit path

The pool requires the transaction value to equal the proof-bound amount. It also binds the commitment, chain, pool, deposit context, and encrypted recovery payload hash.

Withdrawal path

The proof binds the destination, gross amount, fee, chain, pool, proof context, and encrypted payload. An unspent sibling already belongs to the deposited bundle, so a withdrawal creates no new commitment.

Code and accounting

Runtime validation combines addresses with expected code and verifier identities, then uses live reads for current fee state. The pool’s ETH and accounting must cover every allowed exit without counting accrued fees twice. UI balances and transaction receipts are views of that state, not alternate ledgers.