Bulwark docs

Replays

What the guard did, and did not do, on three crash days and six ordinary bad days, on mark prices, with the settings changed and our server late. Method, data sources and limits.

We replay real price paths through the guard's own code: the margin model, the rule evaluation, the seven checks, the server's orders and the orders it leaves resting on Hyperliquid. Every result is below, including the ones where it did badly.

Correction, 5 October 2026

The first version of this page left out the guard's resting backstop: a reduce-only stop that the guard keeps on Hyperliquid at your lowest line, which fires on the exchange's own mark price without waiting for our server. Without it, the replays showed the guard failing when our server was 1 or 5 minutes late. With it, as the guard actually runs, it avoided every liquidation in those cases. The earlier "server alone" results are kept below for comparison.

What the guard did and did not do

  • With the example settings, it avoided every liquidation on the three crash days, at every leverage we tried, with our server on time, 1 minute late or 5 minutes late. When our server was late, the resting backstop did the work.
  • It often kept little. Of $10,000, the accounts it kept from liquidation ended with between $0.19 and $2,480. On silver, with our server on time, it kept under $4 at 5×, 10× and 20×: each trim was followed by a further fall, and it sold in steps all the way down.
  • The outcome depends heavily on the settings. With the same days and other example settings, oil at 20× kept anything from 1.5% to 32.8% with our server on time. None of these settings led to liquidation with our server on time; one did with our server 5 minutes late (SK hynix, 10×).
  • On ordinary bad days it mostly did nothing, and when it acted it could cost money. At 3× and 5× it did nothing on all six days, and at 10× nothing on silver and oil. At 20× it avoided three liquidations and cost 8.8 points of equity on the fourth day. At SK hynix's 10× maximum it cost 16.5 points on one day, because it trimmed at the start and the price then rose.
  • It does not protect in every crash. These are nine days, one market path each, with assumptions listed below. A different path, a thinner order book or an exchange outage can give a different result.

Where the numbers come from

  • From Hydromancer: every price path on this page. Oil, SK hynix and all six ordinary days use the accepted mark price of each oracle round (perpPriceHistoryByTime, about one round every 3 seconds). Silver's crash uses the mark price the market's deployer submitted (oraclePriceHistoryByTime), because accepted mark rounds for HIP-3 markets are recorded only from 24 February 2026.
  • From Hyperliquid directly: each market's margin tiers, maximum leverage and lot sizes (perpDexs, allPerpMetas); and the hourly trade candles (candleSnapshot) used only to choose the ordinary days.
  • Ours: the guard code, open source, and the simulator around it.

Mark-price history courtesy of Hydromancer.

The days

Crash days. Each window runs three days, from 00:00 UTC the day before to 00:00 UTC the day after.

DayMarketMark dataLargest fall within an hourLowest point vs the first price
30 January 2026Silver (xyz:SILVER)Submitted mark, 85,513 rounds−17.7%−37.2%
23 March 2026Oil (xyz:CL)Accepted mark, 85,311 rounds−15.4%−14.1%
27 July 2026SK hynix (xyz:SKHX)Accepted mark, 86,386 rounds−19.4%−25.0%
  • Silver's crash uses the weaker input, the deployer's submitted mark. Where we have both, it was close to the accepted mark on oil (median 0.05%, at most 1.4%) and much further on SK hynix (median 0.17%, up to 15% in the wick). It has one 106-second gap, after the crash.
  • SK hynix: the bad print reached the accepted mark price too: −18.7% in about a minute, then back within two minutes. Liquidations run on mark, so they would have happened.

Ordinary bad days. Chosen by a fixed rule, not by us: for each market, the two most recent UTC days (before 5 October 2026) whose largest fall from an hourly high to a later hourly low was between 3% and 8% over at least two hours, excluding the crash days. In these markets such days are common: 68 qualified for silver, 86 for oil and 81 for SK hynix since mid-March. Each is replayed over the whole UTC day on accepted mark prices.

DayFall used to choose it (hourly trade prices)
Silver, 2 October 20263.8%, 13:00–16:00
Silver, 28 September 20265.5%, 00:00–08:00
Oil, 2 October 20265.3%, 00:00–14:00
Oil, 29 September 20266.5%, 05:00–23:00
SK hynix, 1 October 20263.3%, 06:00–15:00
SK hynix, 30 September 20263.6%, 00:00–22:00

How each replay is run

The account. A cross long on the xyz dex, opened at the first price of the window, with 10,000 USDC of equity and nothing else in the account.

Leverage. 3×, 5×, 10× and 20×, up to each market's maximum (silver 25×, oil 20×, SK hynix 10×). At a market's maximum leverage an account starts with a buffer of exactly 2×, the first example line, so the guard trims straight away.

Example settings, chosen for the test. They are not product defaults; in the app, every number is one you set.

StageWhenThen
1Buffer below 2×Trim until the buffer is back at 3×
2Buffer below 1.5×Trim until the buffer is back at 2.5×
3Buffer below 1.2×Close the position

The guard, as it runs.

  • Server orders: reduce-only IOC orders at the worst price a 1% slippage limit allows, 4.5 bps fee per fill (assumed). An order that does not fill is retried.
  • The resting backstop: a reduce-only stop on Hyperliquid at the lowest line (1.2× here), with a limit at the same 1% slippage. Once the mark crosses it, it rests as a limit order and fills at that limit only when the mark is within it, so a price that gaps past it can leave it unfilled. Our server places it before the window starts and re-places it after each change.

Our server late. Every scenario is run with our server's orders, and its re-placing of the backstop, reaching the exchange immediately, 1 minute late and 5 minutes late. A late IOC fills only if the price is still within its limit. Orders already resting on the exchange fire on the mark regardless. Live, we measured about 94 ms from a price tick to the exchange's answer.

The same account with no guard, on the same prices, is shown next to every result; so is the guard without the backstop (our server alone), which is what the first version of this page showed.

Margin. Current xyz maintenance tiers; the tiers on those days may have differed.

Crash days

Each cell shows the equity at the end of the window and the share of the 10,000 USDC kept, or "liquidated".

Silver, 30 January 2026 (submitted mark)

LeverageNo guardGuard, on timeServer 1 min lateServer 5 min lateWithout the backstop, 1 min lateWithout the backstop, 5 min late
3×liquidated$202.53 (2%)$202.53 (2%)$150.90 (1.5%)$202.53 (2%)liquidated
5×liquidated$3.83 (under 0.1%)$7.52 (0.1%)$555.70 (5.6%)liquidatedliquidated
10×liquidated$0.19 (under 0.1%)$1,256.26 (12.6%)$1,256.26 (12.6%)liquidatedliquidated
20×liquidated$0.30 (under 0.1%)$1,549.19 (15.5%)$1,549.19 (15.5%)liquidatedliquidated

At 10× and 20× the unguarded account was liquidated on 29 January, a day before the crash. With our server on time the guard trimmed in steps all the way down and kept almost nothing; late, the backstop closed the position in one go and kept more.

Oil, 23 March 2026

LeverageNo guardGuard, on timeServer 1 min lateServer 5 min lateWithout the backstop, 1 min lateWithout the backstop, 5 min late
3×$7,224.83 (72.2%)$7,224.83 (72.2%)$7,224.83 (72.2%)$7,224.83 (72.2%)$7,224.83 (72.2%)$7,224.83 (72.2%)
5×$5,374.70 (53.7%)$5,374.70 (53.7%)$5,374.70 (53.7%)$5,374.70 (53.7%)$5,374.70 (53.7%)$5,374.70 (53.7%)
10×liquidated$1,134.61 (11.3%)$1,814.71 (18.1%)$1,814.71 (18.1%)liquidatedliquidated
20×liquidated$837.83 (8.4%)$2,202.43 (22%)$2,202.43 (22%)liquidatedliquidated

The mark fell more than 8% in under three minutes (98.6 at 11:05 to 90.4 at 11:07:37 UTC). At 3× and 5× no line was crossed.

SK hynix, 27 July 2026

LeverageNo guardGuard, on timeServer 1 min lateServer 5 min lateWithout the backstop, 1 min lateWithout the backstop, 5 min late
3×$6,213.63 (62.1%)$6,213.63 (62.1%)$6,213.63 (62.1%)$6,213.63 (62.1%)$6,213.63 (62.1%)$6,213.63 (62.1%)
5×liquidated$2,480.33 (24.8%)$2,112.07 (21.1%)$2,112.07 (21.1%)liquidatedliquidated
10×liquidated$1,964.64 (19.6%)$1,752.76 (17.5%)$1,761.33 (17.6%)liquidatedliquidated

At 10× (this market's maximum) the account started on the 2× line, so the guard trimmed at entry; the unguarded account was liquidated by ordinary moves at 14:21, hours before the wick.

How much the settings matter

The same crash days with every combination of three line sets and three trim sizes. Each is an example chosen for the test, not a recommendation.

LinesStage 1, 2, 3 atTrimTrims back to
Earlier3×, 2×, 1.5×Light1.25 × the line
Example2×, 1.5×, 1.2×Medium1.5 × the line
Later1.5×, 1.25×, 1.1×Heavy2 × the line

The last stage always closes the position. Cells: share kept with our server on time / 5 minutes late; "L" is liquidated. (The example settings above trim stage 2 back to 2.5×, slightly more than "medium".)

Silver, 30 January 2026

LinesTrim3×5×10×20×
earlierlight4.8% / 4%0.4% / 6%0.1% / 13.7%0.1% / 12.6%
earliermedium5.3% / 4%0.7% / 0.2%0.2% / 2.3%0.2% / 10.7%
earlierheavy8% / 4%1.2% / 1.2%0.5% / 3.2%0.7% / 13%
examplelight1.5% / 1.9%0% / 5.6%0% / 12.6%0% / 19.6%
examplemedium2% / 1.5%0% / 5.6%0% / 12.6%0% / 15.5%
exampleheavy2.7% / 1.1%0.1% / 5.6%0% / 12.6%0% / 1.8%
laterlight0.5% / 2.4%0% / 4.7%0% / 10.7%0% / 22.6%
latermedium0.6% / 2.4%0% / 4.7%0% / 10.7%0% / 22.6%
laterheavy1.4% / 2.4%0% / 4.7%0% / 10.7%0% / 22.6%

Oil, 23 March 2026

LinesTrim3×5×10×20×
earlierlight72.2% / 72.2%46% / 46%22.4% / 25.3%19% / 66.9%
earliermedium72.2% / 72.2%42.4% / 42.4%26.8% / 25.3%23.4% / 69.1%
earlierheavy72.2% / 72.2%37.9% / 37.9%29.7% / 25.3%32.8% / 71.8%
examplelight72.2% / 72.2%53.7% / 53.7%9.7% / 18.1%6.4% / 27.6%
examplemedium72.2% / 72.2%53.7% / 53.7%11.3% / 18.1%8.4% / 22%
exampleheavy72.2% / 72.2%53.7% / 53.7%16.2% / 18.1%14.2% / 15.5%
laterlight72.2% / 72.2%53.7% / 53.7%4.1% / 15.8%1.5% / 23.6%
latermedium72.2% / 72.2%53.7% / 53.7%6.6% / 15.8%2.2% / 18.7%
laterheavy72.2% / 72.2%53.7% / 53.7%9.5% / 15.8%5% / 13%

SK hynix, 27 July 2026

LinesTrim3×5×10×
earlierlight55.2% / 55.2%33.8% / 21.2%28.9% / 16.3%
earliermedium51.1% / 51.1%35.1% / 16.7%38.2% / 22.7%
earlierheavy46.1% / 46.1%38% / 36%42.8% / 15.2%
examplelight62.1% / 62.1%20.6% / 21.1%14.6% / 15.9%
examplemedium62.1% / 62.1%24.8% / 21.1%19.6% / 17.6%
exampleheavy62.1% / 62.1%25.8% / 21.1%24.3% / 20%
laterlight62.1% / 62.1%11.4% / 18.9%5.6% / L
latermedium62.1% / 62.1%17.1% / 18.9%8.9% / 15.6%
laterheavy62.1% / 62.1%18.5% / 18.9%14.6% / 18.1%

Earlier lines and heavier trims generally kept more on these crash days, but not always, and they also trim more on ordinary days (below).

Ordinary bad days

Example settings. Cells: share of the 10,000 USDC kept at the end of the day, without the guard → with the guard. With a fall spread over hours, 1 or 5 minutes of server delay changed nothing on these days.

DayMarket fall3×5×10×20×
Silver, 2026-10-023.8% (13:00–16:00)97% → 97%95% → 95%89.9% → 89.9%79.9% → 71.1%
Silver, 2026-09-285.5% (00:00–08:00)86.2% → 86.2%77% → 77%53.9% → 53.9%liquidated → 30.6%
Oil, 2026-10-025.3% (00:00–14:00)94.3% → 94.3%90.6% → 90.6%81.2% → 81.2%liquidated → 58.1%
Oil, 2026-09-296.5% (05:00–23:00)86.9% → 86.9%78.2% → 78.2%56.4% → 56.4%liquidated → 41.8%
SK hynix, 2026-10-013.3% (06:00–15:00)110.7% → 110.7%117.8% → 117.8%135.7% → 119.2%—
SK hynix, 2026-09-303.6% (00:00–22:00)95.8% → 95.8%93% → 93%86.1% → 87.3%—

At the highest leverage of each day, with each sweep setting (our server on time):

LinesTrimSilver, 2026-10-02 (20×)Silver, 2026-09-28 (20×)Oil, 2026-10-02 (20×)Oil, 2026-09-29 (20×)SK hynix, 2026-10-01 (10×)SK hynix, 2026-09-30 (10×)
earlierlight75.1%40.2%63.5%49.3%113%87.8%
earliermedium79.5%45.1%63.6%51.5%108.9%88.1%
earlierheavy79.4%53.2%74.3%60.2%103.9%88.5%
examplelight66.5%26.5%51%37%125.6%86.8%
examplemedium71.1%30.6%58.1%41.8%119.2%87.3%
exampleheavy67.4%36.8%71.4%49.6%111.4%87.8%
laterlight68.4%17.9%40.5%25.5%135.7%86.1%
latermedium61.9%20.9%35.5%30%135.7%86.1%
laterheavy54.8%25.9%57.1%36.2%135.7%86.1%
no guard79.9%liquidatedliquidatedliquidated135.7%86.1%

Backstops with several positions

The guard now prices the backstop of a pool with several positions as if every position moves against you at once (why). To test it, each crash day is replayed with two cross longs in one pool, half the exposure each: the crash market and a related market. Example settings as above; the guard as it runs, with its backstop. Cells: share kept before (each stop priced for its position alone) → after (priced together).

Oil and Brent, 23 March 2026

LeverageNo guardOn time: before → afterServer 1 min late: before → afterServer 5 min late: before → after
3×71.5%71.5% → 71.5%71.5% → 71.5%71.5% → 71.5%
5×52.4%52.4% → 52.4%52.4% → 52.4%52.4% → 52.4%
10×liquidated10.5% → 10.5%liquidated → 18.2%liquidated → 18.2%
20×liquidated9.3% → 9.3%4% → 22.9%liquidated → 23%

Silver and gold, 30 January 2026

LeverageNo guardOn time: before → afterServer 1 min late: before → afterServer 5 min late: before → after
3×40.3%40.3% → 33.4%40.3% → 33.4%40.3% → 33.4%
5×liquidated1.1% → 22.8%1.1% → 22.8%2.3% → 22.8%
10×liquidated0.1% → 1.2%liquidated → 19.3%liquidated → 19.3%
20×liquidated0% → 0%liquidated → 2.7%liquidated → 2.9%

SK hynix and Samsung, 27 July 2026

LeverageNo guardOn time: before → afterServer 1 min late: before → afterServer 5 min late: before → after
3×65%65% → 65%65% → 65%65% → 65%
5×liquidated34.3% → 28.5%48.5% → 28.5%48.5% → 28.5%
10×liquidated24.2% → 14.4%9.1% → 22.2%10% → 21.3%
  • When both fell (oil and Brent, silver and gold), pricing each position alone left the account liquidated in 7 of the late runs; priced together, none were.
  • When one fell much more than the other (SK hynix and Samsung), the earlier stops sometimes cost money: at 5× the account kept 28.5% instead of 34.3% on time, and instead of 48.5% with our server late. Silver and gold at 3× kept 33.4% instead of 40.3%.
  • Second markets: Brent and Samsung use accepted marks; gold on 30 January uses the deployer-submitted mark, like silver.

Once per fall, or every time

Each stage now carries your choice: act once per fall, or every time its line is crossed (what each does). The days below were replayed with every stage set one way, then the other. The example settings elsewhere on this page act every time, which is how all stages behaved before the choice existed. Cells: share kept, every time / once.

Silver, 30 January (worked example): the choice made no difference. At 10× the guard acted 16 times either way and kept $0.19. Between any two of its actions, silver's price came back above where the stage had last acted. For example, after acting at 107.56 on 29 January, silver rose to 118.44 before falling again. So even "once per fall" saw each drop as a new fall. Selling in steps all the way down came from a choppy fall, not from the guard re-arming on its own trims.

SK hynix, 27 July: a fall that recovered, where "once" did worse. With "every time", stage 1 acted again twice during the wick (at 23:00:30 and 23:00:48 UTC), so the position was already small at the bottom. With "once", the stage stayed done, more of the position was still open, and the backstop closed it near the wick's low. At 10× the account kept 4.8% instead of 19.6%.

Oil, 23 March 2026

LeverageOn time: every time / onceServer 5 min late: every time / once
3×72.2% / 72.2%72.2% / 72.2%
5×53.7% / 53.7%53.7% / 53.7%
10×11.3% / 15%18.1% / 18.1%
20×8.4% / 8.6%22% / 22%

SK hynix, 27 July 2026

LeverageOn time: every time / onceServer 5 min late: every time / once
3×62.1% / 62.1%62.1% / 62.1%
5×24.8% / 6%21.1% / 21.1%
10×19.6% / 4.8%17.6% / 17.6%

Silver, 2026-09-28

LeverageOn time: every time / onceServer 5 min late: every time / once
3×86.2% / 86.2%86.2% / 86.2%
5×77% / 77%77% / 77%
10×53.9% / 53.9%53.9% / 53.9%
20×30.6% / 30.6%30.6% / 25.3%

SAME SK hynix, 2026-09-30

On the other ordinary days, and on silver's crash, the two choices gave the same result.

What this does not prove

  • A replay is not a live cascade. In a real cascade liquidity disappears and other traders and liquidations move the price in response to each other. A replay moves along recorded prices that our orders do not affect.
  • Fills are assumed, not observed. Server orders fill at their slippage limit if the price allows; the backstop fills at its limit once the price is back within it. Order-book depth is not checked.
  • Our server being late is modelled only as a delay. An unavailable Hyperliquid API, rate limits, queue position and partial fills are not modelled; neither are Hyperliquid's own outages, which would also stop resting orders from firing.
  • Silver's crash runs on the submitted mark, which can differ from the mark Hyperliquid accepted.
  • Funding is not included, and today's margin tiers are used for past days.
  • The settings are examples. Other lines and actions give other results, better or worse. They are not advice and not product defaults.
  • Surviving is not the same as keeping your money. The guard can avoid liquidation and still end with almost nothing, and a trim can lock in a loss before a recovery.
  • Nine days are nine days. The crash days were chosen because they were sharp, recent HIP-3 crashes; the ordinary days by the rule above.

Reproduce

The scripts and settings are in the public repository. The Hydromancer data is not redistributed: the scripts fetch it with your own Hydromancer API key and cache it locally.

pnpm install
pnpm build
pnpm --filter @bulwarkxyz/ops find-ordinary-days                               # the ordinary-day rule
HYDROMANCER_API_KEY=… pnpm --filter @bulwarkxyz/ops replays                    # everything on this page
HYDROMANCER_API_KEY=… pnpm --filter @bulwarkxyz/ops backtest -- --hydromancer  # the first version (no backstop)

The results on this page are evidence/replays-2026-10-05.json and .md, with every assumption written next to the numbers.

On this page