From ea5e78b217fdb43c50be13a80417e77ff06c970e Mon Sep 17 00:00:00 2001 From: Leonid Logvinov Date: Wed, 30 Jan 2019 13:55:58 +0100 Subject: Improve error messages when unable to find bytecode --- packages/sol-trace/CHANGELOG.json | 9 +++++++++ packages/sol-trace/package.json | 1 + packages/sol-trace/src/revert_trace_subprovider.ts | 17 +++++++++++++++-- packages/sol-tracing-utils/CHANGELOG.json | 4 ++++ packages/sol-tracing-utils/package.json | 1 + packages/sol-tracing-utils/src/trace_collector.ts | 17 +++++++++++++++-- 6 files changed, 45 insertions(+), 4 deletions(-) diff --git a/packages/sol-trace/CHANGELOG.json b/packages/sol-trace/CHANGELOG.json index 550ca2feb..b633b3d21 100644 --- a/packages/sol-trace/CHANGELOG.json +++ b/packages/sol-trace/CHANGELOG.json @@ -1,4 +1,13 @@ [ + { + "version": "2.0.1", + "changes": [ + { + "note": "Improve error messages when unable to find matching bytecode", + "pr": 1558 + } + ] + }, { "version": "2.0.0", "changes": [ diff --git a/packages/sol-trace/package.json b/packages/sol-trace/package.json index 2aedf7ebc..25e81a82a 100644 --- a/packages/sol-trace/package.json +++ b/packages/sol-trace/package.json @@ -32,6 +32,7 @@ "@0x/sol-tracing-utils": "^4.0.1", "@0x/subproviders": "^2.1.11", "@0x/typescript-typings": "^3.0.8", + "chalk": "^2.3.0", "ethereum-types": "^1.1.6", "ethereumjs-util": "^5.1.1", "lodash": "^4.17.5", diff --git a/packages/sol-trace/src/revert_trace_subprovider.ts b/packages/sol-trace/src/revert_trace_subprovider.ts index 046dad812..899a92814 100644 --- a/packages/sol-trace/src/revert_trace_subprovider.ts +++ b/packages/sol-trace/src/revert_trace_subprovider.ts @@ -11,6 +11,7 @@ import { TraceCollectionSubprovider, utils, } from '@0x/sol-tracing-utils'; +import chalk from 'chalk'; import { stripHexPrefix } from 'ethereumjs-util'; import * as _ from 'lodash'; import { getLogger, levels, Logger } from 'loglevel'; @@ -71,9 +72,21 @@ export class RevertTraceSubprovider extends TraceCollectionSubprovider { const bytecode = await this._web3Wrapper.getContractCodeAsync(evmCallStackEntry.address); const contractData = utils.getContractDataIfExists(this._contractsData, bytecode); if (_.isUndefined(contractData)) { + const shortenHex = (hex: string) => { + /** + * Length chooses so that both error messages are of the same length + * and it's enough data to figure out which artifact has a problem. + */ + const length = 18; + return `${hex.substr(0, length + 2)}...${hex.substr(hex.length - length, length)}`; + }; const errMsg = isContractCreation - ? `Unknown contract creation transaction` - : `Transaction to an unknown address: ${evmCallStackEntry.address}`; + ? `Unable to find matching bytecode for contract creation ${chalk.bold( + shortenHex(bytecode), + )}, please check your artifacts. Ignoring...` + : `Unable to find matching bytecode for contract address ${chalk.bold( + evmCallStackEntry.address, + )}, please check your artifacts. Ignoring...`; this._logger.warn(errMsg); continue; } diff --git a/packages/sol-tracing-utils/CHANGELOG.json b/packages/sol-tracing-utils/CHANGELOG.json index 024e896da..89a5b6876 100644 --- a/packages/sol-tracing-utils/CHANGELOG.json +++ b/packages/sol-tracing-utils/CHANGELOG.json @@ -21,6 +21,10 @@ { "note": "Fix the bug in `ASTVisitor` causing the 'cannot read property `range` of `null`' error", "pr": 1557 + }, + { + "note": "Improve error messages when unable to find matching bytecode", + "pr": 1558 } ] }, diff --git a/packages/sol-tracing-utils/package.json b/packages/sol-tracing-utils/package.json index 4b0fff222..929c73b84 100644 --- a/packages/sol-tracing-utils/package.json +++ b/packages/sol-tracing-utils/package.json @@ -53,6 +53,7 @@ "ethereum-types": "^1.1.6", "ethereumjs-util": "^5.1.1", "glob": "^7.1.2", + "chalk": "^2.3.0", "istanbul": "^0.4.5", "lodash": "^4.17.5", "loglevel": "^1.6.1", diff --git a/packages/sol-tracing-utils/src/trace_collector.ts b/packages/sol-tracing-utils/src/trace_collector.ts index f5dde8762..2a1f15b83 100644 --- a/packages/sol-tracing-utils/src/trace_collector.ts +++ b/packages/sol-tracing-utils/src/trace_collector.ts @@ -1,4 +1,5 @@ import { promisify } from '@0x/utils'; +import chalk from 'chalk'; import { stripHexPrefix } from 'ethereumjs-util'; import * as fs from 'fs'; import { Collector } from 'istanbul'; @@ -71,9 +72,21 @@ export class TraceCollector { : (traceInfo as TraceInfoExistingContract).runtimeBytecode; const contractData = utils.getContractDataIfExists(this._contractsData, bytecode); if (_.isUndefined(contractData)) { + const shortenHex = (hex: string) => { + /** + * Length chooses so that both error messages are of the same length + * and it's enough data to figure out which artifact has a problem. + */ + const length = 18; + return `${hex.substr(0, length + 2)}...${hex.substr(hex.length - length, length)}`; + }; const errMsg = isContractCreation - ? `Unknown contract creation transaction` - : `Transaction to an unknown address: ${traceInfo.address}`; + ? `Unable to find matching bytecode for contract creation ${chalk.bold( + shortenHex(bytecode), + )}, please check your artifacts. Ignoring...` + : `Unable to find matching bytecode for contract address ${chalk.bold( + traceInfo.address, + )}, please check your artifacts. Ignoring...`; this._logger.warn(errMsg); return; } -- cgit v1.2.3