Skip to content
All docs

Test matrix

Generated by scripts/src/gen-docs.ts from proof/local/forge-test-results.json (2026-10-07T15:27:11Z). Environment for every contract row: contracts (Perpl bytecode harness), LOCAL_REPRODUCTION. Commit: none (no commits authorized yet).

IDRequirementTestsExpectedActualStatusEvidence
I-01Trader cannot withdraw pool principalAttacksTest::test_lp_cannotWithdrawDeployedPrincipal<br>AttacksTest::test_unauth_poolMoneyPathsRequireRegisteredDesk<br>PoolInvariantTest::invariant_cashBasisIdentitypasspass, pass, passPASSproof/local/forge-test-results.json
I-02Every order receives the policy stampDeskPolicyTest::test_orderType_stampIsAlwaysImmediate<br>DeskPolicyTest::test_stamp_negPnlAndExecutionBlockpasspass, passPASSproof/local/forge-test-results.json
I-03Leverage cannot exceed the limitDeskPolicyTest::test_leverage_exactlyAtCapAccepted<br>DeskPolicyTest::test_leverage_oneUnitOverCapRejected<br>DeskPolicyTest::testFuzz_leverage_aboveCapAlwaysRejectedpasspass, pass, passPASSproof/local/forge-test-results.json
I-04Only allowlisted marketsDeskPolicyTest::test_market_notAllowlistedRejectedpasspassPASSproof/local/forge-test-results.json
I-05Only IOC/FOK ordersDeskPolicyTest::test_orderType_stampIsAlwaysImmediate<br>DeskPolicyTest::test_orderType_fokStampedAndRevertsAtomicallyWithoutLiquidity<br>DeskPolicyTest::test_orderType_iocWithoutLiquidityLeavesNoPositionpasspass, pass, passPASSproof/local/forge-test-results.json
I-06Price within the bandDeskPolicyTest::test_priceBand_exactlyAtBandAccepted<br>DeskPolicyTest::test_priceBand_oneTickOutsideRejected<br>DeskPolicyTest::test_priceBand_appliesToClosesToo<br>DeskPolicyTest::testFuzz_priceBandpasspass, pass, pass, passPASSproof/local/forge-test-results.json
I-07maxNegPnlCollatBPS enforcedDeskPolicyTest::test_stamp_negPnlAndExecutionBlock<br>DeskPolicyTest::test_negPnlStamp_perplRejectsFillFarFromMarkWithinBand<br>DeskPolicyTest::test_negPnlStamp_venueRefusesAddingToUnderwaterPositionpasspass, pass, passPASSproof/local/forge-test-results.json
I-08lastExecutionBlock stampedDeskPolicyTest::test_stamp_negPnlAndExecutionBlockpasspassPASSproof/local/forge-test-results.json
I-09Equity floor before/after tradeDeskPolicyTest::test_floor_breachedDeskRejectsNewRiskAndReduce<br>DeskPolicyTest::test_floor_postTradeBreachRevertsWholeTransactionpasspass, passPASSproof/local/forge-test-results.json
I-10Invalid order reverts atomicallyDeskPolicyTest::test_floor_postTradeBreachRevertsWholeTransaction<br>DeskPolicyTest::test_orderType_fokStampedAndRevertsAtomicallyWithoutLiquiditypasspass, passPASSproof/local/forge-test-results.json
I-11Signed order cannot replayAttacksTest::test_relay_validSignedOrderExecutesOncepasspassPASSproof/local/forge-test-results.json
I-12Nonce strictly increasesAttacksTest::test_relay_lowerNonceRejectedpasspassPASSproof/local/forge-test-results.json
I-13Deadline enforcedAttacksTest::test_relay_expiredDeadlineRejectedpasspassPASSproof/local/forge-test-results.json
I-14Stale mark prevents new riskDeskPolicyTest::test_staleMark_refusesNewRiskAllowsReduceOnlypasspassPASSproof/local/forge-test-results.json
I-15Reduce-only possible during stale stateDeskPolicyTest::test_staleMark_refusesNewRiskAllowsReduceOnlypasspassPASSproof/local/forge-test-results.json
I-16claim() rejects with an open positionDeskLifecycleTest::test_fullLifecycle_demoCohort_graduateTradeClaimClose<br>DeskSettlementTest::test_claim_unrealizedProfitCannotBeWithdrawnpasspass, passPASSproof/local/forge-test-results.json
I-17claim() distributes only realized profitDeskSettlementTest::test_claim_unrealizedProfitCannotBeWithdrawn<br>SettlementMathTest::testFuzz_claimSplit_conservesGrosspasspass, passPASSproof/local/forge-test-results.json
I-18HWM cannot be double claimedDeskSettlementTest::test_claim_hwmPreventsReclaimAfterLossAndRecovery<br>DeskLifecycleTest::test_fullLifecycle_demoCohort_graduateTradeClaimClosepasspass, passPASSproof/local/forge-test-results.json
I-19Fees accrue only during exposureDeskSettlementTest::test_fees_exposedIntervalAccruesExactlyOnceDespitePositionsAndCheckpoints<br>DeskSettlementTest::test_fees_chunkedCheckpointsCannotRoundFeesAwaypasspass, passPASSproof/local/forge-test-results.json
I-20Flat desks accrue zero new feesDeskSettlementTest::test_fees_flatFundedDeskAccruesNothingForAMonth<br>DeskSettlementTest::test_fees_evaluationDeskAccruesNothingpasspass, passPASSproof/local/forge-test-results.json
I-21Fee cap enforcedDeskSettlementTest::test_fees_capStopsAccrualAndNewRiskButAllowsReduceAndEnforce<br>SettlementMathTest::testFuzz_accrue_neverExceedsCappasspass, passPASSproof/local/forge-test-results.json
I-22Fee cap cannot consume principalDeskSettlementTest::test_fees_capStopsAccrualAndNewRiskButAllowsReduceAndEnforce<br>SettlementMathTest::testFuzz_waterfall_conservesCashAndOrdersPrioritypasspass, passPASSproof/local/forge-test-results.json
I-23Fee write-offs explicitSettlementMathTest::testFuzz_waterfall_conservesCashAndOrdersPriority<br>PoolInvariantTest::invariant_feeSubledgerAndCappasspass, passPASSproof/local/forge-test-results.json
I-24Settlement reconciles actual cashDeskSettlementTest::test_enforce_breachSettlesWaterfallAndPaysKeeperOnce<br>ReferenceVectorsTest::test_vectors_settlementspasspass, passPASSproof/local/forge-test-results.json
I-25Keeper bounty paid at most onceDeskSettlementTest::test_enforce_breachSettlesWaterfallAndPaysKeeperOncepasspassPASSproof/local/forge-test-results.json
I-26Voluntary close has no keeper bountyDeskSettlementTest::test_close_voluntaryPaysNoKeeperAndRequiresFlatpasspassPASSproof/local/forge-test-results.json
I-27Partial closure cannot prematurely settleDeskSettlementTest::test_enforce_partialCloseDoesNotSettleAndPaysNothingpasspassPASSproof/local/forge-test-results.json
I-28Pool exposure cap cannot be bypassedAttacksTest::test_caps_grossCapAcrossDesksCannotBeBypassed<br>AttacksTest::test_caps_increaseIsTimelockedpasspass, passPASSproof/local/forge-test-results.json
I-29Per-desk notional cap cannot be bypassedAttacksTest::test_caps_perDeskNotionalCap<br>AttacksTest::test_unauth_deskCannotUnderReportExposurepasspass, passPASSproof/local/forge-test-results.json
I-30Pause cannot block closes/claimsDeskSettlementTest::test_graduation_pausedPoolBlocksButCloseStillWorks<br>DeskSettlementTest::test_factoryPause_blocksNewDesksOnlypasspass, passPASSproof/local/forge-test-results.json
I-31Unauthorized addresses cannot move pool fundsAttacksTest::test_unauth_poolMoneyPathsRequireRegisteredDesk<br>AttacksTest::test_unauth_deskCannotDrawCreditForAnotherDesk<br>AttacksTest::test_unauth_operatorCannotMoveFundspasspass, pass, passPASSproof/local/forge-test-results.json
I-32Reentrancy protections workReentrancyTest::test_reentry_claimDuringTrade<br>ReentrancyTest::test_reentry_enforceDuringTrade<br>ReentrancyTest::test_reentry_tradeDuringTrade<br>ReentrancyTest::test_reentry_closeDuringTrade<br>ReentrancyTest::test_reentry_graduateDuringTradepasspass, pass, pass, pass, passPASSproof/local/forge-test-results.json
I-33Unexpected external calls fail safelyAttacksTest::test_venue_haltedExchangeBlocksTradingButEnforceStatePersists<br>DeskSettlementTest::test_enforce_bankruptPositionWithoutVenueInsuranceStaysEnforcingpasspass, passPASSproof/local/forge-test-results.json
I-34Perpl errors surfacedAttacksTest::test_venue_perplErrorsSurfaceNamedpasspassPASSproof/local/forge-test-results.json
I-35Indexer cannot authorize money movementn/apassn/aBY DESIGNdesign: no contract reads the indexer; web/keeper read chain (docs/ARCHITECTURE.md)
I-36UI cannot authorize money movementAttacksTest::test_relay_signedOrderStillPolicyCheckedpasspassPASSproof/local/forge-test-results.json plus web e2e: blocked order sent to contract is rejected onchain
I-37Relayer cannot alter signed orderAttacksTest::test_relay_alteredFieldsRejectedpasspassPASSproof/local/forge-test-results.json plus relayer/test/relayer.test.ts
I-38Relayer cannot replay signed orderAttacksTest::test_relay_validSignedOrderExecutesOncepasspassPASSproof/local/forge-test-results.json plus relayer/test/relayer.test.ts
I-39Keeper cannot enforce a healthy deskDeskSettlementTest::test_enforce_healthyDeskRejected<br>AttacksTest::test_keeper_cannotGraduateIneligibleOrEnforceHealthypasspass, passPASSproof/local/forge-test-results.json plus keeper/test/decide.test.ts
I-40Testnet deployment matches compiled bytecodescripts/src/sync-deployment.tspasspassTESTNET VERIFIEDproof/receipts/deployments/testnet-*.json (runtime bytecode matches the build on two RPCs)

Services, model and browser

IDRequirementTestRunner
S-01Core accounting, verification state machine, evidence rulespackages/core/test/core.test.tsvitest
S-02Relayer: malicious signer, altered fields, replay, stale deadline, quota, gas caprelayer/test/relayer.test.tsvitest
S-03Keeper: healthy/breach/fee cap/partial/settled/stale decisionskeeper/test/decide.test.tsvitest
S-04Reference model agrees with contract outputsproof/reference_model/run_reference.pypython
S-05Web pages render, testnet banner, no overflow 320-1920 px, no console errorsweb/e2e/*.spec.tsplaywright
S-06Live testnet fork: real Perpl account and book fillcontracts/test/perpl/TestnetFork.t.solforge (FORK_TESTNET=true), SIMULATED

Run everything with pnpm test, pnpm proof:local and pnpm --filter @imprest/web e2e.