Files
skunk-net-e2e/bootstrap-ethereum-local.sh
2026-04-03 17:17:40 -04:00

128 lines
4.4 KiB
Bash
Executable File

#!/usr/bin/env bash
set -euo pipefail
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
WIRE_ETHEREUM_DIR="${WIRE_ETHEREUM_DIR:-$(pwd)}"
WIRE_ETHEREUM_REPO_REL="${WIRE_ETHEREUM_REPO_REL:-$(realpath --relative-to "${ROOT_DIR}" "${WIRE_ETHEREUM_DIR}")}"
LOCAL_DEPLOY_DIR="${WIRE_ETHEREUM_DIR}/.local/deployments"
ARTIFACTS_DIR="${ROOT_DIR}/.local/e2e"
HARDHAT_RPC_URL="${HARDHAT_RPC_URL:-http://127.0.0.1:8545}"
WIRE_BATCH_ETH_RPC_URL="${WIRE_BATCH_ETH_RPC_URL:-http://hardhat:8545}"
HARDHAT_DEPLOYER_KEY="${HARDHAT_DEPLOYER_KEY:-0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80}"
ETH_CLIENT_ID="${ETH_CLIENT_ID:-eth-local-1}"
ETH_PROVIDER_ID="${ETH_PROVIDER_ID:-eth-local-1}"
ETH_ABI_FILE="${ETH_ABI_FILE:-}"
wait_for_rpc() {
for _ in $(seq 1 60); do
if curl -fsS -H 'Content-Type: application/json' \
--data '{"jsonrpc":"2.0","method":"eth_chainId","params":[],"id":1}' \
"${HARDHAT_RPC_URL}" >/dev/null 2>&1; then
return 0
fi
sleep 1
done
echo "Hardhat RPC did not become ready at ${HARDHAT_RPC_URL}" >&2
exit 1
}
write_deploy_configs() {
mkdir -p "${LOCAL_DEPLOY_DIR}"
cat >"${LOCAL_DEPLOY_DIR}/liqeth.json" <<EOF
{
"url": "${HARDHAT_RPC_URL}",
"key": "${HARDHAT_DEPLOYER_KEY}",
"addressFile": "${LOCAL_DEPLOY_DIR}/liqeth-addrs.json",
"gasLimitFile": "${LOCAL_DEPLOY_DIR}/liqeth-gas-limits.json"
}
EOF
cat >"${LOCAL_DEPLOY_DIR}/outpost.json" <<EOF
{
"url": "${HARDHAT_RPC_URL}",
"key": "${HARDHAT_DEPLOYER_KEY}",
"useMockAggregator": true,
"addressFile": "${LOCAL_DEPLOY_DIR}/outpost-addrs.json",
"gasLimitFile": "${LOCAL_DEPLOY_DIR}/outpost-gas-limits.json"
}
EOF
}
deploy_local_stack() {
npm ci
write_deploy_configs
npx hardhat run src/scripts/deployLocal.ts --network anvil_local
}
write_artifacts() {
local out_file="${ARTIFACTS_DIR}/ethereum.env"
mkdir -p "${ARTIFACTS_DIR}"
ROOT_DIR="${ROOT_DIR}" \
WIRE_ETHEREUM_DIR="${WIRE_ETHEREUM_DIR}" \
WIRE_ETHEREUM_REPO_REL="${WIRE_ETHEREUM_REPO_REL}" \
ETH_PROVIDER_ID="${ETH_PROVIDER_ID}" \
ETH_CLIENT_ID="${ETH_CLIENT_ID}" \
HARDHAT_DEPLOYER_KEY="${HARDHAT_DEPLOYER_KEY}" \
WIRE_BATCH_ETH_RPC_URL="${WIRE_BATCH_ETH_RPC_URL}" \
ETH_ABI_FILE="${ETH_ABI_FILE}" \
node <<'EOF' >"${out_file}"
const fs = require("fs");
const path = require("path");
const { ethers } = require("ethers");
const rootDir = process.env.ROOT_DIR;
const repoDir = process.env.WIRE_ETHEREUM_DIR;
const repoRel = process.env.WIRE_ETHEREUM_REPO_REL;
const providerId = process.env.ETH_PROVIDER_ID;
const clientId = process.env.ETH_CLIENT_ID;
const privateKey = process.env.HARDHAT_DEPLOYER_KEY;
const rpcUrl = process.env.WIRE_BATCH_ETH_RPC_URL;
const abiFileOverride = process.env.ETH_ABI_FILE;
const addrsPath = path.join(repoDir, ".local", "deployments", "outpost-addrs.json");
const addrs = JSON.parse(fs.readFileSync(addrsPath, "utf8"));
const publicKey = new ethers.SigningKey(privateKey).publicKey;
const abiOutputPath = path.join(rootDir, ".local", "e2e", "ethereum-outpost-abi.json");
let abiFile = abiFileOverride;
if (!abiFile) {
const artifactPaths = [
path.join(repoDir, "artifacts", "contracts", "outpost", "OPP.sol", "OPP.json"),
path.join(repoDir, "artifacts", "contracts", "outpost", "OPPInbound.sol", "OPPInbound.json"),
];
const combinedAbi = artifactPaths.flatMap((artifactPath) => {
const artifact = JSON.parse(fs.readFileSync(artifactPath, "utf8"));
if (!Array.isArray(artifact.abi)) {
throw new Error(`Artifact missing abi array: ${artifactPath}`);
}
return artifact.abi;
});
fs.mkdirSync(path.dirname(abiOutputPath), { recursive: true });
fs.writeFileSync(abiOutputPath, `${JSON.stringify(combinedAbi, null, 2)}\n`);
abiFile = "/wire/.local/e2e/ethereum-outpost-abi.json";
}
console.log(`LOCAL_ETH_CLIENT_ID=${clientId}`);
console.log(`LOCAL_ETH_PROVIDER_ID=${providerId}`);
console.log(`LOCAL_ETH_PROVIDER_SPEC=${providerId},ethereum,ethereum,${publicKey},KEY:${privateKey}`);
console.log(`LOCAL_ETH_RPC_URL=${rpcUrl}`);
console.log(`LOCAL_ETH_OPP_ADDRESS=${addrs.OPP}`);
console.log(`LOCAL_ETH_OPP_INBOUND_ADDRESS=${addrs.OPPInbound}`);
console.log(`LOCAL_ETH_ABI_FILE=${abiFile}`);
console.log(`LOCAL_ETH_REPO_DIR=${repoRel}`);
console.log(`LOCAL_ETH_OUTPOST_ADDRS=${path.join(rootDir, repoRel, ".local", "deployments", "outpost-addrs.json")}`);
EOF
}
main() {
cd "${WIRE_ETHEREUM_DIR}"
wait_for_rpc
deploy_local_stack
write_artifacts
}
main "$@"