Skip to main content

Audit reports

The contracts deployed on mainnet have not had an independent audit. The one published report covers Zenex V1, an earlier design that was never deployed. The contracts in Deployments are V2, a rewrite that no auditor has reviewed.

Zellic: Zenex V1​

ReviewerZellic
Review period21 May to 2 June 2026. Report dated 16 June 2026.
Code reviewedZenex V1 contracts at commit 7c011de
Contracts in scopeTrading, now Market. StrategyVault, now Vault. PriceVerifier, replaced by Oracle. Factory, Governance and Treasury keep their names.
Out of scopeFront end, infrastructure, and key custody
Findings27. By impact: 2 critical, 4 high, 11 medium, 6 low, 4 informational.
RemediationThe report records V1 fixes for 13 findings, 2 of them partial. Zellic recommended a full reassessment after remediation. None has taken place.
ReportZellic V1 audit report (PDF)

The report is published unchanged. Its code references point to V1 files and functions, and most of them no longer exist. The severity column below is each finding's own rating, which can differ from its impact rating in the summary.

What changed between V1 and V2​

V1 was one Trading contract that served every market from a shared StrategyVault, priced through a Pyth Lazer verifier. V2 replaced it:

  • One vault per market. Each market is its own contract with its own vault. A loss in one market cannot draw on another market's liquidity.
  • A new oracle. Prices come from Chainlink Data Streams through a separate oracle contract. The Pyth verifier was removed.
  • Keeper-executed orders. Opens, closes and vault deposits and redemptions are orders that a keeper fills at a later price.
  • Auto-deleveraging as a normal close. ADL settles a partial close and pays out realised profit. The V1 deleveraging index is gone.
  • Retirement instead of deletion. A market cannot be deleted. It winds down, and it can retire only once every position is closed.

The table below records where each V1 finding stands in the deployed V2 code. Zenex prepared it. Zellic has not reviewed it.

Findings and their V2 status​

The Zellic column is the status the report records for V1. Fixed and Partially fixed list the V1 fix commits the report records. Acknowledged means Zenex accepted the finding without a V1 fix in the report.

The V2 status is Zenex's assessment of the deployed code. Fixed means the V1 fix carries into V2. Redesigned means V2 handles the problem with a different mechanism. Accepted means the risk remains by design.

#SeverityFindingZellic (V1)V2 statusHow V2 handles it
3.1CriticalNegative collateral allows withdrawal of unrealized profitFixed (acf96701)RedesignedMargin changes are non-negative amounts. A withdrawal keeps the initial margin, and unrealised profit does not count towards it.
3.2CriticalStale entry-price notionals understate open interestAcknowledgedRedesignedVault capacity is checked against the long side at the live price and the short side's largest possible payout. The open interest cap still sums entry notional.
3.3HighFunding-rate formula lacks convergence, a cap and stabilisationAcknowledgedRedesignedFunding moves gradually with the long and short imbalance and has a hard cap. See Funding rate.
3.4HighOracle price life-cycle mismatch across trading flowsAcknowledgedFixedA fill cannot use a price older than the order or the position's last price. Trade prices must be recent. See Prices.
3.5HighDelisted positions refunded without PnL settlementPartially fixed (418275f8, 0ff44111)RedesignedA delisted market settles positions at a final price or closes them, and it can retire only with no positions left. See Market status.
3.6HighADL threshold uses uncapped net PnLAcknowledgedRedesignedADL triggers on each side's own profit. A side's losses count only up to its posted margin.
3.7MediumLiquidity counted for utilization can still be withdrawnAcknowledgedRedesignedRedemptions are keeper orders. A redemption that would leave open positions unbacked does not fill.
3.8MediumIdle market accrual charges retroactive feesFixed (c8293a07)FixedThe accrual clock advances on every priced call, including when the market is empty.
3.9MediumMissing price-data validationAcknowledgedRedesignedThe oracle rejects non-positive or crossed prices, the wrong feed, and stale or future reports.
3.10MediumStale funding rate after an imbalance flipsPartially fixed (7780f821)RedesignedThe rate is recalculated on every priced call. It turns towards the new side gradually by design.
3.11MediumReliance on a single oracleAcknowledgedAcceptedZenex relies on one price provider. Exposure caps limit the damage from a bad price, and the owner can freeze a market.
3.12MediumNo liquidation safety bufferAcknowledgedRedesignedLiquidation starts at a maintenance margin set above the liquidation fee and below the initial margin. See Liquidation.
3.13HighPositions can open when the contract is not activeFixed (00e2ee08)FixedA fill that adds size requires an active market.
3.14HighMarket margin can be set arbitrarily lowFixed (d814a768)FixedInitial margin has a protocol floor of 0.1%. The deployed market's setting is in Deployments.
3.15MediumBorrowing accrual misses vault-balance changesFixed (ff90b8ae)RedesignedEach market has its own vault, and deposits and redemptions pass through the market, which accrues first.
3.16MediumBorrowing configuration changes apply retroactivelyAcknowledgedFixedA rate change is rejected unless the market accrued in the same ledger.
3.17HighShared signer keys allow signature replayFixed (4991fefd)RedesignedA user signs the whole call, including the account address. Orders carry no price data to replay.
3.18MediumUnbound oracle exponent breaks price accountingAcknowledgedRedesignedChainlink reports carry no exponent, and each market's feed is fixed at deployment and checked on every report.
3.19LowIncorrect rounding directionFixed (3a1deb32)FixedFees and funding round in the protocol's favour.
3.20LowADL cuts winning positions without settling PnLAcknowledged as intendedRedesignedADL is a settled partial close. Realised profit and freed margin go to the trader. See Auto-deleveraging.
3.21LowBase fee is discontinuous across the dominant-side boundaryAcknowledgedFixedA trade that crosses the boundary pays the lower rate on the rebalancing part and the higher rate on the rest. See Fees.
3.22LowIncomplete TP/SL validationFixed (4869d20c)RedesignedTake-profit and stop-loss are separate close orders with positive trigger prices. A trigger already crossed fills on the next keeper pass.
3.23InformationalPriceVerifier does not extend its storage lifetimeFixed (f5097052)FixedThe oracle and the other contracts renew their storage lifetime on use.
3.24InformationalContract deployment can be front-runFixed (8027aa44)FixedFactory deployment addresses derive from the authorising admin.
3.25InformationalMarket existence not checked when adding collateralFixed (acf96701)RedesignedEach market is its own contract and cannot be deleted. A retired market rejects new orders.
3.26InformationalActual leverage can differ from the trader's expectationAcknowledgedAcceptedOpening fees come out of the posted margin, so effective leverage is slightly above the requested value. See Margin and leverage.
3.27LowInsufficient test coverageAcknowledgedAddressedV2 has unit, integration, fuzz and mutation testing.

What the deployed code relies on​

Without an independent review of V2, its assurance comes from Zenex's own work:

  • An internal threat model, reviewed against every V1 finding above.
  • Unit, integration, fuzz and mutation tests.
  • Testnet soak campaigns with automated traders, keepers and liquidations.
  • Low launch limits on position size, open interest and vault utilization, shown in Deployments. They reduce market exposure but do not cap the loss from a contract flaw.

The owner can still upgrade the market and oracle code. Read Governance.

Unaudited code holds your funds

A flaw in the V2 contracts can cost traders their margin and liquidity providers their deposits. A flaw that bypasses the launch limits is not bounded by them. No independent reviewer has checked V2 for such flaws. Read Risks before committing funds.

Reporting a vulnerability​

Report a suspected vulnerability privately to the Zenex team through a direct message on Discord. Do not disclose it publicly until it has been resolved.