Commit 3282be21 authored by Mark Tyneway's avatar Mark Tyneway Committed by GitHub

Merge branch 'develop' into regenesis/0.4.0

parents a415d017 f9bacd71
---
'@eth-optimism/data-transport-layer': patch
---
Adds additional code into the DTL to defend against situations where an RPC provider might be missing an event.
---
'@eth-optimism/smock': patch
---
Minor smock patch to add support for hardhat 2.4.0 and up
---
'@eth-optimism/batch-submitter': patch
'@eth-optimism/common-ts': patch
'@eth-optimism/data-transport-layer': patch
---
Move the metric prefix string to a label #1047
name: sync-tests name: sync-tests
on: on: workflow_dispatch
push:
branches:
- 'master'
- 'develop'
- 'regenesis/*'
pull_request:
workflow_dispatch:
jobs: jobs:
integration-sync-test: integration-sync-test:
......
# <h1 align="center"> Optimism Monorepo </h1> <div align="center">
<a href="https://community.optimism.io"><img alt="Optimism" src="https://user-images.githubusercontent.com/14298799/122151157-0b197500-ce2d-11eb-89d8-6240e3ebe130.png" width=280></a>
<br />
<h1> The Optimism Monorepo</h1>
</div>
<p align="center">
<a href="https://github.com/ethereum-optimism/optimism/actions/workflows/ts-packages.yml?query=branch%3Amaster"><img src="https://github.com/ethereum-optimism/optimism/workflows/typescript%20/%20contracts/badge.svg" /></a>
<a href="https://github.com/ethereum-optimism/optimism/actions/workflows/integration.yml?query=branch%3Amaster"><img src="https://github.com/ethereum-optimism/optimism/workflows/integration/badge.svg" /></a>
<a href="https://github.com/ethereum-optimism/optimism/actions/workflows/geth.yml?query=branch%3Amaster"><img src="https://github.com/ethereum-optimism/optimism/workflows/geth%20unit%20tests/badge.svg" /></a>
</p>
**Monorepo implementing the Optimistic Ethereum protocol** ## TL;DR
[![Github Actions](https://github.com/ethereum-optimism/optimism/workflows/typescript%20/%20contracts/badge.svg)](https://github.com/ethereum-optimism/optimism/actions/workflows/ts-packages.yml?query=branch%3Amaster) This is the primary place where [Optimism](https://optimism.io) works on stuff related to [Optimistic Ethereum](https://research.paradigm.xyz/optimism).
[![Github Actions](https://github.com/ethereum-optimism/optimism/workflows/integration/badge.svg)](https://github.com/ethereum-optimism/optimism/actions/workflows/integration.yml?query=branch%3Amaster)
[![Github Actions](https://github.com/ethereum-optimism/optimism/workflows/geth%20unit%20tests/badge.svg)](https://github.com/ethereum-optimism/optimism/actions/workflows/geth.yml?query=branch%3Amaster)
## Documentation ## Documentation
Extensive documentation is available [here](http://community.optimism.io/docs/) Extensive documentation is available [here](http://community.optimism.io/docs/).
## Community
* [Come hang on discord](https://discord.optimism.io)
## Directory Structure ## Directory Structure
...@@ -26,65 +37,64 @@ Extensive documentation is available [here](http://community.optimism.io/docs/) ...@@ -26,65 +37,64 @@ Extensive documentation is available [here](http://community.optimism.io/docs/)
* [`ops`](./ops): Contains Dockerfiles for containerizing each service involved in the protocol, * [`ops`](./ops): Contains Dockerfiles for containerizing each service involved in the protocol,
as well as a docker-compose file for bringing up local testnets easily as well as a docker-compose file for bringing up local testnets easily
## Quickstart ## Development Quick Start
### Installation ### Dependencies
Dependency management is done using `yarn`. You'll need the following:
```bash
git clone git@github.com:ethereum-optimism/optimism.git
cd optimism
yarn
```
After installing the dependencies, you must also build them so that the typescript * [Git](https://git-scm.com/downloads)
is compiled down to javascript: * [NodeJS](https://nodejs.org/en/download/)
* [Yarn](https://classic.yarnpkg.com/en/docs/install)
* [Docker](https://docs.docker.com/get-docker/)
* [Docker Compose](https://docs.docker.com/compose/install/)
```bash ### Setup
yarn build
```
When changing branches, be sure to clean the repo before building. Clone the repository, open it, and install nodejs packages with `yarn`:
```bash ```bash
yarn clean git clone git@github.com:ethereum-optimism/optimism.git
cd optimism
yarn install
``` ```
### Unit tests ### Building the TypeScript packages
All tests are run in parallel using `lerna`: To build all of the [TypeScript packages](./packages), run:
```bash ```bash
yarn test yarn clean
yarn build
``` ```
When you want to run tests only for packages that have changed since `master` (or any other branch) Packages compiled when on one branch may not be compatible with packages on a different branch.
you can run `yarn lerna run test --parallel --since master` **You should recompile all packages whenever you move from one branch to another.**
Use the above commands to recompile the packages.
### Integration Tests ### Building the rest of the system
#### Running the integration tests If you want to run an Optimistic Ethereum node OR **if you want to run the integration tests**, you'll need to build the rest of the system.
The integration tests first require bringing up the Optimism stack. This is done via
a Docker Compose network. For better performance, we also recommend enabling Docker
BuildKit
```bash ```bash
cd ops cd ops
export COMPOSE_DOCKER_CLI_BUILD=1 export COMPOSE_DOCKER_CLI_BUILD=1 # these environment variables significantly speed up build time
export DOCKER_BUILDKIT=1 export DOCKER_BUILDKIT=1
docker-compose build docker-compose build
cd ../integration-tests
yarn build:integration
yarn test:integration
``` ```
#### Locally testing and re-building specific services This will build the following containers:
* [`builder`](https://hub.docker.com/r/ethereumoptimism/builder): used to build the TypeScript packages
If you want to make changes to any of the containers, you'll have to bring one down, * [`l1_chain`](https://hub.docker.com/r/ethereumoptimism/hardhat): simulated L1 chain using hardhat-evm as a backend
rebuild it, and then bring it back up. * [`deployer`](https://hub.docker.com/r/ethereumoptimism/deployer): process that deploys L1 smart contracts to the L1 chain
* [`dtl`](https://hub.docker.com/r/ethereumoptimism/data-transport-layer): service that indexes transaction data from the L1 chain
* [`l2geth`](https://hub.docker.com/r/ethereumoptimism/l2geth): L2 geth node running in Sequencer mode
* [`verifier`](https://hub.docker.com/r/ethereumoptimism/go-ethereum): L2 geth node running in Verifier mode
* [`relayer`](https://hub.docker.com/r/ethereumoptimism/message-relayer): helper process that relays messages between L1 and L2
* [`batch_submitter`](https://hub.docker.com/r/ethereumoptimism/batch-submitter): service that submits batches of Sequencer transactions to the L1 chain
* [`integration_tests`](https://hub.docker.com/r/ethereumoptimism/integration-tests): integration tests in a box
If you want to make a change to a container, you'll need to take it down and rebuild it.
For example, if you make a change in l2geth: For example, if you make a change in l2geth:
```bash ```bash
...@@ -104,17 +114,81 @@ docker-compose build -- builder batch_submitter ...@@ -104,17 +114,81 @@ docker-compose build -- builder batch_submitter
docker-compose start batch_submitter docker-compose start batch_submitter
``` ```
Source code changes can have an impact on more than one container.
**If you're unsure about which containers to rebuild, just rebuild them all**:
```bash
cd ops
docker-compose down
docker-compose build
docker-compose up
```
Finally, **if you're running into weird problems and nothing seems to be working**, run:
```bash
cd optimism
yarn clean
yarn build
cd ops
docker-compose down -v
docker-compose build
docker-compose up
```
#### Viewing docker container logs
By default, the `docker-compose up` command will show logs from all services, and that By default, the `docker-compose up` command will show logs from all services, and that
can be hard to filter through. In order to view the logs from a specific service, you can run: can be hard to filter through. In order to view the logs from a specific service, you can run:
``` ```bash
docker-compose logs --follow <service name> docker-compose logs --follow <service name>
``` ```
### Static analysis
To run `slither` locally in `./packages/contracts` do ### Running tests
Before running tests: **follow the above instructions to get everything built.**
#### Running unit tests
Run unit tests for all packages in parallel via:
```bash
yarn test
``` ```
To run unit tests for a specific package:
```bash
cd packages/package-to-test
yarn test
```
#### Running integration tests
Follow above instructions for building the whole stack.
Build and run the integration tests:
```bash
cd integration-tests
yarn build:integration
yarn test:integration
```
## Additional Reference Material
### Running contract static analysis
We perform static analysis with [`slither`](https://github.com/crytic/slither).
You must have Python 3.x installed to run `slither`.
To run `slither` locally, do:
```bash
cd packages/contracts
pip3 install slither-analyzer pip3 install slither-analyzer
yarn test:slither yarn test:slither
``` ```
## License
Code forked from [`go-ethereum`](https://github.com/ethereum/go-ethereum) under the name [`l2geth`](https://github.com/ethereum-optimism/optimism/tree/master/l2geth) is licensed under the [GNU GPLv3](https://gist.github.com/kn9ts/cbe95340d29fc1aaeaa5dd5c059d2e60) in accordance with the [original license](https://github.com/ethereum/go-ethereum/blob/master/COPYING).
All other files within this repository are licensed under the [MIT License](https://github.com/ethereum-optimism/optimism/blob/master/LICENSE) unless stated otherwise.
...@@ -84,6 +84,7 @@ export const run = async () => { ...@@ -84,6 +84,7 @@ export const run = async () => {
const env = process.env const env = process.env
const environment = config.str('node-env', env.NODE_ENV) const environment = config.str('node-env', env.NODE_ENV)
const network = config.str('eth-network-name', env.ETH_NETWORK_NAME) const network = config.str('eth-network-name', env.ETH_NETWORK_NAME)
const service = `batch-submitter`
const release = `batch-submitter@${env.npm_package_version}` const release = `batch-submitter@${env.npm_package_version}`
const sentryDsn = config.str('sentry-dsn', env.SENTRY_DSN) const sentryDsn = config.str('sentry-dsn', env.SENTRY_DSN)
const sentryTraceRate = config.ufloat( const sentryTraceRate = config.ufloat(
...@@ -181,8 +182,7 @@ export const run = async () => { ...@@ -181,8 +182,7 @@ export const run = async () => {
/* Metrics */ /* Metrics */
const metrics = new Metrics({ const metrics = new Metrics({
prefix: name, labels: { environment, release, network, service },
labels: { environment, release, network },
}) })
const FRAUD_SUBMISSION_ADDRESS = config.str( const FRAUD_SUBMISSION_ADDRESS = config.str(
......
...@@ -9,7 +9,7 @@ import { Server } from 'net' ...@@ -9,7 +9,7 @@ import { Server } from 'net'
import { Logger } from './logger' import { Logger } from './logger'
export interface MetricsOptions { export interface MetricsOptions {
prefix: string prefix?: string
labels?: Object labels?: Object
} }
......
export type EventName =
| 'TransactionEnqueued'
| 'SequencerBatchAppended'
| 'StateBatchAppended'
export class MissingElementError extends Error {
constructor(public name: EventName) {
super(`missing event: ${name}`)
}
}
...@@ -22,6 +22,7 @@ import { ...@@ -22,6 +22,7 @@ import {
SEQUENCER_GAS_LIMIT, SEQUENCER_GAS_LIMIT,
parseSignatureVParam, parseSignatureVParam,
} from '../../../utils' } from '../../../utils'
import { MissingElementError } from './errors'
export const handleEventsSequencerBatchAppended: EventHandlerSet< export const handleEventsSequencerBatchAppended: EventHandlerSet<
EventArgsSequencerBatchAppended, EventArgsSequencerBatchAppended,
...@@ -181,6 +182,19 @@ export const handleEventsSequencerBatchAppended: EventHandlerSet< ...@@ -181,6 +182,19 @@ export const handleEventsSequencerBatchAppended: EventHandlerSet<
} }
}, },
storeEvent: async (entry, db) => { storeEvent: async (entry, db) => {
// Defend against situations where we missed an event because the RPC provider
// (infura/alchemy/whatever) is missing an event.
if (entry.transactionBatchEntry.index > 0) {
const prevTransactionBatchEntry = await db.getTransactionBatchByIndex(
entry.transactionBatchEntry.index - 1
)
// We should *always* have a previous transaction batch here.
if (prevTransactionBatchEntry === null) {
throw new MissingElementError('SequencerBatchAppended')
}
}
await db.putTransactionBatchEntries([entry.transactionBatchEntry]) await db.putTransactionBatchEntries([entry.transactionBatchEntry])
await db.putTransactionEntries(entry.transactionEntries) await db.putTransactionEntries(entry.transactionEntries)
......
...@@ -11,6 +11,7 @@ import { ...@@ -11,6 +11,7 @@ import {
StateRootEntry, StateRootEntry,
EventHandlerSet, EventHandlerSet,
} from '../../../types' } from '../../../types'
import { MissingElementError } from './errors'
export const handleEventsStateBatchAppended: EventHandlerSet< export const handleEventsStateBatchAppended: EventHandlerSet<
EventArgsStateBatchAppended, EventArgsStateBatchAppended,
...@@ -67,6 +68,19 @@ export const handleEventsStateBatchAppended: EventHandlerSet< ...@@ -67,6 +68,19 @@ export const handleEventsStateBatchAppended: EventHandlerSet<
} }
}, },
storeEvent: async (entry, db) => { storeEvent: async (entry, db) => {
// Defend against situations where we missed an event because the RPC provider
// (infura/alchemy/whatever) is missing an event.
if (entry.stateRootBatchEntry.index > 0) {
const prevStateRootBatchEntry = await db.getStateRootBatchByIndex(
entry.stateRootBatchEntry.index - 1
)
// We should *always* have a previous batch entry here.
if (prevStateRootBatchEntry === null) {
throw new MissingElementError('StateBatchAppended')
}
}
await db.putStateRootBatchEntries([entry.stateRootBatchEntry]) await db.putStateRootBatchEntries([entry.stateRootBatchEntry])
await db.putStateRootEntries(entry.stateRootEntries) await db.putStateRootEntries(entry.stateRootEntries)
}, },
......
...@@ -3,6 +3,7 @@ import { EventArgsTransactionEnqueued } from '@eth-optimism/core-utils' ...@@ -3,6 +3,7 @@ import { EventArgsTransactionEnqueued } from '@eth-optimism/core-utils'
/* Imports: Internal */ /* Imports: Internal */
import { BigNumber } from 'ethers' import { BigNumber } from 'ethers'
import { EnqueueEntry, EventHandlerSet } from '../../../types' import { EnqueueEntry, EventHandlerSet } from '../../../types'
import { MissingElementError } from './errors'
export const handleEventsTransactionEnqueued: EventHandlerSet< export const handleEventsTransactionEnqueued: EventHandlerSet<
EventArgsTransactionEnqueued, EventArgsTransactionEnqueued,
...@@ -25,6 +26,17 @@ export const handleEventsTransactionEnqueued: EventHandlerSet< ...@@ -25,6 +26,17 @@ export const handleEventsTransactionEnqueued: EventHandlerSet<
} }
}, },
storeEvent: async (entry, db) => { storeEvent: async (entry, db) => {
// Defend against situations where we missed an event because the RPC provider
// (infura/alchemy/whatever) is missing an event.
if (entry.index > 0) {
const prevEnqueueEntry = await db.getEnqueueByIndex(entry.index - 1)
// We should *alwaus* have a previous enqueue entry here.
if (prevEnqueueEntry === null) {
throw new MissingElementError('TransactionEnqueued')
}
}
await db.putEnqueueEntries([entry]) await db.putEnqueueEntries([entry])
}, },
} }
...@@ -19,6 +19,7 @@ import { handleEventsTransactionEnqueued } from './handlers/transaction-enqueued ...@@ -19,6 +19,7 @@ import { handleEventsTransactionEnqueued } from './handlers/transaction-enqueued
import { handleEventsSequencerBatchAppended } from './handlers/sequencer-batch-appended' import { handleEventsSequencerBatchAppended } from './handlers/sequencer-batch-appended'
import { handleEventsStateBatchAppended } from './handlers/state-batch-appended' import { handleEventsStateBatchAppended } from './handlers/state-batch-appended'
import { L1DataTransportServiceOptions } from '../main/service' import { L1DataTransportServiceOptions } from '../main/service'
import { MissingElementError, EventName } from './handlers/errors'
export interface L1IngestionServiceOptions export interface L1IngestionServiceOptions
extends L1DataTransportServiceOptions { extends L1DataTransportServiceOptions {
...@@ -203,7 +204,46 @@ export class L1IngestionService extends BaseService<L1IngestionServiceOptions> { ...@@ -203,7 +204,46 @@ export class L1IngestionService extends BaseService<L1IngestionServiceOptions> {
await sleep(this.options.pollingInterval) await sleep(this.options.pollingInterval)
} }
} catch (err) { } catch (err) {
if (!this.running || this.options.dangerouslyCatchAllErrors) { if (err instanceof MissingElementError) {
// Different functions for getting the last good element depending on the event type.
const handlers = {
SequencerBatchAppended: this.state.db.getLatestTransactionBatch,
StateBatchAppended: this.state.db.getLatestStateRootBatch,
TransactionEnqueued: this.state.db.getLatestEnqueue,
}
// Find the last good element and reset the highest synced L1 block to go back to the
// last good element. Will resync other event types too but we have no issues with
// syncing the same events more than once.
const eventName = err.name
if (!(eventName in handlers)) {
throw new Error(
`unable to recover from missing event, no handler for ${eventName}`
)
}
const lastGoodElement: {
blockNumber: number
} = await handlers[eventName]()
// Erroring out here seems fine. An error like this is only likely to occur quickly after
// this service starts up so someone will be here to deal with it. Automatic recovery is
// nice but not strictly necessary. Could be a good feature for someone to implement.
if (lastGoodElement === null) {
throw new Error(`unable to recover from missing event`)
}
// Rewind back to the block number that the last good element was in.
await this.state.db.setHighestSyncedL1Block(
lastGoodElement.blockNumber
)
// Something we should be keeping track of.
this.logger.warn('recovering from a missing event', {
eventName,
lastGoodBlockNumber: lastGoodElement.blockNumber,
})
} else if (!this.running || this.options.dangerouslyCatchAllErrors) {
this.logger.error('Caught an unhandled error', { this.logger.error('Caught an unhandled error', {
message: err.toString(), message: err.toString(),
stack: err.stack, stack: err.stack,
......
...@@ -153,11 +153,11 @@ export class L1TransportServer extends BaseService<L1TransportServerOptions> { ...@@ -153,11 +153,11 @@ export class L1TransportServer extends BaseService<L1TransportServerOptions> {
*/ */
private _initMetrics() { private _initMetrics() {
this.metrics = new Metrics({ this.metrics = new Metrics({
prefix: this.name,
labels: { labels: {
environment: this.options.nodeEnv, environment: this.options.nodeEnv,
network: this.options.ethNetworkName, network: this.options.ethNetworkName,
release: this.options.release, release: this.options.release,
service: this.name,
}, },
}) })
const metricsMiddleware = promBundle({ const metricsMiddleware = promBundle({
......
...@@ -23,7 +23,7 @@ ...@@ -23,7 +23,7 @@
"@nomiclabs/ethereumjs-vm": "^4", "@nomiclabs/ethereumjs-vm": "^4",
"@nomiclabs/hardhat-ethers": "^2", "@nomiclabs/hardhat-ethers": "^2",
"ethers": "^5", "ethers": "^5",
"hardhat": "^2.2.1" "hardhat": "^2"
}, },
"dependencies": { "dependencies": {
"@eth-optimism/core-utils": "^0.4.5", "@eth-optimism/core-utils": "^0.4.5",
...@@ -54,7 +54,7 @@ ...@@ -54,7 +54,7 @@
"eslint-plugin-unicorn": "^32.0.1", "eslint-plugin-unicorn": "^32.0.1",
"ethereum-waffle": "^3.3.0", "ethereum-waffle": "^3.3.0",
"ethers": "^5.0.31", "ethers": "^5.0.31",
"hardhat": "^2.2.1", "hardhat": "^2.4.0",
"lodash": "^4.17.20", "lodash": "^4.17.20",
"prettier": "^2.2.1" "prettier": "^2.2.1"
} }
......
/* Imports: External */ /* Imports: External */
import { HardhatNetworkProvider } from 'hardhat/internal/hardhat-network/provider/provider' import { HardhatNetworkProvider } from 'hardhat/internal/hardhat-network/provider/provider'
import { decodeRevertReason } from 'hardhat/internal/hardhat-network/stack-traces/revert-reasons'
import { VmError } from '@nomiclabs/ethereumjs-vm/dist/exceptions' import { VmError } from '@nomiclabs/ethereumjs-vm/dist/exceptions'
import BN from 'bn.js' import BN from 'bn.js'
/* eslint-disable @typescript-eslint/no-var-requires */
// Handle hardhat ^2.4.0
let decodeRevertReason: (value: Buffer) => string
try {
decodeRevertReason = require('hardhat/internal/hardhat-network/stack-traces/revert-reasons')
.decodeRevertReason
} catch (err) {
const {
ReturnData,
} = require('hardhat/internal/hardhat-network/provider/return-data')
decodeRevertReason = (value: Buffer) => {
return new ReturnData(value).decodeError()
}
}
// Handle hardhat ^2.2.0 // Handle hardhat ^2.2.0
let TransactionExecutionError: any let TransactionExecutionError: any
try { try {
// eslint-disable-next-line @typescript-eslint/no-var-requires
TransactionExecutionError = require('hardhat/internal/hardhat-network/provider/errors') TransactionExecutionError = require('hardhat/internal/hardhat-network/provider/errors')
.TransactionExecutionError .TransactionExecutionError
} catch (err) { } catch (err) {
// eslint-disable-next-line @typescript-eslint/no-var-requires
TransactionExecutionError = require('hardhat/internal/core/providers/errors') TransactionExecutionError = require('hardhat/internal/core/providers/errors')
.TransactionExecutionError .TransactionExecutionError
} }
/* eslint-enable @typescript-eslint/no-var-requires */
/* Imports: Internal */ /* Imports: Internal */
import { MockContract, SmockedVM } from './types' import { MockContract, SmockedVM } from './types'
......
...@@ -565,6 +565,16 @@ ...@@ -565,6 +565,16 @@
ethereumjs-util "^7.0.10" ethereumjs-util "^7.0.10"
merkle-patricia-tree "^4.1.0" merkle-patricia-tree "^4.1.0"
"@ethereumjs/block@^3.3.0":
version "3.3.0"
resolved "https://registry.yarnpkg.com/@ethereumjs/block/-/block-3.3.0.tgz#a1b3baec831c71c0d9e7f6145f25e919cff4939c"
integrity sha512-WoefY9Rs4W8vZTxG9qwntAlV61xsSv0NPoXmHO7x3SH16dwJQtU15YvahPCz4HEEXbu7GgGgNgu0pv8JY7VauA==
dependencies:
"@ethereumjs/common" "^2.3.0"
"@ethereumjs/tx" "^3.2.0"
ethereumjs-util "^7.0.10"
merkle-patricia-tree "^4.2.0"
"@ethereumjs/blockchain@^5.2.1": "@ethereumjs/blockchain@^5.2.1":
version "5.2.1" version "5.2.1"
resolved "https://registry.yarnpkg.com/@ethereumjs/blockchain/-/blockchain-5.2.1.tgz#83ed83647667265f1666f111caf065ef9d1e82b5" resolved "https://registry.yarnpkg.com/@ethereumjs/blockchain/-/blockchain-5.2.1.tgz#83ed83647667265f1666f111caf065ef9d1e82b5"
...@@ -580,6 +590,21 @@ ...@@ -580,6 +590,21 @@
rlp "^2.2.4" rlp "^2.2.4"
semaphore-async-await "^1.5.1" semaphore-async-await "^1.5.1"
"@ethereumjs/blockchain@^5.3.0":
version "5.3.0"
resolved "https://registry.yarnpkg.com/@ethereumjs/blockchain/-/blockchain-5.3.0.tgz#206936e30a4320d87a26e58d157eadef21ef6ff1"
integrity sha512-B0Y5QDZcRDQISPilv3m8nzk97QmC98DnSE9WxzGpCxfef22Mw7xhwGipci5Iy0dVC2Np2Cr5d3F6bHAR7+yVmQ==
dependencies:
"@ethereumjs/block" "^3.3.0"
"@ethereumjs/common" "^2.3.0"
"@ethereumjs/ethash" "^1.0.0"
debug "^2.2.0"
ethereumjs-util "^7.0.10"
level-mem "^5.0.1"
lru-cache "^5.1.1"
rlp "^2.2.4"
semaphore-async-await "^1.5.1"
"@ethereumjs/common@^2.2.0": "@ethereumjs/common@^2.2.0":
version "2.2.0" version "2.2.0"
resolved "https://registry.yarnpkg.com/@ethereumjs/common/-/common-2.2.0.tgz#850a3e3e594ee707ad8d44a11e8152fb62450535" resolved "https://registry.yarnpkg.com/@ethereumjs/common/-/common-2.2.0.tgz#850a3e3e594ee707ad8d44a11e8152fb62450535"
...@@ -588,6 +613,14 @@ ...@@ -588,6 +613,14 @@
crc-32 "^1.2.0" crc-32 "^1.2.0"
ethereumjs-util "^7.0.9" ethereumjs-util "^7.0.9"
"@ethereumjs/common@^2.3.0", "@ethereumjs/common@^2.3.1":
version "2.3.1"
resolved "https://registry.yarnpkg.com/@ethereumjs/common/-/common-2.3.1.tgz#d692e3aff5adb35dd587dd1e6caab69e0ed2fa0b"
integrity sha512-V8hrULExoq0H4HFs3cCmdRGbgmipmlNzak6Xg34nHYfQyqkSdrCuflvYjyWmsNpI8GtrcZhzifAbgX/1C1Cjwg==
dependencies:
crc-32 "^1.2.0"
ethereumjs-util "^7.0.10"
"@ethereumjs/ethash@^1.0.0": "@ethereumjs/ethash@^1.0.0":
version "1.0.0" version "1.0.0"
resolved "https://registry.yarnpkg.com/@ethereumjs/ethash/-/ethash-1.0.0.tgz#4e77f85b37be1ade5393e8719bdabac3e796ddaa" resolved "https://registry.yarnpkg.com/@ethereumjs/ethash/-/ethash-1.0.0.tgz#4e77f85b37be1ade5393e8719bdabac3e796ddaa"
...@@ -606,6 +639,14 @@ ...@@ -606,6 +639,14 @@
"@ethereumjs/common" "^2.2.0" "@ethereumjs/common" "^2.2.0"
ethereumjs-util "^7.0.10" ethereumjs-util "^7.0.10"
"@ethereumjs/tx@^3.2.0", "@ethereumjs/tx@^3.2.1":
version "3.2.1"
resolved "https://registry.yarnpkg.com/@ethereumjs/tx/-/tx-3.2.1.tgz#65f5f1c11541764f08377a94ba4b0dcbbd67739e"
integrity sha512-i9V39OtKvwWos1uVNZxdVhd7zFOyzFLjgt69CoiOY0EmXugS0HjO3uxpLBSglDKFMRriuGqw6ddKEv+RP1UNEw==
dependencies:
"@ethereumjs/common" "^2.3.1"
ethereumjs-util "^7.0.10"
"@ethereumjs/vm@^5.3.2": "@ethereumjs/vm@^5.3.2":
version "5.3.2" version "5.3.2"
resolved "https://registry.yarnpkg.com/@ethereumjs/vm/-/vm-5.3.2.tgz#b4d83a3d50a7ad22d6d412cc21bbde221b3e2871" resolved "https://registry.yarnpkg.com/@ethereumjs/vm/-/vm-5.3.2.tgz#b4d83a3d50a7ad22d6d412cc21bbde221b3e2871"
...@@ -7621,7 +7662,7 @@ github-from-package@0.0.0: ...@@ -7621,7 +7662,7 @@ github-from-package@0.0.0:
resolved "https://registry.yarnpkg.com/github-from-package/-/github-from-package-0.0.0.tgz#97fb5d96bfde8973313f20e8288ef9a167fa64ce" resolved "https://registry.yarnpkg.com/github-from-package/-/github-from-package-0.0.0.tgz#97fb5d96bfde8973313f20e8288ef9a167fa64ce"
integrity sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4= integrity sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4=
glob-parent@^5.1.0, glob-parent@^5.1.1, glob-parent@~5.1.0: glob-parent@^5.0.0, glob-parent@^5.1.0, glob-parent@^5.1.1, glob-parent@~5.1.0:
version "5.1.2" version "5.1.2"
resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4"
integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==
...@@ -7955,6 +7996,59 @@ hardhat@^2.3.0: ...@@ -7955,6 +7996,59 @@ hardhat@^2.3.0:
uuid "^3.3.2" uuid "^3.3.2"
ws "^7.2.1" ws "^7.2.1"
hardhat@^2.4.0:
version "2.4.0"
resolved "https://registry.yarnpkg.com/hardhat/-/hardhat-2.4.0.tgz#b0db7a6e07fa72414665634ced149bbb10252499"
integrity sha512-IMh7Ws/7fIO5RRkm4nhqS2JWEct0690K35BcFVuIOoIRMcDLKc/7+JSxhey3RkXc5M4qUvdxfQI0LRQx4aqBZw==
dependencies:
"@ethereumjs/block" "^3.3.0"
"@ethereumjs/blockchain" "^5.3.0"
"@ethereumjs/common" "^2.3.1"
"@ethereumjs/tx" "^3.2.1"
"@ethereumjs/vm" "^5.3.2"
"@ethersproject/abi" "^5.1.2"
"@sentry/node" "^5.18.1"
"@solidity-parser/parser" "^0.11.0"
"@types/bn.js" "^5.1.0"
"@types/lru-cache" "^5.1.0"
abort-controller "^3.0.0"
adm-zip "^0.4.16"
ansi-escapes "^4.3.0"
chalk "^2.4.2"
chokidar "^3.4.0"
ci-info "^2.0.0"
debug "^4.1.1"
enquirer "^2.3.0"
env-paths "^2.2.0"
eth-sig-util "^2.5.2"
ethereum-cryptography "^0.1.2"
ethereumjs-abi "^0.6.8"
ethereumjs-util "^7.0.10"
find-up "^2.1.0"
fp-ts "1.19.3"
fs-extra "^7.0.1"
glob "^7.1.3"
https-proxy-agent "^5.0.0"
immutable "^4.0.0-rc.12"
io-ts "1.10.4"
lodash "^4.17.11"
merkle-patricia-tree "^4.2.0"
mnemonist "^0.38.0"
mocha "^7.1.2"
node-fetch "^2.6.0"
qs "^6.7.0"
raw-body "^2.4.1"
resolve "1.17.0"
semver "^6.3.0"
slash "^3.0.0"
solc "0.7.3"
source-map-support "^0.5.13"
stacktrace-parser "^0.1.10"
"true-case-path" "^2.2.1"
tsort "0.0.1"
uuid "^3.3.2"
ws "^7.4.6"
has-ansi@^2.0.0: has-ansi@^2.0.0:
version "2.0.0" version "2.0.0"
resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91"
...@@ -8105,9 +8199,9 @@ hoopy@^0.1.4: ...@@ -8105,9 +8199,9 @@ hoopy@^0.1.4:
integrity sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ== integrity sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==
hosted-git-info@^2.1.4, hosted-git-info@^2.6.0: hosted-git-info@^2.1.4, hosted-git-info@^2.6.0:
version "2.8.8" version "2.8.9"
resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.8.tgz#7539bd4bc1e0e0a895815a2e0262420b12858488" resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9"
integrity sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg== integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==
hosted-git-info@^4.0.1: hosted-git-info@^4.0.1:
version "4.0.2" version "4.0.2"
...@@ -9930,6 +10024,19 @@ merkle-patricia-tree@^4.0.0, merkle-patricia-tree@^4.1.0: ...@@ -9930,6 +10024,19 @@ merkle-patricia-tree@^4.0.0, merkle-patricia-tree@^4.1.0:
rlp "^2.2.3" rlp "^2.2.3"
semaphore-async-await "^1.5.1" semaphore-async-await "^1.5.1"
merkle-patricia-tree@^4.2.0:
version "4.2.0"
resolved "https://registry.yarnpkg.com/merkle-patricia-tree/-/merkle-patricia-tree-4.2.0.tgz#a204b9041be5c25e8d14f0ff47021de090e811a1"
integrity sha512-0sBVXs7z1Q1/kxzWZ3nPnxSPiaHKF/f497UQzt9O7isRcS10tel9jM/4TivF6Jv7V1yFq4bWyoATxbDUOen5vQ==
dependencies:
"@types/levelup" "^4.3.0"
ethereumjs-util "^7.0.10"
level-mem "^5.0.1"
level-ws "^2.0.0"
readable-stream "^3.6.0"
rlp "^2.2.4"
semaphore-async-await "^1.5.1"
merkletreejs@^0.2.12, merkletreejs@^0.2.18: merkletreejs@^0.2.12, merkletreejs@^0.2.18:
version "0.2.18" version "0.2.18"
resolved "https://registry.yarnpkg.com/merkletreejs/-/merkletreejs-0.2.18.tgz#205cc4f79e134c9bc887bdbd440b9e78787c4823" resolved "https://registry.yarnpkg.com/merkletreejs/-/merkletreejs-0.2.18.tgz#205cc4f79e134c9bc887bdbd440b9e78787c4823"
...@@ -15173,6 +15280,11 @@ ws@^7.2.1: ...@@ -15173,6 +15280,11 @@ ws@^7.2.1:
resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.4.tgz#383bc9742cb202292c9077ceab6f6047b17f2d59" resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.4.tgz#383bc9742cb202292c9077ceab6f6047b17f2d59"
integrity sha512-Qm8k8ojNQIMx7S+Zp8u/uHOx7Qazv3Yv4q68MiWWWOJhiwG5W3x7iqmRtJo8xxrciZUY4vRxUTJCKuRnF28ZZw== integrity sha512-Qm8k8ojNQIMx7S+Zp8u/uHOx7Qazv3Yv4q68MiWWWOJhiwG5W3x7iqmRtJo8xxrciZUY4vRxUTJCKuRnF28ZZw==
ws@^7.4.6:
version "7.5.0"
resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.0.tgz#0033bafea031fb9df041b2026fc72a571ca44691"
integrity sha512-6ezXvzOZupqKj4jUqbQ9tXuJNo+BR2gU8fFRk3XCP3e0G6WT414u5ELe6Y0vtp7kmSJ3F7YWObSNr1ESsgi4vw==
xhr-request-promise@^0.1.2: xhr-request-promise@^0.1.2:
version "0.1.3" version "0.1.3"
resolved "https://registry.yarnpkg.com/xhr-request-promise/-/xhr-request-promise-0.1.3.tgz#2d5f4b16d8c6c893be97f1a62b0ed4cf3ca5f96c" resolved "https://registry.yarnpkg.com/xhr-request-promise/-/xhr-request-promise-0.1.3.tgz#2d5f4b16d8c6c893be97f1a62b0ed4cf3ca5f96c"
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment