diff --git a/.github/workflows/branch.yaml b/.github/workflows/branch.yaml index 9e8d3b848..d8152c4be 100644 --- a/.github/workflows/branch.yaml +++ b/.github/workflows/branch.yaml @@ -10,7 +10,7 @@ jobs: timeout-minutes: 30 # `yarn test` takes longer time steps: - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Use Node.js 20 uses: actions/setup-node@v3 with: diff --git a/.github/workflows/docker.yaml b/.github/workflows/docker.yaml index b5d44671f..9f43f29e7 100644 --- a/.github/workflows/docker.yaml +++ b/.github/workflows/docker.yaml @@ -29,13 +29,15 @@ jobs: - name: Docker image id: docker-image run: | - echo "image=${{ steps.login-ecr.outputs.registry }}/${{ secrets.ECR_REPOSITORY }}:${{ github.sha }}" >> $GITHUB_OUTPUT + echo "image=${{ steps.login-ecr.outputs.registry }}/${{ secrets.ECR_REPOSITORY }}" >> $GITHUB_OUTPUT - name: Build and push the image - uses: docker/build-push-action@v5 + uses: docker/build-push-action@v6 id: docker-build with: context: ./ file: ./Dockerfile push: true - tags: latest,${{ steps.docker-image.outputs.image }} + tags: | + ${{ steps.docker-image.outputs.image }}:latest + ${{ steps.docker-image.outputs.image }}:${{ github.sha }} diff --git a/.github/workflows/pr.yaml b/.github/workflows/pr.yaml index f937c90f0..97dac82fa 100644 --- a/.github/workflows/pr.yaml +++ b/.github/workflows/pr.yaml @@ -1,4 +1,5 @@ name: "PR" + on: pull_request: @@ -8,7 +9,7 @@ jobs: timeout-minutes: 30 # `yarn test` takes longer time steps: - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Use Node.js 20 uses: actions/setup-node@v3 with: diff --git a/.prettierignore b/.prettierignore index 71c49694d..8d8c16227 100644 --- a/.prettierignore +++ b/.prettierignore @@ -19,6 +19,7 @@ dist/ ## ignore files .*ignore .nvmrc +*.patch # Ignore extensions *.env diff --git a/Dockerfile b/Dockerfile index 7b9460f8c..a037cd144 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,13 +1,31 @@ -FROM node:20 +ARG NODEJS_VERSION=20 -WORKDIR /relayer +##### Stage 1 -COPY . ./ +FROM node:$NODEJS_VERSION-alpine AS builder -RUN apt-get update -RUN apt-get install -y libudev-dev libusb-1.0-0-dev jq yarn rsync -RUN yarn +RUN apk add --no-cache alpine-sdk=~1 python3=~3 && \ + adduser -D builder && \ + chown -R builder:builder /home/builder/ -RUN yarn build +USER builder +WORKDIR /home/builder/build -ENTRYPOINT ["/bin/bash", "scripts/runCommand.sh"] +COPY . . + +RUN yarn install --frozen-lockfile && yarn build + +##### Stage 2 + +FROM node:$NODEJS_VERSION-alpine + +RUN apk add --no-cache aws-cli=~2 jq=~1 && \ + adduser -D lisk && \ + chown -R lisk:lisk /home/lisk/ + +USER lisk +WORKDIR /home/lisk/across-relayer + +COPY --chown=lisk:lisk --from=builder /home/builder/build/dist/ ./dist/ +COPY --chown=lisk:lisk --from=builder /home/builder/build/node_modules/ ./node_modules/ +COPY --chown=lisk:lisk --from=builder /home/builder/build/config/ ./config/ diff --git a/appspec.yml b/appspec.yml index 446b80bbe..95f918748 100644 --- a/appspec.yml +++ b/appspec.yml @@ -4,11 +4,9 @@ files: - source: / destination: /home/ubuntu/lisk-across-relayer hooks: - AfterInstall: - - location: scripts/installDependencies.sh - runas: root - - location: scripts/installApplication.sh - runas: root + ApplicationStop: + - location: scripts/lisk/docker/composeStop.sh + timeout: 330 ApplicationStart: - - location: scripts/runMainnet.sh - runas: root + - location: scripts/lisk/docker/composeStart.sh + timeout: 300 diff --git a/cloudbuild.yml b/cloudbuild.yml deleted file mode 100644 index 3d54ca2c5..000000000 --- a/cloudbuild.yml +++ /dev/null @@ -1,7 +0,0 @@ -steps: - - name: "gcr.io/cloud-builders/docker" - args: ["build", "-t", "gcr.io/images-across-6363/across-v2", "."] -options: - machineType: "E2_HIGHCPU_32" -timeout: 3600s -images: ["gcr.io/images-across-6363/across-v2"] diff --git a/config/sepolia/relayerExternalInventory.json b/config/sepolia/relayerExternalInventory.json new file mode 100644 index 000000000..277bcd1ca --- /dev/null +++ b/config/sepolia/relayerExternalInventory.json @@ -0,0 +1,41 @@ +{ + "wrapEtherTarget": 0.1, + "wrapEtherThreshold": 0.125, + "wrapEtherTargetPerChain": { + "1": 1 + }, + "wrapEtherThresholdPerChain": { + "1": 2 + }, + "tokenConfig": { + "0xfFf9976782d46CC05630D1f6eBAb18b2324d6B14": { + "11155111": { + "targetPct": 100, + "thresholdPct": 100, + "unwrapWethThreshold": 0.5, + "unwrapWethTarget": 1 + }, + "4202": { + "targetPct": 30, + "thresholdPct": 10, + "unwrapWethThreshold": 0.025, + "unwrapWethTarget": 0.1, + "targetOverageBuffer": 1.5 + } + }, + "0x16B840bA01e2b05fc2268eAf6d18892a11EC29D6": { + "4202": { + "targetPct": 30, + "thresholdPct": 10, + "targetOverageBuffer": 2.5 + } + }, + "0xaA8E23Fb1079EA71e0a56F48a2aA51851D8433D0": { + "4202": { + "targetPct": 30, + "thresholdPct": 10, + "targetOverageBuffer": 1.5 + } + } + } +} diff --git a/scripts/lisk/docker/changeToAppInstallDir.sh b/scripts/lisk/docker/changeToAppInstallDir.sh new file mode 100644 index 000000000..49f338e35 --- /dev/null +++ b/scripts/lisk/docker/changeToAppInstallDir.sh @@ -0,0 +1,7 @@ +#!/bin/bash +set -eu + +app_install_dir="/home/ubuntu/lisk-across-relayer" +echo "App install dir: $app_install_dir" + +cd ${app_install_dir} diff --git a/scripts/lisk/docker/composeStart.sh b/scripts/lisk/docker/composeStart.sh new file mode 100644 index 000000000..b3a85666b --- /dev/null +++ b/scripts/lisk/docker/composeStart.sh @@ -0,0 +1,9 @@ +#!/bin/bash +set -eu + +. $(dirname "$0")/changeToAppInstallDir.sh + +. $(dirname "$0")/setEnvVariables.sh + +aws ecr get-login-password --region ${AWS_REGION} | docker login --username AWS --password-stdin ${AWS_ECR_REGISTRY} +docker compose up --pull always --detach diff --git a/scripts/lisk/docker/composeStop.sh b/scripts/lisk/docker/composeStop.sh new file mode 100644 index 000000000..2fa3eee97 --- /dev/null +++ b/scripts/lisk/docker/composeStop.sh @@ -0,0 +1,10 @@ +#!/bin/bash +set -eu + +. $(dirname "$0")/changeToAppInstallDir.sh + +. $(dirname "$0")/setEnvVariables.sh + +# Wait for the CI to build and push the Docker image to ECR +sleep 300 +docker compose down --rmi all diff --git a/scripts/lisk/docker/dev/changeToAppInstallDir.sh b/scripts/lisk/docker/dev/changeToAppInstallDir.sh new file mode 100644 index 000000000..63dc8629e --- /dev/null +++ b/scripts/lisk/docker/dev/changeToAppInstallDir.sh @@ -0,0 +1,8 @@ +#!/bin/bash +set -eu + +app_install_dir=$(dirname $(realpath "$0"))/../../../.. + +cd ${app_install_dir} + +echo "App install dir set to: $PWD" diff --git a/scripts/lisk/docker/dev/composeStart.sh b/scripts/lisk/docker/dev/composeStart.sh new file mode 100644 index 000000000..99fd645f3 --- /dev/null +++ b/scripts/lisk/docker/dev/composeStart.sh @@ -0,0 +1,18 @@ +#!/bin/bash +set -eu + +if [ ! -z "$(git status --untracked-files=no --porcelain)" ]; then + echo "Please stash/commit your local changes and re-run the script." + exit 1 +fi + +. $(dirname $(realpath "$0"))/changeToAppInstallDir.sh + +. scripts/lisk/docker/dev/setEnvVariables.sh + +mkdir -p $PWD/.aws +cp $HOME/.aws/credentials $PWD/.aws/ +git apply scripts/lisk/docker/dev/docker-compose-dev.patch + +aws ecr get-login-password --region ${AWS_REGION} | docker login --username AWS --password-stdin ${AWS_ECR_REGISTRY} +docker compose up --pull always --detach diff --git a/scripts/lisk/docker/dev/composeStop.sh b/scripts/lisk/docker/dev/composeStop.sh new file mode 100644 index 000000000..5b6d52655 --- /dev/null +++ b/scripts/lisk/docker/dev/composeStop.sh @@ -0,0 +1,11 @@ +#!/bin/bash +set -eu + +. $(dirname $(realpath "$0"))/changeToAppInstallDir.sh + +. scripts/lisk/docker/dev/setEnvVariables.sh + +docker compose down --rmi all + +git apply -R scripts/lisk/docker/dev/docker-compose-dev.patch +rm -rf $PWD/.aws diff --git a/scripts/lisk/docker/dev/setEnvVariables.sh b/scripts/lisk/docker/dev/setEnvVariables.sh new file mode 100644 index 000000000..67d6d0293 --- /dev/null +++ b/scripts/lisk/docker/dev/setEnvVariables.sh @@ -0,0 +1,25 @@ +#!/bin/bash +set -eu + +# Set env var from secrets +# secret_id=arn:aws:secretsmanager:eu-west-3:132202091885:secret:mainnet/lisk-across-relayer/aws-CSi7ka +secret_id=arn:aws:secretsmanager:eu-west-3:132202091885:secret:sepolia/across-relayer-dev/aws-7CIqpl +RELAYER_CONFIG=`aws --region eu-west-3 secretsmanager get-secret-value --secret-id ${secret_id} | jq --raw-output .SecretString | jq -r .` + +echo "Setting environment variables within the current shell on the host" + +export AWS_REGION=`echo $RELAYER_CONFIG | jq -r ."AWS_REGION"` + +export AWS_ECR_REGISTRY=`echo $RELAYER_CONFIG | jq -r ."AWS_ECR_REGISTRY"` + +export AWS_ECR_REPOSITORY=`echo $RELAYER_CONFIG | jq -r ."AWS_ECR_REPOSITORY"` + +export ACROSS_RELAYER_IMAGE_TAG=`echo $RELAYER_CONFIG | jq -r ."ACROSS_RELAYER_IMAGE_TAG"` + +export NETWORK=`echo $RELAYER_CONFIG | jq -r ."NETWORK"` + +export RELAYER_1_API_SERVER_HOST=`echo $RELAYER_CONFIG | jq -r ."RELAYER_1_API_SERVER_HOST"` + +export RELAYER_1_API_SERVER_PORT=`echo $RELAYER_CONFIG | jq -r ."RELAYER_1_API_SERVER_PORT"` + +echo "Finished setting all the environment variables within the current shell on the host" diff --git a/scripts/lisk/docker/mainnet/containerStartBot_1.sh b/scripts/lisk/docker/mainnet/containerStartBot_1.sh new file mode 100644 index 000000000..600bb073a --- /dev/null +++ b/scripts/lisk/docker/mainnet/containerStartBot_1.sh @@ -0,0 +1,64 @@ +#!/bin/bash +app_dir=$PWD +echo "Current DIR: $PWD" + +# Remove previous .env var if any +readonly env_file="${app_dir}/.env" +rm -f ${env_file} + +# Setting env var from secrets +secret_id=arn:aws:secretsmanager:eu-west-3:132202091885:secret:mainnet/lisk-across-relayer/aws-CSi7ka +RELAYER_CONFIG=`aws --region eu-west-3 secretsmanager get-secret-value --secret-id ${secret_id} | jq --raw-output .SecretString | jq -r .` + +AWSKMS_CONFIG=`echo $RELAYER_CONFIG | jq -r ."AWSKMS_CONFIG"` +echo "AWSKMS_CONFIG=$AWSKMS_CONFIG" >> ${env_file} + +AWS_S3_STORAGE_CONFIG=`echo $RELAYER_CONFIG | jq -r ."AWS_S3_STORAGE_CONFIG"` +echo "AWS_S3_STORAGE_CONFIG=$AWS_S3_STORAGE_CONFIG" >> ${env_file} + +RPC_PROVIDER_DRPC_1=`echo $RELAYER_CONFIG | jq -r ."RPC_PROVIDER_DRPC_1"` +echo "RPC_PROVIDER_DRPC_1=$RPC_PROVIDER_DRPC_1" >> ${env_file} + +RPC_PROVIDER_TENDERLY_1=`echo $RELAYER_CONFIG | jq -r ."RPC_PROVIDER_TENDERLY_1"` +echo "RPC_PROVIDER_TENDERLY_1=$RPC_PROVIDER_TENDERLY_1" >> ${env_file} + +RPC_PROVIDER_DRPC_1135=`echo $RELAYER_CONFIG | jq -r ."RPC_PROVIDER_DRPC_1135"` +echo "RPC_PROVIDER_DRPC_1135=$RPC_PROVIDER_DRPC_1135" >> ${env_file} + +RPC_PROVIDER_GELATO_1135=`echo $RELAYER_CONFIG | jq -r ."RPC_PROVIDER_GELATO_1135"` +echo "RPC_PROVIDER_GELATO_1135=$RPC_PROVIDER_GELATO_1135" >> ${env_file} + +SLACK_CONFIG=`echo $RELAYER_CONFIG | jq -r ."SLACK_CONFIG"` +echo "SLACK_CONFIG=$SLACK_CONFIG" >> ${env_file} + +echo "All env vars from secrets are set." + +# Set the bot identifier +echo "BOT_IDENTIFIER=LISK_ACROSS_RELAYER_1" >> ${env_file} + +# Simulation mode OFF +echo "SEND_RELAYS=true" >> ${env_file} +echo "SEND_REBALANCES=true" >> ${env_file} + +# RPC provider configuration +echo "RPC_PROVIDERS=DRPC,GELATO,TENDERLY" >> ${env_file} +echo "RPC_PROVIDERS_1=DRPC,TENDERLY" >> ${env_file} +echo "RPC_PROVIDERS_1135=GELATO,DRPC" >> ${env_file} + +# Mainnet settings +echo "RELAYER_ORIGIN_CHAINS=[1,1135]" >> ${env_file} +echo "RELAYER_DESTINATION_CHAINS=[1,1135]" >> ${env_file} +echo "MIN_RELAYER_FEE_PCT=0.00005" >> ${env_file} + +# Fee settings +echo "PRIORITY_FEE_SCALER_1=0.8" >> ${env_file} +echo "RELAYER_GAS_PADDING=0" >> ${env_file} + +# Supported token settings +echo RELAYER_TOKENS=\'[\"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2\", \"0x6033F7f88332B8db6ad452B7C6D5bB643990aE3f\", \"0xdAC17F958D2ee523a2206206994597C13D831ec7\"]\' >> ${env_file} +echo MIN_DEPOSIT_CONFIRMATIONS=\'{\"5000\": { \"1\": 5, \"1135\": 10 }, \"2000\": { \"1\": 4, \"1135\": 10 }, \"100\": { \"1\": 3, \"1135\": 10 } }\' >> ${env_file} +echo RELAYER_EXTERNAL_INVENTORY_CONFIG=\'config/mainnet/relayerExternalInventory.json\' >> ${env_file} + +echo "All env vars are set." + +node ${app_dir}/dist/index.js --relayer --wallet awskms --keys relayerKey diff --git a/scripts/lisk/docker/sepolia/containerStartBot_1.sh b/scripts/lisk/docker/sepolia/containerStartBot_1.sh new file mode 100644 index 000000000..e85ab8683 --- /dev/null +++ b/scripts/lisk/docker/sepolia/containerStartBot_1.sh @@ -0,0 +1,64 @@ +#!/bin/bash +app_dir=$PWD +echo "Current DIR: $PWD" + +# Remove previous .env var if any +readonly env_file="${app_dir}/.env" +rm -f ${env_file} + +# Setting env var from secrets +secret_id=arn:aws:secretsmanager:eu-west-3:132202091885:secret:sepolia/across-relayer-dev/aws-7CIqpl +RELAYER_CONFIG=`aws --region eu-west-3 secretsmanager get-secret-value --secret-id ${secret_id} | jq --raw-output .SecretString | jq -r .` + +AWSKMS_CONFIG=`echo $RELAYER_CONFIG | jq -r ."AWSKMS_CONFIG"` +echo "AWSKMS_CONFIG=$AWSKMS_CONFIG" >> ${env_file} + +AWS_S3_STORAGE_CONFIG=`echo $RELAYER_CONFIG | jq -r ."AWS_S3_STORAGE_CONFIG"` +echo "AWS_S3_STORAGE_CONFIG=$AWS_S3_STORAGE_CONFIG" >> ${env_file} + +RPC_PROVIDER_DRPC_11155111=`echo $RELAYER_CONFIG | jq -r ."RPC_PROVIDER_DRPC_11155111"` +echo "RPC_PROVIDER_DRPC_11155111=$RPC_PROVIDER_DRPC_11155111" >> ${env_file} + +RPC_PROVIDER_TENDERLY_11155111=`echo $RELAYER_CONFIG | jq -r ."RPC_PROVIDER_TENDERLY_11155111"` +echo "RPC_PROVIDER_TENDERLY_11155111=$RPC_PROVIDER_TENDERLY_11155111" >> ${env_file} + +RPC_PROVIDER_DRPC_4202=`echo $RELAYER_CONFIG | jq -r ."RPC_PROVIDER_DRPC_4202"` +echo "RPC_PROVIDER_DRPC_4202=$RPC_PROVIDER_DRPC_4202" >> ${env_file} + +RPC_PROVIDER_GELATO_4202=`echo $RELAYER_CONFIG | jq -r ."RPC_PROVIDER_GELATO_4202"` +echo "RPC_PROVIDER_GELATO_4202=$RPC_PROVIDER_GELATO_4202" >> ${env_file} + +HUB_CHAIN_ID=`echo $RELAYER_CONFIG | jq -r ."HUB_CHAIN_ID"` +echo "HUB_CHAIN_ID=$HUB_CHAIN_ID" >> ${env_file} + +echo "All env vars from secrets are set." + +# Set the bot identifier +echo "BOT_IDENTIFIER=LISK_ACROSS_RELAYER_SEPOLIA" >> ${env_file} + +# Simulation mode ON +echo "SEND_RELAYS=false" >> ${env_file} +echo "SEND_REBALANCES=false" >> ${env_file} + +# RPC provider configuration +echo "RPC_PROVIDERS=DRPC,GELATO,TENDERLY" >> ${env_file} +echo "RPC_PROVIDERS_11155111=DRPC,TENDERLY" >> ${env_file} +echo "RPC_PROVIDERS_4202=GELATO,DRPC" >> ${env_file} + +# Testnet settings +echo "RELAYER_ORIGIN_CHAINS=[11155111,4202]" >> ${env_file} +echo "RELAYER_DESTINATION_CHAINS=[11155111,4202]" >> ${env_file} +echo "MIN_RELAYER_FEE_PCT=0.00005" >> ${env_file} + +# Fee settings +echo "PRIORITY_FEE_SCALER_11155111=0.8" >> ${env_file} +echo "RELAYER_GAS_PADDING=0" >> ${env_file} + +# Supported token settings +echo RELAYER_TOKENS=\'[\"0x16B840bA01e2b05fc2268eAf6d18892a11EC29D6\", \"0xaA8E23Fb1079EA71e0a56F48a2aA51851D8433D0\", \"0xfFf9976782d46CC05630D1f6eBAb18b2324d6B14\"]\' >> ${env_file} +echo MIN_DEPOSIT_CONFIRMATIONS=\'{ \"1000000\": { \"919\": 1, \"4202\": 1, \"80002\": 1, \"84532\": 1, \"421614\": 1, \"11155111\": 1, \"11155420\": 1 } }\' >> ${env_file} +echo RELAYER_EXTERNAL_INVENTORY_CONFIG=\'/home/lisk/across-relayer/config/sepolia/relayerExternalInventory.json\' >> ${env_file} + +echo "All env vars are set." + +node ${app_dir}/dist/index.js --relayer --wallet awskms --keys relayerKey diff --git a/scripts/lisk/docker/setEnvVariables.sh b/scripts/lisk/docker/setEnvVariables.sh new file mode 100644 index 000000000..05d7bb4a2 --- /dev/null +++ b/scripts/lisk/docker/setEnvVariables.sh @@ -0,0 +1,25 @@ +#!/bin/bash +set -eu + +# Set env var from secrets +secret_id=arn:aws:secretsmanager:eu-west-3:132202091885:secret:mainnet/lisk-across-relayer/aws-CSi7ka +# secret_id=arn:aws:secretsmanager:eu-west-3:132202091885:secret:sepolia/across-relayer-dev/aws-7CIqpl +RELAYER_CONFIG=`aws --region eu-west-3 secretsmanager get-secret-value --secret-id ${secret_id} | jq --raw-output .SecretString | jq -r .` + +echo "Setting environment variables within the current shell on the host" + +export AWS_REGION=`echo $RELAYER_CONFIG | jq -r ."AWS_REGION"` + +export AWS_ECR_REGISTRY=`echo $RELAYER_CONFIG | jq -r ."AWS_ECR_REGISTRY"` + +export AWS_ECR_REPOSITORY=`echo $RELAYER_CONFIG | jq -r ."AWS_ECR_REPOSITORY"` + +export ACROSS_RELAYER_IMAGE_TAG=`echo $RELAYER_CONFIG | jq -r ."ACROSS_RELAYER_IMAGE_TAG"` + +export NETWORK=`echo $RELAYER_CONFIG | jq -r ."NETWORK"` + +export RELAYER_1_API_SERVER_HOST=`echo $RELAYER_CONFIG | jq -r ."RELAYER_1_API_SERVER_HOST"` + +export RELAYER_1_API_SERVER_PORT=`echo $RELAYER_CONFIG | jq -r ."RELAYER_1_API_SERVER_PORT"` + +echo "Finished setting all the environment variables within the current shell on the host" diff --git a/scripts/installApplication.sh b/scripts/lisk/installApplication.sh similarity index 100% rename from scripts/installApplication.sh rename to scripts/lisk/installApplication.sh diff --git a/scripts/installDependencies.sh b/scripts/lisk/installDependencies.sh similarity index 100% rename from scripts/installDependencies.sh rename to scripts/lisk/installDependencies.sh diff --git a/scripts/runMainnet.sh b/scripts/lisk/runMainnet.sh similarity index 100% rename from scripts/runMainnet.sh rename to scripts/lisk/runMainnet.sh diff --git a/scripts/runSepolia.sh b/scripts/lisk/runSepolia.sh similarity index 100% rename from scripts/runSepolia.sh rename to scripts/lisk/runSepolia.sh diff --git a/scripts/runSepoliaSimulationMode.sh b/scripts/lisk/runSepoliaSimulationMode.sh similarity index 100% rename from scripts/runSepoliaSimulationMode.sh rename to scripts/lisk/runSepoliaSimulationMode.sh