Add local instaswap E2E workspace harness
This commit is contained in:
127
bootstrap-ethereum-local.sh
Executable file
127
bootstrap-ethereum-local.sh
Executable file
@@ -0,0 +1,127 @@
|
||||
#!/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 "$@"
|
||||
Reference in New Issue
Block a user