Repository Public
1export const STATES = ['draft', 'pending_approval', 'approved', 'signed', 'broadcast', 'confirming', 'finalized',2 'rejected', 'expired', 'failed', 'replaced', 'reorged'] as const;3export type ProposalState = (typeof STATES)[number];45const NEXT: Record<ProposalState, ProposalState[]> = {6 draft: ['pending_approval', 'rejected', 'expired', 'failed'],7 pending_approval: ['approved', 'rejected', 'expired', 'failed'],8 approved: ['signed', 'failed', 'expired'],9 signed: ['broadcast', 'failed'],10 broadcast: ['confirming', 'finalized', 'failed', 'replaced'],11 confirming: ['finalized', 'failed', 'reorged', 'replaced'],12 reorged: ['confirming', 'finalized', 'failed'],13 finalized: [], rejected: [], expired: [], failed: [], replaced: [],14};1516export function canTransition(from: ProposalState, to: ProposalState): boolean {17 return NEXT[from].includes(to);18}19export function assertTransition(from: ProposalState, to: ProposalState): void {20 if (!canTransition(from, to)) throw new Error(`illegal state transition ${from} -> ${to}`);21}22export const isTerminal = (s: ProposalState) => NEXT[s].length === 0;23