@aztec/simulator 0.87.7 → 1.0.0-nightly.20250605

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 (105) hide show
  1. package/dest/public/avm/avm_gas.d.ts +4 -5
  2. package/dest/public/avm/avm_gas.d.ts.map +1 -1
  3. package/dest/public/avm/avm_gas.js +29 -19
  4. package/dest/public/avm/fixtures/utils.js +1 -1
  5. package/dest/public/avm/opcodes/accrued_substate.d.ts.map +1 -1
  6. package/dest/public/avm/opcodes/accrued_substate.js +8 -7
  7. package/dest/public/avm/opcodes/addressing_mode.d.ts +2 -0
  8. package/dest/public/avm/opcodes/addressing_mode.d.ts.map +1 -1
  9. package/dest/public/avm/opcodes/addressing_mode.js +6 -0
  10. package/dest/public/avm/opcodes/arithmetic.d.ts.map +1 -1
  11. package/dest/public/avm/opcodes/arithmetic.js +1 -1
  12. package/dest/public/avm/opcodes/bitwise.d.ts +5 -1
  13. package/dest/public/avm/opcodes/bitwise.d.ts.map +1 -1
  14. package/dest/public/avm/opcodes/bitwise.js +17 -2
  15. package/dest/public/avm/opcodes/comparators.d.ts.map +1 -1
  16. package/dest/public/avm/opcodes/comparators.js +1 -1
  17. package/dest/public/avm/opcodes/contract.d.ts.map +1 -1
  18. package/dest/public/avm/opcodes/contract.js +1 -1
  19. package/dest/public/avm/opcodes/control_flow.d.ts.map +1 -1
  20. package/dest/public/avm/opcodes/control_flow.js +4 -4
  21. package/dest/public/avm/opcodes/conversion.d.ts +1 -0
  22. package/dest/public/avm/opcodes/conversion.d.ts.map +1 -1
  23. package/dest/public/avm/opcodes/conversion.js +263 -2
  24. package/dest/public/avm/opcodes/ec_add.d.ts.map +1 -1
  25. package/dest/public/avm/opcodes/ec_add.js +1 -1
  26. package/dest/public/avm/opcodes/environment_getters.d.ts.map +1 -1
  27. package/dest/public/avm/opcodes/environment_getters.js +1 -1
  28. package/dest/public/avm/opcodes/external_calls.d.ts.map +1 -1
  29. package/dest/public/avm/opcodes/external_calls.js +6 -8
  30. package/dest/public/avm/opcodes/hashing.d.ts.map +1 -1
  31. package/dest/public/avm/opcodes/hashing.js +3 -3
  32. package/dest/public/avm/opcodes/instruction.d.ts +9 -3
  33. package/dest/public/avm/opcodes/instruction.d.ts.map +1 -1
  34. package/dest/public/avm/opcodes/instruction.js +12 -7
  35. package/dest/public/avm/opcodes/memory.d.ts.map +1 -1
  36. package/dest/public/avm/opcodes/memory.js +8 -6
  37. package/dest/public/avm/opcodes/misc.js +1 -3
  38. package/dest/public/avm/opcodes/storage.d.ts.map +1 -1
  39. package/dest/public/avm/opcodes/storage.js +5 -3
  40. package/dest/public/fixtures/index.d.ts +1 -0
  41. package/dest/public/fixtures/index.d.ts.map +1 -1
  42. package/dest/public/fixtures/index.js +1 -0
  43. package/dest/public/fixtures/minimal_public_tx.d.ts +9 -0
  44. package/dest/public/fixtures/minimal_public_tx.d.ts.map +1 -0
  45. package/dest/public/fixtures/minimal_public_tx.js +43 -0
  46. package/dest/public/fixtures/utils.js +3 -3
  47. package/dest/public/hinting_db_sources.d.ts +3 -0
  48. package/dest/public/hinting_db_sources.d.ts.map +1 -1
  49. package/dest/public/hinting_db_sources.js +9 -0
  50. package/dest/public/index.d.ts +2 -1
  51. package/dest/public/index.d.ts.map +1 -1
  52. package/dest/public/index.js +2 -1
  53. package/dest/public/public_db_sources.d.ts.map +1 -1
  54. package/dest/public/public_db_sources.js +2 -2
  55. package/dest/public/public_processor/guarded_merkle_tree.d.ts +44 -0
  56. package/dest/public/public_processor/guarded_merkle_tree.d.ts.map +1 -0
  57. package/dest/public/public_processor/guarded_merkle_tree.js +105 -0
  58. package/dest/public/public_processor/public_processor.d.ts +6 -16
  59. package/dest/public/public_processor/public_processor.d.ts.map +1 -1
  60. package/dest/public/public_processor/public_processor.js +32 -16
  61. package/dest/public/public_tx_simulator/public_tx_context.d.ts +3 -1
  62. package/dest/public/public_tx_simulator/public_tx_context.d.ts.map +1 -1
  63. package/dest/public/public_tx_simulator/public_tx_context.js +18 -15
  64. package/dest/public/public_tx_simulator/public_tx_simulator.d.ts.map +1 -1
  65. package/dest/public/public_tx_simulator/public_tx_simulator.js +0 -3
  66. package/dest/public/side_effect_trace.d.ts +4 -1
  67. package/dest/public/side_effect_trace.d.ts.map +1 -1
  68. package/dest/public/side_effect_trace.js +13 -2
  69. package/dest/public/side_effect_trace_interface.d.ts +1 -0
  70. package/dest/public/side_effect_trace_interface.d.ts.map +1 -1
  71. package/dest/public/state_manager/state_manager.d.ts +1 -0
  72. package/dest/public/state_manager/state_manager.d.ts.map +1 -1
  73. package/dest/public/state_manager/state_manager.js +3 -0
  74. package/package.json +15 -15
  75. package/src/public/avm/avm_gas.ts +21 -15
  76. package/src/public/avm/fixtures/utils.ts +1 -1
  77. package/src/public/avm/opcodes/accrued_substate.ts +23 -7
  78. package/src/public/avm/opcodes/addressing_mode.ts +8 -0
  79. package/src/public/avm/opcodes/arithmetic.ts +3 -1
  80. package/src/public/avm/opcodes/bitwise.ts +26 -2
  81. package/src/public/avm/opcodes/comparators.ts +3 -1
  82. package/src/public/avm/opcodes/contract.ts +3 -1
  83. package/src/public/avm/opcodes/control_flow.ts +6 -4
  84. package/src/public/avm/opcodes/conversion.ts +21 -2
  85. package/src/public/avm/opcodes/ec_add.ts +3 -1
  86. package/src/public/avm/opcodes/environment_getters.ts +3 -1
  87. package/src/public/avm/opcodes/external_calls.ts +16 -8
  88. package/src/public/avm/opcodes/hashing.ts +11 -3
  89. package/src/public/avm/opcodes/instruction.ts +14 -7
  90. package/src/public/avm/opcodes/memory.ts +23 -6
  91. package/src/public/avm/opcodes/misc.ts +4 -4
  92. package/src/public/avm/opcodes/storage.ts +13 -3
  93. package/src/public/fixtures/index.ts +1 -0
  94. package/src/public/fixtures/minimal_public_tx.ts +57 -0
  95. package/src/public/fixtures/utils.ts +3 -3
  96. package/src/public/hinting_db_sources.ts +15 -0
  97. package/src/public/index.ts +2 -1
  98. package/src/public/public_db_sources.ts +3 -13
  99. package/src/public/public_processor/guarded_merkle_tree.ts +148 -0
  100. package/src/public/public_processor/public_processor.ts +47 -34
  101. package/src/public/public_tx_simulator/public_tx_context.ts +39 -20
  102. package/src/public/public_tx_simulator/public_tx_simulator.ts +0 -3
  103. package/src/public/side_effect_trace.ts +13 -0
  104. package/src/public/side_effect_trace_interface.ts +1 -0
  105. package/src/public/state_manager/state_manager.ts +4 -0
@@ -1,11 +1,11 @@
1
- import { MAX_ENQUEUED_CALLS_PER_TX, MAX_L2_GAS_PER_TX_PUBLIC_PORTION, MAX_L2_TO_L1_MSGS_PER_TX, MAX_NOTE_HASHES_PER_TX, MAX_NULLIFIERS_PER_TX, MAX_PUBLIC_LOGS_PER_TX, MAX_TOTAL_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX } from '@aztec/constants';
1
+ import { MAX_ENQUEUED_CALLS_PER_TX, MAX_L2_TO_L1_MSGS_PER_TX, MAX_NOTE_HASHES_PER_TX, MAX_NULLIFIERS_PER_TX, MAX_PUBLIC_LOGS_PER_TX, MAX_TOTAL_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX } from '@aztec/constants';
2
2
  import { padArrayEnd } from '@aztec/foundation/collection';
3
3
  import { Fr } from '@aztec/foundation/fields';
4
4
  import { createLogger } from '@aztec/foundation/log';
5
- import { AvmAccumulatedData, AvmCircuitPublicInputs, PublicDataWrite, RevertCode } from '@aztec/stdlib/avm';
6
- import { computeTransactionFee } from '@aztec/stdlib/fees';
5
+ import { AvmAccumulatedData, AvmAccumulatedDataArrayLengths, AvmCircuitPublicInputs, PublicDataWrite, RevertCode, clampGasSettingsForAVM } from '@aztec/stdlib/avm';
6
+ import { computeEffectiveGasFees, computeTransactionFee } from '@aztec/stdlib/fees';
7
7
  import { Gas } from '@aztec/stdlib/gas';
8
- import { PrivateToAvmAccumulatedData, PrivateToAvmAccumulatedDataArrayLengths, PublicCallRequest, countAccumulatedItems } from '@aztec/stdlib/kernel';
8
+ import { PrivateToAvmAccumulatedData, PrivateToAvmAccumulatedDataArrayLengths, PublicCallRequest, PublicCallRequestArrayLengths, countAccumulatedItems } from '@aztec/stdlib/kernel';
9
9
  import { PublicLog } from '@aztec/stdlib/logs';
10
10
  import { ScopedL2ToL1Message } from '@aztec/stdlib/messaging';
11
11
  import { MerkleTreeId } from '@aztec/stdlib/trees';
@@ -23,8 +23,10 @@ import { getCallRequestsWithCalldataByPhase } from '../utils.js';
23
23
  startTreeSnapshots;
24
24
  globalVariables;
25
25
  gasSettings;
26
+ clampedGasSettings;
26
27
  gasUsedByPrivate;
27
28
  gasAllocatedToPublic;
29
+ gasAllocatedToPublicTeardown;
28
30
  setupCallRequests;
29
31
  appLogicCallRequests;
30
32
  teardownCallRequests;
@@ -38,14 +40,16 @@ import { getCallRequestsWithCalldataByPhase } from '../utils.js';
38
40
  /* Entire transaction execution is done. */ halted;
39
41
  /* Where did reverts happen (if at all)? */ revertCode;
40
42
  /* What caused a revert (if one occurred)? */ revertReason;
41
- constructor(txHash, state, startTreeSnapshots, globalVariables, gasSettings, gasUsedByPrivate, gasAllocatedToPublic, setupCallRequests, appLogicCallRequests, teardownCallRequests, nonRevertibleAccumulatedDataFromPrivate, revertibleAccumulatedDataFromPrivate, feePayer, trace){
43
+ constructor(txHash, state, startTreeSnapshots, globalVariables, gasSettings, clampedGasSettings, gasUsedByPrivate, gasAllocatedToPublic, gasAllocatedToPublicTeardown, setupCallRequests, appLogicCallRequests, teardownCallRequests, nonRevertibleAccumulatedDataFromPrivate, revertibleAccumulatedDataFromPrivate, feePayer, trace){
42
44
  this.txHash = txHash;
43
45
  this.state = state;
44
46
  this.startTreeSnapshots = startTreeSnapshots;
45
47
  this.globalVariables = globalVariables;
46
48
  this.gasSettings = gasSettings;
49
+ this.clampedGasSettings = clampedGasSettings;
47
50
  this.gasUsedByPrivate = gasUsedByPrivate;
48
51
  this.gasAllocatedToPublic = gasAllocatedToPublic;
52
+ this.gasAllocatedToPublicTeardown = gasAllocatedToPublicTeardown;
49
53
  this.setupCallRequests = setupCallRequests;
50
54
  this.appLogicCallRequests = appLogicCallRequests;
51
55
  this.teardownCallRequests = teardownCallRequests;
@@ -68,8 +72,10 @@ import { getCallRequestsWithCalldataByPhase } from '../utils.js';
68
72
  const gasSettings = tx.data.constants.txContext.gasSettings;
69
73
  const gasUsedByPrivate = tx.data.gasUsed;
70
74
  // Gas allocated to public is "whatever's left" after private, but with some max applied.
71
- const gasAllocatedToPublic = applyMaxToAvailableGas(gasSettings.gasLimits.sub(gasUsedByPrivate));
72
- return new PublicTxContext(await tx.getTxHash(), new PhaseStateManager(txStateManager), await txStateManager.getTreeSnapshots(), globalVariables, gasSettings, gasUsedByPrivate, gasAllocatedToPublic, getCallRequestsWithCalldataByPhase(tx, TxExecutionPhase.SETUP), getCallRequestsWithCalldataByPhase(tx, TxExecutionPhase.APP_LOGIC), getCallRequestsWithCalldataByPhase(tx, TxExecutionPhase.TEARDOWN), tx.data.forPublic.nonRevertibleAccumulatedData, tx.data.forPublic.revertibleAccumulatedData, tx.data.feePayer, trace);
75
+ const clampedGasSettings = clampGasSettingsForAVM(gasSettings, gasUsedByPrivate);
76
+ const gasAllocatedToPublic = clampedGasSettings.gasLimits.sub(gasUsedByPrivate);
77
+ const gasAllocatedToPublicTeardown = clampedGasSettings.teardownGasLimits;
78
+ return new PublicTxContext(await tx.getTxHash(), new PhaseStateManager(txStateManager), await txStateManager.getTreeSnapshots(), globalVariables, gasSettings, clampedGasSettings, gasUsedByPrivate, gasAllocatedToPublic, gasAllocatedToPublicTeardown, getCallRequestsWithCalldataByPhase(tx, TxExecutionPhase.SETUP), getCallRequestsWithCalldataByPhase(tx, TxExecutionPhase.APP_LOGIC), getCallRequestsWithCalldataByPhase(tx, TxExecutionPhase.TEARDOWN), tx.data.forPublic.nonRevertibleAccumulatedData, tx.data.forPublic.revertibleAccumulatedData, tx.data.feePayer, trace);
73
79
  }
74
80
  /**
75
81
  * Signal that the entire transaction execution is done.
@@ -144,7 +150,8 @@ import { getCallRequestsWithCalldataByPhase } from '../utils.js';
144
150
  * How much gas is left as of the specified phase?
145
151
  */ getGasLeftAtPhase(phase) {
146
152
  if (phase === TxExecutionPhase.TEARDOWN) {
147
- return applyMaxToAvailableGas(this.gasSettings.teardownGasLimits);
153
+ const gasLeftForPublicTeardown = this.gasAllocatedToPublicTeardown.sub(this.teardownGasUsed);
154
+ return gasLeftForPublicTeardown;
148
155
  } else {
149
156
  const gasLeftForPublic = this.gasAllocatedToPublic.sub(this.gasUsedByPublic);
150
157
  return gasLeftForPublic;
@@ -241,8 +248,9 @@ import { getCallRequestsWithCalldataByPhase } from '../utils.js';
241
248
  const endTreeSnapshots = await stateManager.getTreeSnapshots();
242
249
  // This converts the private accumulated data to the avm accumulated data format.
243
250
  const convertAccumulatedData = (from)=>new PrivateToAvmAccumulatedData(from.noteHashes, from.nullifiers, from.l2ToL1Msgs);
244
- const getArrayLengths = (from)=>new PrivateToAvmAccumulatedDataArrayLengths(countAccumulatedItems(from.noteHashes), countAccumulatedItems(from.nullifiers), countAccumulatedItems(from.l2ToL1Msgs));
245
- return new AvmCircuitPublicInputs(this.globalVariables, this.startTreeSnapshots, /*startGasUsed=*/ this.gasUsedByPrivate, this.gasSettings, this.feePayer, /*publicSetupCallRequests=*/ padArrayEnd(this.setupCallRequests.map((r)=>r.request), PublicCallRequest.empty(), MAX_ENQUEUED_CALLS_PER_TX), /*publicAppLogicCallRequests=*/ padArrayEnd(this.appLogicCallRequests.map((r)=>r.request), PublicCallRequest.empty(), MAX_ENQUEUED_CALLS_PER_TX), /*publicTeardownCallRequests=*/ this.teardownCallRequests.length > 0 ? this.teardownCallRequests[0].request : PublicCallRequest.empty(), getArrayLengths(this.nonRevertibleAccumulatedDataFromPrivate), getArrayLengths(this.revertibleAccumulatedDataFromPrivate), convertAccumulatedData(this.nonRevertibleAccumulatedDataFromPrivate), convertAccumulatedData(this.revertibleAccumulatedDataFromPrivate), endTreeSnapshots, this.getTotalGasUsed(), accumulatedData, /*transactionFee=*/ this.getTransactionFeeUnsafe(), /*isReverted=*/ !this.revertCode.isOK());
251
+ const getPreviousAccumulatedDataArrayLengths = (from)=>new PrivateToAvmAccumulatedDataArrayLengths(countAccumulatedItems(from.noteHashes), countAccumulatedItems(from.nullifiers), countAccumulatedItems(from.l2ToL1Msgs));
252
+ const getAvmAccumulatedDataArrayLengths = (from)=>new AvmAccumulatedDataArrayLengths(from.noteHashes.length, from.nullifiers.length, from.l2ToL1Msgs.length, from.publicLogs.length, from.publicDataWrites.length);
253
+ return new AvmCircuitPublicInputs(this.globalVariables, this.startTreeSnapshots, /*startGasUsed=*/ this.gasUsedByPrivate, this.clampedGasSettings, computeEffectiveGasFees(this.globalVariables.gasFees, this.gasSettings), this.feePayer, /*publicCallRequestArrayLengths=*/ new PublicCallRequestArrayLengths(this.setupCallRequests.length, this.appLogicCallRequests.length, this.teardownCallRequests.length > 0), /*publicSetupCallRequests=*/ padArrayEnd(this.setupCallRequests.map((r)=>r.request), PublicCallRequest.empty(), MAX_ENQUEUED_CALLS_PER_TX), /*publicAppLogicCallRequests=*/ padArrayEnd(this.appLogicCallRequests.map((r)=>r.request), PublicCallRequest.empty(), MAX_ENQUEUED_CALLS_PER_TX), /*publicTeardownCallRequests=*/ this.teardownCallRequests.length > 0 ? this.teardownCallRequests[0].request : PublicCallRequest.empty(), getPreviousAccumulatedDataArrayLengths(this.nonRevertibleAccumulatedDataFromPrivate), getPreviousAccumulatedDataArrayLengths(this.revertibleAccumulatedDataFromPrivate), convertAccumulatedData(this.nonRevertibleAccumulatedDataFromPrivate), convertAccumulatedData(this.revertibleAccumulatedDataFromPrivate), endTreeSnapshots, this.getTotalGasUsed(), getAvmAccumulatedDataArrayLengths(accumulatedData), accumulatedData, /*transactionFee=*/ this.getTransactionFeeUnsafe(), /*isReverted=*/ !this.revertCode.isOK());
246
254
  }
247
255
  }
248
256
  /**
@@ -288,8 +296,3 @@ import { getCallRequestsWithCalldataByPhase } from '../utils.js';
288
296
  this.currentlyActiveStateManager = undefined;
289
297
  }
290
298
  }
291
- /**
292
- * Apply L2 gas maximum.
293
- */ function applyMaxToAvailableGas(availableGas) {
294
- return new Gas(/*daGas=*/ availableGas.daGas, /*l2Gas=*/ Math.min(availableGas.l2Gas, MAX_L2_GAS_PER_TX_PUBLIC_PORTION));
295
- }
@@ -1 +1 @@
1
- {"version":3,"file":"public_tx_simulator.d.ts","sourceRoot":"","sources":["../../../src/public/public_tx_simulator/public_tx_simulator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"public_tx_simulator.d.ts","sourceRoot":"","sources":["../../../src/public/public_tx_simulator/public_tx_simulator.ts"],"names":[],"mappings":"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"}
@@ -70,9 +70,6 @@ export class PublicTxSimulator {
70
70
  const publicInputs = await context.generateAvmCircuitPublicInputs();
71
71
  const avmProvingRequest = PublicTxSimulator.generateProvingRequest(publicInputs, hints);
72
72
  const revertCode = context.getFinalRevertCode();
73
- if (!revertCode.isOK()) {
74
- await tx.filterRevertedLogs();
75
- }
76
73
  // Commit contracts from this TX to the block-level cache and clear tx cache
77
74
  // If the tx reverted, only commit non-revertible contracts
78
75
  // NOTE: You can't create contracts in public, so this is only relevant for private-created contracts
@@ -40,6 +40,7 @@ export declare class SideEffectTrace implements PublicSideEffectTraceInterface {
40
40
  private readonly previousSideEffectArrayLengths;
41
41
  /** We need to track the set of class IDs used, to enforce limits. */
42
42
  private uniqueClassIds;
43
+ private writtenPublicDataSlots;
43
44
  log: import("@aztec/foundation/log").Logger;
44
45
  /** The side effect counter increments with every call to the trace. */
45
46
  private sideEffectCounter;
@@ -60,13 +61,15 @@ export declare class SideEffectTrace implements PublicSideEffectTraceInterface {
60
61
  */
61
62
  previousSideEffectArrayLengths?: SideEffectArrayLengths,
62
63
  /** We need to track the set of class IDs used, to enforce limits. */
63
- uniqueClassIds?: UniqueClassIds);
64
+ uniqueClassIds?: UniqueClassIds, writtenPublicDataSlots?: Set<string>);
64
65
  fork(): SideEffectTrace;
65
66
  merge(forkedTrace: this, reverted?: boolean): void;
66
67
  getCounter(): number;
67
68
  private incrementSideEffectCounter;
68
69
  getNoteHashCount(): number;
69
70
  tracePublicStorageWrite(contractAddress: AztecAddress, slot: Fr, value: Fr, protocolWrite: boolean): Promise<void>;
71
+ private computePublicDataSlotKey;
72
+ isStorageCold(contractAddress: AztecAddress, slot: Fr): boolean;
70
73
  traceNewNoteHash(noteHash: Fr): void;
71
74
  traceNewNullifier(siloedNullifier: Fr): void;
72
75
  traceNewL2ToL1Message(contractAddress: AztecAddress, recipient: Fr, content: Fr): void;
@@ -1 +1 @@
1
- {"version":3,"file":"side_effect_trace.d.ts","sourceRoot":"","sources":["../../src/public/side_effect_trace.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,EAAE,EAAE,MAAM,0BAA0B,CAAC;AAE9C,OAAO,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAEhE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAiB,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAK7E,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,kCAAkC,CAAC;AACvF,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEvD;;;;IAII;AACJ,MAAM,MAAM,WAAW,GAAG;IACxB,gBAAgB,EAAE,uBAAuB,EAAE,CAAC;IAC5C,UAAU,EAAE,QAAQ,EAAE,CAAC;IACvB,UAAU,EAAE,SAAS,EAAE,CAAC;IACxB,UAAU,EAAE,mBAAmB,EAAE,CAAC;IAClC,UAAU,EAAE,SAAS,EAAE,CAAC;CACzB,CAAC;AAEF,qBAAa,sBAAsB;aAEf,gBAAgB,EAAE,MAAM;aACxB,wBAAwB,EAAE,MAAM;aAChC,UAAU,EAAE,MAAM;aAClB,UAAU,EAAE,MAAM;aAClB,UAAU,EAAE,MAAM;aAClB,UAAU,EAAE,MAAM;gBALlB,gBAAgB,EAAE,MAAM,EACxB,wBAAwB,EAAE,MAAM,EAChC,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM;IAGpC,MAAM,CAAC,KAAK;CAGb;AAED;;GAEG;AACH,qBAAa,eAAgB,YAAW,8BAA8B;IAkBlE,qDAAqD;aACrC,sBAAsB,EAAE,MAAM;IAC9C;;OAEG;IACH,OAAO,CAAC,QAAQ,CAAC,8BAA8B;IAC/C,qEAAqE;IACrE,OAAO,CAAC,cAAc;IAxBjB,GAAG,yCAA+C;IAEzD,uEAAuE;IACvE,OAAO,CAAC,iBAAiB,CAAS;IAElC,OAAO,CAAC,gBAAgB,CAAiC;IACzD,OAAO,CAAC,8BAA8B,CAAa;IACnD,OAAO,CAAC,0BAA0B,CAAa;IAC/C,OAAO,CAAC,UAAU,CAAkB;IACpC,OAAO,CAAC,UAAU,CAAmB;IACrC,OAAO,CAAC,cAAc,CAA6B;IACnD,OAAO,CAAC,UAAU,CAAmB;IAErC,sDAAsD;IACtD,OAAO,CAAC,uBAAuB,CAAS;;IAGtC,qDAAqD;IACrC,sBAAsB,GAAE,MAAU;IAClD;;OAEG;IACc,8BAA8B,GAAE,sBAAuD;IACxG,qEAAqE;IAC7D,cAAc,GAAE,cAAqC;IAKxD,IAAI;IAeJ,KAAK,CAAC,WAAW,EAAE,IAAI,EAAE,QAAQ,GAAE,OAAe;IAoBlD,UAAU;IAIjB,OAAO,CAAC,0BAA0B;IAI3B,gBAAgB;IAIV,uBAAuB,CAClC,eAAe,EAAE,YAAY,EAC7B,IAAI,EAAE,EAAE,EACR,KAAK,EAAE,EAAE,EACT,aAAa,EAAE,OAAO,GACrB,OAAO,CAAC,IAAI,CAAC;IAkCT,gBAAgB,CAAC,QAAQ,EAAE,EAAE;IAU7B,iBAAiB,CAAC,eAAe,EAAE,EAAE;IAWrC,qBAAqB,CAAC,eAAe,EAAE,YAAY,EAAE,SAAS,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE;IAW/E,cAAc,CAAC,eAAe,EAAE,YAAY,EAAE,GAAG,EAAE,EAAE,EAAE;IAcvD,qBAAqB,CAAC,eAAe,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO;IAgB1D,cAAc,IAAI,WAAW;CASrC"}
1
+ {"version":3,"file":"side_effect_trace.d.ts","sourceRoot":"","sources":["../../src/public/side_effect_trace.ts"],"names":[],"mappings":"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"}
@@ -36,6 +36,7 @@ export class SideEffectArrayLengths {
36
36
  startSideEffectCounter;
37
37
  previousSideEffectArrayLengths;
38
38
  uniqueClassIds;
39
+ writtenPublicDataSlots;
39
40
  log;
40
41
  /** The side effect counter increments with every call to the trace. */ sideEffectCounter;
41
42
  publicDataWrites;
@@ -48,10 +49,11 @@ export class SideEffectArrayLengths {
48
49
  /** Make sure a forked trace is never merged twice. */ alreadyMergedIntoParent;
49
50
  constructor(/** The counter of this trace's first side effect. */ startSideEffectCounter = 0, /** Track parent's (or previous kernel's) lengths so the AVM can properly enforce TX-wide limits,
50
51
  * otherwise the public kernel can fail to prove because TX limits are breached.
51
- */ previousSideEffectArrayLengths = SideEffectArrayLengths.empty(), /** We need to track the set of class IDs used, to enforce limits. */ uniqueClassIds = new UniqueClassIds()){
52
+ */ previousSideEffectArrayLengths = SideEffectArrayLengths.empty(), /** We need to track the set of class IDs used, to enforce limits. */ uniqueClassIds = new UniqueClassIds(), writtenPublicDataSlots = new Set()){
52
53
  this.startSideEffectCounter = startSideEffectCounter;
53
54
  this.previousSideEffectArrayLengths = previousSideEffectArrayLengths;
54
55
  this.uniqueClassIds = uniqueClassIds;
56
+ this.writtenPublicDataSlots = writtenPublicDataSlots;
55
57
  this.log = createLogger('simulator:side_effect_trace');
56
58
  this.publicDataWrites = [];
57
59
  this.protocolPublicDataWritesLength = 0;
@@ -64,7 +66,7 @@ export class SideEffectArrayLengths {
64
66
  this.sideEffectCounter = startSideEffectCounter;
65
67
  }
66
68
  fork() {
67
- return new SideEffectTrace(this.sideEffectCounter, new SideEffectArrayLengths(this.previousSideEffectArrayLengths.publicDataWrites + this.userPublicDataWritesLength, this.previousSideEffectArrayLengths.protocolPublicDataWrites + this.protocolPublicDataWritesLength, this.previousSideEffectArrayLengths.noteHashes + this.noteHashes.length, this.previousSideEffectArrayLengths.nullifiers + this.nullifiers.length, this.previousSideEffectArrayLengths.l2ToL1Msgs + this.l2ToL1Messages.length, this.previousSideEffectArrayLengths.publicLogs + this.publicLogs.length), this.uniqueClassIds.fork());
69
+ return new SideEffectTrace(this.sideEffectCounter, new SideEffectArrayLengths(this.previousSideEffectArrayLengths.publicDataWrites + this.userPublicDataWritesLength, this.previousSideEffectArrayLengths.protocolPublicDataWrites + this.protocolPublicDataWritesLength, this.previousSideEffectArrayLengths.noteHashes + this.noteHashes.length, this.previousSideEffectArrayLengths.nullifiers + this.nullifiers.length, this.previousSideEffectArrayLengths.l2ToL1Msgs + this.l2ToL1Messages.length, this.previousSideEffectArrayLengths.publicLogs + this.publicLogs.length), this.uniqueClassIds.fork(), new Set(this.writtenPublicDataSlots));
68
70
  }
69
71
  merge(forkedTrace, reverted = false) {
70
72
  // sanity check to avoid merging the same forked trace twice
@@ -72,6 +74,8 @@ export class SideEffectArrayLengths {
72
74
  forkedTrace.alreadyMergedIntoParent = true;
73
75
  this.sideEffectCounter = forkedTrace.sideEffectCounter;
74
76
  this.uniqueClassIds.acceptAndMerge(forkedTrace.uniqueClassIds);
77
+ // Accept even if reverted, since the user already paid for the writes
78
+ this.writtenPublicDataSlots = new Set(forkedTrace.writtenPublicDataSlots);
75
79
  if (!reverted) {
76
80
  this.publicDataWrites.push(...forkedTrace.publicDataWrites);
77
81
  this.noteHashes.push(...forkedTrace.noteHashes);
@@ -105,6 +109,13 @@ export class SideEffectArrayLengths {
105
109
  this.publicDataWrites.push(new PublicDataUpdateRequest(leafSlot, value, this.sideEffectCounter));
106
110
  this.log.trace(`Traced public data write (address=${contractAddress}, slot=${slot}): value=${value} (counter=${this.sideEffectCounter}, isProtocol:${protocolWrite})`);
107
111
  this.incrementSideEffectCounter();
112
+ this.writtenPublicDataSlots.add(this.computePublicDataSlotKey(contractAddress, slot));
113
+ }
114
+ computePublicDataSlotKey(contractAddress, slot) {
115
+ return `${contractAddress.toString()}:${slot.toString()}`;
116
+ }
117
+ isStorageCold(contractAddress, slot) {
118
+ return !this.writtenPublicDataSlots.has(this.computePublicDataSlotKey(contractAddress, slot));
108
119
  }
109
120
  traceNewNoteHash(noteHash) {
110
121
  if (this.noteHashes.length + this.previousSideEffectArrayLengths.noteHashes >= MAX_NOTE_HASHES_PER_TX) {
@@ -6,6 +6,7 @@ export interface PublicSideEffectTraceInterface {
6
6
  getCounter(): number;
7
7
  tracePublicStorageWrite(contractAddress: AztecAddress, slot: Fr, // This is the storage slot not the computed leaf slot
8
8
  value: Fr, protocolWrite: boolean): Promise<void>;
9
+ isStorageCold(contractAddress: AztecAddress, slot: Fr): boolean;
9
10
  traceNewNoteHash(uniqueNoteHash: Fr): void;
10
11
  getNoteHashCount(): number;
11
12
  traceNewNullifier(siloedNullifier: Fr): void;
@@ -1 +1 @@
1
- {"version":3,"file":"side_effect_trace_interface.d.ts","sourceRoot":"","sources":["../../src/public/side_effect_trace_interface.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,0BAA0B,CAAC;AACnD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAEhE,MAAM,WAAW,8BAA8B;IAC7C,IAAI,IAAI,8BAA8B,CAAC;IACvC,KAAK,CAAC,WAAW,EAAE,8BAA8B,EAAE,QAAQ,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IAC7E,UAAU,IAAI,MAAM,CAAC;IAErB,uBAAuB,CACrB,eAAe,EAAE,YAAY,EAC7B,IAAI,EAAE,EAAE,EAAE,sDAAsD;IAChE,KAAK,EAAE,EAAE,EACT,aAAa,EAAE,OAAO,GACrB,OAAO,CAAC,IAAI,CAAC,CAAC;IACjB,gBAAgB,CAAC,cAAc,EAAE,EAAE,GAAG,IAAI,CAAC;IAC3C,gBAAgB,IAAI,MAAM,CAAC;IAC3B,iBAAiB,CAAC,eAAe,EAAE,EAAE,GAAG,IAAI,CAAC;IAC7C,qBAAqB,CAAC,eAAe,EAAE,YAAY,EAAE,SAAS,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,GAAG,IAAI,CAAC;IACvF,cAAc,CAAC,eAAe,EAAE,YAAY,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,IAAI,CAAC;IAC/D,qBAAqB,CAAC,eAAe,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,GAAG,IAAI,CAAC;CACnE"}
1
+ {"version":3,"file":"side_effect_trace_interface.d.ts","sourceRoot":"","sources":["../../src/public/side_effect_trace_interface.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,0BAA0B,CAAC;AACnD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAEhE,MAAM,WAAW,8BAA8B;IAC7C,IAAI,IAAI,8BAA8B,CAAC;IACvC,KAAK,CAAC,WAAW,EAAE,8BAA8B,EAAE,QAAQ,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IAC7E,UAAU,IAAI,MAAM,CAAC;IAErB,uBAAuB,CACrB,eAAe,EAAE,YAAY,EAC7B,IAAI,EAAE,EAAE,EAAE,sDAAsD;IAChE,KAAK,EAAE,EAAE,EACT,aAAa,EAAE,OAAO,GACrB,OAAO,CAAC,IAAI,CAAC,CAAC;IACjB,aAAa,CAAC,eAAe,EAAE,YAAY,EAAE,IAAI,EAAE,EAAE,GAAG,OAAO,CAAC;IAChE,gBAAgB,CAAC,cAAc,EAAE,EAAE,GAAG,IAAI,CAAC;IAC3C,gBAAgB,IAAI,MAAM,CAAC;IAC3B,iBAAiB,CAAC,eAAe,EAAE,EAAE,GAAG,IAAI,CAAC;IAC7C,qBAAqB,CAAC,eAAe,EAAE,YAAY,EAAE,SAAS,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,GAAG,IAAI,CAAC;IACvF,cAAc,CAAC,eAAe,EAAE,YAAY,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,IAAI,CAAC;IAC/D,qBAAqB,CAAC,eAAe,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,GAAG,IAAI,CAAC;CACnE"}
@@ -60,6 +60,7 @@ export declare class PublicPersistableStateManager {
60
60
  * @param value - the value being written to the slot
61
61
  */
62
62
  writeStorage(contractAddress: AztecAddress, slot: Fr, value: Fr, protocolWrite?: boolean): Promise<void>;
63
+ isStorageCold(contractAddress: AztecAddress, slot: Fr): boolean;
63
64
  /**
64
65
  * Read from public storage.
65
66
  *
@@ -1 +1 @@
1
- {"version":3,"file":"state_manager.d.ts","sourceRoot":"","sources":["../../../src/public/state_manager/state_manager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"state_manager.d.ts","sourceRoot":"","sources":["../../../src/public/state_manager/state_manager.ts"],"names":[],"mappings":"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"}
@@ -95,6 +95,9 @@ import { PublicStorage } from './public_storage.js';
95
95
  }
96
96
  await this.trace.tracePublicStorageWrite(contractAddress, slot, value, protocolWrite);
97
97
  }
98
+ isStorageCold(contractAddress, slot) {
99
+ return this.trace.isStorageCold(contractAddress, slot);
100
+ }
98
101
  /**
99
102
  * Read from public storage.
100
103
  *
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aztec/simulator",
3
- "version": "0.87.7",
3
+ "version": "1.0.0-nightly.20250605",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  "./server": "./dest/server.js",
@@ -58,25 +58,25 @@
58
58
  ]
59
59
  },
60
60
  "dependencies": {
61
- "@aztec/constants": "0.87.7",
62
- "@aztec/foundation": "0.87.7",
63
- "@aztec/noir-acvm_js": "0.87.7",
64
- "@aztec/noir-noirc_abi": "0.87.7",
65
- "@aztec/noir-protocol-circuits-types": "0.87.7",
66
- "@aztec/noir-types": "0.87.7",
67
- "@aztec/protocol-contracts": "0.87.7",
68
- "@aztec/stdlib": "0.87.7",
69
- "@aztec/telemetry-client": "0.87.7",
70
- "@aztec/world-state": "0.87.7",
61
+ "@aztec/constants": "1.0.0-nightly.20250605",
62
+ "@aztec/foundation": "1.0.0-nightly.20250605",
63
+ "@aztec/noir-acvm_js": "1.0.0-nightly.20250605",
64
+ "@aztec/noir-noirc_abi": "1.0.0-nightly.20250605",
65
+ "@aztec/noir-protocol-circuits-types": "1.0.0-nightly.20250605",
66
+ "@aztec/noir-types": "1.0.0-nightly.20250605",
67
+ "@aztec/protocol-contracts": "1.0.0-nightly.20250605",
68
+ "@aztec/stdlib": "1.0.0-nightly.20250605",
69
+ "@aztec/telemetry-client": "1.0.0-nightly.20250605",
70
+ "@aztec/world-state": "1.0.0-nightly.20250605",
71
71
  "lodash.clonedeep": "^4.5.0",
72
72
  "lodash.merge": "^4.6.2",
73
73
  "tslib": "^2.4.0"
74
74
  },
75
75
  "devDependencies": {
76
- "@aztec/kv-store": "0.87.7",
77
- "@aztec/merkle-tree": "0.87.7",
78
- "@aztec/noir-contracts.js": "0.87.7",
79
- "@aztec/noir-test-contracts.js": "0.87.7",
76
+ "@aztec/kv-store": "1.0.0-nightly.20250605",
77
+ "@aztec/merkle-tree": "1.0.0-nightly.20250605",
78
+ "@aztec/noir-contracts.js": "1.0.0-nightly.20250605",
79
+ "@aztec/noir-test-contracts.js": "1.0.0-nightly.20250605",
80
80
  "@jest/globals": "^29.5.0",
81
81
  "@types/jest": "^29.5.0",
82
82
  "@types/lodash.clonedeep": "^4.5.7",
@@ -104,7 +104,7 @@ const BASE_GAS_COSTS: Record<Opcode, Gas> = {
104
104
  [Opcode.MOV_8]: makeCost(c.AVM_MOV_BASE_L2_GAS, 0),
105
105
  [Opcode.MOV_16]: makeCost(c.AVM_MOV_BASE_L2_GAS, 0),
106
106
  [Opcode.SLOAD]: makeCost(c.AVM_SLOAD_BASE_L2_GAS, 0),
107
- [Opcode.SSTORE]: makeCost(c.AVM_SSTORE_BASE_L2_GAS, c.AVM_SSTORE_BASE_DA_GAS),
107
+ [Opcode.SSTORE]: makeCost(c.AVM_SSTORE_BASE_L2_GAS, 0), // DA gas is dynamic
108
108
  [Opcode.NOTEHASHEXISTS]: makeCost(c.AVM_NOTEHASHEXISTS_BASE_L2_GAS, 0),
109
109
  [Opcode.EMITNOTEHASH]: makeCost(c.AVM_EMITNOTEHASH_BASE_L2_GAS, c.AVM_EMITNOTEHASH_BASE_DA_GAS),
110
110
  [Opcode.NULLIFIEREXISTS]: makeCost(c.AVM_NULLIFIEREXISTS_BASE_L2_GAS, 0),
@@ -129,13 +129,16 @@ const BASE_GAS_COSTS: Record<Opcode, Gas> = {
129
129
  const DYNAMIC_GAS_COSTS = new Map<Opcode, Gas>([
130
130
  [Opcode.CALLDATACOPY, makeCost(c.AVM_CALLDATACOPY_DYN_L2_GAS, 0)],
131
131
  [Opcode.RETURNDATACOPY, makeCost(c.AVM_RETURNDATACOPY_DYN_L2_GAS, 0)],
132
- [Opcode.EMITUNENCRYPTEDLOG, makeCost(c.AVM_EMITUNENCRYPTEDLOG_DYN_L2_GAS, c.AVM_EMITUNENCRYPTEDLOG_DYN_DA_GAS)],
133
- [Opcode.CALL, makeCost(c.AVM_CALL_DYN_L2_GAS, 0)],
134
- [Opcode.STATICCALL, makeCost(c.AVM_STATICCALL_DYN_L2_GAS, 0)],
135
- [Opcode.RETURN, makeCost(c.AVM_RETURN_DYN_L2_GAS, 0)],
136
- [Opcode.REVERT_8, makeCost(c.AVM_REVERT_DYN_L2_GAS, 0)],
137
- [Opcode.REVERT_16, makeCost(c.AVM_REVERT_DYN_L2_GAS, 0)],
132
+ // TODO: Call and static call based on bytecode length
133
+ [Opcode.EMITUNENCRYPTEDLOG, makeCost(0, c.AVM_EMITUNENCRYPTEDLOG_DYN_DA_GAS)],
138
134
  [Opcode.TORADIXBE, makeCost(c.AVM_TORADIXBE_DYN_L2_GAS, 0)],
135
+ [Opcode.AND_8, makeCost(c.AVM_BITWISE_DYN_L2_GAS, 0)],
136
+ [Opcode.AND_16, makeCost(c.AVM_BITWISE_DYN_L2_GAS, 0)],
137
+ [Opcode.OR_8, makeCost(c.AVM_BITWISE_DYN_L2_GAS, 0)],
138
+ [Opcode.OR_16, makeCost(c.AVM_BITWISE_DYN_L2_GAS, 0)],
139
+ [Opcode.XOR_8, makeCost(c.AVM_BITWISE_DYN_L2_GAS, 0)],
140
+ [Opcode.XOR_16, makeCost(c.AVM_BITWISE_DYN_L2_GAS, 0)],
141
+ [Opcode.SSTORE, makeCost(0, c.AVM_SSTORE_DYN_DA_GAS)],
139
142
  ]);
140
143
 
141
144
  /** Returns the fixed base gas cost for a given opcode. */
@@ -143,17 +146,20 @@ export function getBaseGasCost(opcode: Opcode): Gas {
143
146
  return BASE_GAS_COSTS[opcode];
144
147
  }
145
148
 
146
- export function getDynamicGasCost(opcode: Opcode): Gas {
147
- return DYNAMIC_GAS_COSTS.has(opcode) ? DYNAMIC_GAS_COSTS.get(opcode)! : makeCost(0, 0);
149
+ export function computeAddressingCost(indirectOperandsCount: number, relativeOperandsCount: number): Gas {
150
+ return makeCost(
151
+ indirectOperandsCount * c.AVM_ADDRESSING_INDIRECT_L2_GAS + relativeOperandsCount * c.AVM_ADDRESSING_RELATIVE_L2_GAS,
152
+ 0,
153
+ );
148
154
  }
149
155
 
150
- /** Returns gas cost for an operation on a given type tag based on the base cost per byte. */
151
- export function getGasCostForTypeTag(tag: TypeTag, baseCost: Gas) {
152
- return mulGas(baseCost, getGasCostMultiplierFromTypeTag(tag));
156
+ export function getDynamicGasCost(opcode: Opcode): Gas {
157
+ return DYNAMIC_GAS_COSTS.has(opcode) ? DYNAMIC_GAS_COSTS.get(opcode)! : makeCost(0, 0);
153
158
  }
154
159
 
155
- /** Returns a multiplier based on the size of the type represented by the tag. Throws on uninitialized or invalid. */
156
- function getGasCostMultiplierFromTypeTag(tag: TypeTag) {
160
+ /** Returns a multiplier based on the byte size of the type represented by the integer tag.
161
+ * Used to account for necessary rows in the bitwise trace. Throws on invalid. */
162
+ export function getBitwiseDynamicGasMultiplier(tag: TypeTag) {
157
163
  switch (tag) {
158
164
  case TypeTag.UINT1: // same as u8
159
165
  return 1;
@@ -168,7 +174,7 @@ function getGasCostMultiplierFromTypeTag(tag: TypeTag) {
168
174
  case TypeTag.UINT128:
169
175
  return 16;
170
176
  case TypeTag.FIELD:
171
- return 32;
177
+ return 0; // Field is not allowed for bitwise operations. However we don't fail in gas, since we'll fail in bitwise.
172
178
  case TypeTag.INVALID:
173
179
  throw new InstructionExecutionError(`Invalid tag type for gas cost multiplier: ${TypeTag[tag]}`);
174
180
  }
@@ -122,7 +122,7 @@ export async function createContractClassAndInstance(
122
122
  const contractClass = await makeContractClassPublic(seed, bytecode);
123
123
 
124
124
  const constructorAbi = getContractFunctionAbi('constructor', contractArtifact);
125
- const { publicKeys } = await deriveKeys(Fr.random());
125
+ const { publicKeys } = await deriveKeys(new Fr(seed));
126
126
  const initializationHash = await computeInitializationHash(constructorAbi, constructorArgs);
127
127
  const contractInstance =
128
128
  originalContractClassId === undefined
@@ -31,7 +31,9 @@ export class NoteHashExists extends Instruction {
31
31
  const memory = context.machineState.memory;
32
32
  const addressing = Addressing.fromWire(this.indirect);
33
33
 
34
- context.machineState.consumeGas(this.gasCost());
34
+ context.machineState.consumeGas(
35
+ this.baseGasCost(addressing.indirectOperandsCount(), addressing.relativeOperandsCount()),
36
+ );
35
37
  const operands = [this.noteHashOffset, this.leafIndexOffset, this.existsOffset];
36
38
  const [noteHashOffset, leafIndexOffset, existsOffset] = addressing.resolve(operands, memory);
37
39
  memory.checkTags(TypeTag.FIELD, noteHashOffset, leafIndexOffset);
@@ -62,7 +64,9 @@ export class EmitNoteHash extends Instruction {
62
64
  const memory = context.machineState.memory;
63
65
  const addressing = Addressing.fromWire(this.indirect);
64
66
 
65
- context.machineState.consumeGas(this.gasCost());
67
+ context.machineState.consumeGas(
68
+ this.baseGasCost(addressing.indirectOperandsCount(), addressing.relativeOperandsCount()),
69
+ );
66
70
 
67
71
  const operands = [this.noteHashOffset];
68
72
  const [noteHashOffset] = addressing.resolve(operands, memory);
@@ -102,7 +106,9 @@ export class NullifierExists extends Instruction {
102
106
  const memory = context.machineState.memory;
103
107
  const addressing = Addressing.fromWire(this.indirect);
104
108
 
105
- context.machineState.consumeGas(this.gasCost());
109
+ context.machineState.consumeGas(
110
+ this.baseGasCost(addressing.indirectOperandsCount(), addressing.relativeOperandsCount()),
111
+ );
106
112
 
107
113
  const operands = [this.nullifierOffset, this.addressOffset, this.existsOffset];
108
114
  const [nullifierOffset, addressOffset, existsOffset] = addressing.resolve(operands, memory);
@@ -137,7 +143,9 @@ export class EmitNullifier extends Instruction {
137
143
  const memory = context.machineState.memory;
138
144
  const addressing = Addressing.fromWire(this.indirect);
139
145
 
140
- context.machineState.consumeGas(this.gasCost());
146
+ context.machineState.consumeGas(
147
+ this.baseGasCost(addressing.indirectOperandsCount(), addressing.relativeOperandsCount()),
148
+ );
141
149
 
142
150
  const operands = [this.nullifierOffset];
143
151
  const [nullifierOffset] = addressing.resolve(operands, memory);
@@ -184,7 +192,9 @@ export class L1ToL2MessageExists extends Instruction {
184
192
  const memory = context.machineState.memory;
185
193
  const addressing = Addressing.fromWire(this.indirect);
186
194
 
187
- context.machineState.consumeGas(this.gasCost());
195
+ context.machineState.consumeGas(
196
+ this.baseGasCost(addressing.indirectOperandsCount(), addressing.relativeOperandsCount()),
197
+ );
188
198
 
189
199
  const operands = [this.msgHashOffset, this.msgLeafIndexOffset, this.existsOffset];
190
200
  const [msgHashOffset, msgLeafIndexOffset, existsOffset] = addressing.resolve(operands, memory);
@@ -220,6 +230,10 @@ export class EmitUnencryptedLog extends Instruction {
220
230
  const memory = context.machineState.memory;
221
231
  const addressing = Addressing.fromWire(this.indirect);
222
232
 
233
+ context.machineState.consumeGas(
234
+ this.baseGasCost(addressing.indirectOperandsCount(), addressing.relativeOperandsCount()),
235
+ );
236
+
223
237
  const operands = [this.logOffset, this.logSizeOffset];
224
238
  const [logOffset, logSizeOffset] = addressing.resolve(operands, memory);
225
239
  memory.checkTag(TypeTag.UINT32, logSizeOffset);
@@ -228,7 +242,7 @@ export class EmitUnencryptedLog extends Instruction {
228
242
 
229
243
  const contractAddress = context.environment.address;
230
244
 
231
- context.machineState.consumeGas(this.gasCost(logSize));
245
+ context.machineState.consumeGas(this.dynamicGasCost(logSize));
232
246
  const log = memory.getSlice(logOffset, logSize).map(f => f.toFr());
233
247
  context.persistableState.writePublicLog(contractAddress, log);
234
248
  }
@@ -256,7 +270,9 @@ export class SendL2ToL1Message extends Instruction {
256
270
  const memory = context.machineState.memory;
257
271
  const addressing = Addressing.fromWire(this.indirect);
258
272
 
259
- context.machineState.consumeGas(this.gasCost());
273
+ context.machineState.consumeGas(
274
+ this.baseGasCost(addressing.indirectOperandsCount(), addressing.relativeOperandsCount()),
275
+ );
260
276
 
261
277
  const operands = [this.recipientOffset, this.contentOffset];
262
278
  const [recipientOffset, contentOffset] = addressing.resolve(operands, memory);
@@ -54,6 +54,14 @@ export class Addressing {
54
54
  return wire;
55
55
  }
56
56
 
57
+ public indirectOperandsCount(): number {
58
+ return this.modePerOperand.filter(mode => mode & AddressingMode.INDIRECT).length;
59
+ }
60
+
61
+ public relativeOperandsCount(): number {
62
+ return this.modePerOperand.filter(mode => mode & AddressingMode.RELATIVE).length;
63
+ }
64
+
57
65
  /**
58
66
  * Resolves the offsets using the addressing mode.
59
67
  * @param offsets The offsets to resolve.
@@ -16,7 +16,9 @@ export abstract class ThreeOperandArithmeticInstruction extends ThreeOperandInst
16
16
  const memory = context.machineState.memory;
17
17
  const addressing = Addressing.fromWire(this.indirect);
18
18
 
19
- context.machineState.consumeGas(this.gasCost());
19
+ context.machineState.consumeGas(
20
+ this.baseGasCost(addressing.indirectOperandsCount(), addressing.relativeOperandsCount()),
21
+ );
20
22
 
21
23
  const operands = [this.aOffset, this.bOffset, this.dstOffset];
22
24
  const [aOffset, bOffset, dstOffset] = addressing.resolve(operands, memory);
@@ -1,4 +1,5 @@
1
1
  import type { AvmContext } from '../avm_context.js';
2
+ import { getBitwiseDynamicGasMultiplier } from '../avm_gas.js';
2
3
  import { type IntegralValue, TaggedMemory, type TaggedMemoryInterface, TypeTag } from '../avm_memory_types.js';
3
4
  import { Opcode, OperandType } from '../serialization/instruction_serialization.js';
4
5
  import { Addressing } from './addressing_mode.js';
@@ -10,12 +11,17 @@ abstract class ThreeOperandBitwiseInstruction extends ThreeOperandInstruction {
10
11
  const memory = context.machineState.memory;
11
12
  const addressing = Addressing.fromWire(this.indirect);
12
13
 
13
- context.machineState.consumeGas(this.gasCost());
14
+ context.machineState.consumeGas(
15
+ this.baseGasCost(addressing.indirectOperandsCount(), addressing.relativeOperandsCount()),
16
+ );
14
17
 
15
18
  const operands = [this.aOffset, this.bOffset, this.dstOffset];
16
19
  const [aOffset, bOffset, dstOffset] = addressing.resolve(operands, memory);
17
20
  this.checkTags(memory, aOffset, bOffset);
18
21
 
22
+ const multiplier = this.getDynamicMultiplier(memory.getTag(aOffset));
23
+ context.machineState.consumeGas(this.dynamicGasCost(multiplier));
24
+
19
25
  const a = memory.getAs<IntegralValue>(aOffset);
20
26
  const b = memory.getAs<IntegralValue>(bOffset);
21
27
 
@@ -28,6 +34,10 @@ abstract class ThreeOperandBitwiseInstruction extends ThreeOperandInstruction {
28
34
  TaggedMemory.checkIsIntegralTag(memory.getTag(aOffset));
29
35
  memory.checkTagsAreSame(aOffset, bOffset);
30
36
  }
37
+
38
+ protected getDynamicMultiplier(_lhsTag: TypeTag): number {
39
+ return 0;
40
+ }
31
41
  }
32
42
 
33
43
  export class And extends ThreeOperandBitwiseInstruction {
@@ -37,6 +47,10 @@ export class And extends ThreeOperandBitwiseInstruction {
37
47
  protected override compute(a: IntegralValue, b: IntegralValue): IntegralValue {
38
48
  return a.and(b);
39
49
  }
50
+
51
+ protected override getDynamicMultiplier(lhsTag: TypeTag): number {
52
+ return getBitwiseDynamicGasMultiplier(lhsTag);
53
+ }
40
54
  }
41
55
 
42
56
  export class Or extends ThreeOperandBitwiseInstruction {
@@ -46,6 +60,10 @@ export class Or extends ThreeOperandBitwiseInstruction {
46
60
  protected override compute(a: IntegralValue, b: IntegralValue): IntegralValue {
47
61
  return a.or(b);
48
62
  }
63
+
64
+ protected override getDynamicMultiplier(lhsTag: TypeTag): number {
65
+ return getBitwiseDynamicGasMultiplier(lhsTag);
66
+ }
49
67
  }
50
68
 
51
69
  export class Xor extends ThreeOperandBitwiseInstruction {
@@ -55,6 +73,10 @@ export class Xor extends ThreeOperandBitwiseInstruction {
55
73
  protected override compute(a: IntegralValue, b: IntegralValue): IntegralValue {
56
74
  return a.xor(b);
57
75
  }
76
+
77
+ protected override getDynamicMultiplier(lhsTag: TypeTag): number {
78
+ return getBitwiseDynamicGasMultiplier(lhsTag);
79
+ }
58
80
  }
59
81
 
60
82
  export class Shl extends ThreeOperandBitwiseInstruction {
@@ -102,7 +124,9 @@ export class Not extends Instruction {
102
124
  const memory = context.machineState.memory;
103
125
  const addressing = Addressing.fromWire(this.indirect);
104
126
 
105
- context.machineState.consumeGas(this.gasCost());
127
+ context.machineState.consumeGas(
128
+ this.baseGasCost(addressing.indirectOperandsCount(), addressing.relativeOperandsCount()),
129
+ );
106
130
 
107
131
  const operands = [this.srcOffset, this.dstOffset];
108
132
  const [srcOffset, dstOffset] = addressing.resolve(operands, memory);
@@ -9,7 +9,9 @@ abstract class ComparatorInstruction extends ThreeOperandInstruction {
9
9
  const memory = context.machineState.memory;
10
10
  const addressing = Addressing.fromWire(this.indirect);
11
11
 
12
- context.machineState.consumeGas(this.gasCost());
12
+ context.machineState.consumeGas(
13
+ this.baseGasCost(addressing.indirectOperandsCount(), addressing.relativeOperandsCount()),
14
+ );
13
15
 
14
16
  const operands = [this.aOffset, this.bOffset, this.dstOffset];
15
17
  const [aOffset, bOffset, dstOffset] = addressing.resolve(operands, memory);
@@ -36,7 +36,9 @@ export class GetContractInstance extends Instruction {
36
36
  const memory = context.machineState.memory;
37
37
  const addressing = Addressing.fromWire(this.indirect);
38
38
 
39
- context.machineState.consumeGas(this.gasCost());
39
+ context.machineState.consumeGas(
40
+ this.baseGasCost(addressing.indirectOperandsCount(), addressing.relativeOperandsCount()),
41
+ );
40
42
 
41
43
  if (!(this.memberEnum in ContractInstanceMember)) {
42
44
  throw new InstructionExecutionError(`Invalid GETCONSTRACTINSTANCE member enum ${this.memberEnum}`);