@aztec/simulator 0.0.1-commit.a072138 → 0.0.1-commit.a5db02d
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/README.md +4 -4
- package/dest/client.d.ts +1 -3
- package/dest/client.d.ts.map +1 -1
- package/dest/client.js +0 -2
- package/dest/private/acvm_wasm.d.ts +1 -1
- package/dest/private/acvm_wasm.d.ts.map +1 -1
- package/dest/private/acvm_wasm.js +3 -1
- package/dest/private/circuit_recording/circuit_recorder.d.ts +36 -23
- package/dest/private/circuit_recording/circuit_recorder.d.ts.map +1 -1
- package/dest/private/circuit_recording/circuit_recorder.js +65 -69
- package/dest/private/circuit_recording/file_circuit_recorder.d.ts +7 -19
- package/dest/private/circuit_recording/file_circuit_recorder.d.ts.map +1 -1
- package/dest/private/circuit_recording/file_circuit_recorder.js +38 -42
- package/dest/private/circuit_recording/simulator_recorder_wrapper.d.ts +1 -1
- package/dest/private/circuit_recording/simulator_recorder_wrapper.d.ts.map +1 -1
- package/dest/private/circuit_recording/simulator_recorder_wrapper.js +11 -14
- package/dest/public/avm/avm_gas.js +3 -3
- package/dest/public/avm/avm_simulator.js +1 -1
- package/dest/public/avm/calldata.d.ts +1 -1
- package/dest/public/avm/calldata.d.ts.map +1 -1
- package/dest/public/avm/calldata.js +3 -2
- package/dest/public/avm/fixtures/account_proof_fetcher.d.ts +2 -0
- package/dest/public/avm/fixtures/account_proof_fetcher.d.ts.map +1 -0
- package/dest/public/avm/fixtures/account_proof_fetcher.js +152 -0
- package/dest/public/avm/fixtures/base_avm_simulation_tester.d.ts +2 -1
- package/dest/public/avm/fixtures/base_avm_simulation_tester.d.ts.map +1 -1
- package/dest/public/avm/fixtures/base_avm_simulation_tester.js +18 -3
- package/dest/public/avm/fixtures/utils.d.ts +1 -1
- package/dest/public/avm/fixtures/utils.d.ts.map +1 -1
- package/dest/public/avm/fixtures/utils.js +4 -1
- package/dest/public/avm/opcodes/accrued_substate.d.ts +2 -2
- package/dest/public/avm/opcodes/accrued_substate.d.ts.map +1 -1
- package/dest/public/avm/opcodes/accrued_substate.js +3 -4
- package/dest/public/avm/opcodes/contract.d.ts +3 -2
- package/dest/public/avm/opcodes/contract.d.ts.map +1 -1
- package/dest/public/avm/opcodes/contract.js +5 -1
- package/dest/public/avm/opcodes/ec_add.d.ts +2 -4
- package/dest/public/avm/opcodes/ec_add.d.ts.map +1 -1
- package/dest/public/avm/opcodes/ec_add.js +13 -27
- package/dest/public/avm/serialization/bytecode_serialization.js +3 -3
- package/dest/public/avm/serialization/instruction_serialization.d.ts +2 -2
- package/dest/public/avm/serialization/instruction_serialization.d.ts.map +1 -1
- package/dest/public/avm/serialization/instruction_serialization.js +1 -1
- package/dest/public/contracts_db_checkpoint.d.ts +2 -2
- package/dest/public/contracts_db_checkpoint.d.ts.map +1 -1
- package/dest/public/contracts_db_checkpoint.js +1 -1
- package/dest/public/fixtures/amm_test.js +4 -4
- package/dest/public/fixtures/bulk_test.d.ts +1 -1
- package/dest/public/fixtures/bulk_test.d.ts.map +1 -1
- package/dest/public/fixtures/bulk_test.js +33 -6
- package/dest/public/fixtures/custom_bytecode_tester.d.ts +1 -1
- package/dest/public/fixtures/custom_bytecode_tester.d.ts.map +1 -1
- package/dest/public/fixtures/custom_bytecode_tester.js +2 -2
- package/dest/public/fixtures/custom_bytecode_tests.d.ts +8 -1
- package/dest/public/fixtures/custom_bytecode_tests.d.ts.map +1 -1
- package/dest/public/fixtures/custom_bytecode_tests.js +91 -2
- package/dest/public/fixtures/opcode_spammer.d.ts +1 -1
- package/dest/public/fixtures/opcode_spammer.d.ts.map +1 -1
- package/dest/public/fixtures/opcode_spammer.js +8 -16
- package/dest/public/fixtures/public_tx_simulation_tester.d.ts +6 -5
- package/dest/public/fixtures/public_tx_simulation_tester.d.ts.map +1 -1
- package/dest/public/fixtures/public_tx_simulation_tester.js +38 -9
- package/dest/public/fixtures/token_test.js +3 -3
- package/dest/public/fixtures/utils.d.ts +2 -2
- package/dest/public/fixtures/utils.d.ts.map +1 -1
- package/dest/public/fixtures/utils.js +21 -20
- package/dest/public/hinting_db_sources.d.ts +5 -5
- package/dest/public/hinting_db_sources.d.ts.map +1 -1
- package/dest/public/hinting_db_sources.js +8 -7
- package/dest/public/public_db_sources.d.ts +6 -3
- package/dest/public/public_db_sources.d.ts.map +1 -1
- package/dest/public/public_db_sources.js +16 -10
- package/dest/public/public_processor/guarded_merkle_tree.d.ts +5 -5
- package/dest/public/public_processor/guarded_merkle_tree.d.ts.map +1 -1
- package/dest/public/public_processor/guarded_merkle_tree.js +5 -5
- package/dest/public/public_processor/public_processor.d.ts +8 -5
- package/dest/public/public_processor/public_processor.d.ts.map +1 -1
- package/dest/public/public_processor/public_processor.js +121 -67
- package/dest/public/public_processor/public_processor_metrics.d.ts +4 -1
- package/dest/public/public_processor/public_processor_metrics.d.ts.map +1 -1
- package/dest/public/public_processor/public_processor_metrics.js +8 -0
- package/dest/public/public_tx_simulator/contract_provider_for_cpp.d.ts +1 -1
- package/dest/public/public_tx_simulator/contract_provider_for_cpp.d.ts.map +1 -1
- package/dest/public/public_tx_simulator/contract_provider_for_cpp.js +5 -4
- package/dest/public/public_tx_simulator/cpp_public_tx_simulator.d.ts +1 -1
- package/dest/public/public_tx_simulator/cpp_public_tx_simulator.d.ts.map +1 -1
- package/dest/public/public_tx_simulator/cpp_public_tx_simulator.js +2 -3
- package/dest/public/public_tx_simulator/cpp_public_tx_simulator_with_hinted_dbs.d.ts +1 -1
- package/dest/public/public_tx_simulator/cpp_public_tx_simulator_with_hinted_dbs.d.ts.map +1 -1
- package/dest/public/public_tx_simulator/cpp_public_tx_simulator_with_hinted_dbs.js +2 -2
- package/dest/public/public_tx_simulator/factories.d.ts +2 -2
- package/dest/public/public_tx_simulator/factories.d.ts.map +1 -1
- package/dest/public/public_tx_simulator/factories.js +2 -2
- package/dest/public/public_tx_simulator/public_tx_context.d.ts +7 -3
- package/dest/public/public_tx_simulator/public_tx_context.d.ts.map +1 -1
- package/dest/public/public_tx_simulator/public_tx_context.js +8 -10
- package/dest/public/public_tx_simulator/public_tx_simulator.d.ts +6 -2
- package/dest/public/public_tx_simulator/public_tx_simulator.d.ts.map +1 -1
- package/dest/public/public_tx_simulator/public_tx_simulator.js +14 -9
- package/dest/public/state_manager/state_manager.js +1 -1
- package/dest/public/test_executor_metrics.d.ts +6 -1
- package/dest/public/test_executor_metrics.d.ts.map +1 -1
- package/dest/public/test_executor_metrics.js +22 -0
- package/package.json +16 -16
- package/src/client.ts +0 -2
- package/src/private/acvm_wasm.ts +4 -1
- package/src/private/circuit_recording/circuit_recorder.ts +84 -78
- package/src/private/circuit_recording/file_circuit_recorder.ts +38 -48
- package/src/private/circuit_recording/simulator_recorder_wrapper.ts +9 -15
- package/src/public/avm/avm_gas.ts +2 -2
- package/src/public/avm/avm_simulator.ts +1 -1
- package/src/public/avm/calldata.ts +3 -2
- package/src/public/avm/fixtures/account_proof.json +553 -0
- package/src/public/avm/fixtures/account_proof_fetcher.ts +166 -0
- package/src/public/avm/fixtures/base_avm_simulation_tester.ts +23 -3
- package/src/public/avm/fixtures/utils.ts +4 -1
- package/src/public/avm/opcodes/accrued_substate.ts +3 -4
- package/src/public/avm/opcodes/contract.ts +5 -1
- package/src/public/avm/opcodes/ec_add.ts +12 -31
- package/src/public/avm/opcodes/external_calls.ts +1 -1
- package/src/public/avm/serialization/bytecode_serialization.ts +2 -2
- package/src/public/avm/serialization/instruction_serialization.ts +1 -1
- package/src/public/contracts_db_checkpoint.ts +1 -1
- package/src/public/fixtures/amm_test.ts +4 -4
- package/src/public/fixtures/bulk_test.ts +31 -6
- package/src/public/fixtures/custom_bytecode_tester.ts +2 -2
- package/src/public/fixtures/custom_bytecode_tests.ts +209 -2
- package/src/public/fixtures/opcode_spammer.ts +10 -18
- package/src/public/fixtures/public_tx_simulation_tester.ts +45 -5
- package/src/public/fixtures/token_test.ts +3 -3
- package/src/public/fixtures/utils.ts +23 -24
- package/src/public/fuzzing/avm_fuzzer_simulator.ts +1 -1
- package/src/public/hinting_db_sources.ts +10 -7
- package/src/public/public_db_sources.ts +21 -14
- package/src/public/public_processor/guarded_merkle_tree.ts +6 -6
- package/src/public/public_processor/public_processor.ts +158 -88
- package/src/public/public_processor/public_processor_metrics.ts +12 -0
- package/src/public/public_tx_simulator/contract_provider_for_cpp.ts +5 -4
- package/src/public/public_tx_simulator/cpp_public_tx_simulator.ts +2 -3
- package/src/public/public_tx_simulator/cpp_public_tx_simulator_with_hinted_dbs.ts +2 -2
- package/src/public/public_tx_simulator/factories.ts +2 -1
- package/src/public/public_tx_simulator/public_tx_context.ts +8 -10
- package/src/public/public_tx_simulator/public_tx_simulator.ts +14 -10
- package/src/public/state_manager/state_manager.ts +1 -1
- package/src/public/test_executor_metrics.ts +24 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Grumpkin } from '@aztec/foundation/crypto/grumpkin';
|
|
2
2
|
import { Point } from '@aztec/foundation/curves/grumpkin';
|
|
3
|
-
import { Field, TypeTag
|
|
3
|
+
import { Field, TypeTag } from '../avm_memory_types.js';
|
|
4
4
|
import { EcAddPointNotOnCurveError } from '../errors.js';
|
|
5
5
|
import { Opcode, OperandType } from '../serialization/instruction_serialization.js';
|
|
6
6
|
import { Addressing } from './addressing_mode.js';
|
|
@@ -9,10 +9,8 @@ export class EcAdd extends Instruction {
|
|
|
9
9
|
addressingMode;
|
|
10
10
|
p1XOffset;
|
|
11
11
|
p1YOffset;
|
|
12
|
-
p1IsInfiniteOffset;
|
|
13
12
|
p2XOffset;
|
|
14
13
|
p2YOffset;
|
|
15
|
-
p2IsInfiniteOffset;
|
|
16
14
|
dstOffset;
|
|
17
15
|
static type = 'ECADD';
|
|
18
16
|
static opcode = Opcode.ECADD;
|
|
@@ -24,12 +22,10 @@ export class EcAdd extends Instruction {
|
|
|
24
22
|
OperandType.UINT16,
|
|
25
23
|
OperandType.UINT16,
|
|
26
24
|
OperandType.UINT16,
|
|
27
|
-
OperandType.UINT16,
|
|
28
|
-
OperandType.UINT16,
|
|
29
25
|
OperandType.UINT16
|
|
30
26
|
];
|
|
31
|
-
constructor(addressingMode, p1XOffset, p1YOffset,
|
|
32
|
-
super(), this.addressingMode = addressingMode, this.p1XOffset = p1XOffset, this.p1YOffset = p1YOffset, this.
|
|
27
|
+
constructor(addressingMode, p1XOffset, p1YOffset, p2XOffset, p2YOffset, dstOffset){
|
|
28
|
+
super(), this.addressingMode = addressingMode, this.p1XOffset = p1XOffset, this.p1YOffset = p1YOffset, this.p2XOffset = p2XOffset, this.p2YOffset = p2YOffset, this.dstOffset = dstOffset;
|
|
33
29
|
}
|
|
34
30
|
async execute(context) {
|
|
35
31
|
const memory = context.machineState.memory;
|
|
@@ -38,43 +34,37 @@ export class EcAdd extends Instruction {
|
|
|
38
34
|
const operands = [
|
|
39
35
|
this.p1XOffset,
|
|
40
36
|
this.p1YOffset,
|
|
41
|
-
this.p1IsInfiniteOffset,
|
|
42
37
|
this.p2XOffset,
|
|
43
38
|
this.p2YOffset,
|
|
44
|
-
this.p2IsInfiniteOffset,
|
|
45
39
|
this.dstOffset
|
|
46
40
|
];
|
|
47
|
-
const [p1XOffset, p1YOffset,
|
|
41
|
+
const [p1XOffset, p1YOffset, p2XOffset, p2YOffset, dstOffset] = addressing.resolve(operands, memory);
|
|
48
42
|
memory.checkTags(TypeTag.FIELD, p1XOffset, p1YOffset, p2XOffset, p2YOffset);
|
|
49
|
-
memory.checkTags(TypeTag.UINT1, p1IsInfiniteOffset, p2IsInfiniteOffset);
|
|
50
43
|
const p1X = memory.get(p1XOffset);
|
|
51
44
|
const p1Y = memory.get(p1YOffset);
|
|
52
|
-
const
|
|
53
|
-
|
|
54
|
-
if (!p1.isOnGrumpkin()) {
|
|
45
|
+
const p1 = new Point(p1X.toFr(), p1Y.toFr());
|
|
46
|
+
if (!p1.isOnCurve()) {
|
|
55
47
|
throw new EcAddPointNotOnCurveError(/*pointIndex=*/ 1, p1);
|
|
56
48
|
}
|
|
57
49
|
const p2X = memory.get(p2XOffset);
|
|
58
50
|
const p2Y = memory.get(p2YOffset);
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
const p2 = new Point(p2X.toFr(), p2Y.toFr(), p2IsInfinite);
|
|
62
|
-
if (!p2.isOnGrumpkin()) {
|
|
51
|
+
const p2 = new Point(p2X.toFr(), p2Y.toFr());
|
|
52
|
+
if (!p2.isOnCurve()) {
|
|
63
53
|
throw new EcAddPointNotOnCurveError(/*pointIndex=*/ 2, p2);
|
|
64
54
|
}
|
|
65
55
|
let dest;
|
|
66
|
-
if (
|
|
67
|
-
dest = Point.
|
|
68
|
-
} else if (
|
|
56
|
+
if (p1.isInfinite && p2.isInfinite) {
|
|
57
|
+
dest = Point.INFINITY;
|
|
58
|
+
} else if (p1.isInfinite) {
|
|
69
59
|
dest = p2;
|
|
70
|
-
} else if (
|
|
60
|
+
} else if (p2.isInfinite) {
|
|
71
61
|
dest = p1;
|
|
72
62
|
} else {
|
|
73
63
|
// TS<>BB ecc add communication is broken for points that add up to infinity.
|
|
74
64
|
// However, here we know that both points are on the curve, and that none is infinity
|
|
75
65
|
// so we can check for the case where you add p + (-p) = infinity.
|
|
76
66
|
if (p1.x.equals(p2.x) && !p1.y.equals(p2.y)) {
|
|
77
|
-
dest = Point.
|
|
67
|
+
dest = Point.INFINITY;
|
|
78
68
|
} else {
|
|
79
69
|
dest = await Grumpkin.add(p1, p2);
|
|
80
70
|
}
|
|
@@ -85,9 +75,5 @@ export class EcAdd extends Instruction {
|
|
|
85
75
|
new Field(dest.x),
|
|
86
76
|
new Field(dest.y)
|
|
87
77
|
]);
|
|
88
|
-
// Check representation of infinity for grumpkin
|
|
89
|
-
memory.setSlice(dstOffset + 2, [
|
|
90
|
-
new Uint1(dest.equals(Point.ZERO) ? 1 : 0)
|
|
91
|
-
]);
|
|
92
78
|
}
|
|
93
79
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { serializeToBuffer } from '@aztec/foundation/serialize';
|
|
2
2
|
import { AvmExecutionError, AvmParsingError, InvalidOpcodeError, InvalidProgramCounterError, InvalidTagValueError, duringInstrFetch } from '../errors.js';
|
|
3
|
-
import { Add, And, Call, CalldataCopy, Cast, DebugLog, Div, EcAdd, EmitNoteHash, EmitNullifier,
|
|
3
|
+
import { Add, And, Call, CalldataCopy, Cast, DebugLog, Div, EcAdd, EmitNoteHash, EmitNullifier, EmitPublicLog, Eq, FieldDiv, GetContractInstance, GetEnvVar, Instruction, InternalCall, InternalReturn, Jump, JumpI, KeccakF1600, L1ToL2MessageExists, Lt, Lte, Mov, Mul, Not, NoteHashExists, NullifierExists, Or, Poseidon2, Return, ReturndataCopy, ReturndataSize, Revert, SLoad, SStore, SendL2ToL1Message, Set, Sha256Compression, Shl, Shr, StaticCall, Sub, SuccessCopy, ToRadixBE, Xor } from '../opcodes/index.js';
|
|
4
4
|
import { BufferCursor } from './buffer_cursor.js';
|
|
5
5
|
import { MAX_OPCODE_VALUE, Opcode } from './instruction_serialization.js';
|
|
6
6
|
export const INSTRUCTION_SET = new Map([
|
|
@@ -225,8 +225,8 @@ export const INSTRUCTION_SET = new Map([
|
|
|
225
225
|
],
|
|
226
226
|
// Accrued Substate
|
|
227
227
|
[
|
|
228
|
-
|
|
229
|
-
Instruction.fromBuffer.bind(
|
|
228
|
+
EmitPublicLog.opcode,
|
|
229
|
+
Instruction.fromBuffer.bind(EmitPublicLog)
|
|
230
230
|
],
|
|
231
231
|
[
|
|
232
232
|
SendL2ToL1Message.opcode,
|
|
@@ -59,7 +59,7 @@ export declare enum Opcode {
|
|
|
59
59
|
EMITNULLIFIER = 52,
|
|
60
60
|
L1TOL2MSGEXISTS = 53,
|
|
61
61
|
GETCONTRACTINSTANCE = 54,
|
|
62
|
-
|
|
62
|
+
EMITPUBLICLOG = 55,
|
|
63
63
|
SENDL2TOL1MSG = 56,
|
|
64
64
|
CALL = 57,
|
|
65
65
|
STATICCALL = 58,
|
|
@@ -111,4 +111,4 @@ export declare function deserialize(cursor: BufferCursor | Buffer, operands: Ope
|
|
|
111
111
|
*/
|
|
112
112
|
export declare function serializeAs(operands: OperandType[], opcode: Opcode, cls: any): Buffer;
|
|
113
113
|
export {};
|
|
114
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
114
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5zdHJ1Y3Rpb25fc2VyaWFsaXphdGlvbi5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3B1YmxpYy9hdm0vc2VyaWFsaXphdGlvbi9pbnN0cnVjdGlvbl9zZXJpYWxpemF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUtBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUVsRDs7O0dBR0c7QUFDSCxvQkFBWSxNQUFNO0lBRWhCLEtBQUssSUFBQTtJQUNMLE1BQU0sSUFBQTtJQUNOLEtBQUssSUFBQTtJQUNMLE1BQU0sSUFBQTtJQUNOLEtBQUssSUFBQTtJQUNMLE1BQU0sSUFBQTtJQUNOLEtBQUssSUFBQTtJQUNMLE1BQU0sSUFBQTtJQUNOLE1BQU0sSUFBQTtJQUNOLE9BQU8sSUFBQTtJQUNQLElBQUksS0FBQTtJQUNKLEtBQUssS0FBQTtJQUNMLElBQUksS0FBQTtJQUNKLEtBQUssS0FBQTtJQUNMLEtBQUssS0FBQTtJQUNMLE1BQU0sS0FBQTtJQUNOLEtBQUssS0FBQTtJQUNMLE1BQU0sS0FBQTtJQUNOLElBQUksS0FBQTtJQUNKLEtBQUssS0FBQTtJQUNMLEtBQUssS0FBQTtJQUNMLE1BQU0sS0FBQTtJQUNOLEtBQUssS0FBQTtJQUNMLE1BQU0sS0FBQTtJQUNOLEtBQUssS0FBQTtJQUNMLE1BQU0sS0FBQTtJQUNOLEtBQUssS0FBQTtJQUNMLE1BQU0sS0FBQTtJQUNOLE1BQU0sS0FBQTtJQUNOLE9BQU8sS0FBQTtJQUVQLFlBQVksS0FBQTtJQUNaLFlBQVksS0FBQTtJQUNaLFdBQVcsS0FBQTtJQUNYLGNBQWMsS0FBQTtJQUNkLGNBQWMsS0FBQTtJQUVkLE9BQU8sS0FBQTtJQUNQLFFBQVEsS0FBQTtJQUNSLFlBQVksS0FBQTtJQUNaLGNBQWMsS0FBQTtJQUVkLEtBQUssS0FBQTtJQUNMLE1BQU0sS0FBQTtJQUNOLE1BQU0sS0FBQTtJQUNOLE1BQU0sS0FBQTtJQUNOLE9BQU8sS0FBQTtJQUNQLE1BQU0sS0FBQTtJQUNOLEtBQUssS0FBQTtJQUNMLE1BQU0sS0FBQTtJQUVOLEtBQUssS0FBQTtJQUNMLE1BQU0sS0FBQTtJQUNOLGNBQWMsS0FBQTtJQUNkLFlBQVksS0FBQTtJQUNaLGVBQWUsS0FBQTtJQUNmLGFBQWEsS0FBQTtJQUNiLGVBQWUsS0FBQTtJQUNmLG1CQUFtQixLQUFBO0lBQ25CLGFBQWEsS0FBQTtJQUNiLGFBQWEsS0FBQTtJQUViLElBQUksS0FBQTtJQUNKLFVBQVUsS0FBQTtJQUNWLE1BQU0sS0FBQTtJQUNOLFFBQVEsS0FBQTtJQUNSLFNBQVMsS0FBQTtJQUVULFFBQVEsS0FBQTtJQUVSLFNBQVMsS0FBQTtJQUNULGlCQUFpQixLQUFBO0lBQ2pCLFdBQVcsS0FBQTtJQUNYLEtBQUssS0FBQTtJQUVMLFNBQVMsS0FBQTtDQUNWO0FBRUQsZUFBTyxNQUFNLGdCQUFnQixRQUk1QixDQUFDO0FBSUYsb0JBQVksV0FBVztJQUNyQixLQUFLLElBQUE7SUFDTCxNQUFNLElBQUE7SUFDTixNQUFNLElBQUE7SUFDTixNQUFNLElBQUE7SUFDTixPQUFPLElBQUE7SUFDUCxFQUFFLElBQUE7SUFDRixHQUFHLElBQUE7Q0FDSjtBQUdELEtBQUssaUJBQWlCLEdBQUcsTUFBTSxHQUFHLE1BQU0sQ0FBQztBQWdCekM7Ozs7OztHQU1HO0FBQ0gsd0JBQWdCLGNBQWMsQ0FBQyxXQUFXLEVBQUUsV0FBVyxHQUFHLE1BQU0sQ0FHL0Q7QUFrREQ7Ozs7O0dBS0c7QUFDSCx3QkFBZ0IsV0FBVyxDQUFDLE1BQU0sRUFBRSxZQUFZLEdBQUcsTUFBTSxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsR0FBRyxpQkFBaUIsRUFBRSxDQXlCdkc7QUFFRDs7Ozs7Ozs7O0dBU0c7QUFDSCx3QkFBZ0IsV0FBVyxDQUFDLFFBQVEsRUFBRSxXQUFXLEVBQUUsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxHQUFHLEdBQUcsTUFBTSxDQW1CckYifQ==
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"instruction_serialization.d.ts","sourceRoot":"","sources":["../../../../src/public/avm/serialization/instruction_serialization.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD;;;GAGG;AACH,oBAAY,MAAM;IAEhB,KAAK,IAAA;IACL,MAAM,IAAA;IACN,KAAK,IAAA;IACL,MAAM,IAAA;IACN,KAAK,IAAA;IACL,MAAM,IAAA;IACN,KAAK,IAAA;IACL,MAAM,IAAA;IACN,MAAM,IAAA;IACN,OAAO,IAAA;IACP,IAAI,KAAA;IACJ,KAAK,KAAA;IACL,IAAI,KAAA;IACJ,KAAK,KAAA;IACL,KAAK,KAAA;IACL,MAAM,KAAA;IACN,KAAK,KAAA;IACL,MAAM,KAAA;IACN,IAAI,KAAA;IACJ,KAAK,KAAA;IACL,KAAK,KAAA;IACL,MAAM,KAAA;IACN,KAAK,KAAA;IACL,MAAM,KAAA;IACN,KAAK,KAAA;IACL,MAAM,KAAA;IACN,KAAK,KAAA;IACL,MAAM,KAAA;IACN,MAAM,KAAA;IACN,OAAO,KAAA;IAEP,YAAY,KAAA;IACZ,YAAY,KAAA;IACZ,WAAW,KAAA;IACX,cAAc,KAAA;IACd,cAAc,KAAA;IAEd,OAAO,KAAA;IACP,QAAQ,KAAA;IACR,YAAY,KAAA;IACZ,cAAc,KAAA;IAEd,KAAK,KAAA;IACL,MAAM,KAAA;IACN,MAAM,KAAA;IACN,MAAM,KAAA;IACN,OAAO,KAAA;IACP,MAAM,KAAA;IACN,KAAK,KAAA;IACL,MAAM,KAAA;IAEN,KAAK,KAAA;IACL,MAAM,KAAA;IACN,cAAc,KAAA;IACd,YAAY,KAAA;IACZ,eAAe,KAAA;IACf,aAAa,KAAA;IACb,eAAe,KAAA;IACf,mBAAmB,KAAA;IACnB,
|
|
1
|
+
{"version":3,"file":"instruction_serialization.d.ts","sourceRoot":"","sources":["../../../../src/public/avm/serialization/instruction_serialization.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD;;;GAGG;AACH,oBAAY,MAAM;IAEhB,KAAK,IAAA;IACL,MAAM,IAAA;IACN,KAAK,IAAA;IACL,MAAM,IAAA;IACN,KAAK,IAAA;IACL,MAAM,IAAA;IACN,KAAK,IAAA;IACL,MAAM,IAAA;IACN,MAAM,IAAA;IACN,OAAO,IAAA;IACP,IAAI,KAAA;IACJ,KAAK,KAAA;IACL,IAAI,KAAA;IACJ,KAAK,KAAA;IACL,KAAK,KAAA;IACL,MAAM,KAAA;IACN,KAAK,KAAA;IACL,MAAM,KAAA;IACN,IAAI,KAAA;IACJ,KAAK,KAAA;IACL,KAAK,KAAA;IACL,MAAM,KAAA;IACN,KAAK,KAAA;IACL,MAAM,KAAA;IACN,KAAK,KAAA;IACL,MAAM,KAAA;IACN,KAAK,KAAA;IACL,MAAM,KAAA;IACN,MAAM,KAAA;IACN,OAAO,KAAA;IAEP,YAAY,KAAA;IACZ,YAAY,KAAA;IACZ,WAAW,KAAA;IACX,cAAc,KAAA;IACd,cAAc,KAAA;IAEd,OAAO,KAAA;IACP,QAAQ,KAAA;IACR,YAAY,KAAA;IACZ,cAAc,KAAA;IAEd,KAAK,KAAA;IACL,MAAM,KAAA;IACN,MAAM,KAAA;IACN,MAAM,KAAA;IACN,OAAO,KAAA;IACP,MAAM,KAAA;IACN,KAAK,KAAA;IACL,MAAM,KAAA;IAEN,KAAK,KAAA;IACL,MAAM,KAAA;IACN,cAAc,KAAA;IACd,YAAY,KAAA;IACZ,eAAe,KAAA;IACf,aAAa,KAAA;IACb,eAAe,KAAA;IACf,mBAAmB,KAAA;IACnB,aAAa,KAAA;IACb,aAAa,KAAA;IAEb,IAAI,KAAA;IACJ,UAAU,KAAA;IACV,MAAM,KAAA;IACN,QAAQ,KAAA;IACR,SAAS,KAAA;IAET,QAAQ,KAAA;IAER,SAAS,KAAA;IACT,iBAAiB,KAAA;IACjB,WAAW,KAAA;IACX,KAAK,KAAA;IAEL,SAAS,KAAA;CACV;AAED,eAAO,MAAM,gBAAgB,QAI5B,CAAC;AAIF,oBAAY,WAAW;IACrB,KAAK,IAAA;IACL,MAAM,IAAA;IACN,MAAM,IAAA;IACN,MAAM,IAAA;IACN,OAAO,IAAA;IACP,EAAE,IAAA;IACF,GAAG,IAAA;CACJ;AAGD,KAAK,iBAAiB,GAAG,MAAM,GAAG,MAAM,CAAC;AAgBzC;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,WAAW,EAAE,WAAW,GAAG,MAAM,CAG/D;AAkDD;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,GAAG,iBAAiB,EAAE,CAyBvG;AAED;;;;;;;;;GASG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,WAAW,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,GAAG,MAAM,CAmBrF"}
|
|
@@ -66,7 +66,7 @@ import { BufferCursor } from './buffer_cursor.js';
|
|
|
66
66
|
Opcode[Opcode["EMITNULLIFIER"] = 52] = "EMITNULLIFIER";
|
|
67
67
|
Opcode[Opcode["L1TOL2MSGEXISTS"] = 53] = "L1TOL2MSGEXISTS";
|
|
68
68
|
Opcode[Opcode["GETCONTRACTINSTANCE"] = 54] = "GETCONTRACTINSTANCE";
|
|
69
|
-
Opcode[Opcode["
|
|
69
|
+
Opcode[Opcode["EMITPUBLICLOG"] = 55] = "EMITPUBLICLOG";
|
|
70
70
|
Opcode[Opcode["SENDL2TOL1MSG"] = 56] = "SENDL2TOL1MSG";
|
|
71
71
|
// External calls
|
|
72
72
|
Opcode[Opcode["CALL"] = 57] = "CALL";
|
|
@@ -11,6 +11,6 @@ export declare class ContractsDbCheckpoint {
|
|
|
11
11
|
getInstance(address: AztecAddress): ContractInstanceWithAddress | undefined;
|
|
12
12
|
getClass(classId: Fr): ContractClassPublic | undefined;
|
|
13
13
|
getBytecodeCommitment(classId: Fr): Fr | undefined;
|
|
14
|
-
|
|
14
|
+
fork(): ContractsDbCheckpoint;
|
|
15
15
|
}
|
|
16
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
16
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udHJhY3RzX2RiX2NoZWNrcG9pbnQuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wdWJsaWMvY29udHJhY3RzX2RiX2NoZWNrcG9pbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEVBQUUsRUFBRSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDekQsT0FBTyxLQUFLLEVBQUUsWUFBWSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDaEUsT0FBTyxLQUFLLEVBQUUsbUJBQW1CLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUUvRixxQkFBYSxxQkFBcUI7SUFDaEMsT0FBTyxDQUFDLFNBQVMsQ0FBdUQ7SUFDeEUsT0FBTyxDQUFDLE9BQU8sQ0FBK0M7SUFDOUQsT0FBTyxDQUFDLG1CQUFtQixDQUE4QjtJQUVsRCxXQUFXLENBQUMsT0FBTyxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsMkJBQTJCLEdBQUcsSUFBSSxDQUVyRjtJQUVNLFFBQVEsQ0FBQyxPQUFPLEVBQUUsRUFBRSxFQUFFLGFBQWEsRUFBRSxtQkFBbUIsR0FBRyxJQUFJLENBRXJFO0lBRU0scUJBQXFCLENBQUMsT0FBTyxFQUFFLEVBQUUsRUFBRSxVQUFVLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FFOUQ7SUFFTSxXQUFXLENBQUMsT0FBTyxFQUFFLFlBQVksR0FBRywyQkFBMkIsR0FBRyxTQUFTLENBRWpGO0lBRU0sUUFBUSxDQUFDLE9BQU8sRUFBRSxFQUFFLEdBQUcsbUJBQW1CLEdBQUcsU0FBUyxDQUU1RDtJQUVNLHFCQUFxQixDQUFDLE9BQU8sRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLFNBQVMsQ0FFeEQ7SUFFTSxJQUFJLElBQUkscUJBQXFCLENBTW5DO0NBQ0YifQ==
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"contracts_db_checkpoint.d.ts","sourceRoot":"","sources":["../../src/public/contracts_db_checkpoint.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AACzD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,KAAK,EAAE,mBAAmB,EAAE,2BAA2B,EAAE,MAAM,wBAAwB,CAAC;AAE/F,qBAAa,qBAAqB;IAChC,OAAO,CAAC,SAAS,CAAuD;IACxE,OAAO,CAAC,OAAO,CAA+C;IAC9D,OAAO,CAAC,mBAAmB,CAA8B;IAElD,WAAW,CAAC,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,2BAA2B,GAAG,IAAI,CAErF;IAEM,QAAQ,CAAC,OAAO,EAAE,EAAE,EAAE,aAAa,EAAE,mBAAmB,GAAG,IAAI,CAErE;IAEM,qBAAqB,CAAC,OAAO,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,GAAG,IAAI,CAE9D;IAEM,WAAW,CAAC,OAAO,EAAE,YAAY,GAAG,2BAA2B,GAAG,SAAS,CAEjF;IAEM,QAAQ,CAAC,OAAO,EAAE,EAAE,GAAG,mBAAmB,GAAG,SAAS,CAE5D;IAEM,qBAAqB,CAAC,OAAO,EAAE,EAAE,GAAG,EAAE,GAAG,SAAS,CAExD;IAEM,
|
|
1
|
+
{"version":3,"file":"contracts_db_checkpoint.d.ts","sourceRoot":"","sources":["../../src/public/contracts_db_checkpoint.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AACzD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,KAAK,EAAE,mBAAmB,EAAE,2BAA2B,EAAE,MAAM,wBAAwB,CAAC;AAE/F,qBAAa,qBAAqB;IAChC,OAAO,CAAC,SAAS,CAAuD;IACxE,OAAO,CAAC,OAAO,CAA+C;IAC9D,OAAO,CAAC,mBAAmB,CAA8B;IAElD,WAAW,CAAC,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,2BAA2B,GAAG,IAAI,CAErF;IAEM,QAAQ,CAAC,OAAO,EAAE,EAAE,EAAE,aAAa,EAAE,mBAAmB,GAAG,IAAI,CAErE;IAEM,qBAAqB,CAAC,OAAO,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,GAAG,IAAI,CAE9D;IAEM,WAAW,CAAC,OAAO,EAAE,YAAY,GAAG,2BAA2B,GAAG,SAAS,CAEjF;IAEM,QAAQ,CAAC,OAAO,EAAE,EAAE,GAAG,mBAAmB,GAAG,SAAS,CAE5D;IAEM,qBAAqB,CAAC,OAAO,EAAE,EAAE,GAAG,EAAE,GAAG,SAAS,CAExD;IAEM,IAAI,IAAI,qBAAqB,CAMnC;CACF"}
|
|
@@ -20,7 +20,7 @@ export class ContractsDbCheckpoint {
|
|
|
20
20
|
getBytecodeCommitment(classId) {
|
|
21
21
|
return this.bytecodeCommitments.get(classId.toString());
|
|
22
22
|
}
|
|
23
|
-
|
|
23
|
+
fork() {
|
|
24
24
|
const copy = new ContractsDbCheckpoint();
|
|
25
25
|
this.instances.forEach((value, key)=>copy.instances.set(key, value));
|
|
26
26
|
this.classes.forEach((value, key)=>copy.classes.set(key, value));
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { DomainSeparator } from '@aztec/constants';
|
|
2
2
|
import { poseidon2HashWithSeparator } from '@aztec/foundation/crypto/poseidon';
|
|
3
3
|
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
4
4
|
import { Timer } from '@aztec/foundation/timer';
|
|
@@ -11,8 +11,8 @@ const INITIAL_TOKEN_BALANCE = 1_000_000_000n;
|
|
|
11
11
|
* You do NOT need permission to remove this test!
|
|
12
12
|
*/ export async function ammTest(tester, logger, tokenArtifact, ammArtifact, expectToBeTrue) {
|
|
13
13
|
const timer = new Timer();
|
|
14
|
-
const admin = AztecAddress.
|
|
15
|
-
const sender = AztecAddress.
|
|
14
|
+
const admin = AztecAddress.fromNumberUnsafe(42);
|
|
15
|
+
const sender = AztecAddress.fromNumberUnsafe(111);
|
|
16
16
|
logger.debug(`Deploying tokens`);
|
|
17
17
|
const token0 = await setUpToken(tester, tokenArtifact, admin, expectToBeTrue, /*seed=*/ 0);
|
|
18
18
|
const token1 = await setUpToken(tester, tokenArtifact, admin, expectToBeTrue, /*seed=*/ 1);
|
|
@@ -209,5 +209,5 @@ async function computePartialNoteValidityCommitment(partialNote, completer) {
|
|
|
209
209
|
return await poseidon2HashWithSeparator([
|
|
210
210
|
partialNote.commitment,
|
|
211
211
|
completer
|
|
212
|
-
],
|
|
212
|
+
], DomainSeparator.PARTIAL_NOTE_VALIDITY_COMMITMENT);
|
|
213
213
|
}
|
|
@@ -3,4 +3,4 @@ import type { ContractArtifact } from '@aztec/stdlib/abi';
|
|
|
3
3
|
import { PublicTxSimulationTester } from './public_tx_simulation_tester.js';
|
|
4
4
|
export declare function bulkTest(tester: PublicTxSimulationTester, logger: Logger, avmTestContractArtifact: ContractArtifact): Promise<import("@aztec/stdlib/avm").PublicTxResult>;
|
|
5
5
|
export declare function megaBulkTest(tester: PublicTxSimulationTester, logger: Logger, avmTestContractArtifact: ContractArtifact): Promise<import("@aztec/stdlib/avm").PublicTxResult>;
|
|
6
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
6
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVsa190ZXN0LmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcHVibGljL2ZpeHR1cmVzL2J1bGtfdGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUVwRCxPQUFPLEtBQUssRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRzFELE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBRTVFLHdCQUFzQixRQUFRLENBQzVCLE1BQU0sRUFBRSx3QkFBd0IsRUFDaEMsTUFBTSxFQUFFLE1BQU0sRUFDZCx1QkFBdUIsRUFBRSxnQkFBZ0IsdURBZ0cxQztBQUVELHdCQUFzQixZQUFZLENBQ2hDLE1BQU0sRUFBRSx3QkFBd0IsRUFDaEMsTUFBTSxFQUFFLE1BQU0sRUFDZCx1QkFBdUIsRUFBRSxnQkFBZ0IsdURBaUYxQyJ9
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bulk_test.d.ts","sourceRoot":"","sources":["../../../src/public/fixtures/bulk_test.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAEpD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAG1D,OAAO,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC;AAE5E,wBAAsB,QAAQ,CAC5B,MAAM,EAAE,wBAAwB,EAChC,MAAM,EAAE,MAAM,EACd,uBAAuB,EAAE,gBAAgB,
|
|
1
|
+
{"version":3,"file":"bulk_test.d.ts","sourceRoot":"","sources":["../../../src/public/fixtures/bulk_test.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAEpD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAG1D,OAAO,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC;AAE5E,wBAAsB,QAAQ,CAC5B,MAAM,EAAE,wBAAwB,EAChC,MAAM,EAAE,MAAM,EACd,uBAAuB,EAAE,gBAAgB,uDAgG1C;AAED,wBAAsB,YAAY,CAChC,MAAM,EAAE,wBAAwB,EAChC,MAAM,EAAE,MAAM,EACd,uBAAuB,EAAE,gBAAgB,uDAiF1C"}
|
|
@@ -3,13 +3,14 @@ import { Timer } from '@aztec/foundation/timer';
|
|
|
3
3
|
import { AztecAddress } from '@aztec/stdlib/aztec-address';
|
|
4
4
|
export async function bulkTest(tester, logger, avmTestContractArtifact) {
|
|
5
5
|
const timer = new Timer();
|
|
6
|
-
const deployer = AztecAddress.
|
|
6
|
+
const deployer = AztecAddress.fromNumberUnsafe(42);
|
|
7
7
|
const avmTestContract = await tester.registerAndDeployContract(/*constructorArgs=*/ [], deployer, avmTestContractArtifact);
|
|
8
8
|
// Needed since we invoke the Fee Juice Contract in the bulk test.registerFeeJuiceContract
|
|
9
9
|
await tester.registerFeeJuiceContract();
|
|
10
10
|
// Register multiple different protocol contracts (to ensure we don't dedup bytecode hashing events):
|
|
11
11
|
await tester.registerAuthContract();
|
|
12
12
|
await tester.registerInstanceRegistryContract();
|
|
13
|
+
await tester.registerClassRegistryContract();
|
|
13
14
|
// Get a deployed contract instance to pass to the contract
|
|
14
15
|
// for it to use as "expected" values when testing contract instance retrieval.
|
|
15
16
|
const expectContractInstance = avmTestContract;
|
|
@@ -33,10 +34,23 @@ export async function bulkTest(tester, logger, avmTestContractArtifact) {
|
|
|
33
34
|
5,
|
|
34
35
|
6,
|
|
35
36
|
7,
|
|
36
|
-
8
|
|
37
|
+
8,
|
|
38
|
+
9,
|
|
39
|
+
10
|
|
37
40
|
].map((x)=>new Fr(x));
|
|
38
|
-
|
|
39
|
-
|
|
41
|
+
// Pinned grumpkin-Poseidon2 Schnorr signature (mirrors the C++ `pinned_test_vector_large`
|
|
42
|
+
// and noir-lang/schnorr v0.4.0's `pinned_vector_large`). Passing these in as calldata
|
|
43
|
+
// (rather than baking them into Noir as constants) keeps MSM + Poseidon2 from being folded
|
|
44
|
+
// by the Noir compiler.
|
|
45
|
+
const schnorrInputs = [
|
|
46
|
+
Fr.fromHexString('0x065812e335a97c2108ea8cf4ccfe2f9dd6b117a0714f5e18461575be93f61da6'),
|
|
47
|
+
Fr.fromHexString('0x1a915003e8ec534f9a15d926a7ded478e178468ccc4f28e236e67450a55ac622'),
|
|
48
|
+
Fr.fromHexString('0xf3bc3b7147acb9c621fd9f72dbf15ffa'),
|
|
49
|
+
Fr.fromHexString('0x08599f379f0301dfefdbd0272554454d'),
|
|
50
|
+
Fr.fromHexString('0x97065383ebbbd76620398792bd259bc2'),
|
|
51
|
+
Fr.fromHexString('0x2ceaee87f45b7a417f0ffb05451a8c92'),
|
|
52
|
+
Fr.fromHexString('0x0123456789abcdef0fedcba9876543210123456789abcdef0fedcba987654321')
|
|
53
|
+
];
|
|
40
54
|
const args = [
|
|
41
55
|
argsField,
|
|
42
56
|
argsU8,
|
|
@@ -44,6 +58,8 @@ export async function bulkTest(tester, logger, avmTestContractArtifact) {
|
|
|
44
58
|
/*expectedDeployer=*/ expectContractInstance.deployer,
|
|
45
59
|
/*expectedClassId=*/ expectContractInstance.currentContractClassId,
|
|
46
60
|
/*expectedInitializationHash=*/ expectContractInstance.initializationHash,
|
|
61
|
+
/*expectedImmutablesHash=*/ expectContractInstance.immutablesHash,
|
|
62
|
+
/*schnorrInputs=*/ schnorrInputs,
|
|
47
63
|
/*skip_strictly_limited_side_effects=*/ false
|
|
48
64
|
];
|
|
49
65
|
const bulkResult = await tester.executeTxWithLabel(/*txLabel=*/ 'AvmTest/bulk_testing', /*sender=*/ deployer, /*setupCalls=*/ [], /*appCalls=*/ [
|
|
@@ -67,7 +83,7 @@ export async function bulkTest(tester, logger, avmTestContractArtifact) {
|
|
|
67
83
|
address: avmTestContract.address,
|
|
68
84
|
fnName: 'assert_calldata_copy',
|
|
69
85
|
args: [
|
|
70
|
-
argsField.slice(3),
|
|
86
|
+
argsField.slice(0, 3),
|
|
71
87
|
/* with_selector: */ true
|
|
72
88
|
]
|
|
73
89
|
},
|
|
@@ -120,7 +136,7 @@ export async function bulkTest(tester, logger, avmTestContractArtifact) {
|
|
|
120
136
|
}
|
|
121
137
|
export async function megaBulkTest(tester, logger, avmTestContractArtifact) {
|
|
122
138
|
const timer = new Timer();
|
|
123
|
-
const deployer = AztecAddress.
|
|
139
|
+
const deployer = AztecAddress.fromNumberUnsafe(42);
|
|
124
140
|
const avmTestContract = await tester.registerAndDeployContract(/*constructorArgs=*/ [], deployer, avmTestContractArtifact);
|
|
125
141
|
// Needed since we invoke the Fee Juice Contract in the bulk test.registerFeeJuiceContract
|
|
126
142
|
await tester.registerFeeJuiceContract();
|
|
@@ -203,6 +219,15 @@ export async function megaBulkTest(tester, logger, avmTestContractArtifact) {
|
|
|
203
219
|
9,
|
|
204
220
|
10
|
|
205
221
|
].map((x)=>new Fr(x));
|
|
222
|
+
const schnorrInputs = [
|
|
223
|
+
Fr.fromHexString('0x065812e335a97c2108ea8cf4ccfe2f9dd6b117a0714f5e18461575be93f61da6'),
|
|
224
|
+
Fr.fromHexString('0x1a915003e8ec534f9a15d926a7ded478e178468ccc4f28e236e67450a55ac622'),
|
|
225
|
+
Fr.fromHexString('0xf3bc3b7147acb9c621fd9f72dbf15ffa'),
|
|
226
|
+
Fr.fromHexString('0x08599f379f0301dfefdbd0272554454d'),
|
|
227
|
+
Fr.fromHexString('0x97065383ebbbd76620398792bd259bc2'),
|
|
228
|
+
Fr.fromHexString('0x2ceaee87f45b7a417f0ffb05451a8c92'),
|
|
229
|
+
Fr.fromHexString('0x0123456789abcdef0fedcba9876543210123456789abcdef0fedcba987654321')
|
|
230
|
+
];
|
|
206
231
|
const genArgs = (argsField)=>[
|
|
207
232
|
argsField,
|
|
208
233
|
argsU8,
|
|
@@ -210,6 +235,8 @@ export async function megaBulkTest(tester, logger, avmTestContractArtifact) {
|
|
|
210
235
|
/*expectedDeployer=*/ expectContractInstance.deployer.toField(),
|
|
211
236
|
/*expectedClassId=*/ expectContractInstance.currentContractClassId.toField(),
|
|
212
237
|
/*expectedInitializationHash=*/ expectContractInstance.initializationHash.toField(),
|
|
238
|
+
/*expectedImmutablesHash=*/ expectContractInstance.immutablesHash.toField(),
|
|
239
|
+
/*schnorrInputs=*/ schnorrInputs,
|
|
213
240
|
// Must skip strictly limited side effects (logs, messages) so we can spam the bulk test several times.
|
|
214
241
|
/*skip_strictly_limited_side_effects=*/ true
|
|
215
242
|
];
|
|
@@ -31,4 +31,4 @@ export declare function executeCustomBytecode(contract: ContractInstanceWithAddr
|
|
|
31
31
|
* @returns The execution result
|
|
32
32
|
*/
|
|
33
33
|
export declare function deployAndExecuteCustomBytecode(bytecode: Buffer, tester: PublicTxSimulationTester, txLabel?: string, contractName?: string, deployer?: AztecAddress, calldata?: any[]): Promise<PublicTxResult>;
|
|
34
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
34
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VzdG9tX2J5dGVjb2RlX3Rlc3Rlci5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3B1YmxpYy9maXh0dXJlcy9jdXN0b21fYnl0ZWNvZGVfdGVzdGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sS0FBSyxFQUFFLGNBQWMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3hELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUMzRCxPQUFPLEtBQUssRUFBRSwyQkFBMkIsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRTFFLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBRTVFOzs7Ozs7O0dBT0c7QUFDSCx3QkFBc0Isb0JBQW9CLENBQ3hDLFFBQVEsRUFBRSxNQUFNLEVBQ2hCLE1BQU0sRUFBRSx3QkFBd0IsRUFDaEMsWUFBWSxHQUFFLE1BQWlDLEVBQy9DLFFBQVEsR0FBRSxZQUFnRCxHQUN6RCxPQUFPLENBQUMsMkJBQTJCLENBQUMsQ0FpQnRDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILHdCQUFzQixxQkFBcUIsQ0FDekMsUUFBUSxFQUFFLDJCQUEyQixFQUNyQyxNQUFNLEVBQUUsd0JBQXdCLEVBQ2hDLE9BQU8sR0FBRSxNQUE2QixFQUN0QyxRQUFRLEdBQUUsR0FBRyxFQUFPLEdBQ25CLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FRekI7QUFFRDs7Ozs7Ozs7O0dBU0c7QUFDSCx3QkFBc0IsOEJBQThCLENBQ2xELFFBQVEsRUFBRSxNQUFNLEVBQ2hCLE1BQU0sRUFBRSx3QkFBd0IsRUFDaEMsT0FBTyxHQUFFLE1BQTZCLEVBQ3RDLFlBQVksR0FBRSxNQUFpQyxFQUMvQyxRQUFRLEdBQUUsWUFBZ0QsRUFDMUQsUUFBUSxHQUFFLEdBQUcsRUFBTyxHQUNuQixPQUFPLENBQUMsY0FBYyxDQUFDLENBR3pCIn0=
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"custom_bytecode_tester.d.ts","sourceRoot":"","sources":["../../../src/public/fixtures/custom_bytecode_tester.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,wBAAwB,CAAC;AAE1E,OAAO,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC;AAE5E;;;;;;;GAOG;AACH,wBAAsB,oBAAoB,CACxC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,wBAAwB,EAChC,YAAY,GAAE,MAAiC,EAC/C,QAAQ,GAAE,
|
|
1
|
+
{"version":3,"file":"custom_bytecode_tester.d.ts","sourceRoot":"","sources":["../../../src/public/fixtures/custom_bytecode_tester.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,wBAAwB,CAAC;AAE1E,OAAO,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC;AAE5E;;;;;;;GAOG;AACH,wBAAsB,oBAAoB,CACxC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,wBAAwB,EAChC,YAAY,GAAE,MAAiC,EAC/C,QAAQ,GAAE,YAAgD,GACzD,OAAO,CAAC,2BAA2B,CAAC,CAiBtC;AAED;;;;;;;GAOG;AACH,wBAAsB,qBAAqB,CACzC,QAAQ,EAAE,2BAA2B,EACrC,MAAM,EAAE,wBAAwB,EAChC,OAAO,GAAE,MAA6B,EACtC,QAAQ,GAAE,GAAG,EAAO,GACnB,OAAO,CAAC,cAAc,CAAC,CAQzB;AAED;;;;;;;;;GASG;AACH,wBAAsB,8BAA8B,CAClD,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,wBAAwB,EAChC,OAAO,GAAE,MAA6B,EACtC,YAAY,GAAE,MAAiC,EAC/C,QAAQ,GAAE,YAAgD,EAC1D,QAAQ,GAAE,GAAG,EAAO,GACnB,OAAO,CAAC,cAAc,CAAC,CAGzB"}
|
|
@@ -7,7 +7,7 @@ import { AztecAddress } from '@aztec/stdlib/aztec-address';
|
|
|
7
7
|
* @param contractName - The name of the contract
|
|
8
8
|
* @param deployer - The deployer address
|
|
9
9
|
* @returns The deployed contract instance
|
|
10
|
-
*/ export async function deployCustomBytecode(bytecode, tester, contractName = 'CustomBytecodeContract', deployer = AztecAddress.
|
|
10
|
+
*/ export async function deployCustomBytecode(bytecode, tester, contractName = 'CustomBytecodeContract', deployer = AztecAddress.fromNumberUnsafe(42)) {
|
|
11
11
|
const contractArtifact = emptyContractArtifact();
|
|
12
12
|
contractArtifact.name = contractName;
|
|
13
13
|
contractArtifact.functions = [
|
|
@@ -47,7 +47,7 @@ import { AztecAddress } from '@aztec/stdlib/aztec-address';
|
|
|
47
47
|
* @param deployer - The deployer address
|
|
48
48
|
* @param calldata - The calldata to use
|
|
49
49
|
* @returns The execution result
|
|
50
|
-
*/ export async function deployAndExecuteCustomBytecode(bytecode, tester, txLabel = 'CustomBytecodeTest', contractName = 'CustomBytecodeContract', deployer = AztecAddress.
|
|
50
|
+
*/ export async function deployAndExecuteCustomBytecode(bytecode, tester, txLabel = 'CustomBytecodeTest', contractName = 'CustomBytecodeContract', deployer = AztecAddress.fromNumberUnsafe(42), calldata = []) {
|
|
51
51
|
const testContract = await deployCustomBytecode(bytecode, tester, contractName, deployer);
|
|
52
52
|
return await executeCustomBytecode(testContract, tester, txLabel, calldata);
|
|
53
53
|
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { ContractInstanceWithAddress } from '@aztec/stdlib/contract';
|
|
1
2
|
import { PublicTxSimulationTester } from './public_tx_simulation_tester.js';
|
|
2
3
|
export declare function addressingWithBaseTagIssueTest(isIndirect: boolean, tester: PublicTxSimulationTester): Promise<import("@aztec/stdlib/avm").PublicTxResult>;
|
|
3
4
|
export declare function addressingWithIndirectTagIssueTest(tester: PublicTxSimulationTester): Promise<import("@aztec/stdlib/avm").PublicTxResult>;
|
|
@@ -9,4 +10,10 @@ export declare function invalidByteTest(tester: PublicTxSimulationTester): Promi
|
|
|
9
10
|
export declare function instructionTruncatedTest(tester: PublicTxSimulationTester): Promise<import("@aztec/stdlib/avm").PublicTxResult>;
|
|
10
11
|
export declare function invalidTagValueTest(tester: PublicTxSimulationTester): Promise<import("@aztec/stdlib/avm").PublicTxResult>;
|
|
11
12
|
export declare function invalidTagValueAndInstructionTruncatedTest(tester: PublicTxSimulationTester): Promise<import("@aztec/stdlib/avm").PublicTxResult>;
|
|
12
|
-
|
|
13
|
+
export declare function setTruncationTest(tester: PublicTxSimulationTester): Promise<import("@aztec/stdlib/avm").PublicTxResult>;
|
|
14
|
+
export declare function castTruncationTest(tester: PublicTxSimulationTester): Promise<import("@aztec/stdlib/avm").PublicTxResult>;
|
|
15
|
+
export declare function deployBitwiseSha256ErrorRowCollisionContracts(tester: PublicTxSimulationTester): Promise<{
|
|
16
|
+
innerContract: ContractInstanceWithAddress;
|
|
17
|
+
outerContract: ContractInstanceWithAddress;
|
|
18
|
+
}>;
|
|
19
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VzdG9tX2J5dGVjb2RlX3Rlc3RzLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcHVibGljL2ZpeHR1cmVzL2N1c3RvbV9ieXRlY29kZV90ZXN0cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSwyQkFBMkIsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBZTFFLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBSTVFLHdCQUFzQiw4QkFBOEIsQ0FBQyxVQUFVLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSx3QkFBd0IsdURBY3pHO0FBS0Qsd0JBQXNCLGtDQUFrQyxDQUFDLE1BQU0sRUFBRSx3QkFBd0IsdURBc0J4RjtBQU9ELHdCQUFzQiw4Q0FBOEMsQ0FBQyxNQUFNLEVBQUUsd0JBQXdCLHVEQXdCcEc7QUFPRCx3QkFBc0IscURBQXFELENBQUMsTUFBTSxFQUFFLHdCQUF3Qix1REF5QjNHO0FBRUQsd0JBQXNCLGdCQUFnQixDQUFDLE1BQU0sRUFBRSx3QkFBd0IsdURBUXRFO0FBRUQsd0JBQXNCLGlCQUFpQixDQUFDLE1BQU0sRUFBRSx3QkFBd0IsdURBaUJ2RTtBQUdELHdCQUFzQixlQUFlLENBQUMsTUFBTSxFQUFFLHdCQUF3Qix1REFPckU7QUFHRCx3QkFBc0Isd0JBQXdCLENBQUMsTUFBTSxFQUFFLHdCQUF3Qix1REFVOUU7QUFHRCx3QkFBc0IsbUJBQW1CLENBQUMsTUFBTSxFQUFFLHdCQUF3Qix1REFZekU7QUFHRCx3QkFBc0IsMENBQTBDLENBQUMsTUFBTSxFQUFFLHdCQUF3Qix1REFpQmhHO0FBTUQsd0JBQXNCLGlCQUFpQixDQUFDLE1BQU0sRUFBRSx3QkFBd0IsdURBMkR2RTtBQU1ELHdCQUFzQixrQkFBa0IsQ0FBQyxNQUFNLEVBQUUsd0JBQXdCLHVEQW1FeEU7QUFxQkQsd0JBQXNCLDZDQUE2QyxDQUNqRSxNQUFNLEVBQUUsd0JBQXdCLEdBQy9CLE9BQU8sQ0FBQztJQUFFLGFBQWEsRUFBRSwyQkFBMkIsQ0FBQztJQUFDLGFBQWEsRUFBRSwyQkFBMkIsQ0FBQTtDQUFFLENBQUMsQ0ErRHJHIn0=
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"custom_bytecode_tests.d.ts","sourceRoot":"","sources":["../../../src/public/fixtures/custom_bytecode_tests.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"custom_bytecode_tests.d.ts","sourceRoot":"","sources":["../../../src/public/fixtures/custom_bytecode_tests.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,wBAAwB,CAAC;AAe1E,OAAO,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC;AAI5E,wBAAsB,8BAA8B,CAAC,UAAU,EAAE,OAAO,EAAE,MAAM,EAAE,wBAAwB,uDAczG;AAKD,wBAAsB,kCAAkC,CAAC,MAAM,EAAE,wBAAwB,uDAsBxF;AAOD,wBAAsB,8CAA8C,CAAC,MAAM,EAAE,wBAAwB,uDAwBpG;AAOD,wBAAsB,qDAAqD,CAAC,MAAM,EAAE,wBAAwB,uDAyB3G;AAED,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,wBAAwB,uDAQtE;AAED,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,wBAAwB,uDAiBvE;AAGD,wBAAsB,eAAe,CAAC,MAAM,EAAE,wBAAwB,uDAOrE;AAGD,wBAAsB,wBAAwB,CAAC,MAAM,EAAE,wBAAwB,uDAU9E;AAGD,wBAAsB,mBAAmB,CAAC,MAAM,EAAE,wBAAwB,uDAYzE;AAGD,wBAAsB,0CAA0C,CAAC,MAAM,EAAE,wBAAwB,uDAiBhG;AAMD,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,wBAAwB,uDA2DvE;AAMD,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,wBAAwB,uDAmExE;AAqBD,wBAAsB,6CAA6C,CACjE,MAAM,EAAE,wBAAwB,GAC/B,OAAO,CAAC;IAAE,aAAa,EAAE,2BAA2B,CAAC;IAAC,aAAa,EAAE,2BAA2B,CAAA;CAAE,CAAC,CA+DrG"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { strict as assert } from 'assert';
|
|
2
2
|
import { TypeTag } from '../avm/avm_memory_types.js';
|
|
3
3
|
import { Addressing, AddressingMode } from '../avm/opcodes/addressing_mode.js';
|
|
4
|
-
import { Add, CalldataCopy, Jump, Return, Set } from '../avm/opcodes/index.js';
|
|
4
|
+
import { Add, Call, CalldataCopy, Cast, Jump, Return, Set, Sha256Compression, Xor } from '../avm/opcodes/index.js';
|
|
5
5
|
import { encodeToBytecode } from '../avm/serialization/bytecode_serialization.js';
|
|
6
6
|
import { MAX_OPCODE_VALUE, Opcode, OperandType, getOperandSize } from '../avm/serialization/instruction_serialization.js';
|
|
7
|
-
import { deployAndExecuteCustomBytecode } from './custom_bytecode_tester.js';
|
|
7
|
+
import { deployAndExecuteCustomBytecode, deployCustomBytecode } from './custom_bytecode_tester.js';
|
|
8
8
|
// First instruction resolved a base address (offset 0) which is uninitialized and therefore
|
|
9
9
|
// of invalid tag (FF). This will trigger an exceptional halt.
|
|
10
10
|
export async function addressingWithBaseTagIssueTest(isIndirect, tester) {
|
|
@@ -155,6 +155,66 @@ export async function invalidTagValueAndInstructionTruncatedTest(tester) {
|
|
|
155
155
|
const txLabel = 'InvalidTagValueAndInstructionTruncated';
|
|
156
156
|
return await deployAndExecuteCustomBytecode(bytecode, tester, txLabel);
|
|
157
157
|
}
|
|
158
|
+
// Exercise SET truncation: set values whose widths exceed the target tag and
|
|
159
|
+
// rely on `buildFromTagTruncating` to truncate to the low bits of the tag.
|
|
160
|
+
// Covers sources larger than 128 bits (via SET_FF) and sources in (32, 128]
|
|
161
|
+
// bits (via SET_64) against destination tags U1/U8/U16/U32/U64/U128.
|
|
162
|
+
export async function setTruncationTest(tester) {
|
|
163
|
+
// 200-bit value: forces truncation for every target tag up to U128.
|
|
164
|
+
const LARGE_FIELD_VALUE = (1n << 200n) + 0x1234567890abcdef1234567890abcdefn;
|
|
165
|
+
// 40-bit value: forces truncation for target tags up to U32.
|
|
166
|
+
const LARGE_U64_VALUE = (1n << 40n) + 0xdeadbeefn;
|
|
167
|
+
const bytecode = encodeToBytecode([
|
|
168
|
+
// Zero U32 at offset 0 — used as the Return copy-size slot.
|
|
169
|
+
new Set(/*addressing_mode=*/ 0, /*dstOffset=*/ 0, TypeTag.UINT32, /*value=*/ 0).as(Opcode.SET_8, Set.wireFormat8),
|
|
170
|
+
// Source >128 bits (via SET_FF) truncated to smaller target tags.
|
|
171
|
+
new Set(/*addressing_mode=*/ 0, /*dstOffset=*/ 1, TypeTag.UINT128, LARGE_FIELD_VALUE).as(Opcode.SET_FF, Set.wireFormatFF),
|
|
172
|
+
new Set(/*addressing_mode=*/ 0, /*dstOffset=*/ 2, TypeTag.UINT64, LARGE_FIELD_VALUE).as(Opcode.SET_FF, Set.wireFormatFF),
|
|
173
|
+
new Set(/*addressing_mode=*/ 0, /*dstOffset=*/ 3, TypeTag.UINT32, LARGE_FIELD_VALUE).as(Opcode.SET_FF, Set.wireFormatFF),
|
|
174
|
+
new Set(/*addressing_mode=*/ 0, /*dstOffset=*/ 4, TypeTag.UINT16, LARGE_FIELD_VALUE).as(Opcode.SET_FF, Set.wireFormatFF),
|
|
175
|
+
new Set(/*addressing_mode=*/ 0, /*dstOffset=*/ 5, TypeTag.UINT8, LARGE_FIELD_VALUE).as(Opcode.SET_FF, Set.wireFormatFF),
|
|
176
|
+
new Set(/*addressing_mode=*/ 0, /*dstOffset=*/ 6, TypeTag.UINT1, LARGE_FIELD_VALUE).as(Opcode.SET_FF, Set.wireFormatFF),
|
|
177
|
+
// Source in (32, 128] bits (via SET_64) truncated to smaller target tags.
|
|
178
|
+
new Set(/*addressing_mode=*/ 0, /*dstOffset=*/ 7, TypeTag.UINT32, LARGE_U64_VALUE).as(Opcode.SET_64, Set.wireFormat64),
|
|
179
|
+
new Set(/*addressing_mode=*/ 0, /*dstOffset=*/ 8, TypeTag.UINT16, LARGE_U64_VALUE).as(Opcode.SET_64, Set.wireFormat64),
|
|
180
|
+
new Set(/*addressing_mode=*/ 0, /*dstOffset=*/ 9, TypeTag.UINT8, LARGE_U64_VALUE).as(Opcode.SET_64, Set.wireFormat64),
|
|
181
|
+
new Set(/*addressing_mode=*/ 0, /*dstOffset=*/ 10, TypeTag.UINT1, LARGE_U64_VALUE).as(Opcode.SET_64, Set.wireFormat64),
|
|
182
|
+
new Return(/*addressing_mode=*/ 0, /*copySizeOffset=*/ 0, /*returnOffset=*/ 0)
|
|
183
|
+
]);
|
|
184
|
+
const txLabel = 'SetTruncation';
|
|
185
|
+
return await deployAndExecuteCustomBytecode(bytecode, tester, txLabel);
|
|
186
|
+
}
|
|
187
|
+
// Exercise CAST truncation: store a wide source value in memory then CAST it
|
|
188
|
+
// to smaller destination tags. Covers sources larger than 128 bits (FIELD
|
|
189
|
+
// source) and sources in (32, 128] bits (UINT64 source) against destination
|
|
190
|
+
// tags U1/U8/U16/U32/U64/U128.
|
|
191
|
+
export async function castTruncationTest(tester) {
|
|
192
|
+
// 200-bit source: stored as FIELD so that CASTs to any integer tag truncate.
|
|
193
|
+
const LARGE_FIELD_VALUE = (1n << 200n) + 0x1234567890abcdef1234567890abcdefn;
|
|
194
|
+
// 40-bit source: stored as UINT64 so CASTs to U1/U8/U16/U32 truncate.
|
|
195
|
+
const LARGE_U64_VALUE = (1n << 40n) + 0xdeadbeefn;
|
|
196
|
+
const bytecode = encodeToBytecode([
|
|
197
|
+
// Zero U32 at offset 0 — used as the Return copy-size slot.
|
|
198
|
+
new Set(/*addressing_mode=*/ 0, /*dstOffset=*/ 0, TypeTag.UINT32, /*value=*/ 0).as(Opcode.SET_8, Set.wireFormat8),
|
|
199
|
+
// Store wide FIELD source at offset 10, then CAST to smaller tags.
|
|
200
|
+
new Set(/*addressing_mode=*/ 0, /*dstOffset=*/ 10, TypeTag.FIELD, LARGE_FIELD_VALUE).as(Opcode.SET_FF, Set.wireFormatFF),
|
|
201
|
+
new Cast(/*addressing_mode=*/ 0, /*srcOffset=*/ 10, /*dstOffset=*/ 11, TypeTag.UINT128).as(Opcode.CAST_8, Cast.wireFormat8),
|
|
202
|
+
new Cast(/*addressing_mode=*/ 0, /*srcOffset=*/ 10, /*dstOffset=*/ 12, TypeTag.UINT64).as(Opcode.CAST_8, Cast.wireFormat8),
|
|
203
|
+
new Cast(/*addressing_mode=*/ 0, /*srcOffset=*/ 10, /*dstOffset=*/ 13, TypeTag.UINT32).as(Opcode.CAST_8, Cast.wireFormat8),
|
|
204
|
+
new Cast(/*addressing_mode=*/ 0, /*srcOffset=*/ 10, /*dstOffset=*/ 14, TypeTag.UINT16).as(Opcode.CAST_8, Cast.wireFormat8),
|
|
205
|
+
new Cast(/*addressing_mode=*/ 0, /*srcOffset=*/ 10, /*dstOffset=*/ 15, TypeTag.UINT8).as(Opcode.CAST_8, Cast.wireFormat8),
|
|
206
|
+
new Cast(/*addressing_mode=*/ 0, /*srcOffset=*/ 10, /*dstOffset=*/ 16, TypeTag.UINT1).as(Opcode.CAST_8, Cast.wireFormat8),
|
|
207
|
+
// Store UINT64 source at offset 20, then CAST to smaller integer tags.
|
|
208
|
+
new Set(/*addressing_mode=*/ 0, /*dstOffset=*/ 20, TypeTag.UINT64, LARGE_U64_VALUE).as(Opcode.SET_64, Set.wireFormat64),
|
|
209
|
+
new Cast(/*addressing_mode=*/ 0, /*srcOffset=*/ 20, /*dstOffset=*/ 21, TypeTag.UINT32).as(Opcode.CAST_8, Cast.wireFormat8),
|
|
210
|
+
new Cast(/*addressing_mode=*/ 0, /*srcOffset=*/ 20, /*dstOffset=*/ 22, TypeTag.UINT16).as(Opcode.CAST_8, Cast.wireFormat8),
|
|
211
|
+
new Cast(/*addressing_mode=*/ 0, /*srcOffset=*/ 20, /*dstOffset=*/ 23, TypeTag.UINT8).as(Opcode.CAST_8, Cast.wireFormat8),
|
|
212
|
+
new Cast(/*addressing_mode=*/ 0, /*srcOffset=*/ 20, /*dstOffset=*/ 24, TypeTag.UINT1).as(Opcode.CAST_8, Cast.wireFormat8),
|
|
213
|
+
new Return(/*addressing_mode=*/ 0, /*copySizeOffset=*/ 0, /*returnOffset=*/ 0)
|
|
214
|
+
]);
|
|
215
|
+
const txLabel = 'CastTruncation';
|
|
216
|
+
return await deployAndExecuteCustomBytecode(bytecode, tester, txLabel);
|
|
217
|
+
}
|
|
158
218
|
/**
|
|
159
219
|
* Returns the offset of the tag in an instruction.
|
|
160
220
|
* @details Loops over the wire format operand type entries until it finds the tag.
|
|
@@ -172,3 +232,32 @@ export async function invalidTagValueAndInstructionTruncatedTest(tester) {
|
|
|
172
232
|
}
|
|
173
233
|
return offset;
|
|
174
234
|
}
|
|
235
|
+
export async function deployBitwiseSha256ErrorRowCollisionContracts(tester) {
|
|
236
|
+
const innerBytecode = encodeToBytecode([
|
|
237
|
+
new Set(/*addressing_mode=*/ 0, /*dstOffset=*/ 0, TypeTag.UINT32, /*value=*/ 0).as(Opcode.SET_8, Set.wireFormat8),
|
|
238
|
+
new Set(/*addressing_mode=*/ 0, /*dstOffset=*/ 1, TypeTag.UINT16, /*value=*/ 0).as(Opcode.SET_8, Set.wireFormat8),
|
|
239
|
+
new Xor(/*addressing_mode=*/ 0, /*aOffset=*/ 0, /*bOffset=*/ 1, /*dstOffset=*/ 2).as(Opcode.XOR_8, Xor.wireFormat8),
|
|
240
|
+
new Return(/*addressing_mode=*/ 0, /*copySizeOffset=*/ 0, /*returnOffset=*/ 0)
|
|
241
|
+
]);
|
|
242
|
+
const outerInstructions = [
|
|
243
|
+
new Set(/*addressing_mode=*/ 0, /*dstOffset=*/ 0, TypeTag.UINT32, /*value=*/ 0).as(Opcode.SET_8, Set.wireFormat8),
|
|
244
|
+
new Set(/*addressing_mode=*/ 0, /*dstOffset=*/ 1, TypeTag.UINT32, /*value=*/ 1).as(Opcode.SET_8, Set.wireFormat8),
|
|
245
|
+
new Set(/*addressing_mode=*/ 0, /*dstOffset=*/ 2, TypeTag.UINT32, /*value=*/ 100_000).as(Opcode.SET_32, Set.wireFormat32),
|
|
246
|
+
new CalldataCopy(/*addressing_mode=*/ 0, /*copySizeOffset=*/ 1, /*cdStartOffset=*/ 0, /*dstOffset=*/ 3),
|
|
247
|
+
new Call(/*addressing_mode=*/ 0, /*l2GasOffset=*/ 2, /*daGasOffset=*/ 2, /*addrOffset=*/ 3, /*argsSizeOffset=*/ 0, /*argsOffset=*/ 0)
|
|
248
|
+
];
|
|
249
|
+
for(let i = 0; i < 8; i++){
|
|
250
|
+
outerInstructions.push(new Set(/*addressing_mode=*/ 0, /*dstOffset=*/ 10 + i, TypeTag.UINT32, /*value=*/ 0).as(Opcode.SET_8, Set.wireFormat8));
|
|
251
|
+
}
|
|
252
|
+
outerInstructions.push(new Set(/*addressing_mode=*/ 0, /*dstOffset=*/ 18, TypeTag.UINT32, /*value=*/ 0x61626364).as(Opcode.SET_32, Set.wireFormat32));
|
|
253
|
+
for(let i = 0; i < 15; i++){
|
|
254
|
+
outerInstructions.push(new Set(/*addressing_mode=*/ 0, /*dstOffset=*/ 19 + i, TypeTag.UINT32, /*value=*/ 0).as(Opcode.SET_8, Set.wireFormat8));
|
|
255
|
+
}
|
|
256
|
+
outerInstructions.push(new Sha256Compression(/*addressing_mode=*/ 0, /*outputOffset=*/ 34, /*stateOffset=*/ 10, /*inputsOffset=*/ 18), new Return(/*addressing_mode=*/ 0, /*copySizeOffset=*/ 0, /*returnOffset=*/ 0));
|
|
257
|
+
const innerContract = await deployCustomBytecode(innerBytecode, tester, 'BitwiseSha256CollisionInner');
|
|
258
|
+
const outerContract = await deployCustomBytecode(encodeToBytecode(outerInstructions), tester, 'BitwiseSha256CollisionOuter');
|
|
259
|
+
return {
|
|
260
|
+
innerContract,
|
|
261
|
+
outerContract
|
|
262
|
+
};
|
|
263
|
+
}
|
|
@@ -119,4 +119,4 @@ export declare function createOpcodeSpamBytecode(config: SpamConfig): Buffer;
|
|
|
119
119
|
export declare function createSideEffectSpamBytecode(config: SpamConfig): Buffer;
|
|
120
120
|
export declare function testOpcodeSpamCase(tester: PublicTxSimulationTester, config: SpamConfig, expectToBeTrue?: (x: boolean) => void): Promise<PublicTxResult>;
|
|
121
121
|
export {};
|
|
122
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
122
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3Bjb2RlX3NwYW1tZXIuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9wdWJsaWMvZml4dHVyZXMvb3Bjb2RlX3NwYW1tZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBa0tBLE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNwRCxPQUFPLEtBQUssRUFBRSxVQUFVLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUM5RCxPQUFPLEVBQTJDLEtBQUssY0FBYyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDakcsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBRTNELE9BQU8sS0FBSyxFQUFFLHlCQUF5QixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFLakYsT0FBTyxFQUFTLEtBQUssV0FBVyxFQUFnRCxNQUFNLDRCQUE0QixDQUFDO0FBa0RuSCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sbURBQW1ELENBQUM7QUFFM0UsT0FBTyxLQUFLLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQU1qRjs7R0FFRztBQUNILFVBQVUsUUFBUTtJQUNoQixNQUFNLEVBQUUsTUFBTSxDQUFDO0lBQ2YsS0FBSyxFQUFFLFdBQVcsQ0FBQztDQUNwQjtBQUVEOzs7R0FHRztBQUNILEtBQUssU0FBUyxHQUFHLFFBQVEsR0FBRyxDQUFDLE1BQU0sVUFBVSxFQUFFLENBQUMsQ0FBQztBQUVqRDs7R0FFRztBQUNILE1BQU0sV0FBVyxVQUFVO0lBQ3pCLGlDQUFpQztJQUNqQyxLQUFLLEVBQUUsU0FBUyxFQUFFLENBQUM7SUFFbkIsc0RBQXNEO0lBQ3RELGtCQUFrQixFQUFFLE1BQU0sVUFBVSxFQUFFLENBQUM7SUFFdkMsMkRBQTJEO0lBQzNELG1CQUFtQixDQUFDLEVBQUUsTUFBTSxVQUFVLEVBQUUsQ0FBQztJQUV6Qzs7Ozs7OztPQU9HO0lBQ0gsS0FBSyxDQUFDLEVBQUUsTUFBTSxDQUFDO0lBRWYsc0VBQXNFO0lBQ3RFLEtBQUssQ0FBQyxFQUFFLE1BQU0sQ0FBQztJQUVmLDBEQUEwRDtJQUMxRCxpQkFBaUIsQ0FBQyxFQUFFLE9BQU8sQ0FBQztDQUM3QjtBQUVEOzs7R0FHRztBQUNILE1BQU0sV0FBVyxvQkFBb0I7SUFDbkMsa0NBQWtDO0lBQ2xDLE1BQU0sRUFBRSxNQUFNLENBQUM7SUFFZixxREFBcUQ7SUFDckQsT0FBTyxFQUFFLFVBQVUsRUFBRSxDQUFDO0NBQ3ZCO0FBTUQ7OztHQUdHO0FBQ0gsZUFBTyxNQUFNLGNBQWMsSUFBc0IsQ0FBQztBQUNsRCxlQUFPLE1BQU0saUJBQWlCLElBQThCLENBQUM7QUFFN0QsNkZBQTZGO0FBQzdGLGVBQU8sTUFBTSxxQkFBcUIsSUFBMEIsQ0FBQztBQUU3RCx1RkFBdUY7QUFDdkYsZUFBTyxNQUFNLGlCQUFpQixJQUEwQixDQUFDO0FBQ3pELGVBQU8sTUFBTSxrQkFBa0IsSUFBMEIsQ0FBQztBQUUxRDs7OztHQUlHO0FBQ0gsZUFBTyxNQUFNLHlCQUF5QixLQUFLLENBQUM7QUFDNUMsZUFBTyxNQUFNLDRCQUE0QixLQUFLLENBQUM7QUFFL0M7Ozs7Ozs7OztHQVNHO0FBQ0gsd0JBQXNCLHFCQUFxQixDQUN6QyxXQUFXLEVBQUUseUJBQXlCLEVBQ3RDLGVBQWUsRUFBRSxZQUFZLEdBQzVCLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FjZjtBQW1HRDs7R0FFRztBQUNILGVBQU8sTUFBTSxvQkFBb0IsRUFBRSxVQTBCbEMsQ0FBQztBQWtDRjs7OztHQUlHO0FBQ0gsZUFBTyxNQUFNLFlBQVksRUFBRSxPQUFPLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQWs4QjlELENBQUM7QUFFRjs7Ozs7Ozs7Ozs7R0FXRztBQUNILHdCQUFnQix1QkFBdUIsQ0FBQyxtQkFBbUIsR0FBRSxNQUFpQixHQUFHLG9CQUFvQixFQUFFLENBc0J0RztBQTRGRDs7O0dBR0c7QUFDSCx3QkFBZ0Isd0JBQXdCLENBQUMsTUFBTSxFQUFFLFVBQVUsR0FBRyxNQUFNLENBZW5FO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsd0JBQWdCLDRCQUE0QixDQUFDLE1BQU0sRUFBRSxVQUFVLEdBQUcsTUFBTSxDQW1CdkU7QUE0REQsd0JBQXNCLGtCQUFrQixDQUN0QyxNQUFNLEVBQUUsd0JBQXdCLEVBQ2hDLE1BQU0sRUFBRSxVQUFVLEVBQ2xCLGNBQWMsR0FBRSxDQUFDLENBQUMsRUFBRSxPQUFPLEtBQUssSUFBZSxHQUM5QyxPQUFPLENBQUMsY0FBYyxDQUFDLENBS3pCIn0=
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"opcode_spammer.d.ts","sourceRoot":"","sources":["../../../src/public/fixtures/opcode_spammer.ts"],"names":[],"mappings":"AAkKA,OAAO,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AACpD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAA2C,KAAK,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACjG,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAE3D,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,iCAAiC,CAAC;AAKjF,OAAO,EAAS,KAAK,WAAW,EAAgD,MAAM,4BAA4B,CAAC;AAkDnH,OAAO,EAAE,MAAM,EAAE,MAAM,mDAAmD,CAAC;AAE3E,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC;AAMjF;;GAEG;AACH,UAAU,QAAQ;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,WAAW,CAAC;CACpB;AAED;;;GAGG;AACH,KAAK,SAAS,GAAG,QAAQ,GAAG,CAAC,MAAM,UAAU,EAAE,CAAC,CAAC;AAEjD;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,iCAAiC;IACjC,KAAK,EAAE,SAAS,EAAE,CAAC;IAEnB,sDAAsD;IACtD,kBAAkB,EAAE,MAAM,UAAU,EAAE,CAAC;IAEvC,2DAA2D;IAC3D,mBAAmB,CAAC,EAAE,MAAM,UAAU,EAAE,CAAC;IAEzC;;;;;;;OAOG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,sEAAsE;IACtE,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,0DAA0D;IAC1D,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED;;;GAGG;AACH,MAAM,WAAW,oBAAoB;IACnC,kCAAkC;IAClC,MAAM,EAAE,MAAM,CAAC;IAEf,qDAAqD;IACrD,OAAO,EAAE,UAAU,EAAE,CAAC;CACvB;AAMD;;;GAGG;AACH,eAAO,MAAM,cAAc,IAAsB,CAAC;AAClD,eAAO,MAAM,iBAAiB,IAA8B,CAAC;AAE7D,6FAA6F;AAC7F,eAAO,MAAM,qBAAqB,IAA0B,CAAC;AAE7D,uFAAuF;AACvF,eAAO,MAAM,iBAAiB,IAA0B,CAAC;AACzD,eAAO,MAAM,kBAAkB,IAA0B,CAAC;AAE1D;;;;GAIG;AACH,eAAO,MAAM,yBAAyB,KAAK,CAAC;AAC5C,eAAO,MAAM,4BAA4B,KAAK,CAAC;AAE/C;;;;;;;;;GASG;AACH,wBAAsB,qBAAqB,CACzC,WAAW,EAAE,yBAAyB,EACtC,eAAe,EAAE,YAAY,GAC5B,OAAO,CAAC,IAAI,CAAC,CAcf;AAmGD;;GAEG;AACH,eAAO,MAAM,oBAAoB,EAAE,UA0BlC,CAAC;AAkCF;;;;GAIG;AACH,eAAO,MAAM,YAAY,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,EAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"opcode_spammer.d.ts","sourceRoot":"","sources":["../../../src/public/fixtures/opcode_spammer.ts"],"names":[],"mappings":"AAkKA,OAAO,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AACpD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAA2C,KAAK,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACjG,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAE3D,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,iCAAiC,CAAC;AAKjF,OAAO,EAAS,KAAK,WAAW,EAAgD,MAAM,4BAA4B,CAAC;AAkDnH,OAAO,EAAE,MAAM,EAAE,MAAM,mDAAmD,CAAC;AAE3E,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC;AAMjF;;GAEG;AACH,UAAU,QAAQ;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,WAAW,CAAC;CACpB;AAED;;;GAGG;AACH,KAAK,SAAS,GAAG,QAAQ,GAAG,CAAC,MAAM,UAAU,EAAE,CAAC,CAAC;AAEjD;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,iCAAiC;IACjC,KAAK,EAAE,SAAS,EAAE,CAAC;IAEnB,sDAAsD;IACtD,kBAAkB,EAAE,MAAM,UAAU,EAAE,CAAC;IAEvC,2DAA2D;IAC3D,mBAAmB,CAAC,EAAE,MAAM,UAAU,EAAE,CAAC;IAEzC;;;;;;;OAOG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,sEAAsE;IACtE,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,0DAA0D;IAC1D,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED;;;GAGG;AACH,MAAM,WAAW,oBAAoB;IACnC,kCAAkC;IAClC,MAAM,EAAE,MAAM,CAAC;IAEf,qDAAqD;IACrD,OAAO,EAAE,UAAU,EAAE,CAAC;CACvB;AAMD;;;GAGG;AACH,eAAO,MAAM,cAAc,IAAsB,CAAC;AAClD,eAAO,MAAM,iBAAiB,IAA8B,CAAC;AAE7D,6FAA6F;AAC7F,eAAO,MAAM,qBAAqB,IAA0B,CAAC;AAE7D,uFAAuF;AACvF,eAAO,MAAM,iBAAiB,IAA0B,CAAC;AACzD,eAAO,MAAM,kBAAkB,IAA0B,CAAC;AAE1D;;;;GAIG;AACH,eAAO,MAAM,yBAAyB,KAAK,CAAC;AAC5C,eAAO,MAAM,4BAA4B,KAAK,CAAC;AAE/C;;;;;;;;;GASG;AACH,wBAAsB,qBAAqB,CACzC,WAAW,EAAE,yBAAyB,EACtC,eAAe,EAAE,YAAY,GAC5B,OAAO,CAAC,IAAI,CAAC,CAcf;AAmGD;;GAEG;AACH,eAAO,MAAM,oBAAoB,EAAE,UA0BlC,CAAC;AAkCF;;;;GAIG;AACH,eAAO,MAAM,YAAY,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,EAAE,CAAC,CAk8B9D,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,wBAAgB,uBAAuB,CAAC,mBAAmB,GAAE,MAAiB,GAAG,oBAAoB,EAAE,CAsBtG;AA4FD;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CAenE;AAED;;;;;;GAMG;AACH,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CAmBvE;AA4DD,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,wBAAwB,EAChC,MAAM,EAAE,UAAU,EAClB,cAAc,GAAE,CAAC,CAAC,EAAE,OAAO,KAAK,IAAe,GAC9C,OAAO,CAAC,cAAc,CAAC,CAKzB"}
|