BackedBy - Audit

CertiKFiles named in the report

CertiK reviewed BackedBy (BackedBy - Audit) on 4 Jan 2023: 6 findings, 0 critical; 5 marked fixed, 1 acknowledged.

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

Report hosted on skynet.certik.com.

Trustblock does not review code.

Findings6

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

SeverityOpenAcknowledgedFixed
Critical000
High011
Medium000
Low004
HighIncorrect handling of _ownedProfiles mapping updaFixed

There is an issue with the current logic for updating the `_ownedProfiles` mapping within the `editProfile()` code for the original owner when ownership transfers occur. The current logic sets the final index of the `_ownedProfiles` mapping of the original owner to the `profileId` of the profile that is being set to change owners: ```solidity=97 _ownedProfiles[msg.sender][_ownersTotalProfiles[msg.sender] - 1] = _ownedProfiles[msg.sender][_ownedProfilesIndexes[msg.sender][profileId]]; ``` This line of code overwrites the last profile index of the caller's `_ownedProfiles` mapping to the profile that is being transferred to the new owner. This means that the profile that is supposed to be transferred remains in the caller's mapping and even overwrites the caller's last active profile. This would also have an impact when `getOwnersProfiles()` is run since the `profileId` that is being transferred is still being shown under the previous owner in the `_ownedProfiles` mapping.

LowChange logic to skip irrelevant `renewIndexes`Fixed

The current logic for `performUpKeep()` might result in the function reverting after a series of updates and payments, which will be a waste of gas, and updates will need to be executed again from the beginning. The issue is mainly related to the two require statements as shown below: ```solidity=95 require(_subscriptions[renewIndexes[i]].expiration < block.timestamp, BBErrorCodesV01.SUBSCRIPTION_NOT_EXPIRED); require(_subscriptions[renewIndexes[i]].cancelled == false, BBErrorCodesV01.SUBSCRIPTION_CANCELLED); ```

LowLack of checks for types of token contracts accepFixed

The design currently allows anyone to run the `deploySubscriptions()` function and set a subscription to allow any valid currency contract address. This might allow attackers to use malicious contracts included as a `currency` contract.

LowLacks checks of input parameters decoded from inpFixed

For both functions `checkUpkeep()` and `performUpkeep()` there is no checking of the parameters decoded from the input data. Specifically for sensitive information like the `renewIndexes` and `refundReceiver` addresses, it would be useful to have a check to ensure that valid input values have been submitted into the function.

LowLogic can be consolidated for `checkUpkeep()`Fixed

The two loops within function `checkUpKeep()` are essentially looping through the same values twice.

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 (13)

  • contracts/interfaces/IBBSubscriptionsFactory.sol
  • contracts/interfaces/IBBPosts.sol
  • contracts/BBSubscriptions.sol
  • contracts/interfaces/IBBSubscriptions.sol
  • contracts/interfaces/IBBTiers.sol
  • contracts/BBPosts.sol
  • contracts/BBSubscriptionsFactory.sol
  • contracts/interfaces/IBBPermissionsV01.sol
  • contracts/BBErrorsV01.sol
  • contracts/BBProfiles.sol
  • contracts/BBTiers.sol
  • contracts/interfaces/IBBProfiles.sol
  • contracts/DateTimeLibrary.sol

Part of BackedBy’s security record

BackedBy
Audits1 audit by 1 firmLast audit Jan 2023, by CertiK.
Critical findingsNo open critical findingsIn 1 report.
Open BackedBy’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