OptionBlitz security record

Arbitrum, Ethereumoptionblitz.coXGitHub

As of 3 Nov 2026, OptionBlitz has 1 audit report on Trustblock, by CertiK, dated 6 Sep 2023. That report lists no open critical findings.

Critical findings
No open critical findings
In that report, 1 critical finding was reported. It is marked fixed by the firm that reported it. See the findings
Open the latest report
Your label, live
Get the label for your site

Record last updated . It holds audits, findings and contracts up to Nov 2026, and incidents up to Oct 2026. Trustblock does not review code.

Audits1

Newest first

AuditSecurity firmDateScopeCritical findingsReport
OptionBlitzSecurity firm: CertiKDate: Scope: Files named in the report1 critical finding, fixedOpen · skynet.certik.com

Findings53

Statuses are the security firm’s own, from each report.

SeverityOpenAcknowledgedFixed
Critical001
High015
Medium007
Low16023
LowCommented Out Code And TODO CommentsOptionBlitz · CertiK · 6 Sep 2023Open

Throughout the codebase there is commented out code and TODO comments. The lines are given for `StakingContract`, however, they exist throughout many of the other files in the codebase as well. The commented out code was not audited and any TODO comments were not considered during the audit.

Open the report
LowDivide Before MultiplyOptionBlitz · CertiK · 6 Sep 2023Open

Performing integer division before multiplication truncates the low bits, losing the precision of calculation. ```solidity=525 barrier = leverage.sub(Abdk._1).div(leverage).mul(assetPrice); ``` --- ```solidity=527 barrier = leverage.add(Abdk._1).div(leverage).mul(assetPrice); ```

Open the report
LowInconsistency With WhitepaperOptionBlitz · CertiK · 6 Sep 2023Open

In the whitepaper (see [https://www.optionblitz.co/static/media/optionblitz_whitepaper.ce295a0d387dd3ce94b9.pdf](https://www.optionblitz.co/static/media/optionblitz_whitepaper.ce295a0d387dd3ce94b9.pdf)) it states: "In the case of Optionblitz, 5% of any tokens which are un-staked will be collected as fees and dedicated towards buyback & LP. Since the fees are already collected in LP tokens, those tokens would just directly be burned." However, when `withdraw()` is called and tokens are un-staked only `BLX` is subjected to a 5% fee and the fee is taken in BLX, which is not an LP token, and then burned.

Open the report
LowLocal Variable ShadowingOptionBlitz · CertiK · 6 Sep 2023Open

A local variable is shadowing another component defined elsewhere. This means that when the contract accesses the variable by its name, it will use the one defined locally, not the one defined in the other place. The use of the variable may lead to unexpected results and unintended behavior. ```solidity=88 constructor(address _trustedForwarder, address _usdToken, address _blxToken) ERC2771Context(_trustedForwarder) ``` - Local variable `_trustedForwarder` in `StakingContract.constructor` shadows the variable `_trustedForwarder` in `ERC2771Context`. --- ```solidity=95 constructor(address _trustedForwarder, address _usdToken, address _blx, address _treasury) ERC2771Context(_trustedForwarder) { ``` - Local variable `_trustedForwarder` in `Affiliate.constructor` shadows the variable `_trustedForwarder` in `ERC2771Context`.

Open the report
LowMisleading Variable NameOptionBlitz · CertiK · 6 Sep 2023Open

The functions `setDisallowDerivative()` take a boolean value named `allowed` as a parameter to allow or disallow a specific derivative: - if `allowed` is true then the derivative is disallowed; - if `allowed` is false then the derivative is allowed; This is counterintuitive and could potentially lead to unexpected mistakes when allowing or disallowing a derivative.

Open the report
LowNo minimal amount for optionsOptionBlitz · CertiK · 6 Sep 2023Open

In `OptionBase` is defined `minBet` and declared `_checkMinInvestment()`, this function is defined in the options contracts allowing to set `minBet` to any value, however `_checkMinInvestment()` and `minBet` are never used for check purposes meaning that no minimum amount is required to bet.

Open the report
LowNumbers InconsistencyOptionBlitz · CertiK · 6 Sep 2023Open

In `OptionAmerican`, the following numbers declarations are expected to correspond to specific percentages: ```solidity=59 int128 public commissionRate = int128(18446744073709552); // 1/1000 = 0.1 percent int128 public commissionRateBLX = int128(138350580552821637) / 10; //0.075 percent int128 public constant DEFAULT_PROFIT_FACTOR = int128(22136092888451461120); // 1.2 ``` For `commissionRate`, `int128(18446744073709552)` seems to be the exact number rounded up: `18446744073709551.616`. \ For `commissionRateBLX`, `int128(138350580552821637)` seems to be the exact number rounded down: `138350580552821637.12`. \ For `DEFAULT_PROFIT_FACTOR`, `int128(22136092888451461120)` seems incorrect as the exact number would be `22136092888451461939.2`.

Open the report
LowPotential Divide by ZeroOptionBlitz · CertiK · 6 Sep 2023Open

Performing division by zero would raise an error and revert the transaction. The `Formula` contract is made to be used by other contracts to do specific computations, currently, the entry points on these functions prevent having a division by zero, however for future development, this could cause unexpected mistakes as the new contracts using the formulas might create new entry points, moreover, the error message returned when dividing by zero might be too generic and be less helpful when trying to trace the failure of a transaction. --- ```solidity=75 int128 result = S.div(K); ``` The expression `S.div(K)` may divide by zero. Its divisor has an estimated interval [-170141183460469231731687303715884105728, 170141183460469231731687303715884105727]. --- ```solidity=77 result = result.div(hv); ``` The expression `result.div(hv)` may divide by zero. Its divisor has an estimated interval [-170141183460469231731687303715884105728, 170141183460469231731687303715884105727]. --- ```solidity=92 int128 result = S.div(K); ``` The expression `S.div(K)` may divide by zero. Its divisor has an estimated interval [-170141183460469231731687303715884105728, 170141183460469231731687303715884105727]. --- ```solidity=94 result = result.div(hv); ``` The expression `result.div(hv)` may divide by zero. Its divisor has an estimated interval [-170141183460469231731687303715884105728, 170141183460469231731687303715884105727]. --- ```solidity=116 d1.neg().CND() .mul(S).div(K) ``` The expression `d1.neg().CND().mul(S).div(K)` may divide by zero. Its divisor has an estimated interval [-170141183460469231731687303715884105728, 170141183460469231731687303715884105726]. --- ```solidity=525 barrier = leverage.sub(Abdk._1).div(leverage).mul(assetPrice); ``` The expression `leverage.sub(Abdk._1).div(leverage)` may divide by zero. Its divisor has an estimated interval [-170141183460469231731687303715884105728, 170141183460469231731687303715884105727]. --- ```solidity=527 barrier = leverage.add(Abdk._1).div(leverage).mul(assetPrice); ``` The expression `leverage.add(Abdk._1).div(leverage)` may divide by zero. Its divisor has an estimated interval [-170141183460469231731687303715884105728, 170141183460469231731687303715884105727]. --- ```solidity=539 notional = investment.div(divider); ``` The expression `investment.div(divider)` may divide by zero. Its divisor has an estimated interval [-170141183460469231731687303715884105728, 170141183460469231731687303715884105727]. --- ```solidity=542 notional = investment.div(divider); ``` The expression `investment.div(divider)` may divide by zero. Its divisor has an estimated interval [-170141183460469231731687303715884105728, 170141183460469231731687303715884105727]. --- ```solidity=133 _res = _res.div(optionPrice); ``` The expression `_res.div(optionPrice)` may divide by zero. Its divisor has an estimated interval [-170141183460469231731687303715884105728, 170141183460469231731687303715884105727]. --- ```solidity=112 int128 K = _1.div(x.abs().mul(_b1).add(_1)); ``` The expression `_1.div(x.abs().mul(_b1).add(_1))` may divide by zero. Its divisor has an estimated interval [-170141183460469231731687303715884105728, 170141183460469231731687303715884105727].

Open the report
LowRedundant StatementOptionBlitz · CertiK · 6 Sep 2023Open

One or more statements do not affect the functionality of the codebase and appear to be either leftovers from test code or older functionality. ```solidity=655 account; ``` --- ```solidity=656 amount; ``` --- ```solidity=661 account; ``` --- ```solidity=662 amount; ``` --- ```solidity=667 account; ``` --- ```solidity=463 N_lot; ``` --- ```solidity=51 _dataVersion; ``` --- ```solidity=61 _data; ``` In addition, the state variable `volatilityFactor` and the function `setFactorF())` do not affect the functionality of the codebase and appear to be either remnants of test code or older functionality.

Open the report
LowUnchecked Return ValueOptionBlitz · CertiK · 6 Sep 2023Open

In `DoubleNoTouch.bet_close()`, in the following snippet: ```sol=92 historyVolatility.parsePythPrice{value: msg.value}( b.derivativeId, minPriceUpdateData, // price at time open b.timeOpen, maxPriceUpdateData, // price at time close b.timeClose); ``` The values returned by `historyVolatility.parsePythPrice()` are never checked.

Open the report
Show 6 more
LowUnnecessary CastingOptionBlitz · CertiK · 6 Sep 2023Open

The linked lines above recast a variable to the same casting.

Open the report
LowUnnecessary Use of SafeMathOptionBlitz · CertiK · 6 Sep 2023Open

The `SafeMath` library is used unnecessarily. With Solidity compiler versions 0.8.0 or newer, arithmetic operations will automatically revert in case of integer overflow or underflow. ```solidity=9 using SafeMath for uint; ``` - `SafeMath` library is used for `uint256` type in `LiquityMath` contract. ```solidity=40 uint prod_xy = x.mul(y); ``` - `SafeMath.mul` is called in `decMul` function of `LiquityMath` contract. *Note: Only a sample of 2 `SafeMath` library usage in this contract (out of 11) are shown above.* --- ```solidity=15 library SafeMath { ``` - An implementation of `SafeMath` library is found. --- ```solidity=30 using SafeMath for uint256; ``` - `SafeMath` library is used for `uint256` type in `StakingRewards` contract. --- ```solidity=30 using SafeMath for uint256; ``` - `SafeMath` library is used for `uint256` type in `StakingRewards` contract. ```solidity=105 return rewardPerTokenStored.add( lastTimeRewardApplicable() .sub(lastUpdateTime) .mul(rewardRate) .mul(PRECISION) .div(_totalSupply) ); ``` - `SafeMath.sub` is called in `rewardPerToken` function of `StakingRewards` contract. *Note: Only a sample of 2 `SafeMath` library usage in this contract (out of 7) are shown above.* --- ```solidity=20 using SafeMath for uint256; ``` - `SafeMath` library is used for `uint256` type in `StakingSnapshot` contract. ```solidity=140 Reward memory RewardNumerator = Reward( _rewards.amount.mul(DOUBLE_PRECISION).add(lastRewardError_Offset.amount)); ``` - `SafeMath.mul` is called in `_computePerUnitValue` function of `StakingSnapshot` contract. *Note: Only a sample of 2 `SafeMath` library usage in this contract (out of 29) are shown above.*

Open the report
LowUnsafe Type CastingOptionBlitz · CertiK · 6 Sep 2023Open

In the contract `HistoryVolatility`, the functions `updatePriceFromPyth()` and `getPriceFromPythPrice()` both performs one of the three following operations: 1. `uint64(uint256(uint64(pythPrice.price)) * (10 ** (6 - expo)))` 2. `uint64(uint256(uint64(pythPrice.price)) / (10 ** (expo - 6)))` 3. `uint64(uint256(uint64(pythPrice.price)) * (10 ** (expo + 6)))` since the type of `pythPrice.price` is `int64`, these direct type castings could, in theory, cause overflow and/or underflow.

Open the report
LowUnused EventOptionBlitz · CertiK · 6 Sep 2023Open

Some events are never emitted, which can lead to confusion and code maintainability issues. --- ```solidity=242 event Staked(address indexed account, uint256 amount); ``` - `Staked` is declared in `StakingRewards` but never emitted. --- ```solidity=243 event Withdrawn(address indexed account, uint256 amount); ``` - `Withdrawn` is declared in `StakingRewards` but never emitted. --- ```solidity=245 event GainLossSettled(address indexed account, uint gain, uint loss); ``` - `GainLossSettled` is declared in `StakingRewards` but never emitted.

Open the report
LowUnused Return VariableOptionBlitz · CertiK · 6 Sep 2023Open

The contract contains a return variable that is never assigned or used, which can lead to unintended behavior or confusion about the expected output of the function. ```solidity=47 function _checkMonthPassed(address user) internal returns (bool newPeriod) { ``` - The function `_checkMonthPassed` implicitly returns and never writes the return variable `newPeriod`.

Open the report
LowUnused State VariableOptionBlitz · CertiK · 6 Sep 2023Open

A state variable is not used in the codebase. This can lead to incomplete functionality or potential vulnerabilities if this variable is expected to be utilized. --- Variable `_0_4` in `Formulas` is never used in `Formulas`. ```solidity=22 int128 private constant _0_4 = int128(7378697629483821056); // 0.4 ``` ```solidity=12 contract Formulas is IFormulas, Ownable { ```

Open the report

Contracts

No deployed address is recorded for these audits.

The reports name a repository or files. Open a report to see its scope.

The repositories and files the reports name

Show this on your site

Is this your project? Show this record on your own website. The label states what the record holds, links to this page and updates by itself. It is free and needs no sign-in.

Content

Facts

Automatic: the three strongest facts of this project’s own record (its last audit and two more), highlighted. They update with the record. Picking a fact turns Automatic off.

Fixed as
Language

Style

Layout
Theme
Accent
Corners

Format

Size
Date
Embed as
HTML
<head>
<script src="https://widget.trustblock.run/project-widget.min.js" defer></script>
</head>
<body>
<div
data-tb-project-widget
data-tb-project-slug="optionblitz"
></div>
</body>

Paste the code where the label should appear. It uses no API credit and updates by itself.

Something wrong on this page? A missing report, a wrong date, a finding that was fixed since. Tell us and we check it against its source.

Tell us