unrip/src/core/schemas.mjs
philipp 601450c664
Some checks failed
deploy / deploy (push) Failing after 29s
Persist NEAR status changes only
Proof: npm test; npm run operator-dashboard:build; node --test test/near-intents-status.test.mjs test/environment-status-history.test.mjs test/operator-dashboard.test.mjs test/operator-dashboard-ui-static.test.mjs test/ops-sentinel-static.test.mjs; PYTHONPATH=. python3 test/repo_deployments_test.py; kubectl kustomize deploy/k8s/base.

Assumptions: NEAR Intents public status page API remains the official upstream environmental-status source; status fingerprint changes are the durable boundary for saving environmental history.

Still fake: This stores and displays official upstream status changes, but it does not create an alternate quote source or make NEAR quoting operational during an upstream pause.
2026-04-17 14:34:10 +02:00

267 lines
12 KiB
JavaScript

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;
}