readManyCircuits
suspend fun readManyCircuits(contractJs: String, contractAddress: String, requests: List<CircuitExecutor.CircuitReadRequest>, initialPrivateState: String, coinPublicKey: ByteArray, onChainStateHex: String, constructorArgs: List<String> = emptyList(), networkId: String = "undeployed", witnesses: Map<String, WitnessProvider> = emptyMap()): Map<String, CircuitExecutor.CircuitReadResult>
Run MANY view circuits in ONE engine session against ONE on-chain state — one runtime + contract load, one initialState, one state snapshot — instead of a full engine boot and state fetch per read. Every circuit runs against its own NATIVE CLONE of the fetched state, so reads are isolated (a circuit's context mutations can't leak into the next) and all see the SAME snapshot (no mixed-block reads within a batch).
Failures are captured PER KEY rather than failing the batch — callers that probe (e.g. enumerate proposals until the contract's not-found assert) read the error from the result. All clone/post handles (and the base state handle) are freed engine-side; the pool returns to baseline exactly as single reads do.