aboutsummaryrefslogtreecommitdiffstats
path: root/packages/sol-cov
diff options
context:
space:
mode:
Diffstat (limited to 'packages/sol-cov')
-rw-r--r--packages/sol-cov/CHANGELOG.json25
-rw-r--r--packages/sol-cov/CHANGELOG.md13
-rw-r--r--packages/sol-cov/package.json24
-rw-r--r--packages/sol-cov/src/artifact_adapters/truffle_artifact_adapter.ts60
-rw-r--r--packages/sol-cov/src/trace_collection_subprovider.ts16
5 files changed, 108 insertions, 30 deletions
diff --git a/packages/sol-cov/CHANGELOG.json b/packages/sol-cov/CHANGELOG.json
index 5a1fdc712..5f6b1685b 100644
--- a/packages/sol-cov/CHANGELOG.json
+++ b/packages/sol-cov/CHANGELOG.json
@@ -1,5 +1,30 @@
[
{
+ "version": "2.0.0",
+ "changes": [
+ {
+ "note":
+ "Fix a bug when eth_call coverage was not computed because of silent schema validation failures",
+ "pr": 938
+ },
+ {
+ "note": "Make `TruffleArtifactAdapter` read the `truffle.js` config for `solc` settings",
+ "pr": 938
+ },
+ {
+ "note":
+ "Change the first param of `TruffleArtifactAdapter` to be the `projectRoot` instead of `sourcesDir`",
+ "pr": 938
+ },
+ {
+ "note":
+ "Throw a helpful error message if truffle artifacts were generated with a different solc version than the one passed in",
+ "pr": 938
+ }
+ ],
+ "timestamp": 1534210131
+ },
+ {
"version": "1.0.3",
"changes": [
{
diff --git a/packages/sol-cov/CHANGELOG.md b/packages/sol-cov/CHANGELOG.md
index aeeaa5b62..d7bdb9614 100644
--- a/packages/sol-cov/CHANGELOG.md
+++ b/packages/sol-cov/CHANGELOG.md
@@ -5,6 +5,13 @@ Edit the package's CHANGELOG.json file only.
CHANGELOG
+## v2.0.0 - _August 13, 2018_
+
+ * Fix a bug when eth_call coverage was not computed because of silent schema validation failures (#938)
+ * Make `TruffleArtifactAdapter` read the `truffle.js` config for `solc` settings (#938)
+ * Change the first param of `TruffleArtifactAdapter` to be the `projectRoot` instead of `sourcesDir` (#938)
+ * Throw a helpful error message if truffle artifacts were generated with a different solc version than the one passed in (#938)
+
## v1.0.3 - _July 26, 2018_
* Dependencies updated
@@ -17,7 +24,7 @@ CHANGELOG
* Dependencies updated
-## v1.0.0 - _July 20, 2018_
+## v1.0.0 - _July 19, 2018_
* Add artifact adapter as a parameter for `CoverageSubprovider`. Export `AbstractArtifactAdapter` (#589)
* Implement `SolCompilerArtifactAdapter` and `TruffleArtifactAdapter` (#589)
@@ -50,7 +57,7 @@ CHANGELOG
* Dependencies updated
-## v0.1.0 - _June 1, 2018_
+## v0.1.0 - _May 31, 2018_
* Incorrect publish that was unpublished
@@ -58,7 +65,7 @@ CHANGELOG
* Dependencies updated
-## v0.0.10 - _May 5, 2018_
+## v0.0.10 - _May 4, 2018_
* Dependencies updated
diff --git a/packages/sol-cov/package.json b/packages/sol-cov/package.json
index 6021435d6..fdfb2d0ee 100644
--- a/packages/sol-cov/package.json
+++ b/packages/sol-cov/package.json
@@ -1,6 +1,6 @@
{
"name": "@0xproject/sol-cov",
- "version": "1.0.3",
+ "version": "2.0.0",
"engines": {
"node": ">=6.12"
},
@@ -40,18 +40,18 @@
},
"homepage": "https://github.com/0xProject/0x.js/packages/sol-cov/README.md",
"dependencies": {
- "@0xproject/dev-utils": "^1.0.3",
- "@0xproject/sol-compiler": "^1.0.4",
- "@0xproject/subproviders": "^1.0.4",
- "@0xproject/typescript-typings": "^1.0.3",
- "@0xproject/utils": "^1.0.4",
- "@0xproject/web3-wrapper": "^1.1.2",
+ "@0xproject/dev-utils": "^1.0.4",
+ "@0xproject/sol-compiler": "^1.0.5",
+ "@0xproject/subproviders": "^1.0.5",
+ "@0xproject/typescript-typings": "^1.0.4",
+ "@0xproject/utils": "^1.0.5",
+ "@0xproject/web3-wrapper": "^1.2.0",
"@types/solidity-parser-antlr": "^0.2.1",
- "ethereum-types": "^1.0.3",
+ "ethereum-types": "^1.0.4",
"ethereumjs-util": "^5.1.1",
"glob": "^7.1.2",
"istanbul": "^0.4.5",
- "lodash": "^4.17.4",
+ "lodash": "^4.17.5",
"loglevel": "^1.6.1",
"mkdirp": "^0.5.1",
"rimraf": "^2.6.2",
@@ -59,7 +59,7 @@
"solidity-parser-antlr": "^0.2.12"
},
"devDependencies": {
- "@0xproject/tslint-config": "^1.0.4",
+ "@0xproject/tslint-config": "^1.0.5",
"@types/istanbul": "^0.4.30",
"@types/loglevel": "^1.5.3",
"@types/mkdirp": "^0.5.1",
@@ -71,14 +71,14 @@
"copyfiles": "^1.2.0",
"dirty-chai": "^2.0.1",
"make-promises-safe": "^1.1.0",
- "mocha": "^4.0.1",
+ "mocha": "^4.1.0",
"npm-run-all": "^4.1.2",
"nyc": "^11.0.1",
"shx": "^0.2.2",
"sinon": "^4.0.0",
"tslint": "5.11.0",
"typedoc": "0xProject/typedoc",
- "typescript": "2.7.1"
+ "typescript": "2.9.2"
},
"publishConfig": {
"access": "public"
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 dc6807cd6..b4d1aa7ba 100644
--- a/packages/sol-cov/src/artifact_adapters/truffle_artifact_adapter.ts
+++ b/packages/sol-cov/src/artifact_adapters/truffle_artifact_adapter.ts
@@ -1,30 +1,45 @@
import { Compiler, CompilerOptions } from '@0xproject/sol-compiler';
-import * as rimraf from 'rimraf';
+import * as fs from 'fs';
+import * as glob from 'glob';
+import * as path from 'path';
import { ContractData } from '../types';
import { AbstractArtifactAdapter } from './abstract_artifact_adapter';
import { SolCompilerArtifactAdapter } from './sol_compiler_artifact_adapter';
+const DEFAULT_TRUFFLE_ARTIFACTS_DIR = './build/contracts';
+
+interface TruffleConfig {
+ solc?: any;
+ contracts_build_directory?: string;
+}
+
export class TruffleArtifactAdapter extends AbstractArtifactAdapter {
private readonly _solcVersion: string;
- private readonly _sourcesPath: string;
+ private readonly _projectRoot: string;
/**
* Instantiates a TruffleArtifactAdapter
- * @param artifactsPath Path to the truffle project's artifacts directory
+ * @param projectRoot Path to the truffle project's root directory
* @param solcVersion Solidity version with which to compile all the contracts
*/
- constructor(sourcesPath: string, solcVersion: string) {
+ constructor(projectRoot: string, solcVersion: string) {
super();
this._solcVersion = solcVersion;
- this._sourcesPath = sourcesPath;
+ this._projectRoot = projectRoot;
}
public async collectContractsDataAsync(): Promise<ContractData[]> {
const artifactsDir = '.0x-artifacts';
+ const contractsDir = path.join(this._projectRoot, 'contracts');
+ const truffleConfig = this._getTruffleConfig();
+ const solcConfig = truffleConfig.solc || {};
+ const truffleArtifactsDirectory = truffleConfig.contracts_build_directory || DEFAULT_TRUFFLE_ARTIFACTS_DIR;
+ this._assertSolidityVersionIsCorrect(truffleArtifactsDirectory);
const compilerOptions: CompilerOptions = {
- contractsDir: this._sourcesPath,
+ contractsDir,
artifactsDir,
compilerSettings: {
+ ...solcConfig,
outputSelection: {
['*']: {
['*']: ['abi', 'evm.bytecode.object', 'evm.deployedBytecode.object'],
@@ -36,9 +51,38 @@ export class TruffleArtifactAdapter extends AbstractArtifactAdapter {
};
const compiler = new Compiler(compilerOptions);
await compiler.compileAsync();
- const solCompilerArtifactAdapter = new SolCompilerArtifactAdapter(artifactsDir, this._sourcesPath);
+ const solCompilerArtifactAdapter = new SolCompilerArtifactAdapter(artifactsDir, contractsDir);
const contractsDataFrom0xArtifacts = await solCompilerArtifactAdapter.collectContractsDataAsync();
- rimraf.sync(artifactsDir);
return contractsDataFrom0xArtifacts;
}
+ private _getTruffleConfig(): TruffleConfig {
+ const truffleConfigFileShort = path.resolve(path.join(this._projectRoot, 'truffle.js'));
+ const truffleConfigFileLong = path.resolve(path.join(this._projectRoot, 'truffle-config.js'));
+ if (fs.existsSync(truffleConfigFileShort)) {
+ const truffleConfig = require(truffleConfigFileShort);
+ return truffleConfig;
+ } else if (fs.existsSync(truffleConfigFileLong)) {
+ const truffleConfig = require(truffleConfigFileLong);
+ return truffleConfig;
+ } else {
+ throw new Error(
+ `Neither ${truffleConfigFileShort} nor ${truffleConfigFileLong} exists. Make sure the project root is correct`,
+ );
+ }
+ }
+ private _assertSolidityVersionIsCorrect(truffleArtifactsDirectory: string): void {
+ const artifactsGlob = `${truffleArtifactsDirectory}/**/*.json`;
+ const artifactFileNames = glob.sync(artifactsGlob, { absolute: true });
+ for (const artifactFileName of artifactFileNames) {
+ const artifact = JSON.parse(fs.readFileSync(artifactFileName).toString());
+ const compilerVersion = artifact.compiler.version;
+ if (!compilerVersion.startsWith(this._solcVersion)) {
+ throw new Error(
+ `${artifact.contractName} was compiled with solidity ${compilerVersion} but specified version is ${
+ this._solcVersion
+ } making it impossible for sol-cov to process traces`,
+ );
+ }
+ }
+ }
}
diff --git a/packages/sol-cov/src/trace_collection_subprovider.ts b/packages/sol-cov/src/trace_collection_subprovider.ts
index 91c21fe94..a69bccb07 100644
--- a/packages/sol-cov/src/trace_collection_subprovider.ts
+++ b/packages/sol-cov/src/trace_collection_subprovider.ts
@@ -1,7 +1,7 @@
import { BlockchainLifecycle } from '@0xproject/dev-utils';
import { Callback, ErrorCallback, NextCallback, Subprovider } from '@0xproject/subproviders';
-import { Web3Wrapper } from '@0xproject/web3-wrapper';
-import { CallData, JSONRPCRequestPayload, Provider, TxData } from 'ethereum-types';
+import { CallDataRPC, marshaller, Web3Wrapper } from '@0xproject/web3-wrapper';
+import { JSONRPCRequestPayload, Provider, TxData } from 'ethereum-types';
import * as _ from 'lodash';
import { Lock } from 'semaphore-async-await';
@@ -153,7 +153,7 @@ export abstract class TraceCollectionSubprovider extends Subprovider {
cb();
}
private async _onCallOrGasEstimateExecutedAsync(
- callData: Partial<CallData>,
+ callData: Partial<CallDataRPC>,
_err: Error | null,
_callResult: string,
cb: Callback,
@@ -161,22 +161,24 @@ export abstract class TraceCollectionSubprovider extends Subprovider {
await this._recordCallOrGasEstimateTraceAsync(callData);
cb();
}
- private async _recordCallOrGasEstimateTraceAsync(callData: Partial<CallData>): Promise<void> {
+ private async _recordCallOrGasEstimateTraceAsync(callData: Partial<CallDataRPC>): Promise<void> {
// We don't want other transactions to be exeucted during snashotting period, that's why we lock the
// transaction execution for all transactions except our fake ones.
await this._lock.acquire();
const blockchainLifecycle = new BlockchainLifecycle(this._web3Wrapper);
await blockchainLifecycle.startAsync();
- const fakeTxData: MaybeFakeTxData = {
- gas: BLOCK_GAS_LIMIT,
+ const fakeTxData = {
+ gas: BLOCK_GAS_LIMIT.toString(16), // tslint:disable-line:custom-no-magic-numbers
isFakeTransaction: true, // This transaction (and only it) is allowed to come through when the lock is locked
...callData,
from: callData.from || this._defaultFromAddress,
};
try {
- const txHash = await this._web3Wrapper.sendTransactionAsync(fakeTxData);
+ const txData = marshaller.unmarshalTxData(fakeTxData);
+ const txHash = await this._web3Wrapper.sendTransactionAsync(txData);
await this._web3Wrapper.awaitTransactionMinedAsync(txHash, 0);
} catch (err) {
+ // TODO(logvinov) Check that transaction failed and not some other exception
// Even if this transaction failed - we've already recorded it's trace.
_.noop();
}