Commit 141982eb authored by mergify[bot]'s avatar mergify[bot] Committed by GitHub

Merge pull request #3900 from ethereum-optimism/11-06-testmig_Remove_in_favor_of_op-e2e

testmig: Remove in favor of op-e2e
parents b2c4085a 56acafc2
aiohttp==3.8.3
aiosignal==1.2.0
async-timeout==4.0.2
attrs==22.1.0
base58==2.1.1
bitarray==2.6.0
certifi==2022.9.24
charset-normalizer==2.1.1
click==8.1.3
cytoolz==0.12.0
docker==6.0.0
eth-abi==2.2.0
eth-account==0.5.9
eth-hash==0.5.0
eth-keyfile==0.5.1
eth-keys==0.3.4
eth-rlp==0.2.1
eth-typing==2.3.0
eth-utils==1.9.5
frozenlist==1.3.1
hexbytes==0.3.0
idna==3.4
ipfshttpclient==0.8.0a2
jsonschema==4.16.0
lru-dict==1.1.8
multiaddr==0.0.9
multidict==6.0.2
netaddr==0.8.0
packaging==21.3
parsimonious==0.8.1
protobuf==3.19.5
pycryptodome==3.15.0
pyparsing==3.0.9
pyrsistent==0.18.1
requests==2.28.1
rlp==2.0.1
six==1.16.0
toolz==0.12.0
tqdm==4.64.1
urllib3==1.26.12
varint==1.0.2
web3==5.31.1
websocket-client==1.4.1
websockets==9.1
yarl==1.8.1
from distutils.core import setup
from setuptools import find_packages
setup(
name='testmig',
version='1.0',
description='Bedrock migration tester tool',
install_requires=[
'click==8.1.3',
'docker==6.0.0',
'web3==5.31.1',
'requests==2.28.1',
'tqdm==4.64.1'
],
packages=find_packages(include=['testmig', 'testmig.*']),
entry_points={
'console_scripts': ['testmig=testmig.cli:group']
}
)
import logging
import os
import shutil
import time
from pathlib import Path
import click
import docker
import docker.errors
from web3 import Web3
from testmig.contracts import SLOTS_TO_MODIFY
from testmig.util import download_with_progress, run_command
import testmig.log_setup
URL_PREFIX = 'https://storage.googleapis.com/optimism/snapshots/mainnet/2022-10-24-1'
default_monorepo_dir = os.path.abspath(os.path.join(os.getcwd(), '..'))
log = logging.getLogger()
@click.group()
def group():
pass
@group.command()
@click.option('--monorepo-dir', required=True, type=click.Path(exists=True), default=default_monorepo_dir)
@click.option('--snapshot-cache-dir', required=True, default='/tmp/testmig-snapshots')
@click.option('--work-dir', required=True, default='/tmp/testmig-workdir')
@click.option('--l1-url', required=True, default=os.getenv('TESTMIG_L1_URL'))
@click.option('--reset-work-dir', required=True, default=False)
def run_forked(monorepo_dir, snapshot_cache_dir, work_dir, l1_url, reset_work_dir):
if not os.path.isdir(snapshot_cache_dir):
os.makedirs(snapshot_cache_dir)
if reset_work_dir:
shutil.rmtree(work_dir)
os.makedirs(work_dir, exist_ok=True)
historical_mainnet_path = os.path.join(monorepo_dir, 'packages', 'contracts-bedrock', 'deployments', 'mainnet')
if os.path.isdir(historical_mainnet_path):
log.info('Removing historical mainnet deployment')
print(historical_mainnet_path)
shutil.rmtree(historical_mainnet_path)
for archive in ('dtl', 'geth'):
fp = os.path.join(snapshot_cache_dir, f'{archive}.tar.gz')
if os.path.isfile(fp):
log.info(f'{archive} archive already exists, not downloading')
else:
log.info(f'Downloading {archive} archive')
with open(fp, 'wb+') as f:
download_with_progress(f'{URL_PREFIX}/{archive}.tar.gz', f)
outpath = os.path.join(work_dir, archive)
donefile = os.path.join(outpath, 'DONE')
if os.path.isfile(donefile):
log.info(f'{archive} is already extracted')
else:
log.info(f'Extracting {archive} archive')
os.makedirs(outpath)
run_command(['tar', '-xzvf', fp, '--strip-components=6', '-C', outpath])
Path(donefile).touch()
client = docker.from_env()
try:
container = client.containers.get('testmig-l1')
container.stop()
container.remove()
log.info('Stopped and removed old containers')
except docker.errors.NotFound:
pass
log.info('Starting forked L1')
container = client.containers.run('ethereumoptimism/hardhat-node:latest', detach=True, environment={
'FORK_STARTING_BLOCK': '15822707',
'FORK_URL': l1_url,
'FORK_CHAIN_ID': '1'
}, name='testmig-l1', ports={'8545/tcp': ('127.0.0.1', 8545)})
w3 = None
for i in range(0, 10):
try:
w3 = Web3(Web3.HTTPProvider('http://127.0.0.1:8545'))
w3.eth.get_balance('0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266')
except Exception as e:
log.info('Polling for L1 to come up')
w3 = None
time.sleep(1)
if w3 is None:
raise Exception('Could not connect to Web3.')
log.info('L1 is ready')
for slot in SLOTS_TO_MODIFY:
log.info(f'Setting storage slot on {slot[0]}')
w3.provider.make_request('hardhat_setStorageAt', slot)
log.info('Mining a block for good measure')
w3.provider.make_request('evm_mine', [])
log.info('Running L1 migration')
run_command([
'yarn',
'hardhat',
'--network',
'mainnet-forked',
'deploy',
'--tags',
'migration'
], env={
'CHAIN_ID': '1',
'L1_RPC': 'http://127.0.0.1:8545',
'PRIVATE_KEY_DEPLOYER': 'ac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80',
}, cwd=os.path.join(monorepo_dir, 'packages', 'contracts-bedrock'))
log.info('Cleaning up')
container.stop()
container.remove()
if __name__ == '__main__':
group()
ADDRESSES = {
'Lib_AddressManager': '0xdE1FCfB0851916CA5101820A69b13a4E276bd81F',
'Proxy__OVM_L1StandardBridge': '0x99C9fc46f92E8a1c0deC1b1747d010903E884bE1',
'Proxy__OVM_L1CrossDomainMessenger': '0x25ace71c97B33Cc4729CF772ae268934F7ab5fA1',
}
DEPLOYER_ADDR = '0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266'
DEPLOYER_ADDR_PADDED = '0x000000000000000000000000f39Fd6e51aad88F6F4ce6aB8827279cffFb92266'
SLOTS_TO_MODIFY = (
# _owner slot
(ADDRESSES['Lib_AddressManager'], '0x0', DEPLOYER_ADDR_PADDED),
# proxy owner slot
(ADDRESSES['Proxy__OVM_L1StandardBridge'], '0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103',
DEPLOYER_ADDR_PADDED),
# owner slot on the underlying implementation
(ADDRESSES['Proxy__OVM_L1CrossDomainMessenger'], '0x33', DEPLOYER_ADDR_PADDED)
)
import os
from logging.config import dictConfig
log_level = os.getenv('LOG_LEVEL')
log_config = {
'version': 1,
'loggers': {
'': {
'handlers': ['console'],
'level': log_level if log_level is not None else 'INFO'
},
},
'handlers': {
'console': {
'formatter': 'stderr',
'class': 'logging.StreamHandler',
'stream': 'ext://sys.stdout'
}
},
'formatters': {
'stderr': {
'format': '[%(levelname)s|%(asctime)s] %(message)s',
'datefmt': '%m-%d-%Y %I:%M:%S'
}
},
}
dictConfig(log_config)
import os
import socket
import subprocess
import time
import requests
from tqdm import tqdm
def download_with_progress(url, f):
res = requests.get(url, stream=True, allow_redirects=True)
total_len = res.headers.get('content-length')
if total_len is None:
raise Exception('no total length, bailing out')
total_len = int(total_len)
with tqdm(total=total_len, unit='b', unit_scale=True) as pbar:
for data in res.iter_content(chunk_size=4096):
f.write(data)
pbar.update(len(data))
def run_command(args, check=True, shell=False, cwd=None, env=None):
env = env if env else {}
return subprocess.run(
args,
check=check,
shell=shell,
env={
**os.environ,
**env
},
cwd=cwd
)
def wait_up(port, retries=10, wait_secs=1):
for i in range(0, retries):
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
s.connect(('127.0.0.1', int(port)))
s.shutdown(2)
return True
except Exception:
time.sleep(wait_secs)
raise Exception(f'Timed out waiting for port {port}.')
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