Commit 30fb3d54 authored by aniket-engg's avatar aniket-engg

utils

parent 1ef62d1d
import { default as category } from './categories' import { default as category } from './categories'
import { default as algorithm } from './algorithmCategories' 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, import { ModuleAlgorithm, ModuleCategory, ReportObj, CompilationResult, CompiledContract, AnalyzerModule,
FunctionDefinitionAstNode, VariableDeclarationAstNode, CompiledContractObj } from './../../types' FunctionDefinitionAstNode, VariableDeclarationAstNode } from './../../types'
export default class gasCosts implements AnalyzerModule { export default class gasCosts implements AnalyzerModule {
name: string = `Gas costs: ` name: string = `Gas costs: `
...@@ -23,7 +23,7 @@ export default class gasCosts implements AnalyzerModule { ...@@ -23,7 +23,7 @@ export default class gasCosts implements AnalyzerModule {
let signature: string; let signature: string;
if(node.nodeType === 'FunctionDefinition'){ if(node.nodeType === 'FunctionDefinition'){
const functionName: string = getFunctionDefinitionName(node) const functionName: string = getFunctionDefinitionName(node)
signature = helpers.buildAbiSignature(functionName, this.getSplittedTypeDesc(node, compilationResults.contracts)) signature = helpers.buildAbiSignature(functionName, getSplittedTypeDesc(node, compilationResults.contracts))
} }
else else
signature = node.name + '()' signature = node.name + '()'
...@@ -62,53 +62,6 @@ export default class gasCosts implements AnalyzerModule { ...@@ -62,53 +62,6 @@ export default class gasCosts implements AnalyzerModule {
return report 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<string, any> | undefined { private checkMethodGas(contract: CompiledContract, methodSignature: string): Record<string, any> | undefined {
if(contract.evm && contract.evm.gasEstimates && contract.evm.gasEstimates.external) { if(contract.evm && contract.evm.gasEstimates && contract.evm.gasEstimates.external) {
if(methodSignature === '()') { if(methodSignature === '()') {
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
import { FunctionDefinitionAstNode, ModifierDefinitionAstNode, ParameterListAstNode, ForStatementAstNode, import { FunctionDefinitionAstNode, ModifierDefinitionAstNode, ParameterListAstNode, ForStatementAstNode,
WhileStatementAstNode, VariableDeclarationAstNode, ContractDefinitionAstNode, InheritanceSpecifierAstNode, WhileStatementAstNode, VariableDeclarationAstNode, ContractDefinitionAstNode, InheritanceSpecifierAstNode,
MemberAccessAstNode, BinaryOperationAstNode, FunctionCallAstNode, ExpressionStatementAstNode, UnaryOperationAstNode, 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' import { util } from 'remix-lib'
type SpecialObjDetail = { type SpecialObjDetail = {
...@@ -1077,6 +1077,52 @@ function buildAbiSignature (funName: string, paramTypes: any[]): string { ...@@ -1077,6 +1077,52 @@ function buildAbiSignature (funName: string, paramTypes: any[]): string {
return funName + '(' + util.concatWithSeperator(paramTypes, ',') + ')' 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 = { const helpers = {
expressionTypeDescription, expressionTypeDescription,
nodeType, nodeType,
...@@ -1112,6 +1158,7 @@ export { ...@@ -1112,6 +1158,7 @@ export {
getFunctionOrModifierDefinitionParameterPart, getFunctionOrModifierDefinitionParameterPart,
getFunctionDefinitionReturnParameterPart, getFunctionDefinitionReturnParameterPart,
getUnAssignedTopLevelBinOps, getUnAssignedTopLevelBinOps,
getSplittedTypeDesc,
// #################### Complex Node Identification // #################### Complex Node Identification
isDeleteOfDynamicArray, isDeleteOfDynamicArray,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment