Skip to content

Commit a0b7640

Browse files
authored
Merge pull request #485 from open-dollar/feature/hai-audit-fixes
Audit release: Feature/hai audit fixes
2 parents 7af6044 + d2c6bf8 commit a0b7640

39 files changed

+764
-201
lines changed

src/contracts/AccountingEngine.sol

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -313,7 +313,7 @@ contract AccountingEngine is Authorizable, Modifiable, Disableable, IAccountingE
313313

314314
/// @inheritdoc Modifiable
315315
function _validateParameters() internal view override {
316-
address(surplusAuctionHouse).assertNonNull();
317-
address(debtAuctionHouse).assertNonNull();
316+
address(surplusAuctionHouse).assertHasCode();
317+
address(debtAuctionHouse).assertHasCode();
318318
}
319319
}

src/contracts/CollateralAuctionHouse.sol

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -396,8 +396,8 @@ contract CollateralAuctionHouse is Authorizable, Modifiable, Disableable, IColla
396396
/// @inheritdoc Modifiable
397397
function _validateParameters() internal view override {
398398
// Registry
399-
address(liquidationEngine()).assertNonNull();
400-
address(oracleRelayer()).assertNonNull();
399+
address(liquidationEngine()).assertHasCode();
400+
address(oracleRelayer()).assertHasCode();
401401
// CAH Params
402402
_params.minDiscount.assertGtEq(_params.maxDiscount).assertLtEq(WAD);
403403
_params.maxDiscount.assertGt(0);

src/contracts/DebtAuctionHouse.sol

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -221,6 +221,6 @@ contract DebtAuctionHouse is Authorizable, Modifiable, Disableable, IDebtAuction
221221

222222
/// @inheritdoc Modifiable
223223
function _validateParameters() internal view override {
224-
address(protocolToken).assertNonNull();
224+
address(protocolToken).assertHasCode();
225225
}
226226
}

src/contracts/LiquidationEngine.sol

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -301,13 +301,13 @@ contract LiquidationEngine is
301301

302302
/// @inheritdoc Modifiable
303303
function _validateParameters() internal view override {
304-
address(accountingEngine).assertNonNull();
304+
address(accountingEngine).assertHasCode();
305305
}
306306

307307
/// @inheritdoc ModifiablePerCollateral
308308
function _validateCParameters(bytes32 _cType) internal view override {
309309
LiquidationEngineCollateralParams memory __cParams = _cParams[_cType];
310-
address(__cParams.collateralAuctionHouse).assertNonNull();
310+
address(__cParams.collateralAuctionHouse).assertHasCode();
311311
__cParams.liquidationQuantity.assertLtEq(MAX_RAD);
312312
}
313313

src/contracts/OracleRelayer.sol

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,7 @@ contract OracleRelayer is Authorizable, Disableable, Modifiable, ModifiablePerCo
169169
function _modifyParameters(bytes32 _param, bytes memory _data) internal override whenEnabled {
170170
uint256 _uint256 = _data.toUint256();
171171

172-
if (_param == 'systemCoinOracle') systemCoinOracle = IBaseOracle(_data.toAddress().assertNonNull());
172+
if (_param == 'systemCoinOracle') systemCoinOracle = IBaseOracle(_data.toAddress().assertHasCode());
173173
else if (_param == 'redemptionRateUpperBound') _params.redemptionRateUpperBound = _uint256;
174174
else if (_param == 'redemptionRateLowerBound') _params.redemptionRateLowerBound = _uint256;
175175
else revert UnrecognizedParam();
@@ -190,22 +190,22 @@ contract OracleRelayer is Authorizable, Disableable, Modifiable, ModifiablePerCo
190190
/// @dev Validates the address is IDelayedOracle compliant and returns it
191191
function _validateDelayedOracle(address _oracle) internal view returns (IDelayedOracle _delayedOracle) {
192192
// Checks if the delayed oracle priceSource is implemented
193-
_delayedOracle = IDelayedOracle(_oracle.assertNonNull());
193+
_delayedOracle = IDelayedOracle(_oracle.assertHasCode());
194194
_delayedOracle.priceSource();
195195
}
196196

197197
/// @inheritdoc Modifiable
198198
function _validateParameters() internal view override {
199199
_params.redemptionRateUpperBound.assertGt(RAY);
200200
_params.redemptionRateLowerBound.assertGt(0).assertLt(RAY);
201-
address(systemCoinOracle).assertNonNull();
201+
address(systemCoinOracle).assertHasCode();
202202
}
203203

204204
/// @inheritdoc ModifiablePerCollateral
205205
function _validateCParameters(bytes32 _cType) internal view override {
206206
OracleRelayerCollateralParams memory __cParams = _cParams[_cType];
207207
__cParams.safetyCRatio.assertGtEq(__cParams.liquidationCRatio);
208208
__cParams.liquidationCRatio.assertGtEq(RAY);
209-
address(__cParams.oracle).assertNonNull();
209+
address(__cParams.oracle).assertHasCode();
210210
}
211211
}

src/contracts/PIDRateSetter.sol

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ contract PIDRateSetter is Authorizable, Modifiable, IPIDRateSetter {
101101
function _validateParameters() internal view override {
102102
_params.updateRateDelay.assertGt(0);
103103

104-
address(oracleRelayer).assertNonNull();
105-
address(pidCalculator).assertNonNull();
104+
address(oracleRelayer).assertHasCode();
105+
address(pidCalculator).assertHasCode();
106106
}
107107
}

src/contracts/SurplusAuctionHouse.sol

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -139,16 +139,30 @@ contract SurplusAuctionHouse is Authorizable, Modifiable, Disableable, ISurplusA
139139
if (_bid <= _auction.bidAmount) revert SAH_BidNotHigher();
140140
if (_bid * WAD < _params.bidIncrease * _auction.bidAmount) revert SAH_InsufficientIncrease();
141141

142-
if (msg.sender != _auction.highBidder) {
143-
// If there was no previous bid then no transfer is needed
144-
if (_auction.bidAmount != 0) protocolToken.safeTransferFrom(msg.sender, _auction.highBidder, _auction.bidAmount);
142+
// The amount that will be transferred to the auction house
143+
uint256 _deltaBidAmount = _bid;
144+
145+
// Check if this is the first bid or not
146+
if (_auction.bidExpiry != 0) {
147+
// Since this is not the first bid, it might be that we need to repay the previous bidder
148+
if (msg.sender != _auction.highBidder) {
149+
protocolToken.safeTransferFrom(msg.sender, _auction.highBidder, _auction.bidAmount);
150+
151+
_auction.highBidder = msg.sender;
152+
}
153+
// Either we just repaid the previous bidder,
154+
// or this user is also the previous bidder and is incrementing his bid
155+
_deltaBidAmount -= _auction.bidAmount;
156+
} else {
157+
// This is the first bid
145158
_auction.highBidder = msg.sender;
146159
}
147-
protocolToken.safeTransferFrom(msg.sender, address(this), _bid - _auction.bidAmount);
148160

149161
_auction.bidAmount = _bid;
150162
_auction.bidExpiry = block.timestamp + _params.bidDuration;
151163

164+
protocolToken.safeTransferFrom(msg.sender, address(this), _deltaBidAmount);
165+
152166
emit IncreaseBidSize({
153167
_id: _id,
154168
_bidder: msg.sender,
@@ -222,7 +236,7 @@ contract SurplusAuctionHouse is Authorizable, Modifiable, Disableable, ISurplusA
222236

223237
/// @inheritdoc Modifiable
224238
function _validateParameters() internal view override {
225-
address(protocolToken).assertNonNull();
239+
address(protocolToken).assertHasCode();
226240
_params.bidReceiver.assertNonNull();
227241
}
228242
}

src/contracts/jobs/AccountingJob.sol

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,21 +3,22 @@ pragma solidity 0.8.19;
33

44
import {IAccountingJob} from '@interfaces/jobs/IAccountingJob.sol';
55
import {IAccountingEngine} from '@interfaces/IAccountingEngine.sol';
6-
import {IStabilityFeeTreasury} from '@interfaces/IStabilityFeeTreasury.sol';
76

87
import {Job} from '@contracts/jobs/Job.sol';
98

109
import {Authorizable} from '@contracts/utils/Authorizable.sol';
1110
import {Modifiable} from '@contracts/utils/Modifiable.sol';
1211

1312
import {Encoding} from '@libraries/Encoding.sol';
13+
import {Assertions} from '@libraries/Assertions.sol';
1414

1515
/**
1616
* @title AccountingJob
1717
* @notice This contract contains rewarded methods to handle the accounting engine debt and surplus
1818
*/
19-
contract AccountingJob is Job, Authorizable, Modifiable, IAccountingJob {
19+
contract AccountingJob is Authorizable, Modifiable, Job, IAccountingJob {
2020
using Encoding for bytes;
21+
using Assertions for address;
2122

2223
// --- Data ---
2324

@@ -46,7 +47,7 @@ contract AccountingJob is Job, Authorizable, Modifiable, IAccountingJob {
4647
address _accountingEngine,
4748
address _stabilityFeeTreasury,
4849
uint256 _rewardAmount
49-
) Job(_stabilityFeeTreasury, _rewardAmount) Authorizable(msg.sender) {
50+
) Job(_stabilityFeeTreasury, _rewardAmount) Authorizable(msg.sender) validParams {
5051
accountingEngine = IAccountingEngine(_accountingEngine);
5152

5253
shouldWorkPopDebtFromQueue = true;
@@ -99,17 +100,20 @@ contract AccountingJob is Job, Authorizable, Modifiable, IAccountingJob {
99100
// --- Administration ---
100101

101102
/// @inheritdoc Modifiable
102-
function _modifyParameters(bytes32 _param, bytes memory _data) internal override {
103-
address _address = _data.toAddress();
103+
function _modifyParameters(bytes32 _param, bytes memory _data) internal override(Modifiable, Job) {
104104
bool _bool = _data.toBool();
105105

106-
if (_param == 'accountingEngine') accountingEngine = IAccountingEngine(_address);
107-
else if (_param == 'stabilityFeeTreasury') stabilityFeeTreasury = IStabilityFeeTreasury(_address);
106+
if (_param == 'accountingEngine') accountingEngine = IAccountingEngine(_data.toAddress());
108107
else if (_param == 'shouldWorkPopDebtFromQueue') shouldWorkPopDebtFromQueue = _bool;
109108
else if (_param == 'shouldWorkAuctionDebt') shouldWorkAuctionDebt = _bool;
110109
else if (_param == 'shouldWorkAuctionSurplus') shouldWorkAuctionSurplus = _bool;
111110
else if (_param == 'shouldWorkTransferExtraSurplus') shouldWorkTransferExtraSurplus = _bool;
112-
else if (_param == 'rewardAmount') rewardAmount = _data.toUint256();
113-
else revert UnrecognizedParam();
111+
else Job._modifyParameters(_param, _data);
112+
}
113+
114+
/// @inheritdoc Modifiable
115+
function _validateParameters() internal view override(Modifiable, Job) {
116+
address(accountingEngine).assertHasCode();
117+
Job._validateParameters();
114118
}
115119
}

src/contracts/jobs/Job.sol

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,21 @@ pragma solidity 0.8.19;
44
import {IJob} from '@interfaces/jobs/IJob.sol';
55
import {IStabilityFeeTreasury} from '@interfaces/IStabilityFeeTreasury.sol';
66

7+
import {Authorizable} from '@contracts/utils/Authorizable.sol';
8+
import {Modifiable} from '@contracts/utils/Modifiable.sol';
9+
10+
import {Encoding} from '@libraries/Encoding.sol';
11+
import {Assertions} from '@libraries/Assertions.sol';
12+
713
/**
814
* @title Job Abstract Contract
915
* @notice This abstract contract is inherited by all jobs to add a reward modifier
1016
*/
11-
abstract contract Job is IJob {
17+
abstract contract Job is Authorizable, Modifiable, IJob {
18+
using Encoding for bytes;
19+
using Assertions for uint256;
20+
using Assertions for address;
21+
1222
// --- Data ---
1323

1424
/// @inheritdoc IJob
@@ -31,6 +41,21 @@ abstract contract Job is IJob {
3141
rewardAmount = _rewardAmount;
3242
}
3343

44+
// --- Administration ---
45+
46+
/// @inheritdoc Modifiable
47+
function _modifyParameters(bytes32 _param, bytes memory _data) internal virtual override {
48+
if (_param == 'stabilityFeeTreasury') stabilityFeeTreasury = IStabilityFeeTreasury(_data.toAddress());
49+
else if (_param == 'rewardAmount') rewardAmount = _data.toUint256();
50+
else revert UnrecognizedParam();
51+
}
52+
53+
/// @inheritdoc Modifiable
54+
function _validateParameters() internal view virtual override {
55+
address(stabilityFeeTreasury).assertHasCode();
56+
rewardAmount.assertNonNull();
57+
}
58+
3459
// --- Reward ---
3560

3661
/// @notice Modifier to reward the caller for calling the function

0 commit comments

Comments
 (0)