export const NON_EVM_RELAY_LIFECYCLE = [ 'initiate', 'observe_destination', 'confirm_finalize', 'reject_replay', 'refund_recover' ] as const; export type NonEvmRelayLifecycleStep = (typeof NON_EVM_RELAY_LIFECYCLE)[number]; export type NonEvmExposureStatus = | 'planned' | 'operator_ready' | 'public_ready' | 'live' | 'gated_by_chain138_prerequisites'; export interface NonEvmNetworkPolicy { identifier: string; relayMode: 'custom_relay' | 'custom_relay_scaffold' | 'parallel_program'; destinationProgramModel: string; signerFundingPolicy: string; finalityPolicy: string; publicExposureStatus: Exclude; } export interface NonEvmRelayObservation { requestId: string; lifecycleStep: NonEvmRelayLifecycleStep; destinationReference?: string; fulfillmentId?: string; finalityValue?: number; replayRejected?: boolean; } export function deriveExposureStatus( policy: NonEvmNetworkPolicy, checks: { adapterPresent: boolean; relaySurfacePresent: boolean; chain138PrerequisitesReady: boolean; } ): NonEvmExposureStatus { if (!checks.adapterPresent || !checks.relaySurfacePresent) { return 'planned'; } if (!checks.chain138PrerequisitesReady) { return 'gated_by_chain138_prerequisites'; } return policy.publicExposureStatus; }