As of 1 Nov 2026, Tegro has 2 audit reports by 2 security firms on Trustblock; the latest is by QuillAudits, dated 18 Mar 2024. Those reports list 1 open critical finding. It also holds 1 deployed contract on 1 chain.
Record last updated . It holds audits and findings, contracts and incidents up to Oct 2026. Trustblock does not review code.
Newest first
| Audit | Security firm | Date | Scope | Critical findings | Report |
|---|---|---|---|---|---|
| Tegro | Security firm: QuillAudits | Date: | Scope: Files named in the report | No open critical findings | Open · quillaudits.com |
| Tegro | Security firm: Cyberscope | Date: | Scope: 1 address on BNB Chain | 1 open critical finding | Open · IPFS |
Statuses are the security firm’s own, from each report.
| Severity | Open | Acknowledged | Fixed |
|---|---|---|---|
| Critical | 1 | 0 | 0 |
| High | 0 | 0 | 0 |
| Medium | 0 | 0 | 1 |
| Low | 4 | 0 | 6 |
When baseTokenDecimals would be greater than quoteTokenDecimals the function is unable to calculate the correct totalPrice.Let's say the price is 1e6 (i.e. using quoteTokenDecimals ) and the quantity is 2e18 (i.e. using baseTokenDecimals which is greater than the quoteTokenDecimals). In _calculateTotalPrice() L261 would be executed where it will calculate the price with 1e6 * 10 ** (18 - 6) which would be 1000000000000000000 Now, on L265 it will set totalPrice = 1000000000000000000 * 2e18 = 2000000000000000000000000000000000000 Then if{} on L268 will execute where it will scale down the totalPrice to remove extra decimals: totalPrice = 2000000000000000000000000000000000000 / 10 ** ( 18 + 6) = 2000000000000 So the calculated totalPrice would be 2000000000000 which is not equal to 2e6. The calculated totalPrice should be 2e6 because if the buyer is buying two tokens with the price 1e6 then the buyer needs to pay only 2e6 for two tokens.
Open the reportIn the proxy implementations _disableInitializers() should be called in the constructors. If not added, malicious users/addresses can call initialize() on the implementation smart contract where they would be able to set certain values that initialize() allowed to set.The severity of impact depends on the contract logic, but it's a good practice to add _disableInitializers() call in the implementation logic.
Open the reportThe expiry timestamp can be added as a part of the buy and sell order, which can be used while creating an order hash. And it can be checked in the settleOrders() that while executing the orders, buyOrder.expiry >= block.timestamp && sellOrder.expiry >= block.timestamp.This will ensure that the order can’t be executed after a specific timeframe. (It should be noted that the functionality of having expiry depends on the business logic.)
Open the reportIn settleOrders() on L98 it checks/requires that buyOrder.price >= sellOrder.price after that in the _transferTokens() on the L192 it sets the smallest value to matchedPrice by using this expression buyOrder.price < sellOrder.price ? buyOrder.price : sellOrder.price; but because it is already checked on L98 the buyOrder.price should be greater than or equal to sellOrder.price, buyOrder.price would be always greater than or equal to sellOrder.price so on L192 the condition will always fail and sellOrder.price will get assigned to the matchedPrice.
Open the reportsettleOrders() contains the comment on the L97 //Require the buy price to always be higher than the sell price. Currently, the required check allows buyOrder.price to be equal to sellOrder.price. So the comment can be changed to //Require the buy price to always be higher than or equal to the sell price.
Open the reportTegroDEXSettlement and TegroDEX are not using fixed solidity versions. Contracts are using unfixed pragma (^0.8.18 and ^0.8.19), Contracts should be deployed with the same compiler version and flags that they have been tested thoroughly. Using floating pragma does not ensure that the contracts will be deployed with the same version. The most recent compiler version may get selected while deploying a contract which has a higher chance of having bugs in it.
Open the reportOwnableUpgradeable is getting imported and is getting inherited by the TegroDEXSettlement contract. But no functionality is getting used from the OwnableUpgradeable and it can be removed if it remains unused.
Open the report| Address | Chain | Source code |
|---|---|---|
| 0xd978…9da50xd9780513292477c4039dfda1cfcd89ff111e9da5 | Chain: BNB Chain | Source code: Verified source |
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="tegro"></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