import * as React from 'react';
import styled from 'styled-components';
import { ContextInterface, ThemeContext } from 'ts/context';
import ExactLocation from 'ts/icons/exact-location.svg';
import NoLocation from 'ts/icons/no-location.svg';
import TimeConsuming from 'ts/icons/time-consuming.svg';
import TimeSaving from 'ts/icons/time-saving.svg';
import { colors, media } from 'ts/variables';
import { Breakout } from './breakout';
import { Code } from './code';
import { Container } from './container';
import { Alpha, Gamma, Lead } from './typography';
const Trace: React.StatelessComponent<{}> = () => (
<ThemeContext.Consumer>
{(props: ContextInterface) => (
<StyledSection background={props.colors.secondary}>
<Wrapper>
<Block>
<Alpha>The Issue</Alpha>
<MainCopy>
Every time an Ethereum transaction fails, it's extremely hard to trace down the
troublemaking line of code. The only hint you'll get is a generic error.
</MainCopy>
<Breakout>
<Code isLight={true}>Error: VM Exception while processing transaction: revert</Code>
</Breakout>
<List>
<Item>
<Copy dark={true}>
<Gamma as="h3">No location</Gamma>
<p>
The error basically says "anything could have gone wrong here", which keeps you
completely in the dark about its exact location.
</p>
</Copy>
<Icon as={NoLocation} />
</Item>
<Item>
<Copy dark={true}>
<Gamma as="h3">Time-consuming</Gamma>
<p>
Working within a large code-base that contains many smart contracts, finding the
failing line of code quickly becomes a daunting task.
</p>
</Copy>
<Icon as={TimeConsuming} />
</Item>
</List>
</Block>
<Block background={props.colors.secondary}>
<Alpha>The Fix</Alpha>
<MainCopy>
Sol-trace will give you full stack traces, including contract names, line numbers and code
snippets, every time you encounter an error.
</MainCopy>
<Breakout>
<Code isLight={true} language="javascript">
{`contracts/src/2.0.0/protocol/Exchange/MixinSignatureValidator.sol:51:8
require(
isValidSignature(
hash,
signerAddress,
signature
),
"INVALID_SIGNATURE"
)`}
</Code>
</Breakout>
<List>
<Item>
<Copy>
<Gamma as="h3">Exact location</Gamma>
<p>
It shows you the exact location of the offending line and where it was called
from.
</p>
</Copy>
<Icon as={ExactLocation} />
</Item>
<Item>
<Copy>
<Gamma as="h3">Time-saving</Gamma>
<p>
Turning "Your code failed somewhere, good luck debugging it" into "Your code
failed on line X of contract Y", drastically improves the developer experience.
</p>
</Copy>
<Icon as={TimeSaving} />
</Item>
</List>
</Block>
</Wrapper>
</StyledSection>
)}
</ThemeContext.Consumer>
);
interface TraceProps {
background?: string;
}
const StyledSection = styled.section<TraceProps>`
max-width: 90rem;
margin: 0 auto;
background: linear-gradient(to right, ${colors.black} 50%, ${props => props.background} 50%);
overflow: hidden;
${media.large`
background: none
padding-top: 0;
padding-bottom: 0;
`};
`;
const Wrapper = styled(Container)`
display: flex;
${Alpha} {
padding-bottom: 2.5rem;
${media.small`padding-bottom: 1.875rem;`};
}
${media.large`
display: block;
width: 100%;
`};
`;
const Block = styled.div<TraceProps>`
width: 50%;
background: ${props => (props.background ? props.background : colors.black)};
color: ${props => (props.background ? 'inherit' : colors.white)};
padding-top: 6.25rem;
padding-bottom: 5.25rem;
:first-of-type {
padding-right: 6.25rem;
}
:last-of-type {
padding-left: 6.25rem;
}
${media.xlarge`
:first-of-type {
padding-right: 2.5rem;
}
:last-of-type {
padding-left: 2.5rem;
}
`}
${media.large`
width: 100%;
padding: 2.5rem;
`}
${media.small`
padding-left: 1.875rem;
padding-right: 1.875rem;
`};
`;
const MainCopy = styled(Lead)`
margin-bottom: 3.1875rem;
${media.small`
margin-bottom: 1.125rem;
`};
`;
const List = styled.ul`
margin-top: 6.25rem;
margin-bottom: 0;
padding: 0;
${media.small`margin-top: 3.4375rem;`};
`;
const Item = styled.li`
display: flex;
align-items: center;
:not(:last-child) {
margin-bottom: 4.4375rem;
${media.small`margin-bottom: 3.4375rem;`};
}
`;
const Copy = styled.div<{ dark: boolean }>`
margin-right: 5.875rem;
${props =>
props.dark &&
`
p {
color: #ccc;
}
`}
${media.small`margin-right: 2.0625rem;`};
`;
const Icon = styled.div`
flex-shrink: 0;
`;
export { Trace };