---
# System prepended metadata

title: Dtrade Audit Notes

---

# Dtrade Audit Notes

**Auditor:** Jake Bunce

**Client:** Dtrade https://dtrade.org/

https://github.com/dtradeorg/dtrade_v1

**Files Scoped:** `contracts/TradeInfo.sol`, `contracts/TradeMining.sol`

https://github.com/dtradeorg/orderbook-contracts

**Files Scoped:** Repo

## Whitepaper & specification about the project 

Whitepaper: 

Project is a trading platform.


## Review of the protocol/implementation

**[1] Unlocked Pragma**

**Files Affected:** `contracts/TradeInfo.sol`, `contracts/TradeMining.sol`

**Severity: Low**

Default AL text.

**Recommendations:**

Default AL text.

**[2] Multiple Instances of Unsafe Arithmetic**

**Files Affected:** `contracts/TradeMining.sol`

**Severity: Medium**

[`_updateParamsForEpoch`](https://github.com/dtradeorg/dtrade_v1/blob/main/contracts/TradeMining.sol#L499) has multiple instances of arithmetic where operations are susceptible to over/underflows due to a lack of use of the `SafeMath` library.

**Recommendations:**

Either use the `SafeMath` library consistently throughout the project or move to Solidiy >= `0.8.0` which has this protection built into the compiler.

**[3] Inconsistent Variable Naming**

**Files Affected:** `contracts/TradeMining.sol`

**Severity: Informational**

The docstrings for [`variable assignments`](https://github.com/dtradeorg/dtrade_v1/blob/main/contracts/TradeMining.sol#L84) appear to use cycle and epoch interchangably. 

**Recommendations:**

Use a consistent naming scheme or clarify the difference between an epoch and a cycle.

**[4] Expiry of Rewards**

**Files Affected:** `contracts/TradeMining.sol`

**Severity: Informational**

Users should be made aware of the expiry of rewards should they not be claimed.

**Recommendations:**

Provide comprehensive user documentation that describes this behaviour.

**[5] Constructor Argument Checks**

**Files Affected:** `contracts/TradeMining.sol`

**Severity: Low**

[`initialize()`](https://github.com/dtradeorg/dtrade_v1/blob/main/contracts/TradeMining.sol#L124) does not check if the address passed is a contract or an EOA for the reward token nor the trade info contract. This helps verify that the constructor arguments are correct.

**Recommendations:**

Use OpenZeppelin's [`Address.isContract()`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Address.sol) library to check if the address passed is a contract.

**[6] Unsafe Transfer Call**

**Files Affected:** `contracts/TradeMining.sol`

**Severity: Medium**

[`removeFunds()`](https://github.com/dtradeorg/dtrade_v1/blob/main/contracts/TradeMining.sol#L420) uses `transfer()` to send the DET token. This is unsafe as it uses a fixed amount of gas. Should the amount of gas required to execute increase in the future, this function may not complete.

**Recommendations:**

Use `call()` instead.

**[7] ABIEncoderV2 Not Considered Experimental**

**Files Affected:** `contracts/TradeInfo.sol`

**Severity: Low**

In Solidity version >=`0.7.4` the [`ABIEncoderV2`](https://github.com/dtradeorg/dtrade_v1/blob/main/contracts/TradeInfo.sol#L3) is not considered experimental.

**Recommendations:**

If the version of Solidity in use is >=`0.7.4` change the statement to `pragma abicoder v2`

**[8] Orderbook Solidity Version**

**Files Affected:** `https://github.com/dtradeorg/orderbook-contracts/*.sol`

**Severity: Informational**

`pragma solidity 0.5.16;` is the main version used in the orderbook repo. This is an old version and doesn't include protection for issues like over/underflows.

**Recommendations:**

Move to a more recent version, such as `=>0.8.0+`


**[9] No Validation of TradeInfo Contract**

**Files Affected:** `protocol/v1/impl/Admin.sol`

**Severity: Low**

[`setTradeInfo()`](https://github.com/dtradeorg/orderbook-contracts/blob/qs-audits/contracts/protocol/v1/impl/Admin.sol#L110) has no validation check to verify that the `tradeInfo` is the correct contract. Other update functions have this validation step. Same applies to [`setFeePool`](https://github.com/dtradeorg/orderbook-contracts/blob/qs-audits/contracts/protocol/v1/impl/Admin.sol#L121).

**Recommendations:**

Consider adding a check to verify the contract argument address is correct to be consistent with other functions.

**[10] Shared Event Emitted**

**Files Affected:** `protocol/v1/impl/MarginBank.sol`

**Severity: Low**

[`addMarginFromBank()`](https://github.com/dtradeorg/orderbook-contracts/blob/qs-audits/contracts/protocol/v1/impl/MarginBank.sol#L107) uses the `LogBankWithdraw` event, which is also used by `withdrawFromBank()` and `transferFrom()`. Each event should be unique so that it is clear what operation was taken when monitoring in production.

**Recommendations:**

Create seperate events and emit for each distinct operation.

**[11] Inconsistent Global Operator Management**

**Files Affected:** `protocol/v1/impl/MarginBank.sol`, `protocol/v1/PerpetualV1.sol`, `protocol/v1/impl/Debt.sol`

**Severity: Medium**

There is an inconsitency between the way that admin functions are implemented. For example, `Admin.sol` has `setGlobalOperator()` defined which controls [setting the global operator](https://github.com/dtradeorg/orderbook-contracts/blob/qs-audits/contracts/protocol/v1/impl/Admin.sol#L52). This is also present in [MarginBank.sol](https://github.com/dtradeorg/orderbook-contracts/blob/qs-audits/contracts/protocol/v1/impl/MarginBank.sol#L258) though the implementations differ. The check for the valid MarginBank ERC20 could be bypassed by calling the other `setGlobalOperator()` from `Admin.sol` and adding the `_GLOBAL_OPERATORS_[operator]` though a different call.

**Recommendations:**

Move to using a single admin implementation that's used for all admin operations and modifiers across the contracts.

**[12] Unprotected Admin Function**

**Files Affected:** `protocol/v1/impl/Operator.sol`

**Severity: High** 

[`setLocalOperator()`](https://github.com/dtradeorg/orderbook-contracts/blob/qs-audits/contracts/protocol/v1/impl/Operator.sol#L36) may be called by anybody, allowing a state change of the calling party to added to `_LOCAL_OPERATORS_`

**Recommendations:**

Clarify whether this is intentional or add a modifier to prevent this function from being called from a third party.

**[13] Large Number of accounts can lead to DoS**

**Files Affected:** `protocol/v1/impl/Settlement.sol`

**Severity: Medium**

Within `_settleAccounts` there is a [`loop`](https://github.com/dtradeorg/orderbook-contracts/blob/qs-audits/contracts/protocol/v1/impl/Settlement.sol#L144) which will iterate through all accounts. If the size of this accounts array contains a large number of users, this function will never complete.

**Recommendations:**

Consider adding an upper bound of number of accounts to settle to always ensure this function will execute correctly.

**[14] Traders can trade with themselves**

**Files Affected:** `protocol/v1/impl/Trade.sol`

**Severity: Medium**

Within `trade()` there is a check that the maker and taker are the [same account](https://github.com/dtradeorg/orderbook-contracts/blob/qs-audits/contracts/protocol/v1/impl/Trade.sol#L125). The maker and taker should be different accounts and they should not be allowed to trade with each other.

**Recommendations:**

Do not allow users to trade with themselves.

**[15] Incomplete Implementation**

**Files Affected:** `protocol/v1/traders/Trader.sol`

**Severity: Medium**

This contract is incomplete, yet other contracts import Trader.sol and could be relying on its functionality.

**Recommendations:**

Fully implement this contract or remove the file and imports to it.

## Best Practices

**[1] Update docstring**

**Files Affected:** `contracts/TradeMining.sol`

The docstring on [`line 14`](https://github.com/dtradeorg/dtrade_v1/blob/main/contracts/TradeMining.sol#L14) should be updated to reflect the migrated token ticker. DET -> DTX on Kusama, DET -> FFLY in production. 

Same applies to variable assignment and function argument name `detToken`.

**[2] Variable Missing Docstring**

**Files Affected:** `contracts/TradeMining.sol`

Variable [`totalRewardsToDistribute`](https://github.com/dtradeorg/dtrade_v1/blob/main/contracts/TradeMining.sol#L95) is missing a docstring.

**[3] Typo in Docstring**

**Files Affected:** `contracts/TradeMining.sol`

[`rewrds`](https://github.com/dtradeorg/dtrade_v1/blob/main/contracts/TradeMining.sol#L97) -> rewards

**[4] Unnecessary Comment**

**Files Affected:** `contracts/TradeInfo.sol`

No enums are [defined](https://github.com/dtradeorg/dtrade_v1/blob/main/contracts/TradeInfo.sol#L20)

**[5] Leading blank lines can be removed**

**Files Affected:** `protocol/v1/impl/FinalSettlement.sol`, `protocol/v1/lib/BalanceMath.sol`, `protocol/v1/impl/Operator.sol`, `protocol/v1/intf/I_Funder.sol`,
`protocol/v1/intf/I_Oracle.sol`,
`protocol/v1/intf/I_Trader.sol`,
`protocol/v1/lib/BalanceMath.sol`,
`protocol/v1/lib/IndexMath.sol`,
`contracts/protocol/v1/lib/Types.sol`,
`protocol/v1/oracles/FundingOracle.sol`,
`protocol/v1/oracles/InverseFundingOracle.sol`,
`protocol/v1/traders/type/OrderTrader.sol`,
`/protocol/v1/traders/Trader.sol`,
`protocol/v1/traders/TraderConstants.sol`,
`protocol/PerpetualProxy.sol`