Summary
100% of all REPORTED Findings have been addressed
- 1Partially Solved
- 23Acknowledged
- 18Risk Accepted
- 13Solved
- 55All Findings
- Critical1
- 1Solved
- High2
- 2Solved
- Medium1
- 1Risk A.
- Low24
- 17Risk A.
- 6Solved
- 1P. Solved
- Informational27
- 23Ack.
- 4Solved
Introduction#
Saucerswap Labs engaged Halborn to perform a smart contract security assessment of the Saucerswap Perpetuals from October 7th, 2026 to October 16th, 2026. The assessment focused on Hedera compatibility of the GMX Synthetics fork, covering all Solidity contracts in the contracts/ tree, and also covered the Saucerswap farm contracts (MasterChef, its interface and the RewardStream library). The Scope section lists the reviewed files, commits, exclusions, and assessment limits.
Saucerswap Perpetuals is a fork of GMX Synthetics, a decentralized perpetuals trading protocol, adapted for the Hedera network. It is deployed on hederaTestnet, with hederaMainnet deployment planned. The fork adapts GMX's trading, liquidation, automatic deleveraging, fee collection, oracle, relay and vault contracts to Hedera's account model, the Hedera Token Service and Hedera's EVM execution environment.
Assessment Summary#
Halborn was allocated 8 business days for this engagement and assigned 1 full-time security engineer to conduct a comprehensive review of the source code within scope. The engineer is an expert in blockchain and smart contract security, with advanced skills in penetration testing and smart contract exploitation, as well as extensive knowledge of multiple blockchain protocols. The objectives of this assessment were to:
Identify deviations between Hedera's EVM execution environment and EVM-standard assumptions in the GMX Synthetics base contracts that affect correctness or security.
Assess HTS token association, receipt, and transfer paths across all custodian contracts, including vault, market token, and fee collection contracts.
Review keeper-transaction isolation for account-controlled callbacks, native-token refunds, and relay calls under Hedera's execution constraints.
Verify that oracle and relay behavior is consistent with Hedera's block timestamps, address model and supported signature types.
Check contract behavior under the deployed hederaTestnet configuration and the settings planned for hederaMainnet.
Review reward accounting, HTS token handling and access control in the farm contracts.
In summary, Halborn identified several areas for improvement to reduce the likelihood and impact of security risks, which were addressed by the Saucerswap Labs team. The primary recommendations were:
Remove HederaTokenService from the MasterChef inheritance list, so its unrestricted transferFrom, transferFromNFT and redirectForToken functions are no longer exposed, and replace the inherited mintToken with a private helper.Remove account-controlled callbacks and native-token refunds from forced liquidation and ADL keeper transactions; invoke optional user callbacks in separate transactions and pay all refunds as WHBAR to a validated receiver address.For local forced liquidation and ADL orders, set shouldUnwrapNativeToken to false and pay positive outputs as WHBAR; where native delivery is retained, place it in a separately called helper so the WHBAR fallback remains reachable in the calling frame.For local GM, GLV and native or WHBAR payout receivers, resolve a numeric account through the Hedera Account Service getEvmAddressAlias function and reject a numeric form that has a distinct preferred alias, at creation and at credit execution.In Oracle::_setPrices, move the NonEmptyTokensWithPrices guard before the early return for an empty list, so a nested relay call with empty oracle parameters reverts rather than clearing prices set by an outer keeper action.In HTSInteractable, add an add-only function that calls IHRC719(token).associate() for each listed HTS token on every custodian contract, and on chain IDs 295 and 296 make enableAutoAssociation revert or remove it; confirm the hederaMainnet deployer has maxAutoAssociations = -1.In ConfigUtils::validateRange, add a bound for chain IDs 295 and 296 so combined callback and auto-cancel gas caps cannot exceed Hedera's 15 million gas transaction limit; use a separate, smaller callback gas limit for liquidation and ADL.
Test Approach and Methodology#
Halborn used manual source review and targeted research of Hedera primary sources. Manual review examined all Solidity contracts in the contracts/ tree, using the upstream GMX Synthetics fork diff (base commit f1c0125) as change context; deploy and configuration scripts were read as context only. The assessment included:
Research of Hedera primary sources including HIPs, Hedera Smart Contract Service and Hedera Token Service release notes, and JSON-RPC relay specifications.
Read-only queries to hederaTestnet and hederaMainnet using mirror node REST and
eth_call; no transactions were sent to live networks.Proof-of-concept execution on a local Hedera consensus node v0.77.5 for the two High findings, with results independently reviewed.
Compiler version known-issue check and comparison against a historical vulnerability database.
For the farm contracts: a full manual review, static analysis with Slither, Aderyn and Semgrep, and a local-node proof of concept for the Critical finding.
Manual test cases recorded for every check as Pass or Fail.
Generic GMX protocol logic was reviewed only where its behavior changes on Hedera.
Risk Methodology#
4.1 EXPLOITABILITY
Attack Origin (AO):
Attack Cost (AC):
Attack Complexity (AX):
Metrics:
| EXPLOITABILITY METRIC () | METRIC VALUE | NUMERICAL VALUE |
|---|---|---|
| Attack Origin (AO) | Arbitrary (AO:A) | 1 |
| Specific (AO:S) | 0.2 | |
| Attack Cost (AC) | Low (AC:L) | 1 |
| Medium (AC:M) | 0.67 | |
| High (AC:H) | 0.33 | |
| Attack Complexity (AX) | Low (AX:L) | 1 |
| Medium (AX:M) | 0.67 | |
| High (AX:H) | 0.33 |
4.2 IMPACT
Confidentiality (C):
Integrity (I):
Availability (A):
Deposit (D):
Yield (Y):
Metrics:
| IMPACT METRIC () | METRIC VALUE | NUMERICAL VALUE |
|---|---|---|
| Confidentiality (C) | None (C:N) | 0 |
| Low (C:L) | 0.25 | |
| Medium (C:M) | 0.5 | |
| High (C:H) | 0.75 | |
| Critical (C:C) | 1 | |
| Integrity (I) | None (I:N) | 0 |
| Low (I:L) | 0.25 | |
| Medium (I:M) | 0.5 | |
| High (I:H) | 0.75 | |
| Critical (I:C) | 1 | |
| Availability (A) | None (A:N) | 0 |
| Low (A:L) | 0.25 | |
| Medium (A:M) | 0.5 | |
| High (A:H) | 0.75 | |
| Critical (A:C) | 1 | |
| Deposit (D) | None (D:N) | 0 |
| Low (D:L) | 0.25 | |
| Medium (D:M) | 0.5 | |
| High (D:H) | 0.75 | |
| Critical (D:C) | 1 | |
| Yield (Y) | None (Y:N) | 0 |
| Low (Y:L) | 0.25 | |
| Medium (Y:M) | 0.5 | |
| High (Y:H) | 0.75 | |
| Critical (Y:C) | 1 |
4.3 SEVERITY COEFFICIENT
Reversibility (R):
Scope (S):
Metrics:
| SEVERITY COEFFICIENT () | COEFFICIENT VALUE | NUMERICAL VALUE |
|---|---|---|
| Reversibility () | None (R:N) | 1 |
| Partial (R:P) | 0.5 | |
| Full (R:F) | 0.25 | |
| Scope () | Changed (S:C) | 1.25 |
| Unchanged (S:U) | 1 |
| Critical | High | Medium | Low | Informational |
| 9 - 10 | 7 - 8.9 | 4.5 - 6.9 | 2 - 4.4 | 0 - 1.9 |
Scope#
Assessment Summary & Findings Overview#
# | Title | Severity | Score | Status |
|---|---|---|---|---|
| Inherited HederaTokenService functions let any account move tokens held by MasterChef | Critical | 10.0 | Solved10/20/2026 | |
| Account-controlled callees can defeat keeper isolation when they exceed Hedera's active trace-data limit | High | 7.5 | Solved10/26/2026 | |
| Recursively propagated Hedera callback failures can roll back keeper operations | High | 7.5 | Solved10/26/2026 | |
| Missing Hedera receiver signatures bypass the native payout fallback and can block forced payouts | Medium | 5.0 | Risk Accepted10/24/2026 | |
| Numeric receiver addresses can strand GM, GLV and WHBAR balances of aliased Hedera accounts | Low | 3.8 | Risk Accepted10/25/2026 | |
| Push-feed prices are stamped with block time, so the 30-second atomic price-age limit never applies | Low | 3.4 | Risk Accepted10/25/2026 | |
| A nested relay call with empty oracle parameters clears the outer prices, so a trader can block ADL of its own position | Low | 3.4 | Solved10/24/2026 | |
| ChainlinkPriceFeedProvider uses the stored stablePrice as the minimum or maximum price with no bound against the feed price | Low | 3.4 | Solved10/24/2026 | |
| Payout receiver validation accepts protocol vaults and Hedera reserved system addresses | Low | 3.4 | Risk Accepted10/25/2026 | |
| Vault delta accounting credits or absorbs tokens sent outside the atomic flow, including collateral delivered by relay external calls | Low | 3.4 | Risk Accepted10/25/2026 | |
| Relay fee swaps for main accounts are uncapped, have no minimum output and use atomic push-feed prices | Low | 3.4 | Risk Accepted10/25/2026 | |
| At the budget cap, the settlement time of empty pools changes payouts | Low | 3.4 | Solved10/20/2026 | |
| Dev cut is kept on emissions of empty pools and is charged again when the recycled budget is re-emitted | Low | 3.4 | Solved10/20/2026 | |
| HTSInteractable auto-association self-call never works for a contract on Hedera, so custodian HTS receipt depends only on the creator account setting | Low | 2.5 | Solved10/25/2026 | |
| Permissionless fee claims send protocol fees to HOLDING_ADDRESS instead of the immutable collector when FeeCollector cannot receive an HTS token | Low | 2.5 | Solved10/25/2026 | |
| xSAUCE tier discounts use the spot balance at keeper execution with no snapshot or holding period | Low | 2.5 | Risk Accepted10/24/2026 | |
| Collateral sum cap is checked on decreases, so lowering the cap below the live sum blocks closes and liquidations | Low | 2.5 | Risk Accepted10/25/2026 | |
| Push-feed answers are used without a minimum or maximum price bound | Low | 2.5 | Risk Accepted10/25/2026 | |
| GmOracleProvider takes the median over price entries that no signer verified | Low | 2.5 | Risk Accepted10/25/2026 | |
| Callback gas caps are not bounded by Hedera's 15M transaction gas limit, and liquidations pay a trader-chosen callback's maximum gas | Low | 2.5 | Partially Solved10/24/2026 | |
| Cross-chain GMX fee split uses spot staked-supply values that stake held across the read can change | Low | 2.5 | Risk Accepted10/25/2026 | |
| GlpMigrator lowers the GLP vault-wide fee while caller-chosen external calls run, with no on-chain mint gating | Low | 2.5 | Risk Accepted10/25/2026 | |
| A stale reference price feed stops liquidations and all other keeper-priced actions | Low | 2.5 | Risk Accepted10/24/2026 | |
| Multichain balances credit the bare account address, so a contract wallet's bridged funds belong to whoever controls that address on the destination chain | Low | 2.5 | Risk Accepted10/25/2026 | |
| FeeDistributor sends the weekly GMX fee to the reward tracker but sets the reward rate on the tracker's distributor | Low | 2.5 | Risk Accepted10/25/2026 | |
| Order execution does not settle borrowing and funding for swap-path markets before their pool amounts change | Low | 2.5 | Risk Accepted10/25/2026 | |
| A failed reward-token payout blocks the native HBAR payout for the same position and for dev rewards | Low | 2.5 | Risk Accepted10/20/2026 | |
| Outbound LP transfers ignore sender-paid HTS custom fees, so totalStaked and the native budget can become unbacked | Low | 2.1 | Risk Accepted10/20/2026 | |
| Router native-token helpers let any caller take HBAR that reached a router through a Hedera native transfer | Informational | 1.7 | Acknowledged10/25/2026 | |
| Hedera has no sequencer-uptime feed, so the Oracle liveness gate and the configured grace period never apply | Informational | 1.6 | Acknowledged10/24/2026 | |
| One undelayed FeeCollector owner key can claim and sweep all accrued protocol fees, contrary to the contract documentation | Informational | 1.5 | Acknowledged10/25/2026 | |
| FeeCollector single-step ownership with Hedera's two address forms can lock fee configuration, recovery and held fees permanently | Informational | 1.0 | Acknowledged10/25/2026 | |
| Native Hedera key rotation leaves the former key able to authorize relay orders | Informational | 1.0 | Acknowledged10/25/2026 | |
| Ownership transfers in one step and can be renounced | Informational | 1.0 | Acknowledged10/20/2026 | |
| Owner changes take effect immediately, including redirection of accrued dev rewards | Informational | 1.0 | Acknowledged10/20/2026 | |
| Mint-mode supply cap is not validated against the supply that HTS can mint | Informational | 1.0 | Acknowledged10/20/2026 | |
| External verifier configuration can interrupt Data Streams pricing | Informational | 0.8 | Acknowledged10/25/2026 | |
| Issuer freeze key on Hedera mainnet USDC 0.0.456858 can stop all USDC flows of a protocol custodian | Informational | 0.8 | Acknowledged10/25/2026 | |
| Account-signed relay actions accept only secp256k1 signatures, so ED25519 and key-list Hedera accounts cannot use them | Informational | 0.6 | Acknowledged10/25/2026 | |
| Deployed ChainReader queries Arbitrum ArbSys on Hedera, so its block helpers fail | Informational | 0.6 | Solved10/25/2026 | |
| Relay routers depend on ERC-2612 permit, which Hedera HTS tokens and WHBAR do not implement | Informational | 0.6 | Acknowledged10/25/2026 | |
| xSAUCE tier configuration has no cross-key checks, so a pro discount plus the affiliate floor above 100% blocks fee calculation and liquidation | Informational | 0.6 | Solved10/24/2026 | |
| Deposit fee has no upper bound | Informational | 0.5 | Acknowledged10/20/2026 | |
| emergencyWithdraw gives the exiting staker's unsettled-interval rewards to the remaining stakers | Informational | 0.5 | Solved10/20/2026 | |
| Vault, claim, fee and swap accounting assume exact HTS transfer amounts and do not detect custom fees or issuer wipes | Informational | 0.4 | Acknowledged10/25/2026 | |
| Atomic payment loops in FeeCollector and ContributorHandler let one refused HTS credit, or the FeeCollector child-record limit, block the whole batch | Informational | 0.3 | Acknowledged10/25/2026 | |
| xSAUCE TierLadder selects the higher tier id instead of the better tier, so an unconfigured id lowers an account's fee discount | Informational | 0.3 | Acknowledged10/24/2026 | |
| Swap order oracle check accepts a report timestamp equal to the order update time, which can precede the order on Hedera | Informational | 0.3 | Acknowledged10/25/2026 | |
| MarketLens batch reads fail as a whole on one unknown market and report a single-token swap impact pool twice | Informational | 0.3 | Acknowledged10/25/2026 | |
| Fee and dev recipients are validated only against the zero address, so a recipient that cannot receive HBAR blocks deposits and dev claims | Informational | 0.3 | Acknowledged10/20/2026 | |
| Unallocated HBAR reward budget has no recovery path | Informational | 0.3 | Acknowledged10/20/2026 | |
| Any caller can change ExternalHandler's Hedera token-association state through makeExternalCalls | Informational | 0.2 | Acknowledged10/25/2026 | |
| Oracle freshness checks have no upper bound for future timestamps, which Hedera block timestamps make routine | Informational | 0.2 | Acknowledged10/24/2026 | |
| add() calls the LP token before it records the pool and does not hold the reentrancy guard | Informational | 0.2 | Acknowledged10/20/2026 | |
| RewardStream settlement NatSpec overstates precision: rounding remainders are discarded | Informational | 0.0 | Solved10/20/2026 |
Findings & Tech Details#
Description
Proof of Concept
Recommendation
Description
Proof of Concept
Recommendation
Description
Proof of Concept
Recommendation
Description
Recommendation
Description
Recommendation
Remediation Comment
Description
Recommendation
Remediation Comment
Description
Recommendation
Description
Recommendation
Remediation Comment
Description
Recommendation
Remediation Comment
Description
Recommendation
Remediation Comment
Description
Recommendation
Remediation Comment
Description
Recommendation
Description
Recommendation
Description
Recommendation
Description
Recommendation
Description
Recommendation
Remediation Comment
Description
Recommendation
Remediation Comment
Description
Recommendation
Remediation Comment
Description
Recommendation
Remediation Comment
Description
Recommendation
Description
Recommendation
Remediation Comment
Description
Recommendation
Remediation Comment
Description
Recommendation
Remediation Comment
Description
Recommendation
Remediation Comment
Description
Recommendation
Remediation Comment
Description
Recommendation
Remediation Comment
Description
Recommendation
Remediation Comment
Description
Recommendation
Remediation Comment
Description
Recommendation
Remediation Comment
Description
Recommendation
Remediation Comment
Description
Recommendation
Remediation Comment
Description
Recommendation
Remediation Comment
Description
Recommendation
Remediation Comment
Description
Recommendation
Remediation Comment
Description
Recommendation
Remediation Comment
Description
Recommendation
Remediation Comment
Description
Recommendation
Remediation Comment
Description
Recommendation
Remediation Comment
Description
Recommendation
Remediation Comment
Description
Recommendation
Description
Recommendation
Remediation Comment
Description
Recommendation
Description
Recommendation
Remediation Comment
Description
Recommendation
Description
Recommendation
Remediation Comment
Description
Recommendation
Remediation Comment
Description
Recommendation
Remediation Comment
Description
Recommendation
Remediation Comment
Description
Recommendation
Remediation Comment
Description
Recommendation
Remediation Comment
Description
Recommendation
Remediation Comment
Description
Recommendation
Remediation Comment
Description
Recommendation
Remediation Comment
Description
Recommendation
Remediation Comment
Description
Recommendation
Disclaimer#
Halborn strongly recommends conducting a follow-up assessment of the project either within six months or immediately following any material changes to the codebase, whichever comes first. This approach is crucial for maintaining the project’s integrity and addressing potential vulnerabilities introduced by code modifications.
