From 974575b695108dd70f4b165f6789f71c3647c2b1 Mon Sep 17 00:00:00 2001 From: Leonid Logvinov Date: Mon, 14 May 2018 20:01:18 +0200 Subject: Make sol-cov work with truffle and other artifact adapters --- packages/sol-cov/src/artifact_adapters/0x.ts | 41 +++++++++ packages/sol-cov/src/artifact_adapters/abstract.ts | 5 ++ packages/sol-cov/src/artifact_adapters/truffle.ts | 43 +++++++++ packages/sol-cov/src/collect_contract_data.ts | 31 ------- packages/sol-cov/src/coverage_manager.ts | 99 ++++++++++++-------- packages/sol-cov/src/coverage_subprovider.ts | 38 +++++--- packages/sol-cov/src/index.ts | 4 + packages/sol-cov/src/trace.ts | 100 +++++++++++++++++++++ 8 files changed, 281 insertions(+), 80 deletions(-) create mode 100644 packages/sol-cov/src/artifact_adapters/0x.ts create mode 100644 packages/sol-cov/src/artifact_adapters/abstract.ts create mode 100644 packages/sol-cov/src/artifact_adapters/truffle.ts delete mode 100644 packages/sol-cov/src/collect_contract_data.ts create mode 100644 packages/sol-cov/src/trace.ts (limited to 'packages/sol-cov/src') diff --git a/packages/sol-cov/src/artifact_adapters/0x.ts b/packages/sol-cov/src/artifact_adapters/0x.ts new file mode 100644 index 000000000..87d23b0aa --- /dev/null +++ b/packages/sol-cov/src/artifact_adapters/0x.ts @@ -0,0 +1,41 @@ +import * as fs from 'fs'; +import * as glob from 'glob'; +import * as _ from 'lodash'; +import * as path from 'path'; + +import { ContractData } from '../types'; + +import { AbstractArtifactAdapter } from './abstract'; + +export class ZeroExArtifactAdapter extends AbstractArtifactAdapter { + private _artifactsPath: string; + private _sourcesPath: string; + constructor(artifactsPath: string, sourcesPath: string) { + super(); + this._artifactsPath = artifactsPath; + this._sourcesPath = sourcesPath; + } + public async collectContractsDataAsync(): Promise { + const artifactsGlob = `${this._artifactsPath}/**/*.json`; + const artifactFileNames = glob.sync(artifactsGlob, { absolute: true }); + const contractsData: ContractData[] = []; + for (const artifactFileName of artifactFileNames) { + const artifact = JSON.parse(fs.readFileSync(artifactFileName).toString()); + let sources = _.keys(artifact.sources); + sources = _.map(sources, relativeFilePath => path.resolve(this._sourcesPath, relativeFilePath)); + const contractName = artifact.contractName; + // We don't compute coverage for dependencies + const sourceCodes = _.map(sources, (source: string) => fs.readFileSync(source).toString()); + const contractData = { + sourceCodes, + sources, + bytecode: artifact.compilerOutput.evm.bytecode.object, + sourceMap: artifact.compilerOutput.evm.bytecode.sourceMap, + runtimeBytecode: artifact.compilerOutput.evm.deployedBytecode.object, + sourceMapRuntime: artifact.compilerOutput.evm.deployedBytecode.sourceMap, + }; + contractsData.push(contractData); + } + return contractsData; + } +} diff --git a/packages/sol-cov/src/artifact_adapters/abstract.ts b/packages/sol-cov/src/artifact_adapters/abstract.ts new file mode 100644 index 000000000..fcc6562ad --- /dev/null +++ b/packages/sol-cov/src/artifact_adapters/abstract.ts @@ -0,0 +1,5 @@ +import { ContractData } from '../types'; + +export abstract class AbstractArtifactAdapter { + public abstract async collectContractsDataAsync(): Promise; +} diff --git a/packages/sol-cov/src/artifact_adapters/truffle.ts b/packages/sol-cov/src/artifact_adapters/truffle.ts new file mode 100644 index 000000000..e891bb464 --- /dev/null +++ b/packages/sol-cov/src/artifact_adapters/truffle.ts @@ -0,0 +1,43 @@ +import { Compiler, CompilerOptions } from '@0xproject/sol-compiler'; +import * as fs from 'fs'; +import * as glob from 'glob'; +import * as _ from 'lodash'; +import * as path from 'path'; +import * as rimraf from 'rimraf'; + +import { ContractData } from '../types'; + +import { ZeroExArtifactAdapter } from './0x'; +import { AbstractArtifactAdapter } from './abstract'; + +export class TruffleArtifactAdapter extends AbstractArtifactAdapter { + private _solcVersion: string; + private _sourcesPath: string; + constructor(sourcesPath: string, solcVersion: string) { + super(); + this._solcVersion = solcVersion; + this._sourcesPath = sourcesPath; + } + public async collectContractsDataAsync(): Promise { + const artifactsDir = '0x-artifacts'; + const compilerOptions: CompilerOptions = { + contractsDir: this._sourcesPath, + artifactsDir, + compilerSettings: { + outputSelection: { + ['*']: { + ['*']: ['abi', 'evm.bytecode.object', 'evm.deployedBytecode.object'], + }, + }, + }, + contracts: '*', + solcVersion: this._solcVersion, + }; + const compiler = new Compiler(compilerOptions); + await compiler.compileAsync(); + const zeroExArtifactAdapter = new ZeroExArtifactAdapter(artifactsDir, this._sourcesPath); + const contractsDataFrom0xArtifacts = await zeroExArtifactAdapter.collectContractsDataAsync(); + rimraf.sync(artifactsDir); + return contractsDataFrom0xArtifacts; + } +} diff --git a/packages/sol-cov/src/collect_contract_data.ts b/packages/sol-cov/src/collect_contract_data.ts deleted file mode 100644 index 2c2a12835..000000000 --- a/packages/sol-cov/src/collect_contract_data.ts +++ /dev/null @@ -1,31 +0,0 @@ -import * as fs from 'fs'; -import * as glob from 'glob'; -import * as _ from 'lodash'; -import * as path from 'path'; - -import { ContractData } from './types'; - -export const collectContractsData = (artifactsPath: string, sourcesPath: string) => { - const artifactsGlob = `${artifactsPath}/**/*.json`; - const artifactFileNames = glob.sync(artifactsGlob, { absolute: true }); - const contractsData: ContractData[] = []; - _.forEach(artifactFileNames, artifactFileName => { - const artifact = JSON.parse(fs.readFileSync(artifactFileName).toString()); - const sources = _.keys(artifact.sources); - const contractName = artifact.contractName; - // We don't compute coverage for dependencies - const sourceCodes = _.map(sources, (source: string) => - fs.readFileSync(path.join(sourcesPath, source)).toString(), - ); - const contractData = { - sourceCodes, - sources, - bytecode: artifact.compilerOutput.evm.bytecode.object, - sourceMap: artifact.compilerOutput.evm.bytecode.sourceMap, - runtimeBytecode: artifact.compilerOutput.evm.deployedBytecode.object, - sourceMapRuntime: artifact.compilerOutput.evm.deployedBytecode.sourceMap, - }; - contractsData.push(contractData); - }); - return contractsData; -}; diff --git a/packages/sol-cov/src/coverage_manager.ts b/packages/sol-cov/src/coverage_manager.ts index 800ca96dd..65a6086c0 100644 --- a/packages/sol-cov/src/coverage_manager.ts +++ b/packages/sol-cov/src/coverage_manager.ts @@ -6,7 +6,7 @@ import * as _ from 'lodash'; import * as mkdirp from 'mkdirp'; import * as path from 'path'; -import { collectContractsData } from './collect_contract_data'; +import { AbstractArtifactAdapter } from './artifact_adapters/abstract'; import { collectCoverageEntries } from './collect_coverage_entries'; import { constants } from './constants'; import { parseSourceMap } from './source_maps'; @@ -34,41 +34,23 @@ import { utils } from './utils'; const mkdirpAsync = promisify(mkdirp); export class CoverageManager { - private _sourcesPath: string; + private _artifactAdapter: AbstractArtifactAdapter; + private _verbose: boolean; private _traceInfos: TraceInfo[] = []; - private _contractsData: ContractData[] = []; private _getContractCodeAsync: (address: string) => Promise; - constructor( - artifactsPath: string, - sourcesPath: string, - getContractCodeAsync: (address: string) => Promise, - ) { - this._getContractCodeAsync = getContractCodeAsync; - this._sourcesPath = sourcesPath; - this._contractsData = collectContractsData(artifactsPath, this._sourcesPath); - } - public appendTraceInfo(traceInfo: TraceInfo): void { - this._traceInfos.push(traceInfo); - } - public async writeCoverageAsync(): Promise { - const finalCoverage = await this._computeCoverageAsync(); - const stringifiedCoverage = JSON.stringify(finalCoverage, null, '\t'); - await mkdirpAsync('coverage'); - fs.writeFileSync('coverage/coverage.json', stringifiedCoverage); - } - private _getSingleFileCoverageForTrace( + private static _getSingleFileCoverageForTrace( contractData: ContractData, coveredPcs: number[], pcToSourceRange: { [programCounter: number]: SourceRange }, fileIndex: number, ): Coverage { - const fileName = contractData.sources[fileIndex]; + const absoluteFileName = contractData.sources[fileIndex]; const coverageEntriesDescription = collectCoverageEntries(contractData.sourceCodes[fileIndex]); let sourceRanges = _.map(coveredPcs, coveredPc => pcToSourceRange[coveredPc]); sourceRanges = _.compact(sourceRanges); // Some PC's don't map to a source range and we just ignore them. // By default lodash does a shallow object comparasion. We JSON.stringify them and compare as strings. sourceRanges = _.uniqBy(sourceRanges, s => JSON.stringify(s)); // We don't care if one PC was covered multiple times within a single transaction - sourceRanges = _.filter(sourceRanges, sourceRange => sourceRange.fileName === fileName); + sourceRanges = _.filter(sourceRanges, sourceRange => sourceRange.fileName === absoluteFileName); const branchCoverage: BranchCoverage = {}; const branchIds = _.keys(coverageEntriesDescription.branchMap); for (const branchId of branchIds) { @@ -118,7 +100,6 @@ export class CoverageManager { ); statementCoverage[modifierStatementId] = isModifierCovered; } - const absoluteFileName = path.join(this._sourcesPath, fileName); const partialCoverage = { [absoluteFileName]: { ...coverageEntriesDescription, @@ -131,18 +112,53 @@ export class CoverageManager { }; return partialCoverage; } + constructor( + artifactAdapter: AbstractArtifactAdapter, + getContractCodeAsync: (address: string) => Promise, + verbose: boolean, + ) { + this._getContractCodeAsync = getContractCodeAsync; + this._artifactAdapter = artifactAdapter; + this._verbose = verbose; + } + public appendTraceInfo(traceInfo: TraceInfo): void { + // console.log(JSON.stringify(traceInfo, null, '\n')); + this._traceInfos.push(traceInfo); + } + public async writeCoverageAsync(): Promise { + const finalCoverage = await this._computeCoverageAsync(); + const stringifiedCoverage = JSON.stringify(finalCoverage, null, '\t'); + await mkdirpAsync('coverage'); + fs.writeFileSync('coverage/coverage.json', stringifiedCoverage); + } private async _computeCoverageAsync(): Promise { + const contractsData = await this._artifactAdapter.collectContractsDataAsync(); const collector = new Collector(); for (const traceInfo of this._traceInfos) { if (traceInfo.address !== constants.NEW_CONTRACT) { // Runtime transaction let runtimeBytecode = (traceInfo as TraceInfoExistingContract).runtimeBytecode; runtimeBytecode = addHexPrefix(runtimeBytecode); - const contractData = _.find(this._contractsData, { runtimeBytecode }) as ContractData; + const contractData = _.find(contractsData, contractDataCandidate => { + // Library linking placeholder: __ConvertLib____________________________ + let runtimeBytecodeRegex = contractDataCandidate.runtimeBytecode.replace(/_.*_/, '.*'); + // Last 86 characters is solidity compiler metadata that's different between compilations + runtimeBytecodeRegex = runtimeBytecodeRegex.replace(/.{86}$/, ''); + // Libraries contain their own address at the beginning of the code and it's impossible to know it in advance + runtimeBytecodeRegex = runtimeBytecodeRegex.replace( + /^0x730000000000000000000000000000000000000000/, + '0x73........................................', + ); + return !_.isNull(runtimeBytecode.match(runtimeBytecodeRegex)); + }) as ContractData; if (_.isUndefined(contractData)) { - throw new Error(`Transaction to an unknown address: ${traceInfo.address}`); + if (this._verbose) { + // tslint:disable-next-line:no-console + console.warn(`Transaction to an unknown address: ${traceInfo.address}`); + } + continue; } - const bytecodeHex = contractData.runtimeBytecode.slice(2); + const bytecodeHex = runtimeBytecode.slice(2); const sourceMap = contractData.sourceMapRuntime; const pcToSourceRange = parseSourceMap( contractData.sourceCodes, @@ -151,7 +167,7 @@ export class CoverageManager { contractData.sources, ); for (let fileIndex = 0; fileIndex < contractData.sources.length; fileIndex++) { - const singleFileCoverageForTrace = this._getSingleFileCoverageForTrace( + const singleFileCoverageForTrace = CoverageManager._getSingleFileCoverageForTrace( contractData, traceInfo.coveredPcs, pcToSourceRange, @@ -163,13 +179,26 @@ export class CoverageManager { // Contract creation transaction let bytecode = (traceInfo as TraceInfoNewContract).bytecode; bytecode = addHexPrefix(bytecode); - const contractData = _.find(this._contractsData, contractDataCandidate => - bytecode.startsWith(contractDataCandidate.bytecode), - ) as ContractData; + const contractData = _.find(contractsData, contractDataCandidate => { + // Library linking placeholder: __ConvertLib____________________________ + let bytecodeRegex = contractDataCandidate.bytecode.replace(/_.*_/, '.*'); + // Last 86 characters is solidity compiler metadata that's different between compilations + bytecodeRegex = bytecodeRegex.replace(/.{86}$/, ''); + // Libraries contain their own address at the beginning of the code and it's impossible to know it in advance + bytecodeRegex = bytecodeRegex.replace( + /^0x730000000000000000000000000000000000000000/, + '0x73........................................', + ); + return !_.isNull(bytecode.match(bytecodeRegex)); + }) as ContractData; if (_.isUndefined(contractData)) { - throw new Error(`Unknown contract creation transaction`); + if (this._verbose) { + // tslint:disable-next-line:no-console + console.warn(`Unknown contract creation transaction`); + } + continue; } - const bytecodeHex = contractData.bytecode.slice(2); + const bytecodeHex = bytecode.slice(2); const sourceMap = contractData.sourceMap; const pcToSourceRange = parseSourceMap( contractData.sourceCodes, @@ -178,7 +207,7 @@ export class CoverageManager { contractData.sources, ); for (let fileIndex = 0; fileIndex < contractData.sources.length; fileIndex++) { - const singleFileCoverageForTrace = this._getSingleFileCoverageForTrace( + const singleFileCoverageForTrace = CoverageManager._getSingleFileCoverageForTrace( contractData, traceInfo.coveredPcs, pcToSourceRange, diff --git a/packages/sol-cov/src/coverage_subprovider.ts b/packages/sol-cov/src/coverage_subprovider.ts index 08efeaa24..f421a17fd 100644 --- a/packages/sol-cov/src/coverage_subprovider.ts +++ b/packages/sol-cov/src/coverage_subprovider.ts @@ -1,10 +1,13 @@ import { Callback, ErrorCallback, NextCallback, Subprovider } from '@0xproject/subproviders'; import { BlockParam, CallData, JSONRPCRequestPayload, TransactionTrace, TxData } from '@0xproject/types'; +import * as fs from 'fs'; import * as _ from 'lodash'; import { Lock } from 'semaphore-async-await'; +import { AbstractArtifactAdapter } from './artifact_adapters/abstract'; import { constants } from './constants'; import { CoverageManager } from './coverage_manager'; +import { getTracesByContractAddress } from './trace'; import { TraceInfoExistingContract, TraceInfoNewContract } from './types'; interface MaybeFakeTxData extends TxData { @@ -26,15 +29,15 @@ export class CoverageSubprovider extends Subprovider { private _defaultFromAddress: string; /** * Instantiates a CoverageSubprovider instance - * @param artifactsPath Path to the smart contract artifacts - * @param sourcesPath Path to the smart contract source files + * @param artifactAdapter Adapter for used artifacts format (0x, truffle, giveth, etc.) * @param defaultFromAddress default from address to use when sending transactions + * @param verbose If true, we will log any unknown transactions. Otherwise we will ignore them */ - constructor(artifactsPath: string, sourcesPath: string, defaultFromAddress: string) { + constructor(artifactAdapter: AbstractArtifactAdapter, defaultFromAddress: string, verbose: boolean = true) { super(); this._lock = new Lock(); this._defaultFromAddress = defaultFromAddress; - this._coverageManager = new CoverageManager(artifactsPath, sourcesPath, this._getContractCodeAsync.bind(this)); + this._coverageManager = new CoverageManager(artifactAdapter, this._getContractCodeAsync.bind(this), verbose); } /** * Write the test coverage results to a file in Istanbul format. @@ -119,8 +122,10 @@ export class CoverageSubprovider extends Subprovider { }; const jsonRPCResponsePayload = await this.emitPayloadAsync(payload); const trace: TransactionTrace = jsonRPCResponsePayload.result; - const coveredPcs = _.map(trace.structLogs, log => log.pc); if (address === constants.NEW_CONTRACT) { + // TODO handle calls to external contracts and contract creations from within the constructor + const structLogsOnDepth0 = _.filter(trace.structLogs, { depth: 0 }); + const coveredPcs = _.map(structLogsOnDepth0, log => log.pc); const traceInfo: TraceInfoNewContract = { coveredPcs, txHash, @@ -129,15 +134,20 @@ export class CoverageSubprovider extends Subprovider { }; this._coverageManager.appendTraceInfo(traceInfo); } else { - payload = { method: 'eth_getCode', params: [address, 'latest'] }; - const runtimeBytecode = (await this.emitPayloadAsync(payload)).result; - const traceInfo: TraceInfoExistingContract = { - coveredPcs, - txHash, - address, - runtimeBytecode, - }; - this._coverageManager.appendTraceInfo(traceInfo); + const tracesByContractAddress = getTracesByContractAddress(trace.structLogs, address); + for (const subcallAddress of _.keys(tracesByContractAddress)) { + payload = { method: 'eth_getCode', params: [subcallAddress, 'latest'] }; + const runtimeBytecode = (await this.emitPayloadAsync(payload)).result; + const traceForThatSubcall = tracesByContractAddress[subcallAddress]; + const coveredPcs = _.map(traceForThatSubcall, log => log.pc); + const traceInfo: TraceInfoExistingContract = { + coveredPcs, + txHash, + address: subcallAddress, + runtimeBytecode, + }; + this._coverageManager.appendTraceInfo(traceInfo); + } } } private async _recordCallTraceAsync(callData: Partial, blockNumber: BlockParam): Promise { diff --git a/packages/sol-cov/src/index.ts b/packages/sol-cov/src/index.ts index e5c5e5be3..18031372b 100644 --- a/packages/sol-cov/src/index.ts +++ b/packages/sol-cov/src/index.ts @@ -1 +1,5 @@ export { CoverageSubprovider } from './coverage_subprovider'; +export { ZeroExArtifactAdapter } from './artifact_adapters/0x'; +export { TruffleArtifactAdapter } from './artifact_adapters/truffle'; +export { AbstractArtifactAdapter } from './artifact_adapters/abstract'; +export { ContractData } from './types'; diff --git a/packages/sol-cov/src/trace.ts b/packages/sol-cov/src/trace.ts new file mode 100644 index 000000000..6bc28989d --- /dev/null +++ b/packages/sol-cov/src/trace.ts @@ -0,0 +1,100 @@ +import { StructLog, TransactionTrace } from '@0xproject/types'; +import { BigNumber } from '@0xproject/utils'; +import { addHexPrefix, stripHexPrefix } from 'ethereumjs-util'; +import * as fs from 'fs'; +import * as _ from 'lodash'; + +export interface TraceByContractAddress { + [contractAddress: string]: StructLog[]; +} +function padZeros(address: string) { + return addHexPrefix(_.padStart(stripHexPrefix(address), 40, '0')); +} + +export function getTracesByContractAddress(structLogs: StructLog[], startAddress: string): TraceByContractAddress { + const traceByContractAddress: TraceByContractAddress = {}; + let currentTraceSegment = []; + const callStack = [startAddress]; + // tslint:disable-next-line: prefer-for-of + for (let i = 0; i < structLogs.length; ++i) { + const structLog = structLogs[i]; + if (structLog.depth !== callStack.length - 1) { + throw new Error("Malformed trace. trace depth doesn't match call stack depth"); + } + // After that check we have a guarantee that call stack is never empty + // If it would: callStack.length - 1 === structLog.depth === -1 + // That means that we can always safely pop from it + currentTraceSegment.push(structLog); + + if (structLog.op === 'DELEGATECALL') { + const currentAddress = _.last(callStack) as string; + const jumpAddressOffset = 4; + const newAddress = padZeros(new BigNumber(addHexPrefix(structLog.stack[jumpAddressOffset])).toString(16)); + callStack.push(newAddress); + traceByContractAddress[currentAddress] = (traceByContractAddress[currentAddress] || []).concat( + currentTraceSegment, + ); + currentTraceSegment = []; + } else if (structLog.op === 'RETURN') { + const currentAddress = callStack.pop() as string; + traceByContractAddress[currentAddress] = (traceByContractAddress[currentAddress] || []).concat( + currentTraceSegment, + ); + currentTraceSegment = []; + } else if (structLog.op === 'STOP') { + const currentAddress = callStack.pop() as string; + traceByContractAddress[currentAddress] = (traceByContractAddress[currentAddress] || []).concat( + currentTraceSegment, + ); + currentTraceSegment = []; + if (i !== structLogs.length - 1) { + throw new Error('Malformed trace. STOP is not the last opcode executed'); + } + } else if (structLog.op === 'CREATE') { + console.warn( + "Detected a contract created from within another contract. Sol-cov currently doesn't support that scenario. We'll just skip that trace", + ); + return traceByContractAddress; + } else if (structLog.op === 'CALL') { + const currentAddress = _.last(callStack) as string; + const jumpAddressOffset = 2; + const newAddress = padZeros(new BigNumber(addHexPrefix(structLog.stack[jumpAddressOffset])).toString(16)); + callStack.push(newAddress); + traceByContractAddress[currentAddress] = (traceByContractAddress[currentAddress] || []).concat( + currentTraceSegment, + ); + currentTraceSegment = []; + } else if (structLog.op === 'CALLCODE') { + throw new Error('CALLCODE opcode unsupported by coverage'); + } else if (structLog.op === 'STATICCALL') { + throw new Error('STATICCALL opcode unsupported by coverage'); + } else if (structLog.op === 'REVERT') { + const currentAddress = callStack.pop() as string; + traceByContractAddress[currentAddress] = (traceByContractAddress[currentAddress] || []).concat( + currentTraceSegment, + ); + currentTraceSegment = []; + if (i !== structLogs.length - 1) { + throw new Error('Malformed trace. REVERT is not the last opcode executed'); + } + } else if (structLog.op === 'INVALID') { + const currentAddress = callStack.pop() as string; + traceByContractAddress[currentAddress] = (traceByContractAddress[currentAddress] || []).concat( + currentTraceSegment, + ); + currentTraceSegment = []; + if (i !== structLogs.length - 1) { + throw new Error('Malformed trace. INVALID is not the last opcode executed'); + } + } else if (structLog.op === 'SELFDESTRUCT') { + throw new Error('SELFDESTRUCT opcode unsupported by coverage'); + } + } + if (callStack.length !== 0) { + throw new Error('Malformed trace. Call stack non empty at the end'); + } + if (currentTraceSegment.length !== 0) { + throw new Error('Malformed trace. currentTraceSegment non empty at the end'); + } + return traceByContractAddress; +} -- cgit v1.2.3 From 427a29145d90070e8c67753e7f76c7b88322eefb Mon Sep 17 00:00:00 2001 From: Leonid Logvinov Date: Tue, 15 May 2018 11:13:01 +0200 Subject: Support all opcodes in a trace parser --- packages/sol-cov/src/trace.ts | 72 +++++++++++++++---------------------------- 1 file changed, 24 insertions(+), 48 deletions(-) (limited to 'packages/sol-cov/src') diff --git a/packages/sol-cov/src/trace.ts b/packages/sol-cov/src/trace.ts index 6bc28989d..febb1034e 100644 --- a/packages/sol-cov/src/trace.ts +++ b/packages/sol-cov/src/trace.ts @@ -1,5 +1,5 @@ -import { StructLog, TransactionTrace } from '@0xproject/types'; -import { BigNumber } from '@0xproject/utils'; +import { OpCode, StructLog, TransactionTrace } from '@0xproject/types'; +import { BigNumber, logUtils } from '@0xproject/utils'; import { addHexPrefix, stripHexPrefix } from 'ethereumjs-util'; import * as fs from 'fs'; import * as _ from 'lodash'; @@ -26,68 +26,44 @@ export function getTracesByContractAddress(structLogs: StructLog[], startAddress // That means that we can always safely pop from it currentTraceSegment.push(structLog); - if (structLog.op === 'DELEGATECALL') { + if ( + structLog.op === OpCode.CallCode || + structLog.op === OpCode.StaticCall || + structLog.op === OpCode.Call || + structLog.op === OpCode.DelegateCall + ) { const currentAddress = _.last(callStack) as string; - const jumpAddressOffset = 4; + const jumpAddressOffset = structLog.op === OpCode.DelegateCall ? 4 : 2; const newAddress = padZeros(new BigNumber(addHexPrefix(structLog.stack[jumpAddressOffset])).toString(16)); callStack.push(newAddress); traceByContractAddress[currentAddress] = (traceByContractAddress[currentAddress] || []).concat( currentTraceSegment, ); currentTraceSegment = []; - } else if (structLog.op === 'RETURN') { + } else if ( + structLog.op === OpCode.Return || + structLog.op === OpCode.Stop || + structLog.op === OpCode.Revert || + structLog.op === OpCode.Invalid || + structLog.op === OpCode.SelfDestruct + ) { const currentAddress = callStack.pop() as string; traceByContractAddress[currentAddress] = (traceByContractAddress[currentAddress] || []).concat( currentTraceSegment, ); currentTraceSegment = []; - } else if (structLog.op === 'STOP') { - const currentAddress = callStack.pop() as string; - traceByContractAddress[currentAddress] = (traceByContractAddress[currentAddress] || []).concat( - currentTraceSegment, - ); - currentTraceSegment = []; - if (i !== structLogs.length - 1) { - throw new Error('Malformed trace. STOP is not the last opcode executed'); + if (structLog.op === OpCode.SelfDestruct) { + // TODO: Record contract bytecode before the selfdestruct and handle that scenario + logUtils.warn( + "Detected a selfdestruct. Sol-cov currently doesn't support that scenario. We'll just skip the trace part for a destructed contract", + ); } - } else if (structLog.op === 'CREATE') { - console.warn( + } else if (structLog.op === OpCode.Create) { + // TODO: Extract the new contract address from the stack and handle that scenario + logUtils.warn( "Detected a contract created from within another contract. Sol-cov currently doesn't support that scenario. We'll just skip that trace", ); return traceByContractAddress; - } else if (structLog.op === 'CALL') { - const currentAddress = _.last(callStack) as string; - const jumpAddressOffset = 2; - const newAddress = padZeros(new BigNumber(addHexPrefix(structLog.stack[jumpAddressOffset])).toString(16)); - callStack.push(newAddress); - traceByContractAddress[currentAddress] = (traceByContractAddress[currentAddress] || []).concat( - currentTraceSegment, - ); - currentTraceSegment = []; - } else if (structLog.op === 'CALLCODE') { - throw new Error('CALLCODE opcode unsupported by coverage'); - } else if (structLog.op === 'STATICCALL') { - throw new Error('STATICCALL opcode unsupported by coverage'); - } else if (structLog.op === 'REVERT') { - const currentAddress = callStack.pop() as string; - traceByContractAddress[currentAddress] = (traceByContractAddress[currentAddress] || []).concat( - currentTraceSegment, - ); - currentTraceSegment = []; - if (i !== structLogs.length - 1) { - throw new Error('Malformed trace. REVERT is not the last opcode executed'); - } - } else if (structLog.op === 'INVALID') { - const currentAddress = callStack.pop() as string; - traceByContractAddress[currentAddress] = (traceByContractAddress[currentAddress] || []).concat( - currentTraceSegment, - ); - currentTraceSegment = []; - if (i !== structLogs.length - 1) { - throw new Error('Malformed trace. INVALID is not the last opcode executed'); - } - } else if (structLog.op === 'SELFDESTRUCT') { - throw new Error('SELFDESTRUCT opcode unsupported by coverage'); } } if (callStack.length !== 0) { -- cgit v1.2.3 From 1ff34bd0f4084d2f9dfd6f07447bb63684ac51ac Mon Sep 17 00:00:00 2001 From: Leonid Logvinov Date: Tue, 15 May 2018 15:14:36 +0200 Subject: Remove web3Factory.create and remove dev-tools dependency on sol-cov --- packages/sol-cov/src/coverage_subprovider.ts | 2 +- packages/sol-cov/src/trace.json | 3227 ++++++++++++++++++++++++++ packages/sol-cov/src/trace.ts | 2 +- 3 files changed, 3229 insertions(+), 2 deletions(-) create mode 100644 packages/sol-cov/src/trace.json (limited to 'packages/sol-cov/src') diff --git a/packages/sol-cov/src/coverage_subprovider.ts b/packages/sol-cov/src/coverage_subprovider.ts index f421a17fd..addad5e8f 100644 --- a/packages/sol-cov/src/coverage_subprovider.ts +++ b/packages/sol-cov/src/coverage_subprovider.ts @@ -118,7 +118,7 @@ export class CoverageSubprovider extends Subprovider { private async _recordTxTraceAsync(address: string, data: string | undefined, txHash: string): Promise { let payload = { method: 'debug_traceTransaction', - params: [txHash, { disableMemory: true, disableStack: true, disableStorage: true }], // TODO For now testrpc just ignores those parameters https://github.com/trufflesuite/ganache-cli/issues/489 + params: [txHash, { disableMemory: true, disableStack: false, disableStorage: true }], }; const jsonRPCResponsePayload = await this.emitPayloadAsync(payload); const trace: TransactionTrace = jsonRPCResponsePayload.result; diff --git a/packages/sol-cov/src/trace.json b/packages/sol-cov/src/trace.json new file mode 100644 index 000000000..77ec20a72 --- /dev/null +++ b/packages/sol-cov/src/trace.json @@ -0,0 +1,3227 @@ +[ + { + "depth": 0, + "error": "", + "gas": 21216, + "gasCost": 21784, + "memory": null, + "op": "PUSH1", + "pc": 0, + "stack": [], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 21213, + "gasCost": 3, + "memory": null, + "op": "PUSH1", + "pc": 2, + "stack": ["0000000000000000000000000000000000000000000000000000000000000080"], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 21210, + "gasCost": 3, + "memory": null, + "op": "MSTORE", + "pc": 4, + "stack": [ + "0000000000000000000000000000000000000000000000000000000000000080", + "0000000000000000000000000000000000000000000000000000000000000040" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 21198, + "gasCost": 12, + "memory": null, + "op": "PUSH1", + "pc": 5, + "stack": [], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 21195, + "gasCost": 3, + "memory": null, + "op": "CALLDATASIZE", + "pc": 7, + "stack": ["0000000000000000000000000000000000000000000000000000000000000004"], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 21193, + "gasCost": 2, + "memory": null, + "op": "LT", + "pc": 8, + "stack": [ + "0000000000000000000000000000000000000000000000000000000000000004", + "0000000000000000000000000000000000000000000000000000000000000024" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 21190, + "gasCost": 3, + "memory": null, + "op": "PUSH2", + "pc": 9, + "stack": ["0000000000000000000000000000000000000000000000000000000000000000"], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 21187, + "gasCost": 3, + "memory": null, + "op": "JUMPI", + "pc": 12, + "stack": [ + "0000000000000000000000000000000000000000000000000000000000000000", + "00000000000000000000000000000000000000000000000000000000000000af" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 21177, + "gasCost": 10, + "memory": null, + "op": "PUSH1", + "pc": 13, + "stack": [], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 21174, + "gasCost": 3, + "memory": null, + "op": "CALLDATALOAD", + "pc": 15, + "stack": ["0000000000000000000000000000000000000000000000000000000000000000"], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 21171, + "gasCost": 3, + "memory": null, + "op": "PUSH29", + "pc": 16, + "stack": ["2e1a7d4d0000000000000000000000000000000000000000000000000de0b6b3"], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 21168, + "gasCost": 3, + "memory": null, + "op": "SWAP1", + "pc": 46, + "stack": [ + "2e1a7d4d0000000000000000000000000000000000000000000000000de0b6b3", + "0000000100000000000000000000000000000000000000000000000000000000" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 21165, + "gasCost": 3, + "memory": null, + "op": "DIV", + "pc": 47, + "stack": [ + "0000000100000000000000000000000000000000000000000000000000000000", + "2e1a7d4d0000000000000000000000000000000000000000000000000de0b6b3" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 21160, + "gasCost": 5, + "memory": null, + "op": "PUSH4", + "pc": 48, + "stack": ["000000000000000000000000000000000000000000000000000000002e1a7d4d"], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 21157, + "gasCost": 3, + "memory": null, + "op": "AND", + "pc": 53, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "00000000000000000000000000000000000000000000000000000000ffffffff" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 21154, + "gasCost": 3, + "memory": null, + "op": "DUP1", + "pc": 54, + "stack": ["000000000000000000000000000000000000000000000000000000002e1a7d4d"], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 21151, + "gasCost": 3, + "memory": null, + "op": "PUSH4", + "pc": 55, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "000000000000000000000000000000000000000000000000000000002e1a7d4d" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 21148, + "gasCost": 3, + "memory": null, + "op": "EQ", + "pc": 60, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000006fdde03" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 21145, + "gasCost": 3, + "memory": null, + "op": "PUSH2", + "pc": 61, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000000" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 21142, + "gasCost": 3, + "memory": null, + "op": "JUMPI", + "pc": 64, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000000", + "00000000000000000000000000000000000000000000000000000000000000b9" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 21132, + "gasCost": 10, + "memory": null, + "op": "DUP1", + "pc": 65, + "stack": ["000000000000000000000000000000000000000000000000000000002e1a7d4d"], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 21129, + "gasCost": 3, + "memory": null, + "op": "PUSH4", + "pc": 66, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "000000000000000000000000000000000000000000000000000000002e1a7d4d" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 21126, + "gasCost": 3, + "memory": null, + "op": "EQ", + "pc": 71, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "00000000000000000000000000000000000000000000000000000000095ea7b3" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 21123, + "gasCost": 3, + "memory": null, + "op": "PUSH2", + "pc": 72, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000000" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 21120, + "gasCost": 3, + "memory": null, + "op": "JUMPI", + "pc": 75, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000000000000000000000000000000000000000149" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 21110, + "gasCost": 10, + "memory": null, + "op": "DUP1", + "pc": 76, + "stack": ["000000000000000000000000000000000000000000000000000000002e1a7d4d"], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 21107, + "gasCost": 3, + "memory": null, + "op": "PUSH4", + "pc": 77, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "000000000000000000000000000000000000000000000000000000002e1a7d4d" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 21104, + "gasCost": 3, + "memory": null, + "op": "EQ", + "pc": 82, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000018160ddd" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 21101, + "gasCost": 3, + "memory": null, + "op": "PUSH2", + "pc": 83, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000000" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 21098, + "gasCost": 3, + "memory": null, + "op": "JUMPI", + "pc": 86, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000000", + "00000000000000000000000000000000000000000000000000000000000001ae" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 21088, + "gasCost": 10, + "memory": null, + "op": "DUP1", + "pc": 87, + "stack": ["000000000000000000000000000000000000000000000000000000002e1a7d4d"], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 21085, + "gasCost": 3, + "memory": null, + "op": "PUSH4", + "pc": 88, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "000000000000000000000000000000000000000000000000000000002e1a7d4d" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 21082, + "gasCost": 3, + "memory": null, + "op": "EQ", + "pc": 93, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000023b872dd" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 21079, + "gasCost": 3, + "memory": null, + "op": "PUSH2", + "pc": 94, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000000" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 21076, + "gasCost": 3, + "memory": null, + "op": "JUMPI", + "pc": 97, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000000", + "00000000000000000000000000000000000000000000000000000000000001d9" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 21066, + "gasCost": 10, + "memory": null, + "op": "DUP1", + "pc": 98, + "stack": ["000000000000000000000000000000000000000000000000000000002e1a7d4d"], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 21063, + "gasCost": 3, + "memory": null, + "op": "PUSH4", + "pc": 99, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "000000000000000000000000000000000000000000000000000000002e1a7d4d" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 21060, + "gasCost": 3, + "memory": null, + "op": "EQ", + "pc": 104, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "000000000000000000000000000000000000000000000000000000002e1a7d4d" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 21057, + "gasCost": 3, + "memory": null, + "op": "PUSH2", + "pc": 105, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000001" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 21054, + "gasCost": 3, + "memory": null, + "op": "JUMPI", + "pc": 108, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000001", + "000000000000000000000000000000000000000000000000000000000000025e" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 21044, + "gasCost": 10, + "memory": null, + "op": "JUMPDEST", + "pc": 606, + "stack": ["000000000000000000000000000000000000000000000000000000002e1a7d4d"], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 21043, + "gasCost": 1, + "memory": null, + "op": "CALLVALUE", + "pc": 607, + "stack": ["000000000000000000000000000000000000000000000000000000002e1a7d4d"], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 21041, + "gasCost": 2, + "memory": null, + "op": "DUP1", + "pc": 608, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000000" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 21038, + "gasCost": 3, + "memory": null, + "op": "ISZERO", + "pc": 609, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000000000000000000000000000000000000000000" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 21035, + "gasCost": 3, + "memory": null, + "op": "PUSH2", + "pc": 610, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000000000000000000000000000000000000000001" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 21032, + "gasCost": 3, + "memory": null, + "op": "JUMPI", + "pc": 613, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000000000000000000000000000000000000000001", + "000000000000000000000000000000000000000000000000000000000000026a" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 21022, + "gasCost": 10, + "memory": null, + "op": "JUMPDEST", + "pc": 618, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000000" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 21021, + "gasCost": 1, + "memory": null, + "op": "POP", + "pc": 619, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000000" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 21019, + "gasCost": 2, + "memory": null, + "op": "PUSH2", + "pc": 620, + "stack": ["000000000000000000000000000000000000000000000000000000002e1a7d4d"], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 21016, + "gasCost": 3, + "memory": null, + "op": "PUSH1", + "pc": 623, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 21013, + "gasCost": 3, + "memory": null, + "op": "DUP1", + "pc": 625, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289", + "0000000000000000000000000000000000000000000000000000000000000004" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 21010, + "gasCost": 3, + "memory": null, + "op": "CALLDATASIZE", + "pc": 626, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289", + "0000000000000000000000000000000000000000000000000000000000000004", + "0000000000000000000000000000000000000000000000000000000000000004" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 21008, + "gasCost": 2, + "memory": null, + "op": "SUB", + "pc": 627, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289", + "0000000000000000000000000000000000000000000000000000000000000004", + "0000000000000000000000000000000000000000000000000000000000000004", + "0000000000000000000000000000000000000000000000000000000000000024" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 21005, + "gasCost": 3, + "memory": null, + "op": "DUP2", + "pc": 628, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289", + "0000000000000000000000000000000000000000000000000000000000000004", + "0000000000000000000000000000000000000000000000000000000000000020" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 21002, + "gasCost": 3, + "memory": null, + "op": "ADD", + "pc": 629, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289", + "0000000000000000000000000000000000000000000000000000000000000004", + "0000000000000000000000000000000000000000000000000000000000000020", + "0000000000000000000000000000000000000000000000000000000000000004" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 20999, + "gasCost": 3, + "memory": null, + "op": "SWAP1", + "pc": 630, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289", + "0000000000000000000000000000000000000000000000000000000000000004", + "0000000000000000000000000000000000000000000000000000000000000024" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 20996, + "gasCost": 3, + "memory": null, + "op": "DUP1", + "pc": 631, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289", + "0000000000000000000000000000000000000000000000000000000000000024", + "0000000000000000000000000000000000000000000000000000000000000004" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 20993, + "gasCost": 3, + "memory": null, + "op": "DUP1", + "pc": 632, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289", + "0000000000000000000000000000000000000000000000000000000000000024", + "0000000000000000000000000000000000000000000000000000000000000004", + "0000000000000000000000000000000000000000000000000000000000000004" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 20990, + "gasCost": 3, + "memory": null, + "op": "CALLDATALOAD", + "pc": 633, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289", + "0000000000000000000000000000000000000000000000000000000000000024", + "0000000000000000000000000000000000000000000000000000000000000004", + "0000000000000000000000000000000000000000000000000000000000000004", + "0000000000000000000000000000000000000000000000000000000000000004" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 20987, + "gasCost": 3, + "memory": null, + "op": "SWAP1", + "pc": 634, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289", + "0000000000000000000000000000000000000000000000000000000000000024", + "0000000000000000000000000000000000000000000000000000000000000004", + "0000000000000000000000000000000000000000000000000000000000000004", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 20984, + "gasCost": 3, + "memory": null, + "op": "PUSH1", + "pc": 635, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289", + "0000000000000000000000000000000000000000000000000000000000000024", + "0000000000000000000000000000000000000000000000000000000000000004", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000000000000000000000000000000000000000000004" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 20981, + "gasCost": 3, + "memory": null, + "op": "ADD", + "pc": 637, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289", + "0000000000000000000000000000000000000000000000000000000000000024", + "0000000000000000000000000000000000000000000000000000000000000004", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000000000000000000000000000000000000000000004", + "0000000000000000000000000000000000000000000000000000000000000020" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 20978, + "gasCost": 3, + "memory": null, + "op": "SWAP1", + "pc": 638, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289", + "0000000000000000000000000000000000000000000000000000000000000024", + "0000000000000000000000000000000000000000000000000000000000000004", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000000000000000000000000000000000000000000024" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 20975, + "gasCost": 3, + "memory": null, + "op": "SWAP3", + "pc": 639, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289", + "0000000000000000000000000000000000000000000000000000000000000024", + "0000000000000000000000000000000000000000000000000000000000000004", + "0000000000000000000000000000000000000000000000000000000000000024", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 20972, + "gasCost": 3, + "memory": null, + "op": "SWAP2", + "pc": 640, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000000000000000000000000000000000000000000004", + "0000000000000000000000000000000000000000000000000000000000000024", + "0000000000000000000000000000000000000000000000000000000000000024" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 20969, + "gasCost": 3, + "memory": null, + "op": "SWAP1", + "pc": 641, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000000000000000000000000000000000000000000024", + "0000000000000000000000000000000000000000000000000000000000000024", + "0000000000000000000000000000000000000000000000000000000000000004" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 20966, + "gasCost": 3, + "memory": null, + "op": "POP", + "pc": 642, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000000000000000000000000000000000000000000024", + "0000000000000000000000000000000000000000000000000000000000000004", + "0000000000000000000000000000000000000000000000000000000000000024" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 20964, + "gasCost": 2, + "memory": null, + "op": "POP", + "pc": 643, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000000000000000000000000000000000000000000024", + "0000000000000000000000000000000000000000000000000000000000000004" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 20962, + "gasCost": 2, + "memory": null, + "op": "POP", + "pc": 644, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000000000000000000000000000000000000000000024" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 20960, + "gasCost": 2, + "memory": null, + "op": "PUSH2", + "pc": 645, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 20957, + "gasCost": 3, + "memory": null, + "op": "JUMP", + "pc": 648, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000000000000000000000000000000000000000000a22" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 20949, + "gasCost": 8, + "memory": null, + "op": "JUMPDEST", + "pc": 2594, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 20948, + "gasCost": 1, + "memory": null, + "op": "DUP1", + "pc": 2595, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 20945, + "gasCost": 3, + "memory": null, + "op": "PUSH1", + "pc": 2596, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 20942, + "gasCost": 3, + "memory": null, + "op": "PUSH1", + "pc": 2598, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000000000000000000000000000000000000000000003" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 20939, + "gasCost": 3, + "memory": null, + "op": "CALLER", + "pc": 2600, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000000000000000000000000000000000000000000003", + "0000000000000000000000000000000000000000000000000000000000000000" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 20937, + "gasCost": 2, + "memory": null, + "op": "PUSH20", + "pc": 2601, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000000000000000000000000000000000000000000003", + "0000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000005409ed021d9299bf6814279a6a1411a7e866a631" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 20934, + "gasCost": 3, + "memory": null, + "op": "AND", + "pc": 2622, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000000000000000000000000000000000000000000003", + "0000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000005409ed021d9299bf6814279a6a1411a7e866a631", + "000000000000000000000000ffffffffffffffffffffffffffffffffffffffff" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 20931, + "gasCost": 3, + "memory": null, + "op": "PUSH20", + "pc": 2623, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000000000000000000000000000000000000000000003", + "0000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000005409ed021d9299bf6814279a6a1411a7e866a631" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 20928, + "gasCost": 3, + "memory": null, + "op": "AND", + "pc": 2644, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000000000000000000000000000000000000000000003", + "0000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000005409ed021d9299bf6814279a6a1411a7e866a631", + "000000000000000000000000ffffffffffffffffffffffffffffffffffffffff" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 20925, + "gasCost": 3, + "memory": null, + "op": "DUP2", + "pc": 2645, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000000000000000000000000000000000000000000003", + "0000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000005409ed021d9299bf6814279a6a1411a7e866a631" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 20922, + "gasCost": 3, + "memory": null, + "op": "MSTORE", + "pc": 2646, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000000000000000000000000000000000000000000003", + "0000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000005409ed021d9299bf6814279a6a1411a7e866a631", + "0000000000000000000000000000000000000000000000000000000000000000" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 20919, + "gasCost": 3, + "memory": null, + "op": "PUSH1", + "pc": 2647, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000000000000000000000000000000000000000000003", + "0000000000000000000000000000000000000000000000000000000000000000" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 20916, + "gasCost": 3, + "memory": null, + "op": "ADD", + "pc": 2649, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000000000000000000000000000000000000000000003", + "0000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000000000000000000000000000000000000000020" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 20913, + "gasCost": 3, + "memory": null, + "op": "SWAP1", + "pc": 2650, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000000000000000000000000000000000000000000003", + "0000000000000000000000000000000000000000000000000000000000000020" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 20910, + "gasCost": 3, + "memory": null, + "op": "DUP2", + "pc": 2651, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000000000000000000000000000000000000000000020", + "0000000000000000000000000000000000000000000000000000000000000003" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 20907, + "gasCost": 3, + "memory": null, + "op": "MSTORE", + "pc": 2652, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000000000000000000000000000000000000000000020", + "0000000000000000000000000000000000000000000000000000000000000003", + "0000000000000000000000000000000000000000000000000000000000000020" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 20904, + "gasCost": 3, + "memory": null, + "op": "PUSH1", + "pc": 2653, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000000000000000000000000000000000000000000020" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 20901, + "gasCost": 3, + "memory": null, + "op": "ADD", + "pc": 2655, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000000000000000000000000000000000000000000020", + "0000000000000000000000000000000000000000000000000000000000000020" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 20898, + "gasCost": 3, + "memory": null, + "op": "PUSH1", + "pc": 2656, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000000000000000000000000000000000000000000040" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 20895, + "gasCost": 3, + "memory": null, + "op": "SHA3", + "pc": 2658, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000000000000000000000000000000000000000000040", + "0000000000000000000000000000000000000000000000000000000000000000" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 20853, + "gasCost": 42, + "memory": null, + "op": "SLOAD", + "pc": 2659, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "e8af3d9c3f2014e95dfc13b23432f282fb88d28d9985b050581f714c3cecb355" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 20653, + "gasCost": 200, + "memory": null, + "op": "LT", + "pc": 2660, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 20650, + "gasCost": 3, + "memory": null, + "op": "ISZERO", + "pc": 2661, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000000000000000000000000000000000000000000000" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 20647, + "gasCost": 3, + "memory": null, + "op": "ISZERO", + "pc": 2662, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000000000000000000000000000000000000000000001" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 20644, + "gasCost": 3, + "memory": null, + "op": "ISZERO", + "pc": 2663, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000000000000000000000000000000000000000000000" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 20641, + "gasCost": 3, + "memory": null, + "op": "PUSH2", + "pc": 2664, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000000000000000000000000000000000000000000001" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 20638, + "gasCost": 3, + "memory": null, + "op": "JUMPI", + "pc": 2667, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000000000000000000000000000000000000000000001", + "0000000000000000000000000000000000000000000000000000000000000a70" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 20628, + "gasCost": 10, + "memory": null, + "op": "JUMPDEST", + "pc": 2672, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 20627, + "gasCost": 1, + "memory": null, + "op": "DUP1", + "pc": 2673, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 20624, + "gasCost": 3, + "memory": null, + "op": "PUSH1", + "pc": 2674, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 20621, + "gasCost": 3, + "memory": null, + "op": "PUSH1", + "pc": 2676, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000000000000000000000000000000000000000000003" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 20618, + "gasCost": 3, + "memory": null, + "op": "CALLER", + "pc": 2678, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000000000000000000000000000000000000000000003", + "0000000000000000000000000000000000000000000000000000000000000000" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 20616, + "gasCost": 2, + "memory": null, + "op": "PUSH20", + "pc": 2679, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000000000000000000000000000000000000000000003", + "0000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000005409ed021d9299bf6814279a6a1411a7e866a631" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 20613, + "gasCost": 3, + "memory": null, + "op": "AND", + "pc": 2700, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000000000000000000000000000000000000000000003", + "0000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000005409ed021d9299bf6814279a6a1411a7e866a631", + "000000000000000000000000ffffffffffffffffffffffffffffffffffffffff" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 20610, + "gasCost": 3, + "memory": null, + "op": "PUSH20", + "pc": 2701, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000000000000000000000000000000000000000000003", + "0000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000005409ed021d9299bf6814279a6a1411a7e866a631" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 20607, + "gasCost": 3, + "memory": null, + "op": "AND", + "pc": 2722, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000000000000000000000000000000000000000000003", + "0000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000005409ed021d9299bf6814279a6a1411a7e866a631", + "000000000000000000000000ffffffffffffffffffffffffffffffffffffffff" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 20604, + "gasCost": 3, + "memory": null, + "op": "DUP2", + "pc": 2723, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000000000000000000000000000000000000000000003", + "0000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000005409ed021d9299bf6814279a6a1411a7e866a631" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 20601, + "gasCost": 3, + "memory": null, + "op": "MSTORE", + "pc": 2724, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000000000000000000000000000000000000000000003", + "0000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000005409ed021d9299bf6814279a6a1411a7e866a631", + "0000000000000000000000000000000000000000000000000000000000000000" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 20598, + "gasCost": 3, + "memory": null, + "op": "PUSH1", + "pc": 2725, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000000000000000000000000000000000000000000003", + "0000000000000000000000000000000000000000000000000000000000000000" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 20595, + "gasCost": 3, + "memory": null, + "op": "ADD", + "pc": 2727, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000000000000000000000000000000000000000000003", + "0000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000000000000000000000000000000000000000020" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 20592, + "gasCost": 3, + "memory": null, + "op": "SWAP1", + "pc": 2728, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000000000000000000000000000000000000000000003", + "0000000000000000000000000000000000000000000000000000000000000020" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 20589, + "gasCost": 3, + "memory": null, + "op": "DUP2", + "pc": 2729, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000000000000000000000000000000000000000000020", + "0000000000000000000000000000000000000000000000000000000000000003" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 20586, + "gasCost": 3, + "memory": null, + "op": "MSTORE", + "pc": 2730, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000000000000000000000000000000000000000000020", + "0000000000000000000000000000000000000000000000000000000000000003", + "0000000000000000000000000000000000000000000000000000000000000020" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 20583, + "gasCost": 3, + "memory": null, + "op": "PUSH1", + "pc": 2731, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000000000000000000000000000000000000000000020" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 20580, + "gasCost": 3, + "memory": null, + "op": "ADD", + "pc": 2733, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000000000000000000000000000000000000000000020", + "0000000000000000000000000000000000000000000000000000000000000020" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 20577, + "gasCost": 3, + "memory": null, + "op": "PUSH1", + "pc": 2734, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000000000000000000000000000000000000000000040" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 20574, + "gasCost": 3, + "memory": null, + "op": "SHA3", + "pc": 2736, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000000000000000000000000000000000000000000040", + "0000000000000000000000000000000000000000000000000000000000000000" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 20532, + "gasCost": 42, + "memory": null, + "op": "PUSH1", + "pc": 2737, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "e8af3d9c3f2014e95dfc13b23432f282fb88d28d9985b050581f714c3cecb355" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 20529, + "gasCost": 3, + "memory": null, + "op": "DUP3", + "pc": 2739, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "e8af3d9c3f2014e95dfc13b23432f282fb88d28d9985b050581f714c3cecb355", + "0000000000000000000000000000000000000000000000000000000000000000" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 20526, + "gasCost": 3, + "memory": null, + "op": "DUP3", + "pc": 2740, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "e8af3d9c3f2014e95dfc13b23432f282fb88d28d9985b050581f714c3cecb355", + "0000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 20523, + "gasCost": 3, + "memory": null, + "op": "SLOAD", + "pc": 2741, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "e8af3d9c3f2014e95dfc13b23432f282fb88d28d9985b050581f714c3cecb355", + "0000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "e8af3d9c3f2014e95dfc13b23432f282fb88d28d9985b050581f714c3cecb355" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 20323, + "gasCost": 200, + "memory": null, + "op": "SUB", + "pc": 2742, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "e8af3d9c3f2014e95dfc13b23432f282fb88d28d9985b050581f714c3cecb355", + "0000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 20320, + "gasCost": 3, + "memory": null, + "op": "SWAP3", + "pc": 2743, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "e8af3d9c3f2014e95dfc13b23432f282fb88d28d9985b050581f714c3cecb355", + "0000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000000000000000000000000000000000000000000" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 20317, + "gasCost": 3, + "memory": null, + "op": "POP", + "pc": 2744, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000000000000000000000000000000000000000000000", + "e8af3d9c3f2014e95dfc13b23432f282fb88d28d9985b050581f714c3cecb355", + "0000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 20315, + "gasCost": 2, + "memory": null, + "op": "POP", + "pc": 2745, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000000000000000000000000000000000000000000000", + "e8af3d9c3f2014e95dfc13b23432f282fb88d28d9985b050581f714c3cecb355", + "0000000000000000000000000000000000000000000000000000000000000000" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 20313, + "gasCost": 2, + "memory": null, + "op": "DUP2", + "pc": 2746, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000000000000000000000000000000000000000000000", + "e8af3d9c3f2014e95dfc13b23432f282fb88d28d9985b050581f714c3cecb355" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 20310, + "gasCost": 3, + "memory": null, + "op": "SWAP1", + "pc": 2747, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000000000000000000000000000000000000000000000", + "e8af3d9c3f2014e95dfc13b23432f282fb88d28d9985b050581f714c3cecb355", + "0000000000000000000000000000000000000000000000000000000000000000" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 20307, + "gasCost": 3, + "memory": null, + "op": "SSTORE", + "pc": 2748, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000000000000000000000000000000000000000000", + "e8af3d9c3f2014e95dfc13b23432f282fb88d28d9985b050581f714c3cecb355" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 15307, + "gasCost": 5000, + "memory": null, + "op": "POP", + "pc": 2749, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000000000000000000000000000000000000000000000" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 15305, + "gasCost": 2, + "memory": null, + "op": "CALLER", + "pc": 2750, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 15303, + "gasCost": 2, + "memory": null, + "op": "PUSH20", + "pc": 2751, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000005409ed021d9299bf6814279a6a1411a7e866a631" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 15300, + "gasCost": 3, + "memory": null, + "op": "AND", + "pc": 2772, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000005409ed021d9299bf6814279a6a1411a7e866a631", + "000000000000000000000000ffffffffffffffffffffffffffffffffffffffff" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 15297, + "gasCost": 3, + "memory": null, + "op": "PUSH2", + "pc": 2773, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000005409ed021d9299bf6814279a6a1411a7e866a631" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 15294, + "gasCost": 3, + "memory": null, + "op": "DUP3", + "pc": 2776, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000005409ed021d9299bf6814279a6a1411a7e866a631", + "00000000000000000000000000000000000000000000000000000000000008fc" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 15291, + "gasCost": 3, + "memory": null, + "op": "SWAP1", + "pc": 2777, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000005409ed021d9299bf6814279a6a1411a7e866a631", + "00000000000000000000000000000000000000000000000000000000000008fc", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 15288, + "gasCost": 3, + "memory": null, + "op": "DUP2", + "pc": 2778, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000005409ed021d9299bf6814279a6a1411a7e866a631", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "00000000000000000000000000000000000000000000000000000000000008fc" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 15285, + "gasCost": 3, + "memory": null, + "op": "ISZERO", + "pc": 2779, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000005409ed021d9299bf6814279a6a1411a7e866a631", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "00000000000000000000000000000000000000000000000000000000000008fc", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 15282, + "gasCost": 3, + "memory": null, + "op": "MUL", + "pc": 2780, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000005409ed021d9299bf6814279a6a1411a7e866a631", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "00000000000000000000000000000000000000000000000000000000000008fc", + "0000000000000000000000000000000000000000000000000000000000000000" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 15277, + "gasCost": 5, + "memory": null, + "op": "SWAP1", + "pc": 2781, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000005409ed021d9299bf6814279a6a1411a7e866a631", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000000000000000000000000000000000000000000000" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 15274, + "gasCost": 3, + "memory": null, + "op": "PUSH1", + "pc": 2782, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000005409ed021d9299bf6814279a6a1411a7e866a631", + "0000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 15271, + "gasCost": 3, + "memory": null, + "op": "MLOAD", + "pc": 2784, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000005409ed021d9299bf6814279a6a1411a7e866a631", + "0000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000000000000000000000000000000000000000000040" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 15268, + "gasCost": 3, + "memory": null, + "op": "PUSH1", + "pc": 2785, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000005409ed021d9299bf6814279a6a1411a7e866a631", + "0000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000000000000000000000000000000000000000000080" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 15265, + "gasCost": 3, + "memory": null, + "op": "PUSH1", + "pc": 2787, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000005409ed021d9299bf6814279a6a1411a7e866a631", + "0000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000000000000000000000000000000000000000000080", + "0000000000000000000000000000000000000000000000000000000000000000" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 15262, + "gasCost": 3, + "memory": null, + "op": "MLOAD", + "pc": 2789, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000005409ed021d9299bf6814279a6a1411a7e866a631", + "0000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000000000000000000000000000000000000000000080", + "0000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000000000000000000000000000000000000000040" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 15259, + "gasCost": 3, + "memory": null, + "op": "DUP1", + "pc": 2790, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000005409ed021d9299bf6814279a6a1411a7e866a631", + "0000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000000000000000000000000000000000000000000080", + "0000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000000000000000000000000000000000000000080" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 15256, + "gasCost": 3, + "memory": null, + "op": "DUP4", + "pc": 2791, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000005409ed021d9299bf6814279a6a1411a7e866a631", + "0000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000000000000000000000000000000000000000000080", + "0000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000000000000000000000000000000000000000080", + "0000000000000000000000000000000000000000000000000000000000000080" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 15253, + "gasCost": 3, + "memory": null, + "op": "SUB", + "pc": 2792, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000005409ed021d9299bf6814279a6a1411a7e866a631", + "0000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000000000000000000000000000000000000000000080", + "0000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000000000000000000000000000000000000000080", + "0000000000000000000000000000000000000000000000000000000000000080", + "0000000000000000000000000000000000000000000000000000000000000080" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 15250, + "gasCost": 3, + "memory": null, + "op": "DUP2", + "pc": 2793, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000005409ed021d9299bf6814279a6a1411a7e866a631", + "0000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000000000000000000000000000000000000000000080", + "0000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000000000000000000000000000000000000000080", + "0000000000000000000000000000000000000000000000000000000000000000" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 15247, + "gasCost": 3, + "memory": null, + "op": "DUP6", + "pc": 2794, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000005409ed021d9299bf6814279a6a1411a7e866a631", + "0000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000000000000000000000000000000000000000000080", + "0000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000000000000000000000000000000000000000080", + "0000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000000000000000000000000000000000000000080" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 15244, + "gasCost": 3, + "memory": null, + "op": "DUP9", + "pc": 2795, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000005409ed021d9299bf6814279a6a1411a7e866a631", + "0000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000000000000000000000000000000000000000000080", + "0000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000000000000000000000000000000000000000080", + "0000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000000000000000000000000000000000000000080", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 15241, + "gasCost": 3, + "memory": null, + "op": "DUP9", + "pc": 2796, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000005409ed021d9299bf6814279a6a1411a7e866a631", + "0000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000000000000000000000000000000000000000000080", + "0000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000000000000000000000000000000000000000080", + "0000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000000000000000000000000000000000000000080", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000005409ed021d9299bf6814279a6a1411a7e866a631" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 15238, + "gasCost": 3, + "memory": null, + "op": "CALL", + "pc": 2797, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000005409ed021d9299bf6814279a6a1411a7e866a631", + "0000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000000000000000000000000000000000000000000080", + "0000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000000000000000000000000000000000000000080", + "0000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000000000000000000000000000000000000000080", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000005409ed021d9299bf6814279a6a1411a7e866a631", + "0000000000000000000000000000000000000000000000000000000000000000" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 7838, + "gasCost": 7400, + "memory": null, + "op": "SWAP4", + "pc": 2798, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000005409ed021d9299bf6814279a6a1411a7e866a631", + "00000000000000000000000000000000000000000000000000000000000008fc", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000000000000000000000000000000000000000000080", + "0000000000000000000000000000000000000000000000000000000000000001" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 7835, + "gasCost": 3, + "memory": null, + "op": "POP", + "pc": 2799, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000000000000000000000000000000000000000000001", + "00000000000000000000000000000000000000000000000000000000000008fc", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000000000000000000000000000000000000000000080", + "0000000000000000000000005409ed021d9299bf6814279a6a1411a7e866a631" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 7833, + "gasCost": 2, + "memory": null, + "op": "POP", + "pc": 2800, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000000000000000000000000000000000000000000001", + "00000000000000000000000000000000000000000000000000000000000008fc", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000000000000000000000000000000000000000000080" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 7831, + "gasCost": 2, + "memory": null, + "op": "POP", + "pc": 2801, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000000000000000000000000000000000000000000001", + "00000000000000000000000000000000000000000000000000000000000008fc", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 7829, + "gasCost": 2, + "memory": null, + "op": "POP", + "pc": 2802, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000000000000000000000000000000000000000000001", + "00000000000000000000000000000000000000000000000000000000000008fc" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 7827, + "gasCost": 2, + "memory": null, + "op": "ISZERO", + "pc": 2803, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000000000000000000000000000000000000000000001" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 7824, + "gasCost": 3, + "memory": null, + "op": "DUP1", + "pc": 2804, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000000000000000000000000000000000000000000000" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 7821, + "gasCost": 3, + "memory": null, + "op": "ISZERO", + "pc": 2805, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000000000000000000000000000000000000000000" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 7818, + "gasCost": 3, + "memory": null, + "op": "PUSH2", + "pc": 2806, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000000000000000000000000000000000000000001" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 7815, + "gasCost": 3, + "memory": null, + "op": "JUMPI", + "pc": 2809, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000000000000000000000000000000000000000000000", + "0000000000000000000000000000000000000000000000000000000000000001", + "0000000000000000000000000000000000000000000000000000000000000b03" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 7805, + "gasCost": 10, + "memory": null, + "op": "JUMPDEST", + "pc": 2819, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000000000000000000000000000000000000000000000" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 7804, + "gasCost": 1, + "memory": null, + "op": "POP", + "pc": 2820, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000000000000000000000000000000000000000000000" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 7802, + "gasCost": 2, + "memory": null, + "op": "CALLER", + "pc": 2821, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 7800, + "gasCost": 2, + "memory": null, + "op": "PUSH20", + "pc": 2822, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000005409ed021d9299bf6814279a6a1411a7e866a631" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 7797, + "gasCost": 3, + "memory": null, + "op": "AND", + "pc": 2843, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000005409ed021d9299bf6814279a6a1411a7e866a631", + "000000000000000000000000ffffffffffffffffffffffffffffffffffffffff" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 7794, + "gasCost": 3, + "memory": null, + "op": "PUSH32", + "pc": 2844, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000005409ed021d9299bf6814279a6a1411a7e866a631" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 7791, + "gasCost": 3, + "memory": null, + "op": "DUP3", + "pc": 2877, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000005409ed021d9299bf6814279a6a1411a7e866a631", + "7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b65" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 7788, + "gasCost": 3, + "memory": null, + "op": "PUSH1", + "pc": 2878, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000005409ed021d9299bf6814279a6a1411a7e866a631", + "7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b65", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 7785, + "gasCost": 3, + "memory": null, + "op": "MLOAD", + "pc": 2880, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000005409ed021d9299bf6814279a6a1411a7e866a631", + "7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b65", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000000000000000000000000000000000000000000040" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 7782, + "gasCost": 3, + "memory": null, + "op": "DUP1", + "pc": 2881, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000005409ed021d9299bf6814279a6a1411a7e866a631", + "7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b65", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000000000000000000000000000000000000000000080" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 7779, + "gasCost": 3, + "memory": null, + "op": "DUP3", + "pc": 2882, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000005409ed021d9299bf6814279a6a1411a7e866a631", + "7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b65", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000000000000000000000000000000000000000000080", + "0000000000000000000000000000000000000000000000000000000000000080" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 7776, + "gasCost": 3, + "memory": null, + "op": "DUP2", + "pc": 2883, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000005409ed021d9299bf6814279a6a1411a7e866a631", + "7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b65", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000000000000000000000000000000000000000000080", + "0000000000000000000000000000000000000000000000000000000000000080", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 7773, + "gasCost": 3, + "memory": null, + "op": "MSTORE", + "pc": 2884, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000005409ed021d9299bf6814279a6a1411a7e866a631", + "7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b65", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000000000000000000000000000000000000000000080", + "0000000000000000000000000000000000000000000000000000000000000080", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000000000000000000000000000000000000000000080" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 7764, + "gasCost": 9, + "memory": null, + "op": "PUSH1", + "pc": 2885, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000005409ed021d9299bf6814279a6a1411a7e866a631", + "7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b65", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000000000000000000000000000000000000000000080", + "0000000000000000000000000000000000000000000000000000000000000080" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 7761, + "gasCost": 3, + "memory": null, + "op": "ADD", + "pc": 2887, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000005409ed021d9299bf6814279a6a1411a7e866a631", + "7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b65", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000000000000000000000000000000000000000000080", + "0000000000000000000000000000000000000000000000000000000000000080", + "0000000000000000000000000000000000000000000000000000000000000020" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 7758, + "gasCost": 3, + "memory": null, + "op": "SWAP2", + "pc": 2888, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000005409ed021d9299bf6814279a6a1411a7e866a631", + "7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b65", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000000000000000000000000000000000000000000080", + "00000000000000000000000000000000000000000000000000000000000000a0" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 7755, + "gasCost": 3, + "memory": null, + "op": "POP", + "pc": 2889, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000005409ed021d9299bf6814279a6a1411a7e866a631", + "7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b65", + "00000000000000000000000000000000000000000000000000000000000000a0", + "0000000000000000000000000000000000000000000000000000000000000080", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 7753, + "gasCost": 2, + "memory": null, + "op": "POP", + "pc": 2890, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000005409ed021d9299bf6814279a6a1411a7e866a631", + "7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b65", + "00000000000000000000000000000000000000000000000000000000000000a0", + "0000000000000000000000000000000000000000000000000000000000000080" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 7751, + "gasCost": 2, + "memory": null, + "op": "PUSH1", + "pc": 2891, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000005409ed021d9299bf6814279a6a1411a7e866a631", + "7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b65", + "00000000000000000000000000000000000000000000000000000000000000a0" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 7748, + "gasCost": 3, + "memory": null, + "op": "MLOAD", + "pc": 2893, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000005409ed021d9299bf6814279a6a1411a7e866a631", + "7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b65", + "00000000000000000000000000000000000000000000000000000000000000a0", + "0000000000000000000000000000000000000000000000000000000000000040" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 7745, + "gasCost": 3, + "memory": null, + "op": "DUP1", + "pc": 2894, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000005409ed021d9299bf6814279a6a1411a7e866a631", + "7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b65", + "00000000000000000000000000000000000000000000000000000000000000a0", + "0000000000000000000000000000000000000000000000000000000000000080" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 7742, + "gasCost": 3, + "memory": null, + "op": "SWAP2", + "pc": 2895, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000005409ed021d9299bf6814279a6a1411a7e866a631", + "7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b65", + "00000000000000000000000000000000000000000000000000000000000000a0", + "0000000000000000000000000000000000000000000000000000000000000080", + "0000000000000000000000000000000000000000000000000000000000000080" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 7739, + "gasCost": 3, + "memory": null, + "op": "SUB", + "pc": 2896, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000005409ed021d9299bf6814279a6a1411a7e866a631", + "7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b65", + "0000000000000000000000000000000000000000000000000000000000000080", + "0000000000000000000000000000000000000000000000000000000000000080", + "00000000000000000000000000000000000000000000000000000000000000a0" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 7736, + "gasCost": 3, + "memory": null, + "op": "SWAP1", + "pc": 2897, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000005409ed021d9299bf6814279a6a1411a7e866a631", + "7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b65", + "0000000000000000000000000000000000000000000000000000000000000080", + "0000000000000000000000000000000000000000000000000000000000000020" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 7733, + "gasCost": 3, + "memory": null, + "op": "LOG2", + "pc": 2898, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "0000000000000000000000005409ed021d9299bf6814279a6a1411a7e866a631", + "7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b65", + "0000000000000000000000000000000000000000000000000000000000000020", + "0000000000000000000000000000000000000000000000000000000000000080" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 6352, + "gasCost": 1381, + "memory": null, + "op": "POP", + "pc": 2899, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289", + "0000000000000000000000000000000000000000000000000de0b6b3a7640000" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 6350, + "gasCost": 2, + "memory": null, + "op": "JUMP", + "pc": 2900, + "stack": [ + "000000000000000000000000000000000000000000000000000000002e1a7d4d", + "0000000000000000000000000000000000000000000000000000000000000289" + ], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 6342, + "gasCost": 8, + "memory": null, + "op": "JUMPDEST", + "pc": 649, + "stack": ["000000000000000000000000000000000000000000000000000000002e1a7d4d"], + "storage": null + }, + { + "depth": 0, + "error": "", + "gas": 6341, + "gasCost": 1, + "memory": null, + "op": "STOP", + "pc": 650, + "stack": ["000000000000000000000000000000000000000000000000000000002e1a7d4d"], + "storage": null + } +] diff --git a/packages/sol-cov/src/trace.ts b/packages/sol-cov/src/trace.ts index febb1034e..30508898b 100644 --- a/packages/sol-cov/src/trace.ts +++ b/packages/sol-cov/src/trace.ts @@ -7,7 +7,7 @@ import * as _ from 'lodash'; export interface TraceByContractAddress { [contractAddress: string]: StructLog[]; } -function padZeros(address: string) { +function padZeros(address: string): string { return addHexPrefix(_.padStart(stripHexPrefix(address), 40, '0')); } -- cgit v1.2.3 From 86f17fb466124ad4ecd9e4ac47e7fecde8f585ee Mon Sep 17 00:00:00 2001 From: Leonid Logvinov Date: Mon, 21 May 2018 16:44:25 -0700 Subject: Rename ZeroExArtifactAdapter to SolCompilerArtifactAdapter --- packages/sol-cov/src/artifact_adapters/0x.ts | 2 +- packages/sol-cov/src/artifact_adapters/truffle.ts | 6 +++--- packages/sol-cov/src/index.ts | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) (limited to 'packages/sol-cov/src') diff --git a/packages/sol-cov/src/artifact_adapters/0x.ts b/packages/sol-cov/src/artifact_adapters/0x.ts index 87d23b0aa..f61364df6 100644 --- a/packages/sol-cov/src/artifact_adapters/0x.ts +++ b/packages/sol-cov/src/artifact_adapters/0x.ts @@ -7,7 +7,7 @@ import { ContractData } from '../types'; import { AbstractArtifactAdapter } from './abstract'; -export class ZeroExArtifactAdapter extends AbstractArtifactAdapter { +export class SolCompilerArtifactAdapter extends AbstractArtifactAdapter { private _artifactsPath: string; private _sourcesPath: string; constructor(artifactsPath: string, sourcesPath: string) { diff --git a/packages/sol-cov/src/artifact_adapters/truffle.ts b/packages/sol-cov/src/artifact_adapters/truffle.ts index e891bb464..b9c9c4d42 100644 --- a/packages/sol-cov/src/artifact_adapters/truffle.ts +++ b/packages/sol-cov/src/artifact_adapters/truffle.ts @@ -7,7 +7,7 @@ import * as rimraf from 'rimraf'; import { ContractData } from '../types'; -import { ZeroExArtifactAdapter } from './0x'; +import { SolCompilerArtifactAdapter } from './0x'; import { AbstractArtifactAdapter } from './abstract'; export class TruffleArtifactAdapter extends AbstractArtifactAdapter { @@ -35,8 +35,8 @@ export class TruffleArtifactAdapter extends AbstractArtifactAdapter { }; const compiler = new Compiler(compilerOptions); await compiler.compileAsync(); - const zeroExArtifactAdapter = new ZeroExArtifactAdapter(artifactsDir, this._sourcesPath); - const contractsDataFrom0xArtifacts = await zeroExArtifactAdapter.collectContractsDataAsync(); + const solCompilerArtifactAdapter = new SolCompilerArtifactAdapter(artifactsDir, this._sourcesPath); + const contractsDataFrom0xArtifacts = await solCompilerArtifactAdapter.collectContractsDataAsync(); rimraf.sync(artifactsDir); return contractsDataFrom0xArtifacts; } diff --git a/packages/sol-cov/src/index.ts b/packages/sol-cov/src/index.ts index 18031372b..a4d2b027f 100644 --- a/packages/sol-cov/src/index.ts +++ b/packages/sol-cov/src/index.ts @@ -1,5 +1,5 @@ export { CoverageSubprovider } from './coverage_subprovider'; -export { ZeroExArtifactAdapter } from './artifact_adapters/0x'; +export { SolCompilerArtifactAdapter } from './artifact_adapters/0x'; export { TruffleArtifactAdapter } from './artifact_adapters/truffle'; export { AbstractArtifactAdapter } from './artifact_adapters/abstract'; export { ContractData } from './types'; -- cgit v1.2.3 From 08b08ef1d0fbff2da8b64524704cf1bc50f77f30 Mon Sep 17 00:00:00 2001 From: Leonid Logvinov Date: Mon, 21 May 2018 16:56:00 -0700 Subject: Match class names with file names --- packages/sol-cov/src/artifact_adapters/0x.ts | 41 --------------------- packages/sol-cov/src/artifact_adapters/abstract.ts | 5 --- .../artifact_adapters/abstract_artifact_adapter.ts | 5 +++ .../sol_compiler_artifact_adapter.ts | 41 +++++++++++++++++++++ packages/sol-cov/src/artifact_adapters/truffle.ts | 43 ---------------------- .../artifact_adapters/truffle_artifact_adapter.ts | 43 ++++++++++++++++++++++ packages/sol-cov/src/index.ts | 6 +-- 7 files changed, 92 insertions(+), 92 deletions(-) delete mode 100644 packages/sol-cov/src/artifact_adapters/0x.ts delete mode 100644 packages/sol-cov/src/artifact_adapters/abstract.ts create mode 100644 packages/sol-cov/src/artifact_adapters/abstract_artifact_adapter.ts create mode 100644 packages/sol-cov/src/artifact_adapters/sol_compiler_artifact_adapter.ts delete mode 100644 packages/sol-cov/src/artifact_adapters/truffle.ts create mode 100644 packages/sol-cov/src/artifact_adapters/truffle_artifact_adapter.ts (limited to 'packages/sol-cov/src') diff --git a/packages/sol-cov/src/artifact_adapters/0x.ts b/packages/sol-cov/src/artifact_adapters/0x.ts deleted file mode 100644 index f61364df6..000000000 --- a/packages/sol-cov/src/artifact_adapters/0x.ts +++ /dev/null @@ -1,41 +0,0 @@ -import * as fs from 'fs'; -import * as glob from 'glob'; -import * as _ from 'lodash'; -import * as path from 'path'; - -import { ContractData } from '../types'; - -import { AbstractArtifactAdapter } from './abstract'; - -export class SolCompilerArtifactAdapter extends AbstractArtifactAdapter { - private _artifactsPath: string; - private _sourcesPath: string; - constructor(artifactsPath: string, sourcesPath: string) { - super(); - this._artifactsPath = artifactsPath; - this._sourcesPath = sourcesPath; - } - public async collectContractsDataAsync(): Promise { - const artifactsGlob = `${this._artifactsPath}/**/*.json`; - const artifactFileNames = glob.sync(artifactsGlob, { absolute: true }); - const contractsData: ContractData[] = []; - for (const artifactFileName of artifactFileNames) { - const artifact = JSON.parse(fs.readFileSync(artifactFileName).toString()); - let sources = _.keys(artifact.sources); - sources = _.map(sources, relativeFilePath => path.resolve(this._sourcesPath, relativeFilePath)); - const contractName = artifact.contractName; - // We don't compute coverage for dependencies - const sourceCodes = _.map(sources, (source: string) => fs.readFileSync(source).toString()); - const contractData = { - sourceCodes, - sources, - bytecode: artifact.compilerOutput.evm.bytecode.object, - sourceMap: artifact.compilerOutput.evm.bytecode.sourceMap, - runtimeBytecode: artifact.compilerOutput.evm.deployedBytecode.object, - sourceMapRuntime: artifact.compilerOutput.evm.deployedBytecode.sourceMap, - }; - contractsData.push(contractData); - } - return contractsData; - } -} diff --git a/packages/sol-cov/src/artifact_adapters/abstract.ts b/packages/sol-cov/src/artifact_adapters/abstract.ts deleted file mode 100644 index fcc6562ad..000000000 --- a/packages/sol-cov/src/artifact_adapters/abstract.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { ContractData } from '../types'; - -export abstract class AbstractArtifactAdapter { - public abstract async collectContractsDataAsync(): Promise; -} diff --git a/packages/sol-cov/src/artifact_adapters/abstract_artifact_adapter.ts b/packages/sol-cov/src/artifact_adapters/abstract_artifact_adapter.ts new file mode 100644 index 000000000..fcc6562ad --- /dev/null +++ b/packages/sol-cov/src/artifact_adapters/abstract_artifact_adapter.ts @@ -0,0 +1,5 @@ +import { ContractData } from '../types'; + +export abstract class AbstractArtifactAdapter { + public abstract async collectContractsDataAsync(): Promise; +} diff --git a/packages/sol-cov/src/artifact_adapters/sol_compiler_artifact_adapter.ts b/packages/sol-cov/src/artifact_adapters/sol_compiler_artifact_adapter.ts new file mode 100644 index 000000000..f61364df6 --- /dev/null +++ b/packages/sol-cov/src/artifact_adapters/sol_compiler_artifact_adapter.ts @@ -0,0 +1,41 @@ +import * as fs from 'fs'; +import * as glob from 'glob'; +import * as _ from 'lodash'; +import * as path from 'path'; + +import { ContractData } from '../types'; + +import { AbstractArtifactAdapter } from './abstract'; + +export class SolCompilerArtifactAdapter extends AbstractArtifactAdapter { + private _artifactsPath: string; + private _sourcesPath: string; + constructor(artifactsPath: string, sourcesPath: string) { + super(); + this._artifactsPath = artifactsPath; + this._sourcesPath = sourcesPath; + } + public async collectContractsDataAsync(): Promise { + const artifactsGlob = `${this._artifactsPath}/**/*.json`; + const artifactFileNames = glob.sync(artifactsGlob, { absolute: true }); + const contractsData: ContractData[] = []; + for (const artifactFileName of artifactFileNames) { + const artifact = JSON.parse(fs.readFileSync(artifactFileName).toString()); + let sources = _.keys(artifact.sources); + sources = _.map(sources, relativeFilePath => path.resolve(this._sourcesPath, relativeFilePath)); + const contractName = artifact.contractName; + // We don't compute coverage for dependencies + const sourceCodes = _.map(sources, (source: string) => fs.readFileSync(source).toString()); + const contractData = { + sourceCodes, + sources, + bytecode: artifact.compilerOutput.evm.bytecode.object, + sourceMap: artifact.compilerOutput.evm.bytecode.sourceMap, + runtimeBytecode: artifact.compilerOutput.evm.deployedBytecode.object, + sourceMapRuntime: artifact.compilerOutput.evm.deployedBytecode.sourceMap, + }; + contractsData.push(contractData); + } + return contractsData; + } +} diff --git a/packages/sol-cov/src/artifact_adapters/truffle.ts b/packages/sol-cov/src/artifact_adapters/truffle.ts deleted file mode 100644 index b9c9c4d42..000000000 --- a/packages/sol-cov/src/artifact_adapters/truffle.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { Compiler, CompilerOptions } from '@0xproject/sol-compiler'; -import * as fs from 'fs'; -import * as glob from 'glob'; -import * as _ from 'lodash'; -import * as path from 'path'; -import * as rimraf from 'rimraf'; - -import { ContractData } from '../types'; - -import { SolCompilerArtifactAdapter } from './0x'; -import { AbstractArtifactAdapter } from './abstract'; - -export class TruffleArtifactAdapter extends AbstractArtifactAdapter { - private _solcVersion: string; - private _sourcesPath: string; - constructor(sourcesPath: string, solcVersion: string) { - super(); - this._solcVersion = solcVersion; - this._sourcesPath = sourcesPath; - } - public async collectContractsDataAsync(): Promise { - const artifactsDir = '0x-artifacts'; - const compilerOptions: CompilerOptions = { - contractsDir: this._sourcesPath, - artifactsDir, - compilerSettings: { - outputSelection: { - ['*']: { - ['*']: ['abi', 'evm.bytecode.object', 'evm.deployedBytecode.object'], - }, - }, - }, - contracts: '*', - solcVersion: this._solcVersion, - }; - const compiler = new Compiler(compilerOptions); - await compiler.compileAsync(); - const solCompilerArtifactAdapter = new SolCompilerArtifactAdapter(artifactsDir, this._sourcesPath); - const contractsDataFrom0xArtifacts = await solCompilerArtifactAdapter.collectContractsDataAsync(); - rimraf.sync(artifactsDir); - return contractsDataFrom0xArtifacts; - } -} diff --git a/packages/sol-cov/src/artifact_adapters/truffle_artifact_adapter.ts b/packages/sol-cov/src/artifact_adapters/truffle_artifact_adapter.ts new file mode 100644 index 000000000..b9c9c4d42 --- /dev/null +++ b/packages/sol-cov/src/artifact_adapters/truffle_artifact_adapter.ts @@ -0,0 +1,43 @@ +import { Compiler, CompilerOptions } from '@0xproject/sol-compiler'; +import * as fs from 'fs'; +import * as glob from 'glob'; +import * as _ from 'lodash'; +import * as path from 'path'; +import * as rimraf from 'rimraf'; + +import { ContractData } from '../types'; + +import { SolCompilerArtifactAdapter } from './0x'; +import { AbstractArtifactAdapter } from './abstract'; + +export class TruffleArtifactAdapter extends AbstractArtifactAdapter { + private _solcVersion: string; + private _sourcesPath: string; + constructor(sourcesPath: string, solcVersion: string) { + super(); + this._solcVersion = solcVersion; + this._sourcesPath = sourcesPath; + } + public async collectContractsDataAsync(): Promise { + const artifactsDir = '0x-artifacts'; + const compilerOptions: CompilerOptions = { + contractsDir: this._sourcesPath, + artifactsDir, + compilerSettings: { + outputSelection: { + ['*']: { + ['*']: ['abi', 'evm.bytecode.object', 'evm.deployedBytecode.object'], + }, + }, + }, + contracts: '*', + solcVersion: this._solcVersion, + }; + const compiler = new Compiler(compilerOptions); + await compiler.compileAsync(); + const solCompilerArtifactAdapter = new SolCompilerArtifactAdapter(artifactsDir, this._sourcesPath); + const contractsDataFrom0xArtifacts = await solCompilerArtifactAdapter.collectContractsDataAsync(); + rimraf.sync(artifactsDir); + return contractsDataFrom0xArtifacts; + } +} diff --git a/packages/sol-cov/src/index.ts b/packages/sol-cov/src/index.ts index a4d2b027f..7a2afbe80 100644 --- a/packages/sol-cov/src/index.ts +++ b/packages/sol-cov/src/index.ts @@ -1,5 +1,5 @@ export { CoverageSubprovider } from './coverage_subprovider'; -export { SolCompilerArtifactAdapter } from './artifact_adapters/0x'; -export { TruffleArtifactAdapter } from './artifact_adapters/truffle'; -export { AbstractArtifactAdapter } from './artifact_adapters/abstract'; +export { SolCompilerArtifactAdapter } from './artifact_adapters/sol_compiler_artifact_adapter'; +export { TruffleArtifactAdapter } from './artifact_adapters/truffle_artifact_adapter'; +export { AbstractArtifactAdapter } from './artifact_adapters/abstract_artifact_adapter'; export { ContractData } from './types'; -- cgit v1.2.3 From d9907f227e2187441b5496e26d166fc7e289cdc6 Mon Sep 17 00:00:00 2001 From: Leonid Logvinov Date: Mon, 21 May 2018 17:00:10 -0700 Subject: Use a hidden directory for temp artifacts --- packages/sol-cov/src/artifact_adapters/sol_compiler_artifact_adapter.ts | 1 - packages/sol-cov/src/artifact_adapters/truffle_artifact_adapter.ts | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) (limited to 'packages/sol-cov/src') diff --git a/packages/sol-cov/src/artifact_adapters/sol_compiler_artifact_adapter.ts b/packages/sol-cov/src/artifact_adapters/sol_compiler_artifact_adapter.ts index f61364df6..138c35b1e 100644 --- a/packages/sol-cov/src/artifact_adapters/sol_compiler_artifact_adapter.ts +++ b/packages/sol-cov/src/artifact_adapters/sol_compiler_artifact_adapter.ts @@ -24,7 +24,6 @@ export class SolCompilerArtifactAdapter extends AbstractArtifactAdapter { let sources = _.keys(artifact.sources); sources = _.map(sources, relativeFilePath => path.resolve(this._sourcesPath, relativeFilePath)); const contractName = artifact.contractName; - // We don't compute coverage for dependencies const sourceCodes = _.map(sources, (source: string) => fs.readFileSync(source).toString()); const contractData = { sourceCodes, diff --git a/packages/sol-cov/src/artifact_adapters/truffle_artifact_adapter.ts b/packages/sol-cov/src/artifact_adapters/truffle_artifact_adapter.ts index b9c9c4d42..36a31383d 100644 --- a/packages/sol-cov/src/artifact_adapters/truffle_artifact_adapter.ts +++ b/packages/sol-cov/src/artifact_adapters/truffle_artifact_adapter.ts @@ -19,7 +19,7 @@ export class TruffleArtifactAdapter extends AbstractArtifactAdapter { this._sourcesPath = sourcesPath; } public async collectContractsDataAsync(): Promise { - const artifactsDir = '0x-artifacts'; + const artifactsDir = '.0x-artifacts'; const compilerOptions: CompilerOptions = { contractsDir: this._sourcesPath, artifactsDir, -- cgit v1.2.3 From 5c9bde203e0d9726f77f910adcf386c5758df072 Mon Sep 17 00:00:00 2001 From: Leonid Logvinov Date: Mon, 21 May 2018 17:01:55 -0700 Subject: Remove a comment --- packages/sol-cov/src/coverage_manager.ts | 1 - 1 file changed, 1 deletion(-) (limited to 'packages/sol-cov/src') diff --git a/packages/sol-cov/src/coverage_manager.ts b/packages/sol-cov/src/coverage_manager.ts index 65a6086c0..1adddbbd6 100644 --- a/packages/sol-cov/src/coverage_manager.ts +++ b/packages/sol-cov/src/coverage_manager.ts @@ -122,7 +122,6 @@ export class CoverageManager { this._verbose = verbose; } public appendTraceInfo(traceInfo: TraceInfo): void { - // console.log(JSON.stringify(traceInfo, null, '\n')); this._traceInfos.push(traceInfo); } public async writeCoverageAsync(): Promise { -- cgit v1.2.3 From e4fe4975041f6fd28b84085ce5083dd1c4cb3b22 Mon Sep 17 00:00:00 2001 From: Leonid Logvinov Date: Mon, 21 May 2018 17:23:01 -0700 Subject: Refactor ContractData lookup --- .../artifact_adapters/truffle_artifact_adapter.ts | 4 +- packages/sol-cov/src/coverage_manager.ts | 63 +++++++++++----------- 2 files changed, 33 insertions(+), 34 deletions(-) (limited to 'packages/sol-cov/src') diff --git a/packages/sol-cov/src/artifact_adapters/truffle_artifact_adapter.ts b/packages/sol-cov/src/artifact_adapters/truffle_artifact_adapter.ts index 36a31383d..c7f21b6eb 100644 --- a/packages/sol-cov/src/artifact_adapters/truffle_artifact_adapter.ts +++ b/packages/sol-cov/src/artifact_adapters/truffle_artifact_adapter.ts @@ -7,8 +7,8 @@ import * as rimraf from 'rimraf'; import { ContractData } from '../types'; -import { SolCompilerArtifactAdapter } from './0x'; -import { AbstractArtifactAdapter } from './abstract'; +import { AbstractArtifactAdapter } from './abstract_artifact_adapter'; +import { SolCompilerArtifactAdapter } from './sol_compiler_artifact_adapter'; export class TruffleArtifactAdapter extends AbstractArtifactAdapter { private _solcVersion: string; diff --git a/packages/sol-cov/src/coverage_manager.ts b/packages/sol-cov/src/coverage_manager.ts index 1adddbbd6..d7a00f86d 100644 --- a/packages/sol-cov/src/coverage_manager.ts +++ b/packages/sol-cov/src/coverage_manager.ts @@ -1,12 +1,12 @@ import { promisify } from '@0xproject/utils'; -import { addHexPrefix } from 'ethereumjs-util'; +import { addHexPrefix, stripHexPrefix } from 'ethereumjs-util'; import * as fs from 'fs'; import { Collector } from 'istanbul'; import * as _ from 'lodash'; import * as mkdirp from 'mkdirp'; import * as path from 'path'; -import { AbstractArtifactAdapter } from './artifact_adapters/abstract'; +import { AbstractArtifactAdapter } from './artifact_adapters/abstract_artifact_adapter'; import { collectCoverageEntries } from './collect_coverage_entries'; import { constants } from './constants'; import { parseSourceMap } from './source_maps'; @@ -112,6 +112,29 @@ export class CoverageManager { }; return partialCoverage; } + private static _bytecodeToBytecodeRegex(bytecode: string): string { + const bytecodeRegex = bytecode + // Library linking placeholder: __ConvertLib____________________________ + .replace(/_.*_/, '.*') + // Last 86 characters is solidity compiler metadata that's different between compilations + .replace(/.{86}$/, '') + // Libraries contain their own address at the beginning of the code and it's impossible to know it in advance + .replace(/^0x730000000000000000000000000000000000000000/, '0x73........................................'); + return bytecodeRegex; + } + private static _getContractDataIfExists(contractsData: ContractData[], bytecode: string): ContractData | undefined { + if (!bytecode.startsWith('0x')) { + throw new Error(')x missing'); + } + const contractData = _.find(contractsData, contractDataCandidate => { + const bytecodeRegex = CoverageManager._bytecodeToBytecodeRegex(contractDataCandidate.bytecode); + const runtimeBytecodeRegex = CoverageManager._bytecodeToBytecodeRegex( + contractDataCandidate.runtimeBytecode, + ); + return !_.isNull(bytecode.match(bytecodeRegex)) || !_.isNull(bytecode.match(runtimeBytecodeRegex)); + }); + return contractData; + } constructor( artifactAdapter: AbstractArtifactAdapter, getContractCodeAsync: (address: string) => Promise, @@ -136,20 +159,8 @@ export class CoverageManager { for (const traceInfo of this._traceInfos) { if (traceInfo.address !== constants.NEW_CONTRACT) { // Runtime transaction - let runtimeBytecode = (traceInfo as TraceInfoExistingContract).runtimeBytecode; - runtimeBytecode = addHexPrefix(runtimeBytecode); - const contractData = _.find(contractsData, contractDataCandidate => { - // Library linking placeholder: __ConvertLib____________________________ - let runtimeBytecodeRegex = contractDataCandidate.runtimeBytecode.replace(/_.*_/, '.*'); - // Last 86 characters is solidity compiler metadata that's different between compilations - runtimeBytecodeRegex = runtimeBytecodeRegex.replace(/.{86}$/, ''); - // Libraries contain their own address at the beginning of the code and it's impossible to know it in advance - runtimeBytecodeRegex = runtimeBytecodeRegex.replace( - /^0x730000000000000000000000000000000000000000/, - '0x73........................................', - ); - return !_.isNull(runtimeBytecode.match(runtimeBytecodeRegex)); - }) as ContractData; + const runtimeBytecode = (traceInfo as TraceInfoExistingContract).runtimeBytecode; + const contractData = CoverageManager._getContractDataIfExists(contractsData, runtimeBytecode); if (_.isUndefined(contractData)) { if (this._verbose) { // tslint:disable-next-line:no-console @@ -157,7 +168,7 @@ export class CoverageManager { } continue; } - const bytecodeHex = runtimeBytecode.slice(2); + const bytecodeHex = stripHexPrefix(runtimeBytecode); const sourceMap = contractData.sourceMapRuntime; const pcToSourceRange = parseSourceMap( contractData.sourceCodes, @@ -176,20 +187,8 @@ export class CoverageManager { } } else { // Contract creation transaction - let bytecode = (traceInfo as TraceInfoNewContract).bytecode; - bytecode = addHexPrefix(bytecode); - const contractData = _.find(contractsData, contractDataCandidate => { - // Library linking placeholder: __ConvertLib____________________________ - let bytecodeRegex = contractDataCandidate.bytecode.replace(/_.*_/, '.*'); - // Last 86 characters is solidity compiler metadata that's different between compilations - bytecodeRegex = bytecodeRegex.replace(/.{86}$/, ''); - // Libraries contain their own address at the beginning of the code and it's impossible to know it in advance - bytecodeRegex = bytecodeRegex.replace( - /^0x730000000000000000000000000000000000000000/, - '0x73........................................', - ); - return !_.isNull(bytecode.match(bytecodeRegex)); - }) as ContractData; + const bytecode = (traceInfo as TraceInfoNewContract).bytecode; + const contractData = CoverageManager._getContractDataIfExists(contractsData, bytecode); if (_.isUndefined(contractData)) { if (this._verbose) { // tslint:disable-next-line:no-console @@ -197,7 +196,7 @@ export class CoverageManager { } continue; } - const bytecodeHex = bytecode.slice(2); + const bytecodeHex = stripHexPrefix(bytecode); const sourceMap = contractData.sourceMap; const pcToSourceRange = parseSourceMap( contractData.sourceCodes, -- cgit v1.2.3 From 253bada6432bb4727de2e9d21658cd2c7a2c01b7 Mon Sep 17 00:00:00 2001 From: Leonid Logvinov Date: Mon, 21 May 2018 17:30:38 -0700 Subject: Fix import paths --- packages/sol-cov/src/artifact_adapters/sol_compiler_artifact_adapter.ts | 2 +- packages/sol-cov/src/coverage_subprovider.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) (limited to 'packages/sol-cov/src') diff --git a/packages/sol-cov/src/artifact_adapters/sol_compiler_artifact_adapter.ts b/packages/sol-cov/src/artifact_adapters/sol_compiler_artifact_adapter.ts index 138c35b1e..cb164f769 100644 --- a/packages/sol-cov/src/artifact_adapters/sol_compiler_artifact_adapter.ts +++ b/packages/sol-cov/src/artifact_adapters/sol_compiler_artifact_adapter.ts @@ -5,7 +5,7 @@ import * as path from 'path'; import { ContractData } from '../types'; -import { AbstractArtifactAdapter } from './abstract'; +import { AbstractArtifactAdapter } from './abstract_artifact_adapter'; export class SolCompilerArtifactAdapter extends AbstractArtifactAdapter { private _artifactsPath: string; diff --git a/packages/sol-cov/src/coverage_subprovider.ts b/packages/sol-cov/src/coverage_subprovider.ts index addad5e8f..1e050080f 100644 --- a/packages/sol-cov/src/coverage_subprovider.ts +++ b/packages/sol-cov/src/coverage_subprovider.ts @@ -4,7 +4,7 @@ import * as fs from 'fs'; import * as _ from 'lodash'; import { Lock } from 'semaphore-async-await'; -import { AbstractArtifactAdapter } from './artifact_adapters/abstract'; +import { AbstractArtifactAdapter } from './artifact_adapters/abstract_artifact_adapter'; import { constants } from './constants'; import { CoverageManager } from './coverage_manager'; import { getTracesByContractAddress } from './trace'; -- cgit v1.2.3 From ac52ad88a1884979c74f418398bbf428d727cf34 Mon Sep 17 00:00:00 2001 From: Leonid Logvinov Date: Tue, 22 May 2018 10:39:27 -0700 Subject: Use loglevel instead of verbose flag --- packages/sol-cov/src/coverage_manager.ts | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) (limited to 'packages/sol-cov/src') diff --git a/packages/sol-cov/src/coverage_manager.ts b/packages/sol-cov/src/coverage_manager.ts index d7a00f86d..3aa62acff 100644 --- a/packages/sol-cov/src/coverage_manager.ts +++ b/packages/sol-cov/src/coverage_manager.ts @@ -3,6 +3,7 @@ import { addHexPrefix, stripHexPrefix } from 'ethereumjs-util'; import * as fs from 'fs'; import { Collector } from 'istanbul'; import * as _ from 'lodash'; +import { getLogger, levels, Logger, LogLevel } from 'loglevel'; import * as mkdirp from 'mkdirp'; import * as path from 'path'; @@ -35,7 +36,7 @@ const mkdirpAsync = promisify(mkdirp); export class CoverageManager { private _artifactAdapter: AbstractArtifactAdapter; - private _verbose: boolean; + private _logger: Logger; private _traceInfos: TraceInfo[] = []; private _getContractCodeAsync: (address: string) => Promise; private static _getSingleFileCoverageForTrace( @@ -124,7 +125,7 @@ export class CoverageManager { } private static _getContractDataIfExists(contractsData: ContractData[], bytecode: string): ContractData | undefined { if (!bytecode.startsWith('0x')) { - throw new Error(')x missing'); + throw new Error('0x missing'); } const contractData = _.find(contractsData, contractDataCandidate => { const bytecodeRegex = CoverageManager._bytecodeToBytecodeRegex(contractDataCandidate.bytecode); @@ -142,7 +143,8 @@ export class CoverageManager { ) { this._getContractCodeAsync = getContractCodeAsync; this._artifactAdapter = artifactAdapter; - this._verbose = verbose; + this._logger = getLogger('sol-cov'); + this._logger.setLevel(verbose ? levels.TRACE : levels.ERROR); } public appendTraceInfo(traceInfo: TraceInfo): void { this._traceInfos.push(traceInfo); @@ -162,10 +164,7 @@ export class CoverageManager { const runtimeBytecode = (traceInfo as TraceInfoExistingContract).runtimeBytecode; const contractData = CoverageManager._getContractDataIfExists(contractsData, runtimeBytecode); if (_.isUndefined(contractData)) { - if (this._verbose) { - // tslint:disable-next-line:no-console - console.warn(`Transaction to an unknown address: ${traceInfo.address}`); - } + this._logger.warn(`Transaction to an unknown address: ${traceInfo.address}`); continue; } const bytecodeHex = stripHexPrefix(runtimeBytecode); @@ -190,10 +189,7 @@ export class CoverageManager { const bytecode = (traceInfo as TraceInfoNewContract).bytecode; const contractData = CoverageManager._getContractDataIfExists(contractsData, bytecode); if (_.isUndefined(contractData)) { - if (this._verbose) { - // tslint:disable-next-line:no-console - console.warn(`Unknown contract creation transaction`); - } + this._logger.warn(`Unknown contract creation transaction`); continue; } const bytecodeHex = stripHexPrefix(bytecode); -- cgit v1.2.3 From 83c37c6a7a320326975c8afd9d49a42c9afcefd4 Mon Sep 17 00:00:00 2001 From: Leonid Logvinov Date: Tue, 22 May 2018 11:05:24 -0700 Subject: Address feedback --- packages/sol-cov/src/coverage_manager.ts | 4 ++-- packages/sol-cov/src/trace.ts | 27 ++++++++------------------- 2 files changed, 10 insertions(+), 21 deletions(-) (limited to 'packages/sol-cov/src') diff --git a/packages/sol-cov/src/coverage_manager.ts b/packages/sol-cov/src/coverage_manager.ts index 3aa62acff..ef893527a 100644 --- a/packages/sol-cov/src/coverage_manager.ts +++ b/packages/sol-cov/src/coverage_manager.ts @@ -139,12 +139,12 @@ export class CoverageManager { constructor( artifactAdapter: AbstractArtifactAdapter, getContractCodeAsync: (address: string) => Promise, - verbose: boolean, + isVerbose: boolean, ) { this._getContractCodeAsync = getContractCodeAsync; this._artifactAdapter = artifactAdapter; this._logger = getLogger('sol-cov'); - this._logger.setLevel(verbose ? levels.TRACE : levels.ERROR); + this._logger.setLevel(isVerbose ? levels.TRACE : levels.ERROR); } public appendTraceInfo(traceInfo: TraceInfo): void { this._traceInfos.push(traceInfo); diff --git a/packages/sol-cov/src/trace.ts b/packages/sol-cov/src/trace.ts index 30508898b..81c8bb0ff 100644 --- a/packages/sol-cov/src/trace.ts +++ b/packages/sol-cov/src/trace.ts @@ -1,5 +1,5 @@ import { OpCode, StructLog, TransactionTrace } from '@0xproject/types'; -import { BigNumber, logUtils } from '@0xproject/utils'; +import { addressUtils, BigNumber, logUtils } from '@0xproject/utils'; import { addHexPrefix, stripHexPrefix } from 'ethereumjs-util'; import * as fs from 'fs'; import * as _ from 'lodash'; @@ -7,17 +7,13 @@ import * as _ from 'lodash'; export interface TraceByContractAddress { [contractAddress: string]: StructLog[]; } -function padZeros(address: string): string { - return addHexPrefix(_.padStart(stripHexPrefix(address), 40, '0')); -} export function getTracesByContractAddress(structLogs: StructLog[], startAddress: string): TraceByContractAddress { const traceByContractAddress: TraceByContractAddress = {}; let currentTraceSegment = []; const callStack = [startAddress]; - // tslint:disable-next-line: prefer-for-of - for (let i = 0; i < structLogs.length; ++i) { - const structLog = structLogs[i]; + // tslint:disable-next-line:prefer-for-of + for (const structLog of structLogs) { if (structLog.depth !== callStack.length - 1) { throw new Error("Malformed trace. trace depth doesn't match call stack depth"); } @@ -26,26 +22,19 @@ export function getTracesByContractAddress(structLogs: StructLog[], startAddress // That means that we can always safely pop from it currentTraceSegment.push(structLog); - if ( - structLog.op === OpCode.CallCode || - structLog.op === OpCode.StaticCall || - structLog.op === OpCode.Call || - structLog.op === OpCode.DelegateCall - ) { + if (_.includes([OpCode.CallCode, OpCode.StaticCall, OpCode.Call, OpCode.DelegateCall], structLog.op)) { const currentAddress = _.last(callStack) as string; const jumpAddressOffset = structLog.op === OpCode.DelegateCall ? 4 : 2; - const newAddress = padZeros(new BigNumber(addHexPrefix(structLog.stack[jumpAddressOffset])).toString(16)); + const newAddress = addressUtils.padZeros( + new BigNumber(addHexPrefix(structLog.stack[jumpAddressOffset])).toString(16), + ); callStack.push(newAddress); traceByContractAddress[currentAddress] = (traceByContractAddress[currentAddress] || []).concat( currentTraceSegment, ); currentTraceSegment = []; } else if ( - structLog.op === OpCode.Return || - structLog.op === OpCode.Stop || - structLog.op === OpCode.Revert || - structLog.op === OpCode.Invalid || - structLog.op === OpCode.SelfDestruct + _.includes([OpCode.Return, OpCode.Stop, OpCode.Revert, OpCode.Invalid, OpCode.SelfDestruct], structLog.op) ) { const currentAddress = callStack.pop() as string; traceByContractAddress[currentAddress] = (traceByContractAddress[currentAddress] || []).concat( -- cgit v1.2.3 From 0c53d276f8f4725feeae48fc3534ab63db8fcafb Mon Sep 17 00:00:00 2001 From: Leonid Logvinov Date: Tue, 22 May 2018 11:10:03 -0700 Subject: Use BlockParamLiteral.Latest --- packages/sol-cov/src/coverage_subprovider.ts | 8 ++++---- packages/sol-cov/src/types.ts | 4 ++++ 2 files changed, 8 insertions(+), 4 deletions(-) (limited to 'packages/sol-cov/src') diff --git a/packages/sol-cov/src/coverage_subprovider.ts b/packages/sol-cov/src/coverage_subprovider.ts index 1e050080f..3fd45bbd1 100644 --- a/packages/sol-cov/src/coverage_subprovider.ts +++ b/packages/sol-cov/src/coverage_subprovider.ts @@ -8,7 +8,7 @@ import { AbstractArtifactAdapter } from './artifact_adapters/abstract_artifact_a import { constants } from './constants'; import { CoverageManager } from './coverage_manager'; import { getTracesByContractAddress } from './trace'; -import { TraceInfoExistingContract, TraceInfoNewContract } from './types'; +import { BlockParamLiteral, TraceInfoExistingContract, TraceInfoNewContract } from './types'; interface MaybeFakeTxData extends TxData { isFakeTransaction?: boolean; @@ -89,7 +89,7 @@ export class CoverageSubprovider extends Subprovider { } else { const payload = { method: 'eth_getBlockByNumber', - params: ['latest', true], + params: [BlockParamLiteral.Latest, true], }; const jsonRPCResponsePayload = await this.emitPayloadAsync(payload); const transactions = jsonRPCResponsePayload.result.transactions; @@ -136,7 +136,7 @@ export class CoverageSubprovider extends Subprovider { } else { const tracesByContractAddress = getTracesByContractAddress(trace.structLogs, address); for (const subcallAddress of _.keys(tracesByContractAddress)) { - payload = { method: 'eth_getCode', params: [subcallAddress, 'latest'] }; + payload = { method: 'eth_getCode', params: [subcallAddress, BlockParamLiteral.Latest] }; const runtimeBytecode = (await this.emitPayloadAsync(payload)).result; const traceForThatSubcall = tracesByContractAddress[subcallAddress]; const coveredPcs = _.map(traceForThatSubcall, log => log.pc); @@ -178,7 +178,7 @@ export class CoverageSubprovider extends Subprovider { private async _getContractCodeAsync(address: string): Promise { const payload = { method: 'eth_getCode', - params: [address, 'latest'], + params: [address, BlockParamLiteral.Latest], }; const jsonRPCResponsePayload = await this.emitPayloadAsync(payload); const contractCode: string = jsonRPCResponsePayload.result; diff --git a/packages/sol-cov/src/types.ts b/packages/sol-cov/src/types.ts index 01359d858..4c3de55a1 100644 --- a/packages/sol-cov/src/types.ts +++ b/packages/sol-cov/src/types.ts @@ -98,3 +98,7 @@ export interface TraceInfoExistingContract extends TraceInfoBase { } export type TraceInfo = TraceInfoNewContract | TraceInfoExistingContract; + +export enum BlockParamLiteral { + Latest = 'latest', +} -- cgit v1.2.3 From 447b305e3c50145696be715bc6f43523b0770220 Mon Sep 17 00:00:00 2001 From: Leonid Logvinov Date: Tue, 22 May 2018 11:18:09 -0700 Subject: Suppport subcalls in constructor --- packages/sol-cov/src/coverage_subprovider.ts | 36 ++++++++++++++++++++-------- 1 file changed, 26 insertions(+), 10 deletions(-) (limited to 'packages/sol-cov/src') diff --git a/packages/sol-cov/src/coverage_subprovider.ts b/packages/sol-cov/src/coverage_subprovider.ts index 3fd45bbd1..45b479c0e 100644 --- a/packages/sol-cov/src/coverage_subprovider.ts +++ b/packages/sol-cov/src/coverage_subprovider.ts @@ -123,16 +123,32 @@ export class CoverageSubprovider extends Subprovider { const jsonRPCResponsePayload = await this.emitPayloadAsync(payload); const trace: TransactionTrace = jsonRPCResponsePayload.result; if (address === constants.NEW_CONTRACT) { - // TODO handle calls to external contracts and contract creations from within the constructor - const structLogsOnDepth0 = _.filter(trace.structLogs, { depth: 0 }); - const coveredPcs = _.map(structLogsOnDepth0, log => log.pc); - const traceInfo: TraceInfoNewContract = { - coveredPcs, - txHash, - address: address as 'NEW_CONTRACT', - bytecode: data as string, - }; - this._coverageManager.appendTraceInfo(traceInfo); + const tracesByContractAddress = getTracesByContractAddress(trace.structLogs, address); + for (const subcallAddress of _.keys(tracesByContractAddress)) { + let traceInfo: TraceInfoNewContract | TraceInfoExistingContract; + if (subcallAddress === 'NEW_CONTRACT') { + const traceForThatSubcall = tracesByContractAddress[subcallAddress]; + const coveredPcs = _.map(traceForThatSubcall, log => log.pc); + traceInfo = { + coveredPcs, + txHash, + address: address as 'NEW_CONTRACT', + bytecode: data as string, + }; + } else { + payload = { method: 'eth_getCode', params: [subcallAddress, BlockParamLiteral.Latest] }; + const runtimeBytecode = (await this.emitPayloadAsync(payload)).result; + const traceForThatSubcall = tracesByContractAddress[subcallAddress]; + const coveredPcs = _.map(traceForThatSubcall, log => log.pc); + traceInfo = { + coveredPcs, + txHash, + address: subcallAddress, + runtimeBytecode, + }; + } + this._coverageManager.appendTraceInfo(traceInfo); + } } else { const tracesByContractAddress = getTracesByContractAddress(trace.structLogs, address); for (const subcallAddress of _.keys(tracesByContractAddress)) { -- cgit v1.2.3 From 6540343f456004549077f708f0d43533488fb4e4 Mon Sep 17 00:00:00 2001 From: Leonid Logvinov Date: Tue, 22 May 2018 13:20:58 -0700 Subject: Remove trace.json --- packages/sol-cov/src/trace.json | 3227 --------------------------------------- 1 file changed, 3227 deletions(-) delete mode 100644 packages/sol-cov/src/trace.json (limited to 'packages/sol-cov/src') diff --git a/packages/sol-cov/src/trace.json b/packages/sol-cov/src/trace.json deleted file mode 100644 index 77ec20a72..000000000 --- a/packages/sol-cov/src/trace.json +++ /dev/null @@ -1,3227 +0,0 @@ -[ - { - "depth": 0, - "error": "", - "gas": 21216, - "gasCost": 21784, - "memory": null, - "op": "PUSH1", - "pc": 0, - "stack": [], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 21213, - "gasCost": 3, - "memory": null, - "op": "PUSH1", - "pc": 2, - "stack": ["0000000000000000000000000000000000000000000000000000000000000080"], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 21210, - "gasCost": 3, - "memory": null, - "op": "MSTORE", - "pc": 4, - "stack": [ - "0000000000000000000000000000000000000000000000000000000000000080", - "0000000000000000000000000000000000000000000000000000000000000040" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 21198, - "gasCost": 12, - "memory": null, - "op": "PUSH1", - "pc": 5, - "stack": [], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 21195, - "gasCost": 3, - "memory": null, - "op": "CALLDATASIZE", - "pc": 7, - "stack": ["0000000000000000000000000000000000000000000000000000000000000004"], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 21193, - "gasCost": 2, - "memory": null, - "op": "LT", - "pc": 8, - "stack": [ - "0000000000000000000000000000000000000000000000000000000000000004", - "0000000000000000000000000000000000000000000000000000000000000024" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 21190, - "gasCost": 3, - "memory": null, - "op": "PUSH2", - "pc": 9, - "stack": ["0000000000000000000000000000000000000000000000000000000000000000"], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 21187, - "gasCost": 3, - "memory": null, - "op": "JUMPI", - "pc": 12, - "stack": [ - "0000000000000000000000000000000000000000000000000000000000000000", - "00000000000000000000000000000000000000000000000000000000000000af" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 21177, - "gasCost": 10, - "memory": null, - "op": "PUSH1", - "pc": 13, - "stack": [], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 21174, - "gasCost": 3, - "memory": null, - "op": "CALLDATALOAD", - "pc": 15, - "stack": ["0000000000000000000000000000000000000000000000000000000000000000"], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 21171, - "gasCost": 3, - "memory": null, - "op": "PUSH29", - "pc": 16, - "stack": ["2e1a7d4d0000000000000000000000000000000000000000000000000de0b6b3"], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 21168, - "gasCost": 3, - "memory": null, - "op": "SWAP1", - "pc": 46, - "stack": [ - "2e1a7d4d0000000000000000000000000000000000000000000000000de0b6b3", - "0000000100000000000000000000000000000000000000000000000000000000" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 21165, - "gasCost": 3, - "memory": null, - "op": "DIV", - "pc": 47, - "stack": [ - "0000000100000000000000000000000000000000000000000000000000000000", - "2e1a7d4d0000000000000000000000000000000000000000000000000de0b6b3" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 21160, - "gasCost": 5, - "memory": null, - "op": "PUSH4", - "pc": 48, - "stack": ["000000000000000000000000000000000000000000000000000000002e1a7d4d"], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 21157, - "gasCost": 3, - "memory": null, - "op": "AND", - "pc": 53, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "00000000000000000000000000000000000000000000000000000000ffffffff" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 21154, - "gasCost": 3, - "memory": null, - "op": "DUP1", - "pc": 54, - "stack": ["000000000000000000000000000000000000000000000000000000002e1a7d4d"], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 21151, - "gasCost": 3, - "memory": null, - "op": "PUSH4", - "pc": 55, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "000000000000000000000000000000000000000000000000000000002e1a7d4d" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 21148, - "gasCost": 3, - "memory": null, - "op": "EQ", - "pc": 60, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000006fdde03" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 21145, - "gasCost": 3, - "memory": null, - "op": "PUSH2", - "pc": 61, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000000" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 21142, - "gasCost": 3, - "memory": null, - "op": "JUMPI", - "pc": 64, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000000", - "00000000000000000000000000000000000000000000000000000000000000b9" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 21132, - "gasCost": 10, - "memory": null, - "op": "DUP1", - "pc": 65, - "stack": ["000000000000000000000000000000000000000000000000000000002e1a7d4d"], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 21129, - "gasCost": 3, - "memory": null, - "op": "PUSH4", - "pc": 66, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "000000000000000000000000000000000000000000000000000000002e1a7d4d" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 21126, - "gasCost": 3, - "memory": null, - "op": "EQ", - "pc": 71, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "00000000000000000000000000000000000000000000000000000000095ea7b3" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 21123, - "gasCost": 3, - "memory": null, - "op": "PUSH2", - "pc": 72, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000000" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 21120, - "gasCost": 3, - "memory": null, - "op": "JUMPI", - "pc": 75, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000000", - "0000000000000000000000000000000000000000000000000000000000000149" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 21110, - "gasCost": 10, - "memory": null, - "op": "DUP1", - "pc": 76, - "stack": ["000000000000000000000000000000000000000000000000000000002e1a7d4d"], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 21107, - "gasCost": 3, - "memory": null, - "op": "PUSH4", - "pc": 77, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "000000000000000000000000000000000000000000000000000000002e1a7d4d" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 21104, - "gasCost": 3, - "memory": null, - "op": "EQ", - "pc": 82, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000018160ddd" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 21101, - "gasCost": 3, - "memory": null, - "op": "PUSH2", - "pc": 83, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000000" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 21098, - "gasCost": 3, - "memory": null, - "op": "JUMPI", - "pc": 86, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000000", - "00000000000000000000000000000000000000000000000000000000000001ae" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 21088, - "gasCost": 10, - "memory": null, - "op": "DUP1", - "pc": 87, - "stack": ["000000000000000000000000000000000000000000000000000000002e1a7d4d"], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 21085, - "gasCost": 3, - "memory": null, - "op": "PUSH4", - "pc": 88, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "000000000000000000000000000000000000000000000000000000002e1a7d4d" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 21082, - "gasCost": 3, - "memory": null, - "op": "EQ", - "pc": 93, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000023b872dd" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 21079, - "gasCost": 3, - "memory": null, - "op": "PUSH2", - "pc": 94, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000000" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 21076, - "gasCost": 3, - "memory": null, - "op": "JUMPI", - "pc": 97, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000000", - "00000000000000000000000000000000000000000000000000000000000001d9" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 21066, - "gasCost": 10, - "memory": null, - "op": "DUP1", - "pc": 98, - "stack": ["000000000000000000000000000000000000000000000000000000002e1a7d4d"], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 21063, - "gasCost": 3, - "memory": null, - "op": "PUSH4", - "pc": 99, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "000000000000000000000000000000000000000000000000000000002e1a7d4d" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 21060, - "gasCost": 3, - "memory": null, - "op": "EQ", - "pc": 104, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "000000000000000000000000000000000000000000000000000000002e1a7d4d" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 21057, - "gasCost": 3, - "memory": null, - "op": "PUSH2", - "pc": 105, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000001" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 21054, - "gasCost": 3, - "memory": null, - "op": "JUMPI", - "pc": 108, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000001", - "000000000000000000000000000000000000000000000000000000000000025e" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 21044, - "gasCost": 10, - "memory": null, - "op": "JUMPDEST", - "pc": 606, - "stack": ["000000000000000000000000000000000000000000000000000000002e1a7d4d"], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 21043, - "gasCost": 1, - "memory": null, - "op": "CALLVALUE", - "pc": 607, - "stack": ["000000000000000000000000000000000000000000000000000000002e1a7d4d"], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 21041, - "gasCost": 2, - "memory": null, - "op": "DUP1", - "pc": 608, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000000" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 21038, - "gasCost": 3, - "memory": null, - "op": "ISZERO", - "pc": 609, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000000", - "0000000000000000000000000000000000000000000000000000000000000000" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 21035, - "gasCost": 3, - "memory": null, - "op": "PUSH2", - "pc": 610, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000000", - "0000000000000000000000000000000000000000000000000000000000000001" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 21032, - "gasCost": 3, - "memory": null, - "op": "JUMPI", - "pc": 613, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000000", - "0000000000000000000000000000000000000000000000000000000000000001", - "000000000000000000000000000000000000000000000000000000000000026a" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 21022, - "gasCost": 10, - "memory": null, - "op": "JUMPDEST", - "pc": 618, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000000" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 21021, - "gasCost": 1, - "memory": null, - "op": "POP", - "pc": 619, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000000" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 21019, - "gasCost": 2, - "memory": null, - "op": "PUSH2", - "pc": 620, - "stack": ["000000000000000000000000000000000000000000000000000000002e1a7d4d"], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 21016, - "gasCost": 3, - "memory": null, - "op": "PUSH1", - "pc": 623, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 21013, - "gasCost": 3, - "memory": null, - "op": "DUP1", - "pc": 625, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289", - "0000000000000000000000000000000000000000000000000000000000000004" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 21010, - "gasCost": 3, - "memory": null, - "op": "CALLDATASIZE", - "pc": 626, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289", - "0000000000000000000000000000000000000000000000000000000000000004", - "0000000000000000000000000000000000000000000000000000000000000004" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 21008, - "gasCost": 2, - "memory": null, - "op": "SUB", - "pc": 627, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289", - "0000000000000000000000000000000000000000000000000000000000000004", - "0000000000000000000000000000000000000000000000000000000000000004", - "0000000000000000000000000000000000000000000000000000000000000024" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 21005, - "gasCost": 3, - "memory": null, - "op": "DUP2", - "pc": 628, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289", - "0000000000000000000000000000000000000000000000000000000000000004", - "0000000000000000000000000000000000000000000000000000000000000020" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 21002, - "gasCost": 3, - "memory": null, - "op": "ADD", - "pc": 629, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289", - "0000000000000000000000000000000000000000000000000000000000000004", - "0000000000000000000000000000000000000000000000000000000000000020", - "0000000000000000000000000000000000000000000000000000000000000004" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 20999, - "gasCost": 3, - "memory": null, - "op": "SWAP1", - "pc": 630, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289", - "0000000000000000000000000000000000000000000000000000000000000004", - "0000000000000000000000000000000000000000000000000000000000000024" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 20996, - "gasCost": 3, - "memory": null, - "op": "DUP1", - "pc": 631, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289", - "0000000000000000000000000000000000000000000000000000000000000024", - "0000000000000000000000000000000000000000000000000000000000000004" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 20993, - "gasCost": 3, - "memory": null, - "op": "DUP1", - "pc": 632, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289", - "0000000000000000000000000000000000000000000000000000000000000024", - "0000000000000000000000000000000000000000000000000000000000000004", - "0000000000000000000000000000000000000000000000000000000000000004" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 20990, - "gasCost": 3, - "memory": null, - "op": "CALLDATALOAD", - "pc": 633, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289", - "0000000000000000000000000000000000000000000000000000000000000024", - "0000000000000000000000000000000000000000000000000000000000000004", - "0000000000000000000000000000000000000000000000000000000000000004", - "0000000000000000000000000000000000000000000000000000000000000004" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 20987, - "gasCost": 3, - "memory": null, - "op": "SWAP1", - "pc": 634, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289", - "0000000000000000000000000000000000000000000000000000000000000024", - "0000000000000000000000000000000000000000000000000000000000000004", - "0000000000000000000000000000000000000000000000000000000000000004", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 20984, - "gasCost": 3, - "memory": null, - "op": "PUSH1", - "pc": 635, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289", - "0000000000000000000000000000000000000000000000000000000000000024", - "0000000000000000000000000000000000000000000000000000000000000004", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000000000000000000000000000000000000000000004" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 20981, - "gasCost": 3, - "memory": null, - "op": "ADD", - "pc": 637, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289", - "0000000000000000000000000000000000000000000000000000000000000024", - "0000000000000000000000000000000000000000000000000000000000000004", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000000000000000000000000000000000000000000004", - "0000000000000000000000000000000000000000000000000000000000000020" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 20978, - "gasCost": 3, - "memory": null, - "op": "SWAP1", - "pc": 638, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289", - "0000000000000000000000000000000000000000000000000000000000000024", - "0000000000000000000000000000000000000000000000000000000000000004", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000000000000000000000000000000000000000000024" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 20975, - "gasCost": 3, - "memory": null, - "op": "SWAP3", - "pc": 639, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289", - "0000000000000000000000000000000000000000000000000000000000000024", - "0000000000000000000000000000000000000000000000000000000000000004", - "0000000000000000000000000000000000000000000000000000000000000024", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 20972, - "gasCost": 3, - "memory": null, - "op": "SWAP2", - "pc": 640, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000000000000000000000000000000000000000000004", - "0000000000000000000000000000000000000000000000000000000000000024", - "0000000000000000000000000000000000000000000000000000000000000024" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 20969, - "gasCost": 3, - "memory": null, - "op": "SWAP1", - "pc": 641, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000000000000000000000000000000000000000000024", - "0000000000000000000000000000000000000000000000000000000000000024", - "0000000000000000000000000000000000000000000000000000000000000004" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 20966, - "gasCost": 3, - "memory": null, - "op": "POP", - "pc": 642, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000000000000000000000000000000000000000000024", - "0000000000000000000000000000000000000000000000000000000000000004", - "0000000000000000000000000000000000000000000000000000000000000024" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 20964, - "gasCost": 2, - "memory": null, - "op": "POP", - "pc": 643, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000000000000000000000000000000000000000000024", - "0000000000000000000000000000000000000000000000000000000000000004" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 20962, - "gasCost": 2, - "memory": null, - "op": "POP", - "pc": 644, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000000000000000000000000000000000000000000024" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 20960, - "gasCost": 2, - "memory": null, - "op": "PUSH2", - "pc": 645, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 20957, - "gasCost": 3, - "memory": null, - "op": "JUMP", - "pc": 648, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000000000000000000000000000000000000000000a22" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 20949, - "gasCost": 8, - "memory": null, - "op": "JUMPDEST", - "pc": 2594, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 20948, - "gasCost": 1, - "memory": null, - "op": "DUP1", - "pc": 2595, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 20945, - "gasCost": 3, - "memory": null, - "op": "PUSH1", - "pc": 2596, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 20942, - "gasCost": 3, - "memory": null, - "op": "PUSH1", - "pc": 2598, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000000000000000000000000000000000000000000003" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 20939, - "gasCost": 3, - "memory": null, - "op": "CALLER", - "pc": 2600, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000000000000000000000000000000000000000000003", - "0000000000000000000000000000000000000000000000000000000000000000" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 20937, - "gasCost": 2, - "memory": null, - "op": "PUSH20", - "pc": 2601, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000000000000000000000000000000000000000000003", - "0000000000000000000000000000000000000000000000000000000000000000", - "0000000000000000000000005409ed021d9299bf6814279a6a1411a7e866a631" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 20934, - "gasCost": 3, - "memory": null, - "op": "AND", - "pc": 2622, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000000000000000000000000000000000000000000003", - "0000000000000000000000000000000000000000000000000000000000000000", - "0000000000000000000000005409ed021d9299bf6814279a6a1411a7e866a631", - "000000000000000000000000ffffffffffffffffffffffffffffffffffffffff" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 20931, - "gasCost": 3, - "memory": null, - "op": "PUSH20", - "pc": 2623, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000000000000000000000000000000000000000000003", - "0000000000000000000000000000000000000000000000000000000000000000", - "0000000000000000000000005409ed021d9299bf6814279a6a1411a7e866a631" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 20928, - "gasCost": 3, - "memory": null, - "op": "AND", - "pc": 2644, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000000000000000000000000000000000000000000003", - "0000000000000000000000000000000000000000000000000000000000000000", - "0000000000000000000000005409ed021d9299bf6814279a6a1411a7e866a631", - "000000000000000000000000ffffffffffffffffffffffffffffffffffffffff" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 20925, - "gasCost": 3, - "memory": null, - "op": "DUP2", - "pc": 2645, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000000000000000000000000000000000000000000003", - "0000000000000000000000000000000000000000000000000000000000000000", - "0000000000000000000000005409ed021d9299bf6814279a6a1411a7e866a631" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 20922, - "gasCost": 3, - "memory": null, - "op": "MSTORE", - "pc": 2646, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000000000000000000000000000000000000000000003", - "0000000000000000000000000000000000000000000000000000000000000000", - "0000000000000000000000005409ed021d9299bf6814279a6a1411a7e866a631", - "0000000000000000000000000000000000000000000000000000000000000000" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 20919, - "gasCost": 3, - "memory": null, - "op": "PUSH1", - "pc": 2647, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000000000000000000000000000000000000000000003", - "0000000000000000000000000000000000000000000000000000000000000000" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 20916, - "gasCost": 3, - "memory": null, - "op": "ADD", - "pc": 2649, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000000000000000000000000000000000000000000003", - "0000000000000000000000000000000000000000000000000000000000000000", - "0000000000000000000000000000000000000000000000000000000000000020" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 20913, - "gasCost": 3, - "memory": null, - "op": "SWAP1", - "pc": 2650, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000000000000000000000000000000000000000000003", - "0000000000000000000000000000000000000000000000000000000000000020" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 20910, - "gasCost": 3, - "memory": null, - "op": "DUP2", - "pc": 2651, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000000000000000000000000000000000000000000020", - "0000000000000000000000000000000000000000000000000000000000000003" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 20907, - "gasCost": 3, - "memory": null, - "op": "MSTORE", - "pc": 2652, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000000000000000000000000000000000000000000020", - "0000000000000000000000000000000000000000000000000000000000000003", - "0000000000000000000000000000000000000000000000000000000000000020" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 20904, - "gasCost": 3, - "memory": null, - "op": "PUSH1", - "pc": 2653, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000000000000000000000000000000000000000000020" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 20901, - "gasCost": 3, - "memory": null, - "op": "ADD", - "pc": 2655, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000000000000000000000000000000000000000000020", - "0000000000000000000000000000000000000000000000000000000000000020" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 20898, - "gasCost": 3, - "memory": null, - "op": "PUSH1", - "pc": 2656, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000000000000000000000000000000000000000000040" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 20895, - "gasCost": 3, - "memory": null, - "op": "SHA3", - "pc": 2658, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000000000000000000000000000000000000000000040", - "0000000000000000000000000000000000000000000000000000000000000000" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 20853, - "gasCost": 42, - "memory": null, - "op": "SLOAD", - "pc": 2659, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "e8af3d9c3f2014e95dfc13b23432f282fb88d28d9985b050581f714c3cecb355" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 20653, - "gasCost": 200, - "memory": null, - "op": "LT", - "pc": 2660, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 20650, - "gasCost": 3, - "memory": null, - "op": "ISZERO", - "pc": 2661, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000000000000000000000000000000000000000000000" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 20647, - "gasCost": 3, - "memory": null, - "op": "ISZERO", - "pc": 2662, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000000000000000000000000000000000000000000001" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 20644, - "gasCost": 3, - "memory": null, - "op": "ISZERO", - "pc": 2663, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000000000000000000000000000000000000000000000" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 20641, - "gasCost": 3, - "memory": null, - "op": "PUSH2", - "pc": 2664, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000000000000000000000000000000000000000000001" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 20638, - "gasCost": 3, - "memory": null, - "op": "JUMPI", - "pc": 2667, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000000000000000000000000000000000000000000001", - "0000000000000000000000000000000000000000000000000000000000000a70" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 20628, - "gasCost": 10, - "memory": null, - "op": "JUMPDEST", - "pc": 2672, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 20627, - "gasCost": 1, - "memory": null, - "op": "DUP1", - "pc": 2673, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 20624, - "gasCost": 3, - "memory": null, - "op": "PUSH1", - "pc": 2674, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 20621, - "gasCost": 3, - "memory": null, - "op": "PUSH1", - "pc": 2676, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000000000000000000000000000000000000000000003" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 20618, - "gasCost": 3, - "memory": null, - "op": "CALLER", - "pc": 2678, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000000000000000000000000000000000000000000003", - "0000000000000000000000000000000000000000000000000000000000000000" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 20616, - "gasCost": 2, - "memory": null, - "op": "PUSH20", - "pc": 2679, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000000000000000000000000000000000000000000003", - "0000000000000000000000000000000000000000000000000000000000000000", - "0000000000000000000000005409ed021d9299bf6814279a6a1411a7e866a631" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 20613, - "gasCost": 3, - "memory": null, - "op": "AND", - "pc": 2700, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000000000000000000000000000000000000000000003", - "0000000000000000000000000000000000000000000000000000000000000000", - "0000000000000000000000005409ed021d9299bf6814279a6a1411a7e866a631", - "000000000000000000000000ffffffffffffffffffffffffffffffffffffffff" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 20610, - "gasCost": 3, - "memory": null, - "op": "PUSH20", - "pc": 2701, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000000000000000000000000000000000000000000003", - "0000000000000000000000000000000000000000000000000000000000000000", - "0000000000000000000000005409ed021d9299bf6814279a6a1411a7e866a631" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 20607, - "gasCost": 3, - "memory": null, - "op": "AND", - "pc": 2722, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000000000000000000000000000000000000000000003", - "0000000000000000000000000000000000000000000000000000000000000000", - "0000000000000000000000005409ed021d9299bf6814279a6a1411a7e866a631", - "000000000000000000000000ffffffffffffffffffffffffffffffffffffffff" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 20604, - "gasCost": 3, - "memory": null, - "op": "DUP2", - "pc": 2723, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000000000000000000000000000000000000000000003", - "0000000000000000000000000000000000000000000000000000000000000000", - "0000000000000000000000005409ed021d9299bf6814279a6a1411a7e866a631" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 20601, - "gasCost": 3, - "memory": null, - "op": "MSTORE", - "pc": 2724, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000000000000000000000000000000000000000000003", - "0000000000000000000000000000000000000000000000000000000000000000", - "0000000000000000000000005409ed021d9299bf6814279a6a1411a7e866a631", - "0000000000000000000000000000000000000000000000000000000000000000" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 20598, - "gasCost": 3, - "memory": null, - "op": "PUSH1", - "pc": 2725, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000000000000000000000000000000000000000000003", - "0000000000000000000000000000000000000000000000000000000000000000" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 20595, - "gasCost": 3, - "memory": null, - "op": "ADD", - "pc": 2727, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000000000000000000000000000000000000000000003", - "0000000000000000000000000000000000000000000000000000000000000000", - "0000000000000000000000000000000000000000000000000000000000000020" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 20592, - "gasCost": 3, - "memory": null, - "op": "SWAP1", - "pc": 2728, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000000000000000000000000000000000000000000003", - "0000000000000000000000000000000000000000000000000000000000000020" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 20589, - "gasCost": 3, - "memory": null, - "op": "DUP2", - "pc": 2729, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000000000000000000000000000000000000000000020", - "0000000000000000000000000000000000000000000000000000000000000003" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 20586, - "gasCost": 3, - "memory": null, - "op": "MSTORE", - "pc": 2730, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000000000000000000000000000000000000000000020", - "0000000000000000000000000000000000000000000000000000000000000003", - "0000000000000000000000000000000000000000000000000000000000000020" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 20583, - "gasCost": 3, - "memory": null, - "op": "PUSH1", - "pc": 2731, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000000000000000000000000000000000000000000020" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 20580, - "gasCost": 3, - "memory": null, - "op": "ADD", - "pc": 2733, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000000000000000000000000000000000000000000020", - "0000000000000000000000000000000000000000000000000000000000000020" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 20577, - "gasCost": 3, - "memory": null, - "op": "PUSH1", - "pc": 2734, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000000000000000000000000000000000000000000040" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 20574, - "gasCost": 3, - "memory": null, - "op": "SHA3", - "pc": 2736, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000000000000000000000000000000000000000000040", - "0000000000000000000000000000000000000000000000000000000000000000" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 20532, - "gasCost": 42, - "memory": null, - "op": "PUSH1", - "pc": 2737, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "e8af3d9c3f2014e95dfc13b23432f282fb88d28d9985b050581f714c3cecb355" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 20529, - "gasCost": 3, - "memory": null, - "op": "DUP3", - "pc": 2739, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "e8af3d9c3f2014e95dfc13b23432f282fb88d28d9985b050581f714c3cecb355", - "0000000000000000000000000000000000000000000000000000000000000000" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 20526, - "gasCost": 3, - "memory": null, - "op": "DUP3", - "pc": 2740, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "e8af3d9c3f2014e95dfc13b23432f282fb88d28d9985b050581f714c3cecb355", - "0000000000000000000000000000000000000000000000000000000000000000", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 20523, - "gasCost": 3, - "memory": null, - "op": "SLOAD", - "pc": 2741, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "e8af3d9c3f2014e95dfc13b23432f282fb88d28d9985b050581f714c3cecb355", - "0000000000000000000000000000000000000000000000000000000000000000", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "e8af3d9c3f2014e95dfc13b23432f282fb88d28d9985b050581f714c3cecb355" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 20323, - "gasCost": 200, - "memory": null, - "op": "SUB", - "pc": 2742, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "e8af3d9c3f2014e95dfc13b23432f282fb88d28d9985b050581f714c3cecb355", - "0000000000000000000000000000000000000000000000000000000000000000", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 20320, - "gasCost": 3, - "memory": null, - "op": "SWAP3", - "pc": 2743, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "e8af3d9c3f2014e95dfc13b23432f282fb88d28d9985b050581f714c3cecb355", - "0000000000000000000000000000000000000000000000000000000000000000", - "0000000000000000000000000000000000000000000000000000000000000000" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 20317, - "gasCost": 3, - "memory": null, - "op": "POP", - "pc": 2744, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000000000000000000000000000000000000000000000", - "e8af3d9c3f2014e95dfc13b23432f282fb88d28d9985b050581f714c3cecb355", - "0000000000000000000000000000000000000000000000000000000000000000", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 20315, - "gasCost": 2, - "memory": null, - "op": "POP", - "pc": 2745, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000000000000000000000000000000000000000000000", - "e8af3d9c3f2014e95dfc13b23432f282fb88d28d9985b050581f714c3cecb355", - "0000000000000000000000000000000000000000000000000000000000000000" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 20313, - "gasCost": 2, - "memory": null, - "op": "DUP2", - "pc": 2746, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000000000000000000000000000000000000000000000", - "e8af3d9c3f2014e95dfc13b23432f282fb88d28d9985b050581f714c3cecb355" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 20310, - "gasCost": 3, - "memory": null, - "op": "SWAP1", - "pc": 2747, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000000000000000000000000000000000000000000000", - "e8af3d9c3f2014e95dfc13b23432f282fb88d28d9985b050581f714c3cecb355", - "0000000000000000000000000000000000000000000000000000000000000000" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 20307, - "gasCost": 3, - "memory": null, - "op": "SSTORE", - "pc": 2748, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000000000000000000000000000000000000000000000", - "0000000000000000000000000000000000000000000000000000000000000000", - "e8af3d9c3f2014e95dfc13b23432f282fb88d28d9985b050581f714c3cecb355" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 15307, - "gasCost": 5000, - "memory": null, - "op": "POP", - "pc": 2749, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000000000000000000000000000000000000000000000" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 15305, - "gasCost": 2, - "memory": null, - "op": "CALLER", - "pc": 2750, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 15303, - "gasCost": 2, - "memory": null, - "op": "PUSH20", - "pc": 2751, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000005409ed021d9299bf6814279a6a1411a7e866a631" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 15300, - "gasCost": 3, - "memory": null, - "op": "AND", - "pc": 2772, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000005409ed021d9299bf6814279a6a1411a7e866a631", - "000000000000000000000000ffffffffffffffffffffffffffffffffffffffff" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 15297, - "gasCost": 3, - "memory": null, - "op": "PUSH2", - "pc": 2773, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000005409ed021d9299bf6814279a6a1411a7e866a631" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 15294, - "gasCost": 3, - "memory": null, - "op": "DUP3", - "pc": 2776, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000005409ed021d9299bf6814279a6a1411a7e866a631", - "00000000000000000000000000000000000000000000000000000000000008fc" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 15291, - "gasCost": 3, - "memory": null, - "op": "SWAP1", - "pc": 2777, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000005409ed021d9299bf6814279a6a1411a7e866a631", - "00000000000000000000000000000000000000000000000000000000000008fc", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 15288, - "gasCost": 3, - "memory": null, - "op": "DUP2", - "pc": 2778, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000005409ed021d9299bf6814279a6a1411a7e866a631", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "00000000000000000000000000000000000000000000000000000000000008fc" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 15285, - "gasCost": 3, - "memory": null, - "op": "ISZERO", - "pc": 2779, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000005409ed021d9299bf6814279a6a1411a7e866a631", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "00000000000000000000000000000000000000000000000000000000000008fc", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 15282, - "gasCost": 3, - "memory": null, - "op": "MUL", - "pc": 2780, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000005409ed021d9299bf6814279a6a1411a7e866a631", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "00000000000000000000000000000000000000000000000000000000000008fc", - "0000000000000000000000000000000000000000000000000000000000000000" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 15277, - "gasCost": 5, - "memory": null, - "op": "SWAP1", - "pc": 2781, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000005409ed021d9299bf6814279a6a1411a7e866a631", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000000000000000000000000000000000000000000000" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 15274, - "gasCost": 3, - "memory": null, - "op": "PUSH1", - "pc": 2782, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000005409ed021d9299bf6814279a6a1411a7e866a631", - "0000000000000000000000000000000000000000000000000000000000000000", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 15271, - "gasCost": 3, - "memory": null, - "op": "MLOAD", - "pc": 2784, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000005409ed021d9299bf6814279a6a1411a7e866a631", - "0000000000000000000000000000000000000000000000000000000000000000", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000000000000000000000000000000000000000000040" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 15268, - "gasCost": 3, - "memory": null, - "op": "PUSH1", - "pc": 2785, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000005409ed021d9299bf6814279a6a1411a7e866a631", - "0000000000000000000000000000000000000000000000000000000000000000", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000000000000000000000000000000000000000000080" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 15265, - "gasCost": 3, - "memory": null, - "op": "PUSH1", - "pc": 2787, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000005409ed021d9299bf6814279a6a1411a7e866a631", - "0000000000000000000000000000000000000000000000000000000000000000", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000000000000000000000000000000000000000000080", - "0000000000000000000000000000000000000000000000000000000000000000" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 15262, - "gasCost": 3, - "memory": null, - "op": "MLOAD", - "pc": 2789, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000005409ed021d9299bf6814279a6a1411a7e866a631", - "0000000000000000000000000000000000000000000000000000000000000000", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000000000000000000000000000000000000000000080", - "0000000000000000000000000000000000000000000000000000000000000000", - "0000000000000000000000000000000000000000000000000000000000000040" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 15259, - "gasCost": 3, - "memory": null, - "op": "DUP1", - "pc": 2790, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000005409ed021d9299bf6814279a6a1411a7e866a631", - "0000000000000000000000000000000000000000000000000000000000000000", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000000000000000000000000000000000000000000080", - "0000000000000000000000000000000000000000000000000000000000000000", - "0000000000000000000000000000000000000000000000000000000000000080" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 15256, - "gasCost": 3, - "memory": null, - "op": "DUP4", - "pc": 2791, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000005409ed021d9299bf6814279a6a1411a7e866a631", - "0000000000000000000000000000000000000000000000000000000000000000", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000000000000000000000000000000000000000000080", - "0000000000000000000000000000000000000000000000000000000000000000", - "0000000000000000000000000000000000000000000000000000000000000080", - "0000000000000000000000000000000000000000000000000000000000000080" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 15253, - "gasCost": 3, - "memory": null, - "op": "SUB", - "pc": 2792, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000005409ed021d9299bf6814279a6a1411a7e866a631", - "0000000000000000000000000000000000000000000000000000000000000000", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000000000000000000000000000000000000000000080", - "0000000000000000000000000000000000000000000000000000000000000000", - "0000000000000000000000000000000000000000000000000000000000000080", - "0000000000000000000000000000000000000000000000000000000000000080", - "0000000000000000000000000000000000000000000000000000000000000080" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 15250, - "gasCost": 3, - "memory": null, - "op": "DUP2", - "pc": 2793, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000005409ed021d9299bf6814279a6a1411a7e866a631", - "0000000000000000000000000000000000000000000000000000000000000000", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000000000000000000000000000000000000000000080", - "0000000000000000000000000000000000000000000000000000000000000000", - "0000000000000000000000000000000000000000000000000000000000000080", - "0000000000000000000000000000000000000000000000000000000000000000" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 15247, - "gasCost": 3, - "memory": null, - "op": "DUP6", - "pc": 2794, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000005409ed021d9299bf6814279a6a1411a7e866a631", - "0000000000000000000000000000000000000000000000000000000000000000", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000000000000000000000000000000000000000000080", - "0000000000000000000000000000000000000000000000000000000000000000", - "0000000000000000000000000000000000000000000000000000000000000080", - "0000000000000000000000000000000000000000000000000000000000000000", - "0000000000000000000000000000000000000000000000000000000000000080" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 15244, - "gasCost": 3, - "memory": null, - "op": "DUP9", - "pc": 2795, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000005409ed021d9299bf6814279a6a1411a7e866a631", - "0000000000000000000000000000000000000000000000000000000000000000", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000000000000000000000000000000000000000000080", - "0000000000000000000000000000000000000000000000000000000000000000", - "0000000000000000000000000000000000000000000000000000000000000080", - "0000000000000000000000000000000000000000000000000000000000000000", - "0000000000000000000000000000000000000000000000000000000000000080", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 15241, - "gasCost": 3, - "memory": null, - "op": "DUP9", - "pc": 2796, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000005409ed021d9299bf6814279a6a1411a7e866a631", - "0000000000000000000000000000000000000000000000000000000000000000", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000000000000000000000000000000000000000000080", - "0000000000000000000000000000000000000000000000000000000000000000", - "0000000000000000000000000000000000000000000000000000000000000080", - "0000000000000000000000000000000000000000000000000000000000000000", - "0000000000000000000000000000000000000000000000000000000000000080", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000005409ed021d9299bf6814279a6a1411a7e866a631" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 15238, - "gasCost": 3, - "memory": null, - "op": "CALL", - "pc": 2797, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000005409ed021d9299bf6814279a6a1411a7e866a631", - "0000000000000000000000000000000000000000000000000000000000000000", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000000000000000000000000000000000000000000080", - "0000000000000000000000000000000000000000000000000000000000000000", - "0000000000000000000000000000000000000000000000000000000000000080", - "0000000000000000000000000000000000000000000000000000000000000000", - "0000000000000000000000000000000000000000000000000000000000000080", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000005409ed021d9299bf6814279a6a1411a7e866a631", - "0000000000000000000000000000000000000000000000000000000000000000" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 7838, - "gasCost": 7400, - "memory": null, - "op": "SWAP4", - "pc": 2798, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000005409ed021d9299bf6814279a6a1411a7e866a631", - "00000000000000000000000000000000000000000000000000000000000008fc", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000000000000000000000000000000000000000000080", - "0000000000000000000000000000000000000000000000000000000000000001" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 7835, - "gasCost": 3, - "memory": null, - "op": "POP", - "pc": 2799, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000000000000000000000000000000000000000000001", - "00000000000000000000000000000000000000000000000000000000000008fc", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000000000000000000000000000000000000000000080", - "0000000000000000000000005409ed021d9299bf6814279a6a1411a7e866a631" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 7833, - "gasCost": 2, - "memory": null, - "op": "POP", - "pc": 2800, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000000000000000000000000000000000000000000001", - "00000000000000000000000000000000000000000000000000000000000008fc", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000000000000000000000000000000000000000000080" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 7831, - "gasCost": 2, - "memory": null, - "op": "POP", - "pc": 2801, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000000000000000000000000000000000000000000001", - "00000000000000000000000000000000000000000000000000000000000008fc", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 7829, - "gasCost": 2, - "memory": null, - "op": "POP", - "pc": 2802, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000000000000000000000000000000000000000000001", - "00000000000000000000000000000000000000000000000000000000000008fc" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 7827, - "gasCost": 2, - "memory": null, - "op": "ISZERO", - "pc": 2803, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000000000000000000000000000000000000000000001" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 7824, - "gasCost": 3, - "memory": null, - "op": "DUP1", - "pc": 2804, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000000000000000000000000000000000000000000000" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 7821, - "gasCost": 3, - "memory": null, - "op": "ISZERO", - "pc": 2805, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000000000000000000000000000000000000000000000", - "0000000000000000000000000000000000000000000000000000000000000000" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 7818, - "gasCost": 3, - "memory": null, - "op": "PUSH2", - "pc": 2806, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000000000000000000000000000000000000000000000", - "0000000000000000000000000000000000000000000000000000000000000001" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 7815, - "gasCost": 3, - "memory": null, - "op": "JUMPI", - "pc": 2809, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000000000000000000000000000000000000000000000", - "0000000000000000000000000000000000000000000000000000000000000001", - "0000000000000000000000000000000000000000000000000000000000000b03" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 7805, - "gasCost": 10, - "memory": null, - "op": "JUMPDEST", - "pc": 2819, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000000000000000000000000000000000000000000000" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 7804, - "gasCost": 1, - "memory": null, - "op": "POP", - "pc": 2820, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000000000000000000000000000000000000000000000" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 7802, - "gasCost": 2, - "memory": null, - "op": "CALLER", - "pc": 2821, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 7800, - "gasCost": 2, - "memory": null, - "op": "PUSH20", - "pc": 2822, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000005409ed021d9299bf6814279a6a1411a7e866a631" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 7797, - "gasCost": 3, - "memory": null, - "op": "AND", - "pc": 2843, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000005409ed021d9299bf6814279a6a1411a7e866a631", - "000000000000000000000000ffffffffffffffffffffffffffffffffffffffff" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 7794, - "gasCost": 3, - "memory": null, - "op": "PUSH32", - "pc": 2844, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000005409ed021d9299bf6814279a6a1411a7e866a631" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 7791, - "gasCost": 3, - "memory": null, - "op": "DUP3", - "pc": 2877, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000005409ed021d9299bf6814279a6a1411a7e866a631", - "7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b65" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 7788, - "gasCost": 3, - "memory": null, - "op": "PUSH1", - "pc": 2878, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000005409ed021d9299bf6814279a6a1411a7e866a631", - "7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b65", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 7785, - "gasCost": 3, - "memory": null, - "op": "MLOAD", - "pc": 2880, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000005409ed021d9299bf6814279a6a1411a7e866a631", - "7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b65", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000000000000000000000000000000000000000000040" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 7782, - "gasCost": 3, - "memory": null, - "op": "DUP1", - "pc": 2881, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000005409ed021d9299bf6814279a6a1411a7e866a631", - "7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b65", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000000000000000000000000000000000000000000080" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 7779, - "gasCost": 3, - "memory": null, - "op": "DUP3", - "pc": 2882, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000005409ed021d9299bf6814279a6a1411a7e866a631", - "7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b65", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000000000000000000000000000000000000000000080", - "0000000000000000000000000000000000000000000000000000000000000080" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 7776, - "gasCost": 3, - "memory": null, - "op": "DUP2", - "pc": 2883, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000005409ed021d9299bf6814279a6a1411a7e866a631", - "7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b65", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000000000000000000000000000000000000000000080", - "0000000000000000000000000000000000000000000000000000000000000080", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 7773, - "gasCost": 3, - "memory": null, - "op": "MSTORE", - "pc": 2884, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000005409ed021d9299bf6814279a6a1411a7e866a631", - "7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b65", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000000000000000000000000000000000000000000080", - "0000000000000000000000000000000000000000000000000000000000000080", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000000000000000000000000000000000000000000080" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 7764, - "gasCost": 9, - "memory": null, - "op": "PUSH1", - "pc": 2885, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000005409ed021d9299bf6814279a6a1411a7e866a631", - "7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b65", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000000000000000000000000000000000000000000080", - "0000000000000000000000000000000000000000000000000000000000000080" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 7761, - "gasCost": 3, - "memory": null, - "op": "ADD", - "pc": 2887, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000005409ed021d9299bf6814279a6a1411a7e866a631", - "7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b65", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000000000000000000000000000000000000000000080", - "0000000000000000000000000000000000000000000000000000000000000080", - "0000000000000000000000000000000000000000000000000000000000000020" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 7758, - "gasCost": 3, - "memory": null, - "op": "SWAP2", - "pc": 2888, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000005409ed021d9299bf6814279a6a1411a7e866a631", - "7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b65", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000000000000000000000000000000000000000000080", - "00000000000000000000000000000000000000000000000000000000000000a0" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 7755, - "gasCost": 3, - "memory": null, - "op": "POP", - "pc": 2889, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000005409ed021d9299bf6814279a6a1411a7e866a631", - "7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b65", - "00000000000000000000000000000000000000000000000000000000000000a0", - "0000000000000000000000000000000000000000000000000000000000000080", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 7753, - "gasCost": 2, - "memory": null, - "op": "POP", - "pc": 2890, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000005409ed021d9299bf6814279a6a1411a7e866a631", - "7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b65", - "00000000000000000000000000000000000000000000000000000000000000a0", - "0000000000000000000000000000000000000000000000000000000000000080" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 7751, - "gasCost": 2, - "memory": null, - "op": "PUSH1", - "pc": 2891, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000005409ed021d9299bf6814279a6a1411a7e866a631", - "7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b65", - "00000000000000000000000000000000000000000000000000000000000000a0" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 7748, - "gasCost": 3, - "memory": null, - "op": "MLOAD", - "pc": 2893, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000005409ed021d9299bf6814279a6a1411a7e866a631", - "7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b65", - "00000000000000000000000000000000000000000000000000000000000000a0", - "0000000000000000000000000000000000000000000000000000000000000040" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 7745, - "gasCost": 3, - "memory": null, - "op": "DUP1", - "pc": 2894, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000005409ed021d9299bf6814279a6a1411a7e866a631", - "7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b65", - "00000000000000000000000000000000000000000000000000000000000000a0", - "0000000000000000000000000000000000000000000000000000000000000080" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 7742, - "gasCost": 3, - "memory": null, - "op": "SWAP2", - "pc": 2895, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000005409ed021d9299bf6814279a6a1411a7e866a631", - "7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b65", - "00000000000000000000000000000000000000000000000000000000000000a0", - "0000000000000000000000000000000000000000000000000000000000000080", - "0000000000000000000000000000000000000000000000000000000000000080" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 7739, - "gasCost": 3, - "memory": null, - "op": "SUB", - "pc": 2896, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000005409ed021d9299bf6814279a6a1411a7e866a631", - "7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b65", - "0000000000000000000000000000000000000000000000000000000000000080", - "0000000000000000000000000000000000000000000000000000000000000080", - "00000000000000000000000000000000000000000000000000000000000000a0" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 7736, - "gasCost": 3, - "memory": null, - "op": "SWAP1", - "pc": 2897, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000005409ed021d9299bf6814279a6a1411a7e866a631", - "7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b65", - "0000000000000000000000000000000000000000000000000000000000000080", - "0000000000000000000000000000000000000000000000000000000000000020" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 7733, - "gasCost": 3, - "memory": null, - "op": "LOG2", - "pc": 2898, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000", - "0000000000000000000000005409ed021d9299bf6814279a6a1411a7e866a631", - "7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b65", - "0000000000000000000000000000000000000000000000000000000000000020", - "0000000000000000000000000000000000000000000000000000000000000080" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 6352, - "gasCost": 1381, - "memory": null, - "op": "POP", - "pc": 2899, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289", - "0000000000000000000000000000000000000000000000000de0b6b3a7640000" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 6350, - "gasCost": 2, - "memory": null, - "op": "JUMP", - "pc": 2900, - "stack": [ - "000000000000000000000000000000000000000000000000000000002e1a7d4d", - "0000000000000000000000000000000000000000000000000000000000000289" - ], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 6342, - "gasCost": 8, - "memory": null, - "op": "JUMPDEST", - "pc": 649, - "stack": ["000000000000000000000000000000000000000000000000000000002e1a7d4d"], - "storage": null - }, - { - "depth": 0, - "error": "", - "gas": 6341, - "gasCost": 1, - "memory": null, - "op": "STOP", - "pc": 650, - "stack": ["000000000000000000000000000000000000000000000000000000002e1a7d4d"], - "storage": null - } -] -- cgit v1.2.3 From 06be580d2cbe7e3543d8c4deeb4d1c22b325e6a7 Mon Sep 17 00:00:00 2001 From: Leonid Logvinov Date: Tue, 22 May 2018 13:21:44 -0700 Subject: Fix a bug in CALL-like opcode handling --- packages/sol-cov/src/trace.ts | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) (limited to 'packages/sol-cov/src') diff --git a/packages/sol-cov/src/trace.ts b/packages/sol-cov/src/trace.ts index 81c8bb0ff..feebaaab5 100644 --- a/packages/sol-cov/src/trace.ts +++ b/packages/sol-cov/src/trace.ts @@ -13,7 +13,8 @@ export function getTracesByContractAddress(structLogs: StructLog[], startAddress let currentTraceSegment = []; const callStack = [startAddress]; // tslint:disable-next-line:prefer-for-of - for (const structLog of structLogs) { + for (let i = 0; i < structLogs.length; i++) { + const structLog = structLogs[i]; if (structLog.depth !== callStack.length - 1) { throw new Error("Malformed trace. trace depth doesn't match call stack depth"); } @@ -26,13 +27,22 @@ export function getTracesByContractAddress(structLogs: StructLog[], startAddress const currentAddress = _.last(callStack) as string; const jumpAddressOffset = structLog.op === OpCode.DelegateCall ? 4 : 2; const newAddress = addressUtils.padZeros( - new BigNumber(addHexPrefix(structLog.stack[jumpAddressOffset])).toString(16), + new BigNumber(addHexPrefix(structLog.stack[structLog.stack.length - jumpAddressOffset])).toString(16), ); - callStack.push(newAddress); - traceByContractAddress[currentAddress] = (traceByContractAddress[currentAddress] || []).concat( - currentTraceSegment, - ); - currentTraceSegment = []; + if (structLog === _.last(structLogs)) { + throw new Error('CALL-like opcode can not be the last one'); + } + // Sometimes calls don't change the execution context (current address). When we do a transfer to an + // externally owned account - it does the call and immidiately returns because there is no fallback + // function. We manually check if the call depth had changed to handle that case. + const nextStructLog = structLogs[i + 1]; + if (nextStructLog.depth !== structLog.depth) { + callStack.push(newAddress); + traceByContractAddress[currentAddress] = (traceByContractAddress[currentAddress] || []).concat( + currentTraceSegment, + ); + currentTraceSegment = []; + } } else if ( _.includes([OpCode.Return, OpCode.Stop, OpCode.Revert, OpCode.Invalid, OpCode.SelfDestruct], structLog.op) ) { -- cgit v1.2.3 From 9740199870d83dc999079883754ec512c1ff544b Mon Sep 17 00:00:00 2001 From: Leonid Logvinov Date: Tue, 22 May 2018 13:44:48 -0700 Subject: Fix sol-cov tests --- packages/sol-cov/src/trace.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'packages/sol-cov/src') diff --git a/packages/sol-cov/src/trace.ts b/packages/sol-cov/src/trace.ts index feebaaab5..389bd8309 100644 --- a/packages/sol-cov/src/trace.ts +++ b/packages/sol-cov/src/trace.ts @@ -27,7 +27,9 @@ export function getTracesByContractAddress(structLogs: StructLog[], startAddress const currentAddress = _.last(callStack) as string; const jumpAddressOffset = structLog.op === OpCode.DelegateCall ? 4 : 2; const newAddress = addressUtils.padZeros( - new BigNumber(addHexPrefix(structLog.stack[structLog.stack.length - jumpAddressOffset])).toString(16), + new BigNumber(addHexPrefix(structLog.stack[structLog.stack.length - jumpAddressOffset - 1])).toString( + 16, + ), ); if (structLog === _.last(structLogs)) { throw new Error('CALL-like opcode can not be the last one'); -- cgit v1.2.3 From 6e0aef5f2bd8cd3ca9086abf4794028feac5ae9b Mon Sep 17 00:00:00 2001 From: Leonid Logvinov Date: Tue, 22 May 2018 15:14:07 -0700 Subject: Fix depth tracking in a tracer --- packages/sol-cov/src/trace.ts | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) (limited to 'packages/sol-cov/src') diff --git a/packages/sol-cov/src/trace.ts b/packages/sol-cov/src/trace.ts index 389bd8309..28fc7d004 100644 --- a/packages/sol-cov/src/trace.ts +++ b/packages/sol-cov/src/trace.ts @@ -25,7 +25,7 @@ export function getTracesByContractAddress(structLogs: StructLog[], startAddress if (_.includes([OpCode.CallCode, OpCode.StaticCall, OpCode.Call, OpCode.DelegateCall], structLog.op)) { const currentAddress = _.last(callStack) as string; - const jumpAddressOffset = structLog.op === OpCode.DelegateCall ? 4 : 2; + const jumpAddressOffset = 1; const newAddress = addressUtils.padZeros( new BigNumber(addHexPrefix(structLog.stack[structLog.stack.length - jumpAddressOffset - 1])).toString( 16, @@ -65,6 +65,21 @@ export function getTracesByContractAddress(structLogs: StructLog[], startAddress "Detected a contract created from within another contract. Sol-cov currently doesn't support that scenario. We'll just skip that trace", ); return traceByContractAddress; + } else { + if (structLog !== _.last(structLogs)) { + const nextStructLog = structLogs[i + 1]; + if (nextStructLog.depth === structLog.depth) { + continue; + } else if (nextStructLog.depth === structLog.depth - 1) { + const currentAddress = callStack.pop() as string; + traceByContractAddress[currentAddress] = (traceByContractAddress[currentAddress] || []).concat( + currentTraceSegment, + ); + currentTraceSegment = []; + } else { + throw new Error('Shit broke'); + } + } } } if (callStack.length !== 0) { -- cgit v1.2.3 From 8c7f0902c044b671ca66c004d9c29e018bcdb20e Mon Sep 17 00:00:00 2001 From: Leonid Logvinov Date: Tue, 22 May 2018 16:29:10 -0700 Subject: Add a more verbose comment for self-destruct --- packages/sol-cov/src/trace.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) (limited to 'packages/sol-cov/src') diff --git a/packages/sol-cov/src/trace.ts b/packages/sol-cov/src/trace.ts index 28fc7d004..4d106e355 100644 --- a/packages/sol-cov/src/trace.ts +++ b/packages/sol-cov/src/trace.ts @@ -54,7 +54,11 @@ export function getTracesByContractAddress(structLogs: StructLog[], startAddress ); currentTraceSegment = []; if (structLog.op === OpCode.SelfDestruct) { - // TODO: Record contract bytecode before the selfdestruct and handle that scenario + // After contract execution, we look at all sub-calls to external contracts, and for each one, fetch + // the bytecode and compute the coverage for the call. If the contract is destroyed with a call + // to `selfdestruct`, we are unable to fetch it's bytecode and compute coverage. + // TODO: Refactor this logic to fetch the sub-called contract bytecode before the selfdestruct is called + // in order to handle this edge-case. logUtils.warn( "Detected a selfdestruct. Sol-cov currently doesn't support that scenario. We'll just skip the trace part for a destructed contract", ); -- cgit v1.2.3 From d49f2c40ae28bde3574907a72c0fdd84196e8303 Mon Sep 17 00:00:00 2001 From: Leonid Logvinov Date: Tue, 22 May 2018 16:41:50 -0700 Subject: Parse compiler.json in SolCompilerArtifactsAdapter --- .../artifact_adapters/sol_compiler_artifact_adapter.ts | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) (limited to 'packages/sol-cov/src') diff --git a/packages/sol-cov/src/artifact_adapters/sol_compiler_artifact_adapter.ts b/packages/sol-cov/src/artifact_adapters/sol_compiler_artifact_adapter.ts index cb164f769..d08828bf6 100644 --- a/packages/sol-cov/src/artifact_adapters/sol_compiler_artifact_adapter.ts +++ b/packages/sol-cov/src/artifact_adapters/sol_compiler_artifact_adapter.ts @@ -7,13 +7,22 @@ import { ContractData } from '../types'; import { AbstractArtifactAdapter } from './abstract_artifact_adapter'; +const CONFIG_FILE = 'compiler.json'; + export class SolCompilerArtifactAdapter extends AbstractArtifactAdapter { private _artifactsPath: string; private _sourcesPath: string; - constructor(artifactsPath: string, sourcesPath: string) { + constructor(artifactsPath?: string, sourcesPath?: string) { super(); - this._artifactsPath = artifactsPath; - this._sourcesPath = sourcesPath; + const config = JSON.parse(fs.readFileSync(CONFIG_FILE).toString()); + if (_.isUndefined(artifactsPath) && _.isUndefined(config.artifactsDir)) { + throw new Error(`artifactsDir not found in ${CONFIG_FILE}`); + } + this._artifactsPath = config.artifactsDir; + if (_.isUndefined(sourcesPath) && _.isUndefined(config.contractsDir)) { + throw new Error(`contractsDir not found in ${CONFIG_FILE}`); + } + this._sourcesPath = config.contractsDir; } public async collectContractsDataAsync(): Promise { const artifactsGlob = `${this._artifactsPath}/**/*.json`; -- cgit v1.2.3 From ebc750d5bf95da76424da81550a88e6b74de8c36 Mon Sep 17 00:00:00 2001 From: Leonid Logvinov Date: Tue, 22 May 2018 17:41:48 -0700 Subject: Address feedback --- packages/sol-cov/src/constants.ts | 2 +- packages/sol-cov/src/coverage_manager.ts | 4 +++- packages/sol-cov/src/coverage_subprovider.ts | 24 +++++++++++--------- packages/sol-cov/src/trace.ts | 34 +++++++++++++++++----------- 4 files changed, 38 insertions(+), 26 deletions(-) (limited to 'packages/sol-cov/src') diff --git a/packages/sol-cov/src/constants.ts b/packages/sol-cov/src/constants.ts index 64d2228a3..34d62b537 100644 --- a/packages/sol-cov/src/constants.ts +++ b/packages/sol-cov/src/constants.ts @@ -1,6 +1,6 @@ // tslint:disable:number-literal-format export const constants = { - NEW_CONTRACT: 'NEW_CONTRACT', + NEW_CONTRACT: 'NEW_CONTRACT' as 'NEW_CONTRACT', PUSH1: 0x60, PUSH2: 0x61, PUSH32: 0x7f, diff --git a/packages/sol-cov/src/coverage_manager.ts b/packages/sol-cov/src/coverage_manager.ts index ef893527a..31b0e6fbc 100644 --- a/packages/sol-cov/src/coverage_manager.ts +++ b/packages/sol-cov/src/coverage_manager.ts @@ -125,13 +125,15 @@ export class CoverageManager { } private static _getContractDataIfExists(contractsData: ContractData[], bytecode: string): ContractData | undefined { if (!bytecode.startsWith('0x')) { - throw new Error('0x missing'); + throw new Error(`0x hex prefix missing: ${bytecode}`); } const contractData = _.find(contractsData, contractDataCandidate => { const bytecodeRegex = CoverageManager._bytecodeToBytecodeRegex(contractDataCandidate.bytecode); const runtimeBytecodeRegex = CoverageManager._bytecodeToBytecodeRegex( contractDataCandidate.runtimeBytecode, ); + // We use that function to find by bytecode or runtimeBytecode. Those are quasi-random strings so + // collisions are practically impossible and it allows us to reuse that code return !_.isNull(bytecode.match(bytecodeRegex)) || !_.isNull(bytecode.match(runtimeBytecodeRegex)); }); return contractData; diff --git a/packages/sol-cov/src/coverage_subprovider.ts b/packages/sol-cov/src/coverage_subprovider.ts index 45b479c0e..438339a3f 100644 --- a/packages/sol-cov/src/coverage_subprovider.ts +++ b/packages/sol-cov/src/coverage_subprovider.ts @@ -31,13 +31,13 @@ export class CoverageSubprovider extends Subprovider { * Instantiates a CoverageSubprovider instance * @param artifactAdapter Adapter for used artifacts format (0x, truffle, giveth, etc.) * @param defaultFromAddress default from address to use when sending transactions - * @param verbose If true, we will log any unknown transactions. Otherwise we will ignore them + * @param isVerbose If true, we will log any unknown transactions. Otherwise we will ignore them */ - constructor(artifactAdapter: AbstractArtifactAdapter, defaultFromAddress: string, verbose: boolean = true) { + constructor(artifactAdapter: AbstractArtifactAdapter, defaultFromAddress: string, isVerbose: boolean = true) { super(); this._lock = new Lock(); this._defaultFromAddress = defaultFromAddress; - this._coverageManager = new CoverageManager(artifactAdapter, this._getContractCodeAsync.bind(this), verbose); + this._coverageManager = new CoverageManager(artifactAdapter, this._getContractCodeAsync.bind(this), isVerbose); } /** * Write the test coverage results to a file in Istanbul format. @@ -120,11 +120,12 @@ export class CoverageSubprovider extends Subprovider { method: 'debug_traceTransaction', params: [txHash, { disableMemory: true, disableStack: false, disableStorage: true }], }; - const jsonRPCResponsePayload = await this.emitPayloadAsync(payload); + let jsonRPCResponsePayload = await this.emitPayloadAsync(payload); const trace: TransactionTrace = jsonRPCResponsePayload.result; + const tracesByContractAddress = getTracesByContractAddress(trace.structLogs, address); + const subcallAddresses = _.keys(tracesByContractAddress); if (address === constants.NEW_CONTRACT) { - const tracesByContractAddress = getTracesByContractAddress(trace.structLogs, address); - for (const subcallAddress of _.keys(tracesByContractAddress)) { + for (const subcallAddress of subcallAddresses) { let traceInfo: TraceInfoNewContract | TraceInfoExistingContract; if (subcallAddress === 'NEW_CONTRACT') { const traceForThatSubcall = tracesByContractAddress[subcallAddress]; @@ -132,12 +133,13 @@ export class CoverageSubprovider extends Subprovider { traceInfo = { coveredPcs, txHash, - address: address as 'NEW_CONTRACT', + address: constants.NEW_CONTRACT, bytecode: data as string, }; } else { payload = { method: 'eth_getCode', params: [subcallAddress, BlockParamLiteral.Latest] }; - const runtimeBytecode = (await this.emitPayloadAsync(payload)).result; + jsonRPCResponsePayload = await this.emitPayloadAsync(payload); + const runtimeBytecode = jsonRPCResponsePayload.result; const traceForThatSubcall = tracesByContractAddress[subcallAddress]; const coveredPcs = _.map(traceForThatSubcall, log => log.pc); traceInfo = { @@ -150,10 +152,10 @@ export class CoverageSubprovider extends Subprovider { this._coverageManager.appendTraceInfo(traceInfo); } } else { - const tracesByContractAddress = getTracesByContractAddress(trace.structLogs, address); - for (const subcallAddress of _.keys(tracesByContractAddress)) { + for (const subcallAddress of subcallAddresses) { payload = { method: 'eth_getCode', params: [subcallAddress, BlockParamLiteral.Latest] }; - const runtimeBytecode = (await this.emitPayloadAsync(payload)).result; + jsonRPCResponsePayload = await this.emitPayloadAsync(payload); + const runtimeBytecode = jsonRPCResponsePayload.result; const traceForThatSubcall = tracesByContractAddress[subcallAddress]; const coveredPcs = _.map(traceForThatSubcall, log => log.pc); const traceInfo: TraceInfoExistingContract = { diff --git a/packages/sol-cov/src/trace.ts b/packages/sol-cov/src/trace.ts index 4d106e355..cb5410909 100644 --- a/packages/sol-cov/src/trace.ts +++ b/packages/sol-cov/src/trace.ts @@ -8,6 +8,10 @@ export interface TraceByContractAddress { [contractAddress: string]: StructLog[]; } +function getAddressFromStackEntry(stackEntry: string): string { + return addressUtils.padZeros(new BigNumber(addHexPrefix(stackEntry)).toString(16)); +} + export function getTracesByContractAddress(structLogs: StructLog[], startAddress: string): TraceByContractAddress { const traceByContractAddress: TraceByContractAddress = {}; let currentTraceSegment = []; @@ -16,26 +20,32 @@ export function getTracesByContractAddress(structLogs: StructLog[], startAddress for (let i = 0; i < structLogs.length; i++) { const structLog = structLogs[i]; if (structLog.depth !== callStack.length - 1) { - throw new Error("Malformed trace. trace depth doesn't match call stack depth"); + throw new Error("Malformed trace. Trace depth doesn't match call stack depth"); } // After that check we have a guarantee that call stack is never empty // If it would: callStack.length - 1 === structLog.depth === -1 // That means that we can always safely pop from it currentTraceSegment.push(structLog); - if (_.includes([OpCode.CallCode, OpCode.StaticCall, OpCode.Call, OpCode.DelegateCall], structLog.op)) { + const isCallLike = _.includes( + [OpCode.CallCode, OpCode.StaticCall, OpCode.Call, OpCode.DelegateCall], + structLog.op, + ); + const isEndOpcode = _.includes( + [OpCode.Return, OpCode.Stop, OpCode.Revert, OpCode.Invalid, OpCode.SelfDestruct], + structLog.op, + ); + if (isCallLike) { const currentAddress = _.last(callStack) as string; const jumpAddressOffset = 1; - const newAddress = addressUtils.padZeros( - new BigNumber(addHexPrefix(structLog.stack[structLog.stack.length - jumpAddressOffset - 1])).toString( - 16, - ), + const newAddress = getAddressFromStackEntry( + structLog.stack[structLog.stack.length - jumpAddressOffset - 1], ); if (structLog === _.last(structLogs)) { - throw new Error('CALL-like opcode can not be the last one'); + throw new Error('Malformed trace. CALL-like opcode can not be the last one'); } // Sometimes calls don't change the execution context (current address). When we do a transfer to an - // externally owned account - it does the call and immidiately returns because there is no fallback + // externally owned account - it does the call and immediately returns because there is no fallback // function. We manually check if the call depth had changed to handle that case. const nextStructLog = structLogs[i + 1]; if (nextStructLog.depth !== structLog.depth) { @@ -45,9 +55,7 @@ export function getTracesByContractAddress(structLogs: StructLog[], startAddress ); currentTraceSegment = []; } - } else if ( - _.includes([OpCode.Return, OpCode.Stop, OpCode.Revert, OpCode.Invalid, OpCode.SelfDestruct], structLog.op) - ) { + } else if (isEndOpcode) { const currentAddress = callStack.pop() as string; traceByContractAddress[currentAddress] = (traceByContractAddress[currentAddress] || []).concat( currentTraceSegment, @@ -81,7 +89,7 @@ export function getTracesByContractAddress(structLogs: StructLog[], startAddress ); currentTraceSegment = []; } else { - throw new Error('Shit broke'); + throw new Error('Malformed trace. Unexpected call depth change'); } } } @@ -90,7 +98,7 @@ export function getTracesByContractAddress(structLogs: StructLog[], startAddress throw new Error('Malformed trace. Call stack non empty at the end'); } if (currentTraceSegment.length !== 0) { - throw new Error('Malformed trace. currentTraceSegment non empty at the end'); + throw new Error('Malformed trace. Current trace segment non empty at the end'); } return traceByContractAddress; } -- cgit v1.2.3 From c9aef166495c0a1b1c34db01226602375c0b3547 Mon Sep 17 00:00:00 2001 From: Leonid Logvinov Date: Wed, 23 May 2018 10:39:56 -0700 Subject: Fix linter issues --- packages/sol-cov/src/trace.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'packages/sol-cov/src') diff --git a/packages/sol-cov/src/trace.ts b/packages/sol-cov/src/trace.ts index cb5410909..6caea1610 100644 --- a/packages/sol-cov/src/trace.ts +++ b/packages/sol-cov/src/trace.ts @@ -9,7 +9,8 @@ export interface TraceByContractAddress { } function getAddressFromStackEntry(stackEntry: string): string { - return addressUtils.padZeros(new BigNumber(addHexPrefix(stackEntry)).toString(16)); + const hexBase = 16; + return addressUtils.padZeros(new BigNumber(addHexPrefix(stackEntry)).toString(hexBase)); } export function getTracesByContractAddress(structLogs: StructLog[], startAddress: string): TraceByContractAddress { -- cgit v1.2.3