BEBE security record

As of 30 Oct 2026, BEBE has 3 audit reports by 1 security firm on Trustblock; the latest is by CertiK, dated 19 Mar 2025. Those reports list no open critical findings.

Critical findings
No open critical findings
Across the 3 reports, 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 and findings, contracts and incidents up to Oct 2026. Trustblock does not review code.

Audits3

Newest first

AuditSecurity firmDateScopeCritical findingsReport
Be Chain - ValidatorSmartContractSecurity firm: CertiKDate: Scope: Files named in the reportNo open critical findingsOpen · skynet.certik.com
Beyond Gaming Chain - ValidatorSmartContractSecurity firm: CertiKDate: Scope: Files named in the reportNo open critical findingsOpen · skynet.certik.com
BEBESecurity firm: CertiKDate: Scope: Not recorded (see the report)1 critical finding, fixedOpen · skynet.certik.com

Findings49

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

SeverityOpenAcknowledgedFixed
Critical001
High103
Medium008
Low11025
CriticalDenial Of Service Attack Due To Lack Of Access ReBEBE · CertiK · 20 Aug 2024Fixed

The functions `addIncomePool()` and `confirmAddIncomePool()` do not have any access restriction and can be called by anyone. This can allow a attacker to call these with an `incomeDate` that would be used by the `BEBEMiningManager`. By calling these before the `BEBEMiningManager` it will cause all calls to `mine()` in the `BEBEMiningManager` to revert once the `_nextMiningDate` reaches the `incomeDate` used by the attacker. If this is done after the `BEBEMiningManager` has mined some amount of tokens, then `_nextMiningDate` will no longer be able to be updated. This will make it impossible for any further funds to be mined by the `BEBEMiningManager` and require a new contract to be deployed. The need to deploy a new contract for users to interact with would cause damage to the reputation of the protocol and prevent users from having access to funds at the expected time.

Open the report
HighPotential Underflow/Cast Issue in `_requireValidSBe Chain - ValidatorSmartContract · CertiK · 19 Mar 2025Fixed

Within the `ValidatorSmartContract`, the `_requireValidSignatures` function contains a logic bug involving the line: ```solidity uint16 validatorBit = uint16(1 << info.index); ``` This line attempts to track which root validators have signed a particular action using a 16-bit bitmap. The contract stores a list of validators in the `validators` array. Each validator has an associated `ValidatorInfo` struct, which includes a `uint16` index. This index is simply the validator’s position in the `validators` array. When a new root validator is added (via `addRootValidator`), `info.index` is set to the new `validators.length - 1`. This value can be between 0 and 254. Because a validator’s `info.index` can exceed 15, shifting `1 << info.index` and then casting to `uint16` truncates values above 15 bits to 0. Consequently, potential double-signature from two different root validators both above index 15 could map to 0 in the mask, so the code might not detect that they are distinct signers. (Though in practice it sees 0 for both and just checks `signersBitmap & 0 == 0`, so the second signature is also “accepted” but increments approvals incorrectly—leading to under- or over-counting.) This issue directly compromises the core security guarantee of multi-signature authorization among root validators. An action may fail to be authorized, or the contract may count incorrect signers.

Open the report
HighCentralization Related RisksBEBE · CertiK · 20 Aug 2024Fixed

### GameStakerManager In the contract `GameStakerManager` the role `_owner` has authority over the function `setStakeEnabled()`. Any compromise to the `_owner` account may allow the hacker to take advantage of this authority and set the `_stakeEnabled` to true to enable staking when it is not intended to be enabled or set it to false to cause a denial of service. In addition they can transfer ownership to an account they have the sole control over or renounce the ownership so that it cannot be recovered. --- ### BEBEMiningManager In the contract `BEBEMiningManager` the role `_owner` has authority over the following functions: - `setMiningEnabled()` - `setStartMiningDate()` Any compromise to the `_owner` account may allow the hacker to take advantage of this authority and do the following: - Set the `_startMiningDate` to any date provided `mine()` has not successfully been called yet. An attacker can use this to cause a denial of service and require the contract to be redeployed or can make it so that mining is started sooner than expected so that they receive greater rewards. - Enable or disable mining. An attacker can use this to cause a denial of service and require the contract to be redeployed or can make it so that mining is started sooner than expected so that they receive greater rewards. In addition they can transfer ownership to an account they have the sole control over or renounce the ownership so that it cannot be recovered. --- ### BEBEStakeManager In the contract `BEBEStakeManager` the role `_owner` has authority over the following functions: - `setMiningManager()` - `setStakeEnabled()` - `importStake()` Any compromise to the `_owner` account may allow the hacker to take advantage of this authority and do the following: - Call `setStakeEnabled()` to enable staking when it is not intended to be enabled or to disable it to cause a denial of service. - Call `importStake()` to stake themselves for a large amount in order to capture all rewards for themselves or call it on accounts that already have stakes with a smaller staked amount in order to make it so they receive less income than they should be entitled to. In addition, `importStake()` may be called with unexpected inputs causing a misallocation of income. More details on this can be found in the finding **`importStake()` Can Cause Misallocation Of income** - Call `setMiningManager()` to set the mining manager to a malicious contract to take advantage of the privileges outlined below. In addition they can transfer ownership to an account they have the sole control over or renounce the ownership so that it cannot be recovered. --- In the contract `BEBEStakeManager` the role `_miningManager` has authority over the following functions: - `updateIncomePool()` Any compromise to the `_miningManager` account may allow the hacker to take advantage of this authority and either perform a denial of service by not calling the update income pool function or to update the income pool without transferring funds so that some users will be unable to claim their allocated tokens. In the worst case scenario an attacker can call this function with a large amount so that they can claim all tokens held in the contract for themselves.

Open the report
HighIf `_bebe` Allows Reentrancy All Funds Can Be LosBEBE · CertiK · 20 Aug 2024Fixed

If the token `_bebe` utilizes hooks or makes an external call during transfer that an attacker can use for reentrancy, then an attacker can utilize it to continually call `releaseStake()` to steal all `_bebe` tokens held by the contract. It should be noted that in other contracts calls to `_bebe` may also be used for reentrancy if they make an external call that can be used by an attacker.

Open the report
Medium`queueAction` Can Exhaust Other SignatureBe Chain - ValidatorSmartContract · CertiK · 19 Mar 2025Fixed

The `queueAction` function allows the root validator to initiate `TimedAction` data for subsequent `executeAction`. The `actionType` in `queueAction` can be set any value, which is different from other functions, such as `APPROVE_VALIDATOR` in `approveValidator`. ```solidity=373 function queueAction( string memory actionId, string memory actionType, uint256 timeoutBlock, address targetAddress, ContractState newState, bytes[] memory signatures, bytes calldata _data ) external nonReentrant onlyRootValidator { if (_usedActionIds[actionId]) revert DuplicateActionError(); _usedActionIds[actionId] = true; _requireValidSignatures( actionId, actionType, timeoutBlock, targetAddress, newState, signatures ); ... } ``` If a one root validator disagrees with an `actionId` for functions such as `approveValidator` or `removeRootValidator`, that validator can front-run the function and consume the `actionId` in the `queueAction`. Consequently, functions like `approveValidator` or `removeRootValidator` will be reverted. This allows the root validator to veto an `actionId` easily.

Open the report
MediumMissing Critical Parameters in Signature MessageBe Chain - ValidatorSmartContract · CertiK · 19 Mar 2025Fixed

In the `ValidatorSmartContract`, the functions that require multiple signatures (e.g., `approveValidator`, `disapproveValidator`, `addRootValidator`, `removeRootValidator`, `revokeValidator`, and `changeState`) only include `actionId` and `actionType` in the signed message. They do not include critical parameters such as the target `validator` address or the new contract `state`. This allows anyone who holds valid signatures for a certain (`actionId`, `actionType`) pair to reuse those signatures to carry out the same action type but on any arbitrary parameter.

Open the report
MediumMissing Validation to `_data` in `queueAction`Be Chain - ValidatorSmartContract · CertiK · 19 Mar 2025Fixed

In the `queueAction` function, the `_data` parameter can be set to any value without validation, which may threaten the system in the subsequent `executeAction`. For example, the `data` for `changeState` can be replaced by the `executeEmergencyWithdraw`.

Open the report
Medium`computeTotalPower()` May Cause `mine()` To ExceeBEBE · CertiK · 20 Aug 2024Fixed

The function `computeTotalPower()` iterates through all stakes to determine the amount that was staked prior to the input `incomeDay`. However, if there have been no stakes for the day during a mining, then `mine()` will call `computeTotalPower()`. It is possible for the number of stakers to be so large that this will cause the call to `mine()` to exceed the block gas limit. There is no method to unstake, so that this will prevent any further tokens from being mined and distributed as income. Note, that the removal of the minimum stake increases the likelihood of an attacker utilizing this to cause a denial of service. In particular, an attacker could stake 1 token with different accounts in order to increase the amount of stakes so that it is high enough that calls to `mine()` for a day where there are no stakes would exceed the block gas limit. As only 1 token needs to be staked, this decreases the cost of the attack significantly. However, this requires thousands of stakes, so the cost to the attacker will be high making this attack less likely. In addition, considering the large amount of stakes required it is unlikely to be reached naturally so we give this a *Medium* severity.

Open the report
MediumBonus Multiple Does Not Match SpecificationBEBE · CertiK · 20 Aug 2024Fixed

The comment above the function `getBonusMultiple()` states that the expected output should range between 0 and 12. However, to be a valid duration, the duration must be less than or equal to 360. Thus the output of this function is less than or equal to `360/30/10 = 1`, so that it will only return 0 or 1. This can result in users not receiving the bonus that they should be entitled to. However, as the use of the `bonusMultiple` is not clear within the scope of this audit we cannot be sure of this and we give this a *Medium* severity.

Open the report
MediumDuration Of Zero Will Be ValidBEBE · CertiK · 20 Aug 2024Fixed

The function `isValidStakeDuration()` is used to determine if a users input stake duration should be allowed. As the comment above the function states, the intended supported durations should be "1 for 1 day, and multiples of 30 for monthly duration until 12 months". However, the logic will also return true for a duration of zero. This is because the function uses the logic: ```solidity return (duration == 1 || (duration <= 360 && duration % 30 == 0)); ``` And `0 <= 360` and `0 % 30 == 0`. Considering that both a duration of 1 and a duration of 0 would give the same bonus multiple, it is possible that this may allow a user who staked and released their stake in the same transaction to receive the same amount of rewards as a user who staked their tokens for 1 day. However, as the use of the `bonusMultiple` is not clear within the scope of this audit we cannot be sure of this and we give this a *Medium* severity.

Open the report
Show 10 more
MediumIf `mine()` Is Called Prior To First Stake The MiBEBE · CertiK · 20 Aug 2024Fixed

The function `mine()` transfers tokens to the `BEBEStakeManager` manager when it is called. This amount is then stored in the `_incomePools[incomeDay].poolAmount` to distribute proportionally to users who have staked in the contract. However, if there are no stakes in the contract for that day, then this amount will not be allocated to any users and will be locked in the contract.

Open the report
MediumIf User Does Not Claim Income For Extended PeriodBEBE · CertiK · 20 Aug 2024Fixed

The function `claimIncome()` iterates through a for loop of all mining dates from the stored `nextClaimDate` of the stake to the `_lastPoolProcessDate`. However, `mine()` will be able to be called over 200,000 times before it distributes its 9.5 trillion tokens. In the extreme scenario a user may never claim their tokens until after all tokens are mined, in which case the for-loop will iterate over 200,000 times which would cause the gas cost of the transaction to exceed the block gas limit and revert. In general, if a user goes for too long without calling `claimIncome()`, the for-loop may require iterating enough times that it will exceed the block gas-limit. In these scenarios the user will be unable to claim their income.

Open the report
LowCheck Effect Interaction Pattern ViolatedBe Chain - ValidatorSmartContract · CertiK · 19 Mar 2025Fixed

The following codes in the function `executeAction()` do not meet the Checks-Effects-Interactions pattern. And there also exits a limited reentrancy issue. ```solidity=476 _timelockActionExecuting = true; (bool success, bytes memory returnData) = address(this).call( action.data ); _timelockActionExecuting = false; ... action.executed = true; ``` One edge case could be when the `EMERGENCY_WALLET` is a contract and `address(this).call` is used in the `executeEmergencyWithdraw` function. During the execution of the `EMERGENCY_WALLET.receive` function, it can call functions that do not have the `nonReentrant` modifier, for example, the `changeState` function. ```solidity function _safeTransfer(address to, uint256 amount) private { if (to == address(0) || to == address(this)) revert InvalidRecipientError(); if (address(this).balance < amount) revert InsufficientBalanceError(); (bool success, ) = payable(to).call{value: amount}(""); if (!success) { emit TransferFailed(to, amount); revert TransferFailedError(); } } ```

Open the report
LowEvent Not IndexedBe Chain - ValidatorSmartContract · CertiK · 19 Mar 2025Fixed

If an event is not indexed in a smart contract, it means that the event's parameters are not tagged with the `indexed` keyword. This has implications for how the event data can be searched and filtered when looking through blockchain logs. Without indexing, the event will still emit the data as part of the transaction log, but users won't be able to query for these events using the parameters. They'll have to retrieve the entire set of logs and manually sift through them to find events with the specific data. This can be less efficient and more time-consuming, especially on a blockchain with a high volume of transactions and events.

Open the report
LowMissing Emit EventsBe Chain - ValidatorSmartContract · CertiK · 19 Mar 2025Fixed

There should always be events emitted in the sensitive functions that are controlled by centralization roles.

Open the report
LowNo Cooldown When Admin Revokes a ValidatorBe Chain - ValidatorSmartContract · CertiK · 19 Mar 2025Fixed

If a validator is revoked by the admin, there is no enforced waiting period at all; the user can claim the pending stake immediately. By contrast, if the validator initiates their own exit, they must wait for the full `WITHDRAW_COOLDOWN` before claiming. It is inconsistent and can be unfair from the validator’s perspective. If the admin can instantly revoke you (maybe maliciously or by mistake) and you can immediately withdraw, it might sound good for you. On the other side, if an honest validator wants to leave, they must wait for the cooldown.

Open the report
LowNo Expiration Check for SignatureBe Chain - ValidatorSmartContract · CertiK · 19 Mar 2025Fixed

The signature has no timeout detection or expiration check. Attackers can hoard signatures of some operations rather than execute them, which may threaten the system in the future.

Open the report
LowNo Expiration Check in `executeAction`Be Chain - ValidatorSmartContract · CertiK · 19 Mar 2025Fixed

The `TimedAction` lacks timeout detection or expiration checks. Attackers can hold `TimedAction` for certain operations instead of executing them immediately once the `action.executeAfter` condition is met, which could pose a risk to the system in the future. ```solidity function executeAction( string memory actionId ) external nonReentrant onlyRootValidator { ... if (!success) { // Extract revert reason from return data if (returnData.length > 0) { // Bubble up the revert reason assembly { let returndata_size := mload(returnData) revert(add(32, returnData), returndata_size) } } else { revert ActionExecutionFailed(); } } action.executed = true; emit ActionExecuted(actionId); } ``` Furthermore, if the `executeAction` initially fails due to a revert, it can be re-executed later without any expiration checks. The `timeoutBlock` is used solely for `queueAction` and has no impact on `executeAction`.

Open the report
LowPotential Hash Collision Caused by Dynamic VariabBe Chain - ValidatorSmartContract · CertiK · 19 Mar 2025Fixed

Using `abi.encodePacked()` with multiple variable-length arguments can lead to hash collisions. This function packs all elements in order, regardless of whether they're part of an array, allowing for the possibility of moving elements between arrays without changing the overall order, thus returning the same encoding. ```solidity abi.encodePacked( "\x19Ethereum Signed Message:\n32", // Prefix for Ethereum signed messages keccak256( abi.encodePacked( actionId, actionType ) ) ) ); ``` For instance, if you have: - actionId = "123" and actionType = "ARV". - actionId = "123A" and actionType = "RV". These two example will yield the same message hash for "123ARV".

Open the report
LowRedundant Code ComponentsBe Chain - ValidatorSmartContract · CertiK · 19 Mar 2025Fixed

The linked statements do not affect the functionality of the codebase and appear to be either leftovers from test code or older functionality.

Open the report
Show 10 more
LowUnderscore Prefix For Non-External VariablesBe Chain - ValidatorSmartContract · CertiK · 19 Mar 2025Fixed

The current contract doesn't follow the naming convention specified by [Solidity DOC](https://docs.soliditylang.org/en/v0.8.20/style-guide.html#underscore-prefix-for-non-external-functions-and-variables): The state variable `variable` is used as `private` or `internal` and is not exposed publicly. It should have `an underscore prefix` like `_varaible`. Leading underscores allow you to immediately recognize the intent of such functions, but more importantly, if you change a function from non-external to external (including public) and rename it accordingly, this forces you to review every call site while renaming. This can be an important manual check against unintended external functions and a common source of security vulnerabilities (avoid find-replace-all tooling for this change).

Open the report
LowUnsafe Cast from `msg.value` to `stake`Be Chain - ValidatorSmartContract · CertiK · 19 Mar 2025Fixed

The contract constructor accepts `_requiredStake` as a uint256 but restricts it only to the range `> 0 && <= type(uint128).max`. ```solidity if (_requiredStake == 0 || _requiredStake > type(uint128).max) revert InvalidStakeError(); ``` The `ValidatorInfo` struct defines the stake field as a `uint96`. ```solidity struct ValidatorInfo { uint96 stake; uint32 registeredTime; uint32 activatedTime; uint16 index; ValidatorType validatorType; } ``` If `_requiredStake` (and consequently `msg.value` sent during registerValidator) is allowed to go beyond `type(uint96).max`, the assignment `uint96(msg.value)` in `registerValidator` will truncate the value. That means any overflow beyond 96 bits is discarded, leading to an incorrect (reduced) recorded stake amount. ```solidity _validatorInfo[msg.sender]= ValidatorInfo({ stake: uint96(msg.value), registeredTime:uint32(block.timestamp), activatedTime:uint32(0), index:uint16(0), validatorType: ValidatorType.WAITING }); ```

Open the report
LowUser-Defined GettersBe Chain - ValidatorSmartContract · CertiK · 19 Mar 2025Fixed

The linked functions are equivalent to the compiler-generated getter functions for the respective variables.

Open the report
Low`_startMiningDate` May MismatchBEBE · CertiK · 20 Aug 2024Fixed

The `_startMiningDate` in the `BEBEMiningManager` contract is designed to be indicate when the first call to `mine()` can be made. It is set to any value in the `constructor()` and can be set to any value via `setStartMiningDate()` as long as `mine()` has not yet been successfully called. The `_startMiningDate` in the `BEBEStakeManager` contract is used to determine the first date that `mine()` should be called so that it does not check that the previous day has had its income set. It is set to any value in the `constructor()` and can be set to any value via `setStartMiningDate()`. These values are intended to match. For example if the `_startMiningDate` in the `BEBEStakeManager` is a timestamp of a day prior to the `BEBEStakeManager` of the `BEBEMiningManager`, then calls to `mine()` will revert as the check that the previous days are populated will not pass.

Open the report
LowComplex Reward MechanismBEBE · CertiK · 20 Aug 2024Fixed

The reward mechanism involving `totalPower` and storing the income for each `incomeDate` is complex and creates many fringe cases that must be handled carefully and can be hard to implement. Many findings in this report are related to this reward mechanism, so it may be beneficial to explore alternative mechanisms that are easier to implement and maintain.

Open the report
LowCustom Errors Can Be UsedBEBE · CertiK · 20 Aug 2024Fixed

From Solidity `v0.8.4`, there are more gas-efficient ways to explain to users why an operation failed than through strings. Using custom errors can significantly reduce the size of the deployed bytecode and reduce the gas cost when calls revert.

Open the report
LowDiscussion On BEBE TokenBEBE · CertiK · 20 Aug 2024Fixed

Can you clarify if the BEBE token takes a fee on transfer. In particular, some functions use the input amount during the transfer for bookkeeping. However the function `confirmAddIncomePool()` checks that the input amount is transferred.

Open the report
LowFinal `mine()` Will RevertBEBE · CertiK · 20 Aug 2024Fixed

The function `mine()` is intended to be able to be called until all 9.5 trillion tokens are mined. Each iteration of `mine()` is intended to distribute the remaining amount of tokens to be mined divided by 5700, with a certain percentage given to the `_stakingManager` and the rest to the `_gameIncomePoolAddress`. However, at some point there will be a remaining amount of tokens that is less than `5700` so the calculated amount to mine would be zero, this is handled in the code as follows: ```solidity dailyMintAmount = _remainingTokens / DIVISOR; //handle the last mint if (dailyMintAmount == 0) { dailyMintAmount = _remainingTokens; } ``` Note that prior to this stage the `dailyMintAmount` that is calculated will be 1 token. As the `stakeShare` is calculated as a percentage of this, the `stakeShare = 0` and `gameIncomePoolShare = 1`. As the `stakeShare` is zero, it will not execute the following code: ```solidity if (stakeShare > 0) { //we notify the staking manager that we will add to the incomepool _stakingManager.addIncomePool(stakeShare, _nextMiningDate); _bebe.operatorMint(address(_stakingManager), stakeShare); //we confirm the adding to the pool and this only takes effect if the amount to be added has already been transferred _stakingManager.confirmAddIncomePool(_nextMiningDate); } ``` In particular, it will not call `addIncomePool()` and `confirmAddIncomePool()` so that the `_incomePools` mapping in the `BEBEStakeManager` contract will not be set to a nonzero-value for that mining day. Then when the final `mine()` is called it will calculate a nonzero `stakeShare` so that it will call `addIncomePool()`, which will revert as the previous day was not populated ```solidity if (incomeDay > getDate(_startMiningDate)) { require( _incomePools[incomeDay - SECONDS_PER_DAY].poolAmount > 0, "PREVIOUS_DAY_NOT_YET_POPULATED" ); } ``` This happens far into the future and leaves only 5699 tokens that are unable to be mined, so we give this a *minor* severity.

Open the report
LowInconsistent CommentBEBE · CertiK · 20 Aug 2024Fixed

The comment above the contract `BEBEMiningManager` states the following: ```solidity * 80% of 40% to Staking contract * 20% of 40% to Staking active income contract * 60% to Gaming contract ``` However, the logic of the contract sends the `_stakingContractShare` percentage to the `_stakingManager` contact and the remaining amount to the `_gameIncomePoolAddress`. So that it does not send funds to 3 separate contracts, only 2. In addition, the amount sent to the `_stakingManager` contract starts at 30 percent and then decreases by 2% each time `mine()` is called `SHARE_ADJ_MINE_COUNT_INTERVAL = 30` times until it reaches the `MIN_STAKING_CONTRACT_SHARE` whose current value is 6%. So that the comment does not reflect that the percentages change depending on the number of times `mine()` has been called.

Open the report
LowMAXIMUM_STAKE Used For PrecesionBEBE · CertiK · 20 Aug 2024Fixed

MAXIMUM_STAKE is used for precision, which can cause confusion. The formula for income is ```solidity uint256 income = (((instance.amount * MAXIMUM_STAKE) / _incomePools[day].totalPower) * _incomePools[day].poolAmount) / MAXIMUM_STAKE; ``` Simplifying this equation we would get `instance.amount * _incomePools[day].poolAmount / _incomePools[day].totalPower` In particular, it gives a percentage of the income for that day (_incomePools[day].poolAmount). Where the percentage is given by the users staked amount (instance.amount) vs. the total amount that was staked for that day (_incomePools[day].totalPower). Thus MAXIMUM_STAKE is used in order to scale the percentage of the users stake vs. the total stake as it will be a decimal value.

Open the report
Show 7 more
LowSpecific Imports Are Not UsedBEBE · CertiK · 20 Aug 2024Fixed

Specific imports are recommended to be used to avoid unpredictable pollution of the namespace. For example: import {A, B, C} from "X";

Open the report
LowStaked Tokens Locked In Contract ForeverBEBE · CertiK · 20 Aug 2024Fixed

The contract `BEBEStakeManager` has a method to `stake()` and `claimIncome()`, however, there is no method to withdraw a users stake. This means that an address is only allowed to stake once and that the staked amount cannot be recovered and will be locked in the contract. In particular, the function `claimIncome()` only allocates tokens that have been sent to the contract via the `addIncomePool()` and `confirmAddIncomePool()` methods, so that any tokens staked or sent directly to the contract will be locked in the contract.

Open the report
LowUnnecessary CondiditonsBEBE · CertiK · 20 Aug 2024Fixed

In the function `mine()`, the `mineCount` will always be greater than zero. This is because the code is only reached if `block.timestamp >= _nextMiningDate`, so that the calculated `mineCount` will be greater than or equal to 1. In addition, `mineCount` calculation is unnecessary as the logic always mines 1 day.

Open the report
LowUnnecessary InitializationBEBE · CertiK · 20 Aug 2024Fixed

`uint256` is by default initialized to `0` and `bool` is by default initialized to `false`, so that it is not necessary to explicitly initialize the lines cited above.

Open the report
LowUnused VariablesBEBE · CertiK · 20 Aug 2024Fixed

The variables in the lines sited above are not used with the contracts they are defined in.

Open the report
LowVariables That Could Be Declared as ImmutableBEBE · CertiK · 20 Aug 2024Fixed

The linked variables assigned in the constructor can be declared as `immutable`. Immutable state variables can be assigned during contract creation but will remain constant throughout the lifetime of a deployed contract. A big advantage of immutable variables is that reading them is significantly cheaper than reading from regular state variables since they will not be stored in storage.

Open the report
LowView Functions May Run Out Of GasBEBE · CertiK · 20 Aug 2024Fixed

The view functions `getAllIncomePools()` and `getIncomePoolDates()` may run out of gas if the length of `_poolDates` grows too large. The view function `getMiningRecords()` may run out of gas if the length of `_miningRecords` grows too large.

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