46 lines
1.3 KiB
Python
46 lines
1.3 KiB
Python
"""Price feed adapter for BeVault."""
|
|
from __future__ import annotations
|
|
|
|
import hashlib
|
|
from dataclasses import dataclass
|
|
from typing import Optional
|
|
|
|
from ..bridge import canonical_payload, to_canonical_ir
|
|
from ..core import HedgeDelta, LocalArbProblem, SharedSignals
|
|
|
|
|
|
@dataclass
|
|
class PriceFeedAdapter:
|
|
name: str = "price-feed-v1"
|
|
version: str = "1.0"
|
|
|
|
def generate_signal(self, asset: str, price: float, latency_ms: float) -> SharedSignals:
|
|
return SharedSignals(asset=asset, price=price, latency_ms=latency_ms)
|
|
|
|
def build_delta(
|
|
self,
|
|
local: LocalArbProblem,
|
|
signals: SharedSignals,
|
|
hedge_size: Optional[float] = None,
|
|
) -> HedgeDelta:
|
|
hedge_size = signals.price if hedge_size is None else hedge_size
|
|
ir = to_canonical_ir(local, signals)
|
|
audit_ref = hashlib.sha256(canonical_payload(ir).encode("utf-8")).hexdigest()
|
|
return HedgeDelta(
|
|
asset=local.asset,
|
|
hedge_size=hedge_size,
|
|
timestamp=signals.timestamp,
|
|
policy_tag="price-feed",
|
|
audit_ref=audit_ref,
|
|
)
|
|
|
|
def conformance_contract(self) -> dict:
|
|
return {
|
|
"name": self.name,
|
|
"version": self.version,
|
|
"produces": ["SharedSignals", "HedgeDelta"],
|
|
}
|
|
|
|
|
|
__all__ = ["PriceFeedAdapter"]
|