Update contracts to use new SafeMath functions

This commit is contained in:
Amir Bandeali
2019-08-26 12:57:33 -07:00
parent d1bed5729d
commit df039f05c2
16 changed files with 93 additions and 81 deletions

View File

@@ -19,7 +19,7 @@
pragma solidity ^0.5.9;
import "@0x/contracts-utils/contracts/src/LibRichErrors.sol";
import "../libs/LibSafeMath.sol";
import "@0x/contracts-utils/contracts/src/LibSafeMath.sol";
import "../libs/LibFeeMath.sol";
import "../libs/LibStakingRichErrors.sol";
import "../immutable/MixinStorage.sol";
@@ -69,7 +69,7 @@ contract MixinExchangeFees is
uint256 amount = msg.value;
bytes32 poolId = getStakingPoolIdOfMaker(makerAddress);
uint256 _feesCollectedThisEpoch = protocolFeesThisEpochByPool[poolId];
protocolFeesThisEpochByPool[poolId] = _feesCollectedThisEpoch._add(amount);
protocolFeesThisEpochByPool[poolId] = _feesCollectedThisEpoch.safeAdd(amount);
if (_feesCollectedThisEpoch == 0) {
activePoolsThisEpoch.push(poolId);
}
@@ -174,10 +174,10 @@ contract MixinExchangeFees is
// compute weighted stake
uint256 totalStakeDelegatedToPool = getTotalStakeDelegatedToPool(poolId);
uint256 stakeHeldByPoolOperator = getActivatedAndUndelegatedStake(getStakingPoolOperator(poolId));
uint256 weightedStake = stakeHeldByPoolOperator._add(
uint256 weightedStake = stakeHeldByPoolOperator.safeAdd(
totalStakeDelegatedToPool
._mul(REWARD_PAYOUT_DELEGATED_STAKE_PERCENT_VALUE)
._div(100)
.safeMul(REWARD_PAYOUT_DELEGATED_STAKE_PERCENT_VALUE)
.safeDiv(100)
);
// store pool stats
@@ -186,8 +186,8 @@ contract MixinExchangeFees is
activePools[i].weightedStake = weightedStake;
// update cumulative amounts
totalFeesCollected = totalFeesCollected._add(activePools[i].feesCollected);
totalWeightedStake = totalWeightedStake._add(activePools[i].weightedStake);
totalFeesCollected = totalFeesCollected.safeAdd(activePools[i].feesCollected);
totalWeightedStake = totalWeightedStake.safeAdd(activePools[i].weightedStake);
}
// sanity check - this is a gas optimization that can be used because we assume a non-zero
@@ -216,7 +216,7 @@ contract MixinExchangeFees is
// record reward in vault
_recordDepositInStakingPoolRewardVault(activePools[i].poolId, reward);
totalRewardsPaid = totalRewardsPaid._add(reward);
totalRewardsPaid = totalRewardsPaid.safeAdd(reward);
// clear state for gas refunds
protocolFeesThisEpochByPool[activePools[i].poolId] = 0;

View File

@@ -18,7 +18,7 @@
pragma solidity ^0.5.9;
import "./LibSafeMath.sol";
import "@0x/contracts-utils/contracts/src/LibSafeMath.sol";
/// @dev This library contains logic for computing the reward balances of staking pool members.
@@ -47,8 +47,8 @@ library LibRewardMath {
returns (uint256)
{
uint256 combinedPayout = amountDelegatedByOwner
._mul(totalAmountOfShadowAsset._add(totalAmountOfRealAsset))
._div(totalAmountDelegated);
.safeMul(totalAmountOfShadowAsset.safeAdd(totalAmountOfRealAsset))
.safeDiv(totalAmountDelegated);
// we round up the amount of shadow assets when computing buy-ins.
// the result is that sometimes the amount of actual assets in the pool
@@ -85,8 +85,8 @@ library LibRewardMath {
)
{
payoutInShadowAsset = amountOfShadowAssetHeldByOwner
._mul(partialAmountDelegatedByOwner)
._div(amountDelegatedByOwner);
.safeMul(partialAmountDelegatedByOwner)
.safeDiv(amountDelegatedByOwner);
payoutInRealAsset = _computePayoutDenominatedInRealAsset(
partialAmountDelegatedByOwner,
@@ -120,8 +120,8 @@ library LibRewardMath {
return 0;
}
return amountToDelegateByOwner
._mul(totalAmountOfShadowAsset._add(totalAmountOfRealAsset))
._add(totalAmountDelegated._sub(1)) // we round up when computing shadow asset
._div(totalAmountDelegated);
.safeMul(totalAmountOfShadowAsset.safeAdd(totalAmountOfRealAsset))
.safeAdd(totalAmountDelegated.safeSub(1)) // we round up when computing shadow asset
.safeDiv(totalAmountDelegated);
}
}

View File

@@ -18,6 +18,8 @@
pragma solidity ^0.5.9;
import "@0x/contracts-utils/contracts/src/LibRichErrors.sol";
import "@0x/contracts-utils/contracts/src/LibSafeMathRihErrors.sol";
library LibSafeDowncast {
@@ -29,10 +31,12 @@ library LibSafeDowncast {
returns (uint96 b)
{
b = uint96(a);
require(
uint256(b) == a,
"VALUE_TOO_LARGE_TO_DOWNCAST_TO_UINT96"
);
if (uint256(b) != a) {
LibRichErrors.rrevert(LibSafeMathRichErrors.Uint256DowncastError(
LibSafeMathRichErrors.DowncastErrorCodes.VALUE_TOO_LARGE_TO_DOWNCAST_TO_UINT96,
a
));
}
return b;
}
@@ -44,10 +48,12 @@ library LibSafeDowncast {
returns (uint64 b)
{
b = uint64(a);
require(
uint256(b) == a,
"VALUE_TOO_LARGE_TO_DOWNCAST_TO_UINT96"
);
if (uint256(b) != a) {
LibRichErrors.rrevert(LibSafeMathRichErrors.Uint256DowncastError(
LibSafeMathRichErrors.DowncastErrorCodes.VALUE_TOO_LARGE_TO_DOWNCAST_TO_UINT64,
a
));
}
return b;
}
}

View File

@@ -18,7 +18,7 @@
pragma solidity ^0.5.9;
import "../libs/LibSafeMath.sol";
import "@0x/contracts-utils/contracts/src/LibSafeMath.sol";
import "../immutable/MixinConstants.sol";
import "../immutable/MixinStorage.sol";
import "../interfaces/IStakingEvents.sol";
@@ -122,13 +122,13 @@ contract MixinDelegatedStake is
);
// increment how much stake the owner has delegated
delegatedStakeByOwner[owner] = _delegatedStakeByOwner._add(amount);
delegatedStakeByOwner[owner] = _delegatedStakeByOwner.safeAdd(amount);
// increment how much stake the owner has delegated to the input pool
delegatedStakeToPoolByOwner[owner][poolId] = _delegatedStakeToPoolByOwner._add(amount);
delegatedStakeToPoolByOwner[owner][poolId] = _delegatedStakeToPoolByOwner.safeAdd(amount);
// increment how much stake has been delegated to pool
delegatedStakeByPoolId[poolId] = _delegatedStakeByPoolId._add(amount);
delegatedStakeByPoolId[poolId] = _delegatedStakeByPoolId.safeAdd(amount);
}
/// @dev Undelegates stake of `owner` from the staking pool with id `poolId`
@@ -157,12 +157,12 @@ contract MixinDelegatedStake is
);
// decrement how much stake the owner has delegated
delegatedStakeByOwner[owner] = _delegatedStakeByOwner._sub(amount);
delegatedStakeByOwner[owner] = _delegatedStakeByOwner.safeSub(amount);
// decrement how much stake the owner has delegated to the input pool
delegatedStakeToPoolByOwner[owner][poolId] = _delegatedStakeToPoolByOwner._sub(amount);
delegatedStakeToPoolByOwner[owner][poolId] = _delegatedStakeToPoolByOwner.safeSub(amount);
// decrement how much stake has been delegated to pool
delegatedStakeByPoolId[poolId] = _delegatedStakeByPoolId._sub(amount);
delegatedStakeByPoolId[poolId] = _delegatedStakeByPoolId.safeSub(amount);
}
}

View File

@@ -19,8 +19,8 @@
pragma solidity ^0.5.9;
import "@0x/contracts-utils/contracts/src/LibRichErrors.sol";
import "@0x/contracts-utils/contracts/src/LibSafeMath.sol";
import "../libs/LibStakingRichErrors.sol";
import "../libs/LibSafeMath.sol";
import "../libs/LibRewardMath.sol";
import "../immutable/MixinConstants.sol";
import "../immutable/MixinStorage.sol";
@@ -143,8 +143,8 @@ contract MixinStake is
));
}
activatedStakeByOwner[owner] = activatedStakeByOwner[owner]._add(amount);
totalActivatedStake = totalActivatedStake._add(amount);
activatedStakeByOwner[owner] = activatedStakeByOwner[owner].safeAdd(amount);
totalActivatedStake = totalActivatedStake.safeAdd(amount);
}
/// @dev Deactivate & TimeLock stake that is currently in the Activated state.
@@ -161,8 +161,8 @@ contract MixinStake is
));
}
activatedStakeByOwner[owner] = activatedStakeByOwner[owner]._sub(amount);
totalActivatedStake = totalActivatedStake._sub(amount);
activatedStakeByOwner[owner] = activatedStakeByOwner[owner].safeSub(amount);
totalActivatedStake = totalActivatedStake.safeSub(amount);
_timeLockStake(owner, amount);
}
@@ -176,7 +176,7 @@ contract MixinStake is
_depositFromOwnerIntoZrxVault(owner, amount);
// mint stake
stakeByOwner[owner] = stakeByOwner[owner]._add(amount);
stakeByOwner[owner] = stakeByOwner[owner].safeAdd(amount);
// emit stake event
emit StakeMinted(
@@ -192,7 +192,7 @@ contract MixinStake is
internal
{
// burn stake
stakeByOwner[owner] = stakeByOwner[owner]._sub(amount);
stakeByOwner[owner] = stakeByOwner[owner].safeSub(amount);
// withdraw equivalent amount of ZRX from vault
_withdrawToOwnerFromZrxVault(owner, amount);

View File

@@ -19,7 +19,7 @@
pragma solidity ^0.5.9;
pragma experimental ABIEncoderV2;
import "../libs/LibSafeMath.sol";
import "@0x/contracts-utils/contracts/src/LibSafeMath.sol";
import "../interfaces/IStructs.sol";
import "../immutable/MixinConstants.sol";
import "../immutable/MixinStorage.sol";
@@ -84,7 +84,7 @@ contract MixinStakeBalances is
view
returns (uint256)
{
return getTotalStake(owner)._sub(getActivatedStake(owner));
return getTotalStake(owner).safeSub(getActivatedStake(owner));
}
/// @dev Returns the activated & undelegated stake for a given owner.
@@ -96,7 +96,7 @@ contract MixinStakeBalances is
view
returns (uint256)
{
return activatedStakeByOwner[owner]._sub(getStakeDelegatedByOwner(owner));
return activatedStakeByOwner[owner].safeSub(getStakeDelegatedByOwner(owner));
}
/// @dev Returns the stake that can be activated for a given owner.
@@ -108,7 +108,7 @@ contract MixinStakeBalances is
view
returns (uint256)
{
return getDeactivatedStake(owner)._sub(getTimeLockedStake(owner));
return getDeactivatedStake(owner).safeSub(getTimeLockedStake(owner));
}
/// @dev Returns the stake that can be withdrawn for a given owner.

View File

@@ -18,7 +18,8 @@
pragma solidity ^0.5.9;
import "../libs/LibSafeMath.sol";
import "@0x/contracts-utils/contracts/src/LibSafeMath.sol";
import "../libs/LibSafeDowncast.sol";
import "../libs/LibRewardMath.sol";
import "../immutable/MixinConstants.sol";
import "../immutable/MixinStorage.sol";
@@ -84,6 +85,7 @@ contract MixinTimeLockedStake is
MixinScheduler
{
using LibSafeDowncast for uint256;
using LibSafeMath for uint256;
/// @dev Forces the timeLock data structure to sync to state.
@@ -103,7 +105,7 @@ contract MixinTimeLockedStake is
internal
{
(IStructs.TimeLock memory ownerTimeLock,) = _getSynchronizedTimeLock(owner);
uint96 downcastAmount = amount._downcastToUint96();
uint96 downcastAmount = amount.downcastToUint96();
ownerTimeLock.total += downcastAmount;
timeLockedStakeByOwner[owner] = ownerTimeLock;
}
@@ -133,7 +135,7 @@ contract MixinTimeLockedStake is
uint64 currentTimeLockPeriod = getCurrentTimeLockPeriod();
ownerTimeLock = timeLockedStakeByOwner[owner];
isOutOfSync = false;
if (currentTimeLockPeriod == ownerTimeLock.lockedAt._add(1)) {
if (currentTimeLockPeriod == ownerTimeLock.lockedAt.safeAdd(1)) {
// shift n periods
ownerTimeLock.pending = ownerTimeLock.total;
isOutOfSync = true;

View File

@@ -20,8 +20,8 @@ pragma solidity ^0.5.9;
pragma experimental ABIEncoderV2;
import "@0x/contracts-utils/contracts/src/LibRichErrors.sol";
import "@0x/contracts-utils/contracts/src/LibSafeMath.sol";
import "../libs/LibStakingRichErrors.sol";
import "../libs/LibSafeMath.sol";
import "../libs/LibSignatureValidator.sol";
import "../libs/LibEIP712Hash.sol";
import "../interfaces/IStructs.sol";
@@ -327,6 +327,6 @@ contract MixinStakingPool is
pure
returns (bytes32)
{
return bytes32(uint256(poolId)._add(POOL_ID_INCREMENT_AMOUNT));
return bytes32(uint256(poolId).safeAdd(POOL_ID_INCREMENT_AMOUNT));
}
}

View File

@@ -19,8 +19,8 @@
pragma solidity ^0.5.9;
import "@0x/contracts-utils/contracts/src/LibRichErrors.sol";
import "@0x/contracts-utils/contracts/src/LibSafeMath.sol";
import "../libs/LibStakingRichErrors.sol";
import "../libs/LibSafeMath.sol";
import "../libs/LibRewardMath.sol";
import "../immutable/MixinStorage.sol";
import "../immutable/MixinConstants.sol";
@@ -118,8 +118,8 @@ contract MixinStakingPoolRewards is
}
// update shadow rewards
shadowRewardsInPoolByOwner[member][poolId] = shadowRewardsInPoolByOwner[member][poolId]._add(amount);
shadowRewardsByPoolId[poolId] = shadowRewardsByPoolId[poolId]._add(amount);
shadowRewardsInPoolByOwner[member][poolId] = shadowRewardsInPoolByOwner[member][poolId].safeAdd(amount);
shadowRewardsByPoolId[poolId] = shadowRewardsByPoolId[poolId].safeAdd(amount);
// perform withdrawal
_withdrawFromMemberInStakingPoolRewardVault(poolId, amount);
@@ -138,8 +138,8 @@ contract MixinStakingPoolRewards is
uint256 amount = computeRewardBalanceOfStakingPoolMember(poolId, member);
// update shadow rewards
shadowRewardsInPoolByOwner[member][poolId] = shadowRewardsInPoolByOwner[member][poolId]._add(amount);
shadowRewardsByPoolId[poolId] = shadowRewardsByPoolId[poolId]._add(amount);
shadowRewardsInPoolByOwner[member][poolId] = shadowRewardsInPoolByOwner[member][poolId].safeAdd(amount);
shadowRewardsByPoolId[poolId] = shadowRewardsByPoolId[poolId].safeAdd(amount);
// perform withdrawal and return amount withdrawn
_withdrawFromMemberInStakingPoolRewardVault(poolId, amount);
@@ -250,8 +250,8 @@ contract MixinStakingPoolRewards is
// the buy-in will be > 0 iff there exists a non-zero reward.
if (buyIn > 0) {
shadowRewardsInPoolByOwner[member][poolId] = shadowRewardsInPoolByOwner[member][poolId]._add(buyIn);
shadowRewardsByPoolId[poolId] = shadowRewardsByPoolId[poolId]._add(buyIn);
shadowRewardsInPoolByOwner[member][poolId] = shadowRewardsInPoolByOwner[member][poolId].safeAdd(buyIn);
shadowRewardsByPoolId[poolId] = shadowRewardsByPoolId[poolId].safeAdd(buyIn);
}
}
@@ -302,8 +302,8 @@ contract MixinStakingPoolRewards is
}
// update shadow rewards
shadowRewardsInPoolByOwner[member][poolId] = shadowRewardsInPoolByOwner[member][poolId]._sub(payoutInShadowAsset);
shadowRewardsByPoolId[poolId] = shadowRewardsByPoolId[poolId]._sub(payoutInShadowAsset);
shadowRewardsInPoolByOwner[member][poolId] = shadowRewardsInPoolByOwner[member][poolId].safeSub(payoutInShadowAsset);
shadowRewardsByPoolId[poolId] = shadowRewardsByPoolId[poolId].safeSub(payoutInShadowAsset);
// withdraw payout for member
if (payoutInRealAsset > 0) {

View File

@@ -19,9 +19,10 @@
pragma solidity ^0.5.9;
import "@0x/contracts-utils/contracts/src/LibRichErrors.sol";
import "@0x/contracts-utils/contracts/src/LibSafeMath.sol";
import "../libs/LibStakingRichErrors.sol";
import "../libs/LibSafeMath.sol";
import "../libs/LibSafeMath64.sol";
import "../libs/LibSafeDowncast.sol";
import "../immutable/MixinConstants.sol";
import "../immutable/MixinStorage.sol";
import "../interfaces/IStructs.sol";
@@ -41,6 +42,7 @@ contract MixinScheduler is
MixinStorage
{
using LibSafeDowncast for uint256;
using LibSafeMath for uint256;
using LibSafeMath64 for uint64;
@@ -85,7 +87,7 @@ contract MixinScheduler is
view
returns (uint64)
{
return getCurrentEpochStartTimeInSeconds()._add(getEpochDurationInSeconds());
return getCurrentEpochStartTimeInSeconds().safeAdd(getEpochDurationInSeconds());
}
/// @dev Returns the current timeLock period.
@@ -128,7 +130,7 @@ contract MixinScheduler is
view
returns (uint64)
{
return getCurrentTimeLockPeriodStartEpoch()._add(getTimeLockDurationInEpochs());
return getCurrentTimeLockPeriodStartEpoch().safeAdd(getTimeLockDurationInEpochs());
}
/// @dev Moves to the next epoch, given the current epoch period has ended.
@@ -139,7 +141,7 @@ contract MixinScheduler is
{
// get current timestamp
// solhint-disable-next-line not-rely-on-time
uint64 currentBlockTimestamp = block.timestamp._downcastToUint64();
uint64 currentBlockTimestamp = block.timestamp.downcastToUint64();
// validate that we can increment the current epoch
uint64 epochEndTime = getCurrentEpochEarliestEndTimeInSeconds();
@@ -151,11 +153,11 @@ contract MixinScheduler is
}
// incremment epoch
uint64 nextEpoch = currentEpoch._add(1);
uint64 nextEpoch = currentEpoch.safeAdd(1);
currentEpoch = nextEpoch;
currentEpochStartTimeInSeconds = currentBlockTimestamp;
uint64 earliestEndTimeInSeconds = currentEpochStartTimeInSeconds._add(getEpochDurationInSeconds());
uint64 earliestEndTimeInSeconds = currentEpochStartTimeInSeconds.safeAdd(getEpochDurationInSeconds());
// notify of epoch change
emit EpochChanged(
currentEpoch,
@@ -165,10 +167,10 @@ contract MixinScheduler is
// increment timeLock period, if needed
if (getCurrentTimeLockPeriodEndEpoch() <= nextEpoch) {
currentTimeLockPeriod = currentTimeLockPeriod._add(1);
currentTimeLockPeriod = currentTimeLockPeriod.safeAdd(1);
currentTimeLockPeriodStartEpoch = currentEpoch;
uint64 endEpoch = currentEpoch._add(getTimeLockDurationInEpochs());
uint64 endEpoch = currentEpoch.safeAdd(getTimeLockDurationInEpochs());
// notify
emit TimeLockPeriodChanged(
currentTimeLockPeriod,

View File

@@ -19,7 +19,8 @@
pragma solidity ^0.5.9;
import "@0x/contracts-utils/contracts/src/LibRichErrors.sol";
import "../libs/LibSafeMath.sol";
import "@0x/contracts-utils/contracts/src/LibSafeMath.sol";
import "../libs/LibSafeDowncast.sol";
import "../libs/LibSafeMath96.sol";
import "../libs/LibStakingRichErrors.sol";
import "./MixinVaultCore.sol";
@@ -44,6 +45,7 @@ contract StakingPoolRewardVault is
MixinVaultCore
{
using LibSafeDowncast for uint256;
using LibSafeMath for uint256;
using LibSafeMath96 for uint96;
@@ -115,7 +117,7 @@ contract StakingPoolRewardVault is
}
// update balance and transfer `amount` in ETH to staking contract
balanceByPoolId[poolId].operatorBalance -= amount._downcastToUint96();
balanceByPoolId[poolId].operatorBalance -= amount.downcastToUint96();
stakingContractAddress.transfer(amount);
// notify
@@ -140,7 +142,7 @@ contract StakingPoolRewardVault is
}
// update balance and transfer `amount` in ETH to staking contract
balanceByPoolId[poolId].membersBalance -= amount._downcastToUint96();
balanceByPoolId[poolId].membersBalance -= amount.downcastToUint96();
stakingContractAddress.transfer(amount);
// notify
@@ -225,14 +227,14 @@ contract StakingPoolRewardVault is
pure
{
// balances are stored as uint96; safely downscale.
uint96 amount = amount256Bit._downcastToUint96();
uint96 amount = amount256Bit.downcastToUint96();
// compute portions. One of the two must round down: the operator always receives the leftover from rounding.
uint96 operatorPortion = amount._computePercentageCeil(balance.operatorShare);
uint96 poolPortion = amount._sub(operatorPortion);
uint96 poolPortion = amount.safeSub(operatorPortion);
// update balances
balance.operatorBalance = balance.operatorBalance._add(operatorPortion);
balance.membersBalance = balance.membersBalance._add(poolPortion);
balance.operatorBalance = balance.operatorBalance.safeAdd(operatorPortion);
balance.membersBalance = balance.membersBalance.safeAdd(poolPortion);
}
}

View File

@@ -18,8 +18,8 @@
pragma solidity ^0.5.9;
import "../libs/LibSafeMath.sol";
import "../interfaces/IZrxVault.sol";
import "@0x/contracts-utils/contracts/src/LibSafeMath.sol";
import "@0x/contracts-asset-proxy/contracts/src/interfaces/IAssetProxy.sol";
import "@0x/contracts-erc20/contracts/src/interfaces/IERC20Token.sol";
import "./MixinVaultCore.sol";
@@ -105,7 +105,7 @@ contract ZrxVault is
onlyNotInCatastrophicFailure
{
// update balance
balances[owner] = balances[owner]._add(amount);
balances[owner] = balances[owner].safeAdd(amount);
// notify
emit ZrxDepositedIntoVault(msg.sender, owner, amount);
@@ -167,7 +167,7 @@ contract ZrxVault is
// update balance
// note that this call will revert if trying to withdraw more
// than the current balance
balances[owner] = balances[owner]._sub(amount);
balances[owner] = balances[owner].safeSub(amount);
// notify
emit ZrxWithdrawnFromVault(msg.sender, owner, amount);