mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-07-28 23:56:43 +00:00
merging geth-poa into go-ethereum repo
This commit is contained in:
parent
c244b5fbb9
commit
588539bbeb
18 changed files with 784 additions and 0 deletions
6
geth-poa/.env.example
Normal file
6
geth-poa/.env.example
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
CONTRACT_DEPLOYER_PRIVATE_KEY=
|
||||
NODE1_PRIVATE_KEY=
|
||||
NODE2_PRIVATE_KEY=
|
||||
RELAYER_PRIVATE_KEY=
|
||||
NEXT_PUBLIC_WALLET_CONNECT_ID=
|
||||
DD_KEY=
|
||||
1
geth-poa/.gitignore
vendored
Normal file
1
geth-poa/.gitignore
vendored
Normal file
|
|
@ -0,0 +1 @@
|
|||
.env
|
||||
26
geth-poa/Dockerfile
Normal file
26
geth-poa/Dockerfile
Normal file
|
|
@ -0,0 +1,26 @@
|
|||
FROM golang:1.21-alpine AS builder
|
||||
|
||||
RUN apk add --no-cache gcc musl-dev linux-headers git make
|
||||
|
||||
COPY go.mod /go-ethereum/
|
||||
COPY go.sum /go-ethereum/
|
||||
RUN cd /go-ethereum && go mod download
|
||||
|
||||
ADD . /go-ethereum
|
||||
RUN cd /go-ethereum && go run build/ci.go install -static ./cmd/geth
|
||||
|
||||
FROM alpine:latest
|
||||
|
||||
RUN apk add --no-cache jq
|
||||
|
||||
COPY --from=builder /go-ethereum/build/bin/geth /usr/local/bin/
|
||||
|
||||
COPY genesis.json /genesis.json
|
||||
|
||||
COPY entrypoint.sh /entrypoint.sh
|
||||
|
||||
RUN chmod +x /entrypoint.sh
|
||||
|
||||
EXPOSE 8545 6060
|
||||
|
||||
ENTRYPOINT ["/entrypoint.sh"]
|
||||
37
geth-poa/Makefile
Normal file
37
geth-poa/Makefile
Normal file
|
|
@ -0,0 +1,37 @@
|
|||
# Prod targets reg the amd agent image for this commit:
|
||||
# https://github.com/hyperlane-xyz/hyperlane-monorepo/commit/69850642365251e16b9f23b87d6caf187036b3ee
|
||||
up-prod:
|
||||
@if [ ! -f .env ]; then echo "Error: .env file not found. Please populate the .env file before running this command."; exit 1; fi
|
||||
AGENT_BASE_IMAGE=gcr.io/abacus-labs-dev/hyperlane-agent@sha256:854f92966eac6b49e5132e152cc58168ecdddc76c2d390e657b81bdaf1396af0 L2_NODE_URL=http://34.215.163.180:8545 docker compose --profile settlement --profile bridge --profile prod_agents up -d
|
||||
|
||||
up-prod-build:
|
||||
@if [ ! -f .env ]; then echo "Error: .env file not found. Please populate the .env file before running this command."; exit 1; fi
|
||||
AGENT_BASE_IMAGE=gcr.io/abacus-labs-dev/hyperlane-agent@sha256:854f92966eac6b49e5132e152cc58168ecdddc76c2d390e657b81bdaf1396af0 L2_NODE_URL=http://34.215.163.180:8545 docker compose --profile settlement --profile bridge --profile prod_agents up -d --build
|
||||
|
||||
up-prod-settlement:
|
||||
@if [ ! -f .env ]; then echo "Error: .env file not found. Please populate the .env file before running this command."; exit 1; fi
|
||||
AGENT_BASE_IMAGE=nil L2_NODE_URL=nil docker compose --profile settlement up -d --build
|
||||
|
||||
up-dev:
|
||||
@if [ ! -f .env ]; then echo "Error: .env file not found. Please populate the .env file before running this command."; exit 1; fi
|
||||
AGENT_BASE_IMAGE=shaspitz/hyperlane-agent-mac:6985064 L2_NODE_URL=http://localhost:8545 docker compose --profile settlement --profile bridge up -d
|
||||
|
||||
up-dev-build:
|
||||
@if [ ! -f .env ]; then echo "Error: .env file not found. Please populate the .env file before running this command."; exit 1; fi
|
||||
AGENT_BASE_IMAGE=shaspitz/hyperlane-agent-mac:6985064 L2_NODE_URL=http://localhost:8545 docker compose --profile settlement --profile bridge up -d --build
|
||||
|
||||
up-dev-settlement:
|
||||
@if [ ! -f .env ]; then echo "Error: .env file not found. Please populate the .env file before running this command."; exit 1; fi
|
||||
AGENT_BASE_IMAGE=shaspitz/hyperlane-agent-mac:6985064 L2_NODE_URL=http://localhost:8545 docker compose --profile settlement up -d --build
|
||||
|
||||
down:
|
||||
AGENT_BASE_IMAGE=nil L2_NODE_URL=nil docker compose --profile settlement --profile bridge --profile prod_agents down
|
||||
|
||||
clean-dbs:
|
||||
@read -p "WARNING: This command will wipe all persistent disk data relevant to the containers. Press enter to continue or Ctrl+C to cancel." _
|
||||
-docker compose --profile settlement --profile bridge down --rmi all --volumes
|
||||
-docker compose --profile settlement --profile bridge rm -fv
|
||||
docker image prune -f
|
||||
|
||||
pull-image:
|
||||
docker pull shaspitz/geth-poa:v0
|
||||
45
geth-poa/README.md
Normal file
45
geth-poa/README.md
Normal file
|
|
@ -0,0 +1,45 @@
|
|||
# geth-poa
|
||||
|
||||
Tool for spinning up a POA ethereum sidechain bridged to goerli via [hyperlane](https://www.hyperlane.xyz/) token warp route.
|
||||
|
||||
## TODOs
|
||||
|
||||
* add container which stress tests network with txs
|
||||
* merge branch with local anvil l1 once hyperlane v3 is released -> useful for mev-commit docker testing
|
||||
|
||||
## Metrics
|
||||
|
||||
Metrics recorded by bootnode are exposed to host at http://127.0.0.1:6060/debug/metrics
|
||||
|
||||
## Key Summary
|
||||
|
||||
Testnet private keys are in notion, and need to be copied into an .env.
|
||||
|
||||
All relevant accounts are funded on sidechain genesis, you may need to fund these accounts on L1 with faucets. See [hyperlane docs](https://docs.hyperlane.xyz/docs/deploy/deploy-hyperlane#1.-setup-keys).
|
||||
|
||||
## Contract deployer
|
||||
|
||||
Address: `0xBe3dEF3973584FdcC1326634aF188f0d9772D57D`
|
||||
|
||||
Note if the relayer is emitting errors related to unexpected contract routing, try using a new deployer key pair. It's likely that the current bridge contract deployments are clashing with previous deployments.
|
||||
|
||||
You'd need to replace `Address` above, the allocs field of `genesis.json`, and the `CONTRACT_DEPLOYER_PRIVATE_KEY` in `.env`.
|
||||
|
||||
## Validator Accounts (also POA signers)
|
||||
|
||||
### Node1
|
||||
|
||||
Address: `0xd9cd8E5DE6d55f796D980B818D350C0746C25b97`
|
||||
|
||||
### Node2
|
||||
|
||||
Address: `0x788EBABe5c3dD422Ef92Ca6714A69e2eabcE1Ee4`
|
||||
|
||||
## Relayer
|
||||
|
||||
Address: `0x0DCaa27B9E4Db92F820189345792f8eC5Ef148F6`
|
||||
|
||||
## Local Run
|
||||
|
||||
1. To run the local setup, set the .env file with the keys specified in .env.example.
|
||||
2. Run `$ make up-dev-build` to run the whole stack including bridge, or `$ make up-dev-settlement` to bring up only the settlement layer.
|
||||
251
geth-poa/docker-compose.yml
Normal file
251
geth-poa/docker-compose.yml
Normal file
|
|
@ -0,0 +1,251 @@
|
|||
version: '3'
|
||||
services:
|
||||
bootnode:
|
||||
build:
|
||||
context: .
|
||||
dockerfile: Dockerfile
|
||||
environment:
|
||||
- GETH_NODE_TYPE=bootnode
|
||||
- BOOT_KEY=7b548c1c0fbe80ef1eb0aaec2edf26fd20fb0d758e94948cf6c5f2a486e735f6
|
||||
networks:
|
||||
poa_net:
|
||||
ipv4_address: '172.13.0.100'
|
||||
ports:
|
||||
- 8545:8545
|
||||
- 8546:8546
|
||||
- 6060:6060 # metrics server @ /debug/metrics
|
||||
volumes:
|
||||
- geth-data-bootnode:/data
|
||||
profiles:
|
||||
- settlement
|
||||
labels:
|
||||
com.datadoghq.ad.check_names: '["openmetrics"]'
|
||||
com.datadoghq.ad.init_configs: '[{}]'
|
||||
com.datadoghq.ad.instances: |
|
||||
[
|
||||
{
|
||||
"openmetrics_endpoint": "http://%%host%%:6060/debug/metrics/prometheus",
|
||||
"namespace": "geth-poa",
|
||||
"metrics": [
|
||||
"txpool*",
|
||||
"trie*",
|
||||
"system*",
|
||||
"state*",
|
||||
"rpc*",
|
||||
"p2p*",
|
||||
"eth*",
|
||||
"chain*"
|
||||
]
|
||||
}
|
||||
]
|
||||
|
||||
node1:
|
||||
build:
|
||||
context: .
|
||||
dockerfile: Dockerfile
|
||||
environment:
|
||||
- GETH_NODE_TYPE=signer
|
||||
- BLOCK_SIGNER_ADDRESS=0xd9cd8E5DE6d55f796D980B818D350C0746C25b97
|
||||
- BLOCK_SIGNER_PRIVATE_KEY=${NODE1_PRIVATE_KEY}
|
||||
networks:
|
||||
poa_net:
|
||||
ipv4_address: '172.13.0.2'
|
||||
volumes:
|
||||
- geth-data-node1:/data
|
||||
profiles:
|
||||
- settlement
|
||||
labels:
|
||||
com.datadoghq.ad.check_names: '["openmetrics"]'
|
||||
com.datadoghq.ad.init_configs: '[{}]'
|
||||
com.datadoghq.ad.instances: |
|
||||
[
|
||||
{
|
||||
"openmetrics_endpoint": "http://%%host%%:6060/debug/metrics/prometheus",
|
||||
"namespace": "geth-poa",
|
||||
"metrics": [
|
||||
"clique*"
|
||||
]
|
||||
}
|
||||
]
|
||||
|
||||
|
||||
node2:
|
||||
build:
|
||||
context: .
|
||||
dockerfile: Dockerfile
|
||||
environment:
|
||||
- GETH_NODE_TYPE=signer
|
||||
- BLOCK_SIGNER_ADDRESS=0x788EBABe5c3dD422Ef92Ca6714A69e2eabcE1Ee4
|
||||
- BLOCK_SIGNER_PRIVATE_KEY=${NODE2_PRIVATE_KEY}
|
||||
networks:
|
||||
poa_net:
|
||||
ipv4_address: '172.13.0.3'
|
||||
volumes:
|
||||
- geth-data-node2:/data
|
||||
profiles:
|
||||
- settlement
|
||||
labels:
|
||||
com.datadoghq.ad.check_names: '["openmetrics"]'
|
||||
com.datadoghq.ad.init_configs: '[{}]'
|
||||
com.datadoghq.ad.instances: |
|
||||
[
|
||||
{
|
||||
"openmetrics_endpoint": "http://%%host%%:6060/debug/metrics/prometheus",
|
||||
"namespace": "geth-poa",
|
||||
"metrics": [
|
||||
"clique*"
|
||||
]
|
||||
}
|
||||
]
|
||||
|
||||
|
||||
hyperlane-deployer:
|
||||
build:
|
||||
context: ./hyperlane-deployer
|
||||
dockerfile: Dockerfile
|
||||
healthcheck:
|
||||
test: ["CMD-SHELL", "test -f /hyperlane-monorepo/artifacts/done-warp-route || exit 1"]
|
||||
interval: 5s
|
||||
retries: 100
|
||||
environment:
|
||||
- CONTRACT_DEPLOYER_PRIVATE_KEY=${CONTRACT_DEPLOYER_PRIVATE_KEY}
|
||||
networks:
|
||||
poa_net:
|
||||
ipv4_address: '172.13.0.50'
|
||||
volumes:
|
||||
- hyperlane-deploy-artifacts:/hyperlane-monorepo/artifacts
|
||||
profiles:
|
||||
- bridge
|
||||
|
||||
hyperlane-validator1:
|
||||
build:
|
||||
context: ./hyperlane-validator
|
||||
dockerfile: Dockerfile
|
||||
args:
|
||||
# Image can be built for arm64 with https://github.com/hyperlane-xyz/hyperlane-monorepo/blob/main/rust/build.sh
|
||||
- AGENT_BASE_IMAGE=${AGENT_BASE_IMAGE}
|
||||
# Reuse geth private key for validator
|
||||
command: ./validator --validator.key ${NODE1_PRIVATE_KEY} --chains.mevcommitsettlement.signer.key ${NODE1_PRIVATE_KEY} --checkpointSyncer.path /val1-sigs
|
||||
# TODO: evaluate why container needs to run as root
|
||||
user: "0:0"
|
||||
depends_on:
|
||||
hyperlane-deployer:
|
||||
condition: service_healthy
|
||||
networks:
|
||||
poa_net:
|
||||
ipv4_address: '172.13.0.75'
|
||||
volumes:
|
||||
- hyperlane-deploy-artifacts:/deploy-artifacts
|
||||
- hyperlane-validator1-sigs:/val1-sigs
|
||||
- hyperlane-validator1-db:/val-db
|
||||
profiles:
|
||||
- bridge
|
||||
|
||||
hyperlane-validator2:
|
||||
build:
|
||||
context: ./hyperlane-validator
|
||||
dockerfile: Dockerfile
|
||||
args:
|
||||
- AGENT_BASE_IMAGE=${AGENT_BASE_IMAGE}
|
||||
# Reuse geth private key for validator
|
||||
command: ./validator --validator.key ${NODE2_PRIVATE_KEY} --chains.mevcommitsettlement.signer.key ${NODE2_PRIVATE_KEY} --checkpointSyncer.path /val2-sigs
|
||||
# TODO: evaluate why container needs to run as root
|
||||
user: "0:0"
|
||||
depends_on:
|
||||
hyperlane-deployer:
|
||||
condition: service_healthy
|
||||
networks:
|
||||
poa_net:
|
||||
ipv4_address: '172.13.0.76'
|
||||
volumes:
|
||||
- hyperlane-deploy-artifacts:/deploy-artifacts
|
||||
- hyperlane-validator2-sigs:/val2-sigs
|
||||
- hyperlane-validator2-db:/val-db
|
||||
profiles:
|
||||
- bridge
|
||||
|
||||
hyperlane-relayer:
|
||||
build:
|
||||
context: ./hyperlane-relayer
|
||||
dockerfile: Dockerfile
|
||||
args:
|
||||
- AGENT_BASE_IMAGE=${AGENT_BASE_IMAGE}
|
||||
user: "0:0"
|
||||
depends_on:
|
||||
hyperlane-deployer:
|
||||
condition: service_healthy
|
||||
environment:
|
||||
- RELAYER_PRIVATE_KEY=${RELAYER_PRIVATE_KEY}
|
||||
networks:
|
||||
poa_net:
|
||||
ipv4_address: '172.13.0.77'
|
||||
volumes:
|
||||
- hyperlane-deploy-artifacts:/deploy-artifacts
|
||||
- hyperlane-validator1-sigs:/val1-sigs
|
||||
- hyperlane-validator2-sigs:/val2-sigs
|
||||
- hyperlane-relayer-db:/relayer-db
|
||||
profiles:
|
||||
- bridge
|
||||
|
||||
frontend:
|
||||
build:
|
||||
context: ./frontend
|
||||
dockerfile: Dockerfile
|
||||
args:
|
||||
- NEXT_PUBLIC_WALLET_CONNECT_ID=${NEXT_PUBLIC_WALLET_CONNECT_ID}
|
||||
depends_on:
|
||||
hyperlane-deployer:
|
||||
condition: service_healthy
|
||||
environment:
|
||||
- NEXT_PUBLIC_WALLET_CONNECT_ID=${NEXT_PUBLIC_WALLET_CONNECT_ID}
|
||||
- L2_NODE_URL=${L2_NODE_URL}
|
||||
networks:
|
||||
poa_net:
|
||||
ipv4_address: '172.13.0.90'
|
||||
ports:
|
||||
- 80:3000
|
||||
volumes:
|
||||
- hyperlane-deploy-artifacts:/deploy-artifacts
|
||||
profiles:
|
||||
- bridge
|
||||
|
||||
datadog-agent:
|
||||
image: gcr.io/datadoghq/agent:latest
|
||||
restart: always
|
||||
volumes:
|
||||
- /var/run/docker.sock:/var/run/docker.sock:ro
|
||||
- /proc/:/host/proc/:ro
|
||||
- /sys/fs/cgroup/:/host/sys/fs/cgroup:ro
|
||||
environment:
|
||||
- DD_API_KEY=${DD_KEY}
|
||||
- DD_TAGS=env:test
|
||||
- DD_SITE=datadoghq.com
|
||||
- DD_LOGS_ENABLED=true
|
||||
- DD_LOGS_CONFIG_CONTAINER_COLLECT_ALL=true
|
||||
- DD_CONTAINER_EXCLUDE="name:datadog-agent"
|
||||
ports:
|
||||
- "5000:5000"
|
||||
networks:
|
||||
poa_net:
|
||||
ipv4_address: 172.13.4.24
|
||||
profiles:
|
||||
- prod_agents
|
||||
|
||||
networks:
|
||||
poa_net:
|
||||
driver: bridge
|
||||
ipam:
|
||||
driver: default
|
||||
config:
|
||||
- subnet: 172.13.0.0/16
|
||||
|
||||
volumes:
|
||||
geth-data-bootnode:
|
||||
geth-data-node1:
|
||||
geth-data-node2:
|
||||
hyperlane-deploy-artifacts:
|
||||
hyperlane-validator1-sigs:
|
||||
hyperlane-validator2-sigs:
|
||||
hyperlane-validator1-db:
|
||||
hyperlane-validator2-db:
|
||||
hyperlane-relayer-db:
|
||||
115
geth-poa/entrypoint.sh
Normal file
115
geth-poa/entrypoint.sh
Normal file
|
|
@ -0,0 +1,115 @@
|
|||
#!/bin/sh
|
||||
set -exu
|
||||
|
||||
GENESIS_L1_PATH="/genesis.json"
|
||||
VERBOSITY=3
|
||||
GETH_DATA_DIR=/data
|
||||
GETH_CHAINDATA_DIR="$GETH_DATA_DIR/geth/chaindata"
|
||||
GETH_KEYSTORE_DIR="$GETH_DATA_DIR/keystore"
|
||||
CHAIN_ID=$(cat "$GENESIS_L1_PATH" | jq -r .config.chainId)
|
||||
RPC_PORT="${RPC_PORT:-8545}"
|
||||
WS_PORT="${WS_PORT:-8546}"
|
||||
|
||||
# Generate signer key if needed
|
||||
if [ ! -d "$GETH_KEYSTORE_DIR" ] && [ "$GETH_NODE_TYPE" = "signer" ]; then
|
||||
|
||||
echo "$GETH_KEYSTORE_DIR missing, running account import"
|
||||
echo -n "pwd" > "$GETH_DATA_DIR"/password
|
||||
echo -n "$BLOCK_SIGNER_PRIVATE_KEY" | sed 's/0x//' > "$GETH_DATA_DIR"/block-signer-key
|
||||
geth --verbosity="$VERBOSITY" \
|
||||
--nousb \
|
||||
account import \
|
||||
--datadir="$GETH_DATA_DIR" \
|
||||
--password="$GETH_DATA_DIR"/password \
|
||||
"$GETH_DATA_DIR"/block-signer-key
|
||||
else
|
||||
echo "$GETH_KEYSTORE_DIR exists."
|
||||
fi
|
||||
|
||||
# Init geth if needed
|
||||
if [ ! -d "$GETH_CHAINDATA_DIR" ]; then
|
||||
echo "$GETH_CHAINDATA_DIR missing, running init"
|
||||
echo "Initializing genesis."
|
||||
geth --verbosity="$VERBOSITY" \
|
||||
--nousb \
|
||||
--datadir="$GETH_DATA_DIR" init \
|
||||
"$GENESIS_L1_PATH"
|
||||
else
|
||||
echo "$GETH_CHAINDATA_DIR exists."
|
||||
fi
|
||||
|
||||
# Obtain assigned container IP for p2p
|
||||
NODE_IP=$(hostname -i)
|
||||
|
||||
if [ "$GETH_NODE_TYPE" = "bootnode" ]; then
|
||||
echo "Starting bootnode"
|
||||
|
||||
# Generate boot.key
|
||||
echo "$BOOT_KEY" > $GETH_DATA_DIR/boot.key
|
||||
|
||||
exec geth \
|
||||
--verbosity="$VERBOSITY" \
|
||||
--datadir="$GETH_DATA_DIR" \
|
||||
--port 30301 \
|
||||
--http \
|
||||
--http.corsdomain="*" \
|
||||
--http.vhosts="*" \
|
||||
--http.addr=0.0.0.0 \
|
||||
--http.port="$RPC_PORT" \
|
||||
--http.api=web3,debug,eth,txpool,net,engine \
|
||||
--ws \
|
||||
--ws.addr=0.0.0.0 \
|
||||
--ws.port="$WS_PORT" \
|
||||
--ws.origins="*" \
|
||||
--ws.api=debug,eth,txpool,net,engine \
|
||||
--syncmode=full \
|
||||
--gcmode=archive \
|
||||
--networkid=$CHAIN_ID \
|
||||
--nousb \
|
||||
--metrics \
|
||||
--metrics.addr=0.0.0.0 \
|
||||
--metrics.port=6060 \
|
||||
--nodekey $GETH_DATA_DIR/boot.key \
|
||||
--netrestrict 172.13.0.0/24 \
|
||||
--nat extip:$NODE_IP
|
||||
|
||||
elif [ "$GETH_NODE_TYPE" = "signer" ]; then
|
||||
echo "Starting signer node"
|
||||
|
||||
exec geth \
|
||||
--verbosity="$VERBOSITY" \
|
||||
--datadir="$GETH_DATA_DIR" \
|
||||
--port 30311 \
|
||||
--syncmode=full \
|
||||
--gcmode=full \
|
||||
--http \
|
||||
--http.corsdomain="*" \
|
||||
--http.vhosts="*" \
|
||||
--http.addr=0.0.0.0 \
|
||||
--http.port="$RPC_PORT" \
|
||||
--http.api=web3,debug,eth,txpool,net,engine \
|
||||
--bootnodes enode://34a2a388ad31ca37f127bb9ffe93758ee711c5c2277dff6aff2e359bcf2c9509ea55034196788dbd59ed70861f523c1c03d54f1eabb2b4a5c1c129d966fe1e65@172.13.0.100:30301 \
|
||||
--networkid=$CHAIN_ID \
|
||||
--unlock=$BLOCK_SIGNER_ADDRESS \
|
||||
--password="$GETH_DATA_DIR"/password \
|
||||
--mine \
|
||||
--miner.etherbase=$BLOCK_SIGNER_ADDRESS \
|
||||
--allow-insecure-unlock \
|
||||
--nousb \
|
||||
--netrestrict 172.13.0.0/24 \
|
||||
--metrics \
|
||||
--metrics.addr=0.0.0.0 \
|
||||
--metrics.port=6060 \
|
||||
--ws \
|
||||
--ws.addr=0.0.0.0 \
|
||||
--ws.port="$WS_PORT" \
|
||||
--ws.origins="*" \
|
||||
--ws.api=debug,eth,txpool,net,engine \
|
||||
--rpc.allow-unprotected-txs \
|
||||
--authrpc.addr="0.0.0.0" \
|
||||
--authrpc.port="8551" \
|
||||
--authrpc.vhosts="*" \
|
||||
--nat extip:$NODE_IP
|
||||
else
|
||||
echo "Invalid GETH_NODE_TYPE specified"
|
||||
fi
|
||||
18
geth-poa/frontend/Dockerfile
Normal file
18
geth-poa/frontend/Dockerfile
Normal file
|
|
@ -0,0 +1,18 @@
|
|||
FROM alpine:latest
|
||||
|
||||
RUN apk add --no-cache git yarn jq
|
||||
|
||||
RUN git clone https://github.com/primevprotocol/hyperlane-ui.git
|
||||
WORKDIR /hyperlane-ui
|
||||
RUN git checkout 48ae5056012ae579897acca35535f35adf53fdda
|
||||
|
||||
RUN yarn
|
||||
|
||||
ARG NEXT_PUBLIC_WALLET_CONNECT_ID
|
||||
|
||||
RUN yarn build
|
||||
|
||||
COPY entrypoint.sh /entrypoint.sh
|
||||
RUN chmod +x /entrypoint.sh
|
||||
|
||||
ENTRYPOINT [ "/entrypoint.sh" ]
|
||||
14
geth-poa/frontend/entrypoint.sh
Normal file
14
geth-poa/frontend/entrypoint.sh
Normal file
|
|
@ -0,0 +1,14 @@
|
|||
#!/bin/sh
|
||||
set -exu
|
||||
|
||||
# Update src tokens.ts file with hypNativeAddress value from deploy config
|
||||
ARTIFACT_PATH="/deploy-artifacts/warp-ui-token-config.json"
|
||||
SRC_TOKENS_PATH="/hyperlane-ui/src/consts/tokens.ts"
|
||||
HYP_NATIVE_ADDR=$(jq -r '.hypNativeAddress' $ARTIFACT_PATH)
|
||||
sed -i "/hypNativeAddress/c\ hypNativeAddress: \"$HYP_NATIVE_ADDR\"," $SRC_TOKENS_PATH
|
||||
|
||||
# Update src chains.ts file with L2 node url depending on dev vs prod
|
||||
SRC_CHAINS_PATH="/hyperlane-ui/src/consts/chains.ts"
|
||||
sed -i "s|http: 'http://[^']*'|http: '$L2_NODE_URL'|g" "$SRC_CHAINS_PATH"
|
||||
|
||||
exec yarn dev
|
||||
52
geth-poa/genesis.json
Normal file
52
geth-poa/genesis.json
Normal file
|
|
@ -0,0 +1,52 @@
|
|||
{
|
||||
"config": {
|
||||
"chainId": 17864,
|
||||
"homesteadBlock": 0,
|
||||
"eip150Block": 0,
|
||||
"eip155Block": 0,
|
||||
"eip158Block": 0,
|
||||
"byzantiumBlock": 0,
|
||||
"constantinopleBlock": 0,
|
||||
"petersburgBlock": 0,
|
||||
"istanbulBlock": 0,
|
||||
"muirGlacierBlock": 0,
|
||||
"berlinBlock": 0,
|
||||
"londonBlock": 0,
|
||||
"arrowGlacierBlock": 0,
|
||||
"grayGlacierBlock": 0,
|
||||
"clique": {
|
||||
"period": 200,
|
||||
"epoch": 30000
|
||||
}
|
||||
},
|
||||
"nonce": "0x0",
|
||||
"timestamp": "0x6546df6d",
|
||||
"extraData": "0x0000000000000000000000000000000000000000000000000000000000000000d9cd8E5DE6d55f796D980B818D350C0746C25b97788EBABe5c3dD422Ef92Ca6714A69e2eabcE1Ee40000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
|
||||
"gasLimit": "0x1c9c380",
|
||||
"difficulty": "0x1",
|
||||
"mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
|
||||
"coinbase": "0x0000000000000000000000000000000000000000",
|
||||
"alloc": {
|
||||
"0xBe3dEF3973584FdcC1326634aF188f0d9772D57D": {
|
||||
"balance": "10000000000000000000000"
|
||||
},
|
||||
"d9cd8E5DE6d55f796D980B818D350C0746C25b97": {
|
||||
"balance": "10000000000000000000000"
|
||||
},
|
||||
"788EBABe5c3dD422Ef92Ca6714A69e2eabcE1Ee4": {
|
||||
"balance": "10000000000000000000000"
|
||||
},
|
||||
"0DCaa27B9E4Db92F820189345792f8eC5Ef148F6": {
|
||||
"balance": "10000000000000000000000"
|
||||
},
|
||||
"f39Fd6e51aad88F6F4ce6aB8827279cffFb92266": {
|
||||
"balance": "10000000000000000000000"
|
||||
}
|
||||
},
|
||||
"number": "0x0",
|
||||
"gasUsed": "0x0",
|
||||
"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
|
||||
"baseFeePerGas": "0x3b9aca00",
|
||||
"excessBlobGas": null,
|
||||
"blobGasUsed": null
|
||||
}
|
||||
25
geth-poa/hyperlane-deployer/Dockerfile
Normal file
25
geth-poa/hyperlane-deployer/Dockerfile
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
FROM alpine:latest
|
||||
|
||||
RUN apk update && apk add --no-cache git yarn expect
|
||||
|
||||
WORKDIR /
|
||||
RUN git clone https://github.com/primevprotocol/hyperlane-monorepo.git
|
||||
WORKDIR /hyperlane-monorepo
|
||||
# RUN git checkout v3-audit-remediations
|
||||
RUN git checkout ca301c80861701e17b13b9a06454795b317696b2
|
||||
# TODO: checkout stable version, seemed like v3-audit-remediations changed build process
|
||||
RUN yarn install
|
||||
RUN yarn build
|
||||
|
||||
RUN ln -s /hyperlane-monorepo/typescript/cli/dist/cli.js /usr/local/bin/hyperlane
|
||||
RUN chmod +x /usr/local/bin/hyperlane
|
||||
|
||||
COPY chain-config.yml /chain-config.yml
|
||||
COPY multisig-ism.yml /multisig-ism.yml
|
||||
COPY warp-tokens.yml /warp-tokens.yml
|
||||
|
||||
COPY entrypoint.sh /entrypoint.sh
|
||||
RUN chmod +x /entrypoint.sh
|
||||
|
||||
ENTRYPOINT [ "/entrypoint.sh" ]
|
||||
|
||||
59
geth-poa/hyperlane-deployer/chain-config.yml
Normal file
59
geth-poa/hyperlane-deployer/chain-config.yml
Normal file
|
|
@ -0,0 +1,59 @@
|
|||
---
|
||||
mevcommitsettlement:
|
||||
chainId: 17864
|
||||
domainId: 17864
|
||||
name: mevcommitsettlement
|
||||
protocol: ethereum
|
||||
rpcUrls:
|
||||
# Only http field is required
|
||||
- http: http://172.13.0.100:8545
|
||||
pagination:
|
||||
maxBlockRange: 1000
|
||||
maxBlockAge: 1000
|
||||
minBlockNumber: 1000
|
||||
retry:
|
||||
maxRequests: 5
|
||||
baseRetryMs: 1000
|
||||
isTestnet: true
|
||||
# blockExplorers: # Array: List of BlockExplorer configs
|
||||
# # Required fields:
|
||||
# - name: My Chain Explorer # String: Human-readable name for the explorer
|
||||
# url: https://mychain.com/explorer # String: Base URL for the explorer
|
||||
# apiUrl: https://mychain.com/api # String: Base URL for the explorer API
|
||||
# # Optional fields:
|
||||
# apiKey: myapikey # String: API key for the explorer (optional)
|
||||
# family: etherscan # ExplorerFamily: See ExplorerFamily for valid values
|
||||
nativeToken:
|
||||
name: cETH # String
|
||||
symbol: cETH # String
|
||||
decimals: 18 # Number
|
||||
displayName: MEV Commit Settlement
|
||||
displayNameShort: MEV Commit Settlement
|
||||
logoURI: https://mychain.com/logo.png
|
||||
blocks:
|
||||
confirmations: 12 # Number: Blocks to wait before considering a transaction confirmed
|
||||
reorgPeriod: 100 # Number: Blocks before a transaction has a near-zero chance of reverting
|
||||
estimateBlockTime: 1
|
||||
|
||||
sepolia:
|
||||
chainId: 11155111
|
||||
domainId: 11155111
|
||||
name: sepolia
|
||||
protocol: ethereum
|
||||
displayName: Sepolia
|
||||
nativeToken:
|
||||
name: Ether
|
||||
symbol: ETH
|
||||
decimals: 18
|
||||
rpcUrls:
|
||||
- http: https://eth-sepolia.g.alchemy.com/v2/a0wg_g1X-Wz4IeVA-0SS3PsQhbyQNjc_
|
||||
blockExplorers:
|
||||
- name: Etherscan
|
||||
url: https://sepolia.etherscan.io
|
||||
apiUrl: https://api-sepolia.etherscan.io/api
|
||||
family: etherscan
|
||||
blocks:
|
||||
confirmations: 1
|
||||
reorgPeriod: 2
|
||||
estimateBlockTime: 13
|
||||
isTestnet: true
|
||||
69
geth-poa/hyperlane-deployer/entrypoint.sh
Normal file
69
geth-poa/hyperlane-deployer/entrypoint.sh
Normal file
|
|
@ -0,0 +1,69 @@
|
|||
#!/bin/sh
|
||||
set -exu
|
||||
|
||||
# Sleep to ensure chain is up
|
||||
sleep 10
|
||||
|
||||
if test -f /hyperlane-monorepo/artifacts/done; then
|
||||
echo "Deploy artifacts already exist. Skipping deployment."
|
||||
else
|
||||
|
||||
# Define the expect script inline
|
||||
/usr/bin/expect <<EOF
|
||||
set timeout -1
|
||||
spawn hyperlane deploy core \
|
||||
--yes \
|
||||
--targets sepolia,mevcommitsettlement \
|
||||
--chains /chain-config.yml \
|
||||
--ism /multisig-ism.yml \
|
||||
--out "/hyperlane-monorepo/artifacts" \
|
||||
--key $CONTRACT_DEPLOYER_PRIVATE_KEY
|
||||
expect {
|
||||
"? Do you want use some existing contract addresses? (Y/n)" {
|
||||
send -- "n\r"
|
||||
exp_continue
|
||||
}
|
||||
"*low balance on*" {
|
||||
send -- "y\r"
|
||||
exp_continue
|
||||
}
|
||||
eof
|
||||
}
|
||||
EOF
|
||||
|
||||
# Standardize artifact names
|
||||
for file in /hyperlane-monorepo/artifacts/agent-config-*.json; do
|
||||
mv "$file" "/hyperlane-monorepo/artifacts/agent-config.json"
|
||||
done
|
||||
for file in /hyperlane-monorepo/artifacts/core-deployment-*.json; do
|
||||
mv "$file" "/hyperlane-monorepo/artifacts/core-deployment.json"
|
||||
done
|
||||
|
||||
# Signal done
|
||||
touch /hyperlane-monorepo/artifacts/done
|
||||
fi
|
||||
|
||||
if test -f artifacts/done-warp-route; then
|
||||
echo "Warp route already deployed. Skipping."
|
||||
else
|
||||
echo "Deploying warp route."
|
||||
hyperlane deploy warp \
|
||||
--yes \
|
||||
--key $CONTRACT_DEPLOYER_PRIVATE_KEY \
|
||||
--chains /chain-config.yml \
|
||||
--config /warp-tokens.yml \
|
||||
--core /hyperlane-monorepo/artifacts/core-deployment.json
|
||||
|
||||
# Standardize artifact names
|
||||
for file in /hyperlane-monorepo/artifacts/warp-deployment-*.json; do
|
||||
mv "$file" "/hyperlane-monorepo/artifacts/warp-deployment.json"
|
||||
done
|
||||
for file in /hyperlane-monorepo/artifacts/warp-ui-token-config-*.json; do
|
||||
mv "$file" "/hyperlane-monorepo/artifacts/warp-ui-token-config.json"
|
||||
done
|
||||
|
||||
touch artifacts/done-warp-route
|
||||
fi
|
||||
|
||||
# Sleep to allow deployer health check (polled every 5sec) to pass
|
||||
sleep 10
|
||||
7
geth-poa/hyperlane-deployer/multisig-ism.yml
Normal file
7
geth-poa/hyperlane-deployer/multisig-ism.yml
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
---
|
||||
mevcommitsettlement:
|
||||
type: 'messageIdMultisigIsm'
|
||||
threshold: 2
|
||||
validators:
|
||||
- '0xd9cd8E5DE6d55f796D980B818D350C0746C25b97'
|
||||
- '0x788EBABe5c3dD422Ef92Ca6714A69e2eabcE1Ee4'
|
||||
8
geth-poa/hyperlane-deployer/warp-tokens.yml
Normal file
8
geth-poa/hyperlane-deployer/warp-tokens.yml
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
base:
|
||||
chainName: sepolia
|
||||
type: native
|
||||
synthetics:
|
||||
- chainName: mevcommitsettlement
|
||||
# name: "Commit ETH"
|
||||
# symbol: "cETH"
|
||||
# totalSupply: 10000000
|
||||
19
geth-poa/hyperlane-relayer/Dockerfile
Normal file
19
geth-poa/hyperlane-relayer/Dockerfile
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
ARG AGENT_BASE_IMAGE
|
||||
FROM ${AGENT_BASE_IMAGE}
|
||||
|
||||
# Relayer config, see:
|
||||
# - https://docs.hyperlane.xyz/docs/operators/relayers/setup
|
||||
# - https://docs.hyperlane.xyz/docs/operators/agent-configuration#config-layers
|
||||
|
||||
ENV CONFIG_FILES="/deploy-artifacts/agent-config.json"
|
||||
|
||||
# TODO: enforce minimum gas payment in prod
|
||||
|
||||
CMD ./relayer \
|
||||
--relayChains mevcommitsettlement,sepolia \
|
||||
--chains.mevcommitsettlement.connection.url "http://172.13.0.100:8545" \
|
||||
--chains.sepolia.connection.url "https://eth-sepolia.g.alchemy.com/v2/a0wg_g1X-Wz4IeVA-0SS3PsQhbyQNjc_" \
|
||||
--db /relayer-db \
|
||||
--defaultSigner.key $RELAYER_PRIVATE_KEY \
|
||||
--allowLocalCheckpointSyncers true \
|
||||
--gasPaymentEnforcement '[{"type": "none"}]'
|
||||
15
geth-poa/hyperlane-validator/Dockerfile
Normal file
15
geth-poa/hyperlane-validator/Dockerfile
Normal file
|
|
@ -0,0 +1,15 @@
|
|||
ARG AGENT_BASE_IMAGE
|
||||
FROM ${AGENT_BASE_IMAGE}
|
||||
|
||||
# Validator config, see:
|
||||
# - https://docs.hyperlane.xyz/docs/operators/validators/setup
|
||||
# - https://docs.hyperlane.xyz/docs/operators/agent-configuration#config-layers
|
||||
|
||||
ENV CONFIG_FILES="/deploy-artifacts/agent-config.json"
|
||||
|
||||
ENV HYP_BASE_REORGPERIOD=20
|
||||
ENV HYP_BASE_ORIGINCHAINNAME="mevcommitsettlement"
|
||||
ENV HYP_BASE_CHAINS_MEVCOMMITSETTLEMENT_CONNECTION_URL="http://172.13.0.100:8545"
|
||||
ENV HYP_BASE_DB="/val-db"
|
||||
ENV HYP_CHECKPOINTSYNCER_TYPE="localStorage"
|
||||
ENV HYP_ORIGINCHAINNAME="mevcommitsettlement"
|
||||
17
geth-poa/util/generate_extradata.sh
Executable file
17
geth-poa/util/generate_extradata.sh
Executable file
|
|
@ -0,0 +1,17 @@
|
|||
#!/bin/bash
|
||||
|
||||
# See: https://geth.ethereum.org/docs/fundamentals/private-network's extradata section.
|
||||
|
||||
# Start with 32 bytes of zeros
|
||||
extradata="0x$(printf '0%.0s' {1..64})"
|
||||
|
||||
for addr in "$@"; do
|
||||
# Remove '0x' from the start of the address if present
|
||||
addr="${addr#0x}"
|
||||
extradata+="$addr"
|
||||
done
|
||||
|
||||
# End with 65 bytes of zeros
|
||||
extradata+=$(printf '0%.0s' {1..130})
|
||||
|
||||
echo "$extradata"
|
||||
Loading…
Reference in a new issue