Jelly -Watt2Trade

QuillAuditsFiles named in the report

Audit · firm’s term: audit report

QuillAudits reviewed Jelly -Watt2Trade on 16 Oct 2023: 9 findings, 0 critical; all marked fixed.

No open critical findings
Open the reportOpen Jelly -Watt2Trade’s security record

Report hosted on quillaudits.com.

Trustblock does not review code.

Findings9

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

SeverityOpenAcknowledgedFixed
Critical000
High002
Medium001
Low006
HighCostly DOS for futureOrder traders due to cancellations array loop execution in withdrawFutureOrder()Fixed

When a trader calls withdrawFutureOrder(), it iterates through the FutureCancellations array of the futureOrder to ensure the trader is eligible by first-come-first-serve approach. The issue arises from the cancellations array being a user manipulated array and also never gets decreased. Iterating through such an array where users can decide how large the array can grow could cause a revert due to out of gas error, meaning traders attempting to withdraw their futureOrder would fail causing DOS.

HighNot updating on withdrawal opens opportunity to draining fundsFixed

The withdrawOptionOrder() function doesn't delete the sell order on withdraw of sell trade as stated here:https://github.com/Watt-2-Trade/dex-smartcontracts/blob/main/contracts/EscrowAccount.sol#L707 . However, it doesn't include any update to the withdrawal. Trader of the optionSellOrder can execute this action for an infinite amount to drain out funds.

MediumLack of unwhitelist function on sensitive permission lead to unavertable DOS privilegeFixed

admin calling `StakingVault::whitelistContractAddress()` on any address allows that address to call the `StakingVault::consumeCoins()` function, this also gives that address the ability to DOS any user from removing their coins. However, there is NO undo function on this operation, meaning if this happens it would be permanent and unavertable.

LowComparison of values to a boolean constantFixed

Some mappings were used in the contract to map addresses to a boolean. This is to help know when a value is true or false. However, because these are the only two possible outcomes, it is recommended to use the mapping to serve as the condition within the require statement.  W2TContractAddress[msg.sender] is expected to return a true while !W2TContractAddress[msg.sender] for false.StakingVault: • onlyW2T modifier EscrowAccount: • placeOptionSellOrder • placeOptionBuyOrder

LowFunctions certain to fail when called by unpermitted address should be marked as payable to save gasFixed

There are some privileged functions in all the contracts under scope that allow for either admin or whitelisted addresses to call, else it fails. Since these functions are certain to fail when triggered when unpermitted addresses, they can be marked as payable functions. Payable functions are cheaper when called and can save over 50 gas or more.

LowMissing check for zero addressFixed

Updating state changes that pertains to addresses are a critical action especially avoiding setting any to the null address. For instance, on changing the ENERGY_COIN address in the staking vault contract to a zero address, this would disrupt the contract flow and cause a denial of service. StakingVault: • consumeCoins EscrowAccount: • adjustContractAddresses

LowPermanent unprotected admin addressFixed

Hardcoding the admin address set to constant and also not a multisig creates a point of target to attackers and leaves the contract permanently unprotected if compromised. This will make it impossible to carry out a swift incident response process to curtail the attack. This is common across all contracts under audit scope.

LowRedundant code creationFixed

Unnecessary code implemented on update functions can be removed to save gas. In the preceding lines before the issue pointed out, a new local variable was created called newGen. The newGen variable equals the summation of the CURRENT_FEE_GEN and 1. After updating all mappings that pertains to the fee, the state variable CURRENT_FEE_GEN was afterwards set to newGen. For an optimized code, it is okay to update the CURRENT_FEE_GENhttps://github.com/Watt-2-Trade/dex-smartcontracts/blob/main/contracts/EscrowAccount.sol#L1042 https://github.com/Watt-2-Trade/dex-smartcontracts/blob/main/contracts/EscrowAccount.sol#L1062

LowUpdate all state changes before invoking external functionsFixed

In the removeCoins function from the StakingVault contract, an external call was made to the Energy Coin contract before state variables were updated. This exposes the contract to the possibility of a reentrancy. This negates the principle of the check-effect interaction that poses the need for all state updates before an external call. This is also common in the withdrawOptionOrder and withdrawStakingVault: • removeCoins EscrowAccount: • withdrawOptionOrder • withdrawFutureOrder

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

  • contracts/Common.sol
  • EscrowAccount.sol
  • contracts/EscrowAccount.sol
  • contracts/ElectricityPrices.sol
  • blob/50338be7b27cc73cf60bdf882d61b7d25f083612/contracts/EscrowAccount.sol
  • contracts/StakingVault.sol

Part of Jelly -Watt2Trade’s security record

Jelly -Watt2Trade
Audits1 audit by 1 firmLast audit Oct 2023, by QuillAudits.
Critical findingsNo open critical findingsIn 1 report.
Open Jelly -Watt2Trade’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