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.
Record last updated . It holds audits, findings and contracts up to Nov 2026, and incidents up to Oct 2026. Trustblock does not review code.
Newest first
Statuses are the security firm’s own, from each report.
| Severity | Open | Acknowledged | Fixed |
|---|---|---|---|
| Critical | 0 | 0 | 0 |
| High | 5 | 0 | 1 |
| Medium | 2 | 0 | 2 |
| Low | 19 | 0 | 20 |
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 reportThe 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 reportIn `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 reportThe 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 reportThe 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 reportThe 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 reportThe 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 reportThe event `InHouseMintComplete()` is never used in the contract because the function where this event is emitted is commented out.
Open the reportIt 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`public` functions that are never called by the contract could be declared as `external`. `external` functions are more efficient than `public` functions.
Open the reportThe user inputting the ids into `getTumbleCost()` need not own the tokens they input in the function call.
Open the reportThe `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 reportInside 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 reportIn `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 reportIn 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 reportThe 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 reportContracts 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 reportInside `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 reportTo adhere to the check-effect-interaction pattern, all updates to state should occur before external calls to other contracts.
Open the reportIn 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 reportThe linked variables could be declared as `constant` since these state variables are never modified.
Open the reportThe 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 reportDISCLAIMER: 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 reportThe reports name a repository or files. Open a report to see its scope.
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.
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.
<head><script src="https://widget.trustblock.run/project-widget.min.js" defer></script></head><body><divdata-tb-project-widgetdata-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