Commit 27487c1d authored by Georgios Konstantopoulos's avatar Georgios Konstantopoulos Committed by GitHub

feat: add docker network images (#29)

* feat: add docker network images

* chore: remove hardware wallet requirement when deploying

Otherwise the alpine images get bloated with a lot of unnecessary packages

* perf: do not package puppeth / clef / fourbyte

* ci: enable integration on ci

* optimize docker buildtime

* ci: build services in parallel

* ci: use docker buildkit for better performance

* ci: wait for sequencer to be ready

* chore: clean up dockerignore
parent e91da733
.git
.github
node_modules
test
**/*_test.go
build/_workspace
build/bin
build/_bin
tests/testdata
l2geth/signer/fourbyte
l2geth/cmd/puppeth
l2geth/cmd/clef
name: integration
on:
push:
branches:
- master
pull_request:
branches:
- master
defaults:
run:
working-directory: ./ops
jobs:
integration:
runs-on: ubuntu-latest
env:
DOCKER_BUILDKIT: 1
COMPOSE_DOCKER_CLI_BUILD: 1
steps:
- uses: actions/checkout@v2
- name: Build the base layer dependencies
run: docker-compose build --parallel -- builder l2geth l1_chain
- name: Build the other services
run: docker-compose build --parallel -- deployer dtl batch_submitter
- name: Bring the stack up and wait for the sequencer to be ready
run: docker-compose up -d && ./scripts/wait-for-sequencer.sh
- name: Run the integration tests
run: echo "Integration tests will be run here"
# Optimism Operations
## Building the images
It is recommended to use Docker BuildKit and Docker Compose CLI Build to
improve the container build times. You can do that as follows:
```
export COMPOSE_DOCKER_CLI_BUILD=1
export DOCKER_BUILDKIT=1
```
For your best experience, we also recommend aliasing
## Bringing up a network
You can bring up an optimism network with the following command:
```
docker-compose up
```
You can use standard docker-compose commands for managing the containers, e.g.
getting only the logs of `l2geth`: `docker-compose --follow l2geth`
## Docker Containers
Under `docker/` you will find all the docker containers we use. In particular,
`Dockerfile.monorepo` implements a multi-stage docker build in order to cache as many
installation steps as possible to save time.
# TODO: Prefix all env vars with service name
# TODO: Allow specifing the image tag to use
version: "3"
services:
# base service builder
builder:
image: ethereumoptimism:builder
build:
context: ..
dockerfile: ./ops/docker/Dockerfile.monorepo
# this is a helper service used because there's no official hardhat image
l1_chain:
image: ethereumoptimism:hardhat
build:
context: ./docker/hardhat
dockerfile: Dockerfile
ports:
# expose the service to the host for integration testing
- ${L1_CHAIN_PORT:-9545}:8545
deployer:
image: ethereumoptimism:deployer
build:
context: ..
dockerfile: ./ops/docker/Dockerfile.deployer
entrypoint: ./deployer.sh
environment:
FRAUD_PROOF_WINDOW_SECONDS: 0
L1_NODE_WEB3_URL: http://l1_chain:8545
# these keys are hardhat's first 2 accounts, DO NOT use in production
DEPLOYER_PRIVATE_KEY: "0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80"
SEQUENCER_PRIVATE_KEY: "0x59c6995e998f97a5a0044966f0945389dc9e86dae88c7a8412f4603b6b78690d"
ports:
# expose the service to the host for getting the contract addrs
- ${DEPLOYER_PORT:-8080}:8081
dtl:
image: ethereumoptimism:data-transport-layer
build:
context: ..
dockerfile: ./ops/docker/Dockerfile.dtl
# override with the dtl script and the env vars required for it
entrypoint: ./dtl.sh
env_file:
./envs/dtl.env
# set the rest of the env vars for the network whcih do not
# depend on the docker-compose setup
environment:
# used for setting the address manager address
URL: http://deployer:8081/addresses.json
# connect to the 2 layers
DATA_TRANSPORT_LAYER__L1_RPC_ENDPOINT: http://l1_chain:8545
DATA_TRANSPORT_LAYER__L2_RPC_ENDPOINT: http://l2geth:8545
DATA_TRANSPORT_LAYER__L2_CHAIN_ID: 420
ports:
- ${DTL_PORT:-7878}:7878
batch_submitter:
image: ethereumoptimism:batch-submitter
build:
context: ..
dockerfile: ./ops/docker/Dockerfile.batches
entrypoint: ./batches.sh
env_file:
./envs/batches.env
environment:
L1_NODE_WEB3_URL: http://l1_chain:8545
L2_NODE_WEB3_URL: http://l2geth:8545
URL: http://deployer:8081/addresses.json
SEQUENCER_PRIVATE_KEY: "0x59c6995e998f97a5a0044966f0945389dc9e86dae88c7a8412f4603b6b78690d"
l2geth:
image: ethereumoptimism:l2geth
build:
context: ..
dockerfile: ./ops/docker/Dockerfile.geth
# override with the geth script and the env vars required for it
entrypoint: sh ./geth.sh
env_file:
./envs/geth.env
environment:
ETH1_HTTP: http://l1_chain:8545
ROLLUP_STATE_DUMP_PATH: http://deployer:8081/state-dump.latest.json
# used for getting the addresses
URL: http://deployer:8081/addresses.json
# connecting to the DTL
ROLLUP_CLIENT_HTTP: http://dtl:7878
ETH1_CTC_DEPLOYMENT_HEIGHT: 8
RETRIES: 60
ports:
- ${L2GETH_HTTP_PORT:-8545}:8545
- ${L2GETH_WS_PORT:-8546}:8546
FROM ethereumoptimism:builder AS builder
FROM node:14-alpine
RUN apk add --no-cache curl bash jq
WORKDIR /opt/optimism
# copy top level files
COPY --from=builder /optimism/*.json /optimism/yarn.lock ./
COPY --from=builder /optimism/node_modules ./node_modules
# copy deps (would have been nice if docker followed the symlinks required)
COPY --from=builder /optimism/packages/core-utils/package.json ./packages/core-utils/package.json
COPY --from=builder /optimism/packages/core-utils/dist ./packages/core-utils/dist
COPY --from=builder /optimism/packages/contracts/package.json ./packages/contracts/package.json
COPY --from=builder /optimism/packages/contracts/dist ./packages/contracts/dist
COPY --from=builder /optimism/packages/contracts/artifacts ./packages/contracts/artifacts
COPY --from=builder /optimism/packages/contracts/artifacts-ovm ./packages/contracts/artifacts-ovm
# copy the service
WORKDIR /opt/optimism/packages/batch-submitter
COPY --from=builder /optimism/packages/batch-submitter/package.json ./
COPY --from=builder /optimism/packages/batch-submitter/dist ./dist
COPY --from=builder /optimism/packages/batch-submitter/exec ./exec
COPY --from=builder /optimism/packages/batch-submitter/node_modules ./node_modules
# copy this over in case you want to run alongside other services
COPY ./ops/scripts/batches.sh .
ENTRYPOINT ["node", "exec/run-batch-submitter.js"]
FROM ethereumoptimism:builder AS builder
FROM node:14-alpine
RUN apk add --no-cache git curl python bash
WORKDIR /opt/optimism/
COPY --from=builder /optimism/*.json /optimism/yarn.lock ./
COPY --from=builder /optimism/node_modules ./node_modules
# copy deps (would have been nice if docker followed the symlinks required)
COPY --from=builder /optimism/packages/core-utils/package.json ./packages/core-utils/package.json
COPY --from=builder /optimism/packages/core-utils/dist ./packages/core-utils/dist
# get the items
WORKDIR /opt/optimism/packages/contracts
COPY --from=builder /optimism/packages/contracts/dist ./dist
COPY --from=builder /optimism/packages/contracts/bin ./bin
COPY --from=builder /optimism/packages/contracts/package.json ./
COPY --from=builder /optimism/packages/contracts/node_modules ./node_modules
COPY --from=builder /optimism/packages/contracts/artifacts ./artifacts
COPY --from=builder /optimism/packages/contracts/artifacts-ovm ./artifacts-ovm
COPY ./ops/scripts/deployer.sh .
ENTRYPOINT yarn run deploy
FROM ethereumoptimism:builder AS builder
FROM node:14-alpine
RUN apk add --no-cache curl bash jq
WORKDIR /opt/optimism
# copy top level files
COPY --from=builder /optimism/*.json ./
COPY --from=builder /optimism/yarn.lock .
COPY --from=builder /optimism/node_modules ./node_modules
# copy deps (would have been nice if docker followed the symlinks required)
COPY --from=builder /optimism/packages/core-utils/package.json ./packages/core-utils/package.json
COPY --from=builder /optimism/packages/core-utils/dist ./packages/core-utils/dist
COPY --from=builder /optimism/packages/contracts/package.json ./packages/contracts/package.json
COPY --from=builder /optimism/packages/contracts/dist ./packages/contracts/dist
COPY --from=builder /optimism/packages/contracts/artifacts ./packages/contracts/artifacts
COPY --from=builder /optimism/packages/contracts/artifacts-ovm ./packages/contracts/artifacts-ovm
# copy the service
WORKDIR /opt/optimism/packages/data-transport-layer
COPY --from=builder /optimism/packages/data-transport-layer/dist ./dist
COPY --from=builder /optimism/packages/data-transport-layer/package.json .
COPY --from=builder /optimism/packages/data-transport-layer/node_modules ./node_modules
# copy this over in case you want to run alongside other services
COPY ./ops/scripts/dtl.sh .
ENTRYPOINT ["node", "dist/src/services/run.js"]
# Build Geth in a stock Go builder container
FROM golang:1.14-alpine as builder
RUN apk add --no-cache make gcc musl-dev linux-headers git
ADD ./l2geth /go-ethereum
RUN cd /go-ethereum && make geth
# Pull Geth into a second stage deploy alpine container
FROM alpine:latest
RUN apk add --no-cache ca-certificates jq curl
COPY --from=builder /go-ethereum/build/bin/geth /usr/local/bin/
EXPOSE 8545 8546 8547
COPY ./ops/scripts/geth.sh .
ENTRYPOINT ["geth"]
# This Dockerfile builds all the dependencies needed by the monorepo, and should
# be used to build any of the follow-on services
#
# ### BASE: Install deps
# We do not use Alpine because there's a regression causing it to be very slow
# when used with typescript/hardhat: https://github.com/nomiclabs/hardhat/issues/1219
FROM node:14-buster-slim as node
RUN apt-get update -y && apt-get install -y git
# Pre-download the compilers so that they do not need to be downloaded inside
# the image when building
FROM alpine as downloader
ARG VERSION=v0.7.6
ARG SOLC_VERSION=${VERSION}+commit.7338295f
ARG SOLC_UPSTREAM=https://github.com/ethereum/solc-bin/raw/gh-pages/linux-amd64/solc-linux-amd64-${SOLC_VERSION}
ARG OVM_SOLC_UPSTREAM=https://github.com/ethereum-optimism/solc-bin/raw/gh-pages/bin/soljson-${VERSION}.js
ADD $SOLC_UPSTREAM ./solc
ADD $OVM_SOLC_UPSTREAM ./ovm-solc
FROM node as builder
# copy over the needed configs to run the dep installation
# note: this approach can be a bit unhandy to maintain, but it allows
# us to cache the installation steps
WORKDIR /optimism
COPY *.json yarn.lock ./
COPY packages/core-utils/package.json ./packages/core-utils/package.json
COPY packages/hardhat-ovm/package.json ./packages/hardhat-ovm/package.json
COPY packages/smock/package.json ./packages/smock/package.json
COPY packages/contracts/package.json ./packages/contracts/package.json
COPY packages/data-transport-layer/package.json ./packages/data-transport-layer/package.json
COPY packages/batch-submitter/package.json ./packages/batch-submitter/package.json
RUN yarn install --frozen-lockfile
### BUILDER: Builds the typescript
FROM node
WORKDIR /optimism
# cache the node_modules copying step since it's expensive
# we run this before copying over any source files to avoid re-copying anytime the
# code changes
COPY --from=builder /optimism/node_modules ./node_modules
COPY --from=builder /optimism/packages ./packages
# the following steps are cheap
COPY *.json yarn.lock ./
# copy over the source
COPY ./packages ./packages
# copy over solc to save time building (35+ seconds vs not doing this step)
COPY --from=downloader solc /root/.cache/hardhat-nodejs/compilers/linux-amd64/solc-linux-amd64-v0.7.6+commit.7338295f
COPY --from=downloader ovm-solc /root/.cache/hardhat-nodejs/compilers/ovm/0.7.6.js
# build it!
RUN yarn build
# get the dump
RUN yarn --cwd ./packages/contracts ts-node bin/take-dump.ts
# TODO: Consider thinning up the container by trimming non-production
# dependencies
# so that it can be used in docker-compose
CMD ["true"]
FROM node:14-alpine
# bring in the config files for installing deps
COPY [ \
"package.json", \
"yarn.lock", \
"/hardhat/" \
]
# install deps
WORKDIR /hardhat
RUN yarn install
# bring in dockerenv so that hardhat launches with host = 0.0.0.0 instead of 127.0.0.1
# so that it's accessible from other boxes as well
# https://github.com/nomiclabs/hardhat/blob/bd7f4b93ed3724f3473052bebe4f8b5587e8bfa8/packages/hardhat-core/src/builtin-tasks/node.ts#L275-L287
COPY [ ".dockerenv" , "/hardhat/" ]
# bring in the scripts we'll be using
COPY [ "hardhat.config.js" , "/hardhat/" ]
EXPOSE 8545
# runs the script (assumes that the `CONTRACT` and `ARGS` are passed as args to `--env`)
CMD ["yarn", "start"]
{
"name": "@eth-optimism/hardhat-node",
"version": "1.0.0",
"scripts": {
"start": "hardhat node"
},
"license": "MIT",
"dependencies": {
"hardhat": "^2.1.2"
}
}
This diff is collapsed.
ADDRESS_MANAGER_ADDRESS=
DEBUG=info*,error*,warn*,debug*
MAX_TX_SIZE=90000
MIN_TX_SIZE=0
MAX_BATCH_SIZE=50
POLL_INTERVAL=15000
NUM_CONFIRMATIONS=0
RESUBMISSION_TIMEOUT=1000000
FINALITY_CONFIRMATIONS=0
RUN_TX_BATCH_SUBMITTER=true
RUN_STATE_BATCH_SUBMITTER=true
MAX_BATCH_SUBMISSION_TIME=0
SAFE_MINIMUM_ETHER_BALANCE=0
CLEAR_PENDING_TXS=false
RETRIES=80
DATA_TRANSPORT_LAYER__SYNC_FROM_L1=true
DATA_TRANSPORT_LAYER__SYNC_FROM_L2=false
DATA_TRANSPORT_LAYER__DB_PATH=/db
DATA_TRANSPORT_LAYER__SERVER_PORT=7878
DATA_TRANSPORT_LAYER__TRANSACTIONS_PER_POLLING_INTERVAL=1000
DATA_TRANSPORT_LAYER__CONFIRMATIONS=0
DATA_TRANSPORT_LAYER__POLLING_INTERVAL=500
DATA_TRANSPORT_LAYER__LOGS_PER_POLLING_INTERVAL=2000
DATA_TRANSPORT_LAYER__DANGEROUSLY_CATCH_ALL_ERRORS=true
DATA_TRANSPORT_LAYER__SERVER_HOSTNAME=0.0.0.0
DATA_TRANSPORT_LAYER__ADDRESS_MANAGER=
DATA_TRANSPORT_LAYER__L1_RPC_ENDPOINT=
DATA_TRANSPORT_LAYER__L2_RPC_ENDPOINT=
DATA_TRANSPORT_LAYER__L2_CHAIN_ID=
ETH1_HTTP=
ETH1_CTC_DEPLOYMENT_HEIGHT=
ETH1_SYNC_SERVICE_ENABLE=true
ETH1_CONFIRMATION_DEPTH=0
ROLLUP_CLIENT_HTTP=
ROLLUP_STATE_DUMP_PATH=
ROLLUP_POLL_INTERVAL_FLAG=3s
RPC_ENABLE=true
RPC_ADDR=0.0.0.0
RPC_PORT=8545
RPC_API=eth,net,rollup,web3
RPC_CORS_DOMAIN=*
RPC_VHOSTS=*
WS=true
WS_ADDR=0.0.0.0
WS_PORT=8546
WS_API=eth,net,rollup,web3
WS_ORIGINS=*
CHAIN_ID=420
DATADIR=/root/.ethereum
DEV=true
GASPRICE=0
GCMODE=archive
IPC_DISABLE=true
NETWORK_ID=420
NO_USB=true
NO_DISCOVER=true
TARGET_GAS_LIMIT=9000000
USING_OVM=true
#!/bin/bash
RETRIES=${RETRIES:-20}
# get the addrs from the URL provided
ADDRESSES=$(curl --retry-connrefused --retry $RETRIES --retry-delay 3 $URL)
# set the env
export ADDRESS_MANAGER_ADDRESS=$(echo $ADDRESSES | jq -r '.AddressManager')
# waits for l2geth to be up
curl --retry-connrefused --retry $RETRIES --retry-delay 1 $L2_NODE_WEB3_URL
# go
node ./exec/run-batch-submitter.js
#!/bin/bash
RETRIES=${RETRIES:-20}
JSON='{"jsonrpc":"2.0","id":0,"method":"net_version","params":[]}'
# wait for the base layer to be up
curl -H "Content-Type: application/json" --retry-connrefused --retry $RETRIES --retry-delay 1 -d $JSON $L1_NODE_WEB3_URL
# get the addrs to a var
ADDRESSES=$(yarn run --silent deploy)
# sent them to the file
echo $ADDRESSES > dist/dumps/addresses.json
# serve the addrs and the state dump
./bin/serve_dump.sh
#!/bin/bash
RETRIES=${RETRIES:-20}
# get the addrs from the URL provided
ADDRESSES=$(curl --retry-connrefused --retry $RETRIES --retry-delay 2 $URL)
# set the env
export DATA_TRANSPORT_LAYER__ADDRESS_MANAGER=$(echo $ADDRESSES | jq -r '.AddressManager')
# go
node dist/src/services/run.js
#!/bin/bash
RETRIES=${RETRIES:-20}
# get the addrs from the URL provided
ADDRESSES=$(curl --retry-connrefused --retry $RETRIES --retry-delay 1 $URL)
function envSet() {
VAR=$1
export $VAR=$(echo $ADDRESSES | jq -r ".$2")
}
# set all the necessary env vars
envSet ETH1_ADDRESS_RESOLVER_ADDRESS AddressManager
envSet ETH1_L1_CROSS_DOMAIN_MESSENGER_ADDRESS Proxy__OVM_L1CrossDomainMessenger
envSet ETH1_L1_ETH_GATEWAY_ADDRESS OVM_L1ETHGateway
envSet ROLLUP_ADDRESS_MANAGER_OWNER_ADDRESS Deployer
geth --verbosity=6
#!/bin/bash
CONTAINER=l2geth
until docker-compose logs l2geth | grep -q "Starting Sequencer Loop";
do
sleep 3
echo 'Waiting for sequencer...'
done
#!/usr/bin/env node #!/usr/bin/env node
const batchSubmitter = require("../build/src/exec/run-batch-submitter") const batchSubmitter = require("../dist/src/exec/run-batch-submitter")
batchSubmitter.run() batchSubmitter.run()
\ No newline at end of file
#!/usr/bin/env node #!/usr/bin/env node
const contracts = require('../dist/src/contract-deployment/deploy'); const contracts = require('../dist/contract-deployment/deploy');
const { providers, Wallet, utils, ethers } = require('ethers'); const { providers, Wallet, utils, ethers } = require('ethers');
const { LedgerSigner } = require('@ethersproject/hardware-wallets');
const { JsonRpcProvider } = providers; const { JsonRpcProvider } = providers;
const fs = require('fs')
const env = process.env; const env = process.env;
const key = env.DEPLOYER_PRIVATE_KEY; const key = env.DEPLOYER_PRIVATE_KEY;
...@@ -22,9 +22,7 @@ const FORCE_INCLUSION_PERIOD_SECONDS = env.FORCE_INCLUSION_PERIOD_SECONDS || 259 ...@@ -22,9 +22,7 @@ const FORCE_INCLUSION_PERIOD_SECONDS = env.FORCE_INCLUSION_PERIOD_SECONDS || 259
const FRAUD_PROOF_WINDOW_SECONDS = env.FRAUD_PROOF_WINDOW_SECONDS || (60 * 60 * 24 * 7); // 7 days const FRAUD_PROOF_WINDOW_SECONDS = env.FRAUD_PROOF_WINDOW_SECONDS || (60 * 60 * 24 * 7); // 7 days
const SEQUENCER_PUBLISH_WINDOW_SECONDS = env.SEQUENCER_PUBLISH_WINDOW_SECONDS || (60 * 30); // 30 min const SEQUENCER_PUBLISH_WINDOW_SECONDS = env.SEQUENCER_PUBLISH_WINDOW_SECONDS || (60 * 30); // 30 min
const CHAIN_ID = env.CHAIN_ID || 420; // layer 2 chainid const CHAIN_ID = env.CHAIN_ID || 420; // layer 2 chainid
const USE_LEDGER = env.USE_LEDGER || false;
const ADDRESS_MANAGER_ADDRESS = env.ADDRESS_MANAGER_ADDRESS || undefined; const ADDRESS_MANAGER_ADDRESS = env.ADDRESS_MANAGER_ADDRESS || undefined;
const HD_PATH = env.HD_PATH || utils.defaultPath;
const BLOCK_TIME_SECONDS = env.BLOCK_TIME_SECONDS || 15; const BLOCK_TIME_SECONDS = env.BLOCK_TIME_SECONDS || 15;
const L2_CROSS_DOMAIN_MESSENGER_ADDRESS = const L2_CROSS_DOMAIN_MESSENGER_ADDRESS =
env.L2_CROSS_DOMAIN_MESSENGER_ADDRESS || '0x4200000000000000000000000000000000000007'; env.L2_CROSS_DOMAIN_MESSENGER_ADDRESS || '0x4200000000000000000000000000000000000007';
...@@ -33,16 +31,10 @@ const RELAYER_PRIVATE_KEY = env.RELAYER_PRIVATE_KEY; ...@@ -33,16 +31,10 @@ const RELAYER_PRIVATE_KEY = env.RELAYER_PRIVATE_KEY;
(async () => { (async () => {
const provider = new JsonRpcProvider(web3Url); const provider = new JsonRpcProvider(web3Url);
let signer; if (typeof key === 'undefined') {
throw new Error('Must pass deployer key as DEPLOYER_PRIVATE_KEY');
// Use the ledger for the deployer
if (USE_LEDGER) {
signer = new LedgerSigner(provider, 'default', HD_PATH);
} else {
if (typeof key === 'undefined')
throw new Error('Must pass deployer key as DEPLOYER_PRIVATE_KEY');
signer = new Wallet(key, provider);
} }
const signer = new Wallet(key, provider);
if (SEQUENCER_ADDRESS) { if (SEQUENCER_ADDRESS) {
if (!utils.isAddress(SEQUENCER_ADDRESS)) if (!utils.isAddress(SEQUENCER_ADDRESS))
...@@ -113,6 +105,8 @@ const RELAYER_PRIVATE_KEY = env.RELAYER_PRIVATE_KEY; ...@@ -113,6 +105,8 @@ const RELAYER_PRIVATE_KEY = env.RELAYER_PRIVATE_KEY;
for (const [name, contract] of Object.entries(result.contracts)) { for (const [name, contract] of Object.entries(result.contracts)) {
out[name] = contract.address; out[name] = contract.address;
} }
const addresses = JSON.stringify(out, null, 2)
fs.writeFileSync(__dirname + "/addresses.json", addresses)
console.log(JSON.stringify(out, null, 2)); console.log(JSON.stringify(out, null, 2));
})().catch(err => { })().catch(err => {
console.log(JSON.stringify({error: err.message, stack: err.stack}, null, 2)); console.log(JSON.stringify({error: err.message, stack: err.stack}, null, 2));
......
...@@ -6,12 +6,10 @@ ...@@ -6,12 +6,10 @@
# development. The state dump can be found at # development. The state dump can be found at
# `GET /state-dump.latest.json` # `GET /state-dump.latest.json`
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" > /dev/null && pwd )"
PYTHON=${PYTHON:-python} PYTHON=${PYTHON:-python}
HOST=${HOST:-0.0.0.0} HOST=${HOST:-0.0.0.0}
PORT=${PORT:-8081} PORT=${PORT:-8081}
DIRECTORY=$DIR/../dist/dumps DIRECTORY=dist/dumps
if [ ! command -v $PYTHON&>/dev/null ]; then if [ ! command -v $PYTHON&>/dev/null ]; then
echo "Please install python" echo "Please install python"
......
...@@ -37,7 +37,6 @@ ...@@ -37,7 +37,6 @@
"@eth-optimism/solc": "^0.6.12-alpha.1", "@eth-optimism/solc": "^0.6.12-alpha.1",
"@ethersproject/abstract-provider": "^5.0.8", "@ethersproject/abstract-provider": "^5.0.8",
"@ethersproject/contracts": "^5.0.5", "@ethersproject/contracts": "^5.0.5",
"@ethersproject/hardware-wallets": "^5.0.8",
"@openzeppelin/contracts": "^3.3.0", "@openzeppelin/contracts": "^3.3.0",
"@typechain/hardhat": "^1.0.1", "@typechain/hardhat": "^1.0.1",
"ganache-core": "^2.13.2", "ganache-core": "^2.13.2",
......
...@@ -72,27 +72,6 @@ ...@@ -72,27 +72,6 @@
ts-md5 "^1.2.4" ts-md5 "^1.2.4"
uuid "^3.3.3" uuid "^3.3.3"
"@eth-optimism/dev@^1.1.1":
version "1.1.1"
resolved "https://registry.yarnpkg.com/@eth-optimism/dev/-/dev-1.1.1.tgz#7bae95b975c1d6641b4ae550cb3ec631c667a56b"
integrity sha512-BiKvjL8VoS2OsPHobyTe533XoZkYYBKUKhw9tkHskylD+s+/UwcgkkimrxQ67aJgLE22GW9YCdF2eeB3UcNwgA==
dependencies:
"@types/chai" "^4.2.15"
"@types/chai-as-promised" "^7.1.3"
"@types/mocha" "^8.2.0"
"@types/node" "^14.14.27"
chai "^4.3.0"
chai-as-promised "^7.1.1"
mocha "^8.3.0"
prettier "^2.2.1"
rimraf "^3.0.2"
ts-node "^9.1.1"
tslint "^6.1.3"
tslint-config-prettier "^1.18.0"
tslint-no-focused-test "^0.5.0"
tslint-plugin-prettier "^2.3.0"
typescript "^4.1.5"
"@eth-optimism/provider@^0.0.1-alpha.13": "@eth-optimism/provider@^0.0.1-alpha.13":
version "0.0.1-alpha.14" version "0.0.1-alpha.14"
resolved "https://registry.yarnpkg.com/@eth-optimism/provider/-/provider-0.0.1-alpha.14.tgz#fec9df0abcdf8281c6a3cf4bc0e0085ccc7691c4" resolved "https://registry.yarnpkg.com/@eth-optimism/provider/-/provider-0.0.1-alpha.14.tgz#fec9df0abcdf8281c6a3cf4bc0e0085ccc7691c4"
...@@ -1740,14 +1719,14 @@ ...@@ -1740,14 +1719,14 @@
resolved "https://registry.yarnpkg.com/@types/browser-or-node/-/browser-or-node-1.3.0.tgz#896ec59bcb8109fc858d8e68d3c056c176a19622" resolved "https://registry.yarnpkg.com/@types/browser-or-node/-/browser-or-node-1.3.0.tgz#896ec59bcb8109fc858d8e68d3c056c176a19622"
integrity sha512-MVetr65IR7RdJbUxVHsaPFaXAO8fi89zv1g8L/mHygh1Q7xnnK02XZLwfMh57FOpTO6gtnagoPMQ/UOFfctXRQ== integrity sha512-MVetr65IR7RdJbUxVHsaPFaXAO8fi89zv1g8L/mHygh1Q7xnnK02XZLwfMh57FOpTO6gtnagoPMQ/UOFfctXRQ==
"@types/chai-as-promised@^7.1.0", "@types/chai-as-promised@^7.1.3": "@types/chai-as-promised@^7.1.0":
version "7.1.3" version "7.1.3"
resolved "https://registry.yarnpkg.com/@types/chai-as-promised/-/chai-as-promised-7.1.3.tgz#779166b90fda611963a3adbfd00b339d03b747bd" resolved "https://registry.yarnpkg.com/@types/chai-as-promised/-/chai-as-promised-7.1.3.tgz#779166b90fda611963a3adbfd00b339d03b747bd"
integrity sha512-FQnh1ohPXJELpKhzjuDkPLR2BZCAqed+a6xV4MI/T3XzHfd2FlarfUGUdZYgqYe8oxkYn0fchHEeHfHqdZ96sg== integrity sha512-FQnh1ohPXJELpKhzjuDkPLR2BZCAqed+a6xV4MI/T3XzHfd2FlarfUGUdZYgqYe8oxkYn0fchHEeHfHqdZ96sg==
dependencies: dependencies:
"@types/chai" "*" "@types/chai" "*"
"@types/chai@*", "@types/chai@^4.1.7", "@types/chai@^4.2.15": "@types/chai@*", "@types/chai@^4.1.7":
version "4.2.15" version "4.2.15"
resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.2.15.tgz#b7a6d263c2cecf44b6de9a051cf496249b154553" resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.2.15.tgz#b7a6d263c2cecf44b6de9a051cf496249b154553"
integrity sha512-rYff6FI+ZTKAPkJUoyz7Udq3GaoDZnxYDEvdEdFZASiA7PoErltHezDishqQiSDWrGxvxmplH304jyzQmjp0AQ== integrity sha512-rYff6FI+ZTKAPkJUoyz7Udq3GaoDZnxYDEvdEdFZASiA7PoErltHezDishqQiSDWrGxvxmplH304jyzQmjp0AQ==
...@@ -1841,7 +1820,7 @@ ...@@ -1841,7 +1820,7 @@
resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-5.2.7.tgz#315d570ccb56c53452ff8638738df60726d5b6ea" resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-5.2.7.tgz#315d570ccb56c53452ff8638738df60726d5b6ea"
integrity sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ== integrity sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ==
"@types/mocha@^8.2.0", "@types/mocha@^8.2.2": "@types/mocha@^8.2.2":
version "8.2.2" version "8.2.2"
resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-8.2.2.tgz#91daa226eb8c2ff261e6a8cbf8c7304641e095e0" resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-8.2.2.tgz#91daa226eb8c2ff261e6a8cbf8c7304641e095e0"
integrity sha512-Lwh0lzzqT5Pqh6z61P3c3P5nm6fzQK/MMHl9UKeneAeInVflBSz1O2EkX6gM6xfJd7FBXBY5purtLx7fUiZ7Hw== integrity sha512-Lwh0lzzqT5Pqh6z61P3c3P5nm6fzQK/MMHl9UKeneAeInVflBSz1O2EkX6gM6xfJd7FBXBY5purtLx7fUiZ7Hw==
...@@ -1869,11 +1848,6 @@ ...@@ -1869,11 +1848,6 @@
resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.6.tgz#7b73cce37352936e628c5ba40326193443cfba25" resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.6.tgz#7b73cce37352936e628c5ba40326193443cfba25"
integrity sha512-sRVq8d+ApGslmkE9e3i+D3gFGk7aZHAT+G4cIpIEdLJYPsWiSPwcAnJEjddLQQDqV3Ra2jOclX/Sv6YrvGYiWA== integrity sha512-sRVq8d+ApGslmkE9e3i+D3gFGk7aZHAT+G4cIpIEdLJYPsWiSPwcAnJEjddLQQDqV3Ra2jOclX/Sv6YrvGYiWA==
"@types/node@^14.14.27":
version "14.14.36"
resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.36.tgz#5637905dbb15c30a33a3c65b9ef7c20e3c85ebad"
integrity sha512-kjivUwDJfIjngzbhooRnOLhGYz6oRFi+L+EpMjxroDYXwDw9lHrJJ43E+dJ6KAd3V3WxWAJ/qZE9XKYHhjPOFQ==
"@types/normalize-package-data@^2.4.0": "@types/normalize-package-data@^2.4.0":
version "2.4.0" version "2.4.0"
resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz#e486d0d97396d79beedd0a6e33f4534ff6b4973e" resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz#e486d0d97396d79beedd0a6e33f4534ff6b4973e"
...@@ -11205,7 +11179,7 @@ typedarray@^0.0.6: ...@@ -11205,7 +11179,7 @@ typedarray@^0.0.6:
resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=
typescript@^4.1.5, typescript@^4.2.3: typescript@^4.2.3:
version "4.2.3" version "4.2.3"
resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.2.3.tgz#39062d8019912d43726298f09493d598048c1ce3" resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.2.3.tgz#39062d8019912d43726298f09493d598048c1ce3"
integrity sha512-qOcYwxaByStAWrBf4x0fibwZvMRG+r4cQoTjbPtUlrWjBHbmCAww1i448U0GJ+3cNNEtebDteo/cHOR3xJ4wEw== integrity sha512-qOcYwxaByStAWrBf4x0fibwZvMRG+r4cQoTjbPtUlrWjBHbmCAww1i448U0GJ+3cNNEtebDteo/cHOR3xJ4wEw==
......
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