@typeberry/convert 0.1.2-ef67dce → 0.1.3-707962d

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/index.js +198 -197
  2. package/index.js.map +1 -1
  3. package/package.json +1 -1
package/index.js CHANGED
@@ -5511,7 +5511,7 @@ function isResult(x) {
5511
5511
  var minimist = __nccwpck_require__(595);
5512
5512
  var minimist_default = /*#__PURE__*/__nccwpck_require__.n(minimist);
5513
5513
  ;// CONCATENATED MODULE: ./bin/convert/package.json
5514
- const package_namespaceObject = {"rE":"0.1.2"};
5514
+ const package_namespaceObject = {"rE":"0.1.3"};
5515
5515
  ;// CONCATENATED MODULE: ./packages/core/bytes/bitvec.ts
5516
5516
 
5517
5517
  /**
@@ -6867,13 +6867,15 @@ function validateLength(range, length, context) {
6867
6867
 
6868
6868
  /** A caching wrapper for either object or sequence item. */
6869
6869
  class ViewField {
6870
+ name;
6870
6871
  getView;
6871
6872
  getValue;
6872
6873
  getEncoded;
6873
6874
  cachedValue;
6874
6875
  cachedView;
6875
6876
  cachedBlob;
6876
- constructor(getView, getValue, getEncoded) {
6877
+ constructor(name, getView, getValue, getEncoded) {
6878
+ this.name = name;
6877
6879
  this.getView = getView;
6878
6880
  this.getValue = getValue;
6879
6881
  this.getEncoded = getEncoded;
@@ -6899,6 +6901,9 @@ class ViewField {
6899
6901
  }
6900
6902
  return this.cachedBlob;
6901
6903
  }
6904
+ toString() {
6905
+ return `ViewField<${this.name}>`;
6906
+ }
6902
6907
  }
6903
6908
  /**
6904
6909
  * A base class for all the lazy views.
@@ -6973,7 +6978,7 @@ class ObjectView {
6973
6978
  const fieldDecoder = skipper.decoder.clone();
6974
6979
  const field = this.descriptorsKeys[i];
6975
6980
  const type = this.descriptors[field];
6976
- lastItem = new ViewField(() => type.View.decode(fieldDecoder.clone()), () => type.decode(fieldDecoder.clone()), () => type.skipEncoded(fieldDecoder.clone()));
6981
+ lastItem = new ViewField(`${this.toString()}.${String(field)}`, () => type.View.decode(fieldDecoder.clone()), () => type.decode(fieldDecoder.clone()), () => type.skipEncoded(fieldDecoder.clone()));
6977
6982
  // skip the field
6978
6983
  type.skip(skipper);
6979
6984
  // cache data
@@ -6985,6 +6990,9 @@ class ObjectView {
6985
6990
  }
6986
6991
  return lastItem;
6987
6992
  }
6993
+ toString() {
6994
+ return `View<${this.materializedConstructor.name}>(cache: ${this.cache.size})`;
6995
+ }
6988
6996
  }
6989
6997
  /**
6990
6998
  * A lazy-evaluated decoder of a sequence.
@@ -7073,7 +7081,7 @@ class SequenceView {
7073
7081
  // create new cached prop
7074
7082
  const fieldDecoder = skipper.decoder.clone();
7075
7083
  const type = this.descriptor;
7076
- lastItem = new ViewField(() => type.View.decode(fieldDecoder.clone()), () => type.decode(fieldDecoder.clone()), () => type.skipEncoded(fieldDecoder.clone()));
7084
+ lastItem = new ViewField(`${this.toString()}[${index}]`, () => type.View.decode(fieldDecoder.clone()), () => type.decode(fieldDecoder.clone()), () => type.skipEncoded(fieldDecoder.clone()));
7077
7085
  // skip the field
7078
7086
  type.skip(skipper);
7079
7087
  // cache data
@@ -7085,6 +7093,9 @@ class SequenceView {
7085
7093
  }
7086
7094
  return lastItem;
7087
7095
  }
7096
+ toString() {
7097
+ return `SequenceView<${this.descriptor.name}>(cache: ${this.cache.size})`;
7098
+ }
7088
7099
  }
7089
7100
 
7090
7101
  ;// CONCATENATED MODULE: ./packages/core/codec/descriptors.ts
@@ -11498,15 +11509,12 @@ function loadConfig(configPath) {
11498
11509
 
11499
11510
 
11500
11511
 
11501
- ;// CONCATENATED MODULE: ./packages/extensions/ipc/fuzz/v0/types.ts
11512
+ ;// CONCATENATED MODULE: ./packages/jam/fuzz-proto/v1/types.ts
11502
11513
 
11503
11514
 
11504
11515
 
11505
11516
 
11506
11517
 
11507
- /**
11508
- * Reference: https://github.com/davxy/jam-conformance/blob/7c6a371a966c6446564f91676e7a2afdec5fa3da/fuzz-proto/fuzz.asn
11509
- */
11510
11518
  /**
11511
11519
  * Version ::= SEQUENCE {
11512
11520
  * major INTEGER (0..255),
@@ -11547,190 +11555,17 @@ class Version extends WithDebug {
11547
11555
  this.patch = patch;
11548
11556
  }
11549
11557
  }
11550
- /**
11551
- * PeerInfo ::= SEQUENCE {
11552
- * name UTF8String,
11553
- * app-version Version,
11554
- * jam-version Version
11555
- * }
11556
- */
11557
- class PeerInfo extends WithDebug {
11558
- name;
11559
- appVersion;
11560
- jamVersion;
11561
- static Codec = descriptors_codec.Class(PeerInfo, {
11562
- name: descriptors_codec.string,
11563
- appVersion: Version.Codec,
11564
- jamVersion: Version.Codec,
11565
- });
11566
- static create({ name, appVersion, jamVersion }) {
11567
- return new PeerInfo(name, appVersion, jamVersion);
11568
- }
11569
- constructor(name, appVersion, jamVersion) {
11570
- super();
11571
- this.name = name;
11572
- this.appVersion = appVersion;
11573
- this.jamVersion = jamVersion;
11574
- }
11575
- }
11576
- /**
11577
- * KeyValue ::= SEQUENCE {
11578
- * key TrieKey,
11579
- * value OCTET STRING
11580
- * }
11581
- */
11582
- class KeyValue extends WithDebug {
11583
- key;
11584
- value;
11585
- static Codec = descriptors_codec.Class(KeyValue, {
11586
- key: descriptors_codec.bytes(TRUNCATED_HASH_SIZE),
11587
- value: descriptors_codec.blob,
11588
- });
11589
- static create({ key, value }) {
11590
- return new KeyValue(key, value);
11591
- }
11592
- constructor(key, value) {
11593
- super();
11594
- this.key = key;
11595
- this.value = value;
11596
- }
11597
- }
11598
- /** State ::= SEQUENCE OF KeyValue */
11599
- const stateCodec = descriptors_codec.sequenceVarLen(KeyValue.Codec);
11600
- /**
11601
- * SetState ::= SEQUENCE {
11602
- * header Header,
11603
- * state State
11604
- * }
11605
- */
11606
- class SetState extends WithDebug {
11607
- header;
11608
- state;
11609
- static Codec = descriptors_codec.Class(SetState, {
11610
- header: header_Header.Codec,
11611
- state: descriptors_codec.sequenceVarLen(KeyValue.Codec),
11612
- });
11613
- static create({ header, state }) {
11614
- return new SetState(header, state);
11615
- }
11616
- constructor(header, state) {
11617
- super();
11618
- this.header = header;
11619
- this.state = state;
11620
- }
11621
- }
11622
- /** GetState ::= HeaderHash */
11623
- const getStateCodec = descriptors_codec.bytes(hash_HASH_SIZE).asOpaque();
11624
- /** StateRoot ::= StateRootHash */
11625
- const stateRootCodec = descriptors_codec.bytes(hash_HASH_SIZE).asOpaque();
11626
- /** Message choice type tags */
11627
- var MessageType;
11628
- (function (MessageType) {
11629
- MessageType[MessageType["PeerInfo"] = 0] = "PeerInfo";
11630
- MessageType[MessageType["ImportBlock"] = 1] = "ImportBlock";
11631
- MessageType[MessageType["SetState"] = 2] = "SetState";
11632
- MessageType[MessageType["GetState"] = 3] = "GetState";
11633
- MessageType[MessageType["State"] = 4] = "State";
11634
- MessageType[MessageType["StateRoot"] = 5] = "StateRoot";
11635
- })(MessageType || (MessageType = {}));
11636
- /**
11637
- * Message ::= CHOICE {
11638
- * peer-info [0] PeerInfo,
11639
- * import-block [1] ImportBlock,
11640
- * set-state [2] SetState,
11641
- * get-state [3] GetState,
11642
- * state [4] State,
11643
- * state-root [5] StateRoot
11644
- * }
11645
- */
11646
- const messageCodec = descriptors_codec.custom({
11647
- name: "Message",
11648
- sizeHint: { bytes: 1, isExact: false },
11649
- }, (e, msg) => {
11650
- e.i8(msg.type);
11651
- switch (msg.type) {
11652
- case MessageType.PeerInfo:
11653
- PeerInfo.Codec.encode(e, msg.value);
11654
- break;
11655
- case MessageType.ImportBlock:
11656
- block_Block.Codec.View.encode(e, msg.value);
11657
- break;
11658
- case MessageType.SetState:
11659
- SetState.Codec.encode(e, msg.value);
11660
- break;
11661
- case MessageType.GetState:
11662
- getStateCodec.encode(e, msg.value);
11663
- break;
11664
- case MessageType.State:
11665
- stateCodec.encode(e, msg.value);
11666
- break;
11667
- case MessageType.StateRoot:
11668
- stateRootCodec.encode(e, msg.value);
11669
- break;
11670
- default:
11671
- throw new Error(`Unknown message type: ${msg}`);
11672
- }
11673
- }, (d) => {
11674
- const type = d.u8();
11675
- switch (type) {
11676
- case MessageType.PeerInfo:
11677
- return { type: MessageType.PeerInfo, value: PeerInfo.Codec.decode(d) };
11678
- case MessageType.ImportBlock:
11679
- return { type: MessageType.ImportBlock, value: block_Block.Codec.View.decode(d) };
11680
- case MessageType.SetState:
11681
- return { type: MessageType.SetState, value: SetState.Codec.decode(d) };
11682
- case MessageType.GetState:
11683
- return { type: MessageType.GetState, value: getStateCodec.decode(d) };
11684
- case MessageType.State:
11685
- return { type: MessageType.State, value: stateCodec.decode(d) };
11686
- case MessageType.StateRoot:
11687
- return { type: MessageType.StateRoot, value: stateRootCodec.decode(d) };
11688
- default:
11689
- throw new Error(`Unknown message type: ${type}`);
11690
- }
11691
- }, (s) => {
11692
- const type = s.decoder.u8();
11693
- switch (type) {
11694
- case MessageType.PeerInfo:
11695
- PeerInfo.Codec.View.skip(s);
11696
- break;
11697
- case MessageType.ImportBlock:
11698
- block_Block.Codec.View.skip(s);
11699
- break;
11700
- case MessageType.SetState:
11701
- SetState.Codec.View.skip(s);
11702
- break;
11703
- case MessageType.GetState:
11704
- getStateCodec.View.skip(s);
11705
- break;
11706
- case MessageType.State:
11707
- stateCodec.View.skip(s);
11708
- break;
11709
- case MessageType.StateRoot:
11710
- stateRootCodec.View.skip(s);
11711
- break;
11712
- default:
11713
- throw new Error(`Unknown message type: ${type}`);
11714
- }
11715
- });
11716
-
11717
- ;// CONCATENATED MODULE: ./packages/extensions/ipc/fuzz/v1/types.ts
11718
-
11719
-
11720
-
11721
-
11722
-
11723
11558
  /**
11724
11559
  * Fuzzer Protocol V1
11725
11560
  * Reference: https://github.com/davxy/jam-conformance/blob/main/fuzz-proto/fuzz.asn
11726
11561
  */
11727
11562
  // Feature bit constants
11728
- var Features;
11563
+ var types_Features;
11729
11564
  (function (Features) {
11730
11565
  Features[Features["Ancestry"] = 1] = "Ancestry";
11731
11566
  Features[Features["Fork"] = 2] = "Fork";
11732
11567
  Features[Features["Reserved"] = 2147483648] = "Reserved";
11733
- })(Features || (Features = {}));
11568
+ })(types_Features || (types_Features = {}));
11734
11569
  /**
11735
11570
  * PeerInfo ::= SEQUENCE {
11736
11571
  * fuzz-version U8,
@@ -11740,13 +11575,13 @@ var Features;
11740
11575
  * name UTF8String
11741
11576
  * }
11742
11577
  */
11743
- class types_PeerInfo extends WithDebug {
11578
+ class PeerInfo extends WithDebug {
11744
11579
  fuzzVersion;
11745
11580
  features;
11746
11581
  jamVersion;
11747
11582
  appVersion;
11748
11583
  name;
11749
- static Codec = descriptors_codec.Class(types_PeerInfo, {
11584
+ static Codec = descriptors_codec.Class(PeerInfo, {
11750
11585
  fuzzVersion: descriptors_codec.u8,
11751
11586
  features: descriptors_codec.u32,
11752
11587
  jamVersion: Version.Codec,
@@ -11754,7 +11589,7 @@ class types_PeerInfo extends WithDebug {
11754
11589
  name: descriptors_codec.string,
11755
11590
  });
11756
11591
  static create({ fuzzVersion, features, appVersion, jamVersion, name }) {
11757
- return new types_PeerInfo(fuzzVersion, features, jamVersion, appVersion, name);
11592
+ return new PeerInfo(fuzzVersion, features, jamVersion, appVersion, name);
11758
11593
  }
11759
11594
  constructor(fuzzVersion, features, jamVersion, appVersion, name) {
11760
11595
  super();
@@ -11787,6 +11622,30 @@ class AncestryItem extends WithDebug {
11787
11622
  this.headerHash = headerHash;
11788
11623
  }
11789
11624
  }
11625
+ /**
11626
+ * KeyValue ::= SEQUENCE {
11627
+ * key TrieKey,
11628
+ * value OCTET STRING
11629
+ * }
11630
+ */
11631
+ class KeyValue extends WithDebug {
11632
+ key;
11633
+ value;
11634
+ static Codec = descriptors_codec.Class(KeyValue, {
11635
+ key: descriptors_codec.bytes(TRUNCATED_HASH_SIZE),
11636
+ value: descriptors_codec.blob,
11637
+ });
11638
+ static create({ key, value }) {
11639
+ return new KeyValue(key, value);
11640
+ }
11641
+ constructor(key, value) {
11642
+ super();
11643
+ this.key = key;
11644
+ this.value = value;
11645
+ }
11646
+ }
11647
+ /** State ::= SEQUENCE OF KeyValue */
11648
+ const stateCodec = descriptors_codec.sequenceVarLen(KeyValue.Codec);
11790
11649
  /**
11791
11650
  * Ancestry ::= SEQUENCE (SIZE(0..24)) OF AncestryItem
11792
11651
  * Empty when `feature-ancestry` is not supported by both parties
@@ -11822,9 +11681,9 @@ class Initialize extends WithDebug {
11822
11681
  }
11823
11682
  }
11824
11683
  /** GetState ::= HeaderHash */
11825
- const types_getStateCodec = descriptors_codec.bytes(hash_HASH_SIZE).asOpaque();
11684
+ const getStateCodec = descriptors_codec.bytes(hash_HASH_SIZE).asOpaque();
11826
11685
  /** StateRoot ::= StateRootHash */
11827
- const types_stateRootCodec = descriptors_codec.bytes(hash_HASH_SIZE).asOpaque();
11686
+ const stateRootCodec = descriptors_codec.bytes(hash_HASH_SIZE).asOpaque();
11828
11687
  /** Error ::= UTF8String */
11829
11688
  class ErrorMessage extends WithDebug {
11830
11689
  message;
@@ -11868,19 +11727,19 @@ const types_messageCodec = descriptors_codec.custom({
11868
11727
  e.i8(msg.type);
11869
11728
  switch (msg.type) {
11870
11729
  case types_MessageType.PeerInfo:
11871
- types_PeerInfo.Codec.encode(e, msg.value);
11730
+ PeerInfo.Codec.encode(e, msg.value);
11872
11731
  break;
11873
11732
  case types_MessageType.Initialize:
11874
11733
  Initialize.Codec.encode(e, msg.value);
11875
11734
  break;
11876
11735
  case types_MessageType.StateRoot:
11877
- types_stateRootCodec.encode(e, msg.value);
11736
+ stateRootCodec.encode(e, msg.value);
11878
11737
  break;
11879
11738
  case types_MessageType.ImportBlock:
11880
11739
  block_Block.Codec.View.encode(e, msg.value);
11881
11740
  break;
11882
11741
  case types_MessageType.GetState:
11883
- types_getStateCodec.encode(e, msg.value);
11742
+ getStateCodec.encode(e, msg.value);
11884
11743
  break;
11885
11744
  case types_MessageType.State:
11886
11745
  stateCodec.encode(e, msg.value);
@@ -11895,15 +11754,15 @@ const types_messageCodec = descriptors_codec.custom({
11895
11754
  const type = d.u8();
11896
11755
  switch (type) {
11897
11756
  case types_MessageType.PeerInfo:
11898
- return { type: types_MessageType.PeerInfo, value: types_PeerInfo.Codec.decode(d) };
11757
+ return { type: types_MessageType.PeerInfo, value: PeerInfo.Codec.decode(d) };
11899
11758
  case types_MessageType.Initialize:
11900
11759
  return { type: types_MessageType.Initialize, value: Initialize.Codec.decode(d) };
11901
11760
  case types_MessageType.StateRoot:
11902
- return { type: types_MessageType.StateRoot, value: types_stateRootCodec.decode(d) };
11761
+ return { type: types_MessageType.StateRoot, value: stateRootCodec.decode(d) };
11903
11762
  case types_MessageType.ImportBlock:
11904
11763
  return { type: types_MessageType.ImportBlock, value: block_Block.Codec.View.decode(d) };
11905
11764
  case types_MessageType.GetState:
11906
- return { type: types_MessageType.GetState, value: types_getStateCodec.decode(d) };
11765
+ return { type: types_MessageType.GetState, value: getStateCodec.decode(d) };
11907
11766
  case types_MessageType.State:
11908
11767
  return { type: types_MessageType.State, value: stateCodec.decode(d) };
11909
11768
  case types_MessageType.Error:
@@ -11915,19 +11774,19 @@ const types_messageCodec = descriptors_codec.custom({
11915
11774
  const type = s.decoder.u8();
11916
11775
  switch (type) {
11917
11776
  case types_MessageType.PeerInfo:
11918
- types_PeerInfo.Codec.View.skip(s);
11777
+ PeerInfo.Codec.View.skip(s);
11919
11778
  break;
11920
11779
  case types_MessageType.Initialize:
11921
11780
  Initialize.Codec.View.skip(s);
11922
11781
  break;
11923
11782
  case types_MessageType.StateRoot:
11924
- types_stateRootCodec.View.skip(s);
11783
+ stateRootCodec.View.skip(s);
11925
11784
  break;
11926
11785
  case types_MessageType.ImportBlock:
11927
11786
  block_Block.Codec.View.skip(s);
11928
11787
  break;
11929
11788
  case types_MessageType.GetState:
11930
- types_getStateCodec.View.skip(s);
11789
+ getStateCodec.View.skip(s);
11931
11790
  break;
11932
11791
  case types_MessageType.State:
11933
11792
  stateCodec.View.skip(s);
@@ -11940,6 +11799,145 @@ const types_messageCodec = descriptors_codec.custom({
11940
11799
  }
11941
11800
  });
11942
11801
 
11802
+ ;// CONCATENATED MODULE: ./packages/jam/fuzz-proto/v1/handler.ts
11803
+
11804
+
11805
+
11806
+
11807
+ const handler_logger = Logger.new(import.meta.filename, "ext-ipc-fuzz-v1");
11808
+ class FuzzTarget {
11809
+ msgHandler;
11810
+ sender;
11811
+ spec;
11812
+ sessionFeatures = 0;
11813
+ constructor(msgHandler, sender, spec) {
11814
+ this.msgHandler = msgHandler;
11815
+ this.sender = sender;
11816
+ this.spec = spec;
11817
+ }
11818
+ async onSocketMessage(msg) {
11819
+ // attempt to decode the messsage
11820
+ try {
11821
+ const message = Decoder.decodeObject(messageCodec, msg, this.spec);
11822
+ handler_logger.log `[${message.type}] incoming message`;
11823
+ await this.processAndRespond(message);
11824
+ }
11825
+ catch (e) {
11826
+ handler_logger.error `Error while processing fuzz v1 message: ${e}`;
11827
+ handler_logger.error `${e}`;
11828
+ if (e instanceof Error) {
11829
+ handler_logger.error `${e.stack ?? ""}`;
11830
+ }
11831
+ this.sender.close();
11832
+ }
11833
+ }
11834
+ async processAndRespond(message) {
11835
+ let response = null;
11836
+ switch (message.type) {
11837
+ case MessageType.PeerInfo: {
11838
+ // only support V1
11839
+ if (message.value.fuzzVersion !== 1) {
11840
+ handler_logger.warn `Unsupported fuzzer protocol version: ${message.value.fuzzVersion}. Closing`;
11841
+ this.sender.close();
11842
+ return;
11843
+ }
11844
+ // Handle handshake
11845
+ const ourPeerInfo = await this.msgHandler.getPeerInfo(message.value);
11846
+ // Calculate session features (intersection of both peer features)
11847
+ this.sessionFeatures = message.value.features & ourPeerInfo.features;
11848
+ handler_logger.info `Handshake completed. Shared features: 0b${this.sessionFeatures.toString(2)}`;
11849
+ handler_logger.log `Feature ancestry: ${(this.sessionFeatures & Features.Ancestry) !== 0}`;
11850
+ handler_logger.log `Feature fork: ${(this.sessionFeatures & Features.Fork) !== 0}`;
11851
+ response = {
11852
+ type: MessageType.PeerInfo,
11853
+ value: ourPeerInfo,
11854
+ };
11855
+ break;
11856
+ }
11857
+ case MessageType.Initialize: {
11858
+ const stateRoot = await this.msgHandler.initialize(message.value);
11859
+ response = {
11860
+ type: MessageType.StateRoot,
11861
+ value: stateRoot,
11862
+ };
11863
+ break;
11864
+ }
11865
+ case MessageType.ImportBlock: {
11866
+ const result = await this.msgHandler.importBlock(message.value);
11867
+ if (result.isOk) {
11868
+ response = {
11869
+ type: MessageType.StateRoot,
11870
+ value: result.ok,
11871
+ };
11872
+ }
11873
+ else {
11874
+ response = {
11875
+ type: MessageType.Error,
11876
+ value: result.error,
11877
+ };
11878
+ }
11879
+ break;
11880
+ }
11881
+ case MessageType.GetState: {
11882
+ const state = await this.msgHandler.getSerializedState(message.value);
11883
+ response = {
11884
+ type: MessageType.State,
11885
+ value: state,
11886
+ };
11887
+ break;
11888
+ }
11889
+ case MessageType.StateRoot: {
11890
+ handler_logger.log `--> Received unexpected 'StateRoot' message from the fuzzer. Closing.`;
11891
+ this.sender.close();
11892
+ return;
11893
+ }
11894
+ case MessageType.State: {
11895
+ handler_logger.log `--> Received unexpected 'State' message from the fuzzer. Closing.`;
11896
+ this.sender.close();
11897
+ return;
11898
+ }
11899
+ case MessageType.Error: {
11900
+ handler_logger.log `--> Received unexpected 'Error' message from the fuzzer. Closing.`;
11901
+ this.sender.close();
11902
+ return;
11903
+ }
11904
+ default: {
11905
+ handler_logger.log `--> Received unexpected message type ${JSON.stringify(message)} from the fuzzer. Closing.`;
11906
+ this.sender.close();
11907
+ try {
11908
+ assertNever(message);
11909
+ }
11910
+ catch {
11911
+ return;
11912
+ }
11913
+ }
11914
+ }
11915
+ if (response !== null) {
11916
+ handler_logger.trace `<-- responding with: ${response.type}`;
11917
+ const encoded = Encoder.encodeObject(messageCodec, response, this.spec);
11918
+ this.sender.send(encoded);
11919
+ }
11920
+ else {
11921
+ handler_logger.warn `<-- no response generated for: ${message.type}`;
11922
+ }
11923
+ }
11924
+ onClose({ error }) {
11925
+ handler_logger.log `Closing the v1 handler. Reason: ${error !== undefined ? error.message : "close"}.`;
11926
+ }
11927
+ /** Check if a specific feature is enabled in the session */
11928
+ hasFeature(feature) {
11929
+ return (this.sessionFeatures & feature) !== 0;
11930
+ }
11931
+ }
11932
+
11933
+ ;// CONCATENATED MODULE: ./packages/jam/fuzz-proto/v1/index.ts
11934
+
11935
+
11936
+
11937
+ ;// CONCATENATED MODULE: ./packages/jam/fuzz-proto/index.ts
11938
+
11939
+
11940
+
11943
11941
  ;// CONCATENATED MODULE: ./packages/core/pvm-spi-decoder/memory-conts.ts
11944
11942
  // GP reference: https://graypaper.fluffylabs.dev/#/7e6ff6a/2d32002d3200?v=0.6.7
11945
11943
  const memory_conts_PAGE_SIZE = 2 ** 12; // Z_P from GP
@@ -27367,6 +27365,9 @@ function toJson(data) {
27367
27365
  if (value instanceof Map) {
27368
27366
  return Object.fromEntries(value.entries());
27369
27367
  }
27368
+ if (value instanceof ObjectView) {
27369
+ return value.materialize();
27370
+ }
27370
27371
  return value;
27371
27372
  }, 2);
27372
27373
  }