import type { Address } from '@ton/core'; export interface BaseEvent { /** Symbolic discriminant (e.g. 'SnapshotPushed'). */ kind: string; /** 32-bit opcode prefix. */ opcode: number; } /** * Fires only when AutomatonSync causes a state change. `cause`: * 1 = CAUSE_FIRST_SYNC (automaton not previously mirrored) * 2 = CAUSE_ACTIVATION_CHANGE (isActive flipped) * Same-state syncs emit nothing — they only update the mirror entry. */ export interface OperatorMirroredEvent extends BaseEvent { kind: 'OperatorMirrored'; automaton: Address; isActive: boolean; cause: number; } /** * Fires on first GroupKeySync bootstrap AND on rotation. `oldEpoch == 0` * indicates a first-ever cache (Phoebe was previously empty). */ export interface GroupKeyCachedEvent extends BaseEvent { kind: 'GroupKeyCached'; groupId: number; oldEpoch: number; newEpoch: number; groupPk: Buffer; threshold: number; memberCount: number; } /** * Operator pushed a fresh BLS-attested snapshot. Indexers correlate on * `submitter` + `timestamp` to track per-operator liveness. */ export interface SnapshotPushedEvent extends BaseEvent { kind: 'SnapshotPushed'; submitter: Address; timestamp: number; root: bigint; /** Snapshot tree size — always MAX_FEED_COUNT (256). */ feedCount: number; } /** Consumer successfully pulled a price. */ export interface PricePulledEvent extends BaseEvent { kind: 'PricePulled'; consumer: Address; queryId: bigint; feedId: number; /** Snapshot timestamp the pull was served from. */ snapshotAt: number; } export interface PausedEvent extends BaseEvent { kind: 'Paused'; } export interface UnpausedEvent extends BaseEvent { kind: 'Unpaused'; } /** Full tunable surface post-update; indexers don't need to re-get. */ export interface ConfigUpdatedEvent extends BaseEvent { kind: 'ConfigUpdated'; pullFee: bigint; minStorageReserve: bigint; maxPushDrift: number; /** Operator share of pullFee in basis points (0..10000). */ operatorBps: number; /** Per-operator silence window (seconds) for the pull-side filter. 0 = disabled. */ maxInactivity: number; } export interface FeesWithdrawnEvent extends BaseEvent { kind: 'FeesWithdrawn'; to: Address; amount: bigint; } export interface CodeUpgradeProposedEvent extends BaseEvent { kind: 'CodeUpgradeProposed'; newCodeHash: bigint; eta: number; } export interface CodeUpgradeExecutedEvent extends BaseEvent { kind: 'CodeUpgradeExecuted'; oldCodeHash: bigint; newCodeHash: bigint; } export interface CodeUpgradeCancelledEvent extends BaseEvent { kind: 'CodeUpgradeCancelled'; newCodeHash: bigint; } /** * Operator claimed accrued pull-fee share. Pairs with EvtSnapshotPushed for * share-of-revenue analytics: an operator's lifetime revenue ≈ sum of * EvtRewardClaimed.amount where claimant == this operator. */ export interface RewardClaimedEvent extends BaseEvent { kind: 'RewardClaimed'; /** Operator that called ClaimReward. */ claimant: Address; /** Payout destination (may differ from claimant if routed to treasury). */ to: Address; /** Amount paid out in nanoTON. */ amount: bigint; } /** * Owner pruned a deactivated operator's entry via GcOperator. Indexers * use this to track operator-set churn alongside the * `OperatorMirroredEvent.cause = ACTIVATION_CHANGE` stream. */ export interface OperatorPrunedEvent extends BaseEvent { kind: 'OperatorPruned'; /** Operator address whose map entry was pruned. */ automaton: Address; } /** * Owner triggered an Atlas resync via SyncAtlas. Off-chain monitoring * correlates this against the next `GroupKeyCachedEvent` to detect * non-delivery of the response. Pre-fix, the request was fire-and-forget * with no on-chain trace beyond the outbound message itself. */ export interface SyncAtlasRequestedEvent extends BaseEvent { kind: 'SyncAtlasRequested'; /** Sender of the SyncAtlas op (always owner; included for indexer convenience). */ requester: Address; /** Group ID of the resync request. Single-group: always 0. */ groupId: number; } export type PhoebeEvent = OperatorMirroredEvent | GroupKeyCachedEvent | SnapshotPushedEvent | PricePulledEvent | PausedEvent | UnpausedEvent | ConfigUpdatedEvent | FeesWithdrawnEvent | CodeUpgradeProposedEvent | CodeUpgradeExecutedEvent | CodeUpgradeCancelledEvent | RewardClaimedEvent | OperatorPrunedEvent | SyncAtlasRequestedEvent; /** All event kinds — useful for telemetry / dashboards. */ export type EventKind = PhoebeEvent['kind'];