@aztec/simulator 0.33.0 → 0.35.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (186) hide show
  1. package/dest/acvm/acvm.d.ts +4 -1
  2. package/dest/acvm/acvm.d.ts.map +1 -1
  3. package/dest/acvm/acvm.js +5 -5
  4. package/dest/acvm/deserialize.d.ts +3 -5
  5. package/dest/acvm/deserialize.d.ts.map +1 -1
  6. package/dest/acvm/deserialize.js +6 -9
  7. package/dest/acvm/oracle/oracle.d.ts +3 -1
  8. package/dest/acvm/oracle/oracle.d.ts.map +1 -1
  9. package/dest/acvm/oracle/oracle.js +14 -6
  10. package/dest/acvm/oracle/typed_oracle.d.ts +2 -0
  11. package/dest/acvm/oracle/typed_oracle.d.ts.map +1 -1
  12. package/dest/acvm/oracle/typed_oracle.js +7 -1
  13. package/dest/avm/avm_execution_environment.d.ts +6 -3
  14. package/dest/avm/avm_execution_environment.d.ts.map +1 -1
  15. package/dest/avm/avm_execution_environment.js +12 -9
  16. package/dest/avm/avm_gas.js +2 -2
  17. package/dest/avm/avm_machine_state.d.ts +2 -0
  18. package/dest/avm/avm_machine_state.d.ts.map +1 -1
  19. package/dest/avm/avm_machine_state.js +24 -6
  20. package/dest/avm/avm_memory_types.js +6 -6
  21. package/dest/avm/avm_simulator.js +7 -7
  22. package/dest/avm/fixtures/index.d.ts +3 -0
  23. package/dest/avm/fixtures/index.d.ts.map +1 -1
  24. package/dest/avm/fixtures/index.js +11 -4
  25. package/dest/avm/journal/journal.d.ts +15 -13
  26. package/dest/avm/journal/journal.d.ts.map +1 -1
  27. package/dest/avm/journal/journal.js +16 -5
  28. package/dest/avm/journal/trace.d.ts +8 -19
  29. package/dest/avm/journal/trace.d.ts.map +1 -1
  30. package/dest/avm/journal/trace.js +48 -116
  31. package/dest/avm/journal/trace_types.d.ts +23 -4
  32. package/dest/avm/journal/trace_types.d.ts.map +1 -1
  33. package/dest/avm/opcodes/accrued_substate.d.ts +2 -1
  34. package/dest/avm/opcodes/accrued_substate.d.ts.map +1 -1
  35. package/dest/avm/opcodes/accrued_substate.js +14 -6
  36. package/dest/avm/opcodes/context_getters.js +2 -2
  37. package/dest/avm/opcodes/external_calls.d.ts +2 -2
  38. package/dest/avm/opcodes/external_calls.d.ts.map +1 -1
  39. package/dest/avm/opcodes/external_calls.js +26 -10
  40. package/dest/avm/opcodes/hashing.d.ts +8 -8
  41. package/dest/avm/opcodes/hashing.d.ts.map +1 -1
  42. package/dest/avm/opcodes/hashing.js +35 -43
  43. package/dest/avm/serialization/instruction_serialization.d.ts +1 -1
  44. package/dest/avm/serialization/instruction_serialization.d.ts.map +1 -1
  45. package/dest/avm/serialization/instruction_serialization.js +2 -2
  46. package/dest/client/client_execution_context.d.ts +14 -4
  47. package/dest/client/client_execution_context.d.ts.map +1 -1
  48. package/dest/client/client_execution_context.js +28 -13
  49. package/dest/client/private_execution.d.ts +1 -1
  50. package/dest/client/private_execution.d.ts.map +1 -1
  51. package/dest/client/private_execution.js +10 -8
  52. package/dest/client/simulator.d.ts.map +1 -1
  53. package/dest/client/simulator.js +6 -5
  54. package/dest/client/unconstrained_execution.d.ts +1 -1
  55. package/dest/client/unconstrained_execution.d.ts.map +1 -1
  56. package/dest/client/unconstrained_execution.js +6 -5
  57. package/dest/client/view_data_oracle.d.ts +2 -2
  58. package/dest/client/view_data_oracle.d.ts.map +1 -1
  59. package/dest/client/view_data_oracle.js +2 -2
  60. package/dest/common/index.d.ts +1 -1
  61. package/dest/common/index.d.ts.map +1 -1
  62. package/dest/common/index.js +2 -2
  63. package/dest/common/packed_values_cache.d.ts +28 -0
  64. package/dest/common/packed_values_cache.d.ts.map +1 -0
  65. package/dest/common/packed_values_cache.js +50 -0
  66. package/dest/index.d.ts +1 -0
  67. package/dest/index.d.ts.map +1 -1
  68. package/dest/index.js +2 -1
  69. package/dest/mocks/fixtures.d.ts +42 -0
  70. package/dest/mocks/fixtures.d.ts.map +1 -0
  71. package/dest/mocks/fixtures.js +84 -0
  72. package/dest/mocks/index.d.ts +2 -0
  73. package/dest/mocks/index.d.ts.map +1 -0
  74. package/dest/mocks/index.js +2 -0
  75. package/dest/public/abstract_phase_manager.d.ts +82 -0
  76. package/dest/public/abstract_phase_manager.d.ts.map +1 -0
  77. package/dest/public/abstract_phase_manager.js +320 -0
  78. package/dest/public/app_logic_phase_manager.d.ts +29 -0
  79. package/dest/public/app_logic_phase_manager.d.ts.map +1 -0
  80. package/dest/public/app_logic_phase_manager.js +50 -0
  81. package/dest/public/execution.d.ts +3 -0
  82. package/dest/public/execution.d.ts.map +1 -1
  83. package/dest/public/execution.js +1 -1
  84. package/dest/public/executor.d.ts +1 -15
  85. package/dest/public/executor.d.ts.map +1 -1
  86. package/dest/public/executor.js +80 -83
  87. package/dest/public/hints_builder.d.ts +23 -0
  88. package/dest/public/hints_builder.d.ts.map +1 -0
  89. package/dest/public/hints_builder.js +62 -0
  90. package/dest/public/index.d.ts +5 -0
  91. package/dest/public/index.d.ts.map +1 -1
  92. package/dest/public/index.js +6 -1
  93. package/dest/public/phase_manager_factory.d.ts +18 -0
  94. package/dest/public/phase_manager_factory.d.ts.map +1 -0
  95. package/dest/public/phase_manager_factory.js +56 -0
  96. package/dest/public/public_execution_context.d.ts +20 -10
  97. package/dest/public/public_execution_context.d.ts.map +1 -1
  98. package/dest/public/public_execution_context.js +35 -23
  99. package/dest/public/public_executor.d.ts +79 -0
  100. package/dest/public/public_executor.d.ts.map +1 -0
  101. package/dest/public/public_executor.js +198 -0
  102. package/dest/public/public_kernel.d.ts +37 -0
  103. package/dest/public/public_kernel.d.ts.map +1 -0
  104. package/dest/public/public_kernel.js +97 -0
  105. package/dest/public/public_kernel_circuit_simulator.d.ts +31 -0
  106. package/dest/public/public_kernel_circuit_simulator.d.ts.map +1 -0
  107. package/dest/public/public_kernel_circuit_simulator.js +2 -0
  108. package/dest/public/public_processor.d.ts +53 -0
  109. package/dest/public/public_processor.d.ts.map +1 -0
  110. package/dest/public/public_processor.js +144 -0
  111. package/dest/public/setup_phase_manager.d.ts +30 -0
  112. package/dest/public/setup_phase_manager.d.ts.map +1 -0
  113. package/dest/public/setup_phase_manager.js +46 -0
  114. package/dest/public/tail_phase_manager.d.ts +30 -0
  115. package/dest/public/tail_phase_manager.d.ts.map +1 -0
  116. package/dest/public/tail_phase_manager.js +60 -0
  117. package/dest/public/teardown_phase_manager.d.ts +30 -0
  118. package/dest/public/teardown_phase_manager.d.ts.map +1 -0
  119. package/dest/public/teardown_phase_manager.js +46 -0
  120. package/dest/public/transitional_adaptors.d.ts +33 -0
  121. package/dest/public/transitional_adaptors.d.ts.map +1 -0
  122. package/dest/public/transitional_adaptors.js +162 -0
  123. package/dest/public/utils.d.ts +8 -0
  124. package/dest/public/utils.d.ts.map +1 -0
  125. package/dest/public/utils.js +29 -0
  126. package/dest/simulator/acvm_native.d.ts +19 -3
  127. package/dest/simulator/acvm_native.d.ts.map +1 -1
  128. package/dest/simulator/acvm_native.js +75 -48
  129. package/dest/simulator/acvm_wasm.d.ts.map +1 -1
  130. package/dest/simulator/acvm_wasm.js +3 -4
  131. package/package.json +8 -5
  132. package/src/acvm/acvm.ts +8 -5
  133. package/src/acvm/deserialize.ts +5 -9
  134. package/src/acvm/oracle/oracle.ts +15 -5
  135. package/src/acvm/oracle/typed_oracle.ts +8 -0
  136. package/src/avm/avm_execution_environment.ts +17 -17
  137. package/src/avm/avm_gas.ts +1 -1
  138. package/src/avm/avm_machine_state.ts +26 -5
  139. package/src/avm/avm_memory_types.ts +5 -5
  140. package/src/avm/avm_simulator.ts +6 -6
  141. package/src/avm/fixtures/index.ts +14 -1
  142. package/src/avm/journal/journal.ts +37 -17
  143. package/src/avm/journal/trace.ts +59 -121
  144. package/src/avm/journal/trace_types.ts +39 -39
  145. package/src/avm/opcodes/accrued_substate.ts +17 -5
  146. package/src/avm/opcodes/context_getters.ts +1 -1
  147. package/src/avm/opcodes/external_calls.ts +32 -9
  148. package/src/avm/opcodes/hashing.ts +38 -54
  149. package/src/avm/serialization/instruction_serialization.ts +1 -1
  150. package/src/client/client_execution_context.ts +30 -11
  151. package/src/client/private_execution.ts +9 -8
  152. package/src/client/simulator.ts +7 -3
  153. package/src/client/unconstrained_execution.ts +5 -4
  154. package/src/client/view_data_oracle.ts +1 -1
  155. package/src/common/index.ts +1 -1
  156. package/src/common/packed_values_cache.ts +55 -0
  157. package/src/index.ts +1 -0
  158. package/src/mocks/fixtures.ts +169 -0
  159. package/src/mocks/index.ts +1 -0
  160. package/src/public/abstract_phase_manager.ts +571 -0
  161. package/src/public/app_logic_phase_manager.ts +76 -0
  162. package/src/public/execution.ts +4 -0
  163. package/src/public/executor.ts +93 -93
  164. package/src/public/hints_builder.ts +119 -0
  165. package/src/public/index.ts +5 -0
  166. package/src/public/phase_manager_factory.ts +126 -0
  167. package/src/public/public_execution_context.ts +43 -37
  168. package/src/public/public_executor.ts +267 -0
  169. package/src/public/public_kernel.ts +139 -0
  170. package/src/public/public_kernel_circuit_simulator.ts +36 -0
  171. package/src/public/public_processor.ts +212 -0
  172. package/src/public/setup_phase_manager.ts +66 -0
  173. package/src/public/tail_phase_manager.ts +120 -0
  174. package/src/public/teardown_phase_manager.ts +66 -0
  175. package/src/public/transitional_adaptors.ts +249 -0
  176. package/src/public/utils.ts +31 -0
  177. package/src/simulator/acvm_native.ts +94 -47
  178. package/src/simulator/acvm_wasm.ts +7 -3
  179. package/dest/avm/temporary_executor_migration.d.ts +0 -27
  180. package/dest/avm/temporary_executor_migration.d.ts.map +0 -1
  181. package/dest/avm/temporary_executor_migration.js +0 -94
  182. package/dest/common/packed_args_cache.d.ts +0 -28
  183. package/dest/common/packed_args_cache.d.ts.map +0 -1
  184. package/dest/common/packed_args_cache.js +0 -50
  185. package/src/avm/temporary_executor_migration.ts +0 -136
  186. package/src/common/packed_args_cache.ts +0 -55
@@ -0,0 +1,162 @@
1
+ // All code in this file needs to die once the public executor is phased out in favor of the AVM.
2
+ import { UnencryptedFunctionL2Logs, UnencryptedL2Log } from '@aztec/circuit-types';
3
+ import { CallContext, ContractStorageRead, ContractStorageUpdateRequest, FunctionData, Gas, L2ToL1Message, ReadRequest, SideEffect, SideEffectLinkedToNoteHash, } from '@aztec/circuits.js';
4
+ import { Fr } from '@aztec/foundation/fields';
5
+ import { AvmExecutionEnvironment } from '../avm/avm_execution_environment.js';
6
+ import { AvmContractCallResults } from '../avm/avm_message_call_result.js';
7
+ import { Mov } from '../avm/opcodes/memory.js';
8
+ import { createSimulationError } from '../common/errors.js';
9
+ import { PackedValuesCache, SideEffectCounter } from '../index.js';
10
+ import { PublicExecutionContext } from './public_execution_context.js';
11
+ /**
12
+ * Convert a PublicExecution(Environment) object to an AvmExecutionEnvironment
13
+ *
14
+ * @param current
15
+ * @param globalVariables
16
+ * @returns
17
+ */
18
+ export function createAvmExecutionEnvironment(current, header, globalVariables) {
19
+ return new AvmExecutionEnvironment(current.contractAddress, current.callContext.storageContractAddress, current.callContext.msgSender, // TODO: origin is not available
20
+ current.callContext.msgSender, current.callContext.portalContractAddress, globalVariables.gasFees.feePerL1Gas, globalVariables.gasFees.feePerL2Gas, globalVariables.gasFees.feePerDaGas,
21
+ /*contractCallDepth=*/ Fr.zero(), header, globalVariables, current.callContext.isStaticCall, current.callContext.isDelegateCall, current.args, current.callContext.gasSettings, current.callContext.transactionFee, current.functionData.selector);
22
+ }
23
+ export function createPublicExecutionContext(avmContext, calldata) {
24
+ const sideEffectCounter = avmContext.persistableState.trace.accessCounter;
25
+ const callContext = CallContext.from({
26
+ msgSender: avmContext.environment.sender,
27
+ storageContractAddress: avmContext.environment.storageAddress,
28
+ portalContractAddress: avmContext.environment.portal,
29
+ functionSelector: avmContext.environment.temporaryFunctionSelector,
30
+ gasLeft: Gas.from(avmContext.machineState.gasLeft),
31
+ isDelegateCall: avmContext.environment.isDelegateCall,
32
+ isStaticCall: avmContext.environment.isStaticCall,
33
+ sideEffectCounter: sideEffectCounter,
34
+ gasSettings: avmContext.environment.gasSettings,
35
+ transactionFee: avmContext.environment.transactionFee,
36
+ });
37
+ const functionData = new FunctionData(avmContext.environment.temporaryFunctionSelector, /*isPrivate=*/ false);
38
+ const execution = {
39
+ contractAddress: avmContext.environment.address,
40
+ callContext,
41
+ args: calldata,
42
+ functionData,
43
+ };
44
+ const packedArgs = PackedValuesCache.create([]);
45
+ const context = new PublicExecutionContext(execution, avmContext.environment.header, avmContext.environment.globals, packedArgs, new SideEffectCounter(sideEffectCounter), avmContext.persistableState.hostStorage.publicStateDb, avmContext.persistableState.hostStorage.contractsDb, avmContext.persistableState.hostStorage.commitmentsDb);
46
+ return context;
47
+ }
48
+ /**
49
+ * Convert the result of an AVM contract call to a PublicExecutionResult for the public kernel
50
+ *
51
+ * @param execution
52
+ * @param newWorldState
53
+ * @param result
54
+ * @returns
55
+ */
56
+ export async function convertAvmResults(executionContext, newWorldState, result, endMachineState) {
57
+ const execution = executionContext.execution;
58
+ const contractStorageReads = newWorldState.storageReads.map(read => new ContractStorageRead(read.slot, read.value, read.counter.toNumber()));
59
+ const contractStorageUpdateRequests = newWorldState.storageWrites.map(write => new ContractStorageUpdateRequest(write.slot, write.value, write.counter.toNumber()));
60
+ // We need to write the storage updates to the DB, because that's what the ACVM expects.
61
+ // Assumes the updates are in the right order.
62
+ for (const write of newWorldState.storageWrites) {
63
+ await executionContext.stateDb.storageWrite(write.storageAddress, write.slot, write.value);
64
+ }
65
+ const newNoteHashes = newWorldState.newNoteHashes.map(noteHash => new SideEffect(noteHash.noteHash, noteHash.counter));
66
+ const nullifierReadRequests = newWorldState.nullifierChecks
67
+ .filter(nullifierCheck => nullifierCheck.exists)
68
+ .map(nullifierCheck => new ReadRequest(nullifierCheck.nullifier, nullifierCheck.counter.toNumber()));
69
+ const nullifierNonExistentReadRequests = newWorldState.nullifierChecks
70
+ .filter(nullifierCheck => !nullifierCheck.exists)
71
+ .map(nullifierCheck => new ReadRequest(nullifierCheck.nullifier, nullifierCheck.counter.toNumber()));
72
+ const newNullifiers = newWorldState.newNullifiers.map(tracedNullifier => new SideEffectLinkedToNoteHash(
73
+ /*value=*/ tracedNullifier.nullifier,
74
+ /*noteHash=*/ Fr.ZERO, // NEEDED?
75
+ tracedNullifier.counter));
76
+ const unencryptedLogs = new UnencryptedFunctionL2Logs(newWorldState.newLogs.map(log => new UnencryptedL2Log(log.contractAddress, log.selector, log.data)));
77
+ const newL2ToL1Messages = newWorldState.newL1Messages.map(m => new L2ToL1Message(m.recipient, m.content));
78
+ const returnValues = result.output;
79
+ // TODO: Support nested executions.
80
+ const nestedExecutions = [];
81
+ // TODO keep track of side effect counters
82
+ const startSideEffectCounter = Fr.ZERO;
83
+ const endSideEffectCounter = Fr.ZERO;
84
+ return {
85
+ execution,
86
+ nullifierReadRequests,
87
+ nullifierNonExistentReadRequests,
88
+ newNoteHashes,
89
+ newL2ToL1Messages,
90
+ startSideEffectCounter,
91
+ endSideEffectCounter,
92
+ newNullifiers,
93
+ contractStorageReads,
94
+ contractStorageUpdateRequests,
95
+ returnValues,
96
+ nestedExecutions,
97
+ unencryptedLogs,
98
+ reverted: result.reverted,
99
+ revertReason: result.revertReason ? createSimulationError(result.revertReason) : undefined,
100
+ gasLeft: endMachineState.gasLeft,
101
+ };
102
+ }
103
+ export function convertPublicExecutionResult(res) {
104
+ return new AvmContractCallResults(res.reverted, res.returnValues, res.revertReason);
105
+ }
106
+ export function updateAvmContextFromPublicExecutionResult(ctx, result) {
107
+ // We have to push these manually and not use the trace* functions
108
+ // so that we respect the side effect counters.
109
+ for (const readRequest of result.contractStorageReads) {
110
+ ctx.persistableState.trace.publicStorageReads.push({
111
+ storageAddress: ctx.environment.storageAddress,
112
+ exists: true, // FIXME
113
+ slot: readRequest.storageSlot,
114
+ value: readRequest.currentValue,
115
+ counter: new Fr(readRequest.sideEffectCounter ?? Fr.ZERO),
116
+ });
117
+ }
118
+ for (const updateRequest of result.contractStorageUpdateRequests) {
119
+ ctx.persistableState.trace.publicStorageWrites.push({
120
+ storageAddress: ctx.environment.storageAddress,
121
+ slot: updateRequest.storageSlot,
122
+ value: updateRequest.newValue,
123
+ counter: new Fr(updateRequest.sideEffectCounter ?? Fr.ZERO),
124
+ });
125
+ // We need to manually populate the cache.
126
+ ctx.persistableState.publicStorage.write(ctx.environment.storageAddress, updateRequest.storageSlot, updateRequest.newValue);
127
+ }
128
+ for (const nullifier of result.newNullifiers) {
129
+ ctx.persistableState.trace.newNullifiers.push({
130
+ storageAddress: ctx.environment.storageAddress,
131
+ nullifier: nullifier.value,
132
+ counter: nullifier.counter,
133
+ });
134
+ }
135
+ for (const noteHash of result.newNoteHashes) {
136
+ ctx.persistableState.trace.newNoteHashes.push({
137
+ storageAddress: ctx.environment.storageAddress,
138
+ noteHash: noteHash.value,
139
+ counter: noteHash.counter,
140
+ });
141
+ }
142
+ for (const message of result.newL2ToL1Messages) {
143
+ ctx.persistableState.newL1Messages.push(message);
144
+ }
145
+ for (const log of result.unencryptedLogs.logs) {
146
+ ctx.persistableState.newLogs.push(new UnencryptedL2Log(log.contractAddress, log.selector, log.data));
147
+ }
148
+ }
149
+ const AVM_MAGIC_SUFFIX = Buffer.from([
150
+ Mov.opcode, // opcode
151
+ 0x00, // indirect
152
+ ...Buffer.from('000018ca', 'hex'), // srcOffset
153
+ ...Buffer.from('000018ca', 'hex'), // dstOffset
154
+ ]);
155
+ export function markBytecodeAsAvm(bytecode) {
156
+ return Buffer.concat([bytecode, AVM_MAGIC_SUFFIX]);
157
+ }
158
+ export function isAvmBytecode(bytecode) {
159
+ const magicSize = AVM_MAGIC_SUFFIX.length;
160
+ return bytecode.subarray(-magicSize).equals(AVM_MAGIC_SUFFIX);
161
+ }
162
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNpdGlvbmFsX2FkYXB0b3JzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3B1YmxpYy90cmFuc2l0aW9uYWxfYWRhcHRvcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsaUdBQWlHO0FBQ2pHLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ25GLE9BQU8sRUFDTCxXQUFXLEVBQ1gsbUJBQW1CLEVBQ25CLDRCQUE0QixFQUM1QixZQUFZLEVBQ1osR0FBRyxFQUdILGFBQWEsRUFDYixXQUFXLEVBQ1gsVUFBVSxFQUNWLDBCQUEwQixHQUMzQixNQUFNLG9CQUFvQixDQUFDO0FBQzVCLE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUc5QyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUU5RSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUUzRSxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDL0MsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDNUQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLGlCQUFpQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRW5FLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBRXZFOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSw2QkFBNkIsQ0FDM0MsT0FBd0IsRUFDeEIsTUFBYyxFQUNkLGVBQWdDO0lBRWhDLE9BQU8sSUFBSSx1QkFBdUIsQ0FDaEMsT0FBTyxDQUFDLGVBQWUsRUFDdkIsT0FBTyxDQUFDLFdBQVcsQ0FBQyxzQkFBc0IsRUFDMUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxTQUFTLEVBQUUsZ0NBQWdDO0lBQy9ELE9BQU8sQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUM3QixPQUFPLENB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
@@ -0,0 +1,8 @@
1
+ import { type Tx } from '@aztec/circuit-types';
2
+ /**
3
+ * Looks at the side effects of a transaction and returns the highest counter
4
+ * @param tx - A transaction
5
+ * @returns The highest side effect counter in the transaction so far
6
+ */
7
+ export declare function lastSideEffectCounter(tx: Tx): number;
8
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/public/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,EAAE,MAAM,sBAAsB,CAAC;AAG/C;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,EAAE,EAAE,EAAE,GAAG,MAAM,CAsBpD"}
@@ -0,0 +1,29 @@
1
+ import { CallRequest } from '@aztec/circuits.js';
2
+ /**
3
+ * Looks at the side effects of a transaction and returns the highest counter
4
+ * @param tx - A transaction
5
+ * @returns The highest side effect counter in the transaction so far
6
+ */
7
+ export function lastSideEffectCounter(tx) {
8
+ const data = tx.data.forPublic;
9
+ const sideEffectCounters = [
10
+ ...data.endNonRevertibleData.newNoteHashes,
11
+ ...data.endNonRevertibleData.newNullifiers,
12
+ ...data.endNonRevertibleData.publicCallStack,
13
+ ...data.end.newNoteHashes,
14
+ ...data.end.newNullifiers,
15
+ ...data.end.publicCallStack,
16
+ ];
17
+ let max = 0;
18
+ for (const sideEffect of sideEffectCounters) {
19
+ if (sideEffect instanceof CallRequest) {
20
+ // look at both start and end counters because for enqueued public calls start > 0 while end === 0
21
+ max = Math.max(max, sideEffect.startSideEffectCounter.toNumber(), sideEffect.endSideEffectCounter.toNumber());
22
+ }
23
+ else {
24
+ max = Math.max(max, sideEffect.counter.toNumber());
25
+ }
26
+ }
27
+ return max;
28
+ }
29
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcHVibGljL3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUVqRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLHFCQUFxQixDQUFDLEVBQU07SUFDMUMsTUFBTSxJQUFJLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFVLENBQUM7SUFDaEMsTUFBTSxrQkFBa0IsR0FBRztRQUN6QixHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxhQUFhO1FBQzFDLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLGFBQWE7UUFDMUMsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsZUFBZTtRQUM1QyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYTtRQUN6QixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYTtRQUN6QixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsZUFBZTtLQUM1QixDQUFDO0lBRUYsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDO0lBQ1osS0FBSyxNQUFNLFVBQVUsSUFBSSxrQkFBa0IsRUFBRSxDQUFDO1FBQzVDLElBQUksVUFBVSxZQUFZLFdBQVcsRUFBRSxDQUFDO1lBQ3RDLGtHQUFrRztZQUNsRyxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsVUFBVSxDQUFDLHNCQUFzQixDQUFDLFFBQVEsRUFBRSxFQUFFLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQ2hILENBQUM7YUFBTSxDQUFDO1lBQ04sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLFVBQVUsQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUNyRCxDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQyJ9
@@ -2,19 +2,35 @@
2
2
  import { type NoirCompiledCircuit } from '@aztec/types/noir';
3
3
  import { type WitnessMap } from '@noir-lang/types';
4
4
  import { type SimulationProvider } from './simulation_provider.js';
5
+ export declare enum ACVM_RESULT {
6
+ SUCCESS = 0,
7
+ FAILURE = 1
8
+ }
9
+ export type ACVMSuccess = {
10
+ status: ACVM_RESULT.SUCCESS;
11
+ duration: number;
12
+ witness: Map<number, string>;
13
+ };
14
+ export type ACVMFailure = {
15
+ status: ACVM_RESULT.FAILURE;
16
+ reason: string;
17
+ };
18
+ export type ACVMResult = ACVMSuccess | ACVMFailure;
5
19
  /**
6
20
  *
7
21
  * @param inputWitness - The circuit's input witness
8
22
  * @param bytecode - The circuit bytecode
9
23
  * @param workingDirectory - A directory to use for temporary files by the ACVM
10
- * @param pathToAcvm - The path to the ACVm binary
24
+ * @param pathToAcvm - The path to the ACVM binary
25
+ * @param outputFilename - If specified, the output will be stored as a file, encoded using Bincode
11
26
  * @returns The completed partial witness outputted from the circuit
12
27
  */
13
- export declare function executeNativeCircuit(inputWitness: WitnessMap, bytecode: Buffer, workingDirectory: string, pathToAcvm: string): Promise<Map<number, string>>;
28
+ export declare function executeNativeCircuit(inputWitness: WitnessMap, bytecode: Buffer, workingDirectory: string, pathToAcvm: string, outputFilename?: string): Promise<ACVMResult>;
14
29
  export declare class NativeACVMSimulator implements SimulationProvider {
15
30
  private workingDirectory;
16
31
  private pathToAcvm;
17
- constructor(workingDirectory: string, pathToAcvm: string);
32
+ private witnessFilename?;
33
+ constructor(workingDirectory: string, pathToAcvm: string, witnessFilename?: string | undefined);
18
34
  simulateCircuit(input: WitnessMap, compiledCircuit: NoirCompiledCircuit): Promise<WitnessMap>;
19
35
  }
20
36
  //# sourceMappingURL=acvm_native.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"acvm_native.d.ts","sourceRoot":"","sources":["../../src/simulator/acvm_native.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,KAAK,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAE7D,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAInD,OAAO,EAAE,KAAK,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAmBnE;;;;;;;GAOG;AACH,wBAAsB,oBAAoB,CACxC,YAAY,EAAE,UAAU,EACxB,QAAQ,EAAE,MAAM,EAChB,gBAAgB,EAAE,MAAM,EACxB,UAAU,EAAE,MAAM,gCAwDnB;AAED,qBAAa,mBAAoB,YAAW,kBAAkB;IAChD,OAAO,CAAC,gBAAgB;IAAU,OAAO,CAAC,UAAU;gBAA5C,gBAAgB,EAAE,MAAM,EAAU,UAAU,EAAE,MAAM;IAClE,eAAe,CAAC,KAAK,EAAE,UAAU,EAAE,eAAe,EAAE,mBAAmB,GAAG,OAAO,CAAC,UAAU,CAAC;CAapG"}
1
+ {"version":3,"file":"acvm_native.d.ts","sourceRoot":"","sources":["../../src/simulator/acvm_native.ts"],"names":[],"mappings":";AAGA,OAAO,EAAE,KAAK,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAE7D,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAInD,OAAO,EAAE,KAAK,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAInE,oBAAY,WAAW;IACrB,OAAO,IAAA;IACP,OAAO,IAAA;CACR;AAED,MAAM,MAAM,WAAW,GAAG;IACxB,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC9B,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC;IAC5B,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG,WAAW,GAAG,WAAW,CAAC;AAmBnD;;;;;;;;GAQG;AACH,wBAAsB,oBAAoB,CACxC,YAAY,EAAE,UAAU,EACxB,QAAQ,EAAE,MAAM,EAChB,gBAAgB,EAAE,MAAM,EACxB,UAAU,EAAE,MAAM,EAClB,cAAc,CAAC,EAAE,MAAM,GACtB,OAAO,CAAC,UAAU,CAAC,CAqErB;AAED,qBAAa,mBAAoB,YAAW,kBAAkB;IAChD,OAAO,CAAC,gBAAgB;IAAU,OAAO,CAAC,UAAU;IAAU,OAAO,CAAC,eAAe,CAAC;gBAA9E,gBAAgB,EAAE,MAAM,EAAU,UAAU,EAAE,MAAM,EAAU,eAAe,CAAC,oBAAQ;IACpG,eAAe,CAAC,KAAK,EAAE,UAAU,EAAE,eAAe,EAAE,mBAAmB,GAAG,OAAO,CAAC,UAAU,CAAC;CAsBpG"}
@@ -1,6 +1,14 @@
1
1
  import { randomBytes } from '@aztec/foundation/crypto';
2
+ import { createDebugLogger } from '@aztec/foundation/log';
3
+ import { Timer } from '@aztec/foundation/timer';
2
4
  import * as proc from 'child_process';
3
5
  import fs from 'fs/promises';
6
+ const logger = createDebugLogger('aztec:acvm-native');
7
+ export var ACVM_RESULT;
8
+ (function (ACVM_RESULT) {
9
+ ACVM_RESULT[ACVM_RESULT["SUCCESS"] = 0] = "SUCCESS";
10
+ ACVM_RESULT[ACVM_RESULT["FAILURE"] = 1] = "FAILURE";
11
+ })(ACVM_RESULT || (ACVM_RESULT = {}));
4
12
  /**
5
13
  * Parses a TOML format witness map string into a Map structure
6
14
  * @param outputString - The witness map in TOML format
@@ -20,10 +28,11 @@ function parseIntoWitnessMap(outputString) {
20
28
  * @param inputWitness - The circuit's input witness
21
29
  * @param bytecode - The circuit bytecode
22
30
  * @param workingDirectory - A directory to use for temporary files by the ACVM
23
- * @param pathToAcvm - The path to the ACVm binary
31
+ * @param pathToAcvm - The path to the ACVM binary
32
+ * @param outputFilename - If specified, the output will be stored as a file, encoded using Bincode
24
33
  * @returns The completed partial witness outputted from the circuit
25
34
  */
26
- export async function executeNativeCircuit(inputWitness, bytecode, workingDirectory, pathToAcvm) {
35
+ export async function executeNativeCircuit(inputWitness, bytecode, workingDirectory, pathToAcvm, outputFilename) {
27
36
  const bytecodeFilename = 'bytecode';
28
37
  const witnessFilename = 'input_witness.toml';
29
38
  // convert the witness map to TOML format
@@ -31,66 +40,84 @@ export async function executeNativeCircuit(inputWitness, bytecode, workingDirect
31
40
  inputWitness.forEach((value, key) => {
32
41
  witnessMap = witnessMap.concat(`${key} = '${value}'\n`);
33
42
  });
34
- // In case the directory is still around from some time previously, remove it
35
- await fs.rm(workingDirectory, { recursive: true, force: true });
36
- // Create the new working directory
37
- await fs.mkdir(workingDirectory, { recursive: true });
38
- // Write the bytecode and input witness to the working directory
39
- await fs.writeFile(`${workingDirectory}/${bytecodeFilename}`, bytecode);
40
- await fs.writeFile(`${workingDirectory}/${witnessFilename}`, witnessMap);
41
- // Execute the ACVM using the given args
42
- const args = [
43
- `execute`,
44
- `--working-directory`,
45
- `${workingDirectory}`,
46
- `--bytecode`,
47
- `${bytecodeFilename}`,
48
- `--input-witness`,
49
- `${witnessFilename}`,
50
- `--print`,
51
- ];
52
- const processPromise = new Promise((resolve, reject) => {
53
- let outputWitness = Buffer.alloc(0);
54
- let errorBuffer = Buffer.alloc(0);
55
- const acvm = proc.spawn(pathToAcvm, args);
56
- acvm.stdout.on('data', data => {
57
- outputWitness = Buffer.concat([outputWitness, data]);
58
- });
59
- acvm.stderr.on('data', data => {
60
- errorBuffer = Buffer.concat([errorBuffer, data]);
61
- });
62
- acvm.on('close', code => {
63
- if (code === 0) {
64
- resolve(outputWitness.toString('utf-8'));
65
- }
66
- else {
67
- reject(errorBuffer.toString('utf-8'));
68
- }
69
- });
70
- });
71
43
  try {
44
+ // Check that the directory exists
45
+ await fs.access(workingDirectory);
46
+ }
47
+ catch (error) {
48
+ return { status: ACVM_RESULT.FAILURE, reason: `Working directory ${workingDirectory} does not exist` };
49
+ }
50
+ try {
51
+ // Write the bytecode and input witness to the working directory
52
+ await fs.writeFile(`${workingDirectory}/${bytecodeFilename}`, bytecode);
53
+ await fs.writeFile(`${workingDirectory}/${witnessFilename}`, witnessMap);
54
+ // Execute the ACVM using the given args
55
+ const args = [
56
+ `execute`,
57
+ `--working-directory`,
58
+ `${workingDirectory}`,
59
+ `--bytecode`,
60
+ `${bytecodeFilename}`,
61
+ `--input-witness`,
62
+ `${witnessFilename}`,
63
+ '--print',
64
+ '--output-witness',
65
+ 'output-witness',
66
+ ];
67
+ logger.debug(`Calling ACVM with ${args.join(' ')}`);
68
+ const processPromise = new Promise((resolve, reject) => {
69
+ let outputWitness = Buffer.alloc(0);
70
+ let errorBuffer = Buffer.alloc(0);
71
+ const acvm = proc.spawn(pathToAcvm, args);
72
+ acvm.stdout.on('data', data => {
73
+ outputWitness = Buffer.concat([outputWitness, data]);
74
+ });
75
+ acvm.stderr.on('data', data => {
76
+ errorBuffer = Buffer.concat([errorBuffer, data]);
77
+ });
78
+ acvm.on('close', code => {
79
+ if (code === 0) {
80
+ resolve(outputWitness.toString('utf-8'));
81
+ }
82
+ else {
83
+ logger.error(`From ACVM: ${errorBuffer.toString('utf-8')}`);
84
+ reject(errorBuffer.toString('utf-8'));
85
+ }
86
+ });
87
+ });
88
+ const duration = new Timer();
72
89
  const output = await processPromise;
73
- return parseIntoWitnessMap(output);
90
+ if (outputFilename) {
91
+ const outputWitnessFileName = `${workingDirectory}/output-witness.gz`;
92
+ await fs.copyFile(outputWitnessFileName, outputFilename);
93
+ }
94
+ const witness = parseIntoWitnessMap(output);
95
+ return { status: ACVM_RESULT.SUCCESS, witness, duration: duration.ms() };
74
96
  }
75
- finally {
76
- // Clean up the working directory before we leave
77
- await fs.rm(workingDirectory, { recursive: true, force: true });
97
+ catch (error) {
98
+ return { status: ACVM_RESULT.FAILURE, reason: `${error}` };
78
99
  }
79
100
  }
80
101
  export class NativeACVMSimulator {
81
- constructor(workingDirectory, pathToAcvm) {
102
+ constructor(workingDirectory, pathToAcvm, witnessFilename) {
82
103
  this.workingDirectory = workingDirectory;
83
104
  this.pathToAcvm = pathToAcvm;
105
+ this.witnessFilename = witnessFilename;
84
106
  }
85
107
  async simulateCircuit(input, compiledCircuit) {
86
108
  // Execute the circuit on those initial witness values
87
109
  // Decode the bytecode from base64 since the acvm does not know about base64 encoding
88
110
  const decodedBytecode = Buffer.from(compiledCircuit.bytecode, 'base64');
89
111
  // Provide a unique working directory so we don't get clashes with parallel executions
90
- const directory = `${this.workingDirectory}/${randomBytes(32).toString('hex')}`;
112
+ const directory = `${this.workingDirectory}/${randomBytes(8).toString('hex')}`;
113
+ await fs.mkdir(directory, { recursive: true });
91
114
  // Execute the circuit
92
- const _witnessMap = await executeNativeCircuit(input, decodedBytecode, directory, this.pathToAcvm);
93
- return _witnessMap;
115
+ const result = await executeNativeCircuit(input, decodedBytecode, directory, this.pathToAcvm, this.witnessFilename);
116
+ await fs.rm(directory, { force: true, recursive: true });
117
+ if (result.status == ACVM_RESULT.FAILURE) {
118
+ throw new Error(`Failed to generate witness: ${result.reason}`);
119
+ }
120
+ return result.witness;
94
121
  }
95
122
  }
96
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWN2bV9uYXRpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2ltdWxhdG9yL2Fjdm1fbmF0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUl2RCxPQUFPLEtBQUssSUFBSSxNQUFNLGVBQWUsQ0FBQztBQUN0QyxPQUFPLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFJN0I7Ozs7R0FJRztBQUNILFNBQVMsbUJBQW1CLENBQUMsWUFBb0I7SUFDL0MsTUFBTSxLQUFLLEdBQUcsWUFBWSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN2QyxPQUFPLElBQUksR0FBRyxDQUNaLEtBQUs7U0FDRixNQUFNLENBQUMsQ0FBQyxJQUFZLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7U0FDckMsR0FBRyxDQUFDLENBQUMsSUFBWSxFQUFFLEVBQUU7UUFDcEIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2pELE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN4RCxDQUFDLENBQUMsQ0FDTCxDQUFDO0FBQ0osQ0FBQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLG9CQUFvQixDQUN4QyxZQUF3QixFQUN4QixRQUFnQixFQUNoQixnQkFBd0IsRUFDeEIsVUFBa0I7SUFFbEIsTUFBTSxnQkFBZ0IsR0FBRyxVQUFVLENBQUM7SUFDcEMsTUFBTSxlQUFlLEdBQUcsb0JBQW9CLENBQUM7SUFFN0MseUNBQXlDO0lBQ3pDLElBQUksVUFBVSxH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
123
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWN2bV9uYXRpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2ltdWxhdG9yL2Fjdm1fbmF0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFJaEQsT0FBTyxLQUFLLElBQUksTUFBTSxlQUFlLENBQUM7QUFDdEMsT0FBTyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBSTdCLE1BQU0sTUFBTSxHQUFHLGlCQUFpQixDQUFDLG1CQUFtQixDQUFDLENBQUM7QUFFdEQsTUFBTSxDQUFOLElBQVksV0FHWDtBQUhELFdBQVksV0FBVztJQUNyQixtREFBTyxDQUFBO0lBQ1AsbURBQU8sQ0FBQTtBQUNULENBQUMsRUFIVyxXQUFXLEtBQVgsV0FBVyxRQUd0QjtBQWVEOzs7O0dBSUc7QUFDSCxTQUFTLG1CQUFtQixDQUFDLFlBQW9CO0lBQy9DLE1BQU0sS0FBSyxHQUFHLFlBQVksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDdkMsT0FBTyxJQUFJLEdBQUcsQ0FDWixLQUFLO1NBQ0YsTUFBTSxDQUFDLENBQUMsSUFBWSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO1NBQ3JDLEdBQUcsQ0FBQyxDQUFDLElBQVksRUFBRSxFQUFFO1FBQ3BCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNqRCxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDeEQsQ0FBQyxDQUFDLENBQ0wsQ0FBQztBQUNKLENBQUM7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsb0JBQW9CLENBQ3hDLFlBQXdCLEVBQ3hCLFFBQWdCLEVBQ2hCLGdCQUF3QixFQUN4QixVQUFrQixFQUNsQixjQUF1QjtJQUV2QixNQUFNLGdCQUFnQixHQUFHLFVBQVUsQ0FBQztJQUNwQyxNQUFNLGVBQWUsR0FBRyxvQkFBb0IsQ0FBQztJQUU3Qyx5Q0FBeUM7SUFDekMsSUFBSSxVQUFVLEdBQUcsRUFBRSxDQUFDO0lBQ3BCLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFhLEVBQUUsR0FBVyxFQUFFLEVBQUU7UUFDbEQsVUFBVSxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUMsR0FBRyxHQUFHLE9BQU8sS0FBSyxLQUFLLENBQUMsQ0FBQztJQUMxRCxDQUFDLENBQUMsQ0FBQztJQUVILElBQUksQ0FBQztRQUNILGtDQUFrQztRQUNsQyxNQUFNLEVBQUUsQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztRQUNmLE9BQU8sRUFBRSxNQUFNLEVBQUUsV0FBVyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUscUJBQXFCLGdCQUFnQixpQkFBaUIsRUFBRSxDQUFDO0lBQ3pHLENBQUM7SUFFRCxJQUFJLENBQUM7UUFDSCxnRUFBZ0U7UUFDaEUsTUFBTSxFQUFFLENBQUMsU0FBUyxDQUFDLEdBQUcsZ0JBQWdCLElBQUksZ0JBQWdCLEVBQUUsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUN4RSxNQUFNLEVBQUUsQ0FBQyxTQUFTLENBQUMsR0FBRyxnQkFBZ0IsSUFBSSxlQUFlLEVBQUUsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUV6RSx3Q0FBd0M7UUFDeEMsTUFBTSxJQUFJLEdBQUc7WUFDWCxTQUFTO1lBQ1QscUJBQXFCO1lBQ3JCLEdBQUcsZ0JBQWdCLEVBQUU7WUFDckIsWUFBWTtZQUNaLEdBQUcsZ0JBQWdCLEVBQUU7WUFDckIsaUJBQWlCO1lBQ2pCLEdBQUcsZUFBZSxFQUFFO1lBQ3BCLFNBQVM7WUFDVCxrQkFBa0I7WUFDbEIsZ0JBQWdCO1NBQ2pCLENBQUM7UUFFRixNQUFNLENBQUMsS0FBSyxDQUFDLHFCQUFxQixJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUVwRCxNQUFNLGNBQWMsR0FBRyxJQUFJLE9BQU8sQ0FBUyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtZQUM3RCxJQUFJLGFBQWEsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3BDLElBQUksV0FBVyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDbEMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDMUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxFQUFFO2dCQUM1QixhQUFhLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQ3ZELENBQUMsQ0FBQyxDQUFDO1lBQ0gsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxFQUFFO2dCQUM1QixXQUFXLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQ25ELENBQUMsQ0FBQyxDQUFDO1lBQ0gsSUFBSSxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLEVBQUU7Z0JBQ3RCLElBQUksSUFBSSxLQUFLLENBQUMsRUFBRSxDQUFDO29CQUNmLE9BQU8sQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7Z0JBQzNDLENBQUM7cUJBQU0sQ0FBQztvQkFDTixNQUFNLENBQUMsS0FBSyxDQUFDLGNBQWMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUM7b0JBQzVELE1BQU0sQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7Z0JBQ3hDLENBQUM7WUFDSCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBRUgsTUFBTSxRQUFRLEdBQUcsSUFBSSxLQUFLLEVBQUUsQ0FBQztRQUM3QixNQUFNLE1BQU0sR0FBRyxNQUFNLGNBQWMsQ0FBQztRQUNwQyxJQUFJLGNBQWMsRUFBRSxDQUFDO1lBQ25CLE1BQU0scUJBQXFCLEdBQUcsR0FBRyxnQkFBZ0Isb0JBQW9CLENBQUM7WUFDdEUsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLHFCQUFxQixFQUFFLGNBQWMsQ0FBQyxDQUFDO1FBQzNELENBQUM7UUFDRCxNQUFNLE9BQU8sR0FBRyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM1QyxPQUFPLEVBQUUsTUFBTSxFQUFFLFdBQVcsQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxRQUFRLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQztJQUMzRSxDQUFDO0lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztRQUNmLE9BQU8sRUFBRSxNQUFNLEVBQUUsV0FBVyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsR0FBRyxLQUFLLEVBQUUsRUFBRSxDQUFDO0lBQzdELENBQUM7QUFDSCxDQUFDO0FBRUQsTUFBTSxPQUFPLG1CQUFtQjtJQUM5QixZQUFvQixnQkFBd0IsRUFBVSxVQUFrQixFQUFVLGVBQXdCO1FBQXRGLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBUTtRQUFVLGVBQVUsR0FBVixVQUFVLENBQVE7UUFBVSxvQkFBZSxHQUFmLGVBQWUsQ0FBUztJQUFHLENBQUM7SUFDOUcsS0FBSyxDQUFDLGVBQWUsQ0FBQyxLQUFpQixFQUFFLGVBQW9DO1FBQzNFLHNEQUFzRDtRQUV0RCxxRkFBcUY7UUFDckYsTUFBTSxlQUFlLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBRXhFLHNGQUFzRjtRQUN0RixNQUFNLFNBQVMsR0FBRyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsSUFBSSxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFFL0UsTUFBTSxFQUFFLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBRS9DLHNCQUFzQjtRQUN0QixNQUFNLE1BQU0sR0FBRyxNQUFNLG9CQUFvQixDQUFDLEtBQUssRUFBRSxlQUFlLEVBQUUsU0FBUyxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBRXBILE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxTQUFTLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBRXpELElBQUksTUFBTSxDQUFDLE1BQU0sSUFBSSxXQUFXLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDekMsTUFBTSxJQUFJLEtBQUssQ0FBQywrQkFBK0IsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFDbEUsQ0FBQztRQUVELE9BQU8sTUFBTSxDQUFDLE9BQU8sQ0FBQztJQUN4QixDQUFDO0NBQ0YifQ==
@@ -1 +1 @@
1
- {"version":3,"file":"acvm_wasm.d.ts","sourceRoot":"","sources":["../../src/simulator/acvm_wasm.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAO7D,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEnD,OAAO,EAAE,KAAK,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAWnE,qBAAa,aAAc,YAAW,kBAAkB;IAChD,eAAe,CAAC,KAAK,EAAE,UAAU,EAAE,eAAe,EAAE,mBAAmB,GAAG,OAAO,CAAC,UAAU,CAAC;CAapG"}
1
+ {"version":3,"file":"acvm_wasm.d.ts","sourceRoot":"","sources":["../../src/simulator/acvm_wasm.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAO7D,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEnD,OAAO,EAAE,KAAK,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAWnE,qBAAa,aAAc,YAAW,kBAAkB;IAChD,eAAe,CAAC,KAAK,EAAE,UAAU,EAAE,eAAe,EAAE,mBAAmB,GAAG,OAAO,CAAC,UAAU,CAAC;CAgBpG"}
@@ -1,3 +1,4 @@
1
+ import { foreignCallHandler } from '@aztec/noir-protocol-circuits-types';
1
2
  import { createBlackBoxSolver, executeCircuitWithBlackBoxSolver, } from '@noir-lang/acvm_js';
2
3
  let solver;
3
4
  const getSolver = () => {
@@ -14,10 +15,8 @@ export class WASMSimulator {
14
15
  const decodedBytecode = Buffer.from(compiledCircuit.bytecode, 'base64');
15
16
  //
16
17
  // Execute the circuit
17
- const _witnessMap = await executeCircuitWithBlackBoxSolver(await getSolver(), decodedBytecode, input, () => {
18
- throw Error('unexpected oracle during execution');
19
- });
18
+ const _witnessMap = await executeCircuitWithBlackBoxSolver(await getSolver(), decodedBytecode, input, foreignCallHandler);
20
19
  return _witnessMap;
21
20
  }
22
21
  }
23
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWN2bV93YXNtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NpbXVsYXRvci9hY3ZtX3dhc20udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUVMLG9CQUFvQixFQUNwQixnQ0FBZ0MsR0FDakMsTUFBTSxvQkFBb0IsQ0FBQztBQUs1QixJQUFJLE1BQTJDLENBQUM7QUFFaEQsTUFBTSxTQUFTLEdBQUcsR0FBd0MsRUFBRTtJQUMxRCxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDWixNQUFNLEdBQUcsb0JBQW9CLEVBQUUsQ0FBQztJQUNsQyxDQUFDO0lBQ0QsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQyxDQUFDO0FBRUYsTUFBTSxPQUFPLGFBQWE7SUFDeEIsS0FBSyxDQUFDLGVBQWUsQ0FBQyxLQUFpQixFQUFFLGVBQW9DO1FBQzNFLHNEQUFzRDtRQUN0RCxFQUFFO1FBQ0YscUZBQXFGO1FBQ3JGLE1BQU0sZUFBZSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUN4RSxFQUFFO1FBQ0Ysc0JBQXNCO1FBQ3RCLE1BQU0sV0FBVyxHQUFHLE1BQU0sZ0NBQWdDLENBQUMsTUFBTSxTQUFTLEVBQUUsRUFBRSxlQUFlLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRTtZQUN6RyxNQUFNLEtBQUssQ0FBQyxvQ0FBb0MsQ0FBQyxDQUFDO1FBQ3BELENBQUMsQ0FBQyxDQUFDO1FBRUgsT0FBTyxXQUFXLENBQUM7SUFDckIsQ0FBQztDQUNGIn0=
22
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWN2bV93YXNtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NpbXVsYXRvci9hY3ZtX3dhc20udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFHekUsT0FBTyxFQUVMLG9CQUFvQixFQUNwQixnQ0FBZ0MsR0FDakMsTUFBTSxvQkFBb0IsQ0FBQztBQUs1QixJQUFJLE1BQTJDLENBQUM7QUFFaEQsTUFBTSxTQUFTLEdBQUcsR0FBd0MsRUFBRTtJQUMxRCxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDWixNQUFNLEdBQUcsb0JBQW9CLEVBQUUsQ0FBQztJQUNsQyxDQUFDO0lBQ0QsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQyxDQUFDO0FBRUYsTUFBTSxPQUFPLGFBQWE7SUFDeEIsS0FBSyxDQUFDLGVBQWUsQ0FBQyxLQUFpQixFQUFFLGVBQW9DO1FBQzNFLHNEQUFzRDtRQUN0RCxFQUFFO1FBQ0YscUZBQXFGO1FBQ3JGLE1BQU0sZUFBZSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUN4RSxFQUFFO1FBQ0Ysc0JBQXNCO1FBQ3RCLE1BQU0sV0FBVyxHQUFHLE1BQU0sZ0NBQWdDLENBQ3hELE1BQU0sU0FBUyxFQUFFLEVBQ2pCLGVBQWUsRUFDZixLQUFLLEVBQ0wsa0JBQWtCLENBQ25CLENBQUM7UUFFRixPQUFPLFdBQVcsQ0FBQztJQUNyQixDQUFDO0NBQ0YifQ==
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aztec/simulator",
3
- "version": "0.33.0",
3
+ "version": "0.35.0",
4
4
  "type": "module",
5
5
  "exports": "./dest/index.js",
6
6
  "typedocOptions": {
@@ -37,10 +37,13 @@
37
37
  ]
38
38
  },
39
39
  "dependencies": {
40
- "@aztec/circuit-types": "0.33.0",
41
- "@aztec/circuits.js": "0.33.0",
42
- "@aztec/foundation": "0.33.0",
43
- "@aztec/types": "0.33.0",
40
+ "@aztec/circuit-types": "0.35.0",
41
+ "@aztec/circuits.js": "0.35.0",
42
+ "@aztec/foundation": "0.35.0",
43
+ "@aztec/noir-protocol-circuits-types": "0.35.0",
44
+ "@aztec/protocol-contracts": "0.35.0",
45
+ "@aztec/types": "0.35.0",
46
+ "@aztec/world-state": "0.35.0",
44
47
  "@noir-lang/acvm_js": "portal:../../noir/packages/acvm_js",
45
48
  "@noir-lang/types": "portal:../../noir/packages/types",
46
49
  "levelup": "^5.1.1",
package/src/acvm/acvm.ts CHANGED
@@ -7,7 +7,7 @@ import {
7
7
  type ForeignCallInput,
8
8
  type ForeignCallOutput,
9
9
  type WasmBlackBoxFunctionSolver,
10
- executeCircuitWithBlackBoxSolver,
10
+ executeCircuitWithReturnWitness,
11
11
  } from '@noir-lang/acvm_js';
12
12
 
13
13
  import { traverseCauseChain } from '../common/errors.js';
@@ -27,9 +27,12 @@ type ACIRCallback = Record<
27
27
  */
28
28
  export interface ACIRExecutionResult {
29
29
  /**
30
- * The partial witness of the execution.
30
+ * An execution result contains two witnesses.
31
+ * 1. The partial witness of the execution.
32
+ * 2. The return witness which contains the given public return values within the full witness.
31
33
  */
32
34
  partialWitness: ACVMWitness;
35
+ returnWitness: ACVMWitness;
33
36
  }
34
37
 
35
38
  /**
@@ -89,13 +92,13 @@ export async function acvm(
89
92
  ): Promise<ACIRExecutionResult> {
90
93
  const logger = createDebugLogger('aztec:simulator:acvm');
91
94
 
92
- const partialWitness = await executeCircuitWithBlackBoxSolver(
95
+ const solvedAndReturnWitness = await executeCircuitWithReturnWitness(
93
96
  solver,
94
97
  acir,
95
98
  initialWitness,
96
99
  async (name: string, args: ForeignCallInput[]) => {
97
100
  try {
98
- logger(`Oracle callback ${name}`);
101
+ logger.debug(`Oracle callback ${name}`);
99
102
  const oracleFunction = callback[name as ORACLE_NAMES];
100
103
  if (!oracleFunction) {
101
104
  throw new Error(`Oracle callback ${name} not found`);
@@ -127,7 +130,7 @@ export async function acvm(
127
130
  throw err;
128
131
  });
129
132
 
130
- return { partialWitness };
133
+ return { partialWitness: solvedAndReturnWitness.solvedWitness, returnWitness: solvedAndReturnWitness.returnWitness };
131
134
  }
132
135
 
133
136
  /**
@@ -1,7 +1,5 @@
1
1
  import { Fr } from '@aztec/foundation/fields';
2
2
 
3
- import { getReturnWitness } from '@noir-lang/acvm_js';
4
-
5
3
  import { type ACVMField, type ACVMWitness } from './acvm_types.js';
6
4
 
7
5
  /**
@@ -32,13 +30,11 @@ export function frToBoolean(fr: Fr): boolean {
32
30
  }
33
31
 
34
32
  /**
35
- * Extracts the return fields of a given partial witness.
36
- * @param acir - The bytecode of the function.
37
- * @param partialWitness - The witness to extract from.
33
+ * Transforms a witness map to its field elements.
34
+ * @param witness - The witness to extract from.
38
35
  * @returns The return values.
39
36
  */
40
- export function extractReturnWitness(acir: Buffer, partialWitness: ACVMWitness): Fr[] {
41
- const returnWitness = getReturnWitness(acir, partialWitness);
42
- const sortedKeys = [...returnWitness.keys()].sort((a, b) => a - b);
43
- return sortedKeys.map(key => returnWitness.get(key)!).map(fromACVMField);
37
+ export function witnessMapToFields(witness: ACVMWitness): Fr[] {
38
+ const sortedKeys = [...witness.keys()].sort((a, b) => a - b);
39
+ return sortedKeys.map(key => witness.get(key)!).map(fromACVMField);
44
40
  }
@@ -1,8 +1,7 @@
1
1
  import { MerkleTreeId, UnencryptedL2Log } from '@aztec/circuit-types';
2
- import { RETURN_VALUES_LENGTH, acvmFieldMessageToString, oracleDebugCallToFormattedStr } from '@aztec/circuits.js';
2
+ import { acvmFieldMessageToString, oracleDebugCallToFormattedStr } from '@aztec/circuits.js';
3
3
  import { EventSelector, FunctionSelector } from '@aztec/foundation/abi';
4
4
  import { AztecAddress } from '@aztec/foundation/aztec-address';
5
- import { padArrayEnd } from '@aztec/foundation/collection';
6
5
  import { Fr, Point } from '@aztec/foundation/fields';
7
6
  import { createDebugLogger } from '@aztec/foundation/log';
8
7
 
@@ -27,6 +26,17 @@ export class Oracle {
27
26
  return toACVMField(packed);
28
27
  }
29
28
 
29
+ // Since the argument is a slice, noir automatically adds a length field to oracle call.
30
+ async packReturns(_length: ACVMField[], values: ACVMField[]): Promise<ACVMField> {
31
+ const packed = await this.typedOracle.packReturns(values.map(fromACVMField));
32
+ return toACVMField(packed);
33
+ }
34
+
35
+ async unpackReturns([returnsHash]: ACVMField[]): Promise<ACVMField[]> {
36
+ const unpacked = await this.typedOracle.unpackReturns(fromACVMField(returnsHash));
37
+ return unpacked.map(toACVMField);
38
+ }
39
+
30
40
  async getNullifierKeyPair([accountAddress]: ACVMField[]): Promise<ACVMField[]> {
31
41
  const { publicKey, secretKey } = await this.typedOracle.getNullifierKeyPair(fromACVMField(accountAddress));
32
42
  return [
@@ -304,12 +314,12 @@ export class Oracle {
304
314
  }
305
315
 
306
316
  debugLog(...args: ACVMField[][]): ACVMField {
307
- this.log(oracleDebugCallToFormattedStr(args));
317
+ this.log.verbose(oracleDebugCallToFormattedStr(args));
308
318
  return toACVMField(0);
309
319
  }
310
320
 
311
321
  debugLogWithPrefix(arg0: ACVMField[], ...args: ACVMField[][]): ACVMField {
312
- this.log(`${acvmFieldMessageToString(arg0)}: ${oracleDebugCallToFormattedStr(args)}`);
322
+ this.log.verbose(`${acvmFieldMessageToString(arg0)}: ${oracleDebugCallToFormattedStr(args)}`);
313
323
  return toACVMField(0);
314
324
  }
315
325
 
@@ -348,7 +358,7 @@ export class Oracle {
348
358
  frToBoolean(fromACVMField(isStaticCall)),
349
359
  frToBoolean(fromACVMField(isDelegateCall)),
350
360
  );
351
- return padArrayEnd(returnValues, Fr.ZERO, RETURN_VALUES_LENGTH).map(toACVMField);
361
+ return returnValues.map(toACVMField);
352
362
  }
353
363
 
354
364
  async enqueuePublicFunctionCall(