As of 20 Oct 2026, Dora Factory has 4 audit reports by 2 security firms on Trustblock; the latest is by Oak Security, dated 13 Jun 2024. Those reports list 1 critical acknowledged and not fixed. 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 |
|---|---|---|---|---|---|
| Dora Vota audit | Security firm: Oak Security | Date: | Scope: Not recorded (see the report) | 1 critical acknowledged, not fixed | Open · GitHub |
| DORA ERC20 Contract Update-Audit | Security firm: CertiK | Date: | Scope: 1 address on Ethereum | No open critical findings | Open · skynet.certik.com |
| Dora Grant DAO V4 | Security firm: CertiK | Date: | Scope: Files named in the report | No open critical findings | Open · skynet.certik.com |
| Aptos Grant DAO-Audit | Security firm: CertiK | Date: | Scope: Not recorded (see 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 | 1 | 0 |
| High | 2 | 5 | 1 |
| Medium | 0 | 0 | 1 |
| Low | 8 | 2 | 12 |
In the module `QF::qf`, the role `@QF` has authority over the following functions: - initialize() In the module `QF::qf`, the role `@QF`/`admin` has authority over the following functions: - start_round() - set_fund() - add_track() - batch_upload_project() - end_round() - withdraw_all() Any compromise to the `@QF`/`admin` account may allow a hacker to take advantage of this authority.
Open the reportThe `Aptos` chain supports code upgrades, which means deployed `Move` codes can be replaced by new codes. If a code upgrade occurs, all callers of the upgraded code will automatically call the new code the next time. For more details, please refer to [aptos-upgrade-policies](https://aptos.dev/guides/move-guides/upgrading-move-code/#upgrade-policies). If the `Aptos Grant DAO` project is deployed as upgradable, deployer account `QF` has permission to update the implementation of the module at it wishes. Any compromise to the deployer account `QF` may allow a hacker to take advantage of this authority to control the implementation of the program and thus execute potentially malicious functions in the module.
Open the reportAccording to the design, the contract regards 32 native tokens as one unit. Users can withdraw an integer number of units of native tokens through the `unstake()` function. ```solidity uint256 public constant DEPOSIT_SIZE = 32 ether; function unstake(uint256 _count) external { require(_count < 1 ether, "too large"); uint256 unstakeAmount = _count * DEPOSIT_SIZE; ... } ``` However, the verification condition of the `count` is too broad. One unit represents 32 native tokens with precision (32 * 10**18), so the function allows users to withdraw less than `1 * 10**18 * 32 * 10**18` native tokens at a time. It is unlikely that someone will hold so many native tokens, so the verification condition is meaningless.
Open the reportAccording to the logic, if the user stakes more than 32 native tokens, tokens will be deposited into the `Deposit` contract through the `stake()` function. However, if the user calls `unstake()` function, the contract will not transfer the staked tokens from the `Deposit` contract to the user.
Open the reportWhen transferring deflationary ERC20 tokens, the input amount may not be equal to the received amount due to the charged transaction fee. For example, if a user sends 100 deflationary tokens (with a 10% transaction fee), only 90 tokens actually arrived to the contract. However, a failure to discount such fees may allow the same user to withdraw 100 tokens from the contract, which causes the contract to lose 10 tokens in such a transaction. Reference: https://thoreum-finance.medium.com/what-exploit-happened-today-for-gocerberus-and-garuda-also-for-lokum-ybear-piggy-caramelswap-3943ee23a39f ```solidity=143 require(token.transferFrom(msg.sender, address(this), _amount)); ``` - Transferring tokens by `_amount`. ```solidity=154 user.activeDonation += _amount; ``` - The `_amount` appears to be used for bookkeeping purposes without compensating the potential transfer fees. --- ```solidity=77 require(token.transferFrom(msg.sender, address(this), _amount)); ``` - Transferring tokens by `_amount`. ```solidity=79 u.stakingAmount += _amount; ``` - The `_amount` appears to be used for bookkeeping purposes without compensating the potential transfer fees.
Open the reportOpenZeppelin's `SafeMath` library is not used in the above contracts, making it possible for overflow/underflow to occur and lead to inaccurate calculations.
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 assume 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=15 IERC20 public token; ``` - The contract `BuidlDonation` interacts with third party contract with `IERC20` interface via `token`. --- ```solidity=11 IERC20 public token; ``` - The contract `DoraChecker` interacts with third party contract with `IERC20` interface via `token`.
Open the reportAccording to the logic, the user who called the `init()` function will be set as the owner of the contract. ```solidity=66 function init(IERC20 _token, DoraChecker _checker) external { require(owner == address(0)); owner = msg.sender; token = _token; checker = _checker; } ``` However, after the `owner` is set, it is not used at all.
Open the reportThe `qf_tests` module is only used for testing. The `qf` module cannot be compiled successfully if it is not removed. File: qf.move ```rust=4 module QF::qf { friend QF::qf_tests; ... } ``` File: qf.test.move ```rust=1 #[test_only] module QF::qf_tests { ... } ```
Open the reportSome variables are declared but never used.
Open the report| Address | Chain | Source code |
|---|---|---|
| 0x70b7…38b20x70b790d0948a760e80bc3f892b142f7779b538b2 | Chain: Ethereum | 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="dora-factory"></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