Skip to content

Commit

Permalink
Add Solhint solidity linter (#240)
Browse files Browse the repository at this point in the history
* Add solhint and prettier for solidity
* Apply prettier styles on contracts
* Fix solhint warnings
* Run js and solidity linter on travis
  • Loading branch information
patitonar authored and akolotov committed Jul 22, 2019
1 parent e8217f1 commit dc099b8
Show file tree
Hide file tree
Showing 71 changed files with 2,082 additions and 436 deletions.
3 changes: 2 additions & 1 deletion .prettierrc
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
{
"semi": false,
"singleQuote": true,
"printWidth": 120
"printWidth": 120,
"bracketSpacing": true
}
13 changes: 13 additions & 0 deletions .solhint.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
{
"extends": "solhint:recommended",
"plugins": ["prettier"],
"rules": {
"prettier/prettier": "error",
"mark-callable-contracts": "off",
"avoid-low-level-calls": "off",
"no-inline-assembly": "off",
"multiple-sends": "off",
"bracket-align": "off",
"compiler-version": ["error", "0.4.24"]
}
}
1 change: 0 additions & 1 deletion .soliumignore

This file was deleted.

2 changes: 1 addition & 1 deletion .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,5 +10,5 @@ env:
- SOLIDITY_COVERAGE=false
- SOLIDITY_COVERAGE=true
script:
- yarn lint:js
- yarn lint
- yarn test
48 changes: 17 additions & 31 deletions contracts/ERC677BridgeToken.sol
Original file line number Diff line number Diff line change
Expand Up @@ -6,24 +6,16 @@ import "openzeppelin-solidity/contracts/token/ERC20/DetailedERC20.sol";
import "./interfaces/IBurnableMintableERC677Token.sol";
import "./upgradeable_contracts/Claimable.sol";

contract ERC677BridgeToken is
IBurnableMintableERC677Token,
DetailedERC20,
BurnableToken,
MintableToken,
Claimable {

contract ERC677BridgeToken is IBurnableMintableERC677Token, DetailedERC20, BurnableToken, MintableToken, Claimable {
address public bridgeContract;

event ContractFallbackCallFailed(address from, address to, uint value);
event ContractFallbackCallFailed(address from, address to, uint256 value);

constructor(
string _name,
string _symbol,
uint8 _decimals)
public DetailedERC20(_name, _symbol, _decimals) {}
constructor(string _name, string _symbol, uint8 _decimals) public DetailedERC20(_name, _symbol, _decimals) {
// solhint-disable-previous-line no-empty-blocks
}

function setBridgeContract(address _bridgeContract) onlyOwner external {
function setBridgeContract(address _bridgeContract) external onlyOwner {
require(isContract(_bridgeContract));
bridgeContract = _bridgeContract;
}
Expand All @@ -33,9 +25,7 @@ contract ERC677BridgeToken is
_;
}

function transferAndCall(address _to, uint _value, bytes _data)
external validRecipient(_to) returns (bool)
{
function transferAndCall(address _to, uint256 _value, bytes _data) external validRecipient(_to) returns (bool) {
require(superTransfer(_to, _value));
emit Transfer(msg.sender, _to, _value, _data);

Expand All @@ -45,17 +35,15 @@ contract ERC677BridgeToken is
return true;
}

function getTokenInterfacesVersion() external pure returns(uint64 major, uint64 minor, uint64 patch) {
function getTokenInterfacesVersion() external pure returns (uint64 major, uint64 minor, uint64 patch) {
return (2, 1, 0);
}

function superTransfer(address _to, uint256 _value) internal returns(bool)
{
function superTransfer(address _to, uint256 _value) internal returns (bool) {
return super.transfer(_to, _value);
}

function transfer(address _to, uint256 _value) public returns (bool)
{
function transfer(address _to, uint256 _value) public returns (bool) {
require(superTransfer(_to, _value));
callAfterTransfer(msg.sender, _to, _value);
return true;
Expand All @@ -74,17 +62,15 @@ contract ERC677BridgeToken is
}
}

function contractFallback(address _from, address _to, uint _value, bytes _data) private returns(bool) {
return _to.call(abi.encodeWithSignature("onTokenTransfer(address,uint256,bytes)", _from, _value, _data));
function contractFallback(address _from, address _to, uint256 _value, bytes _data) private returns (bool) {
return _to.call(abi.encodeWithSignature("onTokenTransfer(address,uint256,bytes)", _from, _value, _data));
}

function isContract(address _addr)
internal
view
returns (bool)
{
uint length;
assembly { length := extcodesize(_addr) }
function isContract(address _addr) internal view returns (bool) {
uint256 length;
assembly {
length := extcodesize(_addr)
}
return length > 0;
}

Expand Down
18 changes: 7 additions & 11 deletions contracts/ERC677BridgeTokenRewardable.sol
Original file line number Diff line number Diff line change
Expand Up @@ -2,24 +2,20 @@ pragma solidity 0.4.24;

import "./ERC677BridgeToken.sol";


contract ERC677BridgeTokenRewardable is ERC677BridgeToken {

address public blockRewardContract;
address public stakingContract;

constructor(
string _name,
string _symbol,
uint8 _decimals
) public ERC677BridgeToken(_name, _symbol, _decimals) {}
constructor(string _name, string _symbol, uint8 _decimals) public ERC677BridgeToken(_name, _symbol, _decimals) {
// solhint-disable-previous-line no-empty-blocks
}

function setBlockRewardContract(address _blockRewardContract) onlyOwner external {
function setBlockRewardContract(address _blockRewardContract) external onlyOwner {
require(isContract(_blockRewardContract));
blockRewardContract = _blockRewardContract;
}

function setStakingContract(address _stakingContract) onlyOwner external {
function setStakingContract(address _stakingContract) external onlyOwner {
require(isContract(_stakingContract));
stakingContract = _stakingContract;
}
Expand Down Expand Up @@ -66,12 +62,12 @@ contract ERC677BridgeTokenRewardable is ERC677BridgeToken {
emit Transfer(stakingContract, _staker, _amount);
}

function transfer(address _to, uint256 _value) public returns(bool) {
function transfer(address _to, uint256 _value) public returns (bool) {
require(_to != stakingContract);
return super.transfer(_to, _value);
}

function transferFrom(address _from, address _to, uint256 _value) public returns(bool) {
function transferFrom(address _from, address _to, uint256 _value) public returns (bool) {
require(_to != stakingContract);
return super.transferFrom(_from, _to, _value);
}
Expand Down
31 changes: 16 additions & 15 deletions contracts/Migrations.sol
Original file line number Diff line number Diff line change
@@ -1,23 +1,24 @@
pragma solidity 0.4.24;

contract Migrations {
address public owner;
uint public last_completed_migration;
address public owner;
// solhint-disable-next-line var-name-mixedcase
uint256 public last_completed_migration;

modifier restricted() {
if (msg.sender == owner) _;
}
modifier restricted() {
if (msg.sender == owner) _;
}

constructor() public {
owner = msg.sender;
}
constructor() public {
owner = msg.sender;
}

function setCompleted(uint completed) public restricted {
last_completed_migration = completed;
}
function setCompleted(uint256 completed) public restricted {
last_completed_migration = completed;
}

function upgrade(address new_address) public restricted {
Migrations upgraded = Migrations(new_address);
upgraded.setCompleted(last_completed_migration);
}
function upgrade(address new_address) public restricted {
Migrations upgraded = Migrations(new_address);
upgraded.setCompleted(last_completed_migration);
}
}
5 changes: 2 additions & 3 deletions contracts/interfaces/ERC677.sol
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
pragma solidity 0.4.24;
import "openzeppelin-solidity/contracts/token/ERC20/ERC20.sol";


contract ERC677 is ERC20 {
event Transfer(address indexed from, address indexed to, uint value, bytes data);
event Transfer(address indexed from, address indexed to, uint256 value, bytes data);

function transferAndCall(address, uint, bytes) external returns (bool);
function transferAndCall(address, uint256, bytes) external returns (bool);

}
3 changes: 1 addition & 2 deletions contracts/interfaces/ERC677Receiver.sol
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
pragma solidity 0.4.24;


contract ERC677Receiver {
function onTokenTransfer(address _from, uint _value, bytes _data) external returns(bool);
function onTokenTransfer(address _from, uint256 _value, bytes _data) external returns (bool);
}
7 changes: 3 additions & 4 deletions contracts/interfaces/IBlockReward.sol
Original file line number Diff line number Diff line change
@@ -1,12 +1,11 @@
pragma solidity 0.4.24;


interface IBlockReward {
function addExtraReceiver(uint256 _amount, address _receiver) external;
function mintedTotally() external view returns (uint256);
function mintedTotallyByBridge(address _bridge) external view returns(uint256);
function bridgesAllowedLength() external view returns(uint256);
function mintedTotallyByBridge(address _bridge) external view returns (uint256);
function bridgesAllowedLength() external view returns (uint256);
function addBridgeTokenFeeReceivers(uint256 _amount) external;
function addBridgeNativeFeeReceivers(uint256 _amount) external;
function blockRewardContractId() external pure returns(bytes4);
function blockRewardContractId() external pure returns (bytes4);
}
7 changes: 3 additions & 4 deletions contracts/interfaces/IBridgeValidators.sol
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
pragma solidity 0.4.24;


interface IBridgeValidators {
function isValidator(address _validator) external view returns(bool);
function requiredSignatures() external view returns(uint256);
function owner() external view returns(address);
function isValidator(address _validator) external view returns (bool);
function requiredSignatures() external view returns (uint256);
function owner() external view returns (address);
}
1 change: 0 additions & 1 deletion contracts/interfaces/IBurnableMintableERC677Token.sol
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
pragma solidity 0.4.24;
import "../interfaces/ERC677.sol";


contract IBurnableMintableERC677Token is ERC677 {
function mint(address, uint256) public returns (bool);
function burn(uint256 _value) public;
Expand Down
9 changes: 4 additions & 5 deletions contracts/interfaces/IRewardableValidators.sol
Original file line number Diff line number Diff line change
@@ -1,12 +1,11 @@
pragma solidity 0.4.24;


interface IRewardableValidators {
function isValidator(address _validator) external view returns(bool);
function requiredSignatures() external view returns(uint256);
function owner() external view returns(address);
function isValidator(address _validator) external view returns (bool);
function requiredSignatures() external view returns (uint256);
function owner() external view returns (address);
function validatorList() external view returns (address[]);
function getValidatorRewardAddress(address _validator) external view returns(address);
function getValidatorRewardAddress(address _validator) external view returns (address);
function validatorCount() external view returns (uint256);
function getNextValidator(address _address) external view returns (address);
}
1 change: 0 additions & 1 deletion contracts/interfaces/IUpgradeabilityOwnerStorage.sol
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
pragma solidity 0.4.24;


interface IUpgradeabilityOwnerStorage {
function upgradeabilityOwner() external view returns (address);
}
10 changes: 5 additions & 5 deletions contracts/libraries/Message.sol
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
pragma solidity 0.4.24;
import "../interfaces/IBridgeValidators.sol";


library Message {
// function uintToString(uint256 inputValue) internal pure returns (string) {
// // figure out the length of the resulting string
Expand Down Expand Up @@ -50,7 +49,7 @@ library Message {
function parseMessage(bytes message)
internal
pure
returns(address recipient, uint256 amount, bytes32 txHash, address contractAddress)
returns (address recipient, uint256 amount, bytes32 txHash, address contractAddress)
{
require(isMessageValid(message));
assembly {
Expand All @@ -61,11 +60,11 @@ library Message {
}
}

function isMessageValid(bytes _msg) internal pure returns(bool) {
function isMessageValid(bytes _msg) internal pure returns (bool) {
return _msg.length == requiredMessageLength();
}

function requiredMessageLength() internal pure returns(uint256) {
function requiredMessageLength() internal pure returns (uint256) {
return 104;
}

Expand Down Expand Up @@ -94,7 +93,8 @@ library Message {
uint8[] _vs,
bytes32[] _rs,
bytes32[] _ss,
IBridgeValidators _validatorContract) internal view {
IBridgeValidators _validatorContract
) internal view {
require(isMessageValid(_message));
uint256 requiredSignatures = _validatorContract.requiredSignatures();
// It is not necessary to check that arrays have the same length since it will be handled
Expand Down
14 changes: 6 additions & 8 deletions contracts/test/BlockReward.sol
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ pragma solidity 0.4.24;
import "../interfaces/IBlockReward.sol";
import "openzeppelin-solidity/contracts/math/SafeMath.sol";


contract BlockReward {
using SafeMath for uint256;

Expand All @@ -14,7 +13,8 @@ contract BlockReward {
bytes32 internal constant MINTED_TOTALLY_BY_BRIDGE = "mintedTotallyByBridge";
address public token;

function () external payable {
function() external payable {
// solhint-disable-previous-line no-empty-blocks
}

function addExtraReceiver(uint256 _amount, address _receiver) external {
Expand All @@ -29,10 +29,8 @@ contract BlockReward {
return mintedCoins;
}

function mintedTotallyByBridge(address _bridge) public view returns(uint256) {
return uintStorage[
keccak256(abi.encode(MINTED_TOTALLY_BY_BRIDGE, _bridge))
];
function mintedTotallyByBridge(address _bridge) public view returns (uint256) {
return uintStorage[keccak256(abi.encode(MINTED_TOTALLY_BY_BRIDGE, _bridge))];
}

function addMintedTotallyByBridge(uint256 _amount, address _bridge) external {
Expand Down Expand Up @@ -91,11 +89,11 @@ contract BlockReward {
require(token.call(abi.encodeWithSignature("mintReward(address[],uint256[])", receivers, rewards)));
}

function random(uint256 _count) public view returns(uint256) {
function random(uint256 _count) public view returns (uint256) {
return uint256(blockhash(block.number.sub(1))) % _count;
}

function blockRewardContractId() public pure returns(bytes4) {
function blockRewardContractId() public pure returns (bytes4) {
return bytes4(keccak256("blockReward"));
}
}
5 changes: 3 additions & 2 deletions contracts/test/Staking.sol
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
pragma solidity 0.4.24;


contract Staking {
constructor() public {}
constructor() public {
// solhint-disable-previous-line no-empty-blocks
}
}
Loading

0 comments on commit dc099b8

Please sign in to comment.