Skip to content

v2.23.0

Latest

Choose a tag to compare

@lars0x lars0x released this 24 Jul 08:29

Breaking Changes

  • Hyperliquid perp opens fail closed on non-1x leverage. CoreWriter has no
    set-leverage action, so a requested leverage was never applied on-venue —
    positions opened at the account's per-asset default (e.g. 20x cross),
    surfaced only as a warning. PERP_OPEN requesting non-1x leverage is now
    rejected at compile time unless the strategy explicitly opts in with the
    new Intent.perp_open(accept_venue_leverage=True) (default False); the
    venue-observed leverage is still recorded post-fill. Venues that do set
    leverage on-venue (GMX V2) ignore the flag. (#3354)

Features

  • Teardown exit-asset policy — declare
    TeardownProfile.preferred_asset_policy = TeardownAssetPolicy.KEEP_OUTPUTS
    to suppress the framework's post-close consolidation swap into USDC.
    Resolution order: explicit --asset-policy flag → strategy preference →
    framework default; honored by platform Stop, the dashboard close API, and
    strat test. The strat test --teardown ladder also gains a
    residual-position gate: measured open positions above dust after teardown
    now fail the step. (#3363)
  • Backtests serve pool_history, pool_analytics, and
    funding_rate_history
    — served from the run's own data lanes
    (completed-day pool bars, TVL/volume, ascending hourly funding),
    no-look-ahead, Empty ≠ Zero; deliberate refusals kept where serving would
    fabricate structure. (#3368, #3374)
  • Backtest data-provenance manifest + broker seam — every run collects a
    RunDataManifest with per-lane serve / refusal / degrade stamps, exposed on
    BacktestResult and serialized results; plus shared per-provider rate
    limiting, fail-closed lending chain scope, and a gateway hermeticity guard.
    (#3365)

Fixes

  • HyperCore perp positions are valued in portfolio snapshots — discovery now
    gates on the actual PerpsReadRegistry reader set, so a live position no
    longer collapses snapshots to $0 (VIB-5768 / VIB-5576). (#3356)
  • Perp dashboard truth defects (VIB-5942): wallet-NAV history chart, scoped
    reconciliation labels, snapshot-derived perp story via additive
    PerpPositionSummary proto, Empty ≠ Zero cost stack (#3358); wired into the
    GMX demo dashboards (#3369).
  • Mantle swaps were unsubmittable — the ~2000x-inflated gas-floor table is
    corrected to measured scale. (#3362)
  • Backtest gas fallbacks retuned to measured reality: Ethereum ~140x,
    Avalanche ~470x, BSC 60x overstatement, Polygon ~5x understatement; unset
    gas_fallback_gwei falls through to chain-aware defaults. (#3377, #3378, #3379)
  • Backtest serve gaps + log truthfulness: offline token-registry symbol
    resolution, honest LP fill logs, hollow-guard attribution, venue-specific
    perp margin floors, advisory borrow warning. (#3367)
  • MarketSnapshot.price honors quote in the seeded fast path — no more USD
    price under a non-USD quote label in backtests. (#3376)
  • MarketSnapshot.total_portfolio_usd counts cash once — per-symbol cash
    mirrors no longer multiply into the total; live path byte-identical. (#3381)
  • Exact-boundary get_price_at returns the candle at T (CoinGecko
    aligned-spacing rollout). (#3375)
  • Three incubating strategies read their config.json again — nested
    "parameters" blocks flattened to the convention get_config() reads. (#3355)

Dependencies

  • almanak-code v1.0.30 (#3364); pydantic-settings 2.14.2, pillow 12.3.0,
    pyasn1 0.6.4, gitpython 3.1.52, soupsieve 2.8.4.