import { MAX_NULLIFIER_READ_REQUESTS_PER_TX, NULLIFIER_TREE_HEIGHT } from '@aztec/constants'; import { makeTuple } from '@aztec/foundation/array'; import type { BufferReader } from '@aztec/foundation/serialize'; import type { MembershipWitness } from '@aztec/foundation/trees'; import { NullifierLeafPreimage } from '../../trees/index.js'; import { PendingReadHint, ReadRequestAction, ReadRequestResetHints, SettledReadHint } from './read_request_hints.js'; export type NullifierReadRequestHints = ReadRequestResetHints< typeof MAX_NULLIFIER_READ_REQUESTS_PER_TX, PENDING, SETTLED, typeof NULLIFIER_TREE_HEIGHT, NullifierLeafPreimage >; export function nullifierReadRequestHintsFromBuffer( buffer: Buffer | BufferReader, numPendingReads: PENDING, numSettledReads: SETTLED, ): NullifierReadRequestHints { return ReadRequestResetHints.fromBuffer( buffer, MAX_NULLIFIER_READ_REQUESTS_PER_TX, numPendingReads, numSettledReads, NULLIFIER_TREE_HEIGHT, NullifierLeafPreimage, ); } export class NullifierReadRequestHintsBuilder { private hints: NullifierReadRequestHints; private numPendingReadHints = 0; private numSettledReadHints = 0; constructor( public readonly maxPending: PENDING, public readonly maxSettled: SETTLED, ) { this.hints = new ReadRequestResetHints( makeTuple(MAX_NULLIFIER_READ_REQUESTS_PER_TX, ReadRequestAction.skip), makeTuple(maxPending, () => PendingReadHint.nada(MAX_NULLIFIER_READ_REQUESTS_PER_TX)), makeTuple(maxSettled, () => SettledReadHint.nada(MAX_NULLIFIER_READ_REQUESTS_PER_TX, NULLIFIER_TREE_HEIGHT, NullifierLeafPreimage.empty), ), ); } static empty(maxPending: PENDING, maxSettled: SETTLED) { return new NullifierReadRequestHintsBuilder(maxPending, maxSettled).toHints(); } addPendingReadRequest(readRequestIndex: number, nullifierIndex: number) { if (this.numPendingReadHints === this.maxPending) { throw new Error('Cannot add more pending read request.'); } this.hints.readRequestActions[readRequestIndex] = ReadRequestAction.readAsPending(this.numPendingReadHints); this.hints.pendingReadHints[this.numPendingReadHints] = new PendingReadHint(readRequestIndex, nullifierIndex); this.numPendingReadHints++; } addSettledReadRequest( readRequestIndex: number, membershipWitness: MembershipWitness, leafPreimage: NullifierLeafPreimage, ) { if (this.numSettledReadHints === this.maxSettled) { throw new Error('Cannot add more settled read request.'); } this.hints.readRequestActions[readRequestIndex] = ReadRequestAction.readAsSettled(this.numSettledReadHints); this.hints.settledReadHints[this.numSettledReadHints] = new SettledReadHint( readRequestIndex, membershipWitness, leafPreimage, ); this.numSettledReadHints++; } toHints() { return this.hints; } }