@aztec/simulator 0.87.2 → 0.87.3-nightly.20250528

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 (138) hide show
  1. package/dest/client.d.ts +2 -0
  2. package/dest/client.d.ts.map +1 -1
  3. package/dest/client.js +2 -0
  4. package/dest/private/acvm/acvm.d.ts +4 -0
  5. package/dest/private/acvm/acvm.d.ts.map +1 -1
  6. package/dest/private/acvm/oracle/oracle.d.ts +1 -1
  7. package/dest/private/acvm/oracle/oracle.d.ts.map +1 -1
  8. package/dest/private/acvm/oracle/oracle.js +2 -2
  9. package/dest/private/acvm/oracle/typed_oracle.d.ts +1 -1
  10. package/dest/private/acvm/oracle/typed_oracle.d.ts.map +1 -1
  11. package/dest/private/acvm/oracle/typed_oracle.js +2 -2
  12. package/dest/private/private_execution.d.ts.map +1 -1
  13. package/dest/private/private_execution.js +2 -1
  14. package/dest/private/private_execution_oracle.d.ts +1 -1
  15. package/dest/private/private_execution_oracle.d.ts.map +1 -1
  16. package/dest/private/private_execution_oracle.js +1 -1
  17. package/dest/private/providers/circuit_recording/circuit_recorder.d.ts +39 -19
  18. package/dest/private/providers/circuit_recording/circuit_recorder.d.ts.map +1 -1
  19. package/dest/private/providers/circuit_recording/circuit_recorder.js +90 -126
  20. package/dest/private/providers/circuit_recording/file_circuit_recorder.d.ts +31 -0
  21. package/dest/private/providers/circuit_recording/file_circuit_recorder.d.ts.map +1 -0
  22. package/dest/private/providers/circuit_recording/file_circuit_recorder.js +135 -0
  23. package/dest/private/providers/circuit_recording/memory_circuit_recorder.d.ts +5 -0
  24. package/dest/private/providers/circuit_recording/memory_circuit_recorder.d.ts.map +1 -0
  25. package/dest/private/providers/circuit_recording/memory_circuit_recorder.js +9 -0
  26. package/dest/private/providers/circuit_recording/simulation_provider_recorder_wrapper.d.ts +3 -1
  27. package/dest/private/providers/circuit_recording/simulation_provider_recorder_wrapper.d.ts.map +1 -1
  28. package/dest/private/providers/circuit_recording/simulation_provider_recorder_wrapper.js +16 -11
  29. package/dest/private/utility_execution_oracle.d.ts +1 -1
  30. package/dest/private/utility_execution_oracle.d.ts.map +1 -1
  31. package/dest/private/utility_execution_oracle.js +1 -1
  32. package/dest/public/avm/avm_gas.d.ts +4 -5
  33. package/dest/public/avm/avm_gas.d.ts.map +1 -1
  34. package/dest/public/avm/avm_gas.js +28 -18
  35. package/dest/public/avm/fixtures/base_avm_simulation_tester.d.ts +1 -0
  36. package/dest/public/avm/fixtures/base_avm_simulation_tester.d.ts.map +1 -1
  37. package/dest/public/avm/fixtures/base_avm_simulation_tester.js +6 -0
  38. package/dest/public/avm/fixtures/utils.js +1 -1
  39. package/dest/public/avm/opcodes/accrued_substate.d.ts.map +1 -1
  40. package/dest/public/avm/opcodes/accrued_substate.js +8 -7
  41. package/dest/public/avm/opcodes/addressing_mode.d.ts +2 -0
  42. package/dest/public/avm/opcodes/addressing_mode.d.ts.map +1 -1
  43. package/dest/public/avm/opcodes/addressing_mode.js +6 -0
  44. package/dest/public/avm/opcodes/arithmetic.d.ts.map +1 -1
  45. package/dest/public/avm/opcodes/arithmetic.js +1 -1
  46. package/dest/public/avm/opcodes/bitwise.d.ts +5 -1
  47. package/dest/public/avm/opcodes/bitwise.d.ts.map +1 -1
  48. package/dest/public/avm/opcodes/bitwise.js +17 -2
  49. package/dest/public/avm/opcodes/comparators.d.ts.map +1 -1
  50. package/dest/public/avm/opcodes/comparators.js +1 -1
  51. package/dest/public/avm/opcodes/contract.d.ts.map +1 -1
  52. package/dest/public/avm/opcodes/contract.js +1 -1
  53. package/dest/public/avm/opcodes/control_flow.d.ts.map +1 -1
  54. package/dest/public/avm/opcodes/control_flow.js +4 -4
  55. package/dest/public/avm/opcodes/conversion.d.ts +1 -0
  56. package/dest/public/avm/opcodes/conversion.d.ts.map +1 -1
  57. package/dest/public/avm/opcodes/conversion.js +263 -2
  58. package/dest/public/avm/opcodes/ec_add.d.ts.map +1 -1
  59. package/dest/public/avm/opcodes/ec_add.js +1 -1
  60. package/dest/public/avm/opcodes/environment_getters.d.ts.map +1 -1
  61. package/dest/public/avm/opcodes/environment_getters.js +1 -1
  62. package/dest/public/avm/opcodes/external_calls.d.ts.map +1 -1
  63. package/dest/public/avm/opcodes/external_calls.js +6 -8
  64. package/dest/public/avm/opcodes/hashing.d.ts.map +1 -1
  65. package/dest/public/avm/opcodes/hashing.js +3 -3
  66. package/dest/public/avm/opcodes/instruction.d.ts +9 -3
  67. package/dest/public/avm/opcodes/instruction.d.ts.map +1 -1
  68. package/dest/public/avm/opcodes/instruction.js +12 -7
  69. package/dest/public/avm/opcodes/memory.d.ts.map +1 -1
  70. package/dest/public/avm/opcodes/memory.js +8 -6
  71. package/dest/public/avm/opcodes/misc.js +1 -3
  72. package/dest/public/avm/opcodes/storage.d.ts.map +1 -1
  73. package/dest/public/avm/opcodes/storage.js +5 -3
  74. package/dest/public/fixtures/index.d.ts +1 -0
  75. package/dest/public/fixtures/index.d.ts.map +1 -1
  76. package/dest/public/fixtures/index.js +1 -0
  77. package/dest/public/fixtures/minimal_public_tx.d.ts +9 -0
  78. package/dest/public/fixtures/minimal_public_tx.d.ts.map +1 -0
  79. package/dest/public/fixtures/minimal_public_tx.js +43 -0
  80. package/dest/public/public_tx_simulator/apps_tests/amm_test.d.ts.map +1 -1
  81. package/dest/public/public_tx_simulator/apps_tests/amm_test.js +27 -55
  82. package/dest/public/public_tx_simulator/public_tx_context.d.ts +1 -1
  83. package/dest/public/public_tx_simulator/public_tx_context.d.ts.map +1 -1
  84. package/dest/public/public_tx_simulator/public_tx_context.js +5 -4
  85. package/dest/public/side_effect_trace.d.ts +4 -1
  86. package/dest/public/side_effect_trace.d.ts.map +1 -1
  87. package/dest/public/side_effect_trace.js +13 -2
  88. package/dest/public/side_effect_trace_interface.d.ts +1 -0
  89. package/dest/public/side_effect_trace_interface.d.ts.map +1 -1
  90. package/dest/public/state_manager/state_manager.d.ts +1 -0
  91. package/dest/public/state_manager/state_manager.d.ts.map +1 -1
  92. package/dest/public/state_manager/state_manager.js +3 -0
  93. package/dest/server.d.ts +2 -0
  94. package/dest/server.d.ts.map +1 -1
  95. package/dest/server.js +2 -0
  96. package/dest/testing.d.ts +1 -1
  97. package/dest/testing.d.ts.map +1 -1
  98. package/dest/testing.js +1 -1
  99. package/package.json +15 -15
  100. package/src/client.ts +2 -0
  101. package/src/private/acvm/acvm.ts +3 -0
  102. package/src/private/acvm/oracle/oracle.ts +2 -2
  103. package/src/private/acvm/oracle/typed_oracle.ts +2 -2
  104. package/src/private/private_execution.ts +1 -0
  105. package/src/private/private_execution_oracle.ts +1 -1
  106. package/src/private/providers/circuit_recording/circuit_recorder.ts +114 -136
  107. package/src/private/providers/circuit_recording/file_circuit_recorder.ts +158 -0
  108. package/src/private/providers/circuit_recording/memory_circuit_recorder.ts +11 -0
  109. package/src/private/providers/circuit_recording/simulation_provider_recorder_wrapper.ts +22 -14
  110. package/src/private/utility_execution_oracle.ts +1 -1
  111. package/src/public/avm/avm_gas.ts +20 -14
  112. package/src/public/avm/fixtures/base_avm_simulation_tester.ts +5 -0
  113. package/src/public/avm/fixtures/utils.ts +1 -1
  114. package/src/public/avm/opcodes/accrued_substate.ts +23 -7
  115. package/src/public/avm/opcodes/addressing_mode.ts +8 -0
  116. package/src/public/avm/opcodes/arithmetic.ts +3 -1
  117. package/src/public/avm/opcodes/bitwise.ts +26 -2
  118. package/src/public/avm/opcodes/comparators.ts +3 -1
  119. package/src/public/avm/opcodes/contract.ts +3 -1
  120. package/src/public/avm/opcodes/control_flow.ts +6 -4
  121. package/src/public/avm/opcodes/conversion.ts +21 -2
  122. package/src/public/avm/opcodes/ec_add.ts +3 -1
  123. package/src/public/avm/opcodes/environment_getters.ts +3 -1
  124. package/src/public/avm/opcodes/external_calls.ts +16 -8
  125. package/src/public/avm/opcodes/hashing.ts +11 -3
  126. package/src/public/avm/opcodes/instruction.ts +14 -7
  127. package/src/public/avm/opcodes/memory.ts +23 -6
  128. package/src/public/avm/opcodes/misc.ts +4 -4
  129. package/src/public/avm/opcodes/storage.ts +13 -3
  130. package/src/public/fixtures/index.ts +1 -0
  131. package/src/public/fixtures/minimal_public_tx.ts +57 -0
  132. package/src/public/public_tx_simulator/apps_tests/amm_test.ts +49 -44
  133. package/src/public/public_tx_simulator/public_tx_context.ts +26 -5
  134. package/src/public/side_effect_trace.ts +13 -0
  135. package/src/public/side_effect_trace_interface.ts +1 -0
  136. package/src/public/state_manager/state_manager.ts +4 -0
  137. package/src/server.ts +2 -0
  138. package/src/testing.ts +1 -1
@@ -1,5 +1,5 @@
1
1
  import type { AvmContext } from '../avm_context.js';
2
- import { type IntegralValue, type TaggedMemoryInterface } from '../avm_memory_types.js';
2
+ import { type IntegralValue, type TaggedMemoryInterface, TypeTag } from '../avm_memory_types.js';
3
3
  import { Opcode, OperandType } from '../serialization/instruction_serialization.js';
4
4
  import { Instruction } from './instruction.js';
5
5
  import { ThreeOperandInstruction } from './instruction_impl.js';
@@ -7,21 +7,25 @@ declare abstract class ThreeOperandBitwiseInstruction extends ThreeOperandInstru
7
7
  execute(context: AvmContext): Promise<void>;
8
8
  protected abstract compute(a: IntegralValue, b: IntegralValue): IntegralValue;
9
9
  protected checkTags(memory: TaggedMemoryInterface, aOffset: number, bOffset: number): void;
10
+ protected getDynamicMultiplier(_lhsTag: TypeTag): number;
10
11
  }
11
12
  export declare class And extends ThreeOperandBitwiseInstruction {
12
13
  static readonly type: string;
13
14
  static readonly opcode = Opcode.AND_8;
14
15
  protected compute(a: IntegralValue, b: IntegralValue): IntegralValue;
16
+ protected getDynamicMultiplier(lhsTag: TypeTag): number;
15
17
  }
16
18
  export declare class Or extends ThreeOperandBitwiseInstruction {
17
19
  static readonly type: string;
18
20
  static readonly opcode = Opcode.OR_8;
19
21
  protected compute(a: IntegralValue, b: IntegralValue): IntegralValue;
22
+ protected getDynamicMultiplier(lhsTag: TypeTag): number;
20
23
  }
21
24
  export declare class Xor extends ThreeOperandBitwiseInstruction {
22
25
  static readonly type: string;
23
26
  static readonly opcode = Opcode.XOR_8;
24
27
  protected compute(a: IntegralValue, b: IntegralValue): IntegralValue;
28
+ protected getDynamicMultiplier(lhsTag: TypeTag): number;
25
29
  }
26
30
  export declare class Shl extends ThreeOperandBitwiseInstruction {
27
31
  static readonly type: string;
@@ -1 +1 @@
1
- {"version":3,"file":"bitwise.d.ts","sourceRoot":"","sources":["../../../../src/public/avm/opcodes/bitwise.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,KAAK,aAAa,EAAgB,KAAK,qBAAqB,EAAW,MAAM,wBAAwB,CAAC;AAC/G,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,+CAA+C,CAAC;AAEpF,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAEhE,uBAAe,8BAA+B,SAAQ,uBAAuB;IAC9D,OAAO,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAiBxD,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,aAAa,GAAG,aAAa;IAC7E,SAAS,CAAC,SAAS,CAAC,MAAM,EAAE,qBAAqB,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;CAIpF;AAED,qBAAa,GAAI,SAAQ,8BAA8B;IACrD,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAS;IACrC,MAAM,CAAC,QAAQ,CAAC,MAAM,gBAAgB;cAEnB,OAAO,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,aAAa,GAAG,aAAa;CAG9E;AAED,qBAAa,EAAG,SAAQ,8BAA8B;IACpD,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAQ;IACpC,MAAM,CAAC,QAAQ,CAAC,MAAM,eAAe;cAElB,OAAO,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,aAAa,GAAG,aAAa;CAG9E;AAED,qBAAa,GAAI,SAAQ,8BAA8B;IACrD,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAS;IACrC,MAAM,CAAC,QAAQ,CAAC,MAAM,gBAAgB;cAEnB,OAAO,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,aAAa,GAAG,aAAa;CAG9E;AAED,qBAAa,GAAI,SAAQ,8BAA8B;IACrD,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAS;IACrC,MAAM,CAAC,QAAQ,CAAC,MAAM,gBAAgB;cAEnB,OAAO,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,aAAa,GAAG,aAAa;cAG1D,SAAS,CAAC,MAAM,EAAE,qBAAqB,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;CAI7F;AAED,qBAAa,GAAI,SAAQ,8BAA8B;IACrD,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAS;IACrC,MAAM,CAAC,QAAQ,CAAC,MAAM,gBAAgB;cAEnB,OAAO,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,aAAa,GAAG,aAAa;cAG1D,SAAS,CAAC,MAAM,EAAE,qBAAqB,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;CAI7F;AAED,qBAAa,GAAI,SAAQ,WAAW;IAQhC,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,SAAS;IATnB,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAS;IACrC,MAAM,CAAC,QAAQ,CAAC,MAAM,gBAAgB;IAEtC,MAAM,CAAC,QAAQ,CAAC,WAAW,gBAAgF;IAC3G,MAAM,CAAC,QAAQ,CAAC,YAAY,gBAAkF;gBAGpG,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM;IAKd,OAAO,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;CAczD"}
1
+ {"version":3,"file":"bitwise.d.ts","sourceRoot":"","sources":["../../../../src/public/avm/opcodes/bitwise.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ import { getBitwiseDynamicGasMultiplier } from '../avm_gas.js';
1
2
  import { TaggedMemory, TypeTag } from '../avm_memory_types.js';
2
3
  import { Opcode, OperandType } from '../serialization/instruction_serialization.js';
3
4
  import { Addressing } from './addressing_mode.js';
@@ -7,7 +8,7 @@ class ThreeOperandBitwiseInstruction extends ThreeOperandInstruction {
7
8
  async execute(context) {
8
9
  const memory = context.machineState.memory;
9
10
  const addressing = Addressing.fromWire(this.indirect);
10
- context.machineState.consumeGas(this.gasCost());
11
+ context.machineState.consumeGas(this.baseGasCost(addressing.indirectOperandsCount(), addressing.relativeOperandsCount()));
11
12
  const operands = [
12
13
  this.aOffset,
13
14
  this.bOffset,
@@ -15,6 +16,8 @@ class ThreeOperandBitwiseInstruction extends ThreeOperandInstruction {
15
16
  ];
16
17
  const [aOffset, bOffset, dstOffset] = addressing.resolve(operands, memory);
17
18
  this.checkTags(memory, aOffset, bOffset);
19
+ const multiplier = this.getDynamicMultiplier(memory.getTag(aOffset));
20
+ context.machineState.consumeGas(this.dynamicGasCost(multiplier));
18
21
  const a = memory.getAs(aOffset);
19
22
  const b = memory.getAs(bOffset);
20
23
  const res = this.compute(a, b);
@@ -24,6 +27,9 @@ class ThreeOperandBitwiseInstruction extends ThreeOperandInstruction {
24
27
  TaggedMemory.checkIsIntegralTag(memory.getTag(aOffset));
25
28
  memory.checkTagsAreSame(aOffset, bOffset);
26
29
  }
30
+ getDynamicMultiplier(_lhsTag) {
31
+ return 0;
32
+ }
27
33
  }
28
34
  export class And extends ThreeOperandBitwiseInstruction {
29
35
  static type = 'AND';
@@ -31,6 +37,9 @@ export class And extends ThreeOperandBitwiseInstruction {
31
37
  compute(a, b) {
32
38
  return a.and(b);
33
39
  }
40
+ getDynamicMultiplier(lhsTag) {
41
+ return getBitwiseDynamicGasMultiplier(lhsTag);
42
+ }
34
43
  }
35
44
  export class Or extends ThreeOperandBitwiseInstruction {
36
45
  static type = 'OR';
@@ -38,6 +47,9 @@ export class Or extends ThreeOperandBitwiseInstruction {
38
47
  compute(a, b) {
39
48
  return a.or(b);
40
49
  }
50
+ getDynamicMultiplier(lhsTag) {
51
+ return getBitwiseDynamicGasMultiplier(lhsTag);
52
+ }
41
53
  }
42
54
  export class Xor extends ThreeOperandBitwiseInstruction {
43
55
  static type = 'XOR';
@@ -45,6 +57,9 @@ export class Xor extends ThreeOperandBitwiseInstruction {
45
57
  compute(a, b) {
46
58
  return a.xor(b);
47
59
  }
60
+ getDynamicMultiplier(lhsTag) {
61
+ return getBitwiseDynamicGasMultiplier(lhsTag);
62
+ }
48
63
  }
49
64
  export class Shl extends ThreeOperandBitwiseInstruction {
50
65
  static type = 'SHL';
@@ -92,7 +107,7 @@ export class Not extends Instruction {
92
107
  async execute(context) {
93
108
  const memory = context.machineState.memory;
94
109
  const addressing = Addressing.fromWire(this.indirect);
95
- context.machineState.consumeGas(this.gasCost());
110
+ context.machineState.consumeGas(this.baseGasCost(addressing.indirectOperandsCount(), addressing.relativeOperandsCount()));
96
111
  const operands = [
97
112
  this.srcOffset,
98
113
  this.dstOffset
@@ -1 +1 @@
1
- {"version":3,"file":"comparators.d.ts","sourceRoot":"","sources":["../../../../src/public/avm/opcodes/comparators.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,KAAK,WAAW,EAAS,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,MAAM,EAAE,MAAM,+CAA+C,CAAC;AAEvE,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAEhE,uBAAe,qBAAsB,SAAQ,uBAAuB;IACrD,OAAO,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAiBxD,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,WAAW,GAAG,OAAO;CACpE;AAED,qBAAa,EAAG,SAAQ,qBAAqB;IAC3C,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAQ;IACpC,MAAM,CAAC,QAAQ,CAAC,MAAM,eAAe;IAErC,SAAS,CAAC,OAAO,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,WAAW,GAAG,OAAO;CAG3D;AAED,qBAAa,EAAG,SAAQ,qBAAqB;IAC3C,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAQ;IACpC,MAAM,CAAC,QAAQ,CAAC,MAAM,eAAe;IAErC,SAAS,CAAC,OAAO,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,WAAW,GAAG,OAAO;CAG3D;AAED,qBAAa,GAAI,SAAQ,qBAAqB;IAC5C,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAS;IACrC,MAAM,CAAC,QAAQ,CAAC,MAAM,gBAAgB;IAEtC,SAAS,CAAC,OAAO,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,WAAW,GAAG,OAAO;CAG3D"}
1
+ {"version":3,"file":"comparators.d.ts","sourceRoot":"","sources":["../../../../src/public/avm/opcodes/comparators.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,KAAK,WAAW,EAAS,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,MAAM,EAAE,MAAM,+CAA+C,CAAC;AAEvE,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAEhE,uBAAe,qBAAsB,SAAQ,uBAAuB;IACrD,OAAO,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAmBxD,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,WAAW,GAAG,OAAO;CACpE;AAED,qBAAa,EAAG,SAAQ,qBAAqB;IAC3C,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAQ;IACpC,MAAM,CAAC,QAAQ,CAAC,MAAM,eAAe;IAErC,SAAS,CAAC,OAAO,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,WAAW,GAAG,OAAO;CAG3D;AAED,qBAAa,EAAG,SAAQ,qBAAqB;IAC3C,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAQ;IACpC,MAAM,CAAC,QAAQ,CAAC,MAAM,eAAe;IAErC,SAAS,CAAC,OAAO,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,WAAW,GAAG,OAAO;CAG3D;AAED,qBAAa,GAAI,SAAQ,qBAAqB;IAC5C,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAS;IACrC,MAAM,CAAC,QAAQ,CAAC,MAAM,gBAAgB;IAEtC,SAAS,CAAC,OAAO,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,WAAW,GAAG,OAAO;CAG3D"}
@@ -6,7 +6,7 @@ class ComparatorInstruction extends ThreeOperandInstruction {
6
6
  async execute(context) {
7
7
  const memory = context.machineState.memory;
8
8
  const addressing = Addressing.fromWire(this.indirect);
9
- context.machineState.consumeGas(this.gasCost());
9
+ context.machineState.consumeGas(this.baseGasCost(addressing.indirectOperandsCount(), addressing.relativeOperandsCount()));
10
10
  const operands = [
11
11
  this.aOffset,
12
12
  this.bOffset,
@@ -1 +1 @@
1
- {"version":3,"file":"contract.d.ts","sourceRoot":"","sources":["../../../../src/public/avm/opcodes/contract.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAGpD,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,+CAA+C,CAAC;AAEpF,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,oBAAY,sBAAsB;IAChC,QAAQ,IAAA;IACR,QAAQ,IAAA;IACR,SAAS,IAAA;CACV;AAED,qBAAa,mBAAoB,SAAQ,WAAW;IAahD,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,aAAa;IACrB,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,UAAU;IAfpB,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAyB;IACrD,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAA8B;IAE5D,MAAM,CAAC,QAAQ,CAAC,UAAU,EAAE,WAAW,EAAE,CAMvC;gBAGQ,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,MAAM,EACrB,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM;IAKtB,OAAO,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;CAsClD"}
1
+ {"version":3,"file":"contract.d.ts","sourceRoot":"","sources":["../../../../src/public/avm/opcodes/contract.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAGpD,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,+CAA+C,CAAC;AAEpF,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,oBAAY,sBAAsB;IAChC,QAAQ,IAAA;IACR,QAAQ,IAAA;IACR,SAAS,IAAA;CACV;AAED,qBAAa,mBAAoB,SAAQ,WAAW;IAahD,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,aAAa;IACrB,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,UAAU;IAfpB,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAyB;IACrD,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAA8B;IAE5D,MAAM,CAAC,QAAQ,CAAC,UAAU,EAAE,WAAW,EAAE,CAMvC;gBAGQ,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,MAAM,EACrB,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM;IAKtB,OAAO,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;CAwClD"}
@@ -30,7 +30,7 @@ export class GetContractInstance extends Instruction {
30
30
  async execute(context) {
31
31
  const memory = context.machineState.memory;
32
32
  const addressing = Addressing.fromWire(this.indirect);
33
- context.machineState.consumeGas(this.gasCost());
33
+ context.machineState.consumeGas(this.baseGasCost(addressing.indirectOperandsCount(), addressing.relativeOperandsCount()));
34
34
  if (!(this.memberEnum in ContractInstanceMember)) {
35
35
  throw new InstructionExecutionError(`Invalid GETCONSTRACTINSTANCE member enum ${this.memberEnum}`);
36
36
  }
@@ -1 +1 @@
1
- {"version":3,"file":"control_flow.d.ts","sourceRoot":"","sources":["../../../../src/public/avm/opcodes/control_flow.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAGpD,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,+CAA+C,CAAC;AAEpF,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,qBAAa,IAAK,SAAQ,WAAW;IAMvB,OAAO,CAAC,UAAU;IAL9B,MAAM,CAAC,IAAI,EAAE,MAAM,CAAU;IAC7B,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAkB;IAEhD,MAAM,CAAC,QAAQ,CAAC,UAAU,EAAE,WAAW,EAAE,CAA2C;gBAEhE,UAAU,EAAE,MAAM;IAIzB,OAAO,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAMxC,SAAS,IAAI,OAAO;CAGrC;AAED,qBAAa,KAAM,SAAQ,WAAW;IAalC,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,GAAG;IAdb,MAAM,CAAC,IAAI,EAAE,MAAM,CAAW;IAC9B,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAmB;IAGjD,MAAM,CAAC,QAAQ,CAAC,UAAU,EAAE,WAAW,EAAE,CAKvC;gBAGQ,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAClB,GAAG,EAAE,MAAM;IAKR,OAAO,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAiBxC,SAAS,IAAI,OAAO;CAGrC;AAED,qBAAa,YAAa,SAAQ,WAAW;IAM/B,OAAO,CAAC,GAAG;IALvB,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAkB;IAC9C,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAuB;IAErD,MAAM,CAAC,QAAQ,CAAC,UAAU,EAAE,WAAW,EAAE,CAA2C;gBAEhE,GAAG,EAAE,MAAM;IAIlB,OAAO,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAUxC,SAAS,IAAI,OAAO;CAGrC;AAED,qBAAa,cAAe,SAAQ,WAAW;IAC7C,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAoB;IAChD,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAyB;IAEvD,MAAM,CAAC,QAAQ,CAAC,UAAU,EAAE,WAAW,EAAE,CAAuB;;IAMnD,OAAO,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAUxC,SAAS,IAAI,OAAO;CAGrC"}
1
+ {"version":3,"file":"control_flow.d.ts","sourceRoot":"","sources":["../../../../src/public/avm/opcodes/control_flow.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAGpD,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,+CAA+C,CAAC;AAEpF,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,qBAAa,IAAK,SAAQ,WAAW;IAMvB,OAAO,CAAC,UAAU;IAL9B,MAAM,CAAC,IAAI,EAAE,MAAM,CAAU;IAC7B,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAkB;IAEhD,MAAM,CAAC,QAAQ,CAAC,UAAU,EAAE,WAAW,EAAE,CAA2C;gBAEhE,UAAU,EAAE,MAAM;IAIzB,OAAO,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAMxC,SAAS,IAAI,OAAO;CAGrC;AAED,qBAAa,KAAM,SAAQ,WAAW;IAalC,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,GAAG;IAdb,MAAM,CAAC,IAAI,EAAE,MAAM,CAAW;IAC9B,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAmB;IAGjD,MAAM,CAAC,QAAQ,CAAC,UAAU,EAAE,WAAW,EAAE,CAKvC;gBAGQ,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAClB,GAAG,EAAE,MAAM;IAKR,OAAO,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAmBxC,SAAS,IAAI,OAAO;CAGrC;AAED,qBAAa,YAAa,SAAQ,WAAW;IAM/B,OAAO,CAAC,GAAG;IALvB,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAkB;IAC9C,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAuB;IAErD,MAAM,CAAC,QAAQ,CAAC,UAAU,EAAE,WAAW,EAAE,CAA2C;gBAEhE,GAAG,EAAE,MAAM;IAIlB,OAAO,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAUxC,SAAS,IAAI,OAAO;CAGrC;AAED,qBAAa,cAAe,SAAQ,WAAW;IAC7C,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAoB;IAChD,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAyB;IAEvD,MAAM,CAAC,QAAQ,CAAC,UAAU,EAAE,WAAW,EAAE,CAAuB;;IAMnD,OAAO,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAUxC,SAAS,IAAI,OAAO;CAGrC"}
@@ -15,7 +15,7 @@ export class Jump extends Instruction {
15
15
  super(), this.jumpOffset = jumpOffset;
16
16
  }
17
17
  async execute(context) {
18
- context.machineState.consumeGas(this.gasCost());
18
+ context.machineState.consumeGas(this.baseGasCost(0, 0));
19
19
  context.machineState.pc = this.jumpOffset;
20
20
  }
21
21
  handlesPC() {
@@ -41,7 +41,7 @@ export class JumpI extends Instruction {
41
41
  async execute(context) {
42
42
  const memory = context.machineState.memory;
43
43
  const addressing = Addressing.fromWire(this.indirect);
44
- context.machineState.consumeGas(this.gasCost());
44
+ context.machineState.consumeGas(this.baseGasCost(addressing.indirectOperandsCount(), addressing.relativeOperandsCount()));
45
45
  const operands = [
46
46
  this.condOffset
47
47
  ];
@@ -70,7 +70,7 @@ export class InternalCall extends Instruction {
70
70
  super(), this.loc = loc;
71
71
  }
72
72
  async execute(context) {
73
- context.machineState.consumeGas(this.gasCost());
73
+ context.machineState.consumeGas(this.baseGasCost(0, 0));
74
74
  context.machineState.internalCallStack.push({
75
75
  callPc: context.machineState.pc,
76
76
  returnPc: context.machineState.nextPc
@@ -92,7 +92,7 @@ export class InternalReturn extends Instruction {
92
92
  super();
93
93
  }
94
94
  async execute(context) {
95
- context.machineState.consumeGas(this.gasCost());
95
+ context.machineState.consumeGas(this.baseGasCost(0, 0));
96
96
  const stackEntry = context.machineState.internalCallStack.pop();
97
97
  if (stackEntry === undefined) {
98
98
  throw new InstructionExecutionError('Internal call stack empty!');
@@ -14,4 +14,5 @@ export declare class ToRadixBE extends Instruction {
14
14
  constructor(indirect: number, srcOffset: number, radixOffset: number, numLimbsOffset: number, outputBitsOffset: number, dstOffset: number);
15
15
  execute(context: AvmContext): Promise<void>;
16
16
  }
17
+ export declare const MODULUS_LIMBS_PER_RADIX: number[];
17
18
  //# sourceMappingURL=conversion.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"conversion.d.ts","sourceRoot":"","sources":["../../../../src/public/avm/opcodes/conversion.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAGpD,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,+CAA+C,CAAC;AAEpF,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,qBAAa,SAAU,SAAQ,WAAW;IAgBtC,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,WAAW;IACnB,OAAO,CAAC,cAAc;IACtB,OAAO,CAAC,gBAAgB;IACxB,OAAO,CAAC,SAAS;IApBnB,MAAM,CAAC,IAAI,EAAE,MAAM,CAAe;IAClC,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAoB;IAGlD,MAAM,CAAC,QAAQ,CAAC,UAAU,EAAE,WAAW,EAAE,CAQvC;gBAGQ,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,cAAc,EAAE,MAAM,EACtB,gBAAgB,EAAE,MAAM,EACxB,SAAS,EAAE,MAAM;IAKd,OAAO,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;CA+CzD"}
1
+ {"version":3,"file":"conversion.d.ts","sourceRoot":"","sources":["../../../../src/public/avm/opcodes/conversion.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAGpD,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,+CAA+C,CAAC;AAEpF,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,qBAAa,SAAU,SAAQ,WAAW;IAgBtC,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,WAAW;IACnB,OAAO,CAAC,cAAc;IACtB,OAAO,CAAC,gBAAgB;IACxB,OAAO,CAAC,SAAS;IApBnB,MAAM,CAAC,IAAI,EAAE,MAAM,CAAe;IAClC,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAoB;IAGlD,MAAM,CAAC,QAAQ,CAAC,UAAU,EAAE,WAAW,EAAE,CAQvC;gBAGQ,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,cAAc,EAAE,MAAM,EACtB,gBAAgB,EAAE,MAAM,EACxB,SAAS,EAAE,MAAM;IAKd,OAAO,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;CAqDzD;AAGD,eAAO,MAAM,uBAAuB,EAAE,MAAM,EAU3C,CAAC"}
@@ -28,6 +28,7 @@ export class ToRadixBE extends Instruction {
28
28
  async execute(context) {
29
29
  const memory = context.machineState.memory;
30
30
  const addressing = Addressing.fromWire(this.indirect);
31
+ context.machineState.consumeGas(this.baseGasCost(addressing.indirectOperandsCount(), addressing.relativeOperandsCount()));
31
32
  const operands = [
32
33
  this.srcOffset,
33
34
  this.radixOffset,
@@ -42,10 +43,10 @@ export class ToRadixBE extends Instruction {
42
43
  memory.checkTag(TypeTag.UINT32, numLimbsOffset);
43
44
  memory.checkTag(TypeTag.UINT1, outputBitsOffset);
44
45
  const numLimbs = memory.get(numLimbsOffset).toNumber();
45
- context.machineState.consumeGas(this.gasCost(numLimbs));
46
+ const radix = memory.get(radixOffset).toBigInt();
47
+ context.machineState.consumeGas(this.dynamicGasCost(Math.max(numLimbs, radix > 256n ? 32 : MODULUS_LIMBS_PER_RADIX[Number(radix)])));
46
48
  const outputBits = memory.get(outputBitsOffset).toNumber();
47
49
  let value = memory.get(srcOffset).toBigInt();
48
- const radix = memory.get(radixOffset).toBigInt();
49
50
  if (radix < 2 || radix > 256) {
50
51
  throw new InvalidToRadixInputsError(`ToRadixBE instruction's radix should be in range [2,256] (was ${radix}).`);
51
52
  }
@@ -67,3 +68,263 @@ export class ToRadixBE extends Instruction {
67
68
  memory.setSlice(dstOffset, res);
68
69
  }
69
70
  }
71
+ // First two are for radix = 0 and 1, which are invalid, so we have 0 limbs for those cases.
72
+ export const MODULUS_LIMBS_PER_RADIX = [
73
+ 0,
74
+ 0,
75
+ 254,
76
+ 161,
77
+ 127,
78
+ 110,
79
+ 99,
80
+ 91,
81
+ 85,
82
+ 81,
83
+ 77,
84
+ 74,
85
+ 71,
86
+ 69,
87
+ 67,
88
+ 65,
89
+ 64,
90
+ 63,
91
+ 61,
92
+ 60,
93
+ 59,
94
+ 58,
95
+ 57,
96
+ 57,
97
+ 56,
98
+ 55,
99
+ 54,
100
+ 54,
101
+ 53,
102
+ 53,
103
+ 52,
104
+ 52,
105
+ 51,
106
+ 51,
107
+ 50,
108
+ 50,
109
+ 50,
110
+ 49,
111
+ 49,
112
+ 48,
113
+ 48,
114
+ 48,
115
+ 48,
116
+ 47,
117
+ 47,
118
+ 47,
119
+ 46,
120
+ 46,
121
+ 46,
122
+ 46,
123
+ 45,
124
+ 45,
125
+ 45,
126
+ 45,
127
+ 45,
128
+ 44,
129
+ 44,
130
+ 44,
131
+ 44,
132
+ 44,
133
+ 43,
134
+ 43,
135
+ 43,
136
+ 43,
137
+ 43,
138
+ 43,
139
+ 42,
140
+ 42,
141
+ 42,
142
+ 42,
143
+ 42,
144
+ 42,
145
+ 42,
146
+ 41,
147
+ 41,
148
+ 41,
149
+ 41,
150
+ 41,
151
+ 41,
152
+ 41,
153
+ 41,
154
+ 41,
155
+ 40,
156
+ 40,
157
+ 40,
158
+ 40,
159
+ 40,
160
+ 40,
161
+ 40,
162
+ 40,
163
+ 40,
164
+ 39,
165
+ 39,
166
+ 39,
167
+ 39,
168
+ 39,
169
+ 39,
170
+ 39,
171
+ 39,
172
+ 39,
173
+ 39,
174
+ 39,
175
+ 39,
176
+ 38,
177
+ 38,
178
+ 38,
179
+ 38,
180
+ 38,
181
+ 38,
182
+ 38,
183
+ 38,
184
+ 38,
185
+ 38,
186
+ 38,
187
+ 38,
188
+ 38,
189
+ 37,
190
+ 37,
191
+ 37,
192
+ 37,
193
+ 37,
194
+ 37,
195
+ 37,
196
+ 37,
197
+ 37,
198
+ 37,
199
+ 37,
200
+ 37,
201
+ 37,
202
+ 37,
203
+ 37,
204
+ 37,
205
+ 36,
206
+ 36,
207
+ 36,
208
+ 36,
209
+ 36,
210
+ 36,
211
+ 36,
212
+ 36,
213
+ 36,
214
+ 36,
215
+ 36,
216
+ 36,
217
+ 36,
218
+ 36,
219
+ 36,
220
+ 36,
221
+ 36,
222
+ 36,
223
+ 36,
224
+ 36,
225
+ 35,
226
+ 35,
227
+ 35,
228
+ 35,
229
+ 35,
230
+ 35,
231
+ 35,
232
+ 35,
233
+ 35,
234
+ 35,
235
+ 35,
236
+ 35,
237
+ 35,
238
+ 35,
239
+ 35,
240
+ 35,
241
+ 35,
242
+ 35,
243
+ 35,
244
+ 35,
245
+ 35,
246
+ 35,
247
+ 35,
248
+ 35,
249
+ 34,
250
+ 34,
251
+ 34,
252
+ 34,
253
+ 34,
254
+ 34,
255
+ 34,
256
+ 34,
257
+ 34,
258
+ 34,
259
+ 34,
260
+ 34,
261
+ 34,
262
+ 34,
263
+ 34,
264
+ 34,
265
+ 34,
266
+ 34,
267
+ 34,
268
+ 34,
269
+ 34,
270
+ 34,
271
+ 34,
272
+ 34,
273
+ 34,
274
+ 34,
275
+ 34,
276
+ 34,
277
+ 34,
278
+ 34,
279
+ 33,
280
+ 33,
281
+ 33,
282
+ 33,
283
+ 33,
284
+ 33,
285
+ 33,
286
+ 33,
287
+ 33,
288
+ 33,
289
+ 33,
290
+ 33,
291
+ 33,
292
+ 33,
293
+ 33,
294
+ 33,
295
+ 33,
296
+ 33,
297
+ 33,
298
+ 33,
299
+ 33,
300
+ 33,
301
+ 33,
302
+ 33,
303
+ 33,
304
+ 33,
305
+ 33,
306
+ 33,
307
+ 33,
308
+ 33,
309
+ 33,
310
+ 33,
311
+ 33,
312
+ 33,
313
+ 33,
314
+ 33,
315
+ 33,
316
+ 33,
317
+ 32,
318
+ 32,
319
+ 32,
320
+ 32,
321
+ 32,
322
+ 32,
323
+ 32,
324
+ 32,
325
+ 32,
326
+ 32,
327
+ 32,
328
+ 32,
329
+ 32
330
+ ];
@@ -1 +1 @@
1
- {"version":3,"file":"ec_add.d.ts","sourceRoot":"","sources":["../../../../src/public/avm/opcodes/ec_add.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAEpD,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,+CAA+C,CAAC;AAEpF,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,qBAAa,KAAM,SAAQ,WAAW;IAkBlC,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,kBAAkB;IAC1B,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,kBAAkB;IAC1B,OAAO,CAAC,SAAS;IAxBnB,MAAM,CAAC,IAAI,EAAE,MAAM,CAAW;IAC9B,MAAM,CAAC,QAAQ,CAAC,MAAM,gBAAgB;IAGtC,MAAM,CAAC,QAAQ,CAAC,UAAU,EAAE,WAAW,EAAE,CAUvC;gBAGQ,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,kBAAkB,EAAE,MAAM,EAC1B,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,kBAAkB,EAAE,MAAM,EAC1B,SAAS,EAAE,MAAM;IAKd,OAAO,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;CAsDzD"}
1
+ {"version":3,"file":"ec_add.d.ts","sourceRoot":"","sources":["../../../../src/public/avm/opcodes/ec_add.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAEpD,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,+CAA+C,CAAC;AAEpF,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,qBAAa,KAAM,SAAQ,WAAW;IAkBlC,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,kBAAkB;IAC1B,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,kBAAkB;IAC1B,OAAO,CAAC,SAAS;IAxBnB,MAAM,CAAC,IAAI,EAAE,MAAM,CAAW;IAC9B,MAAM,CAAC,QAAQ,CAAC,MAAM,gBAAgB;IAGtC,MAAM,CAAC,QAAQ,CAAC,UAAU,EAAE,WAAW,EAAE,CAUvC;gBAGQ,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,kBAAkB,EAAE,MAAM,EAC1B,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,kBAAkB,EAAE,MAAM,EAC1B,SAAS,EAAE,MAAM;IAKd,OAAO,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;CAwDzD"}
@@ -33,7 +33,7 @@ export class EcAdd extends Instruction {
33
33
  async execute(context) {
34
34
  const memory = context.machineState.memory;
35
35
  const addressing = Addressing.fromWire(this.indirect);
36
- context.machineState.consumeGas(this.gasCost());
36
+ context.machineState.consumeGas(this.baseGasCost(addressing.indirectOperandsCount(), addressing.relativeOperandsCount()));
37
37
  const operands = [
38
38
  this.p1XOffset,
39
39
  this.p1YOffset,
@@ -1 +1 @@
1
- {"version":3,"file":"environment_getters.d.ts","sourceRoot":"","sources":["../../../../src/public/avm/opcodes/environment_getters.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAGpD,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,+CAA+C,CAAC;AAEpF,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,oBAAY,mBAAmB;IAC7B,OAAO,IAAA;IACP,MAAM,IAAA;IACN,cAAc,IAAA;IACd,OAAO,IAAA;IACP,OAAO,IAAA;IACP,WAAW,IAAA;IACX,SAAS,IAAA;IACT,WAAW,IAAA;IACX,WAAW,IAAA;IACX,YAAY,IAAA;IACZ,SAAS,KAAA;IACT,SAAS,KAAA;CACV;AAiCD,qBAAa,SAAU,SAAQ,WAAW;IAWtC,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,OAAO;IAZjB,gBAAuB,IAAI,EAAE,MAAM,CAAe;IAClD,gBAAuB,MAAM,EAAE,MAAM,CAAuB;IAC5D,MAAM,CAAC,QAAQ,CAAC,YAAY,EAAE,WAAW,EAAE,CAKzC;gBAGQ,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM;IAKZ,OAAO,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;CAezD"}
1
+ {"version":3,"file":"environment_getters.d.ts","sourceRoot":"","sources":["../../../../src/public/avm/opcodes/environment_getters.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAGpD,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,+CAA+C,CAAC;AAEpF,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,oBAAY,mBAAmB;IAC7B,OAAO,IAAA;IACP,MAAM,IAAA;IACN,cAAc,IAAA;IACd,OAAO,IAAA;IACP,OAAO,IAAA;IACP,WAAW,IAAA;IACX,SAAS,IAAA;IACT,WAAW,IAAA;IACX,WAAW,IAAA;IACX,YAAY,IAAA;IACZ,SAAS,KAAA;IACT,SAAS,KAAA;CACV;AAiCD,qBAAa,SAAU,SAAQ,WAAW;IAWtC,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,OAAO;IAZjB,gBAAuB,IAAI,EAAE,MAAM,CAAe;IAClD,gBAAuB,MAAM,EAAE,MAAM,CAAuB;IAC5D,MAAM,CAAC,QAAQ,CAAC,YAAY,EAAE,WAAW,EAAE,CAKzC;gBAGQ,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM;IAKZ,OAAO,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;CAiBzD"}
@@ -66,7 +66,7 @@ export class GetEnvVar extends Instruction {
66
66
  async execute(context) {
67
67
  const memory = context.machineState.memory;
68
68
  const addressing = Addressing.fromWire(this.indirect);
69
- context.machineState.consumeGas(this.gasCost());
69
+ context.machineState.consumeGas(this.baseGasCost(addressing.indirectOperandsCount(), addressing.relativeOperandsCount()));
70
70
  if (!(this.varEnum in EnvironmentVariable)) {
71
71
  throw new InstructionExecutionError(`Invalid GETENVVAR var enum ${this.varEnum}`);
72
72
  }
@@ -1 +1 @@
1
- {"version":3,"file":"external_calls.d.ts","sourceRoot":"","sources":["../../../../src/public/avm/opcodes/external_calls.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAGpD,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,+CAA+C,CAAC;AAEpF,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,uBAAe,YAAa,SAAQ,WAAW;IAa3C,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,WAAW;IACnB,OAAO,CAAC,WAAW;IACnB,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,cAAc;IACtB,OAAO,CAAC,UAAU;IAhBpB,MAAM,CAAC,QAAQ,CAAC,UAAU,EAAE,WAAW,EAAE,CAQvC;gBAGQ,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,EAClB,cAAc,EAAE,MAAM,EACtB,UAAU,EAAE,MAAM;IAKf,OAAO,CAAC,OAAO,EAAE,UAAU;IA2ExC,aAA6B,IAAI,IAAI,MAAM,GAAG,YAAY,CAAC;CAC5D;AAED,qBAAa,IAAK,SAAQ,YAAY;IACpC,MAAM,CAAC,IAAI,EAAG,MAAM,CAAU;IAC9B,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAe;IAE7C,IAAW,IAAI,WAEd;CACF;AAED,qBAAa,UAAW,SAAQ,YAAY;IAC1C,MAAM,CAAC,IAAI,EAAG,YAAY,CAAU;IACpC,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAqB;IAEnD,IAAW,IAAI,iBAEd;CACF;AAED,qBAAa,WAAY,SAAQ,WAAW;IAWxC,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,SAAS;IAXnB,MAAM,CAAC,IAAI,EAAE,MAAM,CAAiB;IACpC,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAsB;IAEpD,MAAM,CAAC,QAAQ,CAAC,UAAU,EAAE,WAAW,EAAE,CAIvC;gBAGQ,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM;IAKd,OAAO,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;CAazD;AAED,qBAAa,MAAO,SAAQ,WAAW;IAYnC,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,gBAAgB;IACxB,OAAO,CAAC,YAAY;IAbtB,MAAM,CAAC,IAAI,EAAE,MAAM,CAAY;IAC/B,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAiB;IAE/C,MAAM,CAAC,QAAQ,CAAC,UAAU,EAAE,WAAW,EAAE,CAKvC;gBAGQ,QAAQ,EAAE,MAAM,EAChB,gBAAgB,EAAE,MAAM,EACxB,YAAY,EAAE,MAAM;IAKjB,OAAO,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAgBxC,SAAS,IAAI,OAAO;CAGrC;AAED,qBAAa,MAAO,SAAQ,WAAW;IAkBnC,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,aAAa;IACrB,OAAO,CAAC,YAAY;IAnBtB,MAAM,CAAC,IAAI,EAAE,MAAM,CAAY;IAC/B,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAmB;IAEjD,MAAM,CAAC,QAAQ,CAAC,WAAW,EAAE,WAAW,EAAE,CAKxC;IACF,MAAM,CAAC,QAAQ,CAAC,YAAY,EAAE,WAAW,EAAE,CAKzC;gBAGQ,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,MAAM,EACrB,YAAY,EAAE,MAAM;IAKjB,OAAO,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAiBxC,SAAS,IAAI,OAAO;CAGrC"}
1
+ {"version":3,"file":"external_calls.d.ts","sourceRoot":"","sources":["../../../../src/public/avm/opcodes/external_calls.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAGpD,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,+CAA+C,CAAC;AAEpF,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,uBAAe,YAAa,SAAQ,WAAW;IAa3C,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,WAAW;IACnB,OAAO,CAAC,WAAW;IACnB,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,cAAc;IACtB,OAAO,CAAC,UAAU;IAhBpB,MAAM,CAAC,QAAQ,CAAC,UAAU,EAAE,WAAW,EAAE,CAQvC;gBAGQ,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,EAClB,cAAc,EAAE,MAAM,EACtB,UAAU,EAAE,MAAM;IAKf,OAAO,CAAC,OAAO,EAAE,UAAU;IA6ExC,aAA6B,IAAI,IAAI,MAAM,GAAG,YAAY,CAAC;CAC5D;AAED,qBAAa,IAAK,SAAQ,YAAY;IACpC,MAAM,CAAC,IAAI,EAAG,MAAM,CAAU;IAC9B,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAe;IAE7C,IAAW,IAAI,WAEd;CACF;AAED,qBAAa,UAAW,SAAQ,YAAY;IAC1C,MAAM,CAAC,IAAI,EAAG,YAAY,CAAU;IACpC,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAqB;IAEnD,IAAW,IAAI,iBAEd;CACF;AAED,qBAAa,WAAY,SAAQ,WAAW;IAWxC,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,SAAS;IAXnB,MAAM,CAAC,IAAI,EAAE,MAAM,CAAiB;IACpC,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAsB;IAEpD,MAAM,CAAC,QAAQ,CAAC,UAAU,EAAE,WAAW,EAAE,CAIvC;gBAGQ,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM;IAKd,OAAO,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;CAazD;AAED,qBAAa,MAAO,SAAQ,WAAW;IAYnC,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,gBAAgB;IACxB,OAAO,CAAC,YAAY;IAbtB,MAAM,CAAC,IAAI,EAAE,MAAM,CAAY;IAC/B,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAiB;IAE/C,MAAM,CAAC,QAAQ,CAAC,UAAU,EAAE,WAAW,EAAE,CAKvC;gBAGQ,QAAQ,EAAE,MAAM,EAChB,gBAAgB,EAAE,MAAM,EACxB,YAAY,EAAE,MAAM;IAKjB,OAAO,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAmBxC,SAAS,IAAI,OAAO;CAGrC;AAED,qBAAa,MAAO,SAAQ,WAAW;IAkBnC,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,aAAa;IACrB,OAAO,CAAC,YAAY;IAnBtB,MAAM,CAAC,IAAI,EAAE,MAAM,CAAY;IAC/B,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAmB;IAEjD,MAAM,CAAC,QAAQ,CAAC,WAAW,EAAE,WAAW,EAAE,CAKxC;IACF,MAAM,CAAC,QAAQ,CAAC,YAAY,EAAE,WAAW,EAAE,CAKzC;gBAGQ,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,MAAM,EACrB,YAAY,EAAE,MAAM;IAKjB,OAAO,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAoBxC,SAAS,IAAI,OAAO;CAGrC"}
@@ -25,6 +25,7 @@ class ExternalCall extends Instruction {
25
25
  async execute(context) {
26
26
  const memory = context.machineState.memory;
27
27
  const addressing = Addressing.fromWire(this.indirect);
28
+ context.machineState.consumeGas(this.baseGasCost(addressing.indirectOperandsCount(), addressing.relativeOperandsCount()));
28
29
  const operands = [
29
30
  this.l2GasOffset,
30
31
  this.daGasOffset,
@@ -33,9 +34,8 @@ class ExternalCall extends Instruction {
33
34
  this.argsOffset
34
35
  ];
35
36
  const [l2GasOffset, daGasOffset, addrOffset, argsSizeOffset, argsOffset] = addressing.resolve(operands, memory);
36
- // TODO: Should be U32
37
- memory.checkTags(TypeTag.FIELD, l2GasOffset);
38
- memory.checkTags(TypeTag.FIELD, daGasOffset);
37
+ memory.checkTags(TypeTag.UINT32, l2GasOffset);
38
+ memory.checkTags(TypeTag.UINT32, daGasOffset);
39
39
  memory.checkTag(TypeTag.FIELD, addrOffset);
40
40
  memory.checkTag(TypeTag.UINT32, argsSizeOffset);
41
41
  const calldataSize = memory.get(argsSizeOffset).toNumber();
@@ -44,9 +44,7 @@ class ExternalCall extends Instruction {
44
44
  const callAddress = memory.getAs(addrOffset);
45
45
  // If we are already in a static call, we propagate the environment.
46
46
  const callType = context.environment.isStaticCall ? 'STATICCALL' : this.type;
47
- // First we consume the gas for this operation.
48
- context.machineState.consumeGas(this.gasCost(calldataSize));
49
- // Then we consume the gas allocated for the nested call. The excess will be refunded later.
47
+ // We consume the gas allocated for the nested call. The excess will be refunded later.
50
48
  // Gas allocation is capped by the amount of gas left in the current context.
51
49
  // We have to do some dancing here because the gas allocation is a field,
52
50
  // but in the machine state we track gas as a number.
@@ -150,6 +148,7 @@ export class Return extends Instruction {
150
148
  async execute(context) {
151
149
  const memory = context.machineState.memory;
152
150
  const addressing = Addressing.fromWire(this.indirect);
151
+ context.machineState.consumeGas(this.baseGasCost(addressing.indirectOperandsCount(), addressing.relativeOperandsCount()));
153
152
  const operands = [
154
153
  this.returnSizeOffset,
155
154
  this.returnOffset
@@ -157,7 +156,6 @@ export class Return extends Instruction {
157
156
  const [returnSizeOffset, returnOffset] = addressing.resolve(operands, memory);
158
157
  memory.checkTag(TypeTag.UINT32, returnSizeOffset);
159
158
  const returnSize = memory.get(returnSizeOffset).toNumber();
160
- context.machineState.consumeGas(this.gasCost(returnSize));
161
159
  const output = memory.getSlice(returnOffset, returnSize).map((word)=>word.toFr());
162
160
  context.machineState.return(output);
163
161
  }
@@ -189,6 +187,7 @@ export class Revert extends Instruction {
189
187
  async execute(context) {
190
188
  const memory = context.machineState.memory;
191
189
  const addressing = Addressing.fromWire(this.indirect);
190
+ context.machineState.consumeGas(this.baseGasCost(addressing.indirectOperandsCount(), addressing.relativeOperandsCount()));
192
191
  const operands = [
193
192
  this.retSizeOffset,
194
193
  this.returnOffset
@@ -196,7 +195,6 @@ export class Revert extends Instruction {
196
195
  const [retSizeOffset, returnOffset] = addressing.resolve(operands, memory);
197
196
  memory.checkTag(TypeTag.UINT32, retSizeOffset);
198
197
  const retSize = memory.get(retSizeOffset).toNumber();
199
- context.machineState.consumeGas(this.gasCost(retSize));
200
198
  const output = memory.getSlice(returnOffset, retSize).map((word)=>word.toFr());
201
199
  context.machineState.revert(output);
202
200
  }
@@ -1 +1 @@
1
- {"version":3,"file":"hashing.d.ts","sourceRoot":"","sources":["../../../../src/public/avm/opcodes/hashing.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAEpD,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,+CAA+C,CAAC;AAEpF,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,qBAAa,SAAU,SAAQ,WAAW;IActC,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,gBAAgB;IACxB,OAAO,CAAC,iBAAiB;IAf3B,MAAM,CAAC,IAAI,EAAE,MAAM,CAAe;IAClC,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAoB;IAClD,MAAM,CAAC,QAAQ,CAAC,SAAS,KAAK;IAG9B,MAAM,CAAC,QAAQ,CAAC,UAAU,EAAE,WAAW,EAAE,CAKvC;gBAGQ,QAAQ,EAAE,MAAM,EAChB,gBAAgB,EAAE,MAAM,EACxB,iBAAiB,EAAE,MAAM;IAKtB,OAAO,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;CAmBzD;AAED,qBAAa,WAAY,SAAQ,WAAW;IAaxC,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,WAAW;IAdrB,MAAM,CAAC,IAAI,EAAE,MAAM,CAAiB;IACpC,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAsB;IAGpD,MAAM,CAAC,QAAQ,CAAC,UAAU,EAAE,WAAW,EAAE,CAKvC;gBAGQ,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM;IAMhB,OAAO,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;CAiBzD;AAED,qBAAa,iBAAkB,SAAQ,WAAW;IAc9C,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,YAAY;IACpB,OAAO,CAAC,WAAW;IACnB,OAAO,CAAC,YAAY;IAhBtB,MAAM,CAAC,IAAI,EAAE,MAAM,CAAuB;IAC1C,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAA4B;IAG1D,MAAM,CAAC,QAAQ,CAAC,UAAU,EAAE,WAAW,EAAE,CAMvC;gBAGQ,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,EACpB,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM;IAKjB,OAAO,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;CAwBzD"}
1
+ {"version":3,"file":"hashing.d.ts","sourceRoot":"","sources":["../../../../src/public/avm/opcodes/hashing.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAEpD,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,+CAA+C,CAAC;AAEpF,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,qBAAa,SAAU,SAAQ,WAAW;IActC,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,gBAAgB;IACxB,OAAO,CAAC,iBAAiB;IAf3B,MAAM,CAAC,IAAI,EAAE,MAAM,CAAe;IAClC,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAoB;IAClD,MAAM,CAAC,QAAQ,CAAC,SAAS,KAAK;IAG9B,MAAM,CAAC,QAAQ,CAAC,UAAU,EAAE,WAAW,EAAE,CAKvC;gBAGQ,QAAQ,EAAE,MAAM,EAChB,gBAAgB,EAAE,MAAM,EACxB,iBAAiB,EAAE,MAAM;IAKtB,OAAO,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;CAqBzD;AAED,qBAAa,WAAY,SAAQ,WAAW;IAaxC,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,WAAW;IAdrB,MAAM,CAAC,IAAI,EAAE,MAAM,CAAiB;IACpC,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAsB;IAGpD,MAAM,CAAC,QAAQ,CAAC,UAAU,EAAE,WAAW,EAAE,CAKvC;gBAGQ,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM;IAMhB,OAAO,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;CAoBzD;AAED,qBAAa,iBAAkB,SAAQ,WAAW;IAc9C,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,YAAY;IACpB,OAAO,CAAC,WAAW;IACnB,OAAO,CAAC,YAAY;IAhBtB,MAAM,CAAC,IAAI,EAAE,MAAM,CAAuB;IAC1C,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAA4B;IAG1D,MAAM,CAAC,QAAQ,CAAC,UAAU,EAAE,WAAW,EAAE,CAMvC;gBAGQ,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,EACpB,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM;IAKjB,OAAO,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;CA2BzD"}
@@ -23,7 +23,7 @@ export class Poseidon2 extends Instruction {
23
23
  async execute(context) {
24
24
  const memory = context.machineState.memory;
25
25
  const addressing = Addressing.fromWire(this.indirect);
26
- context.machineState.consumeGas(this.gasCost());
26
+ context.machineState.consumeGas(this.baseGasCost(addressing.indirectOperandsCount(), addressing.relativeOperandsCount()));
27
27
  const operands = [
28
28
  this.inputStateOffset,
29
29
  this.outputStateOffset
@@ -56,12 +56,12 @@ export class KeccakF1600 extends Instruction {
56
56
  const inputSize = 25;
57
57
  const memory = context.machineState.memory;
58
58
  const addressing = Addressing.fromWire(this.indirect);
59
+ context.machineState.consumeGas(this.baseGasCost(addressing.indirectOperandsCount(), addressing.relativeOperandsCount()));
59
60
  const operands = [
60
61
  this.dstOffset,
61
62
  this.inputOffset
62
63
  ];
63
64
  const [dstOffset, inputOffset] = addressing.resolve(operands, memory);
64
- context.machineState.consumeGas(this.gasCost());
65
65
  const stateData = memory.getSlice(inputOffset, inputSize).map((word)=>word.toBigInt());
66
66
  memory.checkTagsRange(TypeTag.UINT64, inputOffset, inputSize);
67
67
  const updatedState = keccakf1600(stateData);
@@ -92,6 +92,7 @@ export class Sha256Compression extends Instruction {
92
92
  const INPUTS_SIZE = 16;
93
93
  const memory = context.machineState.memory;
94
94
  const addressing = Addressing.fromWire(this.indirect);
95
+ context.machineState.consumeGas(this.baseGasCost(addressing.indirectOperandsCount(), addressing.relativeOperandsCount()));
95
96
  const operands = [
96
97
  this.outputOffset,
97
98
  this.stateOffset,
@@ -99,7 +100,6 @@ export class Sha256Compression extends Instruction {
99
100
  ];
100
101
  const [outputOffset, stateOffset, inputsOffset] = addressing.resolve(operands, memory);
101
102
  // Note: size of output is same as size of state
102
- context.machineState.consumeGas(this.gasCost());
103
103
  const inputs = Uint32Array.from(memory.getSlice(inputsOffset, INPUTS_SIZE).map((word)=>word.toNumber()));
104
104
  const state = Uint32Array.from(memory.getSlice(stateOffset, STATE_SIZE).map((word)=>word.toNumber()));
105
105
  memory.checkTagsRange(TypeTag.UINT32, inputsOffset, INPUTS_SIZE);