aboutsummaryrefslogtreecommitdiffstats
path: root/packages/dev-tools-pages/ts/pages
diff options
context:
space:
mode:
Diffstat (limited to 'packages/dev-tools-pages/ts/pages')
-rw-r--r--packages/dev-tools-pages/ts/pages/compiler.tsx182
-rw-r--r--packages/dev-tools-pages/ts/pages/coverage.tsx179
-rw-r--r--packages/dev-tools-pages/ts/pages/profiler.tsx176
-rw-r--r--packages/dev-tools-pages/ts/pages/trace.tsx147
4 files changed, 0 insertions, 684 deletions
diff --git a/packages/dev-tools-pages/ts/pages/compiler.tsx b/packages/dev-tools-pages/ts/pages/compiler.tsx
deleted file mode 100644
index 407646add..000000000
--- a/packages/dev-tools-pages/ts/pages/compiler.tsx
+++ /dev/null
@@ -1,182 +0,0 @@
-import * as React from 'react';
-import { hydrate, render } from 'react-dom';
-import * as Loadable from 'react-loadable';
-
-import { context } from 'ts/context/compiler';
-
-import { Base } from 'ts/components/base';
-import { Breakout } from 'ts/components/breakout';
-import { CallToAction } from 'ts/components/call_to_action';
-import { Code } from 'ts/components/code';
-import { Compiler as CompilerComponent } from 'ts/components/compiler';
-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 { Lead } from 'ts/components/typography';
-
-const Animation = Loadable({
- loader: () => System.import(/* webpackChunkName: 'compiler-animation' */ 'ts/components/animations/compiler'),
- loading: () => <div />,
- delay: 1000,
- render(loadable: { CompilerAnimation: any }): React.ReactNode {
- const Component = loadable.CompilerAnimation;
- return <Component />;
- },
-});
-
-const SOLIDITY_INPUT_FORMAT_DOCS =
- 'https://solidity.readthedocs.io/en/v0.4.24/using-the-compiler.html#compiler-input-and-output-json-description';
-
-const Compiler: React.StatelessComponent<{}> = () => (
- <Base context={context}>
- <Hero>
- <Animation />
- </Hero>
- <CompilerComponent />
- <Content>
- <ContentBlock main={true} title="Get started" />
- <ContentBlock title="Install">
- <Breakout>
- <Code canCopy={true}>npm install @0x/sol-compiler --g</Code>
- </Breakout>
- </ContentBlock>
-
- <ContentBlock title="Run">
- <Breakout>
- <Code canCopy={true}>cd /your_project_dir && sol-compiler</Code>
- </Breakout>
- </ContentBlock>
-
- <ContentBlock title="Configure">
- <p>
- Configure via a <InlineCode>compiler.json</InlineCode> file.
- </p>
- <Breakout>
- <Code canCopy={true}>mkdir compiler.json</Code>
- </Breakout>
- <p>Example of settings:</p>
- <Breakout>
- <Code language="json" canCopy={true}>
- {`{
- "contractsDir": "contracts",
- "artifactsDir": "artifacts",
- "contracts": "*",
- "compilerSettings": {
- "optimizer": { "enabled": false },
- "outputSelection": {
- "*": {
- "*": ["abi", "evm.bytecode.object"]
- }
- }
- }
-}`}
- </Code>
- </Breakout>
- </ContentBlock>
- </Content>
- <Content dark={true}>
- <ContentBlock main={true} title="Artifacts">
- <Lead>
- Sol compiler uses{' '}
- <a href={SOLIDITY_INPUT_FORMAT_DOCS} target="_blank">
- Solidity standard JSON input format
- </a>{' '}
- to specify what to include in the generated artifacts. This way, you have complete flexibility on
- what is included.
- </Lead>
- </ContentBlock>
-
- <ContentBlock title="Production">
- <p>
- In production, you want to optimize for a small bundle size, so your compiler.json config would
- instruct sol-compiler to only output the contract ABI.
- </p>
- <Breakout>
- <Code isLight={true} language="json" isEtc={true}>
- {`{
- "compilerSettings": {
- "outputSelection": {
- "*": {
- "*": ["abi"]
- }
- }
- }
-}`}
- </Code>
- </Breakout>
- <Breakout>
- <Code isLight={true} language="json" isEtc={true}>
- {`{
- "compilerOutput": {
- "abi": [...],
- },
-}`}
- </Code>
- </Breakout>
- </ContentBlock>
- <ContentBlock title="Development">
- <p>
- In development, you need to use profiler and other dev tools that require more information from the
- artifact. To do this, you can specify that the artifact also contain the bytecode, deployed bytecode
- and source maps.
- </p>
- <Breakout>
- <Code isLight={true} language="json" isEtc={true}>
- {`{
- "compilerSettings": {
- "outputSelection": {
- "*": {
- "*": [
- "abi",
- "evm.bytecode.object",
- "evm.bytecode.sourceMap",
- "evm.deployedBytecode.object",
- "evm.deployedBytecode.sourceMap"
- ]
- }
- }
- }
-}`}
- </Code>
- </Breakout>
-
- <Breakout>
- <Code isLight={true} language="json" isEtc={true}>
- {`{
- "compilerOutput": {
- "abi": [...],
- "evm": {
- "bytecode": {
- "object": "0xdeadbeef",
- "sourceMap": "26:480:..."
- },
- "deployedBytecode": {
- "object": "0xdeadbeef",
- "sourceMap": "26:480:0..."
- }
- }
- }
- "sources": {
- "Migrations.sol": {
- "id": 0
- }
- },
-}`}
- </Code>
- </Breakout>
- </ContentBlock>
- </Content>
- <div style={{ paddingTop: '5rem' }}>
- <CallToAction />
- </div>
- </Base>
-);
-
-const root = document.getElementById('app');
-
-if (root.hasChildNodes()) {
- hydrate(<Compiler />, root);
-} else {
- render(<Compiler />, root);
-}
diff --git a/packages/dev-tools-pages/ts/pages/coverage.tsx b/packages/dev-tools-pages/ts/pages/coverage.tsx
deleted file mode 100644
index 575891f3b..000000000
--- a/packages/dev-tools-pages/ts/pages/coverage.tsx
+++ /dev/null
@@ -1,179 +0,0 @@
-import * as React from 'react';
-import { hydrate, render } from 'react-dom';
-import * as Loadable from 'react-loadable';
-
-import { context } from 'ts/context/coverage';
-
-import { Base } from 'ts/components/base';
-import { Breakout } from 'ts/components/breakout';
-import { CallToAction } from 'ts/components/call_to_action';
-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: () => <div />,
- delay: 1000,
- render(loadable: { CovAnimation: any }): React.ReactNode {
- const Component = loadable.CovAnimation;
- return <Component />;
- },
-});
-
-const Coverage: React.StatelessComponent<{}> = () => (
- <Base context={context}>
- <Hero>
- <Animation />
- </Hero>
- <Intro>
- <IntroLead title="Measure your tests">
- <p>
- When it comes to writing secure smart contracts, testing is one of the most important steps in the
- process. In order to quantify the robustness of your Solidity testing suite, you need to measure its
- code coverage.
- </p>
- </IntroLead>
- <IntroAside>
- <Code
- language="javascript"
- isDiff={true}
- gutterLength={2}
- gutter={[4, undefined, 4, 4, 4, undefined, 4, 2, 2, 2]}
- >
- {`+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
- }
-}`}
- </Code>
- </IntroAside>
- </Intro>
-
- <Content>
- <ContentBlock main={true} title="Get started" />
- <ContentBlock title="Prerequisites">
- <List>
- <ListItem>
- Use{' '}
- <a href="https://github.com/ethereum/go-ethereum" target="_blank">
- Geth
- </a>{' '}
- as a backing node. We recommend using our{' '}
- <a href="https://hub.docker.com/r/0xorg/devnet" target="_blank">
- Devnet Docker container
- </a>{' '}
- which sets up a Geth node for testing purposes.{' '}
- <a href="https://github.com/0xProject/0x-monorepo/issues/1520" target="_blank">
- Ganache support is a work in progress.
- </a>
- </ListItem>
- <ListItem>
- Understand and use{' '}
- <a href="https://github.com/MetaMask/provider-engine" target="_blank">
- web3-provider-engine
- </a>
- .
- </ListItem>
- </List>
- </ContentBlock>
- <ContentBlock title="Installation">
- <Breakout>
- <Code canCopy={true}>npm install @0x/sol-coverage --save</Code>
- </Breakout>
-
- <p>
- Sol-coverage is a subprovider that needs to be prepended to your{' '}
- <a href="https://github.com/MetaMask/provider-engine" target="_blank">
- provider engine
- </a>
- . Depending on your project setup, you will need to use a specific ArtifactAdapter. Sol-coverage
- ships with the <InlineCode>SolCompilerArtifactAdapter</InlineCode> for use with{' '}
- <a href="https://sol-compiler.com" target="_blank">
- Sol-compiler
- </a>{' '}
- and <InlineCode>TruffleArtifactAdapter</InlineCode> for use with the{' '}
- <a href="https://truffleframework.com/truffle" target="_blank">
- Truffle framework
- </a>{' '}
- (Also see our{' '}
- <a href="https://github.com/0xProject/dev-tools-truffle-example" target="_blank">
- Truffle example project
- </a>{' '}
- for a complete walk-through). You can also write your own and support any artifact format.
- </p>
-
- <Tabs>
- <TabBlock title="Sol-compiler">
- <Code language="javascript" canCopy={true}>
- {`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);`}
- </Code>
- </TabBlock>
- <TabBlock title="Truffle">
- <Code language="javascript" canCopy={true}>
- {`import { TruffleArtifactAdapter } from '@0x/sol-trace';
-
-const projectRoot = '.';
-const solcVersion = '0.5.0';
-const artifactAdapter = new TruffleArtifactAdapter(projectRoot, solcVersion);`}
- </Code>
- </TabBlock>
- <TabBlock title="Custom">
- <Code language="javascript" canCopy={true}>
- {`import { AbstractArtifactAdapter } from '@0x/sol-trace';
-
-class YourCustomArtifactsAdapter extends AbstractArtifactAdapter {...};
-const artifactAdapter = new YourCustomArtifactsAdapter(...);`}
- </Code>
- </TabBlock>
- </Tabs>
- <p>
- Now that we have an <InlineCode>artifactAdapter</InlineCode>, we can create a{' '}
- <InlineCode>CoverageSubprovider</InlineCode> and append it to our provider engine.
- </p>
-
- <Breakout>
- <Code language="javascript" canCopy={true}>
- {`import { ProviderEngine, RpcSubprovider } from 'web3-provider-engine';
-import { CoverageSubprovider } from '@0x/sol-coverage';
-
-const defaultFromAddress = "..."; // Some ethereum address with test funds
-const coverageSubprovider = new CoverageSubprovider(artifactAdapter, defaultFromAddress);
-
-const providerEngine = new ProviderEngine();
-providerEngine.addProvider(coverageSubprovider);
-providerEngine.addProvider(new RpcSubprovider({rpcUrl: 'http://localhost:8545'}));
-providerEngine.start();`}
- </Code>
- </Breakout>
- </ContentBlock>
- </Content>
- <CallToAction />
- </Base>
-);
-
-const root = document.getElementById('app');
-
-if (root.hasChildNodes()) {
- hydrate(<Coverage />, root);
-} else {
- render(<Coverage />, root);
-}
diff --git a/packages/dev-tools-pages/ts/pages/profiler.tsx b/packages/dev-tools-pages/ts/pages/profiler.tsx
deleted file mode 100644
index 0bc4efa45..000000000
--- a/packages/dev-tools-pages/ts/pages/profiler.tsx
+++ /dev/null
@@ -1,176 +0,0 @@
-import * as React from 'react';
-import { hydrate, render } from 'react-dom';
-import * as Loadable from 'react-loadable';
-
-import { context } from 'ts/context/profiler';
-
-import { Base } from 'ts/components/base';
-import { Breakout } from 'ts/components/breakout';
-import { CallToAction } from 'ts/components/call_to_action';
-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: 'profiler-animation' */ 'ts/components/animations/profiler'),
- loading: () => <div />,
- delay: 1000,
- render(loadable: { ProfilerAnimation: any }): React.ReactNode {
- const Component = loadable.ProfilerAnimation;
- return <Component />;
- },
-});
-
-const Profiler: React.StatelessComponent<{}> = () => (
- <Base context={context}>
- <Hero>
- <Animation />
- </Hero>
- <Intro>
- <IntroLead title="Outline gas usage">
- <p>
- Sol-profiler gathers line-by-line gas usage for any transaction submitted through your provider.
- This will help you find unexpected inefficiencies in parts of your smart contract, and take a
- data-driven approach to optimizing it.
- </p>
- </IntroLead>
- <IntroAside>
- <Code
- language="javascript"
- isDiff={true}
- gutterLength={6}
- gutter={[15, 15, undefined, 21747, 20303, 1435]}
- >
- {`+function() public payable {
-+ deposit();
-}
-+function deposit() public payabble {
-+ balanceOf[msg.sender] += msg.value;
-+ Deposit(msg.sender, msg.value);
-}
--function withdraw(uint wad) public {
-- require(balanceOf[msg.sender] >= wad);
-- balanceOf[msg.sender] -= wad;
-- msg.sender.transfer(wad);
-- Withdrawal(msg.sender, wad);
-}`}
- </Code>
- </IntroAside>
- </Intro>
- <Content>
- <ContentBlock main={true} title="Get started" />
- <ContentBlock title="Prerequisites">
- <List>
- <ListItem>
- Use{' '}
- <a href="https://github.com/ethereum/go-ethereum" target="_blank">
- Geth
- </a>{' '}
- as a backing node. We recommend using our{' '}
- <a href="https://hub.docker.com/r/0xorg/devnet" target="_blank">
- Devnet Docker container
- </a>{' '}
- which sets up a Geth node for testing purposes.{' '}
- <a href="https://github.com/0xProject/0x-monorepo/issues/1520" target="_blank">
- Ganache support is a work in progress.
- </a>
- </ListItem>
- <ListItem>
- Understand and use{' '}
- <a href="https://github.com/MetaMask/provider-engine" target="_blank">
- web3-provider-engine
- </a>
- .
- </ListItem>
- </List>
- </ContentBlock>
- <ContentBlock title="Installation">
- <Breakout>
- <Code canCopy={true}>npm install @0x/sol-trace --save</Code>
- </Breakout>
-
- <p>
- Sol-trace is a subprovider that needs to be prepended to your{' '}
- <a href="https://github.com/MetaMask/provider-engine" target="_blank">
- provider engine
- </a>
- . Depending on your project setup, you will need to use a specific ArtifactAdapter. Sol-trace ships
- with the <InlineCode>SolCompilerArtifactAdapter</InlineCode> for use with{' '}
- <a href="https://sol-compiler.com" target="_blank">
- Sol-compiler
- </a>{' '}
- and <InlineCode>TruffleArtifactAdapter</InlineCode> for use with the{' '}
- <a href="https://truffleframework.com/truffle" target="_blank">
- Truffle framework
- </a>{' '}
- (Also see our{' '}
- <a href="https://github.com/0xProject/dev-tools-truffle-example" target="_blank">
- Truffle example project
- </a>{' '}
- for a complete walk-through). You can also write your own and support any artifact format.
- </p>
-
- <Tabs>
- <TabBlock title="Sol-compiler">
- <Code language="javascript" canCopy={true}>
- {`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);`}
- </Code>
- </TabBlock>
- <TabBlock title="Truffle">
- <Code language="javascript" canCopy={true}>
- {`import { TruffleArtifactAdapter } from '@0x/sol-trace';
-
-const projectRoot = '.';
-const solcVersion = '0.5.0';
-const artifactAdapter = new TruffleArtifactAdapter(projectRoot, solcVersion);`}
- </Code>
- </TabBlock>
- <TabBlock title="Custom">
- <Code language="javascript" canCopy={true}>
- {`import { AbstractArtifactAdapter } from '@0x/sol-trace';
-
-class YourCustomArtifactsAdapter extends AbstractArtifactAdapter {...};
-const artifactAdapter = new YourCustomArtifactsAdapter(...);`}
- </Code>
- </TabBlock>
- </Tabs>
- <p>
- Now that we have an <InlineCode>artifactAdapter</InlineCode>, we can create a{' '}
- <InlineCode>ProfilerSubprovider</InlineCode> and append it to our provider engine.
- </p>
-
- <Breakout>
- <Code language="javascript" canCopy={true}>
- {`import { ProviderEngine, RpcSubprovider } from 'web3-provider-engine';
-import { ProfilerSubprovider } from '@0x/sol-profiler';
-
-const defaultFromAddress = "..."; // Some ethereum address with test funds
-const profilerSubprovider = new ProfilerSubprovider(artifactAdapter, defaultFromAddress);
-
-const providerEngine = new ProviderEngine();
-providerEngine.addProvider(profilerSubprovider);
-providerEngine.addProvider(new RpcSubprovider({rpcUrl: 'http://localhost:8545'}));
-providerEngine.start();`}
- </Code>
- </Breakout>
- </ContentBlock>
- </Content>
- <CallToAction />
- </Base>
-);
-
-const root = document.getElementById('app');
-
-if (root.hasChildNodes()) {
- hydrate(<Profiler />, root);
-} else {
- render(<Profiler />, root);
-}
diff --git a/packages/dev-tools-pages/ts/pages/trace.tsx b/packages/dev-tools-pages/ts/pages/trace.tsx
deleted file mode 100644
index cd6180fb9..000000000
--- a/packages/dev-tools-pages/ts/pages/trace.tsx
+++ /dev/null
@@ -1,147 +0,0 @@
-import * as React from 'react';
-import { hydrate, render } from 'react-dom';
-import * as Loadable from 'react-loadable';
-
-import { context } from 'ts/context/trace';
-
-import { Base } from 'ts/components/base';
-import { Breakout } from 'ts/components/breakout';
-import { CallToAction } from 'ts/components/call_to_action';
-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 { List, ListItem } from 'ts/components/list';
-import { TabBlock, Tabs } from 'ts/components/tabs';
-import { Trace as TraceComponent } from 'ts/components/trace';
-
-const Animation = Loadable({
- loader: () => System.import(/* webpackChunkName: 'trace-animation' */ 'ts/components/animations/trace'),
- loading: () => <div />,
- delay: 1000,
- render(loadable: { TraceAnimation: any }): React.ReactNode {
- const Component = loadable.TraceAnimation;
- return <Component />;
- },
-});
-
-const Trace: React.StatelessComponent<{}> = () => (
- <Base context={context}>
- <Hero>
- <Animation />
- </Hero>
- <TraceComponent />
- <Content>
- <ContentBlock main={true} title="Get started" />
- <ContentBlock title="Prerequisites">
- <List>
- <ListItem>
- Use{' '}
- <a href="https://github.com/ethereum/go-ethereum" target="_blank">
- Geth
- </a>{' '}
- as a backing node. We recommend using our{' '}
- <a href="https://hub.docker.com/r/0xorg/devnet" target="_blank">
- Devnet Docker container
- </a>{' '}
- which sets up a Geth node for testing purposes.{' '}
- <a href="https://github.com/0xProject/0x-monorepo/issues/1520" target="_blank">
- Ganache support is a work in progress.
- </a>
- </ListItem>
- <ListItem>
- Understand and use{' '}
- <a href="https://github.com/MetaMask/provider-engine" target="_blank">
- web3-provider-engine
- </a>
- .
- </ListItem>
- </List>
- </ContentBlock>
- <ContentBlock title="Installation">
- <Breakout>
- <Code canCopy={true}>npm install @0x/sol-trace --save</Code>
- </Breakout>
-
- <p>
- Sol-trace is a subprovider that needs to be prepended to your{' '}
- <a href="https://github.com/MetaMask/provider-engine" target="_blank">
- provider engine
- </a>
- . Depending on your project setup, you will need to use a specific ArtifactAdapter. Sol-trace ships
- with the <InlineCode>SolCompilerArtifactAdapter</InlineCode> for use with{' '}
- <a href="https://sol-compiler.com" target="_blank">
- Sol-compiler
- </a>{' '}
- and <InlineCode>TruffleArtifactAdapter</InlineCode> for use with the{' '}
- <a href="https://truffleframework.com/truffle" target="_blank">
- Truffle framework
- </a>{' '}
- (Also see our{' '}
- <a href="https://github.com/0xProject/dev-tools-truffle-example" target="_blank">
- Truffle example project
- </a>{' '}
- for a complete walk-through). You can also write your own and support any artifact format.
- </p>
-
- <Tabs>
- <TabBlock title="Sol-compiler">
- <Code language="javascript" canCopy={true}>
- {`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);`}
- </Code>
- </TabBlock>
- <TabBlock title="Truffle">
- <Code language="javascript" canCopy={true}>
- {`import { TruffleArtifactAdapter } from '@0x/sol-trace';
-
-const projectRoot = '.';
-const solcVersion = '0.5.0';
-const artifactAdapter = new TruffleArtifactAdapter(projectRoot, solcVersion);`}
- </Code>
- </TabBlock>
- <TabBlock title="Custom">
- <Code language="javascript" canCopy={true}>
- {`import { AbstractArtifactAdapter } from '@0x/sol-trace';
-
-class YourCustomArtifactsAdapter extends AbstractArtifactAdapter {...};
-const artifactAdapter = new YourCustomArtifactsAdapter(...);`}
- </Code>
- </TabBlock>
- </Tabs>
- <p>
- Now that we have an <InlineCode>artifactAdapter</InlineCode>, we can create a{' '}
- <InlineCode>revertTraceSubprovider</InlineCode> and append it to our provider engine.
- </p>
-
- <Breakout>
- <Code language="javascript" canCopy={true}>
- {`import { ProviderEngine, RpcSubprovider } from 'web3-provider-engine';
-import { RevertTraceSubprovider } from '@0x/sol-trace';
-
-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();`}
- </Code>
- </Breakout>
- <p>Stack traces will now be printed whenever your contracts revert!</p>
- </ContentBlock>
- </Content>
- <CallToAction />
- </Base>
-);
-
-const root = document.getElementById('app');
-
-if (root.hasChildNodes()) {
- hydrate(<Trace />, root);
-} else {
- render(<Trace />, root);
-}