function requireString(value, field) { if (typeof value !== 'string' || value.length === 0) throw new Error(`Missing ${field}`); } function requireObject(value, field) { if (!value || typeof value !== 'object' || Array.isArray(value)) throw new Error(`Missing ${field}`); } function requireOneOf(value, field, values) { if (!values.includes(value)) throw new Error(`Unexpected ${field}: ${value}`); } function requireNumber(value, field) { if (typeof value !== 'number' || !Number.isFinite(value)) throw new Error(`Missing ${field}`); } export function assertEventEnvelope(event) { requireObject(event, 'event'); requireString(event.event_id, 'event.event_id'); requireString(event.event_type, 'event.event_type'); requireString(event.venue, 'event.venue'); if (event.source != null) requireString(event.source, 'event.source'); if (typeof event.schema_version !== 'number') throw new Error('Missing event.schema_version'); requireString(event.ingested_at, 'event.ingested_at'); requireObject(event.payload, 'event.payload'); return event; } export function assertNormalizedSwapDemand(event) { assertEventEnvelope(event); if (event.event_type !== 'swap_demand') throw new Error(`Unexpected event_type: ${event.event_type}`); const payload = event.payload; requireString(payload.quote_id, 'payload.quote_id'); requireString(payload.asset_in, 'payload.asset_in'); requireString(payload.asset_out, 'payload.asset_out'); requireString(payload.request_kind, 'payload.request_kind'); requireOneOf(payload.request_kind, 'payload.request_kind', ['exact_in', 'exact_out']); if (payload.amount_in != null) requireString(payload.amount_in, 'payload.amount_in'); if (payload.amount_out != null) requireString(payload.amount_out, 'payload.amount_out'); if (payload.min_deadline_ms != null) requireString(payload.min_deadline_ms, 'payload.min_deadline_ms'); return event; } export function assertMarketPriceEvent(event) { assertEventEnvelope(event); if (event.event_type !== 'market_price') throw new Error(`Unexpected event_type: ${event.event_type}`); const payload = event.payload; requireString(payload.price_id, 'payload.price_id'); requireString(payload.pair, 'payload.pair'); requireString(payload.eur_per_btc, 'payload.eur_per_btc'); requireString(payload.btc_per_eure, 'payload.btc_per_eure'); requireString(payload.source_used, 'payload.source_used'); return event; } export function assertInventorySnapshotEvent(event) { assertEventEnvelope(event); if (event.event_type !== 'intent_inventory') throw new Error(`Unexpected event_type: ${event.event_type}`); const payload = event.payload; requireString(payload.inventory_id, 'payload.inventory_id'); requireString(payload.account_id, 'payload.account_id'); requireString(payload.reconciliation_status, 'payload.reconciliation_status'); requireObject(payload.spendable, 'payload.spendable'); return event; } export function assertLiquidityActionEvent(event) { assertEventEnvelope(event); if (event.event_type !== 'liquidity_action') throw new Error(`Unexpected event_type: ${event.event_type}`); const payload = event.payload; requireString(payload.liquidity_action_id, 'payload.liquidity_action_id'); requireString(payload.action_type, 'payload.action_type'); requireString(payload.status, 'payload.status'); return event; } export function assertFundingObservationEvent(event) { assertEventEnvelope(event); if (event.event_type !== 'funding_observation') { throw new Error(`Unexpected event_type: ${event.event_type}`); } const payload = event.payload; requireString(payload.funding_observation_id, 'payload.funding_observation_id'); requireString(payload.account_id, 'payload.account_id'); requireString(payload.asset_id, 'payload.asset_id'); requireString(payload.chain, 'payload.chain'); requireString(payload.funding_handle, 'payload.funding_handle'); requireString(payload.source, 'payload.source'); requireString(payload.tx_hash, 'payload.tx_hash'); requireString(payload.status, 'payload.status'); requireString(payload.amount, 'payload.amount'); requireNumber(payload.confirmations, 'payload.confirmations'); requireString(payload.first_seen_at, 'payload.first_seen_at'); requireString(payload.last_seen_at, 'payload.last_seen_at'); if (payload.credited_at != null) requireString(payload.credited_at, 'payload.credited_at'); if (payload.bridge_deposit_tx_hash != null) { requireString(payload.bridge_deposit_tx_hash, 'payload.bridge_deposit_tx_hash'); } return event; } export function assertOpsAlertEvent(event) { assertEventEnvelope(event); if (event.event_type !== 'ops_alert') throw new Error(`Unexpected event_type: ${event.event_type}`); const payload = event.payload; requireString(payload.alert_event_id, 'payload.alert_event_id'); requireString(payload.alert_code, 'payload.alert_code'); requireString(payload.status, 'payload.status'); requireOneOf(payload.status, 'payload.status', ['raised', 'cleared']); requireString(payload.severity, 'payload.severity'); requireString(payload.reason, 'payload.reason'); requireString(payload.service_scope, 'payload.service_scope'); requireString(payload.raised_at, 'payload.raised_at'); if (payload.cleared_at != null) requireString(payload.cleared_at, 'payload.cleared_at'); requireObject(payload.details, 'payload.details'); return event; } export function assertEnvironmentStatusEvent(event) { assertEventEnvelope(event); if (event.event_type !== 'environment_status') { throw new Error(`Unexpected event_type: ${event.event_type}`); } const payload = event.payload; requireString(payload.environment_status_id, 'payload.environment_status_id'); requireString(payload.environment_key, 'payload.environment_key'); requireString(payload.source, 'payload.source'); requireString(payload.status, 'payload.status'); requireString(payload.label, 'payload.label'); requireString(payload.status_fingerprint, 'payload.status_fingerprint'); requireString(payload.observed_at, 'payload.observed_at'); requireString(payload.changed_at, 'payload.changed_at'); if (payload.previous_status_fingerprint != null) { requireString(payload.previous_status_fingerprint, 'payload.previous_status_fingerprint'); } if (payload.decisive_reason != null) requireString(payload.decisive_reason, 'payload.decisive_reason'); requireNumber(payload.current_incident_count, 'payload.current_incident_count'); if (!Array.isArray(payload.current_incidents)) throw new Error('Missing payload.current_incidents'); if (!Array.isArray(payload.affected_services)) throw new Error('Missing payload.affected_services'); return event; } export function assertTradeDecisionEvent(event) { assertEventEnvelope(event); if (event.event_type !== 'trade_decision') throw new Error(`Unexpected event_type: ${event.event_type}`); const payload = event.payload; requireString(payload.decision_id, 'payload.decision_id'); requireString(payload.quote_id, 'payload.quote_id'); requireString(payload.pair, 'payload.pair'); requireString(payload.direction, 'payload.direction'); requireString(payload.decision, 'payload.decision'); requireString(payload.decision_reason, 'payload.decision_reason'); return event; } export function assertExecuteTradeCommand(event) { assertEventEnvelope(event); if (event.event_type !== 'execute_trade') throw new Error(`Unexpected event_type: ${event.event_type}`); const payload = event.payload; requireString(payload.command_id, 'payload.command_id'); requireString(payload.idempotency_key, 'payload.idempotency_key'); requireString(payload.execution_key, 'payload.execution_key'); requireString(payload.quote_id, 'payload.quote_id'); requireString(payload.asset_in, 'payload.asset_in'); requireString(payload.asset_out, 'payload.asset_out'); if (payload.decision_id != null) requireString(payload.decision_id, 'payload.decision_id'); if (payload.request_kind != null) requireString(payload.request_kind, 'payload.request_kind'); if (payload.quote_output != null) requireObject(payload.quote_output, 'payload.quote_output'); if (payload.amount_in != null) requireString(payload.amount_in, 'payload.amount_in'); if (payload.amount_out != null) requireString(payload.amount_out, 'payload.amount_out'); return event; } export function assertTradeResult(event) { assertEventEnvelope(event); if (event.event_type !== 'trade_result') throw new Error(`Unexpected event_type: ${event.event_type}`); const payload = event.payload; requireString(payload.command_id, 'payload.command_id'); requireString(payload.idempotency_key, 'payload.idempotency_key'); requireString(payload.execution_key, 'payload.execution_key'); requireString(payload.quote_id, 'payload.quote_id'); requireString(payload.status, 'payload.status'); if (payload.decision_id != null) requireString(payload.decision_id, 'payload.decision_id'); if (payload.result_code != null) requireString(payload.result_code, 'payload.result_code'); return event; } export function assertIntentRequestPreflightEvent(event) { assertEventEnvelope(event); if (event.event_type !== 'intent_request_preflight') { throw new Error(`Unexpected event_type: ${event.event_type}`); } const payload = event.payload; requireString(payload.request_id, 'payload.request_id'); requireString(payload.idempotency_key, 'payload.idempotency_key'); requireString(payload.state, 'payload.state'); requireOneOf(payload.state, 'payload.state', ['draft', 'blocked']); requireString(payload.reason_code, 'payload.reason_code'); requireString(payload.source_asset_id, 'payload.source_asset_id'); requireString(payload.destination_asset_id, 'payload.destination_asset_id'); requireString(payload.source_amount_units, 'payload.source_amount_units'); requireString(payload.min_destination_amount_units, 'payload.min_destination_amount_units'); requireNumber(payload.slippage_bps, 'payload.slippage_bps'); requireString(payload.signer_account_id, 'payload.signer_account_id'); requireString(payload.verifier_contract, 'payload.verifier_contract'); requireString(payload.created_at, 'payload.created_at'); requireObject(payload.lifecycle, 'payload.lifecycle'); return event; } export function assertIntentRequestSubmissionResultEvent(event) { assertEventEnvelope(event); if (event.event_type !== 'intent_request_submission_result') { throw new Error(`Unexpected event_type: ${event.event_type}`); } const payload = event.payload; requireString(payload.request_id, 'payload.request_id'); requireString(payload.idempotency_key, 'payload.idempotency_key'); requireString(payload.submission_id, 'payload.submission_id'); requireString(payload.status, 'payload.status'); requireOneOf(payload.status, 'payload.status', [ 'submit_requested', 'accepted_by_relay', 'failed', 'blocked', ]); requireString(payload.result_code, 'payload.result_code'); requireString(payload.submitted_at, 'payload.submitted_at'); requireObject(payload.lifecycle, 'payload.lifecycle'); return event; } export function assertIntentRequestOutcomeEvent(event) { assertEventEnvelope(event); if (event.event_type !== 'intent_request_outcome') { throw new Error(`Unexpected event_type: ${event.event_type}`); } const payload = event.payload; requireString(payload.request_id, 'payload.request_id'); requireString(payload.idempotency_key, 'payload.idempotency_key'); requireString(payload.outcome_status, 'payload.outcome_status'); requireOneOf(payload.outcome_status, 'payload.outcome_status', [ 'draft', 'blocked', 'failed', 'awaiting_settlement', 'not_filled', 'completed', ]); requireString(payload.outcome_source, 'payload.outcome_source'); requireString(payload.outcome_reason, 'payload.outcome_reason'); requireString(payload.attribution_status, 'payload.attribution_status'); return event; }