As of 3 Nov 2026, DeFiChain has 1 audit report on Trustblock, by CertiK, dated 10 Mar 2023. 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
| Audit | Security firm | Date | Scope | Critical findings | Report |
|---|---|---|---|---|---|
| Quantum bridge | Security firm: CertiK | Date: | Scope: Files named in the report | No open critical findings | Open · skynet.certik.com |
Statuses are the security firm’s own, from each report.
| Severity | Open | Acknowledged | Fixed |
|---|---|---|---|
| Critical | 0 | 0 | 0 |
| High | 2 | 0 | 0 |
| Medium | 0 | 0 | 1 |
| Low | 0 | 0 | 5 |
The `bridgeV1` contract does not protect its initialize function. An attacker can call the initializer and assume ownership of the logic contract, whereby he can perform privileged operations that either indirectly break the proxy by destroying the logic contract or trick unsuspecting users into believing that he is the owner of the upgradeable contract. ```solidity=221 function initialize( address _initialAdmin, address _initialOperational, address _relayerAddress, address _communityWallet, uint256 _fee, address _flushReceiveAddress, uint256 _acceptableRemainingDays ) external initializer { __UUPSUpgradeable_init(); __EIP712_init(name, version); _grantRole(DEFAULT_ADMIN_ROLE, _initialAdmin); _grantRole(OPERATIONAL_ROLE, _initialOperational); communityWallet = _communityWallet; relayerAddress = _relayerAddress; transactionFee = _fee; flushReceiveAddress = _flushReceiveAddress; acceptableRemainingDays = _acceptableRemainingDays; }
Open the reportThe current implementation lacks proper sanity checks for the function argument `_newResetTimeStamp`. Setting `_newResetTimeStamp` to an excessively large value would cause the `bridgeToDeFiChain` operation to revert due to the `STILL_IN_CHANGE_ALLOWANCE_PERIOD` error. ```solidity=349 function changeDailyAllowance( address _tokenAddress, uint256 _dailyAllowance, uint256 _newResetTimeStamp ) external { if (!checkRoles()) revert NON_AUTHORIZED_ADDRESS(); if (!supportedTokens.contains(_tokenAddress)) revert ONLY_SUPPORTED_TOKENS(); if (_newResetTimeStamp < block.timestamp + 1 days) revert INVALID_RESET_EPOCH_TIME(); tokenAllowances[_tokenAddress].dailyAllowance = _dailyAllowance; uint256 prevTimeStamp = tokenAllowances[_tokenAddress].latestResetTimestamp; tokenAllowances[_tokenAddress].latestResetTimestamp = _newResetTimeStamp; tokenAllowances[_tokenAddress].currentDailyUsage = 0; emit CHANGE_DAILY_ALLOWANCE(_tokenAddress, _dailyAllowance, prevTimeStamp, _newResetTimeStamp); } ```
Open the reportThere are no upper boundaries for transaction fee in function `changeTxFee()` . It is possible to set the total transaction fee rate up to 100%. ```solidity=435 function changeTxFee(uint256 fee) external onlyRole(DEFAULT_ADMIN_ROLE) { uint256 oldTxFee = transactionFee; transactionFee = fee; emit TRANSACTION_FEE_CHANGED(oldTxFee, transactionFee); } ```
Open the reportThe `BridgeV1` contract serves as the underlying entity to interact with the external dependency `relayer`. The relayer can sign instructions for fund claiming, which users can submit to the blockchain. The scope of the audit treats component that is out of scope as black boxes and assumes their functional correctness.
Open the reportThe computation for each iteration is complex. It could lead to Out-of-gas exception when the number of supported tokens is large. ```solidity=378 function flushFund() external { for (uint256 i = 0; i < supportedTokens.length(); ++i) { address supToken = supportedTokens.at(i); if ( (IERC20(supToken).balanceOf(address(this)) > acceptableRemainingDays * tokenAllowances[supToken].dailyAllowance) && // the same logic as in bridgeToDeFiChain applies here, if we are still // in the period for addingSupport or changingDailyAllowance, we will not flush for that particular token (tokenAllowances[supToken].latestResetTimestamp <= block.timestamp) ) { uint256 amountToFlush = IERC20(supToken).balanceOf(address(this)) - acceptableRemainingDays * tokenAllowances[supToken].dailyAllowance; IERC20(supToken).transfer(flushReceiveAddress, amountToFlush); } } emit FLUSH_FUND(); } ```
Open the reportThe return value of the transfer()/transferFrom() call is not checked in the following lines. ```solidity=265 IERC20(_tokenAddress).transfer(_to, _amount); ``` --- ```solidity=300 IERC20(_tokenAddress).transferFrom(msg.sender, address(this), netAmountInWei); ``` --- ```solidity=301 IERC20(_tokenAddress).transferFrom(msg.sender, communityWallet, netTxFee); ``` --- ```solidity=370 IERC20(_tokenAddress).transfer(msg.sender, amount); ``` --- ```solidity=391 IERC20(supToken).transfer(flushReceiveAddress, amountToFlush); ```
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="defichain"></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