'use strict' import tape from 'tape' import { compile } from 'solc' import * as astHelper from '../../src/solidity-decoder/astHelper' import * as decodeInfo from '../../src/solidity-decoder/decodeInfo' import * as stateDecoder from '../../src/solidity-decoder/stateDecoder' const contracts = require('./contracts/miscContracts') const simplecontracts = require('./contracts/simpleContract') import { compilerInput } from '../helpers/compilerHelper' import * as util from '../../src/solidity-decoder/types/util' tape('solidity', function (t) { t.test('astHelper, decodeInfo', function (st) { let output = compile(compilerInput(contracts)) output = JSON.parse(output) let state: any = astHelper.extractStateDefinitions('test.sol:contractUint', output.sources, null) let states = astHelper.extractStatesDefinitions(output.sources, null) let stateDef = state.stateDefinitions let parsedType = decodeInfo.parseType(stateDef[0].typeDescriptions.typeString, states, 'contractUint', util.extractLocationFromAstVariable(stateDef[0])) checkDecodeInfo(st, parsedType, 1, 1, 'uint8') parsedType = decodeInfo.parseType(stateDef[1].typeDescriptions.typeString, states, 'contractUint', util.extractLocationFromAstVariable(stateDef[1])) checkDecodeInfo(st, parsedType, 1, 32, 'uint256') parsedType = decodeInfo.parseType(stateDef[2].typeDescriptions.typeString, states, 'contractUint', util.extractLocationFromAstVariable(stateDef[2])) checkDecodeInfo(st, parsedType, 1, 32, 'uint256') parsedType = decodeInfo.parseType(stateDef[3].typeDescriptions.typeString, states, 'contractUint', util.extractLocationFromAstVariable(stateDef[3])) checkDecodeInfo(st, parsedType, 1, 16, 'bytes16') state = astHelper.extractStateDefinitions('test.sol:contractStructAndArray', output.sources, null) stateDef = state.stateDefinitions parsedType = decodeInfo.parseType(stateDef[1].typeDescriptions.typeString, states, 'contractStructAndArray', util.extractLocationFromAstVariable(stateDef[1])) checkDecodeInfo(st, parsedType, 2, 32, 'struct contractStructAndArray.structDef') parsedType = decodeInfo.parseType(stateDef[2].typeDescriptions.typeString, states, 'contractStructAndArray', util.extractLocationFromAstVariable(stateDef[2])) checkDecodeInfo(st, parsedType, 6, 32, 'struct contractStructAndArray.structDef[3]') parsedType = decodeInfo.parseType(stateDef[3].typeDescriptions.typeString, states, 'contractStructAndArray', util.extractLocationFromAstVariable(stateDef[3])) checkDecodeInfo(st, parsedType, 2, 32, 'bytes12[4]') state = astHelper.extractStateDefinitions('test.sol:contractArray', output.sources, null) stateDef = state.stateDefinitions parsedType = decodeInfo.parseType(stateDef[0].typeDescriptions.typeString, states, 'contractArray', util.extractLocationFromAstVariable(stateDef[0])) checkDecodeInfo(st, parsedType, 1, 32, 'uint32[5]') parsedType = decodeInfo.parseType(stateDef[1].typeDescriptions.typeString, states, 'contractArray', util.extractLocationFromAstVariable(stateDef[1])) checkDecodeInfo(st, parsedType, 1, 32, 'int8[]') parsedType = decodeInfo.parseType(stateDef[2].typeDescriptions.typeString, states, 'contractArray', util.extractLocationFromAstVariable(stateDef[2])) checkDecodeInfo(st, parsedType, 4, 32, 'int16[][3][][4]') state = astHelper.extractStateDefinitions('test.sol:contractEnum', output.sources, null) stateDef = state.stateDefinitions parsedType = decodeInfo.parseType(stateDef[1].typeDescriptions.typeString, states, 'contractEnum', null) checkDecodeInfo(st, parsedType, 1, 2, 'enum') state = astHelper.extractStateDefinitions('test.sol:contractSmallVariable', output.sources, null) stateDef = state.stateDefinitions parsedType = decodeInfo.parseType(stateDef[0].typeDescriptions.typeString, states, 'contractSmallVariable', util.extractLocationFromAstVariable(stateDef[0])) checkDecodeInfo(st, parsedType, 1, 1, 'int8') parsedType = decodeInfo.parseType(stateDef[1].typeDescriptions.typeString, states, 'contractSmallVariable', util.extractLocationFromAstVariable(stateDef[1])) checkDecodeInfo(st, parsedType, 1, 1, 'uint8') parsedType = decodeInfo.parseType(stateDef[2].typeDescriptions.typeString, states, 'contractSmallVariable', util.extractLocationFromAstVariable(stateDef[2])) checkDecodeInfo(st, parsedType, 1, 2, 'uint16') parsedType = decodeInfo.parseType(stateDef[3].typeDescriptions.typeString, states, 'contractSmallVariable', util.extractLocationFromAstVariable(stateDef[3])) checkDecodeInfo(st, parsedType, 1, 4, 'int32') parsedType = decodeInfo.parseType(stateDef[4].typeDescriptions.typeString, states, 'contractSmallVariable', util.extractLocationFromAstVariable(stateDef[4])) checkDecodeInfo(st, parsedType, 1, 32, 'uint256') parsedType = decodeInfo.parseType(stateDef[5].typeDescriptions.typeString, states, 'contractSmallVariable', util.extractLocationFromAstVariable(stateDef[5])) checkDecodeInfo(st, parsedType, 1, 2, 'int16') output = compile(compilerInput(simplecontracts)) output = JSON.parse(output) state = astHelper.extractStateDefinitions('test.sol:simpleContract', output.sources, null) states = astHelper.extractStatesDefinitions(output.sources, null) stateDef = state.stateDefinitions parsedType = decodeInfo.parseType(stateDef[2].typeDescriptions.typeString, states, 'simpleContract', util.extractLocationFromAstVariable(stateDef[2])) checkDecodeInfo(st, parsedType, 2, 32, 'struct simpleContract.structDef') parsedType = decodeInfo.parseType(stateDef[3].typeDescriptions.typeString, states, 'simpleContract', util.extractLocationFromAstVariable(stateDef[3])) checkDecodeInfo(st, parsedType, 6, 32, 'struct simpleContract.structDef[3]') parsedType = decodeInfo.parseType(stateDef[4].typeDescriptions.typeString, states, 'simpleContract', util.extractLocationFromAstVariable(stateDef[4])) checkDecodeInfo(st, parsedType, 1, 1, 'enum') state = astHelper.extractStateDefinitions('test.sol:test2', output.sources, null) stateDef = state.stateDefinitions parsedType = decodeInfo.parseType(stateDef[0].typeDescriptions.typeString, states, 'test1', util.extractLocationFromAstVariable(stateDef[0])) checkDecodeInfo(st, parsedType, 1, 32, 'struct test1.str') state = stateDecoder.extractStateVariables('test.sol:test2', output.sources) checkDecodeInfo(st, parsedType, 1, 32, 'struct test1.str') st.end() }) }) function checkDecodeInfo (st, decodeInfo, storageSlots, storageBytes, typeName) { st.equal(decodeInfo.storageSlots, storageSlots) st.equal(decodeInfo.storageBytes, storageBytes) st.equal(decodeInfo.typeName, typeName) }