128 lines
4.4 KiB
Bash
Executable File
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 "$@"
|