Dora Factory security record

As of 21 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.

Critical findings
1 critical acknowledged, not fixed
Reported in “Dora Vota audit” by Oak Security, Jun 2024. The team acknowledged it. See the findings
Open the latest report
Your label, live
Get the label for your site

Record last updated . It holds audits and findings, contracts and incidents up to Oct 2026. Trustblock does not review code.

Audits4

Newest first

AuditSecurity firmDateScopeCritical findingsReport
Dora Vota auditSecurity firm: Oak SecurityDate: Scope: Not recorded (see the report)1 critical acknowledged, not fixedOpen · GitHub
DORA ERC20 Contract Update-AuditSecurity firm: CertiKDate: Scope: 1 address on EthereumNo open critical findingsOpen · skynet.certik.com
Dora Grant DAO V4Security firm: CertiKDate: Scope: Files named in the reportNo open critical findingsOpen · skynet.certik.com
Aptos Grant DAO-AuditSecurity firm: CertiKDate: Scope: Not recorded (see the report)No open critical findingsOpen · skynet.certik.com

Findings32

Statuses are the security firm’s own, from each report.

SeverityOpenAcknowledgedFixed
Critical010
High251
Medium001
Low8212
HighVulnerability in wasmvm packageDora Vota audit · Oak Security · 13 Jun 2024Fixed

The report gives no description here.

Open the report
MediumUpdate `min_area` MistakenlyAptos Grant DAO-Audit · CertiK · 28 Oct 2022Fixed

The `min_area` is updated mistakenly. In the `else-if` condition, the `min_area` may not be the current project's `area`. Because the current project's `area` increases at this time, the real `min_area` may come from the previous second smallest project. For example: - Project A has the smallest area at this moment, and its `area` is 10. - Project B is the second smallest project at this moment,, and its `area` is 12. - Someone votes the project A again, and its `area` is 15 now. In this time, the `else-if` condition is met and the `min_area` will be updated to `15`. However, the real `min_area` should be 12, and the `min_area_index` should be the id of project B. ```rust=538 if(area < round.min_area || round.min_area == 0) { round.min_area = area; round.min_area_index = project_id; } else if(round.min_area_index == project_id) { round.min_area = area; }; ``` ```rust=550 if(area < track.min_area || track.min_area == 0) { track.min_area = area; track.min_area_index = project_id; } else if(track.min_area_index == project_id) { track.min_area = area; }; ```

Open the report
LowVulnerabilities in cosmos/cosmos-sdk packageDora Vota audit · Oak Security · 13 Jun 2024Fixed

The report gives no description here.

Open the report
LowStake Cannot Be Fully WithdrawnDora Grant DAO V4 · CertiK · 6 Mar 2023Fixed

The function `exit()` requires the `_amount` less than the `stakingAmount` of users, which means users cannot withdraw all staked tokens. ```solidity=82 function exit(uint256 _amount) external nonReentrant { User storage u = user[msg.sender]; require(u.stakingAmount > _amount); u.stakingAmount -= _amount; u.exitAmount += _amount; u.exitTime = block.timestamp + EXIT_BUFFER_TIME; emit Exit(msg.sender, _amount); } ``` In the `slashTo`, users on the whitelist cannot withdraw all staked tokens from penalized accounts. ```solidity=143 function slashTo( address _slashed, address _to, uint256 _amount ) external { ... uint256 totalAmount = u.stakingAmount + u.exitAmount; require(_amount < totalAmount); require(slashedAmount[_slashed] + _amount < totalAmount); ... } ```

Open the report
LowTypoDora Grant DAO V4 · CertiK · 6 Mar 2023Fixed

The variable in the above lines should be named `_reentrancyLock`.

Open the report
LowUnlocked Compiler VersionDora Grant DAO V4 · CertiK · 6 Mar 2023Fixed

The contract has unlocked compiler version. An unlocked compiler version in the source code of the contract permits the user to compile it at or above a particular version. This, in turn, leads to differences in the generated bytecode between compilations due to different compiler versions. This can lead to an ambiguity when debugging as compiler specific bugs may occur in the codebase that would be hard to identify over a span of multiple compiler versions rather than a specific one.

Open the report
LowUnprotected InitializerDora Grant DAO V4 · CertiK · 6 Mar 2023Fixed

One or more logic contracts do not protect their initializers. An attacker can call the initializer and assume ownership of the logic contract, whereby she can perform privileged operations that trick unsuspecting users into believing that she is the owner of the upgradeable contract. ```solidity=7 contract BuidlDonation { ``` - `BuidlDonation` is an upgradeable contract that does not protect its initializer. ```solidity=66 function init(IERC20 _token, DoraChecker _checker) external { ``` - `init` is an unprotected initializer function. --- ```solidity=6 contract DoraChecker { ``` - `DoraChecker` is an upgradeable contract that does not protect its initializer. ```solidity=52 function init(IERC20 _token) public { ``` - `init` is an unprotected initializer function.

Open the report
LowA Controversial RestrictionAptos Grant DAO-Audit · CertiK · 28 Oct 2022Fixed

Please confirm which one of following restrictions is more suitable. - `amount > pow_10_decimals / round.voting_unit` - `amount >= pow_10_decimals / round.voting_unit`

Open the report
LowCode OptimizationAptos Grant DAO-Audit · CertiK · 28 Oct 2022Fixed

The `round_id` is never changed in the while-loop, so it only needs to be checked once. It would be a waste of gas to check every iteration. ```rust=474 while(i < length) { let project_id = *vector::borrow(&project_ids, i); check_project_id(round_id, project_id); let amount = *vector::borrow(&amounts, i); let data = borrow_global_mut<Data>(@QF); let round = vector::borrow_mut(&mut data.rounds, round_id-1); assert!( round.status == ROUND_STATUS__OK, error::invalid_state(ERR_ROUND_STATUS_NOT_OK) ); ... ```

Open the report
LowImport Module from Wrong PackageAptos Grant DAO-Audit · CertiK · 28 Oct 2022Fixed

The `event` module is declared in the `aptos_framework`. However, the module `qf` import `event` from the package `aptos_std` as below. ```rust=13 use aptos_std::event; ```

Open the report
Show 4 more
LowInappropriate `error::already_exists`Aptos Grant DAO-Audit · CertiK · 28 Oct 2022Fixed

```rust=144 assert!( exists<Data>(@QF), error::already_exists(ERR_NOT_PUBLISHED), ); ``` The error code will be issued when `@QF` has no resource `Data`, so it is not appropriate to use `error::already_exists` here.

Open the report
LowLack of Restrictions on `votes`Aptos Grant DAO-Audit · CertiK · 28 Oct 2022Fixed

Accuracy loss may occur in the calculation of the `votes`. ```rust=508 let votes = amount * round.voting_unit / pow_10_decimals; ```

Open the report
LowUnused ConstantsAptos Grant DAO-Audit · CertiK · 28 Oct 2022Fixed

Many constant variables are declared but never used in the project.

Open the report
LowWrong Event ParameterAptos Grant DAO-Audit · CertiK · 28 Oct 2022Fixed

```rust=557 event::emit_event(&mut data.events, QFEvent { type: EVENT_TYPE__VOTE, account: account_addr, round: round_id, project: round.project_number, amount, }); ``` According to the logic of the function `batch_vote()`, the event emitted should record the id of the project being voted.

Open the report

Contracts1

AddressChainSource code
0x70b790d0948a760e80bc3f892b142f7779b538b2Chain: EthereumSource code: Verified source

All 1 address and the files the reports name

Show this on your site

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.

Content

Facts

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.

Fixed as
Language

Style

Layout
Theme
Accent
Corners

Format

Size
Date
Embed as
HTML
<head>
<script src="https://widget.trustblock.run/project-widget.min.js" defer></script>
</head>
<body>
<div
data-tb-project-widget
data-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