Gooeys.io security record

Ethereum, Polygon (POS)gooeys.ioX

As of 3 Nov 2026, Gooeys.io has 1 audit report on Trustblock, by CertiK, dated 15 Jul 2022. That report lists no open critical findings.

Critical findings
No open critical findings
In 1 report.
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
GooeysSecurity firm: CertiKDate: Scope: Files named in the reportNo open critical findingsOriginal removed

Findings49

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

SeverityOpenAcknowledgedFixed
Critical000
High501
Medium202
Low19020
HighFunction `totalSupply()` does not return the totaGooeys · CertiK · 15 Jul 2022Fixed

Note that the base contract files (such as ERC20.sol, ERC721.sol, ERC721Enumerable.sol) for Gooey.sol, Goo.sol, and GooeyFruit.sol have been modified and are beyond the full scope of this audit. The return value of the function `totalSupply()` within the inherited `ERC721Enumerable` contract returns the value of `_owners.length`. This returns the total number of ERC721 owners for the contract, and not the total number of tokens. This value is used as the `tokenId` value for `_safeMint()` which checks if the tokenId currently exists. The `Gooey` contract is set up so that users are meant to have more than one tokenId. Therefore, we can expect that the execution of `_safeMint()` will fail at some point, since the number of tokens can increase while the number of owner addresses may not. This will render the `tumble()` function unusable at this point.

Open the report
MediumChange `tokenId` Validation CheckGooeys · CertiK · 15 Jul 2022Fixed

The output for `totalSupply()` is the total number of owners rather than the total number of tokens. This value needs to be updated, and when it is, this check may no longer work.

Open the report
MediumPotential Denial-of-ServiceGooeys · CertiK · 15 Jul 2022Fixed

In `Goo.sol` within `getDivisionRate()`, as time increases, `blocksSinceDeployment` increases without bound. This, in turn means that `divisionPeriods` also grows as time goes on, which is supposed to be the upper bound for the for-loop. This is a problem for a for-loop because eventually the for-loop will run out of gas during the transaction and results in a denial of service for any functions relying on this logic. There is no safety in place if this happens, so the `mint()` function which relies on this calculation will become unusable in this event.

Open the report
Low`blockFinished` restrictive checkGooeys · CertiK · 15 Jul 2022Fixed

The name `blockFinished` implies that the quest is complete within the stored block value. If this is the case, then the inequality should be made inclusive.

Open the report
Low`doFoodRoll` Always TrueGooeys · CertiK · 15 Jul 2022Fixed

The only time `postQuest()` is called is during `fulfillRandomness()`. This function hardcodes `doFoodRoll()` to true and it is never updated. Thus the condition for `if (doFoodRoll)` is always met.

Open the report
Low`MINT` is never used as a `VRFRequestType`Gooeys · CertiK · 15 Jul 2022Fixed

The function in which the enum `VRFRequestType.MINT` is used is commented out of the code. It is never used within any of the audited files.

Open the report
LowComparison for `getTumbleAvailabilityBlock`Gooeys · CertiK · 15 Jul 2022Fixed

The value `getTumbleAvailabilityBlock` for a token ID has a name that implies that the `tumble()` function will be available during a given block. However, the inequality used is strict and does not allow for the use of the `tumble()` function until after the value for `getTumbleAvailabilityBlock` is passed.

Open the report
LowEvent Not UsedGooeys · CertiK · 15 Jul 2022Fixed

The event `InHouseMintComplete()` is never used in the contract because the function where this event is emitted is commented out.

Open the report
LowHidden Assumption for Treasury AddressGooeys · CertiK · 15 Jul 2022Fixed

It is unknown if this token is compatible with the the `treasury` contract. Since when minting the amount of `mintedWithoutChefCut / 20` tokens to the `treasury` address, there is no indication if this is an EOA or another contract.

Open the report
LowImproper Usage of `public` and `external` TypeGooeys · CertiK · 15 Jul 2022Fixed

`public` functions that are never called by the contract could be declared as `external`. `external` functions are more efficient than `public` functions.

Open the report
Show 10 more
LowNo Validation Check for token IdsGooeys · CertiK · 15 Jul 2022Fixed

The user inputting the ids into `getTumbleCost()` need not own the tokens they input in the function call.

Open the report
LowOrder of LayoutGooeys · CertiK · 15 Jul 2022Fixed

The `GooeyFruit.sol` contract does not conform to the order of layout recommended by the solidity documentation which is the following: - Type declarations - State variables - Events - Functions Reference: https://docs.soliditylang.org/en/v0.8.9/style-guide.html#order-of-layout

Open the report
LowTicker Name InconsistencyGooeys · CertiK · 15 Jul 2022Fixed

Inside the code and the documentation (https://dogira.gitbook.io/goobook/game-mechanics/usdgoo-tokenomics) the ticker of the token is "GOO" but here is "GTO".

Open the report
LowTypoGooeys · CertiK · 15 Jul 2022Fixed

In `GooeyFruit.sol` at line 180 is passed to the `buyFood()` function the variable `_receipient` instead of `_recipient`. --- In `GooeyFruit.sol` at line 189 is passed to the `buyFoodAltToken()` function the variable `_receipient` instead of `_recipient`.

Open the report
LowUnclear Function LogicGooeys · CertiK · 15 Jul 2022Fixed

In the file `Gooeys.sol`, the function code `pickGeneticCosmetic()` is difficult to read because of the nested ternary operators. --- Attempting to break down the logic, the statement seems to read as: ```solidity if cos1 == cos2 { if randomRoll % 100 < 90 { // Is randomRoll mod 100 less than 90? If yes, return uint(cos1); // return first cosmetic value. } if randomRoll % 100 < 30 { // Is randomRoll mod 100 less than 30? If yes, if randomRoll & 2 == 0 { // is it even? If yes, return uint(cos1); // return cos1. } return uint(cos2); // if randomRoll mod 100 less than 30 and odd, return cos2 } return newCos; // if cos1 == cos2 and randomRoll mod 100 not less than 90, then use newCos } return newCos; // if cos1 and cos2 values are different, use newCos ``` If this is the intended set up, there are issues with this. First, if `cos1 == cos2`, there is no need to choose `cos2` over `cos1` since they are the same value. Second, if `randomRoll % 100 < 30` then it is also true that `randomRoll % 100 < 90`. Since the code first checks that the modulus is less than 90, this case will always be executed first and return `cos1`, so the case where the modulus is less than 30 will never be used.

Open the report
LowUnclear Purpose for `withdraw()` functionGooeys · CertiK · 15 Jul 2022Fixed

The only place that this contract can be paid `MATIC` is through the `withdraw()` function. Since this function is only callable by the owner of the contract, only the owner can potentially send `MATIC` to this contract, in which case, the value of the call is automatically sent back to the owner.

Open the report
LowUnlocked Compiler VersionGooeys · CertiK · 15 Jul 2022Fixed

Contracts have unlocked compiler versions. An unlocked compiler version in the source code of the contract permits the user to compile it at or above a particular version. This, in turn, leads to differences in the generated bytecode between compilations due to different compiler versions. This can lead to an ambiguity when debugging as compiler specific bugs may occur in the codebase that would be hard to identify over a span of multiple compiler versions rather than a specific one.

Open the report
LowUnused Function Call ResultsGooeys · CertiK · 15 Jul 2022Fixed

Inside `Gooeys.sol` at line 338 is made a call to `requestRandomness()` which returns a bytes32 as we can see from `VRFConsumerBase.sol`: ```solidity function requestRandomness(bytes32 _keyHash, uint256 _fee) internal returns (bytes32 requestId) { LINK.transferAndCall(vrfCoordinator, _fee, abi.encode(_keyHash, USER_SEED_PLACEHOLDER)); uint256 vRFSeed = makeVRFInputSeed(_keyHash, USER_SEED_PLACEHOLDER, address(this), nonces[_keyHash]); nonces[_keyHash] = nonces[_keyHash] + 1; return makeRequestId(_keyHash, vRFSeed); } ``` No return value is captured or used for this call.

Open the report
LowUpdate Internal State Variables Before External CGooeys · CertiK · 15 Jul 2022Fixed

To adhere to the check-effect-interaction pattern, all updates to state should occur before external calls to other contracts.

Open the report
LowValue in Sum for `mutationHigh`Gooeys · CertiK · 15 Jul 2022Fixed

In the sum for `mutationHigh`, the value for `adjBond/400` at most only adds a value of 5 to the total sum. Relative to the other values added in the sum, this value is low.

Open the report
Show 3 more
LowVariables That Could Be Declared as `constant`Gooeys · CertiK · 15 Jul 2022Fixed

The linked variables could be declared as `constant` since these state variables are never modified.

Open the report
LowVariables That Could Be Declared as ImmutableGooeys · CertiK · 15 Jul 2022Fixed

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
LowWallet supply hardcapGooeys · CertiK · 15 Jul 2022Fixed

DISCLAIMER: This finding was added before the docs and thus the calculations had been updated. Wallet supply is hardcapped to 10mln but inside the docs ( https://dogira.gitbook.io/goobook/game-mechanics/tumbling-breeding) we see that is very easy to reach a cost for tumbling next to this amount. For example in the doc is showed a tumble which costs about 5 million $GOO. Let's assume, as an example the following scenario. - Gooey A has minted seven new Gooeys via tumbling - Gooey B has minted six new Gooeys via tumbling - The total cost for a new Gooey can be found with the following formula: ```solidity goo_price = (300000 + (250000 * 7) + (250000 * 6) )* 3 = 10650000 ``` In addition, the above calculations do not include the cost for any rare fruits required in the event of a Gooey not having any tumbles remaining.

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