Bancor Governence

CertiKFiles named in the report

CertiK reviewed Bancor (Bancor Governence) on 9 Oct 2020: 9 findings, 0 critical; 5 marked fixed, 4 open.

No open critical findings
Open the reportOpen Bancor’s security record

Report hosted on skynet.certik.com.

Trustblock does not review code.

Findings9

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

SeverityOpenAcknowledgedFixed
Critical000
High002
Medium000
Low403
HighFront-running Attack VectorFixed

`tallyVotes` function (L390 - L405) which is executed in the `execute` function (L370 - L383) is marked as a public function. During the `execute` function, `tallyVotes` changes the `proposals[_id].open` property from `true` to `false`. This param is used in the `proposalEnded` modifier, leading to an `ERR_NOT_OPEN` throw if the proposal is closed and reverting the transaction. `tallyVotes` can be called by anyone who knows the `id` of the proposal to close it and thus stoping further execution of the proposal. This attack vector is especially exploitable via a front-running attack whereby one inspects the transaction mempool of Ethereum, detects an `execute` contract call and invokes `tallyVotes` beforehand with a higher gas fee.

HighVote ManipulationFixed

The `unstake` and `revokeVotes` functions affect the `totalVotes` variable of the contract, however they do not adjust already-voted-on proposals. This leads to proposals reporting invalid quorums and total votes available as they are re-set on each vote. This is especially exploitable in case a proposal's expiration is before the vote lock mechanism, meaning a double-vote can occur without losing balance. To replicate this issue, simply `stake` some new tokens for 2 different accounts. Have account A vote for a proposal and then instantly revoke his votes and have account B vote against a proposal. The `totalVotesAvailable` and `quorum` variables of the proposal will be incorrect, leading to invalid calculations on all functions relating to a proposal's acceptance.

LowComparison to a boolean constantFixed

The `onlyVoter()` modifier uses a boolean value to compare with a boolean literal.

LowDuplication of the codeFixed

modifiers `proposalNotEnded` and `proposalEnded` share the same code in the first `require` which could be put into its own modifier code. This can cause some confusion and potential issues when one code block is updated and other one not.

LowMark external calls safe / no safeFixed

`IExecutor(proposals[_id].executor).execute(_id, forRatio, againstRatio, quorumRatio)` function call is an external function call. While re-entrancy is not possible for the `execute` function of the `BancorGovernance` contract, other unintended re-entrancy interactions may occur by the external contract should the quorum of Bancor not have vetted its code properly.

Contracts in scope

No deployed address is recorded for this audit.

The report names a repository or files. Open the report to see its scope.

Repository and files the report names (4)

  • IOwned.sol
  • Owned.sol
  • IExecutor.sol
  • BancorGovernance.sol

Part of Bancor’s security record

Bancor
Audits6 audits by 4 firmsLast audit Sep 2023, by ChainSecurity.
Critical findingsNo open critical findingsAcross the 6 reports, 1 critical finding was reported. It is marked fixed by the firm that reported it.
IncidentIncident 17 Jun 2020Source: De.Fi incident database.
Open Bancor’s security record

Security firm

CertiK

1,044 projects reviewed · 1,375 reports · latest May 2025

See CertiK’s audits

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