As of 14 Oct 2026, BetFin has 4 audit reports by 1 security firm on Trustblock; the latest is by CertiK, dated 10 Dec 2024. Those reports list no open critical findings.
Record last updated . It holds audits and findings, contracts and incidents up to Oct 2026. Statuses are the security firms’ own. Trustblock does not review code.
Newest first
| Audit | Security firm | Date | Scope | Critical findings | Report |
|---|---|---|---|---|---|
| Liro - contract | Security firm: CertiK | Date: | Scope: Files named in the report | 1 critical finding, fixed | Open · skynet.certik.com |
| Betfin Stones Contracts | Security firm: CertiK | Date: | Scope: Files named in the report | No open critical findings | Open · skynet.certik.com |
| Betfin Lucky Round Contracts | Security firm: CertiK | Date: | Scope: Files named in the report | 1 critical finding, fixed | Open · skynet.certik.com |
| Betfin Core Contracts | Security firm: CertiK | Date: | Scope: Files named in the report | 1 critical finding, fixed | Open · skynet.certik.com |
Statuses are the security firm’s own, from each report.
| Severity | Open | Acknowledged | Fixed |
|---|---|---|---|
| Critical | 0 | 0 | 2 |
| High | 1 | 1 | 3 |
| Medium | 0 | 0 | 2 |
| Low | 5 | 1 | 21 |
In the contract `LuckyRound` the role `TIMELOCK` has authority over the functions shown in the list below. - `addService()`: This function allows adding a new address to the `SERVICE` role. - `setMinBetAmount()`: This function sets the minimum amount required to place a bet. Any compromise to the `TIMELOCK` account may allow the hacker to take advantage of this authority and could potentially add malicious addresses to the `SERVICE` role, enabling further unauthorized actions within the contract. And an attacker could adjust the minimum bet amount to either a prohibitively high or trivially low value, disrupting normal betting activities and potentially manipulating betting outcomes to their advantage. In the contract `LuckyRound` the role `SERVICE` has authority over the functions shown in the list below. - `claimBonus()`: This function allows claiming bonuses accrued to a player's account. Any compromise to the `SERVICE` account may allow the hacker to take advantage of this authority. Additionally, the `LuckyRound` contract inherits the `AccessControl` contract from OpenZeppelin, the `DEFAULT_ADMIN_ROLE` role has the following authorities within the contract: - `grantRole()`: Grants specified roles to an account, allowing it to perform actions associated with that role. - `revokeRole()`: Removes specified roles from an account, restricting it from performing certain actions. If the `DEFAULT_ADMIN ROLE` is compromised, an attacker could grant critical roles to unauthorized addresses, effectively allowing them to manipulate the contract. The attacker could also revoke roles from legitimate addresses, disrupting the normal operation and administration of the contract.
Open the reportThe contract is serving as the underlying entity to interact with one or more third party protocols. The scope of the audit treats third party entities as black boxes and assumes their functional correctness. However, in the real world, third parties can be compromised and this may lead to lost or stolen assets. In addition, upgrades of third parties can possibly create severe impacts, such as increasing fees of third parties, migrating to new LP pools, etc. --- ```solidity=50 StakingInterface public immutable staking; ``` - The contract `Stones` interacts with third party contract with `StakingInterface` interface via `staking`. --- ```solidity=51 CoreInterface public immutable core; ``` - The contract `Stones` interacts with third party contract with `CoreInterface` interface via `core`. --- ```solidity uint256 private immutable created; uint256 private immutable subscriptionId; address public immutable vrfCoordinator; bytes32 public immutable keyHash; uint32 private constant callbackGasLimit = 2_500_000; uint16 public constant requestConfirmations = 3; uint32 private constant numWords = 1; constructor( uint256 _subscriptionId, address _core, address _staking, address _vrfCoordinator, bytes32 _keyHash, address _admin ) VRFConsumerBaseV2Plus(_vrfCoordinator) { // validation for vrf coordinator is not needed because it is already validated in the VRFConsumerBaseV2Plus contract vrfCoordinator = _vrfCoordinator; keyHash = _keyHash; subscriptionId = _subscriptionId; core = CoreInterface(_core); require(core.isStaking(_staking), "ST06"); staking = StakingInterface(_staking); created = block.timestamp; _grantRole(DEFAULT_ADMIN_ROLE, _admin); } ``` Since they are immutable or constant, the project team needs to ensure that the `vrfCoordinator` is always callable, and that the `keyHash` and `subscriptionId` are always valid, as well as that the `callbackGasLimit` is sufficient to execute the `rawFulfillRandomWords()` callback. In particular, the project team needs to prevent the risk of request failures caused by an invalid `subscriptionId`. It means the project team need to ensure that the request sent by calling `requestRandomWords()` in each round correctly triggers the callback.
Open the reportThe `getCurrentRound()` function calculates the current round based on the current `block.timestamp`, and its result is compared with the `_round` provided in the calldata. However, the `block.timestamp` at the time of transaction execution is unpredictable.
Open the report```solidity=268 uint256 playerBonus = (bonus * playerShare) / bonusShares; ``` Due to integer division, it may be that not all BOUNS tokens can be claimed by users, ultimately leading to a small amount of BOUNS tokens being locked in the contract.
Open the reportIf the number of players placing bets within the `ROUND_DURATION` does not reach the `BETS_LIMIT`, any user can use the `requestCalculation()` function to complete the random number request, execute the results, and distribute the rewards. However, because the `winnerOffset` is randomly generated, there is insufficient incentive for users to actively call `requestCalculation()`.
Open the reportThe contract is serving as the underlying entity to interact with one or more third party protocols. The scope of the audit treats third party entities as black boxes and assumes their functional correctness. However, in the real world, third parties can be compromised and this may lead to lost or stolen assets. In addition, upgrades of third parties can possibly create severe impacts, such as increasing fees of third parties, migrating to new LP pools, etc. ```solidity=38 address public immutable core; ``` - The contract `LuckyRound` interacts with third party contract with `CoreInterface` interface via `core`. --- ```solidity=95 address _core, ``` - The function `LuckyRound.constructor` interacts with third party contract with `CoreInterface` interface via `_core`. --- ```solidity uint256 private immutable subscriptionId; address public immutable vrfCoordinator; bytes32 public immutable keyHash; uint32 private constant callbackGasLimit = 2_500_000; constructor( address _core, address _staking, address _admin, uint256 _subscriptionId, address _vrfCoordinator, bytes32 _keyHash ) VRFConsumerBaseV2Plus(_vrfCoordinator) { require(_vrfCoordinator != address(0), "RO01"); vrfCoordinator = _vrfCoordinator; keyHash = _keyHash; subscriptionId = _subscriptionId; created = block.timestamp; core = _core; token = CoreInterface(_core).token(); require(CoreInterface(_core).isStaking(_staking), "L01"); staking = _staking; fee = CoreInterface(core).fee(); _grantRole(DEFAULT_ADMIN_ROLE, _admin); } ``` Since they are immutable or constant, the project team needs to ensure that the `vrfCoordinator` is always callable, and that the `keyHash` and `subscriptionId` are always valid, as well as that the `callbackGasLimit` is sufficient to execute the `rawFulfillRandomWords()` callback. In particular, the project team needs to prevent the risk of request failures caused by an invalid `subscriptionId`.It means the project team need to ensure that the request sent by calling `requestRandomWords()` in each round correctly triggers the callback.
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="betfin"></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