@aztec/sequencer-client 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.
Files changed (85) hide show
  1. package/dest/client/index.js +0 -1
  2. package/dest/client/sequencer-client.js +52 -57
  3. package/dest/config.js +40 -42
  4. package/dest/global_variable_builder/global_builder.js +39 -26
  5. package/dest/global_variable_builder/index.js +0 -1
  6. package/dest/index.js +0 -1
  7. package/dest/publisher/config.js +49 -50
  8. package/dest/publisher/index.js +0 -1
  9. package/dest/publisher/sequencer-publisher-metrics.js +32 -23
  10. package/dest/publisher/sequencer-publisher.js +216 -191
  11. package/dest/sequencer/allowed.js +5 -12
  12. package/dest/sequencer/config.js +1 -2
  13. package/dest/sequencer/index.js +0 -1
  14. package/dest/sequencer/metrics.js +26 -18
  15. package/dest/sequencer/sequencer.js +648 -607
  16. package/dest/sequencer/timetable.js +33 -19
  17. package/dest/sequencer/utils.js +22 -32
  18. package/dest/slasher/factory.js +5 -4
  19. package/dest/slasher/index.js +0 -1
  20. package/dest/slasher/slasher_client.js +107 -110
  21. package/dest/test/index.js +4 -1
  22. package/dest/tx_validator/archive_cache.js +7 -7
  23. package/dest/tx_validator/gas_validator.js +76 -64
  24. package/dest/tx_validator/nullifier_cache.js +8 -8
  25. package/dest/tx_validator/phases_validator.js +27 -19
  26. package/dest/tx_validator/test_utils.js +1 -2
  27. package/dest/tx_validator/tx_validator_factory.js +5 -5
  28. package/package.json +23 -22
  29. package/src/config.ts +1 -1
  30. package/src/publisher/sequencer-publisher.ts +1 -1
  31. package/src/sequencer/sequencer.ts +29 -13
  32. package/dest/client/index.d.ts +0 -2
  33. package/dest/client/index.d.ts.map +0 -1
  34. package/dest/client/sequencer-client.d.ts +0 -68
  35. package/dest/client/sequencer-client.d.ts.map +0 -1
  36. package/dest/config.d.ts +0 -37
  37. package/dest/config.d.ts.map +0 -1
  38. package/dest/global_variable_builder/global_builder.d.ts +0 -29
  39. package/dest/global_variable_builder/global_builder.d.ts.map +0 -1
  40. package/dest/global_variable_builder/index.d.ts +0 -2
  41. package/dest/global_variable_builder/index.d.ts.map +0 -1
  42. package/dest/index.d.ts +0 -8
  43. package/dest/index.d.ts.map +0 -1
  44. package/dest/publisher/config.d.ts +0 -38
  45. package/dest/publisher/config.d.ts.map +0 -1
  46. package/dest/publisher/index.d.ts +0 -2
  47. package/dest/publisher/index.d.ts.map +0 -1
  48. package/dest/publisher/sequencer-publisher-metrics.d.ts +0 -24
  49. package/dest/publisher/sequencer-publisher-metrics.d.ts.map +0 -1
  50. package/dest/publisher/sequencer-publisher.d.ts +0 -163
  51. package/dest/publisher/sequencer-publisher.d.ts.map +0 -1
  52. package/dest/sequencer/allowed.d.ts +0 -3
  53. package/dest/sequencer/allowed.d.ts.map +0 -1
  54. package/dest/sequencer/config.d.ts +0 -2
  55. package/dest/sequencer/config.d.ts.map +0 -1
  56. package/dest/sequencer/index.d.ts +0 -4
  57. package/dest/sequencer/index.d.ts.map +0 -1
  58. package/dest/sequencer/metrics.d.ts +0 -24
  59. package/dest/sequencer/metrics.d.ts.map +0 -1
  60. package/dest/sequencer/sequencer.d.ts +0 -172
  61. package/dest/sequencer/sequencer.d.ts.map +0 -1
  62. package/dest/sequencer/timetable.d.ts +0 -38
  63. package/dest/sequencer/timetable.d.ts.map +0 -1
  64. package/dest/sequencer/utils.d.ts +0 -47
  65. package/dest/sequencer/utils.d.ts.map +0 -1
  66. package/dest/slasher/factory.d.ts +0 -11
  67. package/dest/slasher/factory.d.ts.map +0 -1
  68. package/dest/slasher/index.d.ts +0 -3
  69. package/dest/slasher/index.d.ts.map +0 -1
  70. package/dest/slasher/slasher_client.d.ts +0 -127
  71. package/dest/slasher/slasher_client.d.ts.map +0 -1
  72. package/dest/test/index.d.ts +0 -17
  73. package/dest/test/index.d.ts.map +0 -1
  74. package/dest/tx_validator/archive_cache.d.ts +0 -14
  75. package/dest/tx_validator/archive_cache.d.ts.map +0 -1
  76. package/dest/tx_validator/gas_validator.d.ts +0 -12
  77. package/dest/tx_validator/gas_validator.d.ts.map +0 -1
  78. package/dest/tx_validator/nullifier_cache.d.ts +0 -16
  79. package/dest/tx_validator/nullifier_cache.d.ts.map +0 -1
  80. package/dest/tx_validator/phases_validator.d.ts +0 -11
  81. package/dest/tx_validator/phases_validator.d.ts.map +0 -1
  82. package/dest/tx_validator/test_utils.d.ts +0 -21
  83. package/dest/tx_validator/test_utils.d.ts.map +0 -1
  84. package/dest/tx_validator/tx_validator_factory.d.ts +0 -16
  85. package/dest/tx_validator/tx_validator_factory.d.ts.map +0 -1
@@ -8,27 +8,20 @@ export async function getDefaultAllowedSetupFunctions() {
8
8
  defaultAllowedSetupFunctions = [
9
9
  // needed for authwit support
10
10
  {
11
- address: ProtocolContractAddress.AuthRegistry,
11
+ address: ProtocolContractAddress.AuthRegistry
12
12
  },
13
13
  // needed for claiming on the same tx as a spend
14
14
  {
15
- address: ProtocolContractAddress.FeeJuice,
16
- // We can't restrict the selector because public functions get routed via dispatch.
17
- // selector: FunctionSelector.fromSignature('_increase_public_balance((Field),(Field,Field))'),
15
+ address: ProtocolContractAddress.FeeJuice
18
16
  },
19
17
  // needed for private transfers via FPC
20
18
  {
21
- classId: (await getContractClassFromArtifact(TokenContractArtifact)).id,
22
- // We can't restrict the selector because public functions get routed via dispatch.
23
- // selector: FunctionSelector.fromSignature('_increase_public_balance((Field),(Field,Field))'),
19
+ classId: (await getContractClassFromArtifact(TokenContractArtifact)).id
24
20
  },
25
21
  {
26
- classId: (await getContractClassFromArtifact(FPCContract.artifact)).id,
27
- // We can't restrict the selector because public functions get routed via dispatch.
28
- // selector: FunctionSelector.fromSignature('prepare_fee((Field),Field,(Field),Field)'),
29
- },
22
+ classId: (await getContractClassFromArtifact(FPCContract.artifact)).id
23
+ }
30
24
  ];
31
25
  }
32
26
  return defaultAllowedSetupFunctions;
33
27
  }
34
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWxsb3dlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXF1ZW5jZXIvYWxsb3dlZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNsRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDM0QsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDdkUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFFcEUsSUFBSSw0QkFBNEIsR0FBaUMsU0FBUyxDQUFDO0FBRTNFLE1BQU0sQ0FBQyxLQUFLLFVBQVUsK0JBQStCO0lBQ25ELElBQUksNEJBQTRCLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDL0MsNEJBQTRCLEdBQUc7WUFDN0IsNkJBQTZCO1lBQzdCO2dCQUNFLE9BQU8sRUFBRSx1QkFBdUIsQ0FBQyxZQUFZO2FBQzlDO1lBQ0QsZ0RBQWdEO1lBQ2hEO2dCQUNFLE9BQU8sRUFBRSx1QkFBdUIsQ0FBQyxRQUFRO2dCQUN6QyxtRkFBbUY7Z0JBQ25GLCtGQUErRjthQUNoRztZQUNELHVDQUF1QztZQUN2QztnQkFDRSxPQUFPLEVBQUUsQ0FBQyxNQUFNLDRCQUE0QixDQUFDLHFCQUFxQixDQUFDLENBQUMsQ0FBQyxFQUFFO2dCQUN2RSxtRkFBbUY7Z0JBQ25GLCtGQUErRjthQUNoRztZQUNEO2dCQUNFLE9BQU8sRUFBRSxDQUFDLE1BQU0sNEJBQTRCLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRTtnQkFDdEUsbUZBQW1GO2dCQUNuRix3RkFBd0Y7YUFDekY7U0FDRixDQUFDO0lBQ0osQ0FBQztJQUNELE9BQU8sNEJBQTRCLENBQUM7QUFDdEMsQ0FBQyJ9
@@ -1,2 +1 @@
1
- export {};
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlcXVlbmNlci9jb25maWcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiJ9
1
+ export { };
@@ -1,4 +1,3 @@
1
1
  export * from './config.js';
2
2
  export * from './sequencer.js';
3
3
  export * from './allowed.js';
4
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VxdWVuY2VyL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsYUFBYSxDQUFDO0FBQzVCLGNBQWMsZ0JBQWdCLENBQUM7QUFDL0IsY0FBYyxjQUFjLENBQUMifQ==
@@ -1,53 +1,62 @@
1
- import { Attributes, Metrics, ValueType, } from '@aztec/telemetry-client';
1
+ import { Attributes, Metrics, ValueType } from '@aztec/telemetry-client';
2
2
  import { sequencerStateToNumber } from './utils.js';
3
3
  export class SequencerMetrics {
4
- constructor(client, getState, name = 'Sequencer') {
4
+ tracer;
5
+ blockCounter;
6
+ blockBuildDuration;
7
+ blockBuildManaPerSecond;
8
+ stateTransitionBufferDuration;
9
+ currentBlockNumber;
10
+ currentBlockSize;
11
+ blockBuilderInsertions;
12
+ timeToCollectAttestations;
13
+ constructor(client, getState, name = 'Sequencer'){
5
14
  const meter = client.getMeter(name);
6
15
  this.tracer = client.getTracer(name);
7
16
  this.blockCounter = meter.createUpDownCounter(Metrics.SEQUENCER_BLOCK_COUNT);
8
17
  this.blockBuildDuration = meter.createHistogram(Metrics.SEQUENCER_BLOCK_BUILD_DURATION, {
9
18
  unit: 'ms',
10
19
  description: 'Duration to build a block',
11
- valueType: ValueType.INT,
20
+ valueType: ValueType.INT
12
21
  });
13
22
  this.blockBuildManaPerSecond = meter.createGauge(Metrics.SEQUENCER_BLOCK_BUILD_MANA_PER_SECOND, {
14
23
  unit: 'mana/s',
15
24
  description: 'Mana per second when building a block',
16
- valueType: ValueType.INT,
25
+ valueType: ValueType.INT
17
26
  });
18
27
  this.stateTransitionBufferDuration = meter.createHistogram(Metrics.SEQUENCER_STATE_TRANSITION_BUFFER_DURATION, {
19
28
  unit: 'ms',
20
29
  description: 'The time difference between when the sequencer needed to transition to a new state and when it actually did.',
21
- valueType: ValueType.INT,
30
+ valueType: ValueType.INT
22
31
  });
23
32
  const currentState = meter.createObservableGauge(Metrics.SEQUENCER_CURRENT_STATE, {
24
- description: 'Current state of the sequencer',
33
+ description: 'Current state of the sequencer'
25
34
  });
26
- currentState.addCallback(observer => {
35
+ currentState.addCallback((observer)=>{
27
36
  observer.observe(sequencerStateToNumber(getState()));
28
37
  });
29
38
  this.currentBlockNumber = meter.createGauge(Metrics.SEQUENCER_CURRENT_BLOCK_NUMBER, {
30
39
  description: 'Current block number',
31
- valueType: ValueType.INT,
40
+ valueType: ValueType.INT
32
41
  });
33
42
  this.currentBlockSize = meter.createGauge(Metrics.SEQUENCER_CURRENT_BLOCK_SIZE, {
34
43
  description: 'Current block size',
35
- valueType: ValueType.INT,
44
+ valueType: ValueType.INT
36
45
  });
37
46
  this.timeToCollectAttestations = meter.createGauge(Metrics.SEQUENCER_TIME_TO_COLLECT_ATTESTATIONS, {
38
47
  description: 'The time spent collecting attestations from committee members',
39
- valueType: ValueType.INT,
48
+ valueType: ValueType.INT
40
49
  });
41
50
  this.blockBuilderInsertions = meter.createHistogram(Metrics.SEQUENCER_BLOCK_BUILD_INSERTION_TIME, {
42
51
  description: 'Timer for tree insertions performed by the block builder',
43
52
  unit: 'us',
44
- valueType: ValueType.INT,
53
+ valueType: ValueType.INT
45
54
  });
46
55
  this.setCurrentBlock(0, 0);
47
56
  }
48
57
  startCollectingAttestationsTimer() {
49
58
  const startTime = Date.now();
50
- const stop = () => {
59
+ const stop = ()=>{
51
60
  const duration = Date.now() - startTime;
52
61
  this.recordTimeToCollectAttestations(duration);
53
62
  };
@@ -61,20 +70,20 @@ export class SequencerMetrics {
61
70
  }
62
71
  recordCancelledBlock() {
63
72
  this.blockCounter.add(1, {
64
- [Attributes.STATUS]: 'cancelled',
73
+ [Attributes.STATUS]: 'cancelled'
65
74
  });
66
75
  this.setCurrentBlock(0, 0);
67
76
  }
68
77
  recordBuiltBlock(buildDurationMs, totalMana) {
69
78
  this.blockCounter.add(1, {
70
- [Attributes.STATUS]: 'built',
79
+ [Attributes.STATUS]: 'built'
71
80
  });
72
81
  this.blockBuildDuration.record(Math.ceil(buildDurationMs));
73
- this.blockBuildManaPerSecond.record(Math.ceil((totalMana * 1000) / buildDurationMs));
82
+ this.blockBuildManaPerSecond.record(Math.ceil(totalMana * 1000 / buildDurationMs));
74
83
  }
75
84
  recordFailedBlock() {
76
85
  this.blockCounter.add(1, {
77
- [Attributes.STATUS]: 'failed',
86
+ [Attributes.STATUS]: 'failed'
78
87
  });
79
88
  this.setCurrentBlock(0, 0);
80
89
  }
@@ -83,7 +92,7 @@ export class SequencerMetrics {
83
92
  }
84
93
  recordStateTransitionBufferMs(durationMs, state) {
85
94
  this.stateTransitionBufferDuration.record(durationMs, {
86
- [Attributes.SEQUENCER_STATE]: state,
95
+ [Attributes.SEQUENCER_STATE]: state
87
96
  });
88
97
  }
89
98
  setCurrentBlock(blockNumber, txCount) {
@@ -91,4 +100,3 @@ export class SequencerMetrics {
91
100
  this.currentBlockSize.record(txCount);
92
101
  }
93
102
  }
94
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWV0cmljcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zZXF1ZW5jZXIvbWV0cmljcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsVUFBVSxFQUdWLE9BQU8sRUFJUCxTQUFTLEdBQ1YsTUFBTSx5QkFBeUIsQ0FBQztBQUVqQyxPQUFPLEVBQW9ELHNCQUFzQixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBRXRHLE1BQU0sT0FBTyxnQkFBZ0I7SUFhM0IsWUFBWSxNQUF1QixFQUFFLFFBQWdDLEVBQUUsSUFBSSxHQUFHLFdBQVc7UUFDdkYsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNwQyxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFckMsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUMsbUJBQW1CLENBQUMsT0FBTyxDQUFDLHFCQUFxQixDQUFDLENBQUM7UUFFN0UsSUFBSSxDQUFDLGtCQUFrQixHQUFHLEtBQUssQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLDhCQUE4QixFQUFFO1lBQ3RGLElBQUksRUFBRSxJQUFJO1lBQ1YsV0FBVyxFQUFFLDJCQUEyQjtZQUN4QyxTQUFTLEVBQUUsU0FBUyxDQUFDLEdBQUc7U0FDekIsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLHVCQUF1QixHQUFHLEtBQUssQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLHFDQUFxQyxFQUFFO1lBQzlGLElBQUksRUFBRSxRQUFRO1lBQ2QsV0FBVyxFQUFFLHVDQUF1QztZQUNwRCxTQUFTLEVBQUUsU0FBUyxDQUFDLEdBQUc7U0FDekIsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLDZCQUE2QixHQUFHLEtBQUssQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLDBDQUEwQyxFQUFFO1lBQzdHLElBQUksRUFBRSxJQUFJO1lBQ1Ys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