@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.
- package/dest/public/avm/avm_gas.d.ts +4 -5
- package/dest/public/avm/avm_gas.d.ts.map +1 -1
- package/dest/public/avm/avm_gas.js +29 -19
- package/dest/public/avm/fixtures/utils.js +1 -1
- package/dest/public/avm/opcodes/accrued_substate.d.ts.map +1 -1
- package/dest/public/avm/opcodes/accrued_substate.js +8 -7
- package/dest/public/avm/opcodes/addressing_mode.d.ts +2 -0
- package/dest/public/avm/opcodes/addressing_mode.d.ts.map +1 -1
- package/dest/public/avm/opcodes/addressing_mode.js +6 -0
- package/dest/public/avm/opcodes/arithmetic.d.ts.map +1 -1
- package/dest/public/avm/opcodes/arithmetic.js +1 -1
- package/dest/public/avm/opcodes/bitwise.d.ts +5 -1
- package/dest/public/avm/opcodes/bitwise.d.ts.map +1 -1
- package/dest/public/avm/opcodes/bitwise.js +17 -2
- package/dest/public/avm/opcodes/comparators.d.ts.map +1 -1
- package/dest/public/avm/opcodes/comparators.js +1 -1
- package/dest/public/avm/opcodes/contract.d.ts.map +1 -1
- package/dest/public/avm/opcodes/contract.js +1 -1
- package/dest/public/avm/opcodes/control_flow.d.ts.map +1 -1
- package/dest/public/avm/opcodes/control_flow.js +4 -4
- package/dest/public/avm/opcodes/conversion.d.ts +1 -0
- package/dest/public/avm/opcodes/conversion.d.ts.map +1 -1
- package/dest/public/avm/opcodes/conversion.js +263 -2
- package/dest/public/avm/opcodes/ec_add.d.ts.map +1 -1
- package/dest/public/avm/opcodes/ec_add.js +1 -1
- package/dest/public/avm/opcodes/environment_getters.d.ts.map +1 -1
- package/dest/public/avm/opcodes/environment_getters.js +1 -1
- package/dest/public/avm/opcodes/external_calls.d.ts.map +1 -1
- package/dest/public/avm/opcodes/external_calls.js +6 -8
- package/dest/public/avm/opcodes/hashing.d.ts.map +1 -1
- package/dest/public/avm/opcodes/hashing.js +3 -3
- package/dest/public/avm/opcodes/instruction.d.ts +9 -3
- package/dest/public/avm/opcodes/instruction.d.ts.map +1 -1
- package/dest/public/avm/opcodes/instruction.js +12 -7
- package/dest/public/avm/opcodes/memory.d.ts.map +1 -1
- package/dest/public/avm/opcodes/memory.js +8 -6
- package/dest/public/avm/opcodes/misc.js +1 -3
- package/dest/public/avm/opcodes/storage.d.ts.map +1 -1
- package/dest/public/avm/opcodes/storage.js +5 -3
- package/dest/public/fixtures/index.d.ts +1 -0
- package/dest/public/fixtures/index.d.ts.map +1 -1
- package/dest/public/fixtures/index.js +1 -0
- package/dest/public/fixtures/minimal_public_tx.d.ts +9 -0
- package/dest/public/fixtures/minimal_public_tx.d.ts.map +1 -0
- package/dest/public/fixtures/minimal_public_tx.js +43 -0
- package/dest/public/fixtures/utils.js +3 -3
- package/dest/public/hinting_db_sources.d.ts +3 -0
- package/dest/public/hinting_db_sources.d.ts.map +1 -1
- package/dest/public/hinting_db_sources.js +9 -0
- package/dest/public/index.d.ts +2 -1
- package/dest/public/index.d.ts.map +1 -1
- package/dest/public/index.js +2 -1
- package/dest/public/public_db_sources.d.ts.map +1 -1
- package/dest/public/public_db_sources.js +2 -2
- package/dest/public/public_processor/guarded_merkle_tree.d.ts +44 -0
- package/dest/public/public_processor/guarded_merkle_tree.d.ts.map +1 -0
- package/dest/public/public_processor/guarded_merkle_tree.js +105 -0
- package/dest/public/public_processor/public_processor.d.ts +6 -16
- package/dest/public/public_processor/public_processor.d.ts.map +1 -1
- package/dest/public/public_processor/public_processor.js +32 -16
- package/dest/public/public_tx_simulator/public_tx_context.d.ts +3 -1
- package/dest/public/public_tx_simulator/public_tx_context.d.ts.map +1 -1
- package/dest/public/public_tx_simulator/public_tx_context.js +18 -15
- package/dest/public/public_tx_simulator/public_tx_simulator.d.ts.map +1 -1
- package/dest/public/public_tx_simulator/public_tx_simulator.js +0 -3
- package/dest/public/side_effect_trace.d.ts +4 -1
- package/dest/public/side_effect_trace.d.ts.map +1 -1
- package/dest/public/side_effect_trace.js +13 -2
- package/dest/public/side_effect_trace_interface.d.ts +1 -0
- package/dest/public/side_effect_trace_interface.d.ts.map +1 -1
- package/dest/public/state_manager/state_manager.d.ts +1 -0
- package/dest/public/state_manager/state_manager.d.ts.map +1 -1
- package/dest/public/state_manager/state_manager.js +3 -0
- package/package.json +15 -15
- package/src/public/avm/avm_gas.ts +21 -15
- package/src/public/avm/fixtures/utils.ts +1 -1
- package/src/public/avm/opcodes/accrued_substate.ts +23 -7
- package/src/public/avm/opcodes/addressing_mode.ts +8 -0
- package/src/public/avm/opcodes/arithmetic.ts +3 -1
- package/src/public/avm/opcodes/bitwise.ts +26 -2
- package/src/public/avm/opcodes/comparators.ts +3 -1
- package/src/public/avm/opcodes/contract.ts +3 -1
- package/src/public/avm/opcodes/control_flow.ts +6 -4
- package/src/public/avm/opcodes/conversion.ts +21 -2
- package/src/public/avm/opcodes/ec_add.ts +3 -1
- package/src/public/avm/opcodes/environment_getters.ts +3 -1
- package/src/public/avm/opcodes/external_calls.ts +16 -8
- package/src/public/avm/opcodes/hashing.ts +11 -3
- package/src/public/avm/opcodes/instruction.ts +14 -7
- package/src/public/avm/opcodes/memory.ts +23 -6
- package/src/public/avm/opcodes/misc.ts +4 -4
- package/src/public/avm/opcodes/storage.ts +13 -3
- package/src/public/fixtures/index.ts +1 -0
- package/src/public/fixtures/minimal_public_tx.ts +57 -0
- package/src/public/fixtures/utils.ts +3 -3
- package/src/public/hinting_db_sources.ts +15 -0
- package/src/public/index.ts +2 -1
- package/src/public/public_db_sources.ts +3 -13
- package/src/public/public_processor/guarded_merkle_tree.ts +148 -0
- package/src/public/public_processor/public_processor.ts +47 -34
- package/src/public/public_tx_simulator/public_tx_context.ts +39 -20
- package/src/public/public_tx_simulator/public_tx_simulator.ts +0 -3
- package/src/public/side_effect_trace.ts +13 -0
- package/src/public/side_effect_trace_interface.ts +1 -0
- package/src/public/state_manager/state_manager.ts +4 -0
|
@@ -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
|
-
|
|
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;
|
|
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.
|
|
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;
|
|
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.
|
|
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;
|
|
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
|
-
|
|
37
|
-
memory.checkTags(TypeTag.
|
|
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
|
-
//
|
|
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;
|
|
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.
|
|
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);
|
|
@@ -49,10 +49,16 @@ export declare abstract class Instruction {
|
|
|
49
49
|
fromBuffer: (buf: BufferCursor | Buffer) => Instruction;
|
|
50
50
|
};
|
|
51
51
|
/**
|
|
52
|
-
*
|
|
53
|
-
* @returns
|
|
52
|
+
* Returns the base gas cost for the instruction.
|
|
53
|
+
* @returns The base gas cost.
|
|
54
54
|
*/
|
|
55
|
-
protected
|
|
55
|
+
protected baseGasCost(indirectOperandsCount: number, relativeOperandsCount: number): Gas;
|
|
56
|
+
/**
|
|
57
|
+
* Computes the dynamic gas cost for the instruction
|
|
58
|
+
* @param dynMultiplier - The multiplier for the dynamic gas cost.
|
|
59
|
+
* @returns The dynamic gas cost.
|
|
60
|
+
*/
|
|
61
|
+
protected dynamicGasCost(dynMultiplier?: number): Gas;
|
|
56
62
|
/**
|
|
57
63
|
* Returns the stringified type of the instruction.
|
|
58
64
|
* Instruction sub-classes should have a static `type` property.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"instruction.d.ts","sourceRoot":"","sources":["../../../../src/public/avm/opcodes/instruction.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAI9D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,KAAK,GAAG,
|
|
1
|
+
{"version":3,"file":"instruction.d.ts","sourceRoot":"","sources":["../../../../src/public/avm/opcodes/instruction.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAI9D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,KAAK,GAAG,EAA4E,MAAM,eAAe,CAAC;AACnH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AACtE,OAAO,EAAE,MAAM,EAAE,KAAK,WAAW,EAA4B,MAAM,+CAA+C,CAAC;AAEnH,KAAK,sBAAsB,GAAG;IAC5B,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,WAAW,CAAC;CACnC,CAAC;AAEF;;;GAGG;AACH,8BAAsB,WAAW;IAC/B;;;;OAIG;aACa,OAAO,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAE3D;;OAEG;IACI,SAAS,IAAI,OAAO;IAI3B;;;;OAIG;IACI,QAAQ,IAAI,MAAM;WAUX,UAAU,CACtB,IAAI,EAAE,sBAAsB,GAAG;QAAE,UAAU,EAAE,WAAW,EAAE,CAAC;QAAC,EAAE,EAAE,GAAG,CAAA;KAAE,EACrE,GAAG,EAAE,YAAY,GAAG,MAAM,GACzB,WAAW;IAKP,QAAQ,IAAI,MAAM;IAOzB;;;;;OAKG;IACI,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,GAAG,WAAW,GAAG,UAAU;IAS9E;;;;;OAKG;WACW,EAAE,CAAC,IAAI,EAAE,sBAAsB,EAAE,UAAU,EAAE,WAAW,EAAE;0BAElD,YAAY,GAAG,MAAM,KAAG,WAAW;;IAQzD;;;OAGG;IACH,SAAS,CAAC,WAAW,CAAC,qBAAqB,EAAE,MAAM,EAAE,qBAAqB,EAAE,MAAM,GAAG,GAAG;IAIxF;;;;OAIG;IACH,SAAS,CAAC,cAAc,CAAC,aAAa,GAAE,MAAU,GAAG,GAAG;IAIxD;;;OAGG;IACH,IAAW,IAAI,IAAI,MAAM,CAMxB;IAED;;;OAGG;IACH,IAAW,MAAM,IAAI,MAAM,CAM1B;CACF"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { strict as assert } from 'assert';
|
|
2
|
-
import { getBaseGasCost, getDynamicGasCost, mulGas, sumGas } from '../avm_gas.js';
|
|
2
|
+
import { computeAddressingCost, getBaseGasCost, getDynamicGasCost, mulGas, sumGas } from '../avm_gas.js';
|
|
3
3
|
import { Opcode, deserialize, serializeAs } from '../serialization/instruction_serialization.js';
|
|
4
4
|
/**
|
|
5
5
|
* Parent class for all AVM instructions.
|
|
@@ -61,12 +61,17 @@ import { Opcode, deserialize, serializeAs } from '../serialization/instruction_s
|
|
|
61
61
|
});
|
|
62
62
|
}
|
|
63
63
|
/**
|
|
64
|
-
*
|
|
65
|
-
* @returns
|
|
66
|
-
*/
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
64
|
+
* Returns the base gas cost for the instruction.
|
|
65
|
+
* @returns The base gas cost.
|
|
66
|
+
*/ baseGasCost(indirectOperandsCount, relativeOperandsCount) {
|
|
67
|
+
return sumGas(getBaseGasCost(this.opcode), computeAddressingCost(indirectOperandsCount, relativeOperandsCount));
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Computes the dynamic gas cost for the instruction
|
|
71
|
+
* @param dynMultiplier - The multiplier for the dynamic gas cost.
|
|
72
|
+
* @returns The dynamic gas cost.
|
|
73
|
+
*/ dynamicGasCost(dynMultiplier = 0) {
|
|
74
|
+
return mulGas(getDynamicGasCost(this.opcode), dynMultiplier);
|
|
70
75
|
}
|
|
71
76
|
/**
|
|
72
77
|
* Returns the stringified type of the instruction.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../../../src/public/avm/opcodes/memory.ts"],"names":[],"mappings":"AAAA,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,GAAI,SAAQ,WAAW;IAiDhC,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,KAAK;IACb,OAAO,CAAC,KAAK;IAnDf,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAS;IAErC,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAgB;IAE9C,gBAAuB,WAAW,EAAE,WAAW,EAAE,CAM/C;IACF,gBAAuB,YAAY,EAAE,WAAW,EAAE,CAMhD;IACF,gBAAuB,YAAY,EAAE,WAAW,EAAE,CAMhD;IACF,gBAAuB,YAAY,EAAE,WAAW,EAAE,CAMhD;IACF,gBAAuB,aAAa,EAAE,WAAW,EAAE,CAMjD;IACF,gBAAuB,YAAY,EAAE,WAAW,EAAE,CAMhD;gBAGQ,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,GAAG,MAAM;IAKnB,OAAO,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../../../src/public/avm/opcodes/memory.ts"],"names":[],"mappings":"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"}
|
|
@@ -60,7 +60,7 @@ export class Set extends Instruction {
|
|
|
60
60
|
const res = TaggedMemory.buildFromTagTruncating(this.value, this.inTag);
|
|
61
61
|
const memory = context.machineState.memory;
|
|
62
62
|
const addressing = Addressing.fromWire(this.indirect);
|
|
63
|
-
context.machineState.consumeGas(this.
|
|
63
|
+
context.machineState.consumeGas(this.baseGasCost(addressing.indirectOperandsCount(), addressing.relativeOperandsCount()));
|
|
64
64
|
const operands = [
|
|
65
65
|
this.dstOffset
|
|
66
66
|
];
|
|
@@ -95,7 +95,7 @@ export class Cast extends Instruction {
|
|
|
95
95
|
async execute(context) {
|
|
96
96
|
const memory = context.machineState.memory;
|
|
97
97
|
const addressing = Addressing.fromWire(this.indirect);
|
|
98
|
-
context.machineState.consumeGas(this.
|
|
98
|
+
context.machineState.consumeGas(this.baseGasCost(addressing.indirectOperandsCount(), addressing.relativeOperandsCount()));
|
|
99
99
|
const operands = [
|
|
100
100
|
this.srcOffset,
|
|
101
101
|
this.dstOffset
|
|
@@ -132,7 +132,7 @@ export class Mov extends Instruction {
|
|
|
132
132
|
async execute(context) {
|
|
133
133
|
const memory = context.machineState.memory;
|
|
134
134
|
const addressing = Addressing.fromWire(this.indirect);
|
|
135
|
-
context.machineState.consumeGas(this.
|
|
135
|
+
context.machineState.consumeGas(this.baseGasCost(addressing.indirectOperandsCount(), addressing.relativeOperandsCount()));
|
|
136
136
|
const operands = [
|
|
137
137
|
this.srcOffset,
|
|
138
138
|
this.dstOffset
|
|
@@ -163,6 +163,7 @@ export class CalldataCopy extends Instruction {
|
|
|
163
163
|
async execute(context) {
|
|
164
164
|
const memory = context.machineState.memory;
|
|
165
165
|
const addressing = Addressing.fromWire(this.indirect);
|
|
166
|
+
context.machineState.consumeGas(this.baseGasCost(addressing.indirectOperandsCount(), addressing.relativeOperandsCount()));
|
|
166
167
|
const operands = [
|
|
167
168
|
this.copySizeOffset,
|
|
168
169
|
this.cdStartOffset,
|
|
@@ -172,7 +173,7 @@ export class CalldataCopy extends Instruction {
|
|
|
172
173
|
memory.checkTags(TypeTag.UINT32, cdStartOffset, copySizeOffset);
|
|
173
174
|
const cdStart = memory.get(cdStartOffset).toNumber();
|
|
174
175
|
const copySize = memory.get(copySizeOffset).toNumber();
|
|
175
|
-
context.machineState.consumeGas(this.
|
|
176
|
+
context.machineState.consumeGas(this.dynamicGasCost(copySize));
|
|
176
177
|
// Values which are out-of-range of the calldata array will be set with Field(0);
|
|
177
178
|
const slice = context.environment.calldata.slice(cdStart, cdStart + copySize).map((f)=>new Field(f));
|
|
178
179
|
// slice has size = MIN(copySize, calldata.length - cdStart) as TS truncates out-of-range portion
|
|
@@ -200,11 +201,11 @@ export class ReturndataSize extends Instruction {
|
|
|
200
201
|
async execute(context) {
|
|
201
202
|
const memory = context.machineState.memory;
|
|
202
203
|
const addressing = Addressing.fromWire(this.indirect);
|
|
204
|
+
context.machineState.consumeGas(this.baseGasCost(addressing.indirectOperandsCount(), addressing.relativeOperandsCount()));
|
|
203
205
|
const operands = [
|
|
204
206
|
this.dstOffset
|
|
205
207
|
];
|
|
206
208
|
const [dstOffset] = addressing.resolve(operands, memory);
|
|
207
|
-
context.machineState.consumeGas(this.gasCost());
|
|
208
209
|
memory.set(dstOffset, new Uint32(context.machineState.nestedReturndata.length));
|
|
209
210
|
}
|
|
210
211
|
}
|
|
@@ -229,6 +230,7 @@ export class ReturndataCopy extends Instruction {
|
|
|
229
230
|
async execute(context) {
|
|
230
231
|
const memory = context.machineState.memory;
|
|
231
232
|
const addressing = Addressing.fromWire(this.indirect);
|
|
233
|
+
context.machineState.consumeGas(this.baseGasCost(addressing.indirectOperandsCount(), addressing.relativeOperandsCount()));
|
|
232
234
|
const operands = [
|
|
233
235
|
this.copySizeOffset,
|
|
234
236
|
this.rdStartOffset,
|
|
@@ -238,7 +240,7 @@ export class ReturndataCopy extends Instruction {
|
|
|
238
240
|
memory.checkTags(TypeTag.UINT32, rdStartOffset, copySizeOffset);
|
|
239
241
|
const rdStart = memory.get(rdStartOffset).toNumber();
|
|
240
242
|
const copySize = memory.get(copySizeOffset).toNumber();
|
|
241
|
-
context.machineState.consumeGas(this.
|
|
243
|
+
context.machineState.consumeGas(this.dynamicGasCost(copySize));
|
|
242
244
|
// Values which are out-of-range of the returndata array will be set with Field(0);
|
|
243
245
|
const slice = context.machineState.nestedReturndata.slice(rdStart, rdStart + copySize).map((f)=>new Field(f));
|
|
244
246
|
// slice has size = MIN(copySize, returndata.length - rdStart) as TS truncates out-of-range portion
|
|
@@ -27,6 +27,7 @@ export class DebugLog extends Instruction {
|
|
|
27
27
|
async execute(context) {
|
|
28
28
|
const memory = context.machineState.memory;
|
|
29
29
|
const addressing = Addressing.fromWire(this.indirect);
|
|
30
|
+
context.machineState.consumeGas(this.baseGasCost(addressing.indirectOperandsCount(), addressing.relativeOperandsCount()));
|
|
30
31
|
const operands = [
|
|
31
32
|
this.messageOffset,
|
|
32
33
|
this.fieldsOffset,
|
|
@@ -48,8 +49,5 @@ export class DebugLog extends Instruction {
|
|
|
48
49
|
const formattedStr = applyStringFormatting(messageAsStr, fields.map((field)=>field.toFr()));
|
|
49
50
|
DebugLog.logger.verbose(formattedStr);
|
|
50
51
|
}
|
|
51
|
-
// Despite having dynamic "size" operands, the gas cost is fixed because
|
|
52
|
-
// this opcode is a no-op except during client-initiated simulation
|
|
53
|
-
context.machineState.consumeGas(this.gasCost());
|
|
54
52
|
}
|
|
55
53
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../../../src/public/avm/opcodes/storage.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,sBAAuB,SAAQ,WAAW;IAUrD,SAAS,CAAC,QAAQ,EAAE,MAAM;IAC1B,SAAS,CAAC,OAAO,EAAE,MAAM;IACzB,SAAS,CAAC,OAAO,EAAE,MAAM;IAV3B,gBAAuB,UAAU,EAAE,WAAW,EAAE,CAK9C;gBAGU,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,MAAO,SAAQ,sBAAsB;IAChD,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAY;IACxC,MAAM,CAAC,QAAQ,CAAC,MAAM,iBAAiB;gBAE3B,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM;IAItD,OAAO,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../../../src/public/avm/opcodes/storage.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,sBAAuB,SAAQ,WAAW;IAUrD,SAAS,CAAC,QAAQ,EAAE,MAAM;IAC1B,SAAS,CAAC,OAAO,EAAE,MAAM;IACzB,SAAS,CAAC,OAAO,EAAE,MAAM;IAV3B,gBAAuB,UAAU,EAAE,WAAW,EAAE,CAK9C;gBAGU,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,MAAO,SAAQ,sBAAsB;IAChD,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAY;IACxC,MAAM,CAAC,QAAQ,CAAC,MAAM,iBAAiB;gBAE3B,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM;IAItD,OAAO,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;CA2BzD;AAED,qBAAa,KAAM,SAAQ,sBAAsB;IAC/C,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAW;IACvC,MAAM,CAAC,QAAQ,CAAC,MAAM,gBAAgB;gBAE1B,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM;IAItD,OAAO,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;CAgBzD"}
|
|
@@ -30,15 +30,17 @@ export class SStore extends BaseStorageInstruction {
|
|
|
30
30
|
}
|
|
31
31
|
const memory = context.machineState.memory;
|
|
32
32
|
const addressing = Addressing.fromWire(this.indirect);
|
|
33
|
-
context.machineState.consumeGas(this.
|
|
33
|
+
context.machineState.consumeGas(this.baseGasCost(addressing.indirectOperandsCount(), addressing.relativeOperandsCount()));
|
|
34
34
|
const operands = [
|
|
35
35
|
this.aOffset,
|
|
36
36
|
this.bOffset
|
|
37
37
|
];
|
|
38
38
|
const [srcOffset, slotOffset] = addressing.resolve(operands, memory);
|
|
39
|
+
// We read before tag checking since it's needed for gas cost calculation
|
|
40
|
+
const slot = memory.get(slotOffset).toFr();
|
|
41
|
+
context.machineState.consumeGas(this.dynamicGasCost(Number(context.persistableState.isStorageCold(context.environment.address, slot))));
|
|
39
42
|
memory.checkTag(TypeTag.FIELD, slotOffset);
|
|
40
43
|
memory.checkTag(TypeTag.FIELD, srcOffset);
|
|
41
|
-
const slot = memory.get(slotOffset).toFr();
|
|
42
44
|
const value = memory.get(srcOffset).toFr();
|
|
43
45
|
await context.persistableState.writeStorage(context.environment.address, slot, value);
|
|
44
46
|
}
|
|
@@ -52,7 +54,7 @@ export class SLoad extends BaseStorageInstruction {
|
|
|
52
54
|
async execute(context) {
|
|
53
55
|
const memory = context.machineState.memory;
|
|
54
56
|
const addressing = Addressing.fromWire(this.indirect);
|
|
55
|
-
context.machineState.consumeGas(this.
|
|
57
|
+
context.machineState.consumeGas(this.baseGasCost(addressing.indirectOperandsCount(), addressing.relativeOperandsCount()));
|
|
56
58
|
const operands = [
|
|
57
59
|
this.aOffset,
|
|
58
60
|
this.bOffset
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
export * from './public_tx_simulation_tester.js';
|
|
2
2
|
export * from './utils.js';
|
|
3
3
|
export * from './simple_contract_data_source.js';
|
|
4
|
+
export { readAvmMinimalPublicTxInputsFromFile, createAvmMinimalPublicTx } from './minimal_public_tx.js';
|
|
4
5
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/public/fixtures/index.ts"],"names":[],"mappings":"AAAA,cAAc,kCAAkC,CAAC;AACjD,cAAc,YAAY,CAAC;AAC3B,cAAc,kCAAkC,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/public/fixtures/index.ts"],"names":[],"mappings":"AAAA,cAAc,kCAAkC,CAAC;AACjD,cAAc,YAAY,CAAC;AAC3B,cAAc,kCAAkC,CAAC;AACjD,OAAO,EAAE,oCAAoC,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC"}
|