@aztec/simulator 0.51.0 → 0.51.1
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.
|
@@ -33,7 +33,7 @@ export class AvmSimulator {
|
|
|
33
33
|
*/
|
|
34
34
|
async executeBytecode(bytecode) {
|
|
35
35
|
const decompressedBytecode = await decompressBytecodeIfCompressed(bytecode);
|
|
36
|
-
assert(isAvmBytecode(decompressedBytecode), "AVM simulator can't execute non-AVM bytecode");
|
|
36
|
+
assert(await isAvmBytecode(decompressedBytecode), "AVM simulator can't execute non-AVM bytecode");
|
|
37
37
|
this.bytecode = decompressedBytecode;
|
|
38
38
|
return await this.executeInstructions(decodeFromBytecode(decompressedBytecode));
|
|
39
39
|
}
|
|
@@ -84,4 +84,4 @@ export class AvmSimulator {
|
|
|
84
84
|
}
|
|
85
85
|
}
|
|
86
86
|
}
|
|
87
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
87
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXZtX3NpbXVsYXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hdm0vYXZtX3NpbXVsYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQW9CLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFNUUsT0FBTyxFQUFFLE1BQU0sSUFBSSxNQUFNLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFHMUMsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDdEUsT0FBTyxFQUFFLDhCQUE4QixFQUFFLGFBQWEsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3BGLE9BQU8sRUFDTCxpQkFBaUIsRUFDakIsMEJBQTBCLEVBQzFCLDBCQUEwQixFQUMxQiwrQkFBK0IsRUFDL0IsOEJBQThCLEdBQy9CLE1BQU0sYUFBYSxDQUFDO0FBRXJCLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDJDQUEyQyxDQUFDO0FBRS9FLE1BQU0sT0FBTyxZQUFZO0lBSXZCLFlBQW9CLE9BQW1CO1FBQW5CLFlBQU8sR0FBUCxPQUFPLENBQVk7UUFDckMsSUFBSSxDQUFDLEdBQUcsR0FBRyxpQkFBaUIsQ0FBQyw4QkFBOEIsT0FBTyxDQUFDLFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDakgsQ0FBQztJQUVEOztPQUVHO0lBQ0ksS0FBSyxDQUFDLE9BQU87UUFDbEIsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLFdBQVcsQ0FDOUQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUNoQyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxnQkFBZ0IsQ0FDMUMsQ0FBQztRQUVGLGtGQUFrRjtRQUNsRiw2Q0FBNkM7UUFDN0MsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2QsTUFBTSxJQUFJLDBC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
|
|
@@ -4,21 +4,20 @@ import { Instruction } from './instruction.js';
|
|
|
4
4
|
declare abstract class BaseStorageInstruction extends Instruction {
|
|
5
5
|
protected indirect: number;
|
|
6
6
|
protected aOffset: number;
|
|
7
|
-
protected size: number;
|
|
8
7
|
protected bOffset: number;
|
|
9
8
|
static readonly wireFormat: OperandType[];
|
|
10
|
-
constructor(indirect: number, aOffset: number,
|
|
9
|
+
constructor(indirect: number, aOffset: number, bOffset: number);
|
|
11
10
|
}
|
|
12
11
|
export declare class SStore extends BaseStorageInstruction {
|
|
13
12
|
static readonly type: string;
|
|
14
13
|
static readonly opcode = Opcode.SSTORE;
|
|
15
|
-
constructor(indirect: number, srcOffset: number,
|
|
14
|
+
constructor(indirect: number, srcOffset: number, slotOffset: number);
|
|
16
15
|
execute(context: AvmContext): Promise<void>;
|
|
17
16
|
}
|
|
18
17
|
export declare class SLoad extends BaseStorageInstruction {
|
|
19
18
|
static readonly type: string;
|
|
20
19
|
static readonly opcode = Opcode.SLOAD;
|
|
21
|
-
constructor(indirect: number, slotOffset: number,
|
|
20
|
+
constructor(indirect: number, slotOffset: number, dstOffset: number);
|
|
22
21
|
execute(context: AvmContext): Promise<void>;
|
|
23
22
|
}
|
|
24
23
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../../src/avm/opcodes/storage.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../../src/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;IAS3C,SAAS,CAAC,QAAQ,EAAE,MAAM;IAAE,SAAS,CAAC,OAAO,EAAE,MAAM;IAAE,SAAS,CAAC,OAAO,EAAE,MAAM;IAP5F,gBAAuB,UAAU,EAAE,WAAW,EAAE,CAK9C;gBAEoB,QAAQ,EAAE,MAAM,EAAY,OAAO,EAAE,MAAM,EAAY,OAAO,EAAE,MAAM;CAG7F;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;CAoBzD;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;CAezD"}
|
|
@@ -1,15 +1,13 @@
|
|
|
1
|
-
import { Fr } from '@aztec/foundation/fields';
|
|
2
1
|
import { Field, TypeTag } from '../avm_memory_types.js';
|
|
3
2
|
import { StaticCallAlterationError } from '../errors.js';
|
|
4
3
|
import { Opcode, OperandType } from '../serialization/instruction_serialization.js';
|
|
5
4
|
import { Addressing } from './addressing_mode.js';
|
|
6
5
|
import { Instruction } from './instruction.js';
|
|
7
6
|
class BaseStorageInstruction extends Instruction {
|
|
8
|
-
constructor(indirect, aOffset,
|
|
7
|
+
constructor(indirect, aOffset, bOffset) {
|
|
9
8
|
super();
|
|
10
9
|
this.indirect = indirect;
|
|
11
10
|
this.aOffset = aOffset;
|
|
12
|
-
this.size = size;
|
|
13
11
|
this.bOffset = bOffset;
|
|
14
12
|
}
|
|
15
13
|
}
|
|
@@ -19,28 +17,24 @@ BaseStorageInstruction.wireFormat = [
|
|
|
19
17
|
OperandType.UINT8,
|
|
20
18
|
OperandType.UINT32,
|
|
21
19
|
OperandType.UINT32,
|
|
22
|
-
OperandType.UINT32,
|
|
23
20
|
];
|
|
24
21
|
export class SStore extends BaseStorageInstruction {
|
|
25
|
-
constructor(indirect, srcOffset,
|
|
26
|
-
super(indirect, srcOffset,
|
|
22
|
+
constructor(indirect, srcOffset, slotOffset) {
|
|
23
|
+
super(indirect, srcOffset, slotOffset);
|
|
27
24
|
}
|
|
28
25
|
async execute(context) {
|
|
29
26
|
if (context.environment.isStaticCall) {
|
|
30
27
|
throw new StaticCallAlterationError();
|
|
31
28
|
}
|
|
32
|
-
const memoryOperations = { reads:
|
|
29
|
+
const memoryOperations = { reads: 2, indirect: this.indirect };
|
|
33
30
|
const memory = context.machineState.memory.track(this.type);
|
|
34
|
-
context.machineState.consumeGas(this.gasCost({ ...memoryOperations
|
|
31
|
+
context.machineState.consumeGas(this.gasCost({ ...memoryOperations }));
|
|
35
32
|
const [srcOffset, slotOffset] = Addressing.fromWire(this.indirect).resolve([this.aOffset, this.bOffset], memory);
|
|
36
33
|
memory.checkTag(TypeTag.FIELD, slotOffset);
|
|
37
|
-
memory.
|
|
34
|
+
memory.checkTag(TypeTag.FIELD, srcOffset);
|
|
38
35
|
const slot = memory.get(slotOffset).toFr();
|
|
39
|
-
const
|
|
40
|
-
|
|
41
|
-
const adjustedSlot = slot.add(new Fr(BigInt(index)));
|
|
42
|
-
context.persistableState.writeStorage(context.environment.storageAddress, adjustedSlot, value);
|
|
43
|
-
}
|
|
36
|
+
const value = memory.get(srcOffset).toFr();
|
|
37
|
+
context.persistableState.writeStorage(context.environment.storageAddress, slot, value);
|
|
44
38
|
memory.assert(memoryOperations);
|
|
45
39
|
context.machineState.incrementPc();
|
|
46
40
|
}
|
|
@@ -48,25 +42,22 @@ export class SStore extends BaseStorageInstruction {
|
|
|
48
42
|
SStore.type = 'SSTORE';
|
|
49
43
|
SStore.opcode = Opcode.SSTORE;
|
|
50
44
|
export class SLoad extends BaseStorageInstruction {
|
|
51
|
-
constructor(indirect, slotOffset,
|
|
52
|
-
super(indirect, slotOffset,
|
|
45
|
+
constructor(indirect, slotOffset, dstOffset) {
|
|
46
|
+
super(indirect, slotOffset, dstOffset);
|
|
53
47
|
}
|
|
54
48
|
async execute(context) {
|
|
55
|
-
const memoryOperations = { writes:
|
|
49
|
+
const memoryOperations = { writes: 1, reads: 1, indirect: this.indirect };
|
|
56
50
|
const memory = context.machineState.memory.track(this.type);
|
|
57
|
-
context.machineState.consumeGas(this.gasCost({ ...memoryOperations
|
|
51
|
+
context.machineState.consumeGas(this.gasCost({ ...memoryOperations }));
|
|
58
52
|
const [slotOffset, dstOffset] = Addressing.fromWire(this.indirect).resolve([this.aOffset, this.bOffset], memory);
|
|
59
53
|
memory.checkTag(TypeTag.FIELD, slotOffset);
|
|
60
|
-
const slot = memory.get(slotOffset);
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
const data = await context.persistableState.readStorage(context.environment.storageAddress, new Fr(slot.toBigInt() + BigInt(i)));
|
|
64
|
-
memory.set(dstOffset + i, new Field(data));
|
|
65
|
-
}
|
|
54
|
+
const slot = memory.get(slotOffset).toFr();
|
|
55
|
+
const value = await context.persistableState.readStorage(context.environment.storageAddress, slot);
|
|
56
|
+
memory.set(dstOffset, new Field(value));
|
|
66
57
|
context.machineState.incrementPc();
|
|
67
58
|
memory.assert(memoryOperations);
|
|
68
59
|
}
|
|
69
60
|
}
|
|
70
61
|
SLoad.type = 'SLOAD';
|
|
71
62
|
SLoad.opcode = Opcode.SLOAD;
|
|
72
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
63
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmFnZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hdm0vb3Bjb2Rlcy9zdG9yYWdlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDeEQsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3pELE9BQU8sRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLE1BQU0sK0NBQStDLENBQUM7QUFDcEYsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUUvQyxNQUFlLHNCQUF1QixTQUFRLFdBQVc7SUFTdkQsWUFBc0IsUUFBZ0IsRUFBWSxPQUFlLEVBQVksT0FBZTtRQUMxRixLQUFLLEVBQUUsQ0FBQztRQURZLGFBQVEsR0FBUixRQUFRLENBQVE7UUFBWSxZQUFPLEdBQVAsT0FBTyxDQUFRO1FBQVksWUFBTyxHQUFQLE9BQU8sQ0FBUTtJQUU1RixDQUFDOztBQVZELDBEQUEwRDtBQUNuQyxpQ0FBVSxHQUFrQjtJQUNqRCxXQUFXLENBQUMsS0FBSztJQUNqQixXQUFXLENBQUMsS0FBSztJQUNqQixXQUFXLENBQUMsTUFBTTtJQUNsQixXQUFXLENBQUMsTUFBTTtDQUNuQixDQUFDO0FBT0osTUFBTSxPQUFPLE1BQU8sU0FBUSxzQkFBc0I7SUFJaEQsWUFBWSxRQUFnQixFQUFFLFNBQWlCLEVBQUUsVUFBa0I7UUFDakUsS0FBSyxDQUFDLFFBQVEsRUFBRSxTQUFTLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVNLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBbUI7UUFDdEMsSUFBSSxPQUFPLENBQUMsV0FBVyxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3JDLE1BQU0sSUFBSSx5QkFBeUIsRUFBRSxDQUFDO1FB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
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aztec/simulator",
|
|
3
|
-
"version": "0.51.
|
|
3
|
+
"version": "0.51.1",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"exports": {
|
|
6
6
|
".": "./dest/index.js",
|
|
@@ -56,14 +56,14 @@
|
|
|
56
56
|
]
|
|
57
57
|
},
|
|
58
58
|
"dependencies": {
|
|
59
|
-
"@aztec/circuit-types": "0.51.
|
|
60
|
-
"@aztec/circuits.js": "0.51.
|
|
61
|
-
"@aztec/foundation": "0.51.
|
|
62
|
-
"@aztec/noir-protocol-circuits-types": "0.51.
|
|
63
|
-
"@aztec/protocol-contracts": "0.51.
|
|
64
|
-
"@aztec/telemetry-client": "0.51.
|
|
65
|
-
"@aztec/types": "0.51.
|
|
66
|
-
"@aztec/world-state": "0.51.
|
|
59
|
+
"@aztec/circuit-types": "0.51.1",
|
|
60
|
+
"@aztec/circuits.js": "0.51.1",
|
|
61
|
+
"@aztec/foundation": "0.51.1",
|
|
62
|
+
"@aztec/noir-protocol-circuits-types": "0.51.1",
|
|
63
|
+
"@aztec/protocol-contracts": "0.51.1",
|
|
64
|
+
"@aztec/telemetry-client": "0.51.1",
|
|
65
|
+
"@aztec/types": "0.51.1",
|
|
66
|
+
"@aztec/world-state": "0.51.1",
|
|
67
67
|
"@noir-lang/acvm_js": "portal:../../noir/packages/acvm_js",
|
|
68
68
|
"@noir-lang/types": "portal:../../noir/packages/types",
|
|
69
69
|
"levelup": "^5.1.1",
|
package/src/avm/avm_simulator.ts
CHANGED
|
@@ -54,7 +54,7 @@ export class AvmSimulator {
|
|
|
54
54
|
*/
|
|
55
55
|
public async executeBytecode(bytecode: Buffer): Promise<AvmContractCallResult> {
|
|
56
56
|
const decompressedBytecode = await decompressBytecodeIfCompressed(bytecode);
|
|
57
|
-
assert(isAvmBytecode(decompressedBytecode), "AVM simulator can't execute non-AVM bytecode");
|
|
57
|
+
assert(await isAvmBytecode(decompressedBytecode), "AVM simulator can't execute non-AVM bytecode");
|
|
58
58
|
|
|
59
59
|
this.bytecode = decompressedBytecode;
|
|
60
60
|
return await this.executeInstructions(decodeFromBytecode(decompressedBytecode));
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
import { Fr } from '@aztec/foundation/fields';
|
|
2
|
-
|
|
3
1
|
import type { AvmContext } from '../avm_context.js';
|
|
4
2
|
import { Field, TypeTag } from '../avm_memory_types.js';
|
|
5
3
|
import { StaticCallAlterationError } from '../errors.js';
|
|
@@ -14,15 +12,9 @@ abstract class BaseStorageInstruction extends Instruction {
|
|
|
14
12
|
OperandType.UINT8,
|
|
15
13
|
OperandType.UINT32,
|
|
16
14
|
OperandType.UINT32,
|
|
17
|
-
OperandType.UINT32,
|
|
18
15
|
];
|
|
19
16
|
|
|
20
|
-
constructor(
|
|
21
|
-
protected indirect: number,
|
|
22
|
-
protected aOffset: number,
|
|
23
|
-
protected /*temporary*/ size: number,
|
|
24
|
-
protected bOffset: number,
|
|
25
|
-
) {
|
|
17
|
+
constructor(protected indirect: number, protected aOffset: number, protected bOffset: number) {
|
|
26
18
|
super();
|
|
27
19
|
}
|
|
28
20
|
}
|
|
@@ -31,8 +23,8 @@ export class SStore extends BaseStorageInstruction {
|
|
|
31
23
|
static readonly type: string = 'SSTORE';
|
|
32
24
|
static readonly opcode = Opcode.SSTORE;
|
|
33
25
|
|
|
34
|
-
constructor(indirect: number, srcOffset: number,
|
|
35
|
-
super(indirect, srcOffset,
|
|
26
|
+
constructor(indirect: number, srcOffset: number, slotOffset: number) {
|
|
27
|
+
super(indirect, srcOffset, slotOffset);
|
|
36
28
|
}
|
|
37
29
|
|
|
38
30
|
public async execute(context: AvmContext): Promise<void> {
|
|
@@ -40,21 +32,17 @@ export class SStore extends BaseStorageInstruction {
|
|
|
40
32
|
throw new StaticCallAlterationError();
|
|
41
33
|
}
|
|
42
34
|
|
|
43
|
-
const memoryOperations = { reads:
|
|
35
|
+
const memoryOperations = { reads: 2, indirect: this.indirect };
|
|
44
36
|
const memory = context.machineState.memory.track(this.type);
|
|
45
|
-
context.machineState.consumeGas(this.gasCost({ ...memoryOperations
|
|
37
|
+
context.machineState.consumeGas(this.gasCost({ ...memoryOperations }));
|
|
46
38
|
|
|
47
39
|
const [srcOffset, slotOffset] = Addressing.fromWire(this.indirect).resolve([this.aOffset, this.bOffset], memory);
|
|
48
40
|
memory.checkTag(TypeTag.FIELD, slotOffset);
|
|
49
|
-
memory.
|
|
41
|
+
memory.checkTag(TypeTag.FIELD, srcOffset);
|
|
50
42
|
|
|
51
43
|
const slot = memory.get(slotOffset).toFr();
|
|
52
|
-
const
|
|
53
|
-
|
|
54
|
-
for (const [index, value] of Object.entries(data)) {
|
|
55
|
-
const adjustedSlot = slot.add(new Fr(BigInt(index)));
|
|
56
|
-
context.persistableState.writeStorage(context.environment.storageAddress, adjustedSlot, value);
|
|
57
|
-
}
|
|
44
|
+
const value = memory.get(srcOffset).toFr();
|
|
45
|
+
context.persistableState.writeStorage(context.environment.storageAddress, slot, value);
|
|
58
46
|
|
|
59
47
|
memory.assert(memoryOperations);
|
|
60
48
|
context.machineState.incrementPc();
|
|
@@ -65,29 +53,21 @@ export class SLoad extends BaseStorageInstruction {
|
|
|
65
53
|
static readonly type: string = 'SLOAD';
|
|
66
54
|
static readonly opcode = Opcode.SLOAD;
|
|
67
55
|
|
|
68
|
-
constructor(indirect: number, slotOffset: number,
|
|
69
|
-
super(indirect, slotOffset,
|
|
56
|
+
constructor(indirect: number, slotOffset: number, dstOffset: number) {
|
|
57
|
+
super(indirect, slotOffset, dstOffset);
|
|
70
58
|
}
|
|
71
59
|
|
|
72
60
|
public async execute(context: AvmContext): Promise<void> {
|
|
73
|
-
const memoryOperations = { writes:
|
|
61
|
+
const memoryOperations = { writes: 1, reads: 1, indirect: this.indirect };
|
|
74
62
|
const memory = context.machineState.memory.track(this.type);
|
|
75
|
-
context.machineState.consumeGas(this.gasCost({ ...memoryOperations
|
|
63
|
+
context.machineState.consumeGas(this.gasCost({ ...memoryOperations }));
|
|
76
64
|
|
|
77
65
|
const [slotOffset, dstOffset] = Addressing.fromWire(this.indirect).resolve([this.aOffset, this.bOffset], memory);
|
|
78
66
|
memory.checkTag(TypeTag.FIELD, slotOffset);
|
|
79
67
|
|
|
80
|
-
const slot = memory.get(slotOffset);
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
for (let i = 0; i < this.size; i++) {
|
|
84
|
-
const data: Fr = await context.persistableState.readStorage(
|
|
85
|
-
context.environment.storageAddress,
|
|
86
|
-
new Fr(slot.toBigInt() + BigInt(i)),
|
|
87
|
-
);
|
|
88
|
-
|
|
89
|
-
memory.set(dstOffset + i, new Field(data));
|
|
90
|
-
}
|
|
68
|
+
const slot = memory.get(slotOffset).toFr();
|
|
69
|
+
const value = await context.persistableState.readStorage(context.environment.storageAddress, slot);
|
|
70
|
+
memory.set(dstOffset, new Field(value));
|
|
91
71
|
|
|
92
72
|
context.machineState.incrementPc();
|
|
93
73
|
memory.assert(memoryOperations);
|