Comparing version 3.3.3 to 3.3.4
@@ -70,4 +70,12 @@ const BaseChecker = require('./../base-checker') | ||
function isConst(node) { | ||
return ['pure', 'view', 'constant'].includes(node.stateMutability) | ||
function getMutabilityWeight({ baseWeight, stateMutability }) { | ||
switch (stateMutability) { | ||
case 'constant': | ||
case 'view': | ||
return baseWeight + 2 | ||
case 'pure': | ||
return baseWeight + 4 | ||
default: | ||
return baseWeight | ||
} | ||
} | ||
@@ -110,2 +118,6 @@ | ||
function contractPartOrder(node) { | ||
if (node.type === 'UsingForDeclaration') { | ||
return [0, 'using for declaration'] | ||
} | ||
if (isTypeDeclaration(node)) { | ||
@@ -118,44 +130,59 @@ let label | ||
} | ||
return [0, label] | ||
return [10, label] | ||
} | ||
if (node.type === 'StateVariableDeclaration') { | ||
return [10, 'state variable declaration'] | ||
return [20, 'state variable declaration'] | ||
} | ||
if (node.type === 'EventDefinition') { | ||
return [20, 'event definition'] | ||
return [30, 'event definition'] | ||
} | ||
if (node.type === 'ModifierDefinition') { | ||
return [40, 'modifier definition'] | ||
} | ||
if (node.isConstructor) { | ||
return [30, 'constructor'] | ||
return [50, 'constructor'] | ||
} | ||
if (isReceiveFunction(node)) { | ||
return [40, 'receive function'] | ||
return [60, 'receive function'] | ||
} | ||
if (isFallbackFunction(node)) { | ||
return [50, 'fallback function'] | ||
return [70, 'fallback function'] | ||
} | ||
if (node.type === 'FunctionDefinition') { | ||
if (node.visibility === 'external' && !isConst(node)) { | ||
return [60, 'external function'] | ||
const { stateMutability, visibility } = node | ||
if (visibility === 'external') { | ||
const weight = getMutabilityWeight({ baseWeight: 80, stateMutability }) | ||
const label = [visibility, stateMutability, 'function'].join(' ') | ||
return [weight, label] | ||
} | ||
if (node.visibility === 'external' && isConst(node)) { | ||
return [70, 'external const function'] | ||
if (visibility === 'public') { | ||
const weight = getMutabilityWeight({ baseWeight: 90, stateMutability }) | ||
const label = [visibility, stateMutability, 'function'].join(' ') | ||
return [weight, label] | ||
} | ||
if (node.visibility === 'public' && !isConst(node)) { | ||
return [80, 'public function'] | ||
if (visibility === 'internal') { | ||
const weight = getMutabilityWeight({ baseWeight: 100, stateMutability }) | ||
const label = [visibility, stateMutability, 'function'].join(' ') | ||
return [weight, label] | ||
} | ||
if (node.visibility === 'public' && isConst(node)) { | ||
return [90, 'public const function'] | ||
if (visibility === 'private') { | ||
const weight = getMutabilityWeight({ baseWeight: 110, stateMutability }) | ||
const label = [visibility, stateMutability, 'function'].join(' ') | ||
return [weight, label] | ||
} | ||
if (node.visibility === 'internal') { | ||
return [100, 'internal function'] | ||
} | ||
if (node.visibility === 'private') { | ||
return [110, 'private function'] | ||
} | ||
throw new Error('Unknown order for function, please report this issue') | ||
@@ -162,0 +189,0 @@ } |
{ | ||
"name": "solhint", | ||
"version": "3.3.3", | ||
"version": "3.3.4", | ||
"description": "Solidity Code Linter", | ||
@@ -5,0 +5,0 @@ "main": "lib/index.js", |
module.exports = [ | ||
{ | ||
description: 'All units are in order', | ||
description: 'All units are in order - ^0.4.0', | ||
code: ` | ||
pragma solidity ^0.4.0; | ||
import "./some/library.sol"; | ||
import "./some/other-library.sol"; | ||
enum MyEnum { | ||
Foo, | ||
Bar | ||
} | ||
struct MyStruct { | ||
uint x; | ||
uint y; | ||
} | ||
interface IBox { | ||
function getValue() public; | ||
function setValue(uint) public; | ||
} | ||
library MyLibrary { | ||
function add(uint a, uint b, uint c) public returns (uint) { | ||
return a + b + c; | ||
} | ||
} | ||
contract MyContract { | ||
struct InnerStruct { | ||
bool flag; | ||
} | ||
enum InnerEnum { | ||
A, B, C | ||
} | ||
uint public x; | ||
uint public y; | ||
event MyEvent(address a); | ||
constructor () public {} | ||
fallback () external {} | ||
function myExternalFunction() external {} | ||
function myExternalConstantFunction() external constant {} | ||
function myPublicFunction() public {} | ||
function myPublicConstantFunction() public constant {} | ||
function myInternalFunction() internal {} | ||
function myPrivateFunction() private {} | ||
} | ||
` | ||
}, | ||
{ | ||
description: 'All units are in order - ^0.5.0', | ||
code: ` | ||
pragma solidity ^0.5.0; | ||
import "./some/library.sol"; | ||
import "./some/other-library.sol"; | ||
enum MyEnum { | ||
Foo, | ||
Bar | ||
} | ||
struct MyStruct { | ||
uint x; | ||
uint y; | ||
} | ||
interface IBox { | ||
function getValue() public; | ||
function setValue(uint) public; | ||
} | ||
library MyLibrary { | ||
function add(uint a, uint b, uint c) public returns (uint) { | ||
return a + b + c; | ||
} | ||
} | ||
contract MyContract { | ||
using MyLibrary for uint; | ||
struct InnerStruct { | ||
bool flag; | ||
} | ||
enum InnerEnum { | ||
A, B, C | ||
} | ||
address payable owner; | ||
uint public x; | ||
uint public y; | ||
event MyEvent(address a); | ||
modifier onlyOwner { | ||
require( | ||
msg.sender == owner, | ||
"Only owner can call this function." | ||
); | ||
_; | ||
} | ||
constructor () public {} | ||
fallback () external {} | ||
function myExternalFunction() external {} | ||
function myExternalViewFunction() external view {} | ||
function myExternalPureFunction() external pure {} | ||
function myPublicFunction() public {} | ||
function myPublicViewFunction() public view {} | ||
function myPublicPureFunction() public pure {} | ||
function myInternalFunction() internal {} | ||
function myInternalViewFunction() internal view {} | ||
function myInternalPureFunction() internal pure {} | ||
function myPrivateFunction() private {} | ||
function myPrivateViewFunction() private view {} | ||
function myPrivatePureFunction() private pure {} | ||
} | ||
` | ||
}, | ||
{ | ||
description: 'All units are in order - ^0.6.0', | ||
code: ` | ||
pragma solidity ^0.6.0; | ||
@@ -32,2 +166,4 @@ | ||
contract MyContract { | ||
using MyLibrary for uint; | ||
struct InnerStruct { | ||
@@ -41,2 +177,3 @@ bool flag; | ||
address payable owner; | ||
uint public x; | ||
@@ -47,12 +184,31 @@ uint public y; | ||
modifier onlyOwner { | ||
require( | ||
msg.sender == owner, | ||
"Only owner can call this function." | ||
); | ||
_; | ||
} | ||
constructor () public {} | ||
receive() external payable {} | ||
fallback () external {} | ||
function myExternalFunction() external {} | ||
function myExternalConstFunction() external const {} | ||
function myExternalViewFunction() external view {} | ||
function myExternalPureFunction() external pure {} | ||
function myPublicFunction() public {} | ||
function myPublicConstFunction() public const {} | ||
function myPublicViewFunction() public view {} | ||
function myPublicPureFunction() public pure {} | ||
function myInternalFunction() internal {} | ||
function myInternalViewFunction() internal view {} | ||
function myInternalPureFunction() internal pure {} | ||
function myPrivateFunction() private {} | ||
function myPrivateViewFunction() private view {} | ||
function myPrivatePureFunction() private pure {} | ||
} | ||
@@ -59,0 +215,0 @@ ` |
@@ -27,3 +27,53 @@ module.exports = [ | ||
` | ||
}, | ||
{ | ||
description: 'Use for after state variable', | ||
code: ` | ||
contract MyContract { | ||
uint public x; | ||
using MyMathLib for uint; | ||
} | ||
` | ||
}, | ||
{ | ||
description: 'External pure before external view', | ||
code: ` | ||
contract MyContract { | ||
function myExternalFunction() external {} | ||
function myExternalPureFunction() external pure {} | ||
function myExternalViewFunction() external view {} | ||
} | ||
` | ||
}, | ||
{ | ||
description: 'Public pure before public view', | ||
code: ` | ||
contract MyContract { | ||
function myPublicFunction() public {} | ||
function myPublicPureFunction() public pure {} | ||
function myPublicViewFunction() public view {} | ||
} | ||
` | ||
}, | ||
{ | ||
description: 'Internal pure before internal view', | ||
code: ` | ||
contract MyContract { | ||
function myInternalFunction() internal {} | ||
function myInternalPureFunction() internal pure {} | ||
function myInternalViewFunction() internal view {} | ||
} | ||
` | ||
}, | ||
{ | ||
description: 'Private pure before private view', | ||
code: ` | ||
contract MyContract { | ||
function myPrivateFunction() private {} | ||
function myPrivatePureFunction() private pure {} | ||
function myPrivateViewFunction() private view {} | ||
} | ||
` | ||
} | ||
] |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
New author
Supply chain riskA new npm collaborator published a version of the package for the first time. New collaborators are usually benign additions to a project, but do indicate a change to the security surface area of a package.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
228260
6708
1