diff --git a/remix-analyzer/src/solidity-analyzer/modules/gasCosts.ts b/remix-analyzer/src/solidity-analyzer/modules/gasCosts.ts index 856176278d..96df272f75 100644 --- a/remix-analyzer/src/solidity-analyzer/modules/gasCosts.ts +++ b/remix-analyzer/src/solidity-analyzer/modules/gasCosts.ts @@ -1,8 +1,8 @@ import { default as category } from './categories' import { default as algorithm } from './algorithmCategories' -import { getFunctionDefinitionName, helpers, isVariableTurnedIntoGetter } from './staticAnalysisCommon' +import { getFunctionDefinitionName, helpers, isVariableTurnedIntoGetter, getSplittedTypeDesc } from './staticAnalysisCommon' import { ModuleAlgorithm, ModuleCategory, ReportObj, CompilationResult, CompiledContract, AnalyzerModule, - FunctionDefinitionAstNode, VariableDeclarationAstNode, CompiledContractObj } from './../../types' + FunctionDefinitionAstNode, VariableDeclarationAstNode } from './../../types' export default class gasCosts implements AnalyzerModule { name: string = `Gas costs: ` @@ -23,7 +23,7 @@ export default class gasCosts implements AnalyzerModule { let signature: string; if(node.nodeType === 'FunctionDefinition'){ const functionName: string = getFunctionDefinitionName(node) - signature = helpers.buildAbiSignature(functionName, this.getSplittedTypeDesc(node, compilationResults.contracts)) + signature = helpers.buildAbiSignature(functionName, getSplittedTypeDesc(node, compilationResults.contracts)) } else signature = node.name + '()' @@ -62,53 +62,6 @@ export default class gasCosts implements AnalyzerModule { return report } - // To create the method signature similar to contract.evm.gasEstimates.external object - // For address payable, return address - private getSplittedTypeDesc(node: FunctionDefinitionAstNode, contracts: CompiledContractObj): string[] { - return node.parameters.parameters.map((varNode, varIndex) => { - let finalTypeString; - const typeString = varNode.typeDescriptions.typeString - if(typeString.includes('struct')) { - const paramsCount = node.parameters.parameters.length - const fnName = node.name - for (const filename in contracts) { - for (const contractName in contracts[filename]) { - const methodABI = contracts[filename][contractName].abi - .find(e => e.name === fnName && e.inputs?.length && - e.inputs[varIndex]['type'].includes('tuple') && - e.inputs[varIndex]['internalType'] === typeString) - if(methodABI && methodABI.inputs) { - const inputs = methodABI.inputs[varIndex] - let typeStr = this.getTypeStringFromComponents(inputs['components']) - finalTypeString = typeStr + inputs['type'].replace('tuple', '') - } - } - } - } else - finalTypeString = typeString.split(' ')[0] - return finalTypeString - }) - } - - private getTypeStringFromComponents(components: any[]) { - let typeString = '(' - for(var i=0; i < components.length; i++) { - const param = components[i] - if(param.type.includes('tuple') && param.components && param.components.length > 0){ - typeString = typeString + this.getTypeStringFromComponents(param.components) - typeString = typeString + param.type.replace('tuple', '') - } - else - typeString = typeString + param.type - - if(i !== components.length - 1) - typeString = typeString + ',' - } - typeString = typeString + ')' - return typeString - } - - private checkMethodGas(contract: CompiledContract, methodSignature: string): Record | undefined { if(contract.evm && contract.evm.gasEstimates && contract.evm.gasEstimates.external) { if(methodSignature === '()') { diff --git a/remix-analyzer/src/solidity-analyzer/modules/staticAnalysisCommon.ts b/remix-analyzer/src/solidity-analyzer/modules/staticAnalysisCommon.ts index 21a5a824c8..fc13ea7710 100644 --- a/remix-analyzer/src/solidity-analyzer/modules/staticAnalysisCommon.ts +++ b/remix-analyzer/src/solidity-analyzer/modules/staticAnalysisCommon.ts @@ -3,7 +3,7 @@ import { FunctionDefinitionAstNode, ModifierDefinitionAstNode, ParameterListAstNode, ForStatementAstNode, WhileStatementAstNode, VariableDeclarationAstNode, ContractDefinitionAstNode, InheritanceSpecifierAstNode, MemberAccessAstNode, BinaryOperationAstNode, FunctionCallAstNode, ExpressionStatementAstNode, UnaryOperationAstNode, - IdentifierAstNode, IndexAccessAstNode, BlockAstNode, AssignmentAstNode, InlineAssemblyAstNode, IfStatementAstNode } from "types" + IdentifierAstNode, IndexAccessAstNode, BlockAstNode, AssignmentAstNode, InlineAssemblyAstNode, IfStatementAstNode, CompiledContractObj } from "types" import { util } from 'remix-lib' type SpecialObjDetail = { @@ -1077,6 +1077,52 @@ function buildAbiSignature (funName: string, paramTypes: any[]): string { return funName + '(' + util.concatWithSeperator(paramTypes, ',') + ')' } +// To create the method signature similar to contract.evm.gasEstimates.external object + // For address payable, return address + function getSplittedTypeDesc(node: FunctionDefinitionAstNode, contracts: CompiledContractObj): string[] { + return node.parameters.parameters.map((varNode, varIndex) => { + let finalTypeString; + const typeString = varNode.typeDescriptions.typeString + if(typeString.includes('struct')) { + const paramsCount = node.parameters.parameters.length + const fnName = node.name + for (const filename in contracts) { + for (const contractName in contracts[filename]) { + const methodABI = contracts[filename][contractName].abi + .find(e => e.name === fnName && e.inputs?.length && + e.inputs[varIndex]['type'].includes('tuple') && + e.inputs[varIndex]['internalType'] === typeString) + if(methodABI && methodABI.inputs) { + const inputs = methodABI.inputs[varIndex] + let typeStr = getTypeStringFromComponents(inputs['components']) + finalTypeString = typeStr + inputs['type'].replace('tuple', '') + } + } + } + } else + finalTypeString = typeString.split(' ')[0] + return finalTypeString + }) + } + + function getTypeStringFromComponents(components: any[]) { + let typeString = '(' + for(var i=0; i < components.length; i++) { + const param = components[i] + if(param.type.includes('tuple') && param.components && param.components.length > 0){ + typeString = typeString + getTypeStringFromComponents(param.components) + typeString = typeString + param.type.replace('tuple', '') + } + else + typeString = typeString + param.type + + if(i !== components.length - 1) + typeString = typeString + ',' + } + typeString = typeString + ')' + return typeString + } + const helpers = { expressionTypeDescription, nodeType, @@ -1112,6 +1158,7 @@ export { getFunctionOrModifierDefinitionParameterPart, getFunctionDefinitionReturnParameterPart, getUnAssignedTopLevelBinOps, + getSplittedTypeDesc, // #################### Complex Node Identification isDeleteOfDynamicArray,