Zoniqx

QuillAuditsFiles named in the report

Audit · firm’s term: audit report

QuillAudits reviewed Zoniqx on 6 May 2024: 17 findings, 0 critical; 16 marked fixed, 1 open.

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

Report hosted on quillaudits.com.

Trustblock does not review code.

Findings17

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

SeverityOpenAcknowledgedFixed
Critical000
High103
Medium000
Low0013
HighIncorrect Allowance Verification and HandlingFixed

The safeTransferFrom method incorrectly handles the allowance verification due to a parameter mismatch and a logical error in the associated _spendAllowance method. This issue arises because the function uses a hardcoded zero (0) for the token ID instead of the actual token ID provided to the function, and there's a mix-up between the amount and id parameters in _spendAllowance.Impact: This flaw allows users (e.g., delegated operators) to potentially transfer tokens beyond their authorized allowance, leading to unauthorized asset movement and breach of trust assumptions in the token management system. It undermines the ERC-1155 standard's security guarantees regarding token transfers and allowance management.

HighLocked Tokens can be transferred before release durationFixed

The erc7518 specification states that only unlocked assets can be transferred or used by users who own them, however the safeBatchTransferFrom() allows the users to move their funds as this method is directly inherited from the ERC1155Upgradeable contract and is not overridden like safeTransferFrom() that implements additional checks like canTransfer to ensure correct restrictions and signatures are provided before transfers are made.

HighUnauthorized Token Locking and UnlockingFixed

The lockTokens method in the contract lacks necessary authorization checks to verify if the caller has the right to lock tokens for the specified account. This allows any user to lock any amount of tokens belonging to any account, leading to potential misuse where tokens can be frozen maliciously without the owner's permission.

LowInconsistent function naming may cause confusionFixed

The naming of the forceTokenUnlock() and _forceUnlockTokens functions in ERC7518.sol are inconsistent, which could lead to confusion about their functionality.

LowInsufficient Input ValidationsFixed

The methods listed above do not check for the validity of the incoming function arguments which might result in setting invalid values such as for the payout address or an excessively large floor price, potentially leading to loss of funds or failed transactions.

LowInsufficient NatSpecFixed

The contracts and methods listed above perform critical functionality to manage users' assets and funds. However, there is no supporting documentation provided for NatSpec that explains the business needs and limitations of the applications which can cause misunderstandings and threaten users' operations.

LowMissing non-reentrant modifierFixed

The batchPayout() function lacks a non-reentrant modifier, potentially allowing reentrancy attacks which could lead to unexpected behaviors or exploits.

LowRemove redundant checks for to AddressFixed

Redundant checks for the to address in the _payout() function can lead to unnecessary gas consumption and code complexity. This check is already placed inside ERC20Upgradeable contract that handles the payout's transfer call underneath.

LowRemove unused fn args and ret varsFixed

Some functions in the listed contracts include arguments or return variables that are never used, leading to unnecessary code complexity and gas costs. For instance, the data variable in freeze() and unfreeze() is never utilized in the method for operation. Similarly, in the getDealsCount(), the return value deals is never used.

LowSubstandard args order may cause confusion for usersFixed

The order of arguments in verifySignature() _transferTokensToInvestor() is unconventional and might cause confusion, potentially leading to incorrect implementations or usage.

Show 6 more
LowUnconformed context fetchingFixed

The _msgSender and _msgData methods in the ERC2771ContextUpgradeable contract do not conform to a set standard while fetching the data or caller from the context as the sender is extracted using assembly code block which has proven manipulatable in past due to either delegatecalls or by calldata stuffing.

LowUngraceful Event EmissionFixed

The _changePayoutAddress() method does not emit the previous payout address when it is changed, which can obscure tracking of changes in the contract state.

LowUnimplemented Interface for ERC7518Marketplace contractFixed

There is a typo in the interface at changeComplainceAddress which could lead to implementation errors or issues when interfacing with other contracts. Additionally, the interface is not implemented in the ERC7518Marketplace contract, specifically for create() method the contract implements a different function selector with additional arguments that deviate from the interface.

LowUnordered methods according to Solidity style docFixed

The methods in CompliTo.sol and ERC1155Mod.sol are not organized according to the Solidity style guide which recommends ordering methods by visibility and functionality so that gas consumption for all users facing external or public methods are optimized.

LowUnsanitized freezing, restriction and whitelist removal operationsFixed

Methods such as _freeze(), _unfreeze() in FreezeAddress.sol, _removeFromWhiteList() in IssuerFactory.sol and _restrict(), _removeRestriction() in RestrictTransfer.sol are performed without checking the previous state of the account address. This oversight can lead to redundant operations and event spamming, which may impact the efficiency and reliability of the system. For instance, the ERC7518 token standard specs state the following about _removeRestriction() > MUST check if id is previously restricted.

LowUse Block Letters for enum variablesFixed

The enumerable structs InvestmentStatus and InvestmentType in the PaymentTracker contract do not implement the variables inside in uppercase format, which is the standard practice for enums to differentiate them from other variables and mark the use of uint8 variable for enums.

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

  • contracts/ERC1155Mod.sol
  • IMarketPlace.sol
  • FreezeAddress.sol
  • contracts/module/IssuerFactory.sol
  • STOBaseV2.sol
  • contracts/module/ERC2771ContextUpgradeable.sol
  • contracts/module/PaymentTracker.sol
  • ERC7518.sol
  • ERC1155Permit.sol
  • Payout.sol
  • contracts/CompliTo.sol
  • contracts/interfaces/IMarketPlace.sol
  • TokenLock.sol
  • RestrictTransfer.sol
  • contracts/module/RestrictTransfer.sol
  • contracts/ERC7518.sol
  • ERC2771Context.sol
  • ERC7518MarketPlace.sol
  • ERC1155AllowanceWrapper.sol
  • AggregatorV3Interface.sol
  • Nonce.sol
  • CompliTo.sol
  • IERC7518.sol
  • contracts/module/Payout.sol
  • ERC1155Mod.sol
  • ERC2771ContextUpgradeable.sol
  • PaymentTracker.sol
  • IssuerFactory.sol
  • ICompliTo.sol
  • contracts/module/FreezeAddress.sol
  • contracts/interfaces/ICompliTo.sol
  • contracts/STOBaseV2.sol

Part of Zoniqx’s security record

Zoniqx
Audits1 audit by 1 firmLast audit May 2024, by QuillAudits.
Critical findingsNo open critical findingsIn 1 report.
Open Zoniqx’s security record

Security firm

QuillAudits

350 projects reviewed · 459 reports · latest Apr 2025

See QuillAudits’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