CertiK reviewed Foxify: Decentralized Exchange (Foxify - New Deal) on 26 Jun 2023: 11 findings, 0 critical; 6 marked fixed, 1 acknowledged, 4 open.
Report hosted on skynet.certik.com.
Trustblock does not review code.
Statuses are the security firm’s own, from its report.
| Severity | Open | Acknowledged | Fixed |
|---|---|---|---|
| Critical | 0 | 0 | 0 |
| High | 0 | 1 | 0 |
| Medium | 0 | 0 | 0 |
| Low | 4 | 0 | 6 |
Performing integer division before multiplication truncates the low bits, losing the precision of calculation. ```solidity=297 uint256 stableFee = (amount * fee) / DIVIDER; uint256 discount_ = (affiliationUserData_.discount * stableFee) / DIVIDER; ```
The `initialize()` function does not have any access control measures implemented, allowing any account to call this function to initialize the address of `configuration`.
The function `accept()` is using `latestRoundData()` to get token's price by Chainlink, but there are no validations that the data is not stale. This issue also exists in function `validateRoundData`. Reference: https://github.com/code-423n4/2021-12-yetifinance-findings/issues/91
The address of `_immutableConfiguration.utils` is missing a check that it is not `address(0)` in the constructor.
The `blacklistList()` function is designed to return values from the address set starting from the index `offset` up to the index `to - 1`. However, in its current implementation, the order of the returned addresses is reversed. For instance, if the order of addresses in the set is [a, b, c], the function currently returns [c, b, a] instead of [a, b, c]. This could potentially lead to misunderstandings or errors in interpreting the result. ```solidity=25 function blacklistList(uint256 offset, uint256 limit) external view returns (address[] memory output) { uint256 blacklistLength = _blacklist.length(); uint256 to = offset + limit; if (blacklistLength < to) to = blacklistLength; output = new address[](to - offset); for (uint256 i = offset; i < to; i++) output[i - offset] = _blacklist.at(blacklistLength - i - 1); } ```
The return values of the `transfer()` and `transferFrom()` calls in the smart contract are not checked. Some ERC-20 tokens' transfer functions return no values, while others return a bool value, they should be handled with care. If a function returns `false` instead of reverting upon failure, an unchecked failed transfer could be mistakenly considered successful in the contract. ```solidity=99 _immutableConfiguration.stable.transferFrom(msg.sender, address(this), amount); ``` --- ```solidity=166 if (amountCreator > 0) _immutableConfiguration.stable.transfer(creator, amountCreator); ``` --- ```solidity=167 if (amountAccepter > 0) _immutableConfiguration.stable.transfer(accepter, amountAccepter); ``` --- ```solidity=191 stable_.transfer(feeRecipient, amount); ``` --- ```solidity=224 if (amount > 0) _immutableConfiguration.stable.transferFrom(msg.sender, address(this), amount); ``` --- ```solidity=238 stable.transfer(recipient, amount); ``` --- ```solidity=258 _immutableConfiguration.stable.transferFrom(msg.sender, address(this), amount); ``` --- ```solidity=273 _immutableConfiguration.stable.transfer(msg.sender, amount); ``` --- ```solidity=23 stable.transferFrom(msg.sender, address(this), amount); ``` --- ```solidity=44 stable.transferFrom(msg.sender, address(this), amount); ``` --- ```solidity=65 stable.transferFrom(msg.sender, address(this), amount); ```
The report names a repository or files. Open the report to see its scope.
Repository and files the report names (8)
1,044 projects reviewed · 1,375 reports · latest May 2025
See CertiK’s auditsSomething 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