import * as React from 'react'; import { hydrate, render } from 'react-dom'; import * as Loadable from 'react-loadable'; import { context } from 'ts/context/cov'; import { Base } from 'ts/components/base'; import { Breakout } from 'ts/components/breakout'; import { Code } from 'ts/components/code'; import { Content } from 'ts/components/content'; import { ContentBlock } from 'ts/components/content-block'; import { Hero } from 'ts/components/hero'; import { InlineCode } from 'ts/components/inline-code'; import { Intro, IntroAside, IntroLead } from 'ts/components/intro'; import { List, ListItem } from 'ts/components/list'; import { TabBlock, Tabs } from 'ts/components/tabs'; const Animation = Loadable({ loader: () => System.import(/* webpackChunkName: 'cov-animation' */ 'ts/components/animations/cov'), loading: () =>
, delay: 1000, render(loadable: { CovAnimation: any }): React.ReactNode { const Component = loadable.CovAnimation; return ; }, }); const Cov: React.StatelessComponent<{}> = () => (

When it comes to writing smart contracts, testing is one of the most important steps of the process. In order to quantify the robustness of your Solidity testing suite, you need to measure its code coverage.

{`+function executeTransaction(uint transactionId) public + notExecuted(transactionId) + fullyConfirmed(transactionId) + pastTimeLock(transactionId) { + Transaction storage tx = transactions[transactionId] + tx.executed = true + if (tx.destination.call.value(tx.value)(tx.data)) + Execution(transactionId) else { - ExecutionFailure(transactionId) - tx.executed = false } }`}
Use ganache-cli as a backing node. Understand and use web3-provider-engine. npm install @0x/sol-coverage --save

Sol-cov is a subprovider that needs to be prepended to your provider engine. Depending on your project setup, you will need to use a specific ArtifactAdapter. Sol-cov ships with the SolCompilerArtifactAdapter for use with Sol-compiler{' '} and TruffleArtifactAdapter for use with the{' '} Truffle framework. You can also write your own and support any artifact format.

{`import { SolCompilerArtifactAdapter } from '@0x/sol-trace'; // Both artifactsDir and contractsDir are optional and will be fetched from compiler.json if not passed in const artifactAdapter = new SolCompilerArtifactAdapter(artifactsDir, contractsDir);`} {`import { TruffleArtifactAdapter } from '@0x/sol-trace'; const projectRoot = '.'; const solcVersion = '0.4.24'; const artifactAdapter = new TruffleArtifactAdapter(projectRoot, solcVersion);`} {`import { AbstractArtifactAdapter } from '@0x/sol-trace'; class YourCustomArtifactsAdapter extends AbstractArtifactAdapter {...}; const artifactAdapter = new YourCustomArtifactsAdapter(...);`}

Now that we have an artifactAdapter, we can create a{' '} RevertTraceSubprovider and append it to our provider engine.

{`import { ProviderEngine, RpcSubprovider } from 'web3-provider-engine'; import { RevertTraceSubprovider } from '@0x/sol-coverage'; const defaultFromAddress = "..."; // Some ethereum address with test funds const revertTraceSubprovider = new RevertTraceSubprovider(artifactAdapter, defaultFromAddress); const providerEngine = new ProviderEngine(); providerEngine.addProvider(revertTraceSubprovider); providerEngine.addProvider(new RpcSubprovider({rpcUrl: 'http://localhost:8545'})); providerEngine.start();`}
); const root = document.getElementById('app'); if (root.hasChildNodes()) { hydrate(, root); } else { render(, root); }