@aztec/simulator 0.74.0 → 0.75.0-commit.c03ba01a2a4122e43e90d5133ba017e54b90e9d2
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/acvm/acvm.js +18 -21
- package/dest/acvm/acvm_types.js +3 -2
- package/dest/acvm/deserialize.js +9 -13
- package/dest/acvm/index.js +0 -1
- package/dest/acvm/oracle/index.js +0 -1
- package/dest/acvm/oracle/oracle.js +42 -23
- package/dest/acvm/oracle/typed_oracle.js +36 -38
- package/dest/acvm/serialize.js +7 -14
- package/dest/avm/avm_context.js +24 -27
- package/dest/avm/avm_contract_call_result.js +12 -7
- package/dest/avm/avm_execution_environment.js +10 -7
- package/dest/avm/avm_gas.js +93 -56
- package/dest/avm/avm_machine_state.js +60 -61
- package/dest/avm/avm_memory_types.js +166 -255
- package/dest/avm/avm_simulator.js +68 -47
- package/dest/avm/avm_tree.js +282 -276
- package/dest/avm/bytecode_utils.js +8 -6
- package/dest/avm/errors.js +46 -63
- package/dest/avm/fixtures/avm_simulation_tester.js +18 -17
- package/dest/avm/fixtures/base_avm_simulation_tester.js +21 -16
- package/dest/avm/fixtures/index.js +27 -26
- package/dest/avm/fixtures/simple_contract_data_source.js +9 -13
- package/dest/avm/index.js +0 -1
- package/dest/avm/journal/index.js +0 -1
- package/dest/avm/journal/journal.js +147 -200
- package/dest/avm/journal/nullifiers.js +43 -46
- package/dest/avm/journal/public_storage.js +73 -87
- package/dest/avm/opcodes/accrued_substate.js +140 -110
- package/dest/avm/opcodes/addressing_mode.js +29 -31
- package/dest/avm/opcodes/arithmetic.js +17 -15
- package/dest/avm/opcodes/bitwise.js +40 -26
- package/dest/avm/opcodes/comparators.js +12 -10
- package/dest/avm/opcodes/contract.js +31 -29
- package/dest/avm/opcodes/control_flow.js +47 -43
- package/dest/avm/opcodes/conversion.js +30 -26
- package/dest/avm/opcodes/ec_add.js +35 -34
- package/dest/avm/opcodes/environment_getters.js +33 -33
- package/dest/avm/opcodes/external_calls.js +83 -74
- package/dest/avm/opcodes/hashing.js +69 -61
- package/dest/avm/opcodes/index.js +0 -1
- package/dest/avm/opcodes/instruction.js +31 -40
- package/dest/avm/opcodes/instruction_impl.js +12 -15
- package/dest/avm/opcodes/memory.js +177 -156
- package/dest/avm/opcodes/misc.js +27 -25
- package/dest/avm/opcodes/multi_scalar_mul.js +43 -41
- package/dest/avm/opcodes/storage.js +28 -25
- package/dest/avm/serialization/buffer_cursor.js +4 -4
- package/dest/avm/serialization/bytecode_serialization.js +292 -89
- package/dest/avm/serialization/instruction_serialization.js +67 -28
- package/dest/avm/test_utils.js +6 -9
- package/dest/client/client_execution_context.js +197 -219
- package/dest/client/db_oracle.js +4 -7
- package/dest/client/execution_note_cache.js +80 -81
- package/dest/client/index.js +0 -1
- package/dest/client/pick_notes.js +27 -30
- package/dest/client/private_execution.js +13 -14
- package/dest/client/simulator.js +44 -48
- package/dest/client/unconstrained_execution.js +8 -11
- package/dest/client/view_data_oracle.js +130 -139
- package/dest/common/debug_fn_name.js +1 -4
- package/dest/common/errors.js +30 -39
- package/dest/common/hashed_values_cache.js +16 -20
- package/dest/common/index.js +0 -1
- package/dest/common/message_load_oracle_inputs.js +7 -7
- package/dest/common/simulation_provider.js +3 -6
- package/dest/common.js +0 -1
- package/dest/providers/acvm_native.js +46 -32
- package/dest/providers/acvm_wasm.js +18 -10
- package/dest/providers/acvm_wasm_with_blobs.js +2 -5
- package/dest/providers/factory.js +5 -5
- package/dest/providers/index.js +0 -1
- package/dest/public/bytecode_errors.js +1 -2
- package/dest/public/db_interfaces.js +1 -2
- package/dest/public/execution.js +2 -4
- package/dest/public/executor_metrics.js +16 -12
- package/dest/public/fee_payment.js +2 -5
- package/dest/public/fixtures/index.js +0 -1
- package/dest/public/fixtures/public_tx_simulation_tester.js +13 -17
- package/dest/public/fixtures/utils.js +11 -14
- package/dest/public/index.js +0 -1
- package/dest/public/public_db_sources.js +79 -87
- package/dest/public/public_processor.js +310 -306
- package/dest/public/public_processor_metrics.js +46 -27
- package/dest/public/public_tx_context.js +97 -118
- package/dest/public/public_tx_simulator.js +299 -314
- package/dest/public/side_effect_errors.js +1 -2
- package/dest/public/side_effect_trace.js +44 -71
- package/dest/public/side_effect_trace_interface.js +1 -2
- package/dest/public/unique_class_ids.js +22 -27
- package/dest/public/utils.js +16 -11
- package/dest/server.js +0 -1
- package/dest/stats/index.js +0 -1
- package/dest/stats/stats.js +1 -2
- package/dest/test/utils.js +5 -4
- package/package.json +11 -11
- package/src/acvm/oracle/typed_oracle.ts +34 -34
- package/src/avm/avm_machine_state.ts +18 -14
- package/src/avm/avm_memory_types.ts +43 -183
- package/src/avm/avm_simulator.ts +37 -11
- package/src/avm/opcodes/accrued_substate.ts +7 -21
- package/src/avm/opcodes/addressing_mode.ts +9 -2
- package/src/avm/opcodes/arithmetic.ts +1 -3
- package/src/avm/opcodes/bitwise.ts +2 -6
- package/src/avm/opcodes/comparators.ts +1 -3
- package/src/avm/opcodes/contract.ts +1 -3
- package/src/avm/opcodes/control_flow.ts +1 -9
- package/src/avm/opcodes/conversion.ts +1 -3
- package/src/avm/opcodes/ec_add.ts +1 -3
- package/src/avm/opcodes/environment_getters.ts +1 -3
- package/src/avm/opcodes/external_calls.ts +3 -6
- package/src/avm/opcodes/hashing.ts +3 -9
- package/src/avm/opcodes/memory.ts +6 -20
- package/src/avm/opcodes/misc.ts +1 -3
- package/src/avm/opcodes/multi_scalar_mul.ts +1 -7
- package/src/avm/opcodes/storage.ts +2 -6
- package/src/client/index.ts +2 -2
- package/dest/acvm/acvm.d.ts +0 -35
- package/dest/acvm/acvm.d.ts.map +0 -1
- package/dest/acvm/acvm_types.d.ts +0 -10
- package/dest/acvm/acvm_types.d.ts.map +0 -1
- package/dest/acvm/deserialize.d.ts +0 -36
- package/dest/acvm/deserialize.d.ts.map +0 -1
- package/dest/acvm/index.d.ts +0 -6
- package/dest/acvm/index.d.ts.map +0 -1
- package/dest/acvm/oracle/index.d.ts +0 -14
- package/dest/acvm/oracle/index.d.ts.map +0 -1
- package/dest/acvm/oracle/oracle.d.ts +0 -49
- package/dest/acvm/oracle/oracle.d.ts.map +0 -1
- package/dest/acvm/oracle/typed_oracle.d.ts +0 -75
- package/dest/acvm/oracle/typed_oracle.d.ts.map +0 -1
- package/dest/acvm/serialize.d.ts +0 -20
- package/dest/acvm/serialize.d.ts.map +0 -1
- package/dest/avm/avm_context.d.ts +0 -39
- package/dest/avm/avm_context.d.ts.map +0 -1
- package/dest/avm/avm_contract_call_result.d.ts +0 -30
- package/dest/avm/avm_contract_call_result.d.ts.map +0 -1
- package/dest/avm/avm_execution_environment.d.ts +0 -21
- package/dest/avm/avm_execution_environment.d.ts.map +0 -1
- package/dest/avm/avm_gas.d.ts +0 -60
- package/dest/avm/avm_gas.d.ts.map +0 -1
- package/dest/avm/avm_machine_state.d.ts +0 -93
- package/dest/avm/avm_machine_state.d.ts.map +0 -1
- package/dest/avm/avm_memory_types.d.ts +0 -310
- package/dest/avm/avm_memory_types.d.ts.map +0 -1
- package/dest/avm/avm_simulator.d.ts +0 -37
- package/dest/avm/avm_simulator.d.ts.map +0 -1
- package/dest/avm/avm_tree.d.ts +0 -281
- package/dest/avm/avm_tree.d.ts.map +0 -1
- package/dest/avm/bytecode_utils.d.ts +0 -5
- package/dest/avm/bytecode_utils.d.ts.map +0 -1
- package/dest/avm/errors.d.ts +0 -121
- package/dest/avm/errors.d.ts.map +0 -1
- package/dest/avm/fixtures/avm_simulation_tester.d.ts +0 -21
- package/dest/avm/fixtures/avm_simulation_tester.d.ts.map +0 -1
- package/dest/avm/fixtures/base_avm_simulation_tester.d.ts +0 -35
- package/dest/avm/fixtures/base_avm_simulation_tester.d.ts.map +0 -1
- package/dest/avm/fixtures/index.d.ts +0 -67
- package/dest/avm/fixtures/index.d.ts.map +0 -1
- package/dest/avm/fixtures/simple_contract_data_source.d.ts +0 -31
- package/dest/avm/fixtures/simple_contract_data_source.d.ts.map +0 -1
- package/dest/avm/index.d.ts +0 -4
- package/dest/avm/index.d.ts.map +0 -1
- package/dest/avm/journal/index.d.ts +0 -2
- package/dest/avm/journal/index.d.ts.map +0 -1
- package/dest/avm/journal/journal.d.ts +0 -176
- package/dest/avm/journal/journal.d.ts.map +0 -1
- package/dest/avm/journal/nullifiers.d.ts +0 -62
- package/dest/avm/journal/nullifiers.d.ts.map +0 -1
- package/dest/avm/journal/public_storage.d.ts +0 -66
- package/dest/avm/journal/public_storage.d.ts.map +0 -1
- package/dest/avm/opcodes/accrued_substate.d.ts +0 -75
- package/dest/avm/opcodes/accrued_substate.d.ts.map +0 -1
- package/dest/avm/opcodes/addressing_mode.d.ts +0 -27
- package/dest/avm/opcodes/addressing_mode.d.ts.map +0 -1
- package/dest/avm/opcodes/arithmetic.d.ts +0 -37
- package/dest/avm/opcodes/arithmetic.d.ts.map +0 -1
- package/dest/avm/opcodes/bitwise.d.ts +0 -50
- package/dest/avm/opcodes/bitwise.d.ts.map +0 -1
- package/dest/avm/opcodes/comparators.d.ts +0 -25
- package/dest/avm/opcodes/comparators.d.ts.map +0 -1
- package/dest/avm/opcodes/contract.d.ts +0 -21
- package/dest/avm/opcodes/contract.d.ts.map +0 -1
- package/dest/avm/opcodes/control_flow.d.ts +0 -41
- package/dest/avm/opcodes/control_flow.d.ts.map +0 -1
- package/dest/avm/opcodes/conversion.d.ts +0 -17
- package/dest/avm/opcodes/conversion.d.ts.map +0 -1
- package/dest/avm/opcodes/ec_add.d.ts +0 -19
- package/dest/avm/opcodes/ec_add.d.ts.map +0 -1
- package/dest/avm/opcodes/environment_getters.d.ts +0 -28
- package/dest/avm/opcodes/environment_getters.d.ts.map +0 -1
- package/dest/avm/opcodes/external_calls.d.ts +0 -50
- package/dest/avm/opcodes/external_calls.d.ts.map +0 -1
- package/dest/avm/opcodes/hashing.d.ts +0 -36
- package/dest/avm/opcodes/hashing.d.ts.map +0 -1
- package/dest/avm/opcodes/index.d.ts +0 -16
- package/dest/avm/opcodes/index.d.ts.map +0 -1
- package/dest/avm/opcodes/instruction.d.ts +0 -70
- package/dest/avm/opcodes/instruction.d.ts.map +0 -1
- package/dest/avm/opcodes/instruction_impl.d.ts +0 -19
- package/dest/avm/opcodes/instruction_impl.d.ts.map +0 -1
- package/dest/avm/opcodes/memory.d.ts +0 -74
- package/dest/avm/opcodes/memory.d.ts.map +0 -1
- package/dest/avm/opcodes/misc.d.ts +0 -17
- package/dest/avm/opcodes/misc.d.ts.map +0 -1
- package/dest/avm/opcodes/multi_scalar_mul.d.ts +0 -16
- package/dest/avm/opcodes/multi_scalar_mul.d.ts.map +0 -1
- package/dest/avm/opcodes/storage.d.ts +0 -24
- package/dest/avm/opcodes/storage.d.ts.map +0 -1
- package/dest/avm/serialization/buffer_cursor.d.ts +0 -28
- package/dest/avm/serialization/buffer_cursor.d.ts.map +0 -1
- package/dest/avm/serialization/bytecode_serialization.d.ts +0 -21
- package/dest/avm/serialization/bytecode_serialization.d.ts.map +0 -1
- package/dest/avm/serialization/instruction_serialization.d.ts +0 -105
- package/dest/avm/serialization/instruction_serialization.d.ts.map +0 -1
- package/dest/avm/test_utils.d.ts +0 -16
- package/dest/avm/test_utils.d.ts.map +0 -1
- package/dest/client/client_execution_context.d.ts +0 -214
- package/dest/client/client_execution_context.d.ts.map +0 -1
- package/dest/client/db_oracle.d.ts +0 -229
- package/dest/client/db_oracle.d.ts.map +0 -1
- package/dest/client/execution_note_cache.d.ts +0 -93
- package/dest/client/execution_note_cache.d.ts.map +0 -1
- package/dest/client/index.d.ts +0 -15
- package/dest/client/index.d.ts.map +0 -1
- package/dest/client/pick_notes.d.ts +0 -85
- package/dest/client/pick_notes.d.ts.map +0 -1
- package/dest/client/private_execution.d.ts +0 -19
- package/dest/client/private_execution.d.ts.map +0 -1
- package/dest/client/simulator.d.ts +0 -60
- package/dest/client/simulator.d.ts.map +0 -1
- package/dest/client/unconstrained_execution.d.ts +0 -10
- package/dest/client/unconstrained_execution.d.ts.map +0 -1
- package/dest/client/view_data_oracle.d.ts +0 -159
- package/dest/client/view_data_oracle.d.ts.map +0 -1
- package/dest/common/debug_fn_name.d.ts +0 -4
- package/dest/common/debug_fn_name.d.ts.map +0 -1
- package/dest/common/errors.d.ts +0 -54
- package/dest/common/errors.d.ts.map +0 -1
- package/dest/common/hashed_values_cache.d.ts +0 -28
- package/dest/common/hashed_values_cache.d.ts.map +0 -1
- package/dest/common/index.d.ts +0 -3
- package/dest/common/index.d.ts.map +0 -1
- package/dest/common/message_load_oracle_inputs.d.ts +0 -15
- package/dest/common/message_load_oracle_inputs.d.ts.map +0 -1
- package/dest/common/simulation_provider.d.ts +0 -19
- package/dest/common/simulation_provider.d.ts.map +0 -1
- package/dest/common.d.ts +0 -2
- package/dest/common.d.ts.map +0 -1
- package/dest/providers/acvm_native.d.ts +0 -40
- package/dest/providers/acvm_native.d.ts.map +0 -1
- package/dest/providers/acvm_wasm.d.ts +0 -15
- package/dest/providers/acvm_wasm.d.ts.map +0 -1
- package/dest/providers/acvm_wasm_with_blobs.d.ts +0 -19
- package/dest/providers/acvm_wasm_with_blobs.d.ts.map +0 -1
- package/dest/providers/factory.d.ts +0 -12
- package/dest/providers/factory.d.ts.map +0 -1
- package/dest/providers/index.d.ts +0 -5
- package/dest/providers/index.d.ts.map +0 -1
- package/dest/public/bytecode_errors.d.ts +0 -4
- package/dest/public/bytecode_errors.d.ts.map +0 -1
- package/dest/public/db_interfaces.d.ts +0 -105
- package/dest/public/db_interfaces.d.ts.map +0 -1
- package/dest/public/execution.d.ts +0 -102
- package/dest/public/execution.d.ts.map +0 -1
- package/dest/public/executor_metrics.d.ts +0 -13
- package/dest/public/executor_metrics.d.ts.map +0 -1
- package/dest/public/fee_payment.d.ts +0 -11
- package/dest/public/fee_payment.d.ts.map +0 -1
- package/dest/public/fixtures/index.d.ts +0 -3
- package/dest/public/fixtures/index.d.ts.map +0 -1
- package/dest/public/fixtures/public_tx_simulation_tester.d.ts +0 -21
- package/dest/public/fixtures/public_tx_simulation_tester.d.ts.map +0 -1
- package/dest/public/fixtures/utils.d.ts +0 -17
- package/dest/public/fixtures/utils.d.ts.map +0 -1
- package/dest/public/index.d.ts +0 -9
- package/dest/public/index.d.ts.map +0 -1
- package/dest/public/public_db_sources.d.ts +0 -81
- package/dest/public/public_db_sources.d.ts.map +0 -1
- package/dest/public/public_processor.d.ts +0 -72
- package/dest/public/public_processor.d.ts.map +0 -1
- package/dest/public/public_processor_metrics.d.ts +0 -27
- package/dest/public/public_processor_metrics.d.ts.map +0 -1
- package/dest/public/public_tx_context.d.ts +0 -131
- package/dest/public/public_tx_context.d.ts.map +0 -1
- package/dest/public/public_tx_simulator.d.ts +0 -99
- package/dest/public/public_tx_simulator.d.ts.map +0 -1
- package/dest/public/side_effect_errors.d.ts +0 -4
- package/dest/public/side_effect_errors.d.ts.map +0 -1
- package/dest/public/side_effect_trace.d.ts +0 -126
- package/dest/public/side_effect_trace.d.ts.map +0 -1
- package/dest/public/side_effect_trace_interface.d.ts +0 -32
- package/dest/public/side_effect_trace_interface.d.ts.map +0 -1
- package/dest/public/unique_class_ids.d.ts +0 -37
- package/dest/public/unique_class_ids.d.ts.map +0 -1
- package/dest/public/utils.d.ts +0 -5
- package/dest/public/utils.d.ts.map +0 -1
- package/dest/server.d.ts +0 -6
- package/dest/server.d.ts.map +0 -1
- package/dest/stats/index.d.ts +0 -2
- package/dest/stats/index.d.ts.map +0 -1
- package/dest/stats/stats.d.ts +0 -4
- package/dest/stats/stats.d.ts.map +0 -1
- package/dest/test/utils.d.ts +0 -12
- package/dest/test/utils.d.ts.map +0 -1
package/dest/avm/opcodes/misc.js
CHANGED
|
@@ -4,17 +4,33 @@ import { Opcode, OperandType } from '../serialization/instruction_serialization.
|
|
|
4
4
|
import { Addressing } from './addressing_mode.js';
|
|
5
5
|
import { Instruction } from './instruction.js';
|
|
6
6
|
export class DebugLog extends Instruction {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
7
|
+
indirect;
|
|
8
|
+
messageOffset;
|
|
9
|
+
fieldsOffset;
|
|
10
|
+
fieldsSizeOffset;
|
|
11
|
+
messageSize;
|
|
12
|
+
static type = 'DEBUGLOG';
|
|
13
|
+
static opcode = Opcode.DEBUGLOG;
|
|
14
|
+
static logger = createLogger('simulator:avm:debug_log');
|
|
15
|
+
// Informs (de)serialization. See Instruction.deserialize.
|
|
16
|
+
static wireFormat = [
|
|
17
|
+
OperandType.UINT8,
|
|
18
|
+
OperandType.UINT8,
|
|
19
|
+
OperandType.UINT16,
|
|
20
|
+
OperandType.UINT16,
|
|
21
|
+
OperandType.UINT16,
|
|
22
|
+
OperandType.UINT16
|
|
23
|
+
];
|
|
24
|
+
constructor(indirect, messageOffset, fieldsOffset, fieldsSizeOffset, messageSize){
|
|
25
|
+
super(), this.indirect = indirect, this.messageOffset = messageOffset, this.fieldsOffset = fieldsOffset, this.fieldsSizeOffset = fieldsSizeOffset, this.messageSize = messageSize;
|
|
14
26
|
}
|
|
15
27
|
async execute(context) {
|
|
16
|
-
const memory = context.machineState.memory
|
|
17
|
-
const operands = [
|
|
28
|
+
const memory = context.machineState.memory;
|
|
29
|
+
const operands = [
|
|
30
|
+
this.messageOffset,
|
|
31
|
+
this.fieldsOffset,
|
|
32
|
+
this.fieldsSizeOffset
|
|
33
|
+
];
|
|
18
34
|
const addressing = Addressing.fromWire(this.indirect, operands.length);
|
|
19
35
|
const [messageOffset, fieldsOffset, fieldsSizeOffset] = addressing.resolve(operands, memory);
|
|
20
36
|
memory.checkTag(TypeTag.UINT32, fieldsSizeOffset);
|
|
@@ -25,22 +41,8 @@ export class DebugLog extends Instruction {
|
|
|
25
41
|
memory.checkTagsRange(TypeTag.FIELD, fieldsOffset, fieldsSize);
|
|
26
42
|
context.machineState.consumeGas(this.gasCost(this.messageSize + fieldsSize));
|
|
27
43
|
// Interpret str<N> = [u8; N] to string.
|
|
28
|
-
const messageAsStr = rawMessage.map(field
|
|
29
|
-
const formattedStr = applyStringFormatting(messageAsStr, fields.map(field
|
|
44
|
+
const messageAsStr = rawMessage.map((field)=>String.fromCharCode(field.toNumber())).join('');
|
|
45
|
+
const formattedStr = applyStringFormatting(messageAsStr, fields.map((field)=>field.toFr()));
|
|
30
46
|
DebugLog.logger.verbose(formattedStr);
|
|
31
|
-
memory.assert({ reads: 1 + fieldsSize + this.messageSize, addressing });
|
|
32
47
|
}
|
|
33
48
|
}
|
|
34
|
-
DebugLog.type = 'DEBUGLOG';
|
|
35
|
-
DebugLog.opcode = Opcode.DEBUGLOG;
|
|
36
|
-
DebugLog.logger = createLogger('simulator:avm:debug_log');
|
|
37
|
-
// Informs (de)serialization. See Instruction.deserialize.
|
|
38
|
-
DebugLog.wireFormat = [
|
|
39
|
-
OperandType.UINT8, // Opcode
|
|
40
|
-
OperandType.UINT8, // Indirect
|
|
41
|
-
OperandType.UINT16, // message memory address
|
|
42
|
-
OperandType.UINT16, // fields memory address
|
|
43
|
-
OperandType.UINT16, // fields size address
|
|
44
|
-
OperandType.UINT16, // message size
|
|
45
|
-
];
|
|
46
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWlzYy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hdm0vb3Bjb2Rlcy9taXNjLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxZQUFZLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUc1RSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDakQsT0FBTyxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsTUFBTSwrQ0FBK0MsQ0FBQztBQUNwRixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRS9DLE1BQU0sT0FBTyxRQUFTLFNBQVEsV0FBVztJQWV2QyxZQUNVLFFBQWdCLEVBQ2hCLGFBQXFCLEVBQ3JCLFlBQW9CLEVBQ3BCLGdCQUF3QixFQUN4QixXQUFtQjtRQUUzQixLQUFLLEVBQUUsQ0FBQztRQU5BLGFBQVEsR0FBUixRQUFRLENBQVE7UUFDaEIsa0JBQWEsR0FBYixhQUFhLENBQVE7UUFDckIsaUJBQVksR0FBWixZQUFZLENBQVE7UUFDcEIscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFRO1FBQ3hCLGdCQUFXLEdBQVgsV0FBVyxDQUFRO0lBRzdCLENBQUM7SUFFTSxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQW1CO1FBQ3RDLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDNUQsTUFBTSxRQUFRLEdBQUcsQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDaEYsTUFBTSxVQUFVLEdBQUcsVUFBVSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN2RSxNQUFNLENBQUMsYUFBYSxFQUFFLFlBQVksRUFBRSxnQkFBZ0IsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBRTdGLE1BQU0sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ2xELE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUUzRCxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDcEUsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxZQUFZLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFFekQsTUFBTSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLGFBQWEsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDdEUsTUFBTSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLFlBQVksRUFBRSxVQUFVLENBQUMsQ0FBQztRQUUvRCxPQUFPLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxXQUFXLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQztRQUU3RSx3Q0FBd0M7UUFDeEMsTUFBTSxZQUFZLEdBQUcsVUFBVSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDN0YsTUFBTSxZQUFZLEdBQUcscUJBQXFCLENBQ3hDLFlBQVksRUFDWixNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLENBQ2xDLENBQUM7UUFFRixRQUFRLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUV0QyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsR0FBRyxVQUFVLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDO0lBQzFFLENBQUM7O0FBbkRNLGFBQUksR0FBVyxVQUFVLENBQUM7QUFDakIsZUFBTSxHQUFXLE1BQU0sQ0FBQyxRQUFRLENBQUM7QUFDakMsZUFBTSxHQUFHLFlBQVksQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO0FBRWpFLDBEQUEwRDtBQUMxQyxtQkFBVSxHQUFrQjtJQUMxQyxXQUFXLENBQUMsS0FBSyxFQUFFLFNBQVM7SUFDNUIsV0FBVyxDQUFDLEtBQUssRUFBRSxXQUFXO0lBQzlCLFdBQVcsQ0FBQyxNQUFNLEVBQUUseUJBQXlCO0lBQzdDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsd0JBQXdCO0lBQzVDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsc0JBQXNCO0lBQzFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsZUFBZTtDQUNwQyxDQUFDIn0=
|
|
@@ -6,18 +6,34 @@ import { Opcode, OperandType } from '../serialization/instruction_serialization.
|
|
|
6
6
|
import { Addressing } from './addressing_mode.js';
|
|
7
7
|
import { Instruction } from './instruction.js';
|
|
8
8
|
export class MultiScalarMul extends Instruction {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
9
|
+
indirect;
|
|
10
|
+
pointsOffset;
|
|
11
|
+
scalarsOffset;
|
|
12
|
+
outputOffset;
|
|
13
|
+
pointsLengthOffset;
|
|
14
|
+
static type = 'MultiScalarMul';
|
|
15
|
+
static opcode = Opcode.MSM;
|
|
16
|
+
// Informs (de)serialization. See Instruction.deserialize.
|
|
17
|
+
static wireFormat = [
|
|
18
|
+
OperandType.UINT8 /* opcode */ ,
|
|
19
|
+
OperandType.UINT8 /* indirect */ ,
|
|
20
|
+
OperandType.UINT16 /* points vector offset */ ,
|
|
21
|
+
OperandType.UINT16 /* scalars vector offset */ ,
|
|
22
|
+
OperandType.UINT16 /* output offset (fixed triplet) */ ,
|
|
23
|
+
OperandType.UINT16 /* points length offset */
|
|
24
|
+
];
|
|
25
|
+
constructor(indirect, pointsOffset, scalarsOffset, outputOffset, pointsLengthOffset){
|
|
26
|
+
super(), this.indirect = indirect, this.pointsOffset = pointsOffset, this.scalarsOffset = scalarsOffset, this.outputOffset = outputOffset, this.pointsLengthOffset = pointsLengthOffset;
|
|
16
27
|
}
|
|
17
28
|
async execute(context) {
|
|
18
|
-
const memory = context.machineState.memory
|
|
29
|
+
const memory = context.machineState.memory;
|
|
19
30
|
// Resolve indirects
|
|
20
|
-
const operands = [
|
|
31
|
+
const operands = [
|
|
32
|
+
this.pointsOffset,
|
|
33
|
+
this.scalarsOffset,
|
|
34
|
+
this.outputOffset,
|
|
35
|
+
this.pointsLengthOffset
|
|
36
|
+
];
|
|
21
37
|
const addressing = Addressing.fromWire(this.indirect, operands.length);
|
|
22
38
|
const [pointsOffset, scalarsOffset, outputOffset, pointsLengthOffset] = addressing.resolve(operands, memory);
|
|
23
39
|
// Length of the points vector should be U32
|
|
@@ -34,7 +50,7 @@ export class MultiScalarMul extends Instruction {
|
|
|
34
50
|
// Divide by 3 since each point is represented as a triplet to get the number of points
|
|
35
51
|
const numPoints = pointsReadLength / 3;
|
|
36
52
|
// The tag for each triplet will be (Field, Field, Uint8)
|
|
37
|
-
for
|
|
53
|
+
for(let i = 0; i < numPoints; i++){
|
|
38
54
|
const offset = pointsOffset + i * 3;
|
|
39
55
|
// Check (Field, Field)
|
|
40
56
|
memory.checkTagsRange(TypeTag.FIELD, offset, 2);
|
|
@@ -49,7 +65,7 @@ export class MultiScalarMul extends Instruction {
|
|
|
49
65
|
memory.checkTagsRange(TypeTag.FIELD, scalarsOffset, scalarReadLength);
|
|
50
66
|
// Now we need to reconstruct the points and scalars into something we can operate on.
|
|
51
67
|
const grumpkinPoints = [];
|
|
52
|
-
for
|
|
68
|
+
for(let i = 0; i < numPoints; i++){
|
|
53
69
|
const isInf = pointsVector[3 * i + 2].toNumber() === 1;
|
|
54
70
|
const p = new Point(pointsVector[3 * i].toFr(), pointsVector[3 * i + 1].toFr(), isInf);
|
|
55
71
|
if (!p.isOnGrumpkin()) {
|
|
@@ -60,7 +76,7 @@ export class MultiScalarMul extends Instruction {
|
|
|
60
76
|
// The scalars are read from memory as Fr elements, which are limbs of Fq elements
|
|
61
77
|
// So we need to reconstruct them before performing the scalar multiplications
|
|
62
78
|
const scalarFqVector = [];
|
|
63
|
-
for
|
|
79
|
+
for(let i = 0; i < numPoints; i++){
|
|
64
80
|
const scalarLo = scalarsVector[2 * i].toFr();
|
|
65
81
|
const scalarHi = scalarsVector[2 * i + 1].toFr();
|
|
66
82
|
const fqScalar = Fq.fromHighLow(scalarHi, scalarLo);
|
|
@@ -69,49 +85,35 @@ export class MultiScalarMul extends Instruction {
|
|
|
69
85
|
// TODO: Is there an efficient MSM implementation in ts that we can replace this by?
|
|
70
86
|
const grumpkin = new Grumpkin();
|
|
71
87
|
// Zip the points and scalars into pairs
|
|
72
|
-
const [firstBaseScalarPair, ...rest] = grumpkinPoints.map((p, idx)
|
|
88
|
+
const [firstBaseScalarPair, ...rest] = grumpkinPoints.map((p, idx)=>[
|
|
89
|
+
p,
|
|
90
|
+
scalarFqVector[idx]
|
|
91
|
+
]);
|
|
73
92
|
// Fold the points and scalars into a single point
|
|
74
93
|
// We have to ensure get the first point, since the identity element (point at infinity) isn't quite working in ts
|
|
75
94
|
let acc = await grumpkin.mul(firstBaseScalarPair[0], firstBaseScalarPair[1]);
|
|
76
|
-
for (const curr of rest)
|
|
95
|
+
for (const curr of rest){
|
|
77
96
|
if (curr[1] === Fq.ZERO) {
|
|
78
|
-
// If we multiply by 0, the result will the point at infinity - so we ignore it
|
|
79
97
|
continue;
|
|
80
|
-
}
|
|
81
|
-
else if (curr[0].inf) {
|
|
82
|
-
// If we multiply the point at infinity by a scalar, it's still the point at infinity
|
|
98
|
+
} else if (curr[0].inf) {
|
|
83
99
|
continue;
|
|
84
|
-
}
|
|
85
|
-
else if (acc.inf) {
|
|
100
|
+
} else if (acc.inf) {
|
|
86
101
|
// If we accumulator is the point at infinity, we can just return the current point
|
|
87
102
|
acc = curr[0];
|
|
88
|
-
}
|
|
89
|
-
else {
|
|
103
|
+
} else {
|
|
90
104
|
acc = await grumpkin.add(acc, await grumpkin.mul(curr[0], curr[1]));
|
|
91
105
|
}
|
|
92
106
|
}
|
|
93
107
|
const outputPoint = acc;
|
|
94
108
|
// Important to use setSlice() and not set() in the two following statements as
|
|
95
109
|
// this checks that the offsets lie within memory range.
|
|
96
|
-
memory.setSlice(outputOffset, [
|
|
110
|
+
memory.setSlice(outputOffset, [
|
|
111
|
+
new Field(outputPoint.x),
|
|
112
|
+
new Field(outputPoint.y)
|
|
113
|
+
]);
|
|
97
114
|
// Check representation of infinity for grumpkin
|
|
98
|
-
memory.setSlice(outputOffset + 2, [
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
writes: 3 /* output triplet */,
|
|
102
|
-
addressing,
|
|
103
|
-
});
|
|
115
|
+
memory.setSlice(outputOffset + 2, [
|
|
116
|
+
new Uint1(outputPoint.equals(Point.ZERO) ? 1 : 0)
|
|
117
|
+
]);
|
|
104
118
|
}
|
|
105
119
|
}
|
|
106
|
-
MultiScalarMul.type = 'MultiScalarMul';
|
|
107
|
-
MultiScalarMul.opcode = Opcode.MSM;
|
|
108
|
-
// Informs (de)serialization. See Instruction.deserialize.
|
|
109
|
-
MultiScalarMul.wireFormat = [
|
|
110
|
-
OperandType.UINT8 /* opcode */,
|
|
111
|
-
OperandType.UINT8 /* indirect */,
|
|
112
|
-
OperandType.UINT16 /* points vector offset */,
|
|
113
|
-
OperandType.UINT16 /* scalars vector offset */,
|
|
114
|
-
OperandType.UINT16 /* output offset (fixed triplet) */,
|
|
115
|
-
OperandType.UINT16 /* points length offset */,
|
|
116
|
-
];
|
|
117
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXVsdGlfc2NhbGFyX211bC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hdm0vb3Bjb2Rlcy9tdWx0aV9zY2FsYXJfbXVsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDL0MsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBRzNELE9BQU8sRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQy9ELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUM3RSxPQUFPLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxNQUFNLCtDQUErQyxDQUFDO0FBQ3BGLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFL0MsTUFBTSxPQUFPLGNBQWUsU0FBUSxXQUFXO0lBYzdDLFlBQ1UsUUFBZ0IsRUFDaEIsWUFBb0IsRUFDcEIsYUFBcUIsRUFDckIsWUFBb0IsRUFDcEIsa0JBQTBCO1FBRWxDLEtBQUssRUFBRSxDQUFDO1FBTkEsYUFBUSxHQUFSLFFBQVEsQ0FBUTtRQUNoQixpQkFBWSxHQUFaLFlBQVksQ0FBUTtRQUNwQixrQkFBYSxHQUFiLGFBQWEsQ0FBUTtRQUNyQixpQkFBWSxHQUFaLFlBQVksQ0FBUTtRQUNwQix1QkFBa0IsR0FBbEIsa0JBQWtCLENBQVE7SUFHcEMsQ0FBQztJQUVNLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBbUI7UUFDdEMsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM1RCxvQkFBb0I7UUFDcEIsTUFBTSxR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
|
|
@@ -4,31 +4,36 @@ import { Opcode, OperandType } from '../serialization/instruction_serialization.
|
|
|
4
4
|
import { Addressing } from './addressing_mode.js';
|
|
5
5
|
import { Instruction } from './instruction.js';
|
|
6
6
|
class BaseStorageInstruction extends Instruction {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
7
|
+
indirect;
|
|
8
|
+
aOffset;
|
|
9
|
+
bOffset;
|
|
10
|
+
// Informs (de)serialization. See Instruction.deserialize.
|
|
11
|
+
static wireFormat = [
|
|
12
|
+
OperandType.UINT8,
|
|
13
|
+
OperandType.UINT8,
|
|
14
|
+
OperandType.UINT16,
|
|
15
|
+
OperandType.UINT16
|
|
16
|
+
];
|
|
17
|
+
constructor(indirect, aOffset, bOffset){
|
|
18
|
+
super(), this.indirect = indirect, this.aOffset = aOffset, this.bOffset = bOffset;
|
|
12
19
|
}
|
|
13
20
|
}
|
|
14
|
-
// Informs (de)serialization. See Instruction.deserialize.
|
|
15
|
-
BaseStorageInstruction.wireFormat = [
|
|
16
|
-
OperandType.UINT8,
|
|
17
|
-
OperandType.UINT8,
|
|
18
|
-
OperandType.UINT16,
|
|
19
|
-
OperandType.UINT16,
|
|
20
|
-
];
|
|
21
21
|
export class SStore extends BaseStorageInstruction {
|
|
22
|
-
|
|
22
|
+
static type = 'SSTORE';
|
|
23
|
+
static opcode = Opcode.SSTORE;
|
|
24
|
+
constructor(indirect, srcOffset, slotOffset){
|
|
23
25
|
super(indirect, srcOffset, slotOffset);
|
|
24
26
|
}
|
|
25
27
|
async execute(context) {
|
|
26
28
|
if (context.environment.isStaticCall) {
|
|
27
29
|
throw new StaticCallAlterationError();
|
|
28
30
|
}
|
|
29
|
-
const memory = context.machineState.memory
|
|
31
|
+
const memory = context.machineState.memory;
|
|
30
32
|
context.machineState.consumeGas(this.gasCost());
|
|
31
|
-
const operands = [
|
|
33
|
+
const operands = [
|
|
34
|
+
this.aOffset,
|
|
35
|
+
this.bOffset
|
|
36
|
+
];
|
|
32
37
|
const addressing = Addressing.fromWire(this.indirect, operands.length);
|
|
33
38
|
const [srcOffset, slotOffset] = addressing.resolve(operands, memory);
|
|
34
39
|
memory.checkTag(TypeTag.FIELD, slotOffset);
|
|
@@ -36,28 +41,26 @@ export class SStore extends BaseStorageInstruction {
|
|
|
36
41
|
const slot = memory.get(slotOffset).toFr();
|
|
37
42
|
const value = memory.get(srcOffset).toFr();
|
|
38
43
|
await context.persistableState.writeStorage(context.environment.address, slot, value);
|
|
39
|
-
memory.assert({ reads: 2, addressing });
|
|
40
44
|
}
|
|
41
45
|
}
|
|
42
|
-
SStore.type = 'SSTORE';
|
|
43
|
-
SStore.opcode = Opcode.SSTORE;
|
|
44
46
|
export class SLoad extends BaseStorageInstruction {
|
|
45
|
-
|
|
47
|
+
static type = 'SLOAD';
|
|
48
|
+
static opcode = Opcode.SLOAD;
|
|
49
|
+
constructor(indirect, slotOffset, dstOffset){
|
|
46
50
|
super(indirect, slotOffset, dstOffset);
|
|
47
51
|
}
|
|
48
52
|
async execute(context) {
|
|
49
|
-
const memory = context.machineState.memory
|
|
53
|
+
const memory = context.machineState.memory;
|
|
50
54
|
context.machineState.consumeGas(this.gasCost());
|
|
51
|
-
const operands = [
|
|
55
|
+
const operands = [
|
|
56
|
+
this.aOffset,
|
|
57
|
+
this.bOffset
|
|
58
|
+
];
|
|
52
59
|
const addressing = Addressing.fromWire(this.indirect, operands.length);
|
|
53
60
|
const [slotOffset, dstOffset] = addressing.resolve(operands, memory);
|
|
54
61
|
memory.checkTag(TypeTag.FIELD, slotOffset);
|
|
55
62
|
const slot = memory.get(slotOffset).toFr();
|
|
56
63
|
const value = await context.persistableState.readStorage(context.environment.address, slot);
|
|
57
64
|
memory.set(dstOffset, new Field(value));
|
|
58
|
-
memory.assert({ writes: 1, reads: 1, addressing });
|
|
59
65
|
}
|
|
60
66
|
}
|
|
61
|
-
SLoad.type = 'SLOAD';
|
|
62
|
-
SLoad.opcode = Opcode.SLOAD;
|
|
63
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmFnZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hdm0vb3Bjb2Rlcy9zdG9yYWdlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDeEQsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3pELE9BQU8sRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLE1BQU0sK0NBQStDLENBQUM7QUFDcEYsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUUvQyxNQUFlLHNCQUF1QixTQUFRLFdBQVc7SUFTdkQsWUFBc0IsUUFBZ0IsRUFBWSxPQUFlLEVBQVksT0FBZTtRQUMxRixLQUFLLEVBQUUsQ0FBQztRQURZLGFBQVEsR0FBUixRQUFRLENBQVE7UUFBWSxZQUFPLEdBQVAsT0FBTyxDQUFRO1FBQVksWUFBTyxHQUFQLE9BQU8sQ0FBUTtJQUU1RixDQUFDOztBQVZELDBEQUEwRDtBQUNuQyxpQ0FBVSxHQUFrQjtJQUNqRCxXQUFXLENBQUMsS0FBSztJQUNqQixXQUFXLENBQUMsS0FBSztJQUNqQixXQUFXLENBQUMsTUFBTTtJQUNsQixXQUFXLENBQUMsTUFBTTtDQUNuQixDQUFDO0FBT0osTUFBTSxPQUFPLE1BQU8sU0FBUSxzQkFBc0I7SUFJaEQsWUFBWSxRQUFnQixFQUFFLFNBQWlCLEVBQUUsVUFBa0I7UUFDakUsS0FBSyxDQUFDLFFBQVEsRUFBRSxTQUFTLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVNLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBbUI7UUFDdEMsSUFBSSxPQUFPLENBQUMsV0FBVyxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3JDLE1BQU0sSUFBSSx5QkFBeUIsRUFBRSxDQUFDO1FB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
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
/*
|
|
2
2
|
* A Buffer-like class that automatically advances the position.
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
|
|
3
|
+
*/ export class BufferCursor {
|
|
4
|
+
_buffer;
|
|
5
|
+
_position;
|
|
6
|
+
constructor(_buffer, _position = 0){
|
|
6
7
|
this._buffer = _buffer;
|
|
7
8
|
this._position = _position;
|
|
8
9
|
}
|
|
@@ -96,4 +97,3 @@ export class BufferCursor {
|
|
|
96
97
|
return ret;
|
|
97
98
|
}
|
|
98
99
|
}
|
|
99
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVmZmVyX2N1cnNvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hdm0vc2VyaWFsaXphdGlvbi9idWZmZXJfY3Vyc29yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsTUFBTSxPQUFPLFlBQVk7SUFDdkIsWUFBb0IsT0FBZSxFQUFVLFlBQW9CLENBQUM7UUFBOUMsWUFBTyxHQUFQLE9BQU8sQ0FBUTtRQUFVLGNBQVMsR0FBVCxTQUFTLENBQVk7SUFBRyxDQUFDO0lBRS9ELFFBQVE7UUFDYixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDeEIsQ0FBQztJQUVNLE1BQU07UUFDWCxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDdEIsQ0FBQztJQUVNLEdBQUc7UUFDUixPQUFPLElBQUksQ0FBQyxTQUFTLEtBQUssSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUM7SUFDaEQsQ0FBQztJQUVNLGdCQUFnQjtRQUNyQixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUMvQyxDQUFDO0lBRU0sT0FBTyxDQUFDLENBQVM7UUFDdEIsSUFBSSxDQUFDLFNBQVMsSUFBSSxDQUFDLENBQUM7SUFDdEIsQ0FBQztJQUVNLFNBQVM7UUFDZCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDbkQsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0lBRU0sU0FBUztRQUNkLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNuRCxJQUFJLENBQUMsU0FBUyxJQUFJLENBQUMsQ0FBQztRQUNwQixPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7SUFFTSxZQUFZO1FBQ2pCLE1BQU0sR0FBRyxH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
|