@aztec/validator-ha-signer 0.0.1-commit.ffe5b04ea → 0.0.1-commit.fff30aa

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 (46) hide show
  1. package/README.md +2 -0
  2. package/dest/config.d.ts +101 -0
  3. package/dest/config.d.ts.map +1 -0
  4. package/dest/config.js +92 -0
  5. package/dest/db/in_memory.d.ts +20 -0
  6. package/dest/db/in_memory.d.ts.map +1 -0
  7. package/dest/db/in_memory.js +73 -0
  8. package/dest/db/index.d.ts +1 -2
  9. package/dest/db/index.d.ts.map +1 -1
  10. package/dest/db/index.js +0 -1
  11. package/dest/db/postgres.d.ts +2 -4
  12. package/dest/db/postgres.d.ts.map +1 -1
  13. package/dest/db/postgres.js +13 -13
  14. package/dest/db/types.d.ts +18 -37
  15. package/dest/db/types.d.ts.map +1 -1
  16. package/dest/db/types.js +15 -30
  17. package/dest/factory.d.ts +13 -18
  18. package/dest/factory.d.ts.map +1 -1
  19. package/dest/factory.js +22 -42
  20. package/dest/slashing_protection_service.d.ts +3 -12
  21. package/dest/slashing_protection_service.d.ts.map +1 -1
  22. package/dest/slashing_protection_service.js +6 -17
  23. package/dest/types.d.ts +70 -17
  24. package/dest/types.d.ts.map +1 -1
  25. package/dest/types.js +20 -3
  26. package/dest/validator_ha_signer.d.ts +4 -12
  27. package/dest/validator_ha_signer.d.ts.map +1 -1
  28. package/dest/validator_ha_signer.js +8 -16
  29. package/package.json +6 -10
  30. package/src/config.ts +149 -0
  31. package/src/db/in_memory.ts +107 -0
  32. package/src/db/index.ts +0 -1
  33. package/src/db/postgres.ts +11 -13
  34. package/src/db/types.ts +16 -61
  35. package/src/factory.ts +28 -53
  36. package/src/slashing_protection_service.ts +7 -28
  37. package/src/types.ts +104 -32
  38. package/src/validator_ha_signer.ts +12 -33
  39. package/dest/db/lmdb.d.ts +0 -66
  40. package/dest/db/lmdb.d.ts.map +0 -1
  41. package/dest/db/lmdb.js +0 -188
  42. package/dest/metrics.d.ts +0 -51
  43. package/dest/metrics.d.ts.map +0 -1
  44. package/dest/metrics.js +0 -103
  45. package/src/db/lmdb.ts +0 -264
  46. package/src/metrics.ts +0 -138
package/README.md CHANGED
@@ -36,6 +36,7 @@ import { createHASigner } from '@aztec/validator-ha-signer/factory';
36
36
 
37
37
  const { signer, db } = await createHASigner({
38
38
  databaseUrl: process.env.DATABASE_URL,
39
+ haSigningEnabled: true,
39
40
  nodeId: 'validator-node-1',
40
41
  pollingIntervalMs: 100,
41
42
  signingTimeoutMs: 3000,
@@ -80,6 +81,7 @@ const db = new PostgresSlashingProtectionDatabase(pool);
80
81
  await db.initialize();
81
82
 
82
83
  const signer = new ValidatorHASigner(db, {
84
+ haSigningEnabled: true,
83
85
  nodeId: 'validator-node-1',
84
86
  pollingIntervalMs: 100,
85
87
  signingTimeoutMs: 3000,
@@ -0,0 +1,101 @@
1
+ import type { L1ContractAddresses } from '@aztec/ethereum/l1-contract-addresses';
2
+ import { type ConfigMappingsType } from '@aztec/foundation/config';
3
+ import { EthAddress } from '@aztec/foundation/eth-address';
4
+ import { z } from 'zod';
5
+ /**
6
+ * Configuration for the Validator HA Signer
7
+ *
8
+ * This config is used for distributed locking and slashing protection
9
+ * when running multiple validator nodes in a high-availability setup.
10
+ */
11
+ export interface ValidatorHASignerConfig {
12
+ /** Whether HA signing / slashing protection is enabled */
13
+ haSigningEnabled: boolean;
14
+ /** L1 contract addresses (rollup address required) */
15
+ l1Contracts: Pick<L1ContractAddresses, 'rollupAddress'>;
16
+ /** Unique identifier for this node */
17
+ nodeId: string;
18
+ /** How long to wait between polls when a duty is being signed (ms) */
19
+ pollingIntervalMs: number;
20
+ /** Maximum time to wait for a duty being signed to complete (ms) */
21
+ signingTimeoutMs: number;
22
+ /** Maximum age of a stuck duty in ms (defaults to 2x hardcoded Aztec slot duration if not set) */
23
+ maxStuckDutiesAgeMs?: number;
24
+ /** Optional: clean up old duties after this many hours (disabled if not set) */
25
+ cleanupOldDutiesAfterHours?: number;
26
+ /**
27
+ * PostgreSQL connection string
28
+ * Format: postgresql://user:password@host:port/database
29
+ */
30
+ databaseUrl?: string;
31
+ /**
32
+ * PostgreSQL connection pool configuration
33
+ */
34
+ /** Maximum number of clients in the pool (default: 10) */
35
+ poolMaxCount?: number;
36
+ /** Minimum number of clients in the pool (default: 0) */
37
+ poolMinCount?: number;
38
+ /** Idle timeout in milliseconds (default: 10000) */
39
+ poolIdleTimeoutMs?: number;
40
+ /** Connection timeout in milliseconds (default: 0, no timeout) */
41
+ poolConnectionTimeoutMs?: number;
42
+ }
43
+ export declare const validatorHASignerConfigMappings: ConfigMappingsType<ValidatorHASignerConfig>;
44
+ export declare const defaultValidatorHASignerConfig: ValidatorHASignerConfig;
45
+ /**
46
+ * Returns the validator HA signer configuration from environment variables.
47
+ * Note: If an environment variable is not set, the default value is used.
48
+ * @returns The validator HA signer configuration.
49
+ */
50
+ export declare function getConfigEnvVars(): ValidatorHASignerConfig;
51
+ export declare const ValidatorHASignerConfigSchema: z.ZodObject<{
52
+ haSigningEnabled: z.ZodBoolean;
53
+ l1Contracts: z.ZodObject<{
54
+ rollupAddress: z.ZodType<EthAddress, z.ZodTypeDef, EthAddress>;
55
+ }, "strip", z.ZodTypeAny, {
56
+ rollupAddress: EthAddress;
57
+ }, {
58
+ rollupAddress: EthAddress;
59
+ }>;
60
+ nodeId: z.ZodString;
61
+ pollingIntervalMs: z.ZodNumber;
62
+ signingTimeoutMs: z.ZodNumber;
63
+ maxStuckDutiesAgeMs: z.ZodOptional<z.ZodNumber>;
64
+ cleanupOldDutiesAfterHours: z.ZodOptional<z.ZodNumber>;
65
+ databaseUrl: z.ZodOptional<z.ZodString>;
66
+ poolMaxCount: z.ZodOptional<z.ZodNumber>;
67
+ poolMinCount: z.ZodOptional<z.ZodNumber>;
68
+ poolIdleTimeoutMs: z.ZodOptional<z.ZodNumber>;
69
+ poolConnectionTimeoutMs: z.ZodOptional<z.ZodNumber>;
70
+ }, "strip", z.ZodTypeAny, {
71
+ haSigningEnabled: boolean;
72
+ l1Contracts: {
73
+ rollupAddress: EthAddress;
74
+ };
75
+ nodeId: string;
76
+ pollingIntervalMs: number;
77
+ signingTimeoutMs: number;
78
+ maxStuckDutiesAgeMs?: number | undefined;
79
+ cleanupOldDutiesAfterHours?: number | undefined;
80
+ databaseUrl?: string | undefined;
81
+ poolMaxCount?: number | undefined;
82
+ poolMinCount?: number | undefined;
83
+ poolIdleTimeoutMs?: number | undefined;
84
+ poolConnectionTimeoutMs?: number | undefined;
85
+ }, {
86
+ haSigningEnabled: boolean;
87
+ l1Contracts: {
88
+ rollupAddress: EthAddress;
89
+ };
90
+ nodeId: string;
91
+ pollingIntervalMs: number;
92
+ signingTimeoutMs: number;
93
+ maxStuckDutiesAgeMs?: number | undefined;
94
+ cleanupOldDutiesAfterHours?: number | undefined;
95
+ databaseUrl?: string | undefined;
96
+ poolMaxCount?: number | undefined;
97
+ poolMinCount?: number | undefined;
98
+ poolIdleTimeoutMs?: number | undefined;
99
+ poolConnectionTimeoutMs?: number | undefined;
100
+ }>;
101
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvY29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDakYsT0FBTyxFQUNMLEtBQUssa0JBQWtCLEVBTXhCLE1BQU0sMEJBQTBCLENBQUM7QUFDbEMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBRzNELE9BQU8sRUFBRSxDQUFDLEVBQUUsTUFBTSxLQUFLLENBQUM7QUFFeEI7Ozs7O0dBS0c7QUFDSCxNQUFNLFdBQVcsdUJBQXVCO0lBQ3RDLDBEQUEwRDtJQUMxRCxnQkFBZ0IsRUFBRSxPQUFPLENBQUM7SUFDMUIsc0RBQXNEO0lBQ3RELFdBQVcsRUFBRSxJQUFJLENBQUMsbUJBQW1CLEVBQUUsZUFBZSxDQUFDLENBQUM7SUFDeEQsc0NBQXNDO0lBQ3RDLE1BQU0sRUFBRSxNQUFNLENBQUM7SUFDZixzRUFBc0U7SUFDdEUsaUJBQWlCLEVBQUUsTUFBTSxDQUFDO0lBQzFCLG9FQUFvRTtJQUNwRSxnQkFBZ0IsRUFBRSxNQUFNLENBQUM7SUFDekIsa0dBQWtHO0lBQ2xHLG1CQUFtQixDQUFDLEVBQUUsTUFBTSxDQUFDO0lBQzdCLGdGQUFnRjtJQUNoRiwwQkFBMEIsQ0FBQyxFQUFFLE1BQU0sQ0FBQztJQUNwQzs7O09BR0c7SUFDSCxXQUFXLENBQUMsRUFBRSxNQUFNLENBQUM7SUFDckI7O09BRUc7SUFDSCwwREFBMEQ7SUFDMUQsWUFBWSxDQUFDLEVBQUUsTUFBTSxDQUFDO0lBQ3RCLHlEQUF5RDtJQUN6RCxZQUFZLENBQUMsRUFBRSxNQUFNLENBQUM7SUFDdEIsb0RBQW9EO0lBQ3BELGlCQUFpQixDQUFDLEVBQUUsTUFBTSxDQUFDO0lBQzNCLGtFQUFrRTtJQUNsRSx1QkFBdUIsQ0FBQyxFQUFFLE1BQU0sQ0FBQztDQUNsQztBQUVELGVBQU8sTUFBTSwrQkFBK0IsRUFBRSxrQkFBa0IsQ0FBQyx1QkFBdUIsQ0FpRXZGLENBQUM7QUFFRixlQUFPLE1BQU0sOEJBQThCLEVBQUUsdUJBRTVDLENBQUM7QUFFRjs7OztHQUlHO0FBQ0gsd0JBQWdCLGdCQUFnQixJQUFJLHVCQUF1QixDQUUxRDtBQUVELGVBQU8sTUFBTSw2QkFBNkI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7RUFlRSxDQUFDIn0=
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uCAAuC,CAAC;AACjF,OAAO,EACL,KAAK,kBAAkB,EAMxB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAG3D,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;;;;GAKG;AACH,MAAM,WAAW,uBAAuB;IACtC,0DAA0D;IAC1D,gBAAgB,EAAE,OAAO,CAAC;IAC1B,sDAAsD;IACtD,WAAW,EAAE,IAAI,CAAC,mBAAmB,EAAE,eAAe,CAAC,CAAC;IACxD,sCAAsC;IACtC,MAAM,EAAE,MAAM,CAAC;IACf,sEAAsE;IACtE,iBAAiB,EAAE,MAAM,CAAC;IAC1B,oEAAoE;IACpE,gBAAgB,EAAE,MAAM,CAAC;IACzB,kGAAkG;IAClG,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,gFAAgF;IAChF,0BAA0B,CAAC,EAAE,MAAM,CAAC;IACpC;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;OAEG;IACH,0DAA0D;IAC1D,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,yDAAyD;IACzD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,oDAAoD;IACpD,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,kEAAkE;IAClE,uBAAuB,CAAC,EAAE,MAAM,CAAC;CAClC;AAED,eAAO,MAAM,+BAA+B,EAAE,kBAAkB,CAAC,uBAAuB,CAiEvF,CAAC;AAEF,eAAO,MAAM,8BAA8B,EAAE,uBAE5C,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,gBAAgB,IAAI,uBAAuB,CAE1D;AAED,eAAO,MAAM,6BAA6B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAeE,CAAC"}
package/dest/config.js ADDED
@@ -0,0 +1,92 @@
1
+ import { booleanConfigHelper, getConfigFromMappings, getDefaultConfig, numberConfigHelper, optionalNumberConfigHelper } from '@aztec/foundation/config';
2
+ import { EthAddress } from '@aztec/foundation/eth-address';
3
+ import { z } from 'zod';
4
+ export const validatorHASignerConfigMappings = {
5
+ haSigningEnabled: {
6
+ env: 'VALIDATOR_HA_SIGNING_ENABLED',
7
+ description: 'Whether HA signing / slashing protection is enabled',
8
+ ...booleanConfigHelper(false)
9
+ },
10
+ l1Contracts: {
11
+ description: 'L1 contract addresses (rollup address required)',
12
+ nested: {
13
+ rollupAddress: {
14
+ description: 'The Ethereum address of the rollup contract (must be set programmatically)',
15
+ parseEnv: (val)=>EthAddress.fromString(val)
16
+ }
17
+ }
18
+ },
19
+ nodeId: {
20
+ env: 'VALIDATOR_HA_NODE_ID',
21
+ description: 'The unique identifier for this node',
22
+ defaultValue: ''
23
+ },
24
+ pollingIntervalMs: {
25
+ env: 'VALIDATOR_HA_POLLING_INTERVAL_MS',
26
+ description: 'The number of ms to wait between polls when a duty is being signed',
27
+ ...numberConfigHelper(100)
28
+ },
29
+ signingTimeoutMs: {
30
+ env: 'VALIDATOR_HA_SIGNING_TIMEOUT_MS',
31
+ description: 'The maximum time to wait for a duty being signed to complete',
32
+ ...numberConfigHelper(3_000)
33
+ },
34
+ maxStuckDutiesAgeMs: {
35
+ env: 'VALIDATOR_HA_MAX_STUCK_DUTIES_AGE_MS',
36
+ description: 'The maximum age of a stuck duty in ms (defaults to 2x Aztec slot duration)',
37
+ ...optionalNumberConfigHelper()
38
+ },
39
+ cleanupOldDutiesAfterHours: {
40
+ env: 'VALIDATOR_HA_OLD_DUTIES_MAX_AGE_H',
41
+ description: 'Optional: clean up old duties after this many hours (disabled if not set)',
42
+ ...optionalNumberConfigHelper()
43
+ },
44
+ databaseUrl: {
45
+ env: 'VALIDATOR_HA_DATABASE_URL',
46
+ description: 'PostgreSQL connection string for validator HA signer (format: postgresql://user:password@host:port/database)'
47
+ },
48
+ poolMaxCount: {
49
+ env: 'VALIDATOR_HA_POOL_MAX',
50
+ description: 'Maximum number of clients in the pool',
51
+ ...numberConfigHelper(10)
52
+ },
53
+ poolMinCount: {
54
+ env: 'VALIDATOR_HA_POOL_MIN',
55
+ description: 'Minimum number of clients in the pool',
56
+ ...numberConfigHelper(0)
57
+ },
58
+ poolIdleTimeoutMs: {
59
+ env: 'VALIDATOR_HA_POOL_IDLE_TIMEOUT_MS',
60
+ description: 'Idle timeout in milliseconds',
61
+ ...numberConfigHelper(10_000)
62
+ },
63
+ poolConnectionTimeoutMs: {
64
+ env: 'VALIDATOR_HA_POOL_CONNECTION_TIMEOUT_MS',
65
+ description: 'Connection timeout in milliseconds (0 means no timeout)',
66
+ ...numberConfigHelper(0)
67
+ }
68
+ };
69
+ export const defaultValidatorHASignerConfig = getDefaultConfig(validatorHASignerConfigMappings);
70
+ /**
71
+ * Returns the validator HA signer configuration from environment variables.
72
+ * Note: If an environment variable is not set, the default value is used.
73
+ * @returns The validator HA signer configuration.
74
+ */ export function getConfigEnvVars() {
75
+ return getConfigFromMappings(validatorHASignerConfigMappings);
76
+ }
77
+ export const ValidatorHASignerConfigSchema = z.object({
78
+ haSigningEnabled: z.boolean(),
79
+ l1Contracts: z.object({
80
+ rollupAddress: z.instanceof(EthAddress)
81
+ }),
82
+ nodeId: z.string(),
83
+ pollingIntervalMs: z.number().min(0),
84
+ signingTimeoutMs: z.number().min(0),
85
+ maxStuckDutiesAgeMs: z.number().min(0).optional(),
86
+ cleanupOldDutiesAfterHours: z.number().min(0).optional(),
87
+ databaseUrl: z.string().optional(),
88
+ poolMaxCount: z.number().min(0).optional(),
89
+ poolMinCount: z.number().min(0).optional(),
90
+ poolIdleTimeoutMs: z.number().min(0).optional(),
91
+ poolConnectionTimeoutMs: z.number().min(0).optional()
92
+ });
@@ -0,0 +1,20 @@
1
+ /**
2
+ * In-memory implementation of SlashingProtectionDatabase for testing.
3
+ * Used to simulate shared slashing protection in HA test setups without requiring PostgreSQL.
4
+ */
5
+ import type { SlotNumber } from '@aztec/foundation/branded-types';
6
+ import type { EthAddress } from '@aztec/foundation/eth-address';
7
+ import type { SlashingProtectionDatabase, TryInsertOrGetResult } from '../types.js';
8
+ import type { CheckAndRecordParams, DutyType } from './types.js';
9
+ /** In-memory slashing protection database for testing HA setups. */
10
+ export declare class InMemorySlashingProtectionDatabase implements SlashingProtectionDatabase {
11
+ private duties;
12
+ tryInsertOrGetExisting(params: CheckAndRecordParams): Promise<TryInsertOrGetResult>;
13
+ updateDutySigned(rollupAddress: EthAddress, validatorAddress: EthAddress, slot: SlotNumber, dutyType: DutyType, signature: string, lockToken: string, blockIndexWithinCheckpoint: number): Promise<boolean>;
14
+ deleteDuty(rollupAddress: EthAddress, validatorAddress: EthAddress, slot: SlotNumber, dutyType: DutyType, lockToken: string, blockIndexWithinCheckpoint: number): Promise<boolean>;
15
+ cleanupOwnStuckDuties(_nodeId: string, _maxAgeMs: number): Promise<number>;
16
+ cleanupOutdatedRollupDuties(_currentRollupAddress: EthAddress): Promise<number>;
17
+ cleanupOldDuties(_maxAgeMs: number): Promise<number>;
18
+ close(): Promise<void>;
19
+ }
20
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5fbWVtb3J5LmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZGIvaW5fbWVtb3J5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7R0FHRztBQUNILE9BQU8sS0FBSyxFQUFlLFVBQVUsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQy9FLE9BQU8sS0FBSyxFQUFFLFVBQVUsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBRWhFLE9BQU8sS0FBSyxFQUFFLDBCQUEwQixFQUFFLG9CQUFvQixFQUF1QixNQUFNLGFBQWEsQ0FBQztBQUN6RyxPQUFPLEtBQUssRUFBRSxvQkFBb0IsRUFBRSxRQUFRLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFjakUsb0VBQW9FO0FBQ3BFLHFCQUFhLGtDQUFtQyxZQUFXLDBCQUEwQjtJQUNuRixPQUFPLENBQUMsTUFBTSxDQUEwQztJQUV4RCxzQkFBc0IsQ0FBQyxNQUFNLEVBQUUsb0JBQW9CLEdBQUcsT0FBTyxDQUFDLG9CQUFvQixDQUFDLENBeUJsRjtJQUVELGdCQUFnQixDQUNkLGFBQWEsRUFBRSxVQUFVLEVBQ3pCLGdCQUFnQixFQUFFLFVBQVUsRUFDNUIsSUFBSSxFQUFFLFVBQVUsRUFDaEIsUUFBUSxFQUFFLFFBQVEsRUFDbEIsU0FBUyxFQUFFLE1BQU0sRUFDakIsU0FBUyxFQUFFLE1BQU0sRUFDakIsMEJBQTBCLEVBQUUsTUFBTSxHQUNqQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBVWxCO0lBRUQsVUFBVSxDQUNSLGFBQWEsRUFBRSxVQUFVLEVBQ3pCLGdCQUFnQixFQUFFLFVBQVUsRUFDNUIsSUFBSSxFQUFFLFVBQVUsRUFDaEIsUUFBUSxFQUFFLFFBQVEsRUFDbEIsU0FBUyxFQUFFLE1BQU0sRUFDakIsMEJBQTBCLEVBQUUsTUFBTSxHQUNqQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBUWxCO0lBRUQscUJBQXFCLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FFekU7SUFFRCwyQkFBMkIsQ0FBQyxxQkFBcUIsRUFBRSxVQUFVLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUU5RTtJQUVELGdCQUFnQixDQUFDLFNBQVMsRUFBRSxNQUFNLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUVuRDtJQUVELEtBQUssSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLENBR3JCO0NBQ0YifQ==
@@ -0,0 +1 @@
1
+ {"version":3,"file":"in_memory.d.ts","sourceRoot":"","sources":["../../src/db/in_memory.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAe,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAC/E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAEhE,OAAO,KAAK,EAAE,0BAA0B,EAAE,oBAAoB,EAAuB,MAAM,aAAa,CAAC;AACzG,OAAO,KAAK,EAAE,oBAAoB,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAcjE,oEAAoE;AACpE,qBAAa,kCAAmC,YAAW,0BAA0B;IACnF,OAAO,CAAC,MAAM,CAA0C;IAExD,sBAAsB,CAAC,MAAM,EAAE,oBAAoB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAyBlF;IAED,gBAAgB,CACd,aAAa,EAAE,UAAU,EACzB,gBAAgB,EAAE,UAAU,EAC5B,IAAI,EAAE,UAAU,EAChB,QAAQ,EAAE,QAAQ,EAClB,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,0BAA0B,EAAE,MAAM,GACjC,OAAO,CAAC,OAAO,CAAC,CAUlB;IAED,UAAU,CACR,aAAa,EAAE,UAAU,EACzB,gBAAgB,EAAE,UAAU,EAC5B,IAAI,EAAE,UAAU,EAChB,QAAQ,EAAE,QAAQ,EAClB,SAAS,EAAE,MAAM,EACjB,0BAA0B,EAAE,MAAM,GACjC,OAAO,CAAC,OAAO,CAAC,CAQlB;IAED,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAEzE;IAED,2BAA2B,CAAC,qBAAqB,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAE9E;IAED,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAEnD;IAED,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAGrB;CACF"}
@@ -0,0 +1,73 @@
1
+ /**
2
+ * In-memory implementation of SlashingProtectionDatabase for testing.
3
+ * Used to simulate shared slashing protection in HA test setups without requiring PostgreSQL.
4
+ */ import { DutyStatus, getBlockIndexFromDutyIdentifier } from './types.js';
5
+ /** Creates a unique key for a duty based on its identifying fields. */ function dutyKey(rollupAddress, validatorAddress, slot, dutyType, blockIndexWithinCheckpoint) {
6
+ return `${rollupAddress}:${validatorAddress}:${slot}:${dutyType}:${blockIndexWithinCheckpoint}`;
7
+ }
8
+ /** In-memory slashing protection database for testing HA setups. */ export class InMemorySlashingProtectionDatabase {
9
+ duties = new Map();
10
+ tryInsertOrGetExisting(params) {
11
+ const blockIndex = getBlockIndexFromDutyIdentifier(params);
12
+ const key = dutyKey(params.rollupAddress, params.validatorAddress, params.slot, params.dutyType, blockIndex);
13
+ const existing = this.duties.get(key);
14
+ if (existing) {
15
+ return Promise.resolve({
16
+ isNew: false,
17
+ record: existing
18
+ });
19
+ }
20
+ const lockToken = `lock-${Date.now()}-${Math.random().toString(36).slice(2)}`;
21
+ const record = {
22
+ rollupAddress: params.rollupAddress,
23
+ validatorAddress: params.validatorAddress,
24
+ slot: params.slot,
25
+ blockNumber: params.blockNumber,
26
+ blockIndexWithinCheckpoint: blockIndex,
27
+ dutyType: params.dutyType,
28
+ status: DutyStatus.SIGNING,
29
+ messageHash: params.messageHash,
30
+ nodeId: params.nodeId,
31
+ lockToken,
32
+ startedAt: new Date()
33
+ };
34
+ this.duties.set(key, record);
35
+ return Promise.resolve({
36
+ isNew: true,
37
+ record
38
+ });
39
+ }
40
+ updateDutySigned(rollupAddress, validatorAddress, slot, dutyType, signature, lockToken, blockIndexWithinCheckpoint) {
41
+ const key = dutyKey(rollupAddress, validatorAddress, slot, dutyType, blockIndexWithinCheckpoint);
42
+ const record = this.duties.get(key);
43
+ if (!record || record.lockToken !== lockToken) {
44
+ return Promise.resolve(false);
45
+ }
46
+ record.status = DutyStatus.SIGNED;
47
+ record.signature = signature;
48
+ record.completedAt = new Date();
49
+ return Promise.resolve(true);
50
+ }
51
+ deleteDuty(rollupAddress, validatorAddress, slot, dutyType, lockToken, blockIndexWithinCheckpoint) {
52
+ const key = dutyKey(rollupAddress, validatorAddress, slot, dutyType, blockIndexWithinCheckpoint);
53
+ const record = this.duties.get(key);
54
+ if (!record || record.lockToken !== lockToken) {
55
+ return Promise.resolve(false);
56
+ }
57
+ this.duties.delete(key);
58
+ return Promise.resolve(true);
59
+ }
60
+ cleanupOwnStuckDuties(_nodeId, _maxAgeMs) {
61
+ return Promise.resolve(0);
62
+ }
63
+ cleanupOutdatedRollupDuties(_currentRollupAddress) {
64
+ return Promise.resolve(0);
65
+ }
66
+ cleanupOldDuties(_maxAgeMs) {
67
+ return Promise.resolve(0);
68
+ }
69
+ close() {
70
+ this.duties.clear();
71
+ return Promise.resolve();
72
+ }
73
+ }
@@ -1,5 +1,4 @@
1
1
  export * from './types.js';
2
2
  export * from './schema.js';
3
3
  export * from './postgres.js';
4
- export * from './lmdb.js';
5
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLFlBQVksQ0FBQztBQUMzQixjQUFjLGFBQWEsQ0FBQztBQUM1QixjQUFjLGVBQWUsQ0FBQztBQUM5QixjQUFjLFdBQVcsQ0FBQyJ9
4
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLFlBQVksQ0FBQztBQUMzQixjQUFjLGFBQWEsQ0FBQztBQUM1QixjQUFjLGVBQWUsQ0FBQyJ9
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/db/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,WAAW,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/db/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC"}
package/dest/db/index.js CHANGED
@@ -1,4 +1,3 @@
1
1
  export * from './types.js';
2
2
  export * from './schema.js';
3
3
  export * from './postgres.js';
4
- export * from './lmdb.js';
@@ -54,9 +54,7 @@ export declare class PostgresSlashingProtectionDatabase implements SlashingProte
54
54
  */
55
55
  deleteDuty(rollupAddress: EthAddress, validatorAddress: EthAddress, slot: SlotNumber, dutyType: DutyType, lockToken: string, blockIndexWithinCheckpoint: number): Promise<boolean>;
56
56
  /**
57
- * Convert a database row to a ValidatorDutyRecord.
58
- * Maps snake_case column names to StoredDutyRecord (camelCase, ms timestamps),
59
- * then delegates to the shared recordFromFields() converter.
57
+ * Convert a database row to a ValidatorDutyRecord
60
58
  */
61
59
  private rowToRecord;
62
60
  /**
@@ -83,4 +81,4 @@ export declare class PostgresSlashingProtectionDatabase implements SlashingProte
83
81
  */
84
82
  cleanupOldDuties(maxAgeMs: number): Promise<number>;
85
83
  }
86
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9zdGdyZXMuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYi9wb3N0Z3Jlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUNILE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUU3RCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFJM0QsT0FBTyxLQUFLLEVBQUUsV0FBVyxFQUFFLGNBQWMsRUFBRSxNQUFNLElBQUksQ0FBQztBQUV0RCxPQUFPLEtBQUssRUFBRSwwQkFBMEIsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQVVwRixPQUFPLEtBQUssRUFBRSxvQkFBb0IsRUFBVyxRQUFRLEVBQXVDLE1BQU0sWUFBWSxDQUFDO0FBRy9HOzs7R0FHRztBQUNILE1BQU0sV0FBVyxhQUFhO0lBQzVCLEtBQUssQ0FBQyxDQUFDLFNBQVMsY0FBYyxHQUFHLEdBQUcsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM3RixHQUFHLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0NBQ3RCO0FBRUQ7O0dBRUc7QUFDSCxxQkFBYSxrQ0FBbUMsWUFBVywwQkFBMEI7SUFHdkUsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJO0lBRmpDLE9BQU8sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFTO0lBRTdCLFlBQTZCLElBQUksRUFBRSxhQUFhLEVBRS9DO0lBRUQ7Ozs7O09BS0c7SUFDRyxVQUFVLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxDQWdDaEM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNHLHNCQUFzQixDQUFDLE1BQU0sRUFBRSxvQkFBb0IsR0FBRyxPQUFPLENBQUMsb0JBQW9CLENBQUMsQ0FvRHhGO0lBRUQ7Ozs7O09BS0c7SUFDRyxnQkFBZ0IsQ0FDcEIsYUFBYSxFQUFFLFVBQVUsRUFDekIsZ0JBQWdCLEVBQUUsVUFBVSxFQUM1QixJQUFJLEVBQUUsVUFBVSxFQUNoQixRQUFRLEVBQUUsUUFBUSxFQUNsQixTQUFTLEVBQUUsTUFBTSxFQUNqQixTQUFTLEVBQUUsTUFBTSxFQUNqQiwwQkFBMEIsRUFBRSxNQUFNLEdBQ2pDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FzQmxCO0lBRUQ7Ozs7OztPQU1HO0lBQ0csVUFBVSxDQUNkLGFBQWEsRUFBRSxVQUFVLEVBQ3pCLGdCQUFnQixFQUFFLFVBQVUsRUFDNUIsSUFBSSxFQUFFLFVBQVUsRUFDaEIsUUFBUSxFQUFFLFFBQVEsRUFDbEIsU0FBUyxFQUFFLE1BQU0sRUFDakIsMEJBQTBCLEVBQUUsTUFBTSxHQUNqQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBcUJsQjtJQUVEOzs7O09BSUc7SUFDSCxPQUFPLENBQUMsV0FBVztJQW1CbkI7O09BRUc7SUFDRyxLQUFLLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxDQUczQjtJQUVEOzs7T0FHRztJQUNHLHFCQUFxQixDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLE1BQU0sR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLENBRzdFO0lBRUQ7Ozs7O09BS0c7SUFDRywyQkFBMkIsQ0FBQyxvQkFBb0IsRUFBRSxVQUFVLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUduRjtJQUVEOzs7OztPQUtHO0lBQ0csZ0JBQWdCLENBQUMsUUFBUSxFQUFFLE1BQU0sR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLENBR3hEO0NBQ0YifQ==
84
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9zdGdyZXMuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYi9wb3N0Z3Jlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUNILE9BQU8sRUFBZSxVQUFVLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUUxRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFJM0QsT0FBTyxLQUFLLEVBQUUsV0FBVyxFQUFFLGNBQWMsRUFBRSxNQUFNLElBQUksQ0FBQztBQUV0RCxPQUFPLEtBQUssRUFBRSwwQkFBMEIsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQVVwRixPQUFPLEtBQUssRUFBRSxvQkFBb0IsRUFBVyxRQUFRLEVBQXVDLE1BQU0sWUFBWSxDQUFDO0FBRy9HOzs7R0FHRztBQUNILE1BQU0sV0FBVyxhQUFhO0lBQzVCLEtBQUssQ0FBQyxDQUFDLFNBQVMsY0FBYyxHQUFHLEdBQUcsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM3RixHQUFHLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0NBQ3RCO0FBRUQ7O0dBRUc7QUFDSCxxQkFBYSxrQ0FBbUMsWUFBVywwQkFBMEI7SUFHdkUsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJO0lBRmpDLE9BQU8sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFTO0lBRTdCLFlBQTZCLElBQUksRUFBRSxhQUFhLEVBRS9DO0lBRUQ7Ozs7O09BS0c7SUFDRyxVQUFVLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxDQWdDaEM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNHLHNCQUFzQixDQUFDLE1BQU0sRUFBRSxvQkFBb0IsR0FBRyxPQUFPLENBQUMsb0JBQW9CLENBQUMsQ0FvRHhGO0lBRUQ7Ozs7O09BS0c7SUFDRyxnQkFBZ0IsQ0FDcEIsYUFBYSxFQUFFLFVBQVUsRUFDekIsZ0JBQWdCLEVBQUUsVUFBVSxFQUM1QixJQUFJLEVBQUUsVUFBVSxFQUNoQixRQUFRLEVBQUUsUUFBUSxFQUNsQixTQUFTLEVBQUUsTUFBTSxFQUNqQixTQUFTLEVBQUUsTUFBTSxFQUNqQiwwQkFBMEIsRUFBRSxNQUFNLEdBQ2pDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FzQmxCO0lBRUQ7Ozs7OztPQU1HO0lBQ0csVUFBVSxDQUNkLGFBQWEsRUFBRSxVQUFVLEVBQ3pCLGdCQUFnQixFQUFFLFVBQVUsRUFDNUIsSUFBSSxFQUFFLFVBQVUsRUFDaEIsUUFBUSxFQUFFLFFBQVEsRUFDbEIsU0FBUyxFQUFFLE1BQU0sRUFDakIsMEJBQTBCLEVBQUUsTUFBTSxHQUNqQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBcUJsQjtJQUVEOztPQUVHO0lBQ0gsT0FBTyxDQUFDLFdBQVc7SUFtQm5COztPQUVHO0lBQ0csS0FBSyxJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FHM0I7SUFFRDs7O09BR0c7SUFDRyxxQkFBcUIsQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxNQUFNLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUc3RTtJQUVEOzs7OztPQUtHO0lBQ0csMkJBQTJCLENBQUMsb0JBQW9CLEVBQUUsVUFBVSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FHbkY7SUFFRDs7Ozs7T0FLRztJQUNHLGdCQUFnQixDQUFDLFFBQVEsRUFBRSxNQUFNLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUd4RDtDQUNGIn0=
@@ -1 +1 @@
1
- {"version":3,"file":"postgres.d.ts","sourceRoot":"","sources":["../../src/db/postgres.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAE7D,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAI3D,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,IAAI,CAAC;AAEtD,OAAO,KAAK,EAAE,0BAA0B,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAUpF,OAAO,KAAK,EAAE,oBAAoB,EAAW,QAAQ,EAAuC,MAAM,YAAY,CAAC;AAG/G;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,CAAC,SAAS,cAAc,GAAG,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7F,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACtB;AAED;;GAEG;AACH,qBAAa,kCAAmC,YAAW,0BAA0B;IAGvE,OAAO,CAAC,QAAQ,CAAC,IAAI;IAFjC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;IAE7B,YAA6B,IAAI,EAAE,aAAa,EAE/C;IAED;;;;;OAKG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAgChC;IAED;;;;;;;;OAQG;IACG,sBAAsB,CAAC,MAAM,EAAE,oBAAoB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAoDxF;IAED;;;;;OAKG;IACG,gBAAgB,CACpB,aAAa,EAAE,UAAU,EACzB,gBAAgB,EAAE,UAAU,EAC5B,IAAI,EAAE,UAAU,EAChB,QAAQ,EAAE,QAAQ,EAClB,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,0BAA0B,EAAE,MAAM,GACjC,OAAO,CAAC,OAAO,CAAC,CAsBlB;IAED;;;;;;OAMG;IACG,UAAU,CACd,aAAa,EAAE,UAAU,EACzB,gBAAgB,EAAE,UAAU,EAC5B,IAAI,EAAE,UAAU,EAChB,QAAQ,EAAE,QAAQ,EAClB,SAAS,EAAE,MAAM,EACjB,0BAA0B,EAAE,MAAM,GACjC,OAAO,CAAC,OAAO,CAAC,CAqBlB;IAED;;;;OAIG;IACH,OAAO,CAAC,WAAW;IAmBnB;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAG3B;IAED;;;OAGG;IACG,qBAAqB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAG7E;IAED;;;;;OAKG;IACG,2BAA2B,CAAC,oBAAoB,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAGnF;IAED;;;;;OAKG;IACG,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAGxD;CACF"}
1
+ {"version":3,"file":"postgres.d.ts","sourceRoot":"","sources":["../../src/db/postgres.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAe,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAE1E,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAI3D,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,IAAI,CAAC;AAEtD,OAAO,KAAK,EAAE,0BAA0B,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAUpF,OAAO,KAAK,EAAE,oBAAoB,EAAW,QAAQ,EAAuC,MAAM,YAAY,CAAC;AAG/G;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,CAAC,SAAS,cAAc,GAAG,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7F,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACtB;AAED;;GAEG;AACH,qBAAa,kCAAmC,YAAW,0BAA0B;IAGvE,OAAO,CAAC,QAAQ,CAAC,IAAI;IAFjC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;IAE7B,YAA6B,IAAI,EAAE,aAAa,EAE/C;IAED;;;;;OAKG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAgChC;IAED;;;;;;;;OAQG;IACG,sBAAsB,CAAC,MAAM,EAAE,oBAAoB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAoDxF;IAED;;;;;OAKG;IACG,gBAAgB,CACpB,aAAa,EAAE,UAAU,EACzB,gBAAgB,EAAE,UAAU,EAC5B,IAAI,EAAE,UAAU,EAChB,QAAQ,EAAE,QAAQ,EAClB,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,0BAA0B,EAAE,MAAM,GACjC,OAAO,CAAC,OAAO,CAAC,CAsBlB;IAED;;;;;;OAMG;IACG,UAAU,CACd,aAAa,EAAE,UAAU,EACzB,gBAAgB,EAAE,UAAU,EAC5B,IAAI,EAAE,UAAU,EAChB,QAAQ,EAAE,QAAQ,EAClB,SAAS,EAAE,MAAM,EACjB,0BAA0B,EAAE,MAAM,GACjC,OAAO,CAAC,OAAO,CAAC,CAqBlB;IAED;;OAEG;IACH,OAAO,CAAC,WAAW;IAmBnB;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAG3B;IAED;;;OAGG;IACG,qBAAqB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAG7E;IAED;;;;;OAKG;IACG,2BAA2B,CAAC,oBAAoB,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAGnF;IAED;;;;;OAKG;IACG,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAGxD;CACF"}
@@ -1,10 +1,12 @@
1
1
  /**
2
2
  * PostgreSQL implementation of SlashingProtectionDatabase
3
- */ import { randomBytes } from '@aztec/foundation/crypto/random';
3
+ */ import { BlockNumber, SlotNumber } from '@aztec/foundation/branded-types';
4
+ import { randomBytes } from '@aztec/foundation/crypto/random';
5
+ import { EthAddress } from '@aztec/foundation/eth-address';
4
6
  import { createLogger } from '@aztec/foundation/log';
5
7
  import { makeBackoff, retry } from '@aztec/foundation/retry';
6
8
  import { CLEANUP_OLD_DUTIES, CLEANUP_OUTDATED_ROLLUP_DUTIES, CLEANUP_OWN_STUCK_DUTIES, DELETE_DUTY, INSERT_OR_GET_DUTY, SCHEMA_VERSION, UPDATE_DUTY_SIGNED } from './schema.js';
7
- import { getBlockIndexFromDutyIdentifier, recordFromFields } from './types.js';
9
+ import { getBlockIndexFromDutyIdentifier } from './types.js';
8
10
  /**
9
11
  * PostgreSQL implementation of the slashing protection database
10
12
  */ export class PostgresSlashingProtectionDatabase {
@@ -146,15 +148,13 @@ import { getBlockIndexFromDutyIdentifier, recordFromFields } from './types.js';
146
148
  return true;
147
149
  }
148
150
  /**
149
- * Convert a database row to a ValidatorDutyRecord.
150
- * Maps snake_case column names to StoredDutyRecord (camelCase, ms timestamps),
151
- * then delegates to the shared recordFromFields() converter.
151
+ * Convert a database row to a ValidatorDutyRecord
152
152
  */ rowToRecord(row) {
153
- return recordFromFields({
154
- rollupAddress: row.rollup_address,
155
- validatorAddress: row.validator_address,
156
- slot: row.slot,
157
- blockNumber: row.block_number,
153
+ return {
154
+ rollupAddress: EthAddress.fromString(row.rollup_address),
155
+ validatorAddress: EthAddress.fromString(row.validator_address),
156
+ slot: SlotNumber.fromString(row.slot),
157
+ blockNumber: BlockNumber.fromString(row.block_number),
158
158
  blockIndexWithinCheckpoint: row.block_index_within_checkpoint,
159
159
  dutyType: row.duty_type,
160
160
  status: row.status,
@@ -162,10 +162,10 @@ import { getBlockIndexFromDutyIdentifier, recordFromFields } from './types.js';
162
162
  signature: row.signature ?? undefined,
163
163
  nodeId: row.node_id,
164
164
  lockToken: row.lock_token,
165
- startedAtMs: row.started_at.getTime(),
166
- completedAtMs: row.completed_at?.getTime(),
165
+ startedAt: row.started_at,
166
+ completedAt: row.completed_at ?? undefined,
167
167
  errorMessage: row.error_message ?? undefined
168
- });
168
+ };
169
169
  }
170
170
  /**
171
171
  * Close the database connection pool
@@ -1,7 +1,6 @@
1
- import { BlockNumber, type CheckpointNumber, type IndexWithinCheckpoint, SlotNumber } from '@aztec/foundation/branded-types';
2
- import { EthAddress } from '@aztec/foundation/eth-address';
1
+ import type { BlockNumber, CheckpointNumber, IndexWithinCheckpoint, SlotNumber } from '@aztec/foundation/branded-types';
2
+ import type { EthAddress } from '@aztec/foundation/eth-address';
3
3
  import type { Signature } from '@aztec/foundation/eth-signature';
4
- import { DutyType } from '@aztec/stdlib/ha-signing';
5
4
  /**
6
5
  * Row type from PostgreSQL query
7
6
  */
@@ -21,35 +20,25 @@ export interface DutyRow {
21
20
  completed_at: Date | null;
22
21
  error_message: string | null;
23
22
  }
24
- /**
25
- * Plain-primitive representation of a duty record suitable for serialization
26
- * (e.g. msgpackr for LMDB). All domain types are stored as their string/number
27
- * equivalents. Timestamps are Unix milliseconds.
28
- */
29
- export interface StoredDutyRecord {
30
- rollupAddress: string;
31
- validatorAddress: string;
32
- slot: string;
33
- blockNumber: string;
34
- blockIndexWithinCheckpoint: number;
35
- dutyType: DutyType;
36
- status: DutyStatus;
37
- messageHash: string;
38
- signature?: string;
39
- nodeId: string;
40
- lockToken: string;
41
- /** Unix timestamp in milliseconds when signing started */
42
- startedAtMs: number;
43
- /** Unix timestamp in milliseconds when signing completed */
44
- completedAtMs?: number;
45
- errorMessage?: string;
46
- }
47
23
  /**
48
24
  * Row type from INSERT_OR_GET_DUTY query (includes is_new flag)
49
25
  */
50
26
  export interface InsertOrGetRow extends DutyRow {
51
27
  is_new: boolean;
52
28
  }
29
+ /**
30
+ * Type of validator duty being performed
31
+ */
32
+ export declare enum DutyType {
33
+ BLOCK_PROPOSAL = "BLOCK_PROPOSAL",
34
+ CHECKPOINT_PROPOSAL = "CHECKPOINT_PROPOSAL",
35
+ ATTESTATION = "ATTESTATION",
36
+ ATTESTATIONS_AND_SIGNERS = "ATTESTATIONS_AND_SIGNERS",
37
+ GOVERNANCE_VOTE = "GOVERNANCE_VOTE",
38
+ SLASHING_VOTE = "SLASHING_VOTE",
39
+ AUTH_REQUEST = "AUTH_REQUEST",
40
+ TXS = "TXS"
41
+ }
53
42
  /**
54
43
  * Status of a duty in the database
55
44
  */
@@ -57,10 +46,8 @@ export declare enum DutyStatus {
57
46
  SIGNING = "signing",
58
47
  SIGNED = "signed"
59
48
  }
60
- export { DutyType };
61
49
  /**
62
- * Rich representation of a validator duty, with branded types and Date objects.
63
- * This is the common output type returned by all SlashingProtectionDatabase implementations.
50
+ * Record of a validator duty in the database
64
51
  */
65
52
  export interface ValidatorDutyRecord {
66
53
  /** Ethereum address of the rollup contract */
@@ -92,13 +79,6 @@ export interface ValidatorDutyRecord {
92
79
  /** Error message (currently unused) */
93
80
  errorMessage?: string;
94
81
  }
95
- /**
96
- * Convert a {@link StoredDutyRecord} (plain-primitive wire format) to a
97
- * {@link ValidatorDutyRecord} (rich domain type).
98
- *
99
- * Shared by LMDB and any future non-Postgres backend implementations.
100
- */
101
- export declare function recordFromFields(stored: StoredDutyRecord): ValidatorDutyRecord;
102
82
  /**
103
83
  * Duty identifier for block proposals.
104
84
  * blockIndexWithinCheckpoint is REQUIRED and must be >= 0.
@@ -182,4 +162,5 @@ interface DeleteDutyExtra {
182
162
  * Uses intersection with DutyIdentifier to preserve the discriminated union.
183
163
  */
184
164
  export type DeleteDutyParams = DutyIdentifier & DeleteDutyExtra;
185
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYi90eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsV0FBVyxFQUNYLEtBQUssZ0JBQWdCLEVBQ3JCLEtBQUsscUJBQXFCLEVBQzFCLFVBQVUsRUFDWCxNQUFNLGlDQUFpQyxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUMzRCxPQUFPLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNqRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFFcEQ7O0dBRUc7QUFDSCxNQUFNLFdBQVcsT0FBTztJQUN0QixjQUFjLEVBQUUsTUFBTSxDQUFDO0lBQ3ZCLGlCQUFpQixFQUFFLE1BQU0sQ0FBQztJQUMxQixJQUFJLEVBQUUsTUFBTSxDQUFDO0lBQ2IsWUFBWSxFQUFFLE1BQU0sQ0FBQztJQUNyQiw2QkFBNkIsRUFBRSxNQUFNLENBQUM7SUFDdEMsU0FBUyxFQUFFLFFBQVEsQ0FBQztJQUNwQixNQUFNLEVBQUUsVUFBVSxDQUFDO0lBQ25CLFlBQVksRUFBRSxNQUFNLENBQUM7SUFDckIsU0FBUyxFQUFFLE1BQU0sR0FBRyxJQUFJLENBQUM7SUFDekIsT0FBTyxFQUFFLE1BQU0sQ0FBQztJQUNoQixVQUFVLEVBQUUsTUFBTSxDQUFDO0lBQ25CLFVBQVUsRUFBRSxJQUFJLENBQUM7SUFDakIsWUFBWSxFQUFFLElBQUksR0FBRyxJQUFJLENBQUM7SUFDMUIsYUFBYSxFQUFFLE1BQU0sR0FBRyxJQUFJLENBQUM7Q0FDOUI7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxXQUFXLGdCQUFnQjtJQUMvQixhQUFhLEVBQUUsTUFBTSxDQUFDO0lBQ3RCLGdCQUFnQixFQUFFLE1BQU0sQ0FBQztJQUN6QixJQUFJLEVBQUUsTUFBTSxDQUFDO0lBQ2IsV0FBVyxFQUFFLE1BQU0s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
165
+ export {};
166
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYi90eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxXQUFXLEVBQUUsZ0JBQWdCLEVBQUUscUJBQXFCLEVBQUUsVUFBVSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDeEgsT0FBTyxLQUFLLEVBQUUsVUFBVSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDaEUsT0FBTyxLQUFLLEVBQUUsU0FBUyxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFFakU7O0dBRUc7QUFDSCxNQUFNLFdBQVcsT0FBTztJQUN0QixjQUFjLEVBQUUsTUFBTSxDQUFDO0lBQ3ZCLGlCQUFpQixFQUFFLE1BQU0sQ0FBQztJQUMxQixJQUFJLEVBQUUsTUFBTSxDQUFDO0lBQ2IsWUFBWSxFQUFFLE1BQU0sQ0FBQztJQUNyQiw2QkFBNkIsRUFBRSxNQUFNLENBQUM7SUFDdEMsU0FBUyxFQUFFLFFBQVEsQ0FBQztJQUNwQixNQUFNLEVBQUUsVUFBVSxDQUFDO0lBQ25CLFlBQVksRUFBRSxNQUFNLENBQUM7SUFDckIsU0FBUyxFQUFFLE1BQU0sR0FBRyxJQUFJLENBQUM7SUFDekIsT0FBTyxFQUFFLE1BQU0sQ0FBQztJQUNoQixVQUFVLEVBQUUsTUFBTSxDQUFDO0lBQ25CLFVBQVUsRUFBRSxJQUFJLENBQUM7SUFDakIsWUFBWSxFQUFFLElBQUksR0FBRyxJQUFJLENBQUM7SUFDMUIsYUFBYSxFQUFFLE1BQU0sR0FBRyxJQUFJLENBQUM7Q0FDOUI7QUFFRDs7R0FFRztBQUNILE1BQU0sV0FBVyxjQUFlLFNBQVEsT0FBTztJQUM3QyxNQUFNLEVBQUUsT0FBTyxDQUFDO0NBQ2pCO0FBRUQ7O0dBRUc7QUFDSCxvQkFBWSxRQUFRO0lBQ2xCLGNBQWMsbUJBQW1CO0lBQ2pDLG1CQUFtQix3QkFBd0I7SUFDM0MsV0FBVyxnQkFBZ0I7SUFDM0Isd0JBQXdCLDZCQUE2QjtJQUNy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
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/db/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/db/types.ts"],"names":[],"mappings":"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"}
package/dest/db/types.js CHANGED
@@ -1,6 +1,16 @@
1
- import { BlockNumber, SlotNumber } from '@aztec/foundation/branded-types';
2
- import { EthAddress } from '@aztec/foundation/eth-address';
3
- import { DutyType } from '@aztec/stdlib/ha-signing';
1
+ /**
2
+ * Type of validator duty being performed
3
+ */ export var DutyType = /*#__PURE__*/ function(DutyType) {
4
+ DutyType["BLOCK_PROPOSAL"] = "BLOCK_PROPOSAL";
5
+ DutyType["CHECKPOINT_PROPOSAL"] = "CHECKPOINT_PROPOSAL";
6
+ DutyType["ATTESTATION"] = "ATTESTATION";
7
+ DutyType["ATTESTATIONS_AND_SIGNERS"] = "ATTESTATIONS_AND_SIGNERS";
8
+ DutyType["GOVERNANCE_VOTE"] = "GOVERNANCE_VOTE";
9
+ DutyType["SLASHING_VOTE"] = "SLASHING_VOTE";
10
+ DutyType["AUTH_REQUEST"] = "AUTH_REQUEST";
11
+ DutyType["TXS"] = "TXS";
12
+ return DutyType;
13
+ }({});
4
14
  /**
5
15
  * Status of a duty in the database
6
16
  */ export var DutyStatus = /*#__PURE__*/ function(DutyStatus) {
@@ -8,31 +18,6 @@ import { DutyType } from '@aztec/stdlib/ha-signing';
8
18
  DutyStatus["SIGNED"] = "signed";
9
19
  return DutyStatus;
10
20
  }({});
11
- // Re-export DutyType from stdlib
12
- export { DutyType };
13
- /**
14
- * Convert a {@link StoredDutyRecord} (plain-primitive wire format) to a
15
- * {@link ValidatorDutyRecord} (rich domain type).
16
- *
17
- * Shared by LMDB and any future non-Postgres backend implementations.
18
- */ export function recordFromFields(stored) {
19
- return {
20
- rollupAddress: EthAddress.fromString(stored.rollupAddress),
21
- validatorAddress: EthAddress.fromString(stored.validatorAddress),
22
- slot: SlotNumber.fromString(stored.slot),
23
- blockNumber: BlockNumber.fromString(stored.blockNumber),
24
- blockIndexWithinCheckpoint: stored.blockIndexWithinCheckpoint,
25
- dutyType: stored.dutyType,
26
- status: stored.status,
27
- messageHash: stored.messageHash,
28
- signature: stored.signature,
29
- nodeId: stored.nodeId,
30
- lockToken: stored.lockToken,
31
- startedAt: new Date(stored.startedAtMs),
32
- completedAt: stored.completedAtMs !== undefined ? new Date(stored.completedAtMs) : undefined,
33
- errorMessage: stored.errorMessage
34
- };
35
- }
36
21
  /**
37
22
  * Validates and normalizes the block index for a duty.
38
23
  * - BLOCK_PROPOSAL: validates blockIndexWithinCheckpoint is provided and >= 0
@@ -40,7 +25,7 @@ export { DutyType };
40
25
  *
41
26
  * @throws Error if BLOCK_PROPOSAL is missing blockIndexWithinCheckpoint or has invalid value
42
27
  */ export function normalizeBlockIndex(dutyType, blockIndexWithinCheckpoint) {
43
- if (dutyType === DutyType.BLOCK_PROPOSAL) {
28
+ if (dutyType === "BLOCK_PROPOSAL") {
44
29
  if (blockIndexWithinCheckpoint === undefined) {
45
30
  throw new Error('BLOCK_PROPOSAL duties require blockIndexWithinCheckpoint to be specified');
46
31
  }
@@ -57,7 +42,7 @@ export { DutyType };
57
42
  * - BLOCK_PROPOSAL: returns the blockIndexWithinCheckpoint
58
43
  * - Other duty types: returns -1
59
44
  */ export function getBlockIndexFromDutyIdentifier(duty) {
60
- if (duty.dutyType === DutyType.BLOCK_PROPOSAL) {
45
+ if (duty.dutyType === "BLOCK_PROPOSAL") {
61
46
  return duty.blockIndexWithinCheckpoint;
62
47
  }
63
48
  return -1;