As of 3 Nov 2026, Venombridge has 1 audit report on Trustblock, by CertiK, dated 3 Nov 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
| Audit | Security firm | Date | Scope | Critical findings | Report |
|---|---|---|---|---|---|
| Venom 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 | 0 | 5 | 2 |
| Medium | 0 | 0 | 6 |
| Low | 9 | 0 | 11 |
```solidity=768 /** @notice Change the quantity of assets `strategy` may manage. This may be called by `governance` or `management`. @param strategyId The Strategy to update. @param _debtRatio The quantity of assets `strategy` may now manage. */ function updateStrategyDebtRatio( address strategyId, uint256 _debtRatio ) external override onlyGovernanceOrManagement strategyExists(strategyId) { StrategyParams memory strategy = _strategy(strategyId); _debtRatioReduce(strategy.debtRatio); _strategyDebtRatioUpdate(strategyId, _debtRatio); _debtRatioIncrease(debtRatio); require(debtRatio <= MAX_BPS); emit StrategyUpdateDebtRatio(strategyId, _debtRatio); } ``` Function `updateStrategyDebtRatio()` is supposed to updates `debtRatio` (the total quantity of assets that all strategies can manage) by reducing `strategy.debtRatio` and increasing `_debtRatio`. However, the function call of `_debtRatioIncrease()` at line 787 mistakenly uses `debtRatio` as the parameter rather than `_debtRatio`, which would cause the value of `debtRatio` to be higher than the actual ratio that all strategies can manage. Since `debtRatio` cannot exceed 100% and the total ratio that all strategies can manage is smaller than `debtRatio`, the strategies cannot take full advantage of the assets in the vault contract.
Open the reportUpgradeable contract must extend upgradeable contracts and call initializer functions of parent-contracts in its own initializer function. Otherwise, it may malfunction due to improper initialization or improper upgrading.
Open the report```solidity=830 function updateStrategyPerformanceFee( address strategyId, uint256 _performanceFee ) external override onlyGovernance strategyExists(strategyId) { require(_performanceFee <= MAX_BPS / 2); performanceFee = _performanceFee; emit StrategyUpdatePerformanceFee(strategyId, _performanceFee); } ``` Function `updateStrategyPerformanceFee()` updates the global variable `performanceFee` rather than `strategies_[strategyId].performanceFee`.
Open the reportWhen developers deploy the implementation contract and call the function `initialize()` from the Proxy contract, the initialization will be executed in the context of the Proxy contract. Hence the state variable `_initialized` and `_initializing` will be 0 and false, respectively. However, the "initialize" function in the implementation contract is not initialized, and attackers can directly call the function `initialize(),` with malicious inputs to take over the implementation contract. Reference: https://medium.com/immunefi/wormhole-uninitialized-proxy-bugfix-review-90250c41a43a https://docs.openzeppelin.com/upgrades-plugins/1.x/writing-upgradeable#initializing_the_implementation_contract
Open the reportBased on code L72 in the `MultiVaultEverscaleEventAlien.sol` contract, `IProxyMultiVaultAlien_V3` should be used instead of `IProxyMultiVaultAlien_V1` at L140.
Open the reportFor upgradeable contracts, there must be a storage gap to "allow developers to freely add new state variables in the future without compromising the storage compatibility with existing deployments". Otherwise, it may be very difficult to write new implementation code. Without a storage gap, the variable in the child contract might be overwritten by the upgraded base contract if new variables are introduced to the base contract. Refer to https://docs.openzeppelin.com/contracts/3.x/upgradeable#storage_gaps
Open the reportFunction `Vault.deposit()` at line 374 misses modifiers `onlyEmergencyDisabled` and `respectDepositLimit`, function `Vault.saveWithdraw()` at line 489 misses modifier `nonReentrant`, and function `MultiVault.deposit()` at line 623 misses modifier `onlyEmergencyDisabled`,
Open the report```solidity=1169 /** @notice Force user's pending withdraw. Works only if Vault has enough tokens on its balance. This may only be called by wrapper. @param pendingWithdrawalId Pending withdrawal ID */ function forceWithdraw( PendingWithdrawalId memory pendingWithdrawalId ) public override onlyEmergencyDisabled pendingWithdrawalOpened(pendingWithdrawalId) pendingWithdrawalApproved(pendingWithdrawalId) { PendingWithdrawalParams memory pendingWithdrawal = _pendingWithdrawal(pendingWithdrawalId); IERC20(token).safeTransfer(pendingWithdrawalId.recipient, pendingWithdrawal.amount); _pendingWithdrawalAmountReduce(pendingWithdrawalId, pendingWithdrawal.amount); emit PendingWithdrawalForce(pendingWithdrawalId.recipient, pendingWithdrawalId.id); } ``` `Vault.forceWithdraw()`'s comment says that the function may only be called by "wrapper", however, the role does not exist and anyone can call the function to withdraw a pending withdrawal to its recipient. `MultiVault.forceWithdraw()` shares the same issue, and it also misses modifiers like `nonReentrant` and `onlyEmergencyDisabled`.
Open the report`mergePoolVersion` is not included in upgrade data. Its value will be lost after the upgrade. Reference: https://docs.everscale.network/develop/smart-contract/learn/how-to-upgrade-contracts https://github.com/tonlabs/samples/blob/master/solidity/12_BadContract.sol and https://github.com/tonlabs/samples/blob/master/solidity/12_NewVersion.sol
Open the report```solidity modifier withdrawalNotSeenBefore(bytes memory payload) { bytes32 withdrawalId = keccak256(payload); require(!withdrawalIds[withdrawalId], "Vault: withdraw payload already seen"); _; withdrawalIds[withdrawalId] = true; } ``` The value of `withdrawalIds[withdrawalId]` is updated after `_;` runs, which violates the check-effect-interaction pattern.
Open the reportIn contract `Vault`, the fee calculation uses `amountPlusBounty`; whereas in contract `MultiVault`, the fee calculation uses `amount` rather than `amountPlusBounty`.
Open the report```solidity=260 /// @notice Add token to blacklist. Only native token can be blacklisted. /// Blacklisted tokens cant be deposited or withdrawn. /// @param token Token address function blacklistAddToken( address token ) public override onlyGovernance tokenNotBlacklisted(token) { tokens_[token].blacklisted = true; emit BlacklistTokenAdded(token); } ``` Function `blacklistAddToken()`'s comment says that this function should only backlist "native" tokens; however, the function could also blacklist alien tokens and stop them from being deposited or withdrawn since no check guarantees the token is "native".
Open the report```solidity=300 /// @notice Changes `withdrawalQueue` /// This may only be called by `governance` function setWithdrawalQueue( address[20] memory queue ) external override onlyGovernanceOrManagement { withdrawalQueue_ = queue; emit UpdateWithdrawalQueue(withdrawalQueue_); } ``` The comment says "This may only be called by `governance`", however, the modifier `onlyGovernanceOrManagement` allows both `governance` and `management` to call this function.
Open the reportFunction `saveWithdrawAlien()` at line 727 does not require that `pendingWithdrawal.bounty` <= `pendingWithdrawal.amount`. If `pendingWithdrawal.bounty` > `pendingWithdrawal.amount`, this `pendingWithdrawal` will not be filled until `pendingWithdrawal.bounty` is modified.
Open the reportThere should always be events emitted in the sensitive functions that are controlled by privileged roles.
Open the reportThe given input `vault` is missing the check for the non-zero address.
Open the reportThe identified code logic at L144-146 in BaseEvent.sol is redundant: only when the current status is initializing, `status` can be set to initializing.
Open the reportState variable `owner` is not included in upgrade data. So after the upgrade, its value will be lost. Reference: https://docs.everscale.network/develop/smart-contract/learn/how-to-upgrade-contracts https://github.com/tonlabs/samples/blob/master/solidity/12_BadContract.sol and https://github.com/tonlabs/samples/blob/master/solidity/12_NewVersion.sol
Open the reportBoth the "onlyInitializer" and "eventInitializing" modifiers usage is not found in the bridge codebase.
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="venom-bridge"></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