From 6481596f311e54b3ca47c6b8f16ee79f7f4421ee Mon Sep 17 00:00:00 2001 From: frodan Date: Thu, 2 Mar 2023 20:25:56 +0530 Subject: [PATCH 1/8] + rule --- solidity/external-call-return-value-not-checked.sol | 0 solidity/external-call-return-value-not-checked.yaml | 0 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 solidity/external-call-return-value-not-checked.sol create mode 100644 solidity/external-call-return-value-not-checked.yaml diff --git a/solidity/external-call-return-value-not-checked.sol b/solidity/external-call-return-value-not-checked.sol new file mode 100644 index 0000000..e69de29 diff --git a/solidity/external-call-return-value-not-checked.yaml b/solidity/external-call-return-value-not-checked.yaml new file mode 100644 index 0000000..e69de29 From b027c191b00e8188ce06aecb07b1cd0d2adb004e Mon Sep 17 00:00:00 2001 From: frodan Date: Thu, 2 Mar 2023 20:27:24 +0530 Subject: [PATCH 2/8] + rule --- ...external-call-return-value-not-checked.sol | 54 ++++++++++++++++++ ...xternal-call-return-value-not-checked.yaml | 55 +++++++++++++++++++ 2 files changed, 109 insertions(+) diff --git a/solidity/external-call-return-value-not-checked.sol b/solidity/external-call-return-value-not-checked.sol index e69de29..e1ffcb8 100644 --- a/solidity/external-call-return-value-not-checked.sol +++ b/solidity/external-call-return-value-not-checked.sol @@ -0,0 +1,54 @@ +pragma solidity ^0.8.17; + +contract Test { + function setVars(address _contract, uint _num) public payable { + + // ok: external-call-return-value-not-checked + (bool success, ) = _contract.delegatecall( + abi.encodeWithSignature("setVars(uint256)", _num) + ); + require(success, "Error"); + + // ok: external-call-return-value-not-checked + (bool success2, ) = _contract.staticcall( + abi.encodeWithSignature("setVars(uint256)", _num) + ); + if (!success2) revert(); + + // ok: external-call-return-value-not-checked + (bool success3, bytes memory data) = _contract.staticcall( + abi.encodeWithSignature("setVars(uint256)", _num) + ); + if (success3 != 0) revert(); + + // ok: external-call-return-value-not-checked + (bool success4, bytes memory data) = _contract.call( + abi.encodeWithSignature("setVars(uint256)", _num) + ); + if (success4){ + revert; + } + // ok: external-call-return-value-not-checked + bool success5 = _contract.send( + abi.encodeWithSignature("setVars(uint256)", _num) + ); + if (success5 == 0) revert(); + + + } + + function setVars2(address _contract, uint _num) public payable { + // ruleid: external-call-return-value-not-checked + _contract.delegetecall( + abi.encodeWithSignature("setVars(uint256)", _num) + ); + + // ruleid: external-call-return-value-not-checked + (bool success, bytes memory data) = _contract.call( + abi.encodeWithSignature("setVars(uint256)", _num) + ); + + // ruleid: external-call-return-value-not-checked + bool success = _contract.send(1 ether); + } +} diff --git a/solidity/external-call-return-value-not-checked.yaml b/solidity/external-call-return-value-not-checked.yaml index e69de29..cfb89b3 100644 --- a/solidity/external-call-return-value-not-checked.yaml +++ b/solidity/external-call-return-value-not-checked.yaml @@ -0,0 +1,55 @@ +rules: + - id: external-call-return-value-not-checked-copy + message: Functions call, staticcall, delegatecall, send returns a boolean indicating whether the call completed successfully. Not testing explicitly whether these calls fail may lead to unexpected behavior in the caller contract. + languages: + - solidity + severity: WARNING + metadata: + references: + - "https://entethalliance.org/specs/ethtrust-sl/v1/#req-1-check-return" + tags: + - ethtrust + - external-call + patterns: + - pattern-either: + - pattern: (bool $SUCC, ) = $ADDR.$METHOD(...); + - pattern: (bool $SUCC, bytes memory $DATA) = $ADDR.$METHOD(...); + - pattern: $ADDR.$METHOD(...); + - metavariable-regex: + metavariable: $METHOD + regex: ^(call|delegatecall|staticcall|send)$ + - pattern-not-inside: | + function $FUNC(...){ + ... + require($SUCC, ...); + } + - pattern-not-inside: | + function $FUNC(...){ + ... + if (!$SUCC){ + ... + } + } + - pattern-not-inside: | + function $FUNC(...){ + ... + if ($SUCC != ...){ + ... + } + } + - pattern-not-inside: | + function $FUNC(...){ + ... + if ($SUCC){ + ... + } + } + - pattern-not-inside: | + function $FUNC(...){ + ... + if ($SUCC == ...){ + ... + } + } + + From 106d56257e103b73e89437b6255b0ebbd6d55541 Mon Sep 17 00:00:00 2001 From: frodan Date: Fri, 3 Mar 2023 16:32:52 +0530 Subject: [PATCH 3/8] + fix --- ...external-call-return-value-not-checked.sol | 41 +++++++++++++------ ...xternal-call-return-value-not-checked.yaml | 4 +- 2 files changed, 31 insertions(+), 14 deletions(-) diff --git a/solidity/external-call-return-value-not-checked.sol b/solidity/external-call-return-value-not-checked.sol index e1ffcb8..bbcaa98 100644 --- a/solidity/external-call-return-value-not-checked.sol +++ b/solidity/external-call-return-value-not-checked.sol @@ -1,7 +1,8 @@ pragma solidity ^0.8.17; contract Test { - function setVars(address _contract, uint _num) public payable { + bool flag; + function setVars(address payable _contract, uint _num) public payable { // ok: external-call-return-value-not-checked (bool success, ) = _contract.delegatecall( @@ -15,40 +16,56 @@ contract Test { ); if (!success2) revert(); + // // ok: external-call-return-value-not-checked + // (bool success3, bytes memory data) = _contract.staticcall( + // abi.encodeWithSignature("setVars(uint256)", _num) + // ); + // if (success3 != 0) revert(); + // ok: external-call-return-value-not-checked - (bool success3, bytes memory data) = _contract.staticcall( + (bool success3, bytes memory data) = _contract.call( abi.encodeWithSignature("setVars(uint256)", _num) ); - if (success3 != 0) revert(); + if (success3){ + ok(); + } // ok: external-call-return-value-not-checked - (bool success4, bytes memory data) = _contract.call( + (bool success4, ) = _contract.call( abi.encodeWithSignature("setVars(uint256)", _num) ); - if (success4){ - revert; + if (success4 && 1 == 1){ + ok(); } + // ok: external-call-return-value-not-checked - bool success5 = _contract.send( + (bool success5, ) = _contract.call( abi.encodeWithSignature("setVars(uint256)", _num) ); - if (success5 == 0) revert(); + + if (!success5 || 0 == 0){ + revert(); + } } - function setVars2(address _contract, uint _num) public payable { + function setVars2(address payable _contract, uint _num) public payable { // ruleid: external-call-return-value-not-checked - _contract.delegetecall( + _contract.call( abi.encodeWithSignature("setVars(uint256)", _num) ); // ruleid: external-call-return-value-not-checked - (bool success, bytes memory data) = _contract.call( + (bool success1, bytes memory data) = _contract.call( abi.encodeWithSignature("setVars(uint256)", _num) ); // ruleid: external-call-return-value-not-checked - bool success = _contract.send(1 ether); + bool success2 = _contract.send(1 ether); + } + + function ok() public{ + flag = true; } } diff --git a/solidity/external-call-return-value-not-checked.yaml b/solidity/external-call-return-value-not-checked.yaml index cfb89b3..4d13046 100644 --- a/solidity/external-call-return-value-not-checked.yaml +++ b/solidity/external-call-return-value-not-checked.yaml @@ -33,7 +33,7 @@ rules: - pattern-not-inside: | function $FUNC(...){ ... - if ($SUCC != ...){ + if ($SUCC && ...){ ... } } @@ -47,7 +47,7 @@ rules: - pattern-not-inside: | function $FUNC(...){ ... - if ($SUCC == ...){ + if (!$SUCC || ...){ ... } } From fa46ec8e0549766388ac9766758f0e148f0e1478 Mon Sep 17 00:00:00 2001 From: frodan Date: Fri, 3 Mar 2023 16:47:42 +0530 Subject: [PATCH 4/8] Update external-call-return-value-not-checked.sol --- solidity/external-call-return-value-not-checked.sol | 6 ------ 1 file changed, 6 deletions(-) diff --git a/solidity/external-call-return-value-not-checked.sol b/solidity/external-call-return-value-not-checked.sol index bbcaa98..14a535f 100644 --- a/solidity/external-call-return-value-not-checked.sol +++ b/solidity/external-call-return-value-not-checked.sol @@ -16,12 +16,6 @@ contract Test { ); if (!success2) revert(); - // // ok: external-call-return-value-not-checked - // (bool success3, bytes memory data) = _contract.staticcall( - // abi.encodeWithSignature("setVars(uint256)", _num) - // ); - // if (success3 != 0) revert(); - // ok: external-call-return-value-not-checked (bool success3, bytes memory data) = _contract.call( abi.encodeWithSignature("setVars(uint256)", _num) From e02db9c2f7a880cd71aeb46ac58ef63f6da42f8f Mon Sep 17 00:00:00 2001 From: frodan Date: Fri, 3 Mar 2023 19:25:20 +0530 Subject: [PATCH 5/8] Update external-call-return-value-not-checked.yaml --- solidity/external-call-return-value-not-checked.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/solidity/external-call-return-value-not-checked.yaml b/solidity/external-call-return-value-not-checked.yaml index 4d13046..22ea906 100644 --- a/solidity/external-call-return-value-not-checked.yaml +++ b/solidity/external-call-return-value-not-checked.yaml @@ -1,5 +1,5 @@ rules: - - id: external-call-return-value-not-checked-copy + - id: external-call-return-value-not-checked message: Functions call, staticcall, delegatecall, send returns a boolean indicating whether the call completed successfully. Not testing explicitly whether these calls fail may lead to unexpected behavior in the caller contract. languages: - solidity From e507fd432006b49be2aa8d8ca7ede02108a9a003 Mon Sep 17 00:00:00 2001 From: Omar Ganiev Date: Fri, 3 Mar 2023 18:24:10 +0400 Subject: [PATCH 6/8] Added the call with value case to the external call return value not checked rule --- solidity/external-call-return-value-not-checked.sol | 2 +- solidity/external-call-return-value-not-checked.yaml | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/solidity/external-call-return-value-not-checked.sol b/solidity/external-call-return-value-not-checked.sol index 14a535f..ca9c230 100644 --- a/solidity/external-call-return-value-not-checked.sol +++ b/solidity/external-call-return-value-not-checked.sol @@ -46,7 +46,7 @@ contract Test { function setVars2(address payable _contract, uint _num) public payable { // ruleid: external-call-return-value-not-checked - _contract.call( + _contract.call{value: 1337}( abi.encodeWithSignature("setVars(uint256)", _num) ); diff --git a/solidity/external-call-return-value-not-checked.yaml b/solidity/external-call-return-value-not-checked.yaml index 22ea906..55ae9c6 100644 --- a/solidity/external-call-return-value-not-checked.yaml +++ b/solidity/external-call-return-value-not-checked.yaml @@ -13,8 +13,11 @@ rules: patterns: - pattern-either: - pattern: (bool $SUCC, ) = $ADDR.$METHOD(...); + - pattern: (bool $SUCC, ) = $ADDR.$METHOD{value:$VAL}(...); - pattern: (bool $SUCC, bytes memory $DATA) = $ADDR.$METHOD(...); + - pattern: (bool $SUCC, bytes memory $DATA) = $ADDR.$METHOD{value:$VAL}(...); - pattern: $ADDR.$METHOD(...); + - pattern: $ADDR.$METHOD{value:$VAL}(...); - metavariable-regex: metavariable: $METHOD regex: ^(call|delegatecall|staticcall|send)$ From ffd32d3d053e69167d6fa1f3967e79521bc241bf Mon Sep 17 00:00:00 2001 From: h1kk4 Date: Mon, 6 Mar 2023 12:18:21 +0000 Subject: [PATCH 7/8] extend cases with gas limit --- ...external-call-return-value-not-checked.sol | 24 +++++++++++++++---- ...xternal-call-return-value-not-checked.yaml | 13 +++++++--- 2 files changed, 30 insertions(+), 7 deletions(-) diff --git a/solidity/external-call-return-value-not-checked.sol b/solidity/external-call-return-value-not-checked.sol index ca9c230..f55cc14 100644 --- a/solidity/external-call-return-value-not-checked.sol +++ b/solidity/external-call-return-value-not-checked.sol @@ -3,13 +3,13 @@ pragma solidity ^0.8.17; contract Test { bool flag; function setVars(address payable _contract, uint _num) public payable { - + // ok: external-call-return-value-not-checked (bool success, ) = _contract.delegatecall( abi.encodeWithSignature("setVars(uint256)", _num) ); require(success, "Error"); - + // ok: external-call-return-value-not-checked (bool success2, ) = _contract.staticcall( abi.encodeWithSignature("setVars(uint256)", _num) @@ -41,7 +41,7 @@ contract Test { revert(); } - + } function setVars2(address payable _contract, uint _num) public payable { @@ -50,11 +50,27 @@ contract Test { abi.encodeWithSignature("setVars(uint256)", _num) ); + // ruleid: external-call-return-value-not-checked + _contract.call{gas: 1337}( + abi.encodeWithSignature("setVars(uint256)", _num) + ); + + // ruleid: external-call-return-value-not-checked + _contract.call{value: msg.value, gas: 5000}( + abi.encodeWithSignature("setVars(uint256)", _num) + ); + + // ruleid: external-call-return-value-not-checked + _contract.call{gas: 5000, value: msg.value}( + abi.encodeWithSignature("setVars(uint256)", _num) + ); + // ruleid: external-call-return-value-not-checked (bool success1, bytes memory data) = _contract.call( abi.encodeWithSignature("setVars(uint256)", _num) ); + // ruleid: external-call-return-value-not-checked bool success2 = _contract.send(1 ether); } @@ -62,4 +78,4 @@ contract Test { function ok() public{ flag = true; } -} +} \ No newline at end of file diff --git a/solidity/external-call-return-value-not-checked.yaml b/solidity/external-call-return-value-not-checked.yaml index 55ae9c6..f721f69 100644 --- a/solidity/external-call-return-value-not-checked.yaml +++ b/solidity/external-call-return-value-not-checked.yaml @@ -14,10 +14,19 @@ rules: - pattern-either: - pattern: (bool $SUCC, ) = $ADDR.$METHOD(...); - pattern: (bool $SUCC, ) = $ADDR.$METHOD{value:$VAL}(...); + - pattern: (bool $SUCC, ) = $ADDR.$METHOD{gas:$GAS}(...); + - pattern: (bool $SUCC, ) = $ADDR.$METHOD{value:$VAL, gas:$GAS}(...); + - pattern: (bool $SUCC, ) = $ADDR.$METHOD{gas:$GAS, value:$VAL}(...); - pattern: (bool $SUCC, bytes memory $DATA) = $ADDR.$METHOD(...); - pattern: (bool $SUCC, bytes memory $DATA) = $ADDR.$METHOD{value:$VAL}(...); + - pattern: (bool $SUCC, bytes memory $DATA) = $ADDR.$METHOD{gas:$GAS}(...); + - pattern: (bool $SUCC, bytes memory $DATA) = $ADDR.$METHOD{value:$VAL, gas:$GAS}(...); + - pattern: (bool $SUCC, bytes memory $DATA) = $ADDR.$METHOD{gas:$GAS, value:$VAL}(...); - pattern: $ADDR.$METHOD(...); - pattern: $ADDR.$METHOD{value:$VAL}(...); + - pattern: $ADDR.$METHOD{gas:$GAS}(...); + - pattern: $ADDR.$METHOD{value:$VAL, gas:$GAS}(...); + - pattern: $ADDR.$METHOD{gas:$GAS, value:$VAL}(...); - metavariable-regex: metavariable: $METHOD regex: ^(call|delegatecall|staticcall|send)$ @@ -53,6 +62,4 @@ rules: if (!$SUCC || ...){ ... } - } - - + } \ No newline at end of file From baeb882955a587386619444961872a926100f3fc Mon Sep 17 00:00:00 2001 From: frodan Date: Tue, 14 Mar 2023 00:16:56 +0530 Subject: [PATCH 8/8] update --- ...external-call-return-value-not-checked.sol | 99 +++++++++++-------- ...xternal-call-return-value-not-checked.yaml | 65 ++++++------ 2 files changed, 91 insertions(+), 73 deletions(-) diff --git a/solidity/external-call-return-value-not-checked.sol b/solidity/external-call-return-value-not-checked.sol index f55cc14..00aed84 100644 --- a/solidity/external-call-return-value-not-checked.sol +++ b/solidity/external-call-return-value-not-checked.sol @@ -1,81 +1,98 @@ pragma solidity ^0.8.17; contract Test { - bool flag; function setVars(address payable _contract, uint _num) public payable { - + // ok: external-call-return-value-not-checked (bool success, ) = _contract.delegatecall( abi.encodeWithSignature("setVars(uint256)", _num) ); require(success, "Error"); - + // ok: external-call-return-value-not-checked (bool success2, ) = _contract.staticcall( abi.encodeWithSignature("setVars(uint256)", _num) ); if (!success2) revert(); - // ok: external-call-return-value-not-checked - (bool success3, bytes memory data) = _contract.call( - abi.encodeWithSignature("setVars(uint256)", _num) - ); - if (success3){ - ok(); - } + // // ok: external-call-return-value-not-checked + // (bool success3, bytes memory data) = _contract.staticcall( + // abi.encodeWithSignature("setVars(uint256)", _num) + // ); + // if (success3 != 0) revert(); // ok: external-call-return-value-not-checked - (bool success4, ) = _contract.call( + (bool success4, bytes memory data) = _contract.call( abi.encodeWithSignature("setVars(uint256)", _num) ); - if (success4 && 1 == 1){ - ok(); + if (success4){ + revert(); } + // // ok: external-call-return-value-not-checked + // bool success5 = _contract.send(_num); + // if (success5 == 0) revert(); // ok: external-call-return-value-not-checked - (bool success5, ) = _contract.call( + (bool success6, ) = _contract.delegatecall( abi.encodeWithSignature("setVars(uint256)", _num) ); + require(success6 && 1 == 1, "Error"); - if (!success5 || 0 == 0){ - revert(); - } - + // ok: external-call-return-value-not-checked + (bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(IERC20.transfer.selector, to, value)); + if (!(success && (data.length == 0 || abi.decode(data, (bool))))) revert(RevertMsgExtractor.getRevertMsg(data)); + // ok: external-call-return-value-not-checked + (bool sendBackSuccess, ) = payable(msg.sender).call{value: address(this).balance}(''); + require(sendBackSuccess, 'Could not send remaining funds to the payer'); } - function setVars2(address payable _contract, uint _num) public payable { - // ruleid: external-call-return-value-not-checked - _contract.call{value: 1337}( - abi.encodeWithSignature("setVars(uint256)", _num) - ); + // function setVars2(address payable _contract, uint _num) public payable { + // // ruleid: external-call-return-value-not-checked + // _contract.call(abi.encodeWithSignature("setVars(uint256)", _num)); + // } + function setVars3(address payable _contract, uint _num) public payable { // ruleid: external-call-return-value-not-checked - _contract.call{gas: 1337}( - abi.encodeWithSignature("setVars(uint256)", _num) - ); - - // ruleid: external-call-return-value-not-checked - _contract.call{value: msg.value, gas: 5000}( + (bool success1, bytes memory data) = _contract.call( abi.encodeWithSignature("setVars(uint256)", _num) ); + } - // ruleid: external-call-return-value-not-checked - _contract.call{gas: 5000, value: msg.value}( - abi.encodeWithSignature("setVars(uint256)", _num) - ); + // function setVars4(address payable _contract, uint _num) public payable { + // // ruleid: external-call-return-value-not-checked + // bool success2 = _contract.send(1 ether); - // ruleid: external-call-return-value-not-checked + // } + + function setVars5() public payable{ + // ok: external-call-return-value-not-checked (bool success1, bytes memory data) = _contract.call( abi.encodeWithSignature("setVars(uint256)", _num) ); - - // ruleid: external-call-return-value-not-checked - bool success2 = _contract.send(1 ether); + return success1 && 1 == 1; } - - function ok() public{ - flag = true; + + function withdrawTaxBalance_() external nonReentrant onlyOwner { + (bool temp1, ) = payable(solidityDevWallet).call{ + value: (taxBalance * solidityDevShare) / SHAREDIVISOR + }(""); + (bool temp2, ) = payable(frontendDevWallet).call{ + value: (taxBalance * frontendDevShare) / SHAREDIVISOR + }(""); + (bool temp3, ) = payable(projectLeadWallet).call{ + value: (taxBalance * projectLeadShare) / SHAREDIVISOR + }(""); + (bool temp4, ) = payable(apeHarambeWallet).call{ + value: (taxBalance * apeHarambeShare) / SHAREDIVISOR + }(""); + + // ok: external-call-return-value-not-checked + (bool temp5, ) = payable(treasuryWallet).call{ + value: (taxBalance * treasuryShare) / SHAREDIVISOR + }(""); + assert(temp1 && temp2 && temp3 && temp4 && temp5); + taxBalance = 0; } -} \ No newline at end of file +} diff --git a/solidity/external-call-return-value-not-checked.yaml b/solidity/external-call-return-value-not-checked.yaml index f721f69..8df6798 100644 --- a/solidity/external-call-return-value-not-checked.yaml +++ b/solidity/external-call-return-value-not-checked.yaml @@ -6,60 +6,61 @@ rules: severity: WARNING metadata: references: - - "https://entethalliance.org/specs/ethtrust-sl/v1/#req-1-check-return" + - https://entethalliance.org/specs/ethtrust-sl/v1/#req-1-check-return tags: - ethtrust - external-call patterns: - - pattern-either: - - pattern: (bool $SUCC, ) = $ADDR.$METHOD(...); - - pattern: (bool $SUCC, ) = $ADDR.$METHOD{value:$VAL}(...); - - pattern: (bool $SUCC, ) = $ADDR.$METHOD{gas:$GAS}(...); - - pattern: (bool $SUCC, ) = $ADDR.$METHOD{value:$VAL, gas:$GAS}(...); - - pattern: (bool $SUCC, ) = $ADDR.$METHOD{gas:$GAS, value:$VAL}(...); - - pattern: (bool $SUCC, bytes memory $DATA) = $ADDR.$METHOD(...); - - pattern: (bool $SUCC, bytes memory $DATA) = $ADDR.$METHOD{value:$VAL}(...); - - pattern: (bool $SUCC, bytes memory $DATA) = $ADDR.$METHOD{gas:$GAS}(...); - - pattern: (bool $SUCC, bytes memory $DATA) = $ADDR.$METHOD{value:$VAL, gas:$GAS}(...); - - pattern: (bool $SUCC, bytes memory $DATA) = $ADDR.$METHOD{gas:$GAS, value:$VAL}(...); - - pattern: $ADDR.$METHOD(...); - - pattern: $ADDR.$METHOD{value:$VAL}(...); - - pattern: $ADDR.$METHOD{gas:$GAS}(...); - - pattern: $ADDR.$METHOD{value:$VAL, gas:$GAS}(...); - - pattern: $ADDR.$METHOD{gas:$GAS, value:$VAL}(...); + - pattern-either: + - pattern: (bool $SUCC, ) = $ADDR.$METHOD(...); + - pattern: (bool $SUCC, ) = $ADDR.$METHOD{value:$VAL}(...); + - pattern: (bool $SUCC, ) = $ADDR.$METHOD{gas:$GAS}(...); + - pattern: (bool $SUCC, ) = $ADDR.$METHOD{value:$VAL, gas:$GAS}(...); + - pattern: (bool $SUCC, ) = $ADDR.$METHOD{gas:$GAS, value:$VAL}(...); + - pattern: (bool $SUCC, bytes memory $DATA) = $ADDR.$METHOD(...); + - pattern: (bool $SUCC, bytes memory $DATA) = $ADDR.$METHOD{value:$VAL}(...); + - pattern: (bool $SUCC, bytes memory $DATA) = $ADDR.$METHOD{gas:$GAS}(...); + - pattern: (bool $SUCC, bytes memory $DATA) = $ADDR.$METHOD{value:$VAL, + gas:$GAS}(...); + - pattern: (bool $SUCC, bytes memory $DATA) = $ADDR.$METHOD{gas:$GAS, + value:$VAL}(...); + - pattern: $ADDR.$METHOD(...); + - pattern: $ADDR.$METHOD{value:$VAL}(...); + - pattern: $ADDR.$METHOD{gas:$GAS}(...); + - pattern: $ADDR.$METHOD{value:$VAL, gas:$GAS}(...); + - pattern: $ADDR.$METHOD{gas:$GAS, value:$VAL}(...); - metavariable-regex: metavariable: $METHOD - regex: ^(call|delegatecall|staticcall|send)$ + regex: ^(call|delegatecall|staticcall|send)$ - pattern-not-inside: | function $FUNC(...){ ... - require($SUCC, ...); + require(<... $SUCC ...>, ...); + ... } - pattern-not-inside: | function $FUNC(...){ ... - if (!$SUCC){ + if (<... $SUCC ...>){ ... } + ... } - pattern-not-inside: | function $FUNC(...){ ... - if ($SUCC && ...){ - ... - } - } + return <... $SUCC ...>; + } - pattern-not-inside: | function $FUNC(...){ ... - if ($SUCC){ - ... - } - } + $CHECK(..., $SUCC, ...); + ... + } - pattern-not-inside: | function $FUNC(...){ ... - if (!$SUCC || ...){ - ... - } - } \ No newline at end of file + assert(<... $SUCC ...>); + ... + } +