@aztec/slasher 3.0.0-nightly.20250905 → 4.0.0-nightly.20250907

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.
@@ -1 +1 @@
1
- {"version":3,"file":"create_implementation.d.ts","sourceRoot":"","sources":["../../src/factory/create_implementation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAEL,cAAc,EAEf,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAE3D,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAGrE,OAAO,EAAE,mBAAmB,EAA8B,MAAM,6BAA6B,CAAC;AAC9F,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAG9D,OAAO,EAAE,kBAAkB,EAA6B,MAAM,4BAA4B,CAAC;AAC3F,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAE7C,wHAAwH;AACxH,wBAAsB,2BAA2B,CAC/C,MAAM,EAAE,aAAa,GAAG,eAAe,GAAG;IAAE,oBAAoB,EAAE,MAAM,CAAA;CAAE,EAC1E,MAAM,EAAE,cAAc,EACtB,QAAQ,EAAE,UAAU,EACpB,mBAAmB,EAAE,UAAU,GAAG,SAAS,EAC3C,QAAQ,EAAE,OAAO,EAAE,EACnB,UAAU,EAAE,UAAU,EACtB,YAAY,EAAE,YAAY,EAC1B,OAAO,EAAE,gBAAgB,EACzB,MAAM,yCAA0B,yEAcjC"}
1
+ {"version":3,"file":"create_implementation.d.ts","sourceRoot":"","sources":["../../src/factory/create_implementation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAEL,cAAc,EAEf,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAE3D,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAGrE,OAAO,EAAE,mBAAmB,EAA8B,MAAM,6BAA6B,CAAC;AAC9F,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAG9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAG7C,wHAAwH;AACxH,wBAAsB,2BAA2B,CAC/C,MAAM,EAAE,aAAa,GAAG,eAAe,GAAG;IAAE,oBAAoB,EAAE,MAAM,CAAA;CAAE,EAC1E,MAAM,EAAE,cAAc,EACtB,QAAQ,EAAE,UAAU,EACpB,mBAAmB,EAAE,UAAU,GAAG,SAAS,EAC3C,QAAQ,EAAE,OAAO,EAAE,EACnB,UAAU,EAAE,UAAU,EACtB,YAAY,EAAE,YAAY,EAC1B,OAAO,EAAE,gBAAgB,EACzB,MAAM,yCAA0B,yEAcjC"}
@@ -6,6 +6,7 @@ import { NullSlasherClient } from '../null_slasher_client.js';
6
6
  import { SlasherOffensesStore } from '../stores/offenses_store.js';
7
7
  import { SlasherPayloadsStore } from '../stores/payloads_store.js';
8
8
  import { TallySlasherClient } from '../tally_slasher_client.js';
9
+ import { getTallySlasherSettings } from './get_settings.js';
9
10
  /** Creates a slasher client implementation (either tally or empire) based on the slasher proposer type in the rollup */ export async function createSlasherImplementation(config, rollup, l1Client, slashFactoryAddress, watchers, epochCache, dateProvider, kvStore, logger = createLogger('slasher')) {
10
11
  const proposer = await rollup.getSlashingProposer();
11
12
  if (!proposer) {
@@ -61,32 +62,7 @@ async function createTallySlasher(config, rollup, slashingProposer, watchers, da
61
62
  if (slashingProposer.type !== 'tally') {
62
63
  throw new Error('Slashing proposer contract is not of type tally');
63
64
  }
64
- const [slashingExecutionDelayInRounds, slashingRoundSize, slashingRoundSizeInEpochs, slashingLifetimeInRounds, slashingOffsetInRounds, slashingAmounts, slashingQuorumSize, epochDuration, l1GenesisTime, slotDuration, targetCommitteeSize] = await Promise.all([
65
- slashingProposer.getExecutionDelayInRounds(),
66
- slashingProposer.getRoundSize(),
67
- slashingProposer.getRoundSizeInEpochs(),
68
- slashingProposer.getLifetimeInRounds(),
69
- slashingProposer.getSlashOffsetInRounds(),
70
- slashingProposer.getSlashingAmounts(),
71
- slashingProposer.getQuorumSize(),
72
- rollup.getEpochDuration(),
73
- rollup.getL1GenesisTime(),
74
- rollup.getSlotDuration(),
75
- rollup.getTargetCommitteeSize()
76
- ]);
77
- const settings = {
78
- slashingExecutionDelayInRounds: Number(slashingExecutionDelayInRounds),
79
- slashingRoundSize: Number(slashingRoundSize),
80
- slashingRoundSizeInEpochs: Number(slashingRoundSizeInEpochs),
81
- slashingLifetimeInRounds: Number(slashingLifetimeInRounds),
82
- slashingQuorumSize: Number(slashingQuorumSize),
83
- epochDuration: Number(epochDuration),
84
- l1GenesisTime: l1GenesisTime,
85
- slotDuration: Number(slotDuration),
86
- slashingOffsetInRounds: Number(slashingOffsetInRounds),
87
- slashingAmounts,
88
- targetCommitteeSize: Number(targetCommitteeSize)
89
- };
65
+ const settings = await getTallySlasherSettings(rollup, slashingProposer);
90
66
  const offensesStore = new SlasherOffensesStore(kvStore, {
91
67
  ...settings,
92
68
  slashOffenseExpirationRounds: config.slashOffenseExpirationRounds
@@ -0,0 +1,4 @@
1
+ import type { RollupContract, TallySlashingProposerContract } from '@aztec/ethereum';
2
+ import type { TallySlasherSettings } from '../tally_slasher_client.js';
3
+ export declare function getTallySlasherSettings(rollup: RollupContract, slashingProposer?: TallySlashingProposerContract): Promise<TallySlasherSettings>;
4
+ //# sourceMappingURL=get_settings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get_settings.d.ts","sourceRoot":"","sources":["../../src/factory/get_settings.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,6BAA6B,EAAE,MAAM,iBAAiB,CAAC;AAErF,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAEvE,wBAAsB,uBAAuB,CAC3C,MAAM,EAAE,cAAc,EACtB,gBAAgB,CAAC,EAAE,6BAA6B,GAC/C,OAAO,CAAC,oBAAoB,CAAC,CAkD/B"}
@@ -0,0 +1,36 @@
1
+ export async function getTallySlasherSettings(rollup, slashingProposer) {
2
+ if (!slashingProposer) {
3
+ const rollupSlashingProposer = await rollup.getSlashingProposer();
4
+ if (!rollupSlashingProposer || rollupSlashingProposer.type !== 'tally') {
5
+ throw new Error('Rollup slashing proposer is not of type tally');
6
+ }
7
+ slashingProposer = rollupSlashingProposer;
8
+ }
9
+ const [slashingExecutionDelayInRounds, slashingRoundSize, slashingRoundSizeInEpochs, slashingLifetimeInRounds, slashingOffsetInRounds, slashingAmounts, slashingQuorumSize, epochDuration, l1GenesisTime, slotDuration, targetCommitteeSize] = await Promise.all([
10
+ slashingProposer.getExecutionDelayInRounds(),
11
+ slashingProposer.getRoundSize(),
12
+ slashingProposer.getRoundSizeInEpochs(),
13
+ slashingProposer.getLifetimeInRounds(),
14
+ slashingProposer.getSlashOffsetInRounds(),
15
+ slashingProposer.getSlashingAmounts(),
16
+ slashingProposer.getQuorumSize(),
17
+ rollup.getEpochDuration(),
18
+ rollup.getL1GenesisTime(),
19
+ rollup.getSlotDuration(),
20
+ rollup.getTargetCommitteeSize()
21
+ ]);
22
+ const settings = {
23
+ slashingExecutionDelayInRounds: Number(slashingExecutionDelayInRounds),
24
+ slashingRoundSize: Number(slashingRoundSize),
25
+ slashingRoundSizeInEpochs: Number(slashingRoundSizeInEpochs),
26
+ slashingLifetimeInRounds: Number(slashingLifetimeInRounds),
27
+ slashingQuorumSize: Number(slashingQuorumSize),
28
+ epochDuration: Number(epochDuration),
29
+ l1GenesisTime: l1GenesisTime,
30
+ slotDuration: Number(slotDuration),
31
+ slashingOffsetInRounds: Number(slashingOffsetInRounds),
32
+ slashingAmounts,
33
+ targetCommitteeSize: Number(targetCommitteeSize)
34
+ };
35
+ return settings;
36
+ }
@@ -1,2 +1,3 @@
1
1
  export { createSlasherFacade as createSlasher } from './create_facade.js';
2
+ export { getTallySlasherSettings } from './get_settings.js';
2
3
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/factory/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,IAAI,aAAa,EAAE,MAAM,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/factory/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,IAAI,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAC1E,OAAO,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC"}
@@ -1 +1,2 @@
1
1
  export { createSlasherFacade as createSlasher } from './create_facade.js';
2
+ export { getTallySlasherSettings } from './get_settings.js';
@@ -1 +1 @@
1
- {"version":3,"file":"tally_slasher_client.d.ts","sourceRoot":"","sources":["../src/tally_slasher_client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tally_slasher_client.d.ts","sourceRoot":"","sources":["../src/tally_slasher_client.ts"],"names":[],"mappings":"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"}
@@ -125,19 +125,26 @@ import { SlashRoundMonitor } from './slash_round_monitor.js';
125
125
  if (executableRound < 0n) {
126
126
  return undefined;
127
127
  }
128
- const logData = {
128
+ let logData = {
129
129
  currentRound,
130
130
  executableRound,
131
131
  slotNumber
132
132
  };
133
133
  try {
134
134
  const roundInfo = await this.tallySlashingProposer.getRound(executableRound);
135
+ logData = {
136
+ ...logData,
137
+ roundInfo
138
+ };
135
139
  if (roundInfo.isExecuted) {
136
140
  this.log.verbose(`Round ${executableRound} has already been executed`, logData);
137
141
  return undefined;
138
142
  } else if (!roundInfo.readyToExecute) {
139
143
  this.log.verbose(`Round ${executableRound} is not ready to execute yet`, logData);
140
144
  return undefined;
145
+ } else if (roundInfo.voteCount === 0n) {
146
+ this.log.debug(`Round ${executableRound} received no votes`, logData);
147
+ return undefined;
141
148
  } else if (roundInfo.voteCount < this.settings.slashingQuorumSize) {
142
149
  this.log.verbose(`Round ${executableRound} does not have enough votes to execute`, logData);
143
150
  return undefined;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aztec/slasher",
3
- "version": "3.0.0-nightly.20250905",
3
+ "version": "4.0.0-nightly.20250907",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": "./dest/index.js",
@@ -54,20 +54,20 @@
54
54
  ]
55
55
  },
56
56
  "dependencies": {
57
- "@aztec/epoch-cache": "3.0.0-nightly.20250905",
58
- "@aztec/ethereum": "3.0.0-nightly.20250905",
59
- "@aztec/foundation": "3.0.0-nightly.20250905",
60
- "@aztec/kv-store": "3.0.0-nightly.20250905",
61
- "@aztec/l1-artifacts": "3.0.0-nightly.20250905",
62
- "@aztec/stdlib": "3.0.0-nightly.20250905",
63
- "@aztec/telemetry-client": "3.0.0-nightly.20250905",
57
+ "@aztec/epoch-cache": "4.0.0-nightly.20250907",
58
+ "@aztec/ethereum": "4.0.0-nightly.20250907",
59
+ "@aztec/foundation": "4.0.0-nightly.20250907",
60
+ "@aztec/kv-store": "4.0.0-nightly.20250907",
61
+ "@aztec/l1-artifacts": "4.0.0-nightly.20250907",
62
+ "@aztec/stdlib": "4.0.0-nightly.20250907",
63
+ "@aztec/telemetry-client": "4.0.0-nightly.20250907",
64
64
  "source-map-support": "^0.5.21",
65
65
  "tslib": "^2.4.0",
66
66
  "viem": "2.23.7",
67
67
  "zod": "^3.23.8"
68
68
  },
69
69
  "devDependencies": {
70
- "@aztec/aztec.js": "3.0.0-nightly.20250905",
70
+ "@aztec/aztec.js": "4.0.0-nightly.20250907",
71
71
  "@jest/globals": "^30.0.0",
72
72
  "@types/jest": "^30.0.0",
73
73
  "@types/node": "^22.15.17",
@@ -17,8 +17,9 @@ import { EmpireSlasherClient, type EmpireSlasherSettings } from '../empire_slash
17
17
  import { NullSlasherClient } from '../null_slasher_client.js';
18
18
  import { SlasherOffensesStore } from '../stores/offenses_store.js';
19
19
  import { SlasherPayloadsStore } from '../stores/payloads_store.js';
20
- import { TallySlasherClient, type TallySlasherSettings } from '../tally_slasher_client.js';
20
+ import { TallySlasherClient } from '../tally_slasher_client.js';
21
21
  import type { Watcher } from '../watcher.js';
22
+ import { getTallySlasherSettings } from './get_settings.js';
22
23
 
23
24
  /** Creates a slasher client implementation (either tally or empire) based on the slasher proposer type in the rollup */
24
25
  export async function createSlasherImplementation(
@@ -132,45 +133,7 @@ async function createTallySlasher(
132
133
  throw new Error('Slashing proposer contract is not of type tally');
133
134
  }
134
135
 
135
- const [
136
- slashingExecutionDelayInRounds,
137
- slashingRoundSize,
138
- slashingRoundSizeInEpochs,
139
- slashingLifetimeInRounds,
140
- slashingOffsetInRounds,
141
- slashingAmounts,
142
- slashingQuorumSize,
143
- epochDuration,
144
- l1GenesisTime,
145
- slotDuration,
146
- targetCommitteeSize,
147
- ] = await Promise.all([
148
- slashingProposer.getExecutionDelayInRounds(),
149
- slashingProposer.getRoundSize(),
150
- slashingProposer.getRoundSizeInEpochs(),
151
- slashingProposer.getLifetimeInRounds(),
152
- slashingProposer.getSlashOffsetInRounds(),
153
- slashingProposer.getSlashingAmounts(),
154
- slashingProposer.getQuorumSize(),
155
- rollup.getEpochDuration(),
156
- rollup.getL1GenesisTime(),
157
- rollup.getSlotDuration(),
158
- rollup.getTargetCommitteeSize(),
159
- ]);
160
-
161
- const settings: TallySlasherSettings = {
162
- slashingExecutionDelayInRounds: Number(slashingExecutionDelayInRounds),
163
- slashingRoundSize: Number(slashingRoundSize),
164
- slashingRoundSizeInEpochs: Number(slashingRoundSizeInEpochs),
165
- slashingLifetimeInRounds: Number(slashingLifetimeInRounds),
166
- slashingQuorumSize: Number(slashingQuorumSize),
167
- epochDuration: Number(epochDuration),
168
- l1GenesisTime: l1GenesisTime,
169
- slotDuration: Number(slotDuration),
170
- slashingOffsetInRounds: Number(slashingOffsetInRounds),
171
- slashingAmounts,
172
- targetCommitteeSize: Number(targetCommitteeSize),
173
- };
136
+ const settings = await getTallySlasherSettings(rollup, slashingProposer);
174
137
 
175
138
  const offensesStore = new SlasherOffensesStore(kvStore, {
176
139
  ...settings,
@@ -0,0 +1,58 @@
1
+ import type { RollupContract, TallySlashingProposerContract } from '@aztec/ethereum';
2
+
3
+ import type { TallySlasherSettings } from '../tally_slasher_client.js';
4
+
5
+ export async function getTallySlasherSettings(
6
+ rollup: RollupContract,
7
+ slashingProposer?: TallySlashingProposerContract,
8
+ ): Promise<TallySlasherSettings> {
9
+ if (!slashingProposer) {
10
+ const rollupSlashingProposer = await rollup.getSlashingProposer();
11
+ if (!rollupSlashingProposer || rollupSlashingProposer.type !== 'tally') {
12
+ throw new Error('Rollup slashing proposer is not of type tally');
13
+ }
14
+ slashingProposer = rollupSlashingProposer;
15
+ }
16
+
17
+ const [
18
+ slashingExecutionDelayInRounds,
19
+ slashingRoundSize,
20
+ slashingRoundSizeInEpochs,
21
+ slashingLifetimeInRounds,
22
+ slashingOffsetInRounds,
23
+ slashingAmounts,
24
+ slashingQuorumSize,
25
+ epochDuration,
26
+ l1GenesisTime,
27
+ slotDuration,
28
+ targetCommitteeSize,
29
+ ] = await Promise.all([
30
+ slashingProposer.getExecutionDelayInRounds(),
31
+ slashingProposer.getRoundSize(),
32
+ slashingProposer.getRoundSizeInEpochs(),
33
+ slashingProposer.getLifetimeInRounds(),
34
+ slashingProposer.getSlashOffsetInRounds(),
35
+ slashingProposer.getSlashingAmounts(),
36
+ slashingProposer.getQuorumSize(),
37
+ rollup.getEpochDuration(),
38
+ rollup.getL1GenesisTime(),
39
+ rollup.getSlotDuration(),
40
+ rollup.getTargetCommitteeSize(),
41
+ ]);
42
+
43
+ const settings: TallySlasherSettings = {
44
+ slashingExecutionDelayInRounds: Number(slashingExecutionDelayInRounds),
45
+ slashingRoundSize: Number(slashingRoundSize),
46
+ slashingRoundSizeInEpochs: Number(slashingRoundSizeInEpochs),
47
+ slashingLifetimeInRounds: Number(slashingLifetimeInRounds),
48
+ slashingQuorumSize: Number(slashingQuorumSize),
49
+ epochDuration: Number(epochDuration),
50
+ l1GenesisTime: l1GenesisTime,
51
+ slotDuration: Number(slotDuration),
52
+ slashingOffsetInRounds: Number(slashingOffsetInRounds),
53
+ slashingAmounts,
54
+ targetCommitteeSize: Number(targetCommitteeSize),
55
+ };
56
+
57
+ return settings;
58
+ }
@@ -1 +1,2 @@
1
1
  export { createSlasherFacade as createSlasher } from './create_facade.js';
2
+ export { getTallySlasherSettings } from './get_settings.js';
@@ -185,15 +185,20 @@ export class TallySlasherClient implements ProposerSlashActionProvider, SlasherC
185
185
  return undefined;
186
186
  }
187
187
 
188
- const logData = { currentRound, executableRound, slotNumber };
188
+ let logData: Record<string, unknown> = { currentRound, executableRound, slotNumber };
189
+
189
190
  try {
190
191
  const roundInfo = await this.tallySlashingProposer.getRound(executableRound);
192
+ logData = { ...logData, roundInfo };
191
193
  if (roundInfo.isExecuted) {
192
194
  this.log.verbose(`Round ${executableRound} has already been executed`, logData);
193
195
  return undefined;
194
196
  } else if (!roundInfo.readyToExecute) {
195
197
  this.log.verbose(`Round ${executableRound} is not ready to execute yet`, logData);
196
198
  return undefined;
199
+ } else if (roundInfo.voteCount === 0n) {
200
+ this.log.debug(`Round ${executableRound} received no votes`, logData);
201
+ return undefined;
197
202
  } else if (roundInfo.voteCount < this.settings.slashingQuorumSize) {
198
203
  this.log.verbose(`Round ${executableRound} does not have enough votes to execute`, logData);
199
204
  return undefined;