diff --git a/contracts/mocks/BlockReward.sol b/contracts/mocks/BlockReward.sol index a84b2bee..7d53fc94 100644 --- a/contracts/mocks/BlockReward.sol +++ b/contracts/mocks/BlockReward.sol @@ -11,6 +11,7 @@ contract BlockReward { uint256 public feeAmount = 0; mapping(bytes32 => uint256) internal uintStorage; bytes32 internal constant MINTED_TOTALLY_BY_BRIDGE = "mintedTotallyByBridge"; + bytes4 internal constant MINT_REWARD = 0xe2f764a3; // mintReward(address[],uint256[]) address public token; function() external payable { @@ -86,7 +87,7 @@ contract BlockReward { rewards[i] = feeToDistribute; } - require(token.call(abi.encodeWithSignature("mintReward(address[],uint256[])", receivers, rewards))); + require(token.call(abi.encodeWithSelector(MINT_REWARD, receivers, rewards))); } function random(uint256 _count) public view returns (uint256) { diff --git a/contracts/upgradeable_contracts/BaseBridgeValidators.sol b/contracts/upgradeable_contracts/BaseBridgeValidators.sol index 78bb7ece..854b6dfa 100644 --- a/contracts/upgradeable_contracts/BaseBridgeValidators.sol +++ b/contracts/upgradeable_contracts/BaseBridgeValidators.sol @@ -2,13 +2,15 @@ pragma solidity 0.4.24; import "./Ownable.sol"; import "openzeppelin-solidity/contracts/math/SafeMath.sol"; -import "../upgradeability/EternalStorage.sol"; +import "./Initializable.sol"; -contract BaseBridgeValidators is EternalStorage, Ownable { +contract BaseBridgeValidators is Initializable, Ownable { using SafeMath for uint256; address public constant F_ADDR = 0xFFfFfFffFFfffFFfFFfFFFFFffFFFffffFfFFFfF; uint256 internal constant MAX_VALIDATORS = 100; + bytes32 internal constant REQUIRED_SIGNATURES = keccak256(abi.encodePacked("requiredSignatures")); + bytes32 internal constant VALIDATOR_COUNT = keccak256(abi.encodePacked("validatorCount")); event ValidatorAdded(address indexed validator); event ValidatorRemoved(address indexed validator); @@ -17,7 +19,7 @@ contract BaseBridgeValidators is EternalStorage, Ownable { function setRequiredSignatures(uint256 _requiredSignatures) external onlyOwner { require(validatorCount() >= _requiredSignatures); require(_requiredSignatures != 0); - uintStorage[keccak256(abi.encodePacked("requiredSignatures"))] = _requiredSignatures; + uintStorage[REQUIRED_SIGNATURES] = _requiredSignatures; emit RequiredSignaturesChanged(_requiredSignatures); } @@ -74,25 +76,17 @@ contract BaseBridgeValidators is EternalStorage, Ownable { } function requiredSignatures() public view returns (uint256) { - return uintStorage[keccak256(abi.encodePacked("requiredSignatures"))]; + return uintStorage[REQUIRED_SIGNATURES]; } function validatorCount() public view returns (uint256) { - return uintStorage[keccak256(abi.encodePacked("validatorCount"))]; + return uintStorage[VALIDATOR_COUNT]; } function isValidator(address _validator) public view returns (bool) { return _validator != F_ADDR && getNextValidator(_validator) != address(0); } - function isInitialized() public view returns (bool) { - return boolStorage[keccak256(abi.encodePacked("isInitialized"))]; - } - - function deployedAtBlock() external view returns (uint256) { - return uintStorage[keccak256(abi.encodePacked("deployedAtBlock"))]; - } - function getNextValidator(address _address) public view returns (address) { return addressStorage[keccak256(abi.encodePacked("validatorsList", _address))]; } @@ -102,14 +96,10 @@ contract BaseBridgeValidators is EternalStorage, Ownable { } function setValidatorCount(uint256 _validatorCount) internal { - uintStorage[keccak256(abi.encodePacked("validatorCount"))] = _validatorCount; + uintStorage[VALIDATOR_COUNT] = _validatorCount; } function setNextValidator(address _prevValidator, address _validator) internal { addressStorage[keccak256(abi.encodePacked("validatorsList", _prevValidator))] = _validator; } - - function setInitialize() internal { - boolStorage[keccak256(abi.encodePacked("isInitialized"))] = true; - } } diff --git a/contracts/upgradeable_contracts/BaseFeeManager.sol b/contracts/upgradeable_contracts/BaseFeeManager.sol index 35be34fd..2a520bdd 100644 --- a/contracts/upgradeable_contracts/BaseFeeManager.sol +++ b/contracts/upgradeable_contracts/BaseFeeManager.sol @@ -13,6 +13,8 @@ contract BaseFeeManager is EternalStorage, FeeTypes { // This is not a real fee value but a relative value used to calculate the fee percentage uint256 internal constant MAX_FEE = 1 ether; + bytes32 internal constant HOME_FEE_STORAGE_KEY = keccak256(abi.encodePacked("homeFee")); + bytes32 internal constant FOREIGN_FEE_STORAGE_KEY = keccak256(abi.encodePacked("foreignFee")); function calculateFee(uint256 _value, bool _recover, bytes32 _feeType) public view returns (uint256) { uint256 fee = _feeType == HOME_FEE ? getHomeFee() : getForeignFee(); @@ -29,21 +31,21 @@ contract BaseFeeManager is EternalStorage, FeeTypes { } function setHomeFee(uint256 _fee) external validFee(_fee) { - uintStorage[keccak256(abi.encodePacked("homeFee"))] = _fee; + uintStorage[HOME_FEE_STORAGE_KEY] = _fee; emit HomeFeeUpdated(_fee); } function getHomeFee() public view returns (uint256) { - return uintStorage[keccak256(abi.encodePacked("homeFee"))]; + return uintStorage[HOME_FEE_STORAGE_KEY]; } function setForeignFee(uint256 _fee) external validFee(_fee) { - uintStorage[keccak256(abi.encodePacked("foreignFee"))] = _fee; + uintStorage[FOREIGN_FEE_STORAGE_KEY] = _fee; emit ForeignFeeUpdated(_fee); } function getForeignFee() public view returns (uint256) { - return uintStorage[keccak256(abi.encodePacked("foreignFee"))]; + return uintStorage[FOREIGN_FEE_STORAGE_KEY]; } /* solcov ignore next */ diff --git a/contracts/upgradeable_contracts/BasicBridge.sol b/contracts/upgradeable_contracts/BasicBridge.sol index dcd0ffcb..c3e20e3e 100644 --- a/contracts/upgradeable_contracts/BasicBridge.sol +++ b/contracts/upgradeable_contracts/BasicBridge.sol @@ -2,14 +2,14 @@ pragma solidity 0.4.24; import "../interfaces/IBridgeValidators.sol"; import "./Upgradeable.sol"; -import "../upgradeability/EternalStorage.sol"; +import "./Initializable.sol"; import "openzeppelin-solidity/contracts/math/SafeMath.sol"; import "openzeppelin-solidity/contracts/AddressUtils.sol"; import "./Validatable.sol"; import "./Ownable.sol"; import "./Claimable.sol"; -contract BasicBridge is EternalStorage, Validatable, Ownable, Upgradeable, Claimable { +contract BasicBridge is Initializable, Validatable, Ownable, Upgradeable, Claimable { using SafeMath for uint256; event GasPriceChanged(uint256 gasPrice); @@ -17,32 +17,36 @@ contract BasicBridge is EternalStorage, Validatable, Ownable, Upgradeable, Claim event DailyLimitChanged(uint256 newLimit); event ExecutionDailyLimitChanged(uint256 newLimit); + bytes32 internal constant GAS_PRICE = keccak256(abi.encodePacked("gasPrice")); + bytes32 internal constant REQUIRED_BLOCK_CONFIRMATIONS = keccak256(abi.encodePacked("requiredBlockConfirmations")); + bytes32 internal constant MIN_PER_TX = keccak256(abi.encodePacked("minPerTx")); + bytes32 internal constant MAX_PER_TX = keccak256(abi.encodePacked("maxPerTx")); + bytes32 internal constant DAILY_LIMIT = keccak256(abi.encodePacked("dailyLimit")); + bytes32 internal constant EXECUTION_MAX_PER_TX = keccak256(abi.encodePacked("executionMaxPerTx")); + bytes32 internal constant EXECUTION_DAILY_LIMIT = keccak256(abi.encodePacked("executionDailyLimit")); + function getBridgeInterfacesVersion() external pure returns (uint64 major, uint64 minor, uint64 patch) { return (2, 3, 0); } function setGasPrice(uint256 _gasPrice) external onlyOwner { require(_gasPrice > 0); - uintStorage[keccak256(abi.encodePacked("gasPrice"))] = _gasPrice; + uintStorage[GAS_PRICE] = _gasPrice; emit GasPriceChanged(_gasPrice); } function gasPrice() external view returns (uint256) { - return uintStorage[keccak256(abi.encodePacked("gasPrice"))]; + return uintStorage[GAS_PRICE]; } function setRequiredBlockConfirmations(uint256 _blockConfirmations) external onlyOwner { require(_blockConfirmations > 0); - uintStorage[keccak256(abi.encodePacked("requiredBlockConfirmations"))] = _blockConfirmations; + uintStorage[REQUIRED_BLOCK_CONFIRMATIONS] = _blockConfirmations; emit RequiredBlockConfirmationChanged(_blockConfirmations); } function requiredBlockConfirmations() external view returns (uint256) { - return uintStorage[keccak256(abi.encodePacked("requiredBlockConfirmations"))]; - } - - function deployedAtBlock() external view returns (uint256) { - return uintStorage[keccak256(abi.encodePacked("deployedAtBlock"))]; + return uintStorage[REQUIRED_BLOCK_CONFIRMATIONS]; } function setTotalSpentPerDay(uint256 _day, uint256 _value) internal { @@ -62,23 +66,15 @@ contract BasicBridge is EternalStorage, Validatable, Ownable, Upgradeable, Claim } function minPerTx() public view returns (uint256) { - return uintStorage[keccak256(abi.encodePacked("minPerTx"))]; + return uintStorage[MIN_PER_TX]; } function maxPerTx() public view returns (uint256) { - return uintStorage[keccak256(abi.encodePacked("maxPerTx"))]; + return uintStorage[MAX_PER_TX]; } function executionMaxPerTx() public view returns (uint256) { - return uintStorage[keccak256(abi.encodePacked("executionMaxPerTx"))]; - } - - function setInitialize() internal { - boolStorage[keccak256(abi.encodePacked("isInitialized"))] = true; - } - - function isInitialized() public view returns (bool) { - return boolStorage[keccak256(abi.encodePacked("isInitialized"))]; + return uintStorage[EXECUTION_MAX_PER_TX]; } function getCurrentDay() public view returns (uint256) { @@ -88,37 +84,37 @@ contract BasicBridge is EternalStorage, Validatable, Ownable, Upgradeable, Claim function setDailyLimit(uint256 _dailyLimit) external onlyOwner { require(_dailyLimit > maxPerTx() || _dailyLimit == 0); - uintStorage[keccak256(abi.encodePacked("dailyLimit"))] = _dailyLimit; + uintStorage[DAILY_LIMIT] = _dailyLimit; emit DailyLimitChanged(_dailyLimit); } function dailyLimit() public view returns (uint256) { - return uintStorage[keccak256(abi.encodePacked("dailyLimit"))]; + return uintStorage[DAILY_LIMIT]; } function setExecutionDailyLimit(uint256 _dailyLimit) external onlyOwner { require(_dailyLimit > executionMaxPerTx() || _dailyLimit == 0); - uintStorage[keccak256(abi.encodePacked("executionDailyLimit"))] = _dailyLimit; + uintStorage[EXECUTION_DAILY_LIMIT] = _dailyLimit; emit ExecutionDailyLimitChanged(_dailyLimit); } function executionDailyLimit() public view returns (uint256) { - return uintStorage[keccak256(abi.encodePacked("executionDailyLimit"))]; + return uintStorage[EXECUTION_DAILY_LIMIT]; } function setExecutionMaxPerTx(uint256 _maxPerTx) external onlyOwner { require(_maxPerTx < executionDailyLimit()); - uintStorage[keccak256(abi.encodePacked("executionMaxPerTx"))] = _maxPerTx; + uintStorage[EXECUTION_MAX_PER_TX] = _maxPerTx; } function setMaxPerTx(uint256 _maxPerTx) external onlyOwner { require(_maxPerTx < dailyLimit()); - uintStorage[keccak256(abi.encodePacked("maxPerTx"))] = _maxPerTx; + uintStorage[MAX_PER_TX] = _maxPerTx; } function setMinPerTx(uint256 _minPerTx) external onlyOwner { require(_minPerTx < dailyLimit() && _minPerTx < maxPerTx()); - uintStorage[keccak256(abi.encodePacked("minPerTx"))] = _minPerTx; + uintStorage[MIN_PER_TX] = _minPerTx; } function withinLimit(uint256 _amount) public view returns (bool) { diff --git a/contracts/upgradeable_contracts/BlockRewardBridge.sol b/contracts/upgradeable_contracts/BlockRewardBridge.sol new file mode 100644 index 00000000..1441f9a0 --- /dev/null +++ b/contracts/upgradeable_contracts/BlockRewardBridge.sol @@ -0,0 +1,31 @@ +pragma solidity 0.4.24; + +import "../interfaces/IBlockReward.sol"; +import "../upgradeability/EternalStorage.sol"; +import "openzeppelin-solidity/contracts/AddressUtils.sol"; + +contract BlockRewardBridge is EternalStorage { + bytes32 internal constant BLOCK_REWARD_CONTRACT = keccak256(abi.encodePacked("blockRewardContract")); + bytes4 internal constant BLOCK_REWARD_CONTRACT_ID = 0x2ee57f8d; // blockRewardContractId() + bytes4 internal constant BRIDGES_ALLOWED_LENGTH = 0x10f2ee7c; // bridgesAllowedLength() + + function _blockRewardContract() internal view returns (IBlockReward) { + return IBlockReward(addressStorage[BLOCK_REWARD_CONTRACT]); + } + + function _setBlockRewardContract(address _blockReward) internal { + require(AddressUtils.isContract(_blockReward)); + + // Before store the contract we need to make sure that it is the block reward contract in actual fact, + // call a specific method from the contract that should return a specific value + bool isBlockRewardContract = false; + if (_blockReward.call(BLOCK_REWARD_CONTRACT_ID)) { + isBlockRewardContract = + IBlockReward(_blockReward).blockRewardContractId() == bytes4(keccak256("blockReward")); + } else if (_blockReward.call(BRIDGES_ALLOWED_LENGTH)) { + isBlockRewardContract = IBlockReward(_blockReward).bridgesAllowedLength() != 0; + } + require(isBlockRewardContract); + addressStorage[BLOCK_REWARD_CONTRACT] = _blockReward; + } +} diff --git a/contracts/upgradeable_contracts/BlockRewardFeeManager.sol b/contracts/upgradeable_contracts/BlockRewardFeeManager.sol index adb8f2a9..541dde7a 100644 --- a/contracts/upgradeable_contracts/BlockRewardFeeManager.sol +++ b/contracts/upgradeable_contracts/BlockRewardFeeManager.sol @@ -1,9 +1,9 @@ pragma solidity 0.4.24; import "./BaseFeeManager.sol"; -import "../interfaces/IBlockReward.sol"; +import "./BlockRewardBridge.sol"; -contract BlockRewardFeeManager is BaseFeeManager { +contract BlockRewardFeeManager is BaseFeeManager, BlockRewardBridge { function distributeFeeFromAffirmation(uint256 _fee) external { distributeFeeFromBlockReward(_fee); } @@ -12,10 +12,6 @@ contract BlockRewardFeeManager is BaseFeeManager { distributeFeeFromBlockReward(_fee); } - function _blockRewardContract() internal view returns (IBlockReward) { - return IBlockReward(addressStorage[keccak256(abi.encodePacked("blockRewardContract"))]); - } - /* solcov ignore next */ function distributeFeeFromBlockReward(uint256 _fee) internal; } diff --git a/contracts/upgradeable_contracts/BridgeValidators.sol b/contracts/upgradeable_contracts/BridgeValidators.sol index 39d35fdc..887baf83 100644 --- a/contracts/upgradeable_contracts/BridgeValidators.sol +++ b/contracts/upgradeable_contracts/BridgeValidators.sol @@ -34,8 +34,8 @@ contract BridgeValidators is BaseBridgeValidators { } setValidatorCount(_initialValidators.length); - uintStorage[keccak256(abi.encodePacked("requiredSignatures"))] = _requiredSignatures; - uintStorage[keccak256(abi.encodePacked("deployedAtBlock"))] = block.number; + uintStorage[REQUIRED_SIGNATURES] = _requiredSignatures; + uintStorage[DEPLOYED_AT_BLOCK] = block.number; setInitialize(); emit RequiredSignaturesChanged(_requiredSignatures); diff --git a/contracts/upgradeable_contracts/Claimable.sol b/contracts/upgradeable_contracts/Claimable.sol index 0fc72a0b..0915a9dd 100644 --- a/contracts/upgradeable_contracts/Claimable.sol +++ b/contracts/upgradeable_contracts/Claimable.sol @@ -4,6 +4,8 @@ import "openzeppelin-solidity/contracts/token/ERC20/ERC20Basic.sol"; import "./Sacrifice.sol"; contract Claimable { + bytes4 internal constant TRANSFER = 0xa9059cbb; // transfer(address,uint256) + modifier validAddress(address _to) { require(_to != address(0)); /* solcov ignore next */ @@ -34,7 +36,7 @@ contract Claimable { function safeTransfer(address _token, address _to, uint256 _value) internal { bytes memory returnData; bool returnDataResult; - bytes memory callData = abi.encodeWithSignature("transfer(address,uint256)", _to, _value); + bytes memory callData = abi.encodeWithSelector(TRANSFER, _to, _value); assembly { let result := call(gas, _token, 0x0, add(callData, 0x20), mload(callData), 0, 32) returnData := mload(0) diff --git a/contracts/upgradeable_contracts/ERC20Bridge.sol b/contracts/upgradeable_contracts/ERC20Bridge.sol new file mode 100644 index 00000000..b14a0951 --- /dev/null +++ b/contracts/upgradeable_contracts/ERC20Bridge.sol @@ -0,0 +1,18 @@ +pragma solidity 0.4.24; + +import "../upgradeability/EternalStorage.sol"; +import "openzeppelin-solidity/contracts/token/ERC20/ERC20Basic.sol"; +import "openzeppelin-solidity/contracts/AddressUtils.sol"; + +contract ERC20Bridge is EternalStorage { + bytes32 internal constant ERC20_TOKEN = keccak256(abi.encodePacked("erc20token")); + + function erc20token() public view returns (ERC20Basic) { + return ERC20Basic(addressStorage[ERC20_TOKEN]); + } + + function setErc20token(address _token) internal { + require(AddressUtils.isContract(_token)); + addressStorage[ERC20_TOKEN] = _token; + } +} diff --git a/contracts/upgradeable_contracts/ERC677Bridge.sol b/contracts/upgradeable_contracts/ERC677Bridge.sol index 2a89821f..5524f919 100644 --- a/contracts/upgradeable_contracts/ERC677Bridge.sol +++ b/contracts/upgradeable_contracts/ERC677Bridge.sol @@ -3,15 +3,16 @@ pragma solidity 0.4.24; import "./BasicBridge.sol"; import "../interfaces/ERC677.sol"; import "../interfaces/ERC677Receiver.sol"; +import "./ERC677Storage.sol"; -contract ERC677Bridge is BasicBridge, ERC677Receiver { +contract ERC677Bridge is BasicBridge, ERC677Receiver, ERC677Storage { function erc677token() public view returns (ERC677) { - return ERC677(addressStorage[keccak256(abi.encodePacked("erc677token"))]); + return ERC677(addressStorage[ERC677_TOKEN]); } function setErc677token(address _token) internal { require(AddressUtils.isContract(_token)); - addressStorage[keccak256(abi.encodePacked("erc677token"))] = _token; + addressStorage[ERC677_TOKEN] = _token; } function onTokenTransfer( diff --git a/contracts/upgradeable_contracts/ERC677Storage.sol b/contracts/upgradeable_contracts/ERC677Storage.sol new file mode 100644 index 00000000..ff9de317 --- /dev/null +++ b/contracts/upgradeable_contracts/ERC677Storage.sol @@ -0,0 +1,5 @@ +pragma solidity 0.4.24; + +contract ERC677Storage { + bytes32 internal constant ERC677_TOKEN = keccak256(abi.encodePacked("erc677token")); +} diff --git a/contracts/upgradeable_contracts/Initializable.sol b/contracts/upgradeable_contracts/Initializable.sol new file mode 100644 index 00000000..12b41b8c --- /dev/null +++ b/contracts/upgradeable_contracts/Initializable.sol @@ -0,0 +1,20 @@ +pragma solidity 0.4.24; + +import "../upgradeability/EternalStorage.sol"; + +contract Initializable is EternalStorage { + bytes32 internal constant INITIALIZED = keccak256(abi.encodePacked("isInitialized")); + bytes32 internal constant DEPLOYED_AT_BLOCK = keccak256(abi.encodePacked("deployedAtBlock")); + + function setInitialize() internal { + boolStorage[INITIALIZED] = true; + } + + function isInitialized() public view returns (bool) { + return boolStorage[INITIALIZED]; + } + + function deployedAtBlock() external view returns (uint256) { + return uintStorage[DEPLOYED_AT_BLOCK]; + } +} diff --git a/contracts/upgradeable_contracts/OverdrawManagement.sol b/contracts/upgradeable_contracts/OverdrawManagement.sol index 69d0e0ba..ed06a1f6 100644 --- a/contracts/upgradeable_contracts/OverdrawManagement.sol +++ b/contracts/upgradeable_contracts/OverdrawManagement.sol @@ -12,6 +12,8 @@ contract OverdrawManagement is EternalStorage, RewardableBridge, Upgradeable, Ba event UserRequestForSignature(address recipient, uint256 value); event AssetAboveLimitsFixed(bytes32 indexed transactionHash, uint256 value, uint256 remaining); + bytes32 internal constant OUT_OF_LIMIT_AMOUNT = keccak256(abi.encodePacked("outOfLimitAmount")); + function fixAssetsAboveLimits(bytes32 txHash, bool unlockOnForeign, uint256 valueToUnlock) external onlyIfUpgradeabilityOwner @@ -41,7 +43,7 @@ contract OverdrawManagement is EternalStorage, RewardableBridge, Upgradeable, Ba } function outOfLimitAmount() public view returns (uint256) { - return uintStorage[keccak256(abi.encodePacked("outOfLimitAmount"))]; + return uintStorage[OUT_OF_LIMIT_AMOUNT]; } function fixedAssets(bytes32 _txHash) public view returns (bool) { @@ -49,7 +51,7 @@ contract OverdrawManagement is EternalStorage, RewardableBridge, Upgradeable, Ba } function setOutOfLimitAmount(uint256 _value) internal { - uintStorage[keccak256(abi.encodePacked("outOfLimitAmount"))] = _value; + uintStorage[OUT_OF_LIMIT_AMOUNT] = _value; } function txAboveLimits(bytes32 _txHash) internal view returns (address recipient, uint256 value) { diff --git a/contracts/upgradeable_contracts/RewardableBridge.sol b/contracts/upgradeable_contracts/RewardableBridge.sol index 6032a41a..e72ac30a 100644 --- a/contracts/upgradeable_contracts/RewardableBridge.sol +++ b/contracts/upgradeable_contracts/RewardableBridge.sol @@ -8,11 +8,21 @@ contract RewardableBridge is Ownable, FeeTypes { event FeeDistributedFromAffirmation(uint256 feeAmount, bytes32 indexed transactionHash); event FeeDistributedFromSignatures(uint256 feeAmount, bytes32 indexed transactionHash); + bytes32 internal constant FEE_MANAGER_CONTRACT = keccak256(abi.encodePacked("feeManagerContract")); + bytes4 internal constant GET_HOME_FEE = 0x94da17cd; // getHomeFee() + bytes4 internal constant GET_FOREIGN_FEE = 0xffd66196; // getForeignFee() + bytes4 internal constant GET_FEE_MANAGER_MODE = 0xf2ba9561; // getFeeManagerMode() + bytes4 internal constant SET_HOME_FEE = 0x34a9e148; // setHomeFee(uint256) + bytes4 internal constant SET_FOREIGN_FEE = 0x286c4066; // setForeignFee(uint256) + bytes4 internal constant CALCULATE_FEE = 0x9862f26f; // calculateFee(uint256,bool,bytes32) + bytes4 internal constant DISTRIBUTE_FEE_FROM_SIGNATURES = 0x59d78464; // distributeFeeFromSignatures(uint256) + bytes4 internal constant DISTRIBUTE_FEE_FROM_AFFIRMATION = 0x054d46ec; // distributeFeeFromAffirmation(uint256) + function _getFee(bytes32 _feeType) internal view returns (uint256) { uint256 fee; address feeManager = feeManagerContract(); - string memory method = _feeType == HOME_FEE ? "getHomeFee()" : "getForeignFee()"; - bytes memory callData = abi.encodeWithSignature(method); + bytes4 method = _feeType == HOME_FEE ? GET_HOME_FEE : GET_FOREIGN_FEE; + bytes memory callData = abi.encodeWithSelector(method); assembly { let result := callcode(gas, feeManager, 0x0, add(callData, 0x20), mload(callData), 0, 32) @@ -28,7 +38,7 @@ contract RewardableBridge is Ownable, FeeTypes { function getFeeManagerMode() external view returns (bytes4) { bytes4 mode; - bytes memory callData = abi.encodeWithSignature("getFeeManagerMode()"); + bytes memory callData = abi.encodeWithSelector(GET_FEE_MANAGER_MODE); address feeManager = feeManagerContract(); assembly { let result := callcode(gas, feeManager, 0x0, add(callData, 0x20), mload(callData), 0, 4) @@ -43,17 +53,17 @@ contract RewardableBridge is Ownable, FeeTypes { } function feeManagerContract() public view returns (address) { - return addressStorage[keccak256(abi.encodePacked("feeManagerContract"))]; + return addressStorage[FEE_MANAGER_CONTRACT]; } function setFeeManagerContract(address _feeManager) external onlyOwner { require(_feeManager == address(0) || AddressUtils.isContract(_feeManager)); - addressStorage[keccak256(abi.encodePacked("feeManagerContract"))] = _feeManager; + addressStorage[FEE_MANAGER_CONTRACT] = _feeManager; } function _setFee(address _feeManager, uint256 _fee, bytes32 _feeType) internal { - string memory method = _feeType == HOME_FEE ? "setHomeFee(uint256)" : "setForeignFee(uint256)"; - require(_feeManager.delegatecall(abi.encodeWithSignature(method, _fee))); + bytes4 method = _feeType == HOME_FEE ? SET_HOME_FEE : SET_FOREIGN_FEE; + require(_feeManager.delegatecall(abi.encodeWithSelector(method, _fee))); } function calculateFee(uint256 _value, bool _recover, address _impl, bytes32 _feeType) @@ -62,12 +72,7 @@ contract RewardableBridge is Ownable, FeeTypes { returns (uint256) { uint256 fee; - bytes memory callData = abi.encodeWithSignature( - "calculateFee(uint256,bool,bytes32)", - _value, - _recover, - _feeType - ); + bytes memory callData = abi.encodeWithSelector(CALCULATE_FEE, _value, _recover, _feeType); assembly { let result := callcode(gas, _impl, 0x0, add(callData, 0x20), mload(callData), 0, 32) fee := mload(0) @@ -81,12 +86,12 @@ contract RewardableBridge is Ownable, FeeTypes { } function distributeFeeFromSignatures(uint256 _fee, address _feeManager, bytes32 _txHash) internal { - require(_feeManager.delegatecall(abi.encodeWithSignature("distributeFeeFromSignatures(uint256)", _fee))); + require(_feeManager.delegatecall(abi.encodeWithSelector(DISTRIBUTE_FEE_FROM_SIGNATURES, _fee))); emit FeeDistributedFromSignatures(_fee, _txHash); } function distributeFeeFromAffirmation(uint256 _fee, address _feeManager, bytes32 _txHash) internal { - require(_feeManager.delegatecall(abi.encodeWithSignature("distributeFeeFromAffirmation(uint256)", _fee))); + require(_feeManager.delegatecall(abi.encodeWithSelector(DISTRIBUTE_FEE_FROM_AFFIRMATION, _fee))); emit FeeDistributedFromAffirmation(_fee, _txHash); } } diff --git a/contracts/upgradeable_contracts/RewardableValidators.sol b/contracts/upgradeable_contracts/RewardableValidators.sol index 35d9ad09..f1a11545 100644 --- a/contracts/upgradeable_contracts/RewardableValidators.sol +++ b/contracts/upgradeable_contracts/RewardableValidators.sol @@ -39,8 +39,8 @@ contract RewardableValidators is BaseBridgeValidators { } setValidatorCount(_initialValidators.length); - uintStorage[keccak256(abi.encodePacked("requiredSignatures"))] = _requiredSignatures; - uintStorage[keccak256(abi.encodePacked("deployedAtBlock"))] = block.number; + uintStorage[REQUIRED_SIGNATURES] = _requiredSignatures; + uintStorage[DEPLOYED_AT_BLOCK] = block.number; setInitialize(); emit RequiredSignaturesChanged(_requiredSignatures); diff --git a/contracts/upgradeable_contracts/Validatable.sol b/contracts/upgradeable_contracts/Validatable.sol index c66ceab0..2881ba91 100644 --- a/contracts/upgradeable_contracts/Validatable.sol +++ b/contracts/upgradeable_contracts/Validatable.sol @@ -1,10 +1,12 @@ pragma solidity 0.4.24; + import "../interfaces/IBridgeValidators.sol"; import "../upgradeability/EternalStorage.sol"; +import "./ValidatorStorage.sol"; -contract Validatable is EternalStorage { +contract Validatable is EternalStorage, ValidatorStorage { function validatorContract() public view returns (IBridgeValidators) { - return IBridgeValidators(addressStorage[keccak256(abi.encodePacked("validatorContract"))]); + return IBridgeValidators(addressStorage[VALIDATOR_CONTRACT]); } modifier onlyValidator() { diff --git a/contracts/upgradeable_contracts/ValidatorStorage.sol b/contracts/upgradeable_contracts/ValidatorStorage.sol new file mode 100644 index 00000000..c14d4a5a --- /dev/null +++ b/contracts/upgradeable_contracts/ValidatorStorage.sol @@ -0,0 +1,5 @@ +pragma solidity 0.4.24; + +contract ValidatorStorage { + bytes32 internal constant VALIDATOR_CONTRACT = keccak256(abi.encodePacked("validatorContract")); +} diff --git a/contracts/upgradeable_contracts/ValidatorsFeeManager.sol b/contracts/upgradeable_contracts/ValidatorsFeeManager.sol index 2f85bfd8..aa7e098a 100644 --- a/contracts/upgradeable_contracts/ValidatorsFeeManager.sol +++ b/contracts/upgradeable_contracts/ValidatorsFeeManager.sol @@ -2,8 +2,9 @@ pragma solidity 0.4.24; import "./BaseFeeManager.sol"; import "../interfaces/IRewardableValidators.sol"; +import "./ValidatorStorage.sol"; -contract ValidatorsFeeManager is BaseFeeManager { +contract ValidatorsFeeManager is BaseFeeManager, ValidatorStorage { bytes32 public constant REWARD_FOR_TRANSFERRING_FROM_HOME = keccak256( abi.encodePacked("reward-transferring-from-home") ); @@ -21,7 +22,7 @@ contract ValidatorsFeeManager is BaseFeeManager { } function rewardableValidatorContract() internal view returns (IRewardableValidators) { - return IRewardableValidators(addressStorage[keccak256(abi.encodePacked("validatorContract"))]); + return IRewardableValidators(addressStorage[VALIDATOR_CONTRACT]); } function distributeFeeProportionally(uint256 _fee, bytes32 _direction) internal { diff --git a/contracts/upgradeable_contracts/erc20_to_erc20/BasicForeignBridgeErcToErc.sol b/contracts/upgradeable_contracts/erc20_to_erc20/BasicForeignBridgeErcToErc.sol index 2b342fe7..0b85aece 100644 --- a/contracts/upgradeable_contracts/erc20_to_erc20/BasicForeignBridgeErcToErc.sol +++ b/contracts/upgradeable_contracts/erc20_to_erc20/BasicForeignBridgeErcToErc.sol @@ -20,14 +20,14 @@ contract BasicForeignBridgeErcToErc is BasicForeignBridge { require(_gasPrice > 0); require(_homeMaxPerTx < _homeDailyLimit); require(_owner != address(0)); - addressStorage[keccak256(abi.encodePacked("validatorContract"))] = _validatorContract; + addressStorage[VALIDATOR_CONTRACT] = _validatorContract; setErc20token(_erc20token); - uintStorage[keccak256(abi.encodePacked("deployedAtBlock"))] = block.number; - uintStorage[keccak256(abi.encodePacked("requiredBlockConfirmations"))] = _requiredBlockConfirmations; - uintStorage[keccak256(abi.encodePacked("gasPrice"))] = _gasPrice; - uintStorage[keccak256(abi.encodePacked("maxPerTx"))] = _maxPerTx; - uintStorage[keccak256(abi.encodePacked("executionDailyLimit"))] = _homeDailyLimit; - uintStorage[keccak256(abi.encodePacked("executionMaxPerTx"))] = _homeMaxPerTx; + uintStorage[DEPLOYED_AT_BLOCK] = block.number; + uintStorage[REQUIRED_BLOCK_CONFIRMATIONS] = _requiredBlockConfirmations; + uintStorage[GAS_PRICE] = _gasPrice; + uintStorage[MAX_PER_TX] = _maxPerTx; + uintStorage[EXECUTION_DAILY_LIMIT] = _homeDailyLimit; + uintStorage[EXECUTION_MAX_PER_TX] = _homeMaxPerTx; setOwner(_owner); setInitialize(); } diff --git a/contracts/upgradeable_contracts/erc20_to_erc20/FeeManagerErcToErcPOSDAO.sol b/contracts/upgradeable_contracts/erc20_to_erc20/FeeManagerErcToErcPOSDAO.sol index 71387270..5d1e8397 100644 --- a/contracts/upgradeable_contracts/erc20_to_erc20/FeeManagerErcToErcPOSDAO.sol +++ b/contracts/upgradeable_contracts/erc20_to_erc20/FeeManagerErcToErcPOSDAO.sol @@ -1,6 +1,5 @@ pragma solidity 0.4.24; -import "openzeppelin-solidity/contracts/AddressUtils.sol"; import "../BlockRewardFeeManager.sol"; contract FeeManagerErcToErcPOSDAO is BlockRewardFeeManager { @@ -13,19 +12,7 @@ contract FeeManagerErcToErcPOSDAO is BlockRewardFeeManager { } function setBlockRewardContract(address _blockReward) external { - require(AddressUtils.isContract(_blockReward)); - - // Before store the contract we need to make sure that it is the block reward contract in actual fact, - // call a specific method from the contract that should return a specific value - bool isBlockRewardContract = false; - if (_blockReward.call(abi.encodeWithSignature("blockRewardContractId()"))) { - isBlockRewardContract = - IBlockReward(_blockReward).blockRewardContractId() == bytes4(keccak256("blockReward")); - } else if (_blockReward.call(abi.encodeWithSignature("bridgesAllowedLength()"))) { - isBlockRewardContract = IBlockReward(_blockReward).bridgesAllowedLength() != 0; - } - require(isBlockRewardContract); - addressStorage[keccak256(abi.encodePacked("blockRewardContract"))] = _blockReward; + _setBlockRewardContract(_blockReward); } function distributeFeeFromBlockReward(uint256 _fee) internal { diff --git a/contracts/upgradeable_contracts/erc20_to_erc20/ForeignBridgeErc677ToErc677.sol b/contracts/upgradeable_contracts/erc20_to_erc20/ForeignBridgeErc677ToErc677.sol index e8603870..5973c6fe 100644 --- a/contracts/upgradeable_contracts/erc20_to_erc20/ForeignBridgeErc677ToErc677.sol +++ b/contracts/upgradeable_contracts/erc20_to_erc20/ForeignBridgeErc677ToErc677.sol @@ -31,8 +31,8 @@ contract ForeignBridgeErc677ToErc677 is ERC677Bridge, BasicForeignBridgeErcToErc _owner ); - uintStorage[keccak256(abi.encodePacked("dailyLimit"))] = _dailyLimit; - uintStorage[keccak256(abi.encodePacked("minPerTx"))] = _minPerTx; + uintStorage[DAILY_LIMIT] = _dailyLimit; + uintStorage[MIN_PER_TX] = _minPerTx; return isInitialized(); } diff --git a/contracts/upgradeable_contracts/erc20_to_erc20/ForeignBridgeErcToErc.sol b/contracts/upgradeable_contracts/erc20_to_erc20/ForeignBridgeErcToErc.sol index 827a635e..f3594c28 100644 --- a/contracts/upgradeable_contracts/erc20_to_erc20/ForeignBridgeErcToErc.sol +++ b/contracts/upgradeable_contracts/erc20_to_erc20/ForeignBridgeErcToErc.sol @@ -1,8 +1,9 @@ pragma solidity 0.4.24; import "./BasicForeignBridgeErcToErc.sol"; +import "../ERC20Bridge.sol"; -contract ForeignBridgeErcToErc is BasicForeignBridgeErcToErc { +contract ForeignBridgeErcToErc is BasicForeignBridgeErcToErc, ERC20Bridge { function initialize( address _validatorContract, address _erc20token, @@ -25,13 +26,4 @@ contract ForeignBridgeErcToErc is BasicForeignBridgeErcToErc { ); return isInitialized(); } - - function erc20token() public view returns (ERC20Basic) { - return ERC20Basic(addressStorage[keccak256(abi.encodePacked("erc20token"))]); - } - - function setErc20token(address _token) internal { - require(AddressUtils.isContract(_token)); - addressStorage[keccak256(abi.encodePacked("erc20token"))] = _token; - } } diff --git a/contracts/upgradeable_contracts/erc20_to_erc20/HomeBridgeErcToErc.sol b/contracts/upgradeable_contracts/erc20_to_erc20/HomeBridgeErcToErc.sol index 3f66df91..649cd03b 100644 --- a/contracts/upgradeable_contracts/erc20_to_erc20/HomeBridgeErcToErc.sol +++ b/contracts/upgradeable_contracts/erc20_to_erc20/HomeBridgeErcToErc.sol @@ -109,7 +109,7 @@ contract HomeBridgeErcToErc is _owner ); require(AddressUtils.isContract(_feeManager)); - addressStorage[keccak256(abi.encodePacked("feeManagerContract"))] = _feeManager; + addressStorage[FEE_MANAGER_CONTRACT] = _feeManager; _setFee(_feeManager, _homeFee, HOME_FEE); _setFee(_feeManager, _foreignFee, FOREIGN_FEE); } @@ -132,15 +132,15 @@ contract HomeBridgeErcToErc is require(_minPerTx > 0 && _maxPerTx > _minPerTx && _dailyLimit > _maxPerTx); require(_foreignMaxPerTx < _foreignDailyLimit); require(_owner != address(0)); - addressStorage[keccak256(abi.encodePacked("validatorContract"))] = _validatorContract; - uintStorage[keccak256(abi.encodePacked("deployedAtBlock"))] = block.number; - uintStorage[keccak256(abi.encodePacked("dailyLimit"))] = _dailyLimit; - uintStorage[keccak256(abi.encodePacked("maxPerTx"))] = _maxPerTx; - uintStorage[keccak256(abi.encodePacked("minPerTx"))] = _minPerTx; - uintStorage[keccak256(abi.encodePacked("gasPrice"))] = _homeGasPrice; - uintStorage[keccak256(abi.encodePacked("requiredBlockConfirmations"))] = _requiredBlockConfirmations; - uintStorage[keccak256(abi.encodePacked("executionDailyLimit"))] = _foreignDailyLimit; - uintStorage[keccak256(abi.encodePacked("executionMaxPerTx"))] = _foreignMaxPerTx; + addressStorage[VALIDATOR_CONTRACT] = _validatorContract; + uintStorage[DEPLOYED_AT_BLOCK] = block.number; + uintStorage[DAILY_LIMIT] = _dailyLimit; + uintStorage[MAX_PER_TX] = _maxPerTx; + uintStorage[MIN_PER_TX] = _minPerTx; + uintStorage[GAS_PRICE] = _homeGasPrice; + uintStorage[REQUIRED_BLOCK_CONFIRMATIONS] = _requiredBlockConfirmations; + uintStorage[EXECUTION_DAILY_LIMIT] = _foreignDailyLimit; + uintStorage[EXECUTION_MAX_PER_TX] = _foreignMaxPerTx; setOwner(_owner); setErc677token(_erc677token); } diff --git a/contracts/upgradeable_contracts/erc20_to_erc20/HomeBridgeErcToErcPOSDAO.sol b/contracts/upgradeable_contracts/erc20_to_erc20/HomeBridgeErcToErcPOSDAO.sol index 9b330e1b..49621afe 100644 --- a/contracts/upgradeable_contracts/erc20_to_erc20/HomeBridgeErcToErcPOSDAO.sol +++ b/contracts/upgradeable_contracts/erc20_to_erc20/HomeBridgeErcToErcPOSDAO.sol @@ -3,6 +3,9 @@ pragma solidity 0.4.24; import "./HomeBridgeErcToErc.sol"; contract HomeBridgeErcToErcPOSDAO is HomeBridgeErcToErc { + bytes4 internal constant BLOCK_REWARD_CONTRACT_SELECTOR = 0x56b54bae; // blockRewardContract() + bytes4 internal constant SET_BLOCK_REWARD_CONTRACT = 0x27a3e16b; // setBlockRewardContract(address) + function rewardableInitialize( address _validatorContract, uint256 _dailyLimit, @@ -43,7 +46,7 @@ contract HomeBridgeErcToErcPOSDAO is HomeBridgeErcToErc { function blockRewardContract() public view returns (address) { address blockReward; address feeManager = feeManagerContract(); - bytes memory callData = abi.encodeWithSignature("blockRewardContract()"); + bytes memory callData = abi.encodeWithSelector(BLOCK_REWARD_CONTRACT_SELECTOR); assembly { let result := callcode(gas, feeManager, 0x0, add(callData, 0x20), mload(callData), 0, 32) @@ -64,6 +67,6 @@ contract HomeBridgeErcToErcPOSDAO is HomeBridgeErcToErc { } function _setBlockRewardContract(address _feeManager, address _blockReward) internal { - require(_feeManager.delegatecall(abi.encodeWithSignature("setBlockRewardContract(address)", _blockReward))); + require(_feeManager.delegatecall(abi.encodeWithSelector(SET_BLOCK_REWARD_CONTRACT, _blockReward))); } } diff --git a/contracts/upgradeable_contracts/erc20_to_native/FeeManagerErcToNative.sol b/contracts/upgradeable_contracts/erc20_to_native/FeeManagerErcToNative.sol index 2fe8a471..30a6cec5 100644 --- a/contracts/upgradeable_contracts/erc20_to_native/FeeManagerErcToNative.sol +++ b/contracts/upgradeable_contracts/erc20_to_native/FeeManagerErcToNative.sol @@ -3,18 +3,15 @@ pragma solidity 0.4.24; import "../../interfaces/IBlockReward.sol"; import "../Sacrifice.sol"; import "../ValidatorsFeeManager.sol"; +import "../BlockRewardBridge.sol"; -contract FeeManagerErcToNative is ValidatorsFeeManager { +contract FeeManagerErcToNative is ValidatorsFeeManager, BlockRewardBridge { function getFeeManagerMode() external pure returns (bytes4) { return bytes4(keccak256(abi.encodePacked("manages-both-directions"))); } - function blockRewardContract() internal view returns (IBlockReward) { - return IBlockReward(addressStorage[keccak256(abi.encodePacked("blockRewardContract"))]); - } - function onAffirmationFeeDistribution(address _rewardAddress, uint256 _fee) internal { - IBlockReward blockReward = blockRewardContract(); + IBlockReward blockReward = _blockRewardContract(); blockReward.addExtraReceiver(_fee, _rewardAddress); } diff --git a/contracts/upgradeable_contracts/erc20_to_native/ForeignBridgeErcToNative.sol b/contracts/upgradeable_contracts/erc20_to_native/ForeignBridgeErcToNative.sol index ca837ac5..2a3fb48c 100644 --- a/contracts/upgradeable_contracts/erc20_to_native/ForeignBridgeErcToNative.sol +++ b/contracts/upgradeable_contracts/erc20_to_native/ForeignBridgeErcToNative.sol @@ -1,11 +1,9 @@ pragma solidity 0.4.24; -import "../../libraries/Message.sol"; import "../BasicForeignBridge.sol"; -import "../../interfaces/IBurnableMintableERC677Token.sol"; -import "openzeppelin-solidity/contracts/token/ERC20/ERC20Basic.sol"; +import "../ERC20Bridge.sol"; -contract ForeignBridgeErcToNative is BasicForeignBridge { +contract ForeignBridgeErcToNative is BasicForeignBridge, ERC20Bridge { event RelayedMessage(address recipient, uint256 value, bytes32 transactionHash); function initialize( @@ -24,14 +22,14 @@ contract ForeignBridgeErcToNative is BasicForeignBridge { require(_gasPrice > 0); require(_homeMaxPerTx < _homeDailyLimit); require(_owner != address(0)); - addressStorage[keccak256(abi.encodePacked("validatorContract"))] = _validatorContract; + addressStorage[VALIDATOR_CONTRACT] = _validatorContract; setErc20token(_erc20token); - uintStorage[keccak256(abi.encodePacked("deployedAtBlock"))] = block.number; - uintStorage[keccak256(abi.encodePacked("requiredBlockConfirmations"))] = _requiredBlockConfirmations; - uintStorage[keccak256(abi.encodePacked("gasPrice"))] = _gasPrice; - uintStorage[keccak256(abi.encodePacked("maxPerTx"))] = _maxPerTx; - uintStorage[keccak256(abi.encodePacked("executionDailyLimit"))] = _homeDailyLimit; - uintStorage[keccak256(abi.encodePacked("executionMaxPerTx"))] = _homeMaxPerTx; + uintStorage[DEPLOYED_AT_BLOCK] = block.number; + uintStorage[REQUIRED_BLOCK_CONFIRMATIONS] = _requiredBlockConfirmations; + uintStorage[GAS_PRICE] = _gasPrice; + uintStorage[MAX_PER_TX] = _maxPerTx; + uintStorage[EXECUTION_DAILY_LIMIT] = _homeDailyLimit; + uintStorage[EXECUTION_MAX_PER_TX] = _homeMaxPerTx; setOwner(_owner); setInitialize(); return isInitialized(); @@ -46,10 +44,6 @@ contract ForeignBridgeErcToNative is BasicForeignBridge { super.claimTokens(_token, _to); } - function erc20token() public view returns (ERC20Basic) { - return ERC20Basic(addressStorage[keccak256(abi.encodePacked("erc20token"))]); - } - function onExecuteMessage( address _recipient, uint256 _amount, @@ -59,11 +53,6 @@ contract ForeignBridgeErcToNative is BasicForeignBridge { return erc20token().transfer(_recipient, _amount); } - function setErc20token(address _token) private { - require(AddressUtils.isContract(_token)); - addressStorage[keccak256(abi.encodePacked("erc20token"))] = _token; - } - function onFailedMessage(address, uint256, bytes32) internal { revert(); } diff --git a/contracts/upgradeable_contracts/erc20_to_native/HomeBridgeErcToNative.sol b/contracts/upgradeable_contracts/erc20_to_native/HomeBridgeErcToNative.sol index 97fdd4d6..d3a5596d 100644 --- a/contracts/upgradeable_contracts/erc20_to_native/HomeBridgeErcToNative.sol +++ b/contracts/upgradeable_contracts/erc20_to_native/HomeBridgeErcToNative.sol @@ -7,10 +7,19 @@ import "../BasicHomeBridge.sol"; import "../ERC677Bridge.sol"; import "../OverdrawManagement.sol"; import "./RewardableHomeBridgeErcToNative.sol"; - -contract HomeBridgeErcToNative is EternalStorage, BasicHomeBridge, OverdrawManagement, RewardableHomeBridgeErcToNative { +import "../BlockRewardBridge.sol"; + +contract HomeBridgeErcToNative is + EternalStorage, + BasicHomeBridge, + OverdrawManagement, + RewardableHomeBridgeErcToNative, + BlockRewardBridge +{ event AmountLimitExceeded(address recipient, uint256 value, bytes32 transactionHash); + bytes32 internal constant TOTAL_BURNT_COINS = keccak256(abi.encodePacked("totalBurntCoins")); + function() public payable { nativeTransfer(); } @@ -94,7 +103,7 @@ contract HomeBridgeErcToNative is EternalStorage, BasicHomeBridge, OverdrawManag _owner ); require(AddressUtils.isContract(_feeManager)); - addressStorage[keccak256(abi.encodePacked("feeManagerContract"))] = _feeManager; + addressStorage[FEE_MANAGER_CONTRACT] = _feeManager; _setFee(_feeManager, _homeFee, HOME_FEE); _setFee(_feeManager, _foreignFee, FOREIGN_FEE); setInitialize(); @@ -107,27 +116,15 @@ contract HomeBridgeErcToNative is EternalStorage, BasicHomeBridge, OverdrawManag } function blockRewardContract() public view returns (IBlockReward) { - return IBlockReward(addressStorage[keccak256(abi.encodePacked("blockRewardContract"))]); + return _blockRewardContract(); } function totalBurntCoins() public view returns (uint256) { - return uintStorage[keccak256(abi.encodePacked("totalBurntCoins"))]; + return uintStorage[TOTAL_BURNT_COINS]; } function setBlockRewardContract(address _blockReward) external onlyOwner { - require(AddressUtils.isContract(_blockReward)); - - // Before store the contract we need to make sure that it is the block reward contract in actual fact, - // call a specific method from the contract that should return a specific value - bool isBlockRewardContract = false; - if (_blockReward.call(abi.encodeWithSignature("blockRewardContractId()"))) { - isBlockRewardContract = - IBlockReward(_blockReward).blockRewardContractId() == bytes4(keccak256("blockReward")); - } else if (_blockReward.call(abi.encodeWithSignature("bridgesAllowedLength()"))) { - isBlockRewardContract = IBlockReward(_blockReward).bridgesAllowedLength() != 0; - } - require(isBlockRewardContract); - addressStorage[keccak256(abi.encodePacked("blockRewardContract"))] = _blockReward; + _setBlockRewardContract(_blockReward); } function _initialize( @@ -149,16 +146,16 @@ contract HomeBridgeErcToNative is EternalStorage, BasicHomeBridge, OverdrawManag require(_blockReward == address(0) || AddressUtils.isContract(_blockReward)); require(_foreignMaxPerTx < _foreignDailyLimit); require(_owner != address(0)); - addressStorage[keccak256(abi.encodePacked("validatorContract"))] = _validatorContract; - uintStorage[keccak256(abi.encodePacked("deployedAtBlock"))] = block.number; - uintStorage[keccak256(abi.encodePacked("dailyLimit"))] = _dailyLimit; - uintStorage[keccak256(abi.encodePacked("maxPerTx"))] = _maxPerTx; - uintStorage[keccak256(abi.encodePacked("minPerTx"))] = _minPerTx; - uintStorage[keccak256(abi.encodePacked("gasPrice"))] = _homeGasPrice; - uintStorage[keccak256(abi.encodePacked("requiredBlockConfirmations"))] = _requiredBlockConfirmations; - addressStorage[keccak256(abi.encodePacked("blockRewardContract"))] = _blockReward; - uintStorage[keccak256(abi.encodePacked("executionDailyLimit"))] = _foreignDailyLimit; - uintStorage[keccak256(abi.encodePacked("executionMaxPerTx"))] = _foreignMaxPerTx; + addressStorage[VALIDATOR_CONTRACT] = _validatorContract; + uintStorage[DEPLOYED_AT_BLOCK] = block.number; + uintStorage[DAILY_LIMIT] = _dailyLimit; + uintStorage[MAX_PER_TX] = _maxPerTx; + uintStorage[MIN_PER_TX] = _minPerTx; + uintStorage[GAS_PRICE] = _homeGasPrice; + uintStorage[REQUIRED_BLOCK_CONFIRMATIONS] = _requiredBlockConfirmations; + addressStorage[BLOCK_REWARD_CONTRACT] = _blockReward; + uintStorage[EXECUTION_DAILY_LIMIT] = _foreignDailyLimit; + uintStorage[EXECUTION_MAX_PER_TX] = _foreignMaxPerTx; setOwner(_owner); } @@ -192,7 +189,7 @@ contract HomeBridgeErcToNative is EternalStorage, BasicHomeBridge, OverdrawManag } function setTotalBurntCoins(uint256 _amount) internal { - uintStorage[keccak256(abi.encodePacked("totalBurntCoins"))] = _amount; + uintStorage[TOTAL_BURNT_COINS] = _amount; } function onFailedAffirmation(address _recipient, uint256 _value, bytes32 _txHash) internal { diff --git a/contracts/upgradeable_contracts/erc20_to_native/RewardableHomeBridgeErcToNative.sol b/contracts/upgradeable_contracts/erc20_to_native/RewardableHomeBridgeErcToNative.sol index 8842d33c..fb8ebc61 100644 --- a/contracts/upgradeable_contracts/erc20_to_native/RewardableHomeBridgeErcToNative.sol +++ b/contracts/upgradeable_contracts/erc20_to_native/RewardableHomeBridgeErcToNative.sol @@ -3,6 +3,8 @@ pragma solidity 0.4.24; import "../RewardableBridge.sol"; contract RewardableHomeBridgeErcToNative is RewardableBridge { + bytes4 internal constant GET_AMOUNT_TO_BURN = 0x916850e9; // getAmountToBurn(uint256) + function setHomeFee(uint256 _fee) external onlyOwner { _setFee(feeManagerContract(), _fee, HOME_FEE); } @@ -21,7 +23,7 @@ contract RewardableHomeBridgeErcToNative is RewardableBridge { function getAmountToBurn(uint256 _value) public view returns (uint256) { uint256 amount; - bytes memory callData = abi.encodeWithSignature("getAmountToBurn(uint256)", _value); + bytes memory callData = abi.encodeWithSelector(GET_AMOUNT_TO_BURN, _value); address feeManager = feeManagerContract(); assembly { let result := callcode(gas, feeManager, 0x0, add(callData, 0x20), mload(callData), 0, 32) diff --git a/contracts/upgradeable_contracts/native_to_erc20/FeeManagerNativeToErc.sol b/contracts/upgradeable_contracts/native_to_erc20/FeeManagerNativeToErc.sol index c3310649..032c82ca 100644 --- a/contracts/upgradeable_contracts/native_to_erc20/FeeManagerNativeToErc.sol +++ b/contracts/upgradeable_contracts/native_to_erc20/FeeManagerNativeToErc.sol @@ -3,14 +3,15 @@ pragma solidity 0.4.24; import "../../interfaces/IBurnableMintableERC677Token.sol"; import "../Sacrifice.sol"; import "../ValidatorsFeeManager.sol"; +import "../ERC677Storage.sol"; -contract FeeManagerNativeToErc is ValidatorsFeeManager { +contract FeeManagerNativeToErc is ValidatorsFeeManager, ERC677Storage { function getFeeManagerMode() external pure returns (bytes4) { return bytes4(keccak256(abi.encodePacked("manages-one-direction"))); } function erc677token() public view returns (IBurnableMintableERC677Token) { - return IBurnableMintableERC677Token(addressStorage[keccak256(abi.encodePacked("erc677token"))]); + return IBurnableMintableERC677Token(addressStorage[ERC677_TOKEN]); } function onAffirmationFeeDistribution(address _rewardAddress, uint256 _fee) internal { diff --git a/contracts/upgradeable_contracts/native_to_erc20/ForeignBridgeNativeToErc.sol b/contracts/upgradeable_contracts/native_to_erc20/ForeignBridgeNativeToErc.sol index 420f2be5..46b97466 100644 --- a/contracts/upgradeable_contracts/native_to_erc20/ForeignBridgeNativeToErc.sol +++ b/contracts/upgradeable_contracts/native_to_erc20/ForeignBridgeNativeToErc.sol @@ -69,7 +69,7 @@ contract ForeignBridgeNativeToErc is _owner ); require(AddressUtils.isContract(_feeManager)); - addressStorage[keccak256(abi.encodePacked("feeManagerContract"))] = _feeManager; + addressStorage[FEE_MANAGER_CONTRACT] = _feeManager; _setFee(_feeManager, _homeFee, HOME_FEE); setInitialize(); return isInitialized(); @@ -102,16 +102,16 @@ contract ForeignBridgeNativeToErc is require(_foreignGasPrice > 0); require(_homeMaxPerTx < _homeDailyLimit); require(_owner != address(0)); - addressStorage[keccak256(abi.encodePacked("validatorContract"))] = _validatorContract; + addressStorage[VALIDATOR_CONTRACT] = _validatorContract; setErc677token(_erc677token); - uintStorage[keccak256(abi.encodePacked("dailyLimit"))] = _dailyLimit; - uintStorage[keccak256(abi.encodePacked("deployedAtBlock"))] = block.number; - uintStorage[keccak256(abi.encodePacked("maxPerTx"))] = _maxPerTx; - uintStorage[keccak256(abi.encodePacked("minPerTx"))] = _minPerTx; - uintStorage[keccak256(abi.encodePacked("gasPrice"))] = _foreignGasPrice; - uintStorage[keccak256(abi.encodePacked("requiredBlockConfirmations"))] = _requiredBlockConfirmations; - uintStorage[keccak256(abi.encodePacked("executionDailyLimit"))] = _homeDailyLimit; - uintStorage[keccak256(abi.encodePacked("executionMaxPerTx"))] = _homeMaxPerTx; + uintStorage[DAILY_LIMIT] = _dailyLimit; + uintStorage[DEPLOYED_AT_BLOCK] = block.number; + uintStorage[MAX_PER_TX] = _maxPerTx; + uintStorage[MIN_PER_TX] = _minPerTx; + uintStorage[GAS_PRICE] = _foreignGasPrice; + uintStorage[REQUIRED_BLOCK_CONFIRMATIONS] = _requiredBlockConfirmations; + uintStorage[EXECUTION_DAILY_LIMIT] = _homeDailyLimit; + uintStorage[EXECUTION_MAX_PER_TX] = _homeMaxPerTx; setOwner(_owner); } diff --git a/contracts/upgradeable_contracts/native_to_erc20/HomeBridgeNativeToErc.sol b/contracts/upgradeable_contracts/native_to_erc20/HomeBridgeNativeToErc.sol index 362bbd29..4893d7c6 100644 --- a/contracts/upgradeable_contracts/native_to_erc20/HomeBridgeNativeToErc.sol +++ b/contracts/upgradeable_contracts/native_to_erc20/HomeBridgeNativeToErc.sol @@ -77,7 +77,7 @@ contract HomeBridgeNativeToErc is EternalStorage, BasicHomeBridge, RewardableHom _owner ); require(AddressUtils.isContract(_feeManager)); - addressStorage[keccak256(abi.encodePacked("feeManagerContract"))] = _feeManager; + addressStorage[FEE_MANAGER_CONTRACT] = _feeManager; _setFee(_feeManager, _homeFee, HOME_FEE); _setFee(_feeManager, _foreignFee, FOREIGN_FEE); setInitialize(); @@ -106,15 +106,15 @@ contract HomeBridgeNativeToErc is EternalStorage, BasicHomeBridge, RewardableHom require(_minPerTx > 0 && _maxPerTx > _minPerTx && _dailyLimit > _maxPerTx); require(_foreignMaxPerTx < _foreignDailyLimit); require(_owner != address(0)); - addressStorage[keccak256(abi.encodePacked("validatorContract"))] = _validatorContract; - uintStorage[keccak256(abi.encodePacked("deployedAtBlock"))] = block.number; - uintStorage[keccak256(abi.encodePacked("dailyLimit"))] = _dailyLimit; - uintStorage[keccak256(abi.encodePacked("maxPerTx"))] = _maxPerTx; - uintStorage[keccak256(abi.encodePacked("minPerTx"))] = _minPerTx; - uintStorage[keccak256(abi.encodePacked("gasPrice"))] = _homeGasPrice; - uintStorage[keccak256(abi.encodePacked("requiredBlockConfirmations"))] = _requiredBlockConfirmations; - uintStorage[keccak256(abi.encodePacked("executionDailyLimit"))] = _foreignDailyLimit; - uintStorage[keccak256(abi.encodePacked("executionMaxPerTx"))] = _foreignMaxPerTx; + addressStorage[VALIDATOR_CONTRACT] = _validatorContract; + uintStorage[DEPLOYED_AT_BLOCK] = block.number; + uintStorage[DAILY_LIMIT] = _dailyLimit; + uintStorage[MAX_PER_TX] = _maxPerTx; + uintStorage[MIN_PER_TX] = _minPerTx; + uintStorage[GAS_PRICE] = _homeGasPrice; + uintStorage[REQUIRED_BLOCK_CONFIRMATIONS] = _requiredBlockConfirmations; + uintStorage[EXECUTION_DAILY_LIMIT] = _foreignDailyLimit; + uintStorage[EXECUTION_MAX_PER_TX] = _foreignMaxPerTx; setOwner(_owner); }