As of 3 Nov 2026, DBTC has 1 audit report on Trustblock, by CertiK, dated 26 Sep 2024. That report lists no open critical findings. It also holds 1 deployed contract on 1 chain.
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 | 0 | 2 | 0 |
| Medium | 0 | 3 | 5 |
| Low | 8 | 0 | 10 |
The `autoBurnLiquidityPairTokens` function uses `super.transferFrom` to transfer `DBTC` tokens from the pair address to a dead address. However, the function may revert due to insufficient allowance. Since `_mainPair` refers to the deployed pair address for `DBTC` and the `currency`, there is no method to set `allowance[_mainPair][address(this)]` within the `_mainPair` contract, which is required for `super.transferFrom` to execute successfully. As a result, whenever the `fundAddress` calls the `burnLiquidityPairTokens` function to burn tokens from the pair address, the transaction will revert.
Open the reportThe `burnLiquidityPairTokens` function is designed to burn `DBTC` tokens in the liquidity pair to potentially increase the value of `DBTC`. However, the function lacks proper access control, allowing any user to call it. Below is the relevant code snippet: ```solidity function burnLiquidityPairTokens() external { require(block.timestamp >= lastLpBurnTime + lpBurnFrequency, "Not yet"); autoBurnLiquidityPairTokens(); } ``` In contrast, the `_tokenTransfer` function restricts this operation to only be triggered by `sender == burnLiquidityAddress`. The absence of similar access control in `burnLiquidityPairTokens` allows any user to exploit this function, potentially manipulating the market to increase their profit from buying or selling `DBTC` tokens.
Open the reportThe `_tokenTransfer` function applies fees for both adding and removing liquidity, which can lead to users being charged both fees simultaneously. Below is the relevant code snippet: ```solidity if (isAdd || isRemove) { if (addLiquidityFee > 0) { uint256 fee = amount * addLiquidityFee / 10000; amount -= fee; _basicTransfer(sender, address(this), fee); } if (removeLiquidityFee > 0) { uint256 fee = amount * removeLiquidityFee / 10000; amount -= fee; _basicTransfer(sender, address(this), fee); } } ``` In scenarios where `isAdd` is true (indicating an adding liquidity transaction) and both `addLiquidityFee` and `removeLiquidityFee` are greater than zero, the contract will apply both fees. This results in an incorrect fee deduction, causing user's financial loss.
Open the reportThe `_isAddLiquidity()` function exhibits inaccuracies under specific conditions, making it difficult to determine if liquidity is being added or removed within a single transaction. 1. The returned result may vary depending on whether the token is token0 or token1 in the pair. 2. The returned result may also vary depending on whether the caller uses the Uniswap router or directly invokes the pair's `swap()`, `mint()`, or `burn()` functions. Executing a swap similar to a flash loan through the [linked code logic](https://github.com/Uniswap/v2-core/blob/1136544ac842ff48ae0b1b939701436598d74075/contracts/UniswapV2Pair.sol#L172) may allow an arbitrager to bypass the `_isAddLiquidity` check. Due to this misjudgment, the caller may avoid paying fees or gain other undue profits. The `_isRemoveLiquidity()` function has a similar issue.
Open the reportThe modifier `lockTheSwap` is never used and therefore can cause the contract to be vulnerable to potential reentrancy attacks when swaps and transfers are being processed.
Open the reportThe `_tokenDistributor` acts as an intermediary to transfer the swapped `currency` to `address(this)`. If the allowance of `address(this)` is not correctly set in the new `distributor` contract, the `transferFrom` method will revert. ```solidity _swapRouter.swapExactTokensForTokensSupportingFeeOnTransferTokens( half, 0, path, address(_tokenDistributor), block.timestamp ) {} catch { emit Failed_swapExactTokensForTokensSupportingFeeOnTransferTokens(half); } uint256 newBal = _c.balanceOf(address(_tokenDistributor)); if (newBal != 0) { _c.transferFrom(address(_tokenDistributor), address(this), newBal); } ```
Open the reportIt is expected that the `balanceOf` function always succeeds, assuming that its execution does not run out of gas. However, the implementation of `balanceOf` in contract `DBTCoinNew` will revert in the following case: ```solidity if (account == _mainPair && msg.sender == _mainPair && antiSYNC) { require(super.balanceOf(_mainPair) > 0, "!sync"); } ``` Additionally, the `antiSYNC` variable can not completely prevent the price manipulation.
Open the reportThe comment in the `calculateFee` is not consistent with the code. ```solidity function calculateFee(uint256 amount) public view returns (uint256 burnAmount) { if (dailyDropPercentage <= 500) { return (0); // 正常10%划点 } else if (dailyDropPercentage <= 1000) { return (amount * 500 / 10000); // 划点15%,其中5%销毁 } else if (dailyDropPercentage <= 1500) { return (amount * 1000 / 10000); // 划点20%,其中10%销毁 } else if (dailyDropPercentage <= 2000) { return (amount * 1500 / 10000); // 划点25%,其中15%销毁 } else if (dailyDropPercentage <= 3000) { return (amount * 2000 / 10000); // 划点30%,其中20%销毁 } else if (dailyDropPercentage <= 4000) { return (amount * 2500 / 10000); // 划点35%,其中25%销毁 } else { return (amount * 2500 / 10000); // 划点35%,其中25%销毁 } } ```
Open the reportIn the constructor, the token contract approves the router with the maximum allowance using the following code snippet: ```solidity IERC20(currency).approve(address(_swapRouter), MAX); ``` However, when the currency is updated, the relevant allowance is not updated accordingly. This can cause swap operations to fail since the new currency might not have the appropriate allowance set for the router.
Open the reportThe cited addresses input lack a validation check to ensure they are not `address(0)`. This omission may result in the relevant addresses being set to an incorrect value, potentially causing adverse effects on the project.
Open the reportIn the `DBTCoinNew` contract, there is a potential issue in the `_tokenTransfer` function that could result in an unintended double transfer of tokens. ```solidity if (amount > 0) { _basicTransfer(sender, recipient, amount); } else { _basicTransfer(sender, recipient, tAmount); } ``` This `else` branch means that if the total amount after deducting all fees is zero, the original amount (`tAmount`) is transferred again from the `sender`. For example, if a sender intends to send 100 tokens to a receiver and the fee rate is set at 100% (with no cap on the fee setting), this function will end up transferring 200 tokens from the sender's account. If the sender doesn't have sufficient balance, the transfer operation will revert because the token balance is less than 200.
Open the reportThe `setMainPair` function allows the `owner` to set the `_mainPair` address, which represents the token pair involving the `DBTC` token and another currency. Additionally, the `setCurrency` function allows the `owner` to set the `currency` address, and the `setSwapRouter` function allows the `owner` to set the `_swapRouter` address, which is responsible for executing swap operations on the token pair. There is a potential risk if the `_mainPair`, `currency`, and `_swapRouter` addresses are not updated consistently. This could lead to incorrect pair configurations and swap operations, potentially causing financial loss or operational issues.
Open the reportIn the `_tokenTransfer` function, the `_reflowAmount` is reset to 0 after calling the `swapSellReflow` function, irrespective of whether the swap operation succeeds or fails. The relevant code snippet is as follows: ```solidity if (_reflowAmount > 0) { swapSellReflow(_reflowAmount); _reflowAmount = 0; } ``` The `swapSellReflow` function includes a try-catch block to handle potential errors without reverting the entire transaction. However, if the swap operation fails, `_reflowAmount` is still reset to 0. This can lead to the loss of `_reflowAmount` and may cause side effects, such as incorrect accounting or missed reflow operations.
Open the reportSome restrictions can be bypassed by swapping tokens to the router and then retrieving them from it. When tokens are transferred to the router, the attacker exploits the router function ***`removeLiquidityETHSupportingFeeOnTransferTokens`***, which sends all specified tokens in the router to a designated address. This is possible because the router is not intended to hold tokens for any purpose other than removing liquidity.
Open the reportAfter [EIP-1884](https://eips.ethereum.org/EIPS/eip-1884) was included in the Istanbul hard fork, it is not recommended to use `.transfer()` or `.send()` for transferring ether as these functions have a hard-coded value for gas costs making them obsolete as they are forwarding a fixed amount of gas, specifically `2300`. This can cause issues in case the linked statements are meant to be able to transfer funds to other contracts instead of EOAs.
Open the report| Address | Chain | Source code |
|---|---|---|
| 0xede7…29200xede744facd6c046ae3177238cb5afcda8a5b2920 | 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="dbtc"></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