CYBRO security record

Arbitrum, Base, Blast, BNB Chain, Ethereum, Polygon (POS)cybro.ioXGitHub

As of 25 Oct 2026, CYBRO has 4 audit reports by 2 security firms on Trustblock; the latest is by CertiK, dated 24 Feb 2025. Those reports list no open critical findings.

Critical findings
No open critical findings
Across 4 reports.
Open the latest report
Your label, live
Get the label for your site

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

Audits4

Newest first

AuditSecurity firmDateScopeCritical findingsReport
CYBRO Token - Audit 2Security firm: CertiKDate: Scope: Files named in the reportNo open critical findingsOpen · skynet.certik.com
Cybro V3Security firm: QuillAuditsDate: Scope: Files named in the reportNo open critical findingsOpen · quillaudits.com
CYBRO Token - AuditSecurity firm: CertiKDate: Scope: Files named in the reportNo open critical findingsOpen · skynet.certik.com
CYBROSecurity firm: CertiKDate: Scope: Files named in the reportNo open critical findingsOpen · skynet.certik.com

Findings23

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

SeverityOpenAcknowledgedFixed
Critical000
High201
Medium601
Low1111
HighInitial Token DistributionCYBRO Token - Audit · CertiK · 3 Jun 2024Open

All of the CYBRO tokens are sent to the `daoAddress`. This is a centralization risk because the owner of the `daoAddress` can distribute tokens without obtaining the consensus of the community. Any compromise to these addresses may allow a hacker to steal and sell tokens on the market, resulting in severe damage to the project.

Open the report
HighCentralization Related RisksCYBRO · CertiK · 9 Apr 2024Open

In the contract `Presale` the role `DEFAULT_ADMIN_ROLE` has authority over the functions shown in the diagram below. ![](https://accelerator-tasks-prod.acc.corp.certik.com/11ee-f283-c58a8050-8335-8b8b7b279897/diagrams/centralization_Presale-Presale-DEFAULT_ADMIN_ROLE.svg) - `updateProtocolWallet(address wallet)`: Updates the address of the protocol wallet, accessible only by the role with `DEFAULT_ADMIN_ROLE`. - `rescueFunds(IERC20 token, uint256 amount)`: Allows the rescue of funds (both native currency and ERC20 tokens) from the contract, accessible only by the role with `DEFAULT_ADMIN_ROLE`. Any compromise to the `DEFAULT_ADMIN_ROLE` account may allow the hacker to take advantage of this authority and update the sensitive settings and execute sensitive functions of the project In the contract `Presale` the role `OPERATOR_ROLE` has authority over the functions shown in the diagram below. ![](https://accelerator-tasks-prod.acc.corp.certik.com/11ee-f283-c58a8050-8335-8b8b7b279897/diagrams/centralization_Presale-Presale-OPERATOR_ROLE.svg) - `setStage(uint256 stageIterator_)`: Sets the current stage of the presale, accessible only by the role with `OPERATOR_ROLE`. - `updateTotalSold(uint256 amount)`: Updates the total amount of tokens sold, accessible only by the role with `OPERATOR_ROLE`. - `pause()`: Pauses the contract, halting new deposits, accessible only by the role with `OPERATOR_ROLE`. - `unpause()`: Unpauses the contract, allowing new deposits, accessible only by the role with `OPERATOR_ROLE`. Any compromise to the `OPERATOR_ROLE` account may allow the hacker to take advantage of this authority and update the sensitive settings and execute sensitive functions of the project `PresaleBSC` and `PresaleBlast` contracts inherit the `Presale` contract, which also inherited the privileged functions listed above.

Open the report
MediumRewards will forever be unclaimableCybro V3 · QuillAudits · 12 Feb 2025Open

No method for users or protocol to claim the incentives that Aave distributes to suppliers. E.g In Arbitrum, the aave rewards contract, currently this contract is still available for rewards claiming. However, since the contract does not include functionality to claim Aave incentives in its initial design, these rewards will forever be unclaimable. The lack of incentive claiming functionality may discourage users from using the vault contract, as they would miss out on additional earnings.

Open the report
MediumSmall ETH Amounts Are Rounded Down to Zero in _convertETHToUSDB()Cybro V3 · QuillAudits · 12 Feb 2025Open

The _convertETHToUSDB() function converts ETH to USDB using a price oracle. However, for small input amounts (e.g., 1000 wei), the computation rounds down to zero due to multiple divisions in a f ixed-point arithmetic setup. If volume is too small (e.g., 1000 wei), the result rounds to 0 due to Solidity’s integer division truncating decimals.

Open the report
MediumIncorrect Assumption of Token Price and PrecisionCYBRO · CertiK · 9 Apr 2024Open

The `_calculateAmount()` in the `Presale` and `PresaleBSC` contracts assumes that the price of tokens (`coinPrice`) is always 1 USD when `isStableToken` flag is true and that the precision (`PRECISION`) is always 6 or 18, depending on whether `STABLE_TOKEN_DECIMALS` or `TOKEN_PRECISION` is used. This assumption can lead to incorrect calculations and potential financial losses. If the price of the stable token deviates from 1 USD or if the precision is different from the assumed values, the function will calculate incorrect amounts for token transfers. This can result in users receiving more or fewer tokens than they should, potentially leading to financial discrepancies and loss of funds.

Open the report
MediumPotential Reentrancy IssueCYBRO · CertiK · 9 Apr 2024Open

The smart contract contains functions that transfer native coins (e.g., Ether) to external addresses. These transfers are performed using the low-level `call` function, which can potentially allow reentrancy issues if the recipient is a contract that has a fallback function. An attacker could exploit this vulnerability by creating a malicious contract that has a fallback function. When the `rescueFunds` or `depositCoinTo` function transfers native coins to the malicious contract, the fallback function could be triggered, allowing the attacker to re-enter the Presale contract and potentially withdraw more funds or disrupt the contract's state. In the `rescueFunds`, `depositCoinTo`, and `depositCoin` functions, lines like `(bool success, ) = payable(msg.sender).call{value: amount}("");` transfer native coins to the sender. If the sender is a malicious contract, it could exploit this transfer to re-enter the Presale contract.

Open the report
MediumRounding Down Issues in Division OperationsCYBRO · CertiK · 9 Apr 2024Open

The `Presale.sol` and `PresaleBSC.sol` smart contracts contain division operations that may lead to rounding down errors. Solidity's integer division rounds towards zero, which can result in loss of precision and unintended behavior, especially in financial calculations. In functions such as `_calculateAmount` and `_purchase`, division operations are used to calculate token amounts and values. If the division results in a non-integer value, Solidity will round down the result, potentially leading to discrepancies in token allocation and financial calculations.

Open the report
MediumTimelock mechanism is flawedCYBRO · CertiK · 9 Apr 2024Open

The timelock mechanism works this way: 1. The privilege role member (like `OPERATOR_ROLE`) calls a privileged function (like `updateProtocolWallet()`) for the first time. 2. `_timestamps` for that function is set to `block.timestamp + DEFAULT_DELAY`. 3. The privilege role member calls the function again after `DEFAULT_DELAY`. 4. The function updates the contract state and drops `_timestamps` for that function. This approach has several drawbacks: 1. The function arguments are not saved. As a result, the operator can "charge" all the timelocked functions **beforehand** with random values and bypass the waiting when execution is required. 2. Since the function arguments are not saved, the operator can demonstrate some intention, but after 12 hours execute **another** action. 3. If the function is executed before the timer passes, it refreshes the timer. This can be undesired. 4. Each timelocked function implements the same timelock logic. It is recommended to separate the timelock functionality from contract business logic. 5. `rescueFunds()` is re-enterable, so several currencies can be extracted before the `_timestamps` is zeroed.

Open the report
LowMissing lendingPoolAddresses on setLending Shares() could affect protocol accountingCybro V3 · QuillAudits · 12 Feb 2025Open

setLendingShares() which is called be manager role does not check if pool is added or has not been removed lendingPoolAddresses by the strategist role before updating the totalLendingShares, if this happens it could affect entire protocol accounting due to additional LendingShares for pool address that are not in the lendingPoolAddresses

Open the report
LowNo Restriction on Setting 100% Withdrawal Fee Despite Documentation LimitationsCybro V3 · QuillAudits · 12 Feb 2025Open

According to the project’s documentation, the withdrawal fee cannot be set to 100%, ensuring that users can always withdraw a portion of their funds. However, the setFees() function does not enforce this restriction, allowing the owner to set _withdrawalFee to 100%, effectively preventing users from withdrawing their assets

Open the report
Show 9 more
LowDependency on Third-Party Oracle for Coin Price FCYBRO · CertiK · 9 Apr 2024Open

The smart contract uses a third-party oracle (`COIN_PRICE_FEED`) to fetch the current coin price for calculating the amount of tokens to be transferred during deposits. This reliance on an external data source introduces a point of failure and potential security risks, such as manipulation of the oracle data. For example: 1. An attacker gains control over the oracle or manipulates the data feed. 2. The attacker alters the coin price data returned by the oracle. 3. Users of the contract receive an incorrect amount of tokens for their deposits, leading to financial losses. This will impact sensitive variable values in the contract, for example, in `_purchase` function, according to `uint256 usdInEth = 1 ether / coinPrice;`, the value of `usdInEth` will be directly related to the value of `coinPrice`, which is fetched from the oracle

Open the report
LowDifferent contracts used for different chainsCYBRO · CertiK · 9 Apr 2024Open

`PresaleBSC` is supposed to be deployed in BSC chain. It overrides `_depositChecksAndEffects()` and `_depositInteractions()`, however, the code is identical and can be omitted. The code can use `token.decimals()` and `COIN_PRICE_FEED.decimals()` to make it chain independent and ensure the calculations will be correct. In case the chain dependence can't be avoided `block.chainId` can be used to branch the execution. The stablecoin address can be provided as an argument to the deposit function and checked in the code that it is supported. Deploying different versions to different chains can lead to accidental mistakes.

Open the report
LowMissing Zero Address Validation in Constructor fCYBRO · CertiK · 9 Apr 2024Open

The smart contract constructors for `Presale` and `PresaleBlast` do not validate that the addresses provided for the token contracts (`usdcToken`, `usdtToken`, `usdbToken`, and `wethToken`) are not the zero address. This lack of validation could lead to undefined behavior if any of these addresses are set to the zero address, as the zero address is not a valid contract address.

Open the report
LowNumber representationCYBRO · CertiK · 9 Apr 2024Open

```solidity=54 stages.push(StageData(1e6, 75e5)); stages.push(StageData(15e5, 1e7)); stages.push(StageData(2e6, 175e5)); stages.push(StageData(25e5, 28e6)); ``` Numbers with different decimals are hard to read. Consider using the same, like: ```solidity=54 stages.push(StageData(1e6, 7.5e6)); stages.push(StageData(1.5e6, 10e6)); stages.push(StageData(2e6, 17.5e6)); stages.push(StageData(2.5e6, 28e6)); ``` ```solidity=77 _timestamps[0xe308a099] = 0; ``` `this.updateProtocolWallet.selector` can be used instead of the magic number.

Open the report
LowPrecision Issue in Emitted Event `AmountAndUSD`CYBRO · CertiK · 9 Apr 2024Open

The emitted event `AmountAndUSD` in the `_calculateAmount` function does not consider the precision of the calculated amount. This can lead to misunderstandings when interpreting the event data, as the values might not accurately represent the intended amounts due to the lack of precision adjustment. When the `_calculateAmount` function is called, it emits the `AmountAndUSD` event with `expectedAmount` and `coinPrice`. However, the `expectedAmount` is not adjusted for precision before being emitted. This can result in the event displaying a value that is not correctly scaled according to the token's decimals.

Open the report
LowRedundant codeCYBRO · CertiK · 9 Apr 2024Open

```solidity=211 token.safeTransferFrom(msg.sender, address(this), amount); token.safeTransfer(protocolWallet, spendedValue); if(chargeBack > 0) token.safeTransfer(msg.sender, chargeBack); ``` The code can be simplified to ```solidity=211 token.safeTransferFrom(msg.sender, protocolWallet, amount - chargeBack); ``` `spendedValue` is assumed to be equal to `amount - chargeBack` since `tokensToChargeBack = value - spendedValue`. `_purchase()` can be simplified to: ```solidity=235 if (amount > uint(crtStage.amount)) { // lowering the amount and closing the stage amount = uint(crtStage.amount); stageIterator++; emit StageUpdated(stageIterator); } totalSoldInUSD += amount * crtStage.cost; // with 8 decimals balances[to] += amount; totalTokensSold += amount; // returning actualSpent with original decimals uint decimals = address(token) == address(0) ? TOKEN_PRECISION : token.decimals(); return amount * crtStage.cost * 10 ** decimals / coinPrice; ``` The function should return the `actualSpent`.

Open the report
LowReferrer Restriction Issue in Deposit FunctionsCYBRO · CertiK · 9 Apr 2024Open

The deposit functions allow a user to specify a referrer address that can receive benefits from the deposit. However, there is no restriction in place to prevent the `referrer` from being the same as the `msg.sender` or the `to` address. This could potentially be exploited by users to claim referral benefits for their own deposits, which might not be the intended behavior. For example: 1. A user calls the `depositUSDC` function with their own address as the `referrer`. 2. The transaction succeeds, and the user receives referral benefits for their own deposit.

Open the report
LowTypos in variable nameCYBRO · CertiK · 9 Apr 2024Open

The smart contract contains a typo in the variable `spendedValue`, which should be `spentValue`. This does not affect the functionality of the contract but can lead to confusion and potential errors in future maintenance or updates.

Open the report
LowWrong destination in `rescueFunds()`CYBRO · CertiK · 9 Apr 2024Open

The contract always sends the funds to `protocolWallet`, however, in case of native tokens, `rescueFunds()` sends them to `msg.sender`.

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="cybro"
></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