@ -1,8 +1,8 @@
import { default as test } from "tape"
import * as common from '../../src/solidity-analyzer/modules/staticAnalysisCommon'
const { localCall , thisLocalCall , libCall , externalDirect , superLocal , assignment ,
inlineAssembly , unaryOperation , nowAst , doWhileLoopNode , stateVariableContractNode ,
functionDefinition , fullyQualifiedFunctionDefinition , selfdestruct , storageVariableNodes ,
const { localCall , thisLocalCall , libCall , externalDirect , superLocal , assignment , abiNamespaceCallNodes ,
inlineAssembly , unaryOperation , nowAst , blockTimestamp , stateVariableContractNode ,
functionDefinition , requireCall , selfdestruct , storageVariableNodes , dynamicDeleteUnaryOp ,
lowlevelCall , parameterFunction , parameterFunctionCall , inheritance , blockHashAccess , contractDefinition } = require ( './astBlocks' )
function escapeRegExp ( str ) {
@ -10,7 +10,7 @@ function escapeRegExp (str) {
}
test ( 'staticAnalysisCommon.helpers.buildFunctionSignature' , function ( t ) {
t . plan ( 9 )
t . plan ( 8 )
t . equal ( common . helpers . buildFunctionSignature ( [ common . basicTypes . UINT , common . basicTypes . ADDRESS ] , [ common . basicTypes . BOOL ] , false ) ,
'function (uint256,address) returns (bool)' ,
@ -33,19 +33,15 @@ test('staticAnalysisCommon.helpers.buildFunctionSignature', function (t) {
'one param and two return values with payable' )
t . equal ( common . lowLevelCallTypes . CALL . type ,
'function () payable returns (bool)' ,
'function (bytes memory ) payable returns (bool,bytes memory )' ,
'check fixed call type' )
t . equal ( common . lowLevelCallTypes . CALLCODE . type ,
'function () payable returns (bool)' ,
'check fixed callcode type' )
t . equal ( common . lowLevelCallTypes . SEND . type ,
'function (uint256) returns (bool)' ,
'check fixed send type' )
t . equal ( common . lowLevelCallTypes . DELEGATECALL . type ,
'function () returns (bool)' ,
'function (bytes memory ) returns (bool,bytes memory )' ,
'check fixed call type' )
} )
@ -59,8 +55,6 @@ test('staticAnalysisCommon.helpers.name', function (t) {
t . ok ( common . helpers . memName ( node , 'now' ) , 'should work for names' )
t . ok ( common . helpers . memName ( node2 , 'call' ) , 'should work for memberName' )
t . ok ( common . helpers . memName ( node2 , '.all' ) , 'regex should work' )
// lowlevelAccessersCommon(t, common.helpers.memName, node)
} )
test ( 'staticAnalysisCommon.helpers.operator' , function ( t ) {
@ -75,8 +69,6 @@ test('staticAnalysisCommon.helpers.operator', function (t) {
t . notOk ( common . helpers . operator ( node2 , escapedPPExact ) , 'should not work for +++' )
t . ok ( common . helpers . operator ( node , escapedPP ) , 'should work for ++' )
t . ok ( common . helpers . operator ( node2 , escapedPP ) , 'should work for +++' )
// lowlevelAccessersCommon(t, common.helpers.operator, node)
} )
test ( 'staticAnalysisCommon.helpers.nodeType' , function ( t ) {
@ -87,8 +79,6 @@ test('staticAnalysisCommon.helpers.nodeType', function (t) {
t . ok ( common . helpers . nodeType ( node , common . nodeTypes . IDENTIFIER ) , 'should work for identifier' )
t . ok ( common . helpers . nodeType ( node2 , common . nodeTypes . FUNCTIONCALL ) , 'should work for function call' )
t . ok ( common . helpers . nodeType ( node2 , '^F' ) , 'regex should work for function call' )
// lowlevelAccessersCommon(t, common.helpers.nodeType, node)
} )
test ( 'staticAnalysisCommon.helpers.expressionTypeDescription' , function ( t ) {
@ -126,53 +116,11 @@ test('staticAnalysisCommon.helpers.expressionTypeDescription', function (t) {
}
t . ok ( common . helpers . expressionTypeDescription ( node . expression , common . basicTypes . PAYABLE_ADDRESS ) , 'should work for ident' )
t . ok ( common . helpers . expressionTypeDescription ( node , escapeRegExp ( common . basicFunctionTypes [ 'CALL-v0.5' ] ) ) , 'should work for funcall' )
t . ok ( common . helpers . expressionTypeDescription ( node , escapeRegExp ( common . basicFunctionTypes . CALL ) ) , 'should work for funcall' )
t . ok ( common . helpers . expressionTypeDescription ( node , '^function \\(' ) , 'regex should work' )
// lowlevelAccessersCommon(t, common.helpers.expressionType, node)
} )
// // test('staticAnalysisCommon.helpers.nrOfChildren', function (t) {
// // t.plan(10)
// // const node = { name: 'Identifier', children: ['a', 'b'], attributes: { value: 'now', type: 'uint256' } }
// // const node2 = { name: 'FunctionCall', children: [], attributes: { member_name: 'call', type: 'function () payable returns (bool)' } }
// // const node3 = { name: 'FunctionCall', attributes: { member_name: 'call', type: 'function () payable returns (bool)' } }
// // t.ok(common.helpers.nrOfChildren(node, 2), 'should work for 2 children')
// // t.notOk(common.helpers.nrOfChildren(node, '1+2'), 'regex should not work')
// // t.ok(common.helpers.nrOfChildren(node2, 0), 'should work for 0 children')
// // t.ok(common.helpers.nrOfChildren(node3, 0), 'should work without children arr')
// // lowlevelAccessersCommon(t, common.helpers.nrOfChildren, node)
// // })
// // test('staticAnalysisCommon.helpers.minNrOfChildren', function (t) {
// // t.plan(13)
// // const node = { name: 'Identifier', children: ['a', 'b'], attributes: { value: 'now', type: 'uint256' } }
// // const node2 = { name: 'FunctionCall', children: [], attributes: { member_name: 'call', type: 'function () payable returns (bool)' } }
// // const node3 = { name: 'FunctionCall', attributes: { member_name: 'call', type: 'function () payable returns (bool)' } }
// // t.ok(common.helpers.minNrOfChildren(node, 2), 'should work for 2 children')
// // t.ok(common.helpers.minNrOfChildren(node, 1), 'should work for 1 children')
// // t.ok(common.helpers.minNrOfChildren(node, 0), 'should work for 0 children')
// // t.notOk(common.helpers.minNrOfChildren(node, 3), 'has less than 3 children')
// // t.notOk(common.helpers.minNrOfChildren(node, '1+2'), 'regex should not work')
// // t.ok(common.helpers.minNrOfChildren(node2, 0), 'should work for 0 children')
// // t.ok(common.helpers.minNrOfChildren(node3, 0), 'should work without children arr')
// // lowlevelAccessersCommon(t, common.helpers.minNrOfChildren, node)
// // })
// function lowlevelAccessersCommon (t, f, someNode) {
// t.ok(f(someNode), 'always ok if type is undefined')
// t.ok(f(someNode, undefined), 'always ok if name is undefined 2')
// t.notOk(f(null, undefined), 'false on no node')
// t.notOk(f(null, 'call'), 'false on no node')
// t.notOk(f(undefined, null), 'false on no node')
// t.notOk(f(), 'false on no params')
// }
// // #################### Trivial Getter Test
// #################### Trivial Getter Test
test ( 'staticAnalysisCommon.getType' , function ( t ) {
t . plan ( 2 )
@ -189,11 +137,11 @@ test('staticAnalysisCommon.getType', function (t) {
"typeString" : "uint256"
}
}
t . ok ( common . getType ( blockHashAccess ) === 'function (uint256) view returns ( bytes32) ' , 'gettype should work for different nodes' )
t . ok ( common . getType ( blockHashAccess ) === 'bytes32' , 'gettype should work for different nodes' )
t . ok ( common . getType ( node ) === 'uint256' , 'gettype should work for different nodes' )
} )
// // #################### Complex Getter Test
// #################### Complex Getter Test
test ( 'staticAnalysisCommon.getFunctionCallType' , function ( t ) {
t . plan ( 4 )
@ -426,113 +374,87 @@ test('staticAnalysisCommon.isNowAccess', function (t) {
t . ok ( common . isNowAccess ( nowAst ) , 'is now used should work' )
} )
// test('staticAnalysisCommon.isBlockTimestampAccess', function (t) {
// t.plan(3)
// const node = { name: 'MemberAccess', children: [{attributes: { value: 'block', type: 'block' }}], attributes: { value: 'timestamp', type: 'uint256' } }
// t.notOk(common.isThisLocalCall(node), 'is this.local_method() used should not work')
// t.ok(common.isBlockTimestampAccess(node), 'is block.timestamp used should work')
// t.notOk(common.isNowAccess(node), 'is now used should not work')
// })
// test('staticAnalysisCommon.isBlockBlockhashAccess', function (t) {
// t.plan(4)
// t.notOk(common.isThisLocalCall(blockHashAccess), 'is this.local_method() used should not work')
// t.notOk(common.isBlockTimestampAccess(blockHashAccess), 'is block.timestamp used should not work')
// t.ok(common.isBlockBlockHashAccess(blockHashAccess), 'blockhash should work') // todo:
// t.notOk(common.isNowAccess(blockHashAccess), 'is now used should not work')
// })
// test('staticAnalysisCommon.isThisLocalCall', function (t) {
// t.plan(3)
// t.ok(common.isThisLocalCall(thisLocalCall), 'is this.local_method() used should work')
// t.notOk(common.isBlockTimestampAccess(thisLocalCall), 'is block.timestamp used should not work')
// t.notOk(common.isNowAccess(thisLocalCall), 'is now used should not work')
// })
// test('staticAnalysisCommon.isSuperLocalCall', function (t) {
// t.plan(4)
// t.ok(common.isSuperLocalCall(superLocal), 'is super.local_method() used should work')
// t.notOk(common.isThisLocalCall(superLocal), 'is this.local_method() used should not work')
// t.notOk(common.isBlockTimestampAccess(superLocal), 'is block.timestamp used should not work')
// t.notOk(common.isNowAccess(superLocal), 'is now used should not work')
// })
// test('staticAnalysisCommon.isLibraryCall', function (t) {
// t.plan(5)
// t.ok(common.isLibraryCall(libCall), 'is lib call should not work')
// t.notOk(common.isSuperLocalCall(libCall), 'is super.local_method() used should not work')
// t.notOk(common.isThisLocalCall(libCall), 'is this.local_method() used should not work')
// t.notOk(common.isBlockTimestampAccess(libCall), 'is block.timestamp used should not work')
// t.notOk(common.isNowAccess(libCall), 'is now used should not work')
// })
// test('staticAnalysisCommon.isLocalCall', function (t) {
// t.plan(5)
// t.ok(common.isLocalCall(localCall), 'isLocalCall')
// t.notOk(common.isLowLevelCall(localCall), 'is not low level call')
// t.notOk(common.isExternalDirectCall(localCall), 'is not external direct call')
// t.notOk(common.isEffect(localCall), 'is not effect')
// t.notOk(common.isInteraction(localCall), 'is not interaction')
// })
// test('staticAnalysisCommon.isLowLevelCall', function (t) {
// t.plan(6)
// t.ok(common.isLowLevelSendInst(lowlevelCall.sendAst) && common.isLowLevelCall(lowlevelCall.sendAst), 'send is llc should work')
// t.ok(common.isLowLevelCallInst(lowlevelCall.callAst) && common.isLowLevelCall(lowlevelCall.callAst), 'call is llc should work')
// t.notOk(common.isLowLevelCallInst(lowlevelCall.callcodeAst), 'callcode is not call')
// t.ok(common.isLowLevelCallcodeInst(lowlevelCall.callcodeAst) && common.isLowLevelCall(lowlevelCall.callcodeAst), 'callcode is llc should work')
// t.notOk(common.isLowLevelCallcodeInst(lowlevelCall.callAst), 'call is not callcode')
// t.ok(common.isLowLevelDelegatecallInst(lowlevelCall.delegatecallAst) && common.isLowLevelCall(lowlevelCall.delegatecallAst), 'delegatecall is llc should work')
// })
// test('staticAnalysisCommon: Call of parameter function', function (t) {
// t.plan(7)
// t.ok(common.isLocalCall(parameterFunction), 'is not LocalCall')
// t.notOk(common.isThisLocalCall(parameterFunction), 'is not this local call')
// t.notOk(common.isSuperLocalCall(parameterFunction), 'is not super local call')
// t.notOk(common.isExternalDirectCall(parameterFunction), 'is not ExternalDirectCall')
// t.notOk(common.isLibraryCall(parameterFunction), 'is not LibraryCall')
// t.equals(common.getFunctionCallType(parameterFunction), 'function (uint256,uint256) pure returns (uint256)', 'Extracts right type')
// t.equals(common.getFunctionCallTypeParameterType(parameterFunction), 'uint256,uint256', 'Extracts param right type')
// })
// test('staticAnalysisCommon: function call with of function with function parameter', function (t) {
// t.plan(2)
// t.equals(common.getFunctionCallType(parameterFunctionCall), 'function (function (uint256,uint256) pure returns (uint256),uint256,uint256) pure returns (uint256)', 'Extracts right type')
// t.equals(common.getFunctionCallTypeParameterType(parameterFunctionCall), 'function (uint256,uint256) pure returns (uint256),uint256,uint256', 'Extracts param right type')
// })
// test('staticAnalysisCommon: require call', function (t) {
// t.plan(3)
// const node = {'attributes': {'argumentTypes': null, 'isConstant': false, 'isLValue': false, 'isPure': false, 'isStructConstructorCall': false, 'lValueRequested': false, 'names': [null], 'type': 'tuple()', 'type_conversion': false}, 'children': [{'attributes': {'argumentTypes': [{'typeIdentifier': 't_bool', 'typeString': 'bool'}, {'typeIdentifier': 't_stringliteral_80efd193f332877914d93edb0b3ef5c6a7eecd00c6251c3fd7f146b60b40e6cd', 'typeString': 'literal_string \'fuu\''}], 'overloadedDeclarations': [90, 91], 'referencedDeclaration': 91, 'type': 'function (bool,string memory) pure', 'value': 'require'}, 'id': 50, 'name': 'Identifier', 'src': '462:7:0'}, {'attributes': {'argumentTypes': null, 'commonType': {'typeIdentifier': 't_address', 'typeString': 'address'}, 'isConstant': false, 'isLValue': false, 'isPure': false, 'lValueRequested': false, 'operator': '==', 'type': 'bool'}, 'children': [{'attributes': {'argumentTypes': null, 'isConstant': false, 'isLValue': false, 'isPure': false, 'lValueRequested': false, 'member_name': 'sender', 'referencedDeclaration': null, 'type': 'address'}, 'children': [{'attributes': {'argumentTypes': null, 'overloadedDeclarations': [null], 'referencedDeclaration': 87, 'type': 'msg', 'value': 'msg'}, 'id': 51, 'name': 'Identifier', 'src': '470:3:0'}], 'id': 52, 'name': 'MemberAccess', 'src': '470:10:0'}, {'attributes': {'argumentTypes': null, 'overloadedDeclarations': [null], 'referencedDeclaration': 10, 'type': 'address', 'value': 'owner'}, 'id': 53, 'name': 'Identifier', 'src': '484:5:0'}], 'id': 54, 'name': 'BinaryOperation', 'src': '470:19:0'}, {'attributes': {'argumentTypes': null, 'hexvalue': '667575', 'isConstant': false, 'isLValue': false, 'isPure': true, 'lValueRequested': false, 'subdenomination': null, 'token': 'string', 'type': 'literal_string \'fuu\'', 'value': 'fuu'}, 'id': 55, 'name': 'Literal', 'src': '491:5:0'}], 'id': 56, 'name': 'FunctionCall', 'src': '462:35:0'}
// t.equals(common.isRequireCall(node), true)
// t.equals(common.getFunctionCallType(node), 'function (bool,string memory) pure', 'Extracts right type')
// t.equals(common.getFunctionCallTypeParameterType(node), 'bool,string memory', 'Extracts param right type')
// })
// test('staticAnalysisCommon: isDeleteOfDynamicArray', function (t) {
// t.plan(2)
// const node = {'attributes': {'argumentTypes': null, 'isConstant': false, 'isLValue': false, 'isPure': false, 'lValueRequested': false, 'operator': 'delete', 'prefix': true, 'type': 'tuple()'}, 'children': [{'attributes': {'argumentTypes': null, 'overloadedDeclarations': [null], 'referencedDeclaration': 4, 'type': 'uint256[] storage ref', 'value': 'users'}, 'id': 58, 'name': 'Identifier', 'src': '514:5:0'}], 'id': 59, 'name': 'UnaryOperation', 'src': '507:12:0'}
// t.equals(common.isDeleteOfDynamicArray(node), true)
// t.equals(common.isDynamicArrayAccess(node.children[0]), true, 'Extracts right type')
// })
// test('staticAnalysisCommon: isAbiNamespaceCall', function (t) {
// t.plan(8)
// const node1 = {'attributes': {'argumentTypes': null, 'isConstant': false, 'isLValue': false, 'isPure': false, 'isStructConstructorCall': false, 'lValueRequested': false, 'names': [null], 'type': 'bytes memory', 'type_conversion': false}, 'children': [{'attributes': {'argumentTypes': [{'typeIdentifier': 't_uint256', 'typeString': 'uint256'}, {'typeIdentifier': 't_uint256', 'typeString': 'uint256'}], 'isConstant': false, 'isLValue': false, 'isPure': false, 'lValueRequested': false, 'member_name': 'encode', 'referencedDeclaration': null, 'type': 'function () pure returns (bytes memory)'}, 'children': [{'attributes': {'argumentTypes': null, 'overloadedDeclarations': [null], 'referencedDeclaration': 64, 'type': 'abi', 'value': 'abi'}, 'id': 26, 'name': 'Identifier', 'src': '245: 3:0'}], 'id': 28, 'name': 'MemberAccess', 'src': '245:10:0'}, {'attributes': {'argumentTypes': null, 'overloadedDeclarations': [null], 'referencedDeclaration': 7, 'type': 'uint256', 'value': 'a'}, 'id': 29, 'name': 'Identifier', 'src': '256:1:0'}, {'attributes': {'argumentTypes': null, 'overloadedDeclarations': [null], 'referencedDeclaration': 15, 'type': 'uint256', 'value': 'b'}, 'id': 30, 'name': 'Identifier', 'src': '258:1:0'}], 'id': 31, 'name': 'FunctionCall', 'src': '245:15:0'}
// const node2 = {'attributes': {'argumentTypes': null, 'isConstant': false, 'isLValue': false, 'isPure': false, 'isStructConstructorCall': false, 'lValueRequested': false, 'names': [null], 'type': 'bytes memory', 'type_conversion': false}, 'children': [{'attributes': {'argumentTypes': [{'typeIdentifier': 't_uint256', 'typeString': 'uint256'}, {'typeIdentifier': 't_uint256', 'typeString': 'uint256'}], 'isConstant': false, 'isLValue': false, 'isPure': false, 'lValueRequested': false, 'member_name': 'encodePacked', 'referencedDeclaration': null, 'type': 'function () pure returns (bytes memory)'}, 'children': [{'attributes': {'argumentTypes': null, 'overloadedDeclarations': [null], 'referencedDeclaration': 64, 'type': 'abi', 'value': 'abi'}, 'id': 33, 'name': 'Identifier', 'src': '279:3:0'}], 'id': 35, 'name': 'MemberAccess', 'src': '279:16:0'}, {'attributes': {'argumentTypes': null, 'overloadedDeclarations': [null], 'referencedDeclaration': 7, 'type': 'uint256', 'value': 'a'}, 'id': 36, 'name': 'Identifier', 'src': '296:1:0'}, {'attributes': {'argumentTypes': null, 'overloadedDeclarations': [null], 'referencedDeclaration': 15, 'type': 'uint256', 'value': 'b'}, 'id': 37, 'name': 'Identifier', 'src': '298:1:0'}], 'id': 38, 'name': 'FunctionCall', 'src': '279:21:0'}
// const node3 = {'attributes': {'argumentTypes': null, 'isConstant': false, 'isLValue': false, 'isPure': false, 'isStructConstructorCall': false, 'lValueRequested': false, 'names': [null], 'type': 'bytes memory', 'type_conversion': false}, 'children': [{'attributes': {'argumentTypes': [{'typeIdentifier': 't_bytes4', 'typeString': 'bytes4'}, {'typeIdentifier': 't_uint256', 'typeString': 'uint256'}, {'typeIdentifier': 't_uint256', 'typeString': 'uint256'}], 'isConstant': false, 'isLValue': false, 'isPure': false, 'lValueRequested': false, 'member_name': 'encodeWithSelector', 'referencedDeclaration': null, 'type': 'function (bytes4) pure returns (bytes memory)'}, 'children': [{'attributes': {'argumentTypes': null, 'overloadedDeclarations': [null], 'referencedDeclaration': 64, 'type': 'abi', 'value': 'abi'}, 'id': 40, 'name': 'Identifier', 'src': '319:3:0'}], 'id': 42, 'name': 'MemberAccess', 'src': '319:22:0'}, {'attributes': {'argumentTypes': null, 'overloadedDeclarations': [null], 'referencedDeclaration': 19, 'type': 'bytes4', 'value': 'selector'}, 'id': 43, 'name': 'Identifier', 'src': '342:8:0'}, {'attributes': {'argumentTypes': null, 'overloadedDeclarations': [null], 'referencedDeclaration': 7, 'type': 'uint256', 'value': 'a'}, 'id': 44, 'name': 'Identifier', 'src': '352:1:0'}, {'attributes': {'argumentTypes': null, 'overloadedDeclarations': [null], 'referencedDeclaration': 15, 'type': 'uint256', 'value': 'b'}, 'id': 45, 'name': 'Identifier', 'src': '355:1:0'}], 'id': 46, 'name': 'FunctionCall', 'src': '319:38:0'}
// const node4 = {'attributes': {'argumentTypes': null, 'isConstant': false, 'isLValue': false, 'isPure': false, 'isStructConstructorCall': false, 'lValueRequested': false, 'names': [null], 'type': 'bytes memory', 'type_conversion': false}, 'children': [{'attributes': {'argumentTypes': [{'typeIdentifier': 't_string_memory_ptr', 'typeString': 'string memory'}, {'typeIdentifier': 't_uint256', 'typeString': 'uint256'}, {'typeIdentifier': 't_uint256', 'typeString': 'uint256'}], 'isConstant': false, 'isLValue': false, 'isPure': false, 'lValueRequested': false, 'member_name': 'encodeWithSignature', 'referencedDeclaration': null, 'type': 'function (string memory) pure returns (bytes memory)'}, 'children': [{'attributes': {'argumentTypes': null, 'overloadedDeclarations': [null], 'referencedDeclaration': 64, 'type': 'abi', 'value': 'abi'}, 'id': 48, 'name': 'Identifier', 'src': '367:3:0'}], 'id': 50, 'name': 'MemberAccess', 'src': '367:23:0'}, {'attributes': {'argumentTypes': null, 'overloadedDeclarations': [null], 'referencedDeclaration': 11, 'type': 'string memory', 'value': 'sig'}, 'id': 51, 'name': 'Identifier', 'src': '391:3:0'}, {'attributes': {'argumentTypes': null, 'overloadedDeclarations': [null], 'referencedDeclaration': 7, 'type': 'uint256', 'value': 'a'}, 'id': 52, 'name': 'Identifier', 'src': '396:1:0'}, {'attributes': {'argumentTypes': null, 'overloadedDeclarations': [null], 'referencedDeclaration': 15, 'type': 'uint256', 'value': 'b'}, 'id': 53, 'name': 'Identifier', 'src': '399:1:0'}], 'id': 54, 'name': 'FunctionCall', 'src': '367:34:0'}
// t.equals(common.isAbiNamespaceCall(node1), true, 'encode abi')
// t.equals(common.isAbiNamespaceCall(node2), true, 'encodePacked abi')
// t.equals(common.isAbiNamespaceCall(node3), true, 'encodeWithSelector abi')
// t.equals(common.isAbiNamespaceCall(node4), true, 'encodeWithSignature abi')
// t.equals(common.isBuiltinFunctionCall(node1), true, 'encode Builtin')
// t.equals(common.isBuiltinFunctionCall(node2), true, 'encodePacked Builtin')
// t.equals(common.isBuiltinFunctionCall(node3), true, 'encodeWithSelector Builtin')
// t.equals(common.isBuiltinFunctionCall(node4), true, 'encodeWithSignature Builtin')
// })
test ( 'staticAnalysisCommon.isBlockTimestampAccess' , function ( t ) {
t . plan ( 3 )
t . notOk ( common . isThisLocalCall ( blockTimestamp ) , 'is this.local_method() used should not work' )
t . ok ( common . isBlockTimestampAccess ( blockTimestamp ) , 'is block.timestamp used should work' )
t . notOk ( common . isNowAccess ( blockTimestamp ) , 'is now used should not work' )
} )
test ( 'staticAnalysisCommon.isBlockBlockhashAccess' , function ( t ) {
t . plan ( 2 )
t . ok ( common . isBlockBlockHashAccess ( blockHashAccess ) , 'blockhash should work' )
t . notOk ( common . isNowAccess ( blockHashAccess . expression ) , 'is now used should not work' )
} )
test ( 'staticAnalysisCommon.isThisLocalCall' , function ( t ) {
t . plan ( 2 )
t . ok ( common . isThisLocalCall ( thisLocalCall . expression ) , 'is this.local_method() used should work' )
t . notOk ( common . isBlockTimestampAccess ( thisLocalCall . expression ) , 'is block.timestamp used should not work' )
} )
test ( 'staticAnalysisCommon.isSuperLocalCall' , function ( t ) {
t . plan ( 3 )
t . ok ( common . isSuperLocalCall ( superLocal . expression ) , 'is super.local_method() used should work' )
t . notOk ( common . isThisLocalCall ( superLocal . expression ) , 'is this.local_method() used should not work' )
t . notOk ( common . isBlockTimestampAccess ( superLocal . expression ) , 'is block.timestamp used should not work' )
} )
test ( 'staticAnalysisCommon.isLibraryCall' , function ( t ) {
t . plan ( 4 )
t . ok ( common . isLibraryCall ( libCall . expression ) , 'is lib call should not work' )
t . notOk ( common . isSuperLocalCall ( libCall . expression ) , 'is super.local_method() used should not work' )
t . notOk ( common . isThisLocalCall ( libCall . expression ) , 'is this.local_method() used should not work' )
t . notOk ( common . isBlockTimestampAccess ( libCall . expression ) , 'is block.timestamp used should not work' )
} )
test ( 'staticAnalysisCommon.isLocalCall' , function ( t ) {
t . plan ( 1 )
t . ok ( common . isLocalCall ( localCall ) , 'isLocalCall' )
} )
test ( 'staticAnalysisCommon.isLowLevelCall' , function ( t ) {
t . plan ( 3 )
t . ok ( common . isLLSend ( lowlevelCall . sendAst ) && common . isLowLevelCall ( lowlevelCall . sendAst ) , 'send is llc should work' )
t . ok ( common . isLLCall ( lowlevelCall . callAst ) && common . isLowLevelCall ( lowlevelCall . callAst ) , 'call is llc should work' )
t . ok ( common . isLLDelegatecall ( lowlevelCall . delegatecallAst ) && common . isLowLevelCall ( lowlevelCall . delegatecallAst ) , 'delegatecall is llc should work' )
} )
test ( 'staticAnalysisCommon: Call of parameter function' , function ( t ) {
t . plan ( 3 )
t . ok ( common . isLocalCall ( parameterFunction ) , 'is not LocalCall' )
t . equals ( common . getFunctionCallType ( parameterFunction ) , 'function (uint256,uint256)' , 'Extracts right type' )
t . equals ( common . getFunctionCallTypeParameterType ( parameterFunction ) , 'uint256,uint256' , 'Extracts param right type' )
} )
test ( 'staticAnalysisCommon: function call with of function with function parameter' , function ( t ) {
t . plan ( 2 )
t . equals ( common . getFunctionCallType ( parameterFunctionCall ) , 'function (function (uint256) pure returns (uint256)) pure returns (uint256)' , 'Extracts right type' )
t . equals ( common . getFunctionCallTypeParameterType ( parameterFunctionCall ) , 'function (uint256) pure returns (uint256)' , 'Extracts param right type' )
} )
test ( 'staticAnalysisCommon: require call' , function ( t ) {
t . plan ( 3 )
t . equals ( common . isRequireCall ( requireCall ) , true )
t . equals ( common . getFunctionCallType ( requireCall ) , 'function (bool) pure' , 'Extracts right type' )
t . equals ( common . getFunctionCallTypeParameterType ( requireCall ) , 'bool' , 'Extracts param right type' )
} )
test ( 'staticAnalysisCommon: isDeleteOfDynamicArray' , function ( t ) {
t . plan ( 2 )
t . ok ( common . isDeleteOfDynamicArray ( dynamicDeleteUnaryOp ) , 'is dynamic array deletion' )
t . ok ( common . isDynamicArrayAccess ( dynamicDeleteUnaryOp . subExpression ) , 'Extracts right type' )
} )
test ( 'staticAnalysisCommon: isAbiNamespaceCall' , function ( t ) {
t . plan ( 8 )
t . equals ( common . isAbiNamespaceCall ( abiNamespaceCallNodes . encode ) , true , 'encode abi' )
t . equals ( common . isAbiNamespaceCall ( abiNamespaceCallNodes . encodePacked ) , true , 'encodePacked abi' )
t . equals ( common . isAbiNamespaceCall ( abiNamespaceCallNodes . encodeWithSelector ) , true , 'encodeWithSelector abi' )
t . equals ( common . isAbiNamespaceCall ( abiNamespaceCallNodes . encodeWithSignature ) , true , 'encodeWithSignature abi' )
t . equals ( common . isBuiltinFunctionCall ( abiNamespaceCallNodes . encode ) , true , 'encode Builtin' )
t . equals ( common . isBuiltinFunctionCall ( abiNamespaceCallNodes . encodePacked ) , true , 'encodePacked Builtin' )
t . equals ( common . isBuiltinFunctionCall ( abiNamespaceCallNodes . encodeWithSelector ) , true , 'encodeWithSelector Builtin' )
t . equals ( common . isBuiltinFunctionCall ( abiNamespaceCallNodes . encodeWithSignature ) , true , 'encodeWithSignature Builtin' )
} )