Stratax Contracts

First Flight #57
Beginner FriendlyDeFi
100 EXP
View results
Submission Details
Impact: low
Likelihood: high
Invalid

IStratax defines calculateParams but implementation exposes calculateOpenParams (selector mismatch)

Description

  • Normal behavior: interface helper methods for leverage calculation should map 1:1 to implementation and selectors.

  • Issue: Interface declares calculateParams(TradeDetails) while implementation exposes calculateOpenParams(TradeDetails). Selectors differ and ABI compatibility is broken.

// src/interfaces/internal/IStratax.sol
@> function calculateParams(TradeDetails memory details)
@> external
@> view
@> returns (uint256 flashLoanAmount, uint256 borrowAmount);
// src/Stratax.sol
@> function calculateOpenParams(TradeDetails memory details)
@> public
@> view
@> returns (uint256 flashLoanAmount, uint256 borrowAmount)

Risk

Likelihood:

  • Reason 1 // Integrators and SDKs frequently bind to interfaces rather than concrete implementation.

  • Reason 2 // Selector mismatch is deterministic and independent of runtime state.

Impact:

  • Impact 1 // Read-path tooling for position sizing can fail.

  • Impact 2 // Broken UX and automation pipelines due to ABI mismatch.

Proof of Concept

This PoC compares selectors derived from the interface declaration and the actual implementation function. The mismatch proves tooling bound to IStratax.calculateParams cannot call Stratax.calculateOpenParams without custom adaptation.

// test/poc/StrataxVulnerabilities.t.sol
function testPoC_InterfaceDrift_CalculateParamsSelectorFailsAgainstImplementation() public view {
bytes4 implSelector = bytes4(
keccak256("calculateOpenParams((address,address,uint256,uint256,uint256,uint256,uint256,uint256))")
);
bytes4 interfaceSelector = IStratax.calculateParams.selector;
assertTrue(implSelector != interfaceSelector, "selectors should differ");
}

Recommended Mitigation

Unify naming/signatures across interface and implementation, then enforce selector equality tests at build time. This prevents runtime surprises for SDKs, frontends, and bots that rely on typed ABI bindings.

- function calculateParams(TradeDetails memory details) external view returns (...);
+ function calculateOpenParams(TradeDetails memory details) external view returns (...);
+ // or rename implementation to calculateParams and keep one canonical name.
+ Add compile-time ABI drift tests for interface vs implementation.
Updates

Lead Judging Commences

izuman Lead Judge 16 days ago
Submission Judgement Published
Invalidated
Reason: Out of scope
Assigned finding tags:

Interface discrepancy

Support

FAQs

Can't find an answer? Chat with us on Discord, Twitter or Linkedin.

Give us feedback!