-
Notifications
You must be signed in to change notification settings - Fork 327
/
Copy pathphase_manager_factory.ts
59 lines (54 loc) · 2.12 KB
/
phase_manager_factory.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
import { PublicKernelType, type Tx } from '@aztec/circuit-types';
import { type PublicKernelCircuitPublicInputs } from '@aztec/circuits.js';
import { type AbstractPhaseManager, type PhaseConfig } from './abstract_phase_manager.js';
import { AppLogicPhaseManager } from './app_logic_phase_manager.js';
import { SetupPhaseManager } from './setup_phase_manager.js';
import { TailPhaseManager } from './tail_phase_manager.js';
import { TeardownPhaseManager } from './teardown_phase_manager.js';
export class PhaseDidNotChangeError extends Error {
constructor(phase: PublicKernelType) {
super(`Tried to advance the phase from [${phase}] when the circuit still needs [${phase}]`);
}
}
export class CannotTransitionToSetupError extends Error {
constructor() {
super('Cannot transition to setup phase');
}
}
export class PhaseManagerFactory {
public static phaseFromTx(tx: Tx, config: PhaseConfig): AbstractPhaseManager | undefined {
const data = tx.data.forPublic!;
if (data.needsSetup) {
return new SetupPhaseManager(config);
} else if (data.needsAppLogic) {
return new AppLogicPhaseManager(config);
} else if (data.needsTeardown) {
return new TeardownPhaseManager(config);
} else {
return undefined;
}
}
public static phaseFromOutput(
output: PublicKernelCircuitPublicInputs,
currentPhaseManager: AbstractPhaseManager,
config: PhaseConfig,
): AbstractPhaseManager | undefined {
if (output.needsSetup) {
throw new CannotTransitionToSetupError();
} else if (output.needsAppLogic) {
if (currentPhaseManager.phase === PublicKernelType.APP_LOGIC) {
throw new PhaseDidNotChangeError(currentPhaseManager.phase);
}
return new AppLogicPhaseManager(config);
} else if (output.needsTeardown) {
if (currentPhaseManager.phase === PublicKernelType.TEARDOWN) {
throw new PhaseDidNotChangeError(currentPhaseManager.phase);
}
return new TeardownPhaseManager(config);
} else if (currentPhaseManager.phase !== PublicKernelType.TAIL) {
return new TailPhaseManager(config);
} else {
return undefined;
}
}
}