From 48b6bb9957b02d7407efd8d52851d9fcdcdf59cf Mon Sep 17 00:00:00 2001 From: Guillermo Perez Date: Wed, 28 Aug 2024 12:48:32 +0200 Subject: [PATCH 1/3] Cleanup Github actions. Deprecate Netlify --- .github/workflows/e2e-tests.yml | 45 ----- .github/workflows/onboard-api-staging.yml | 63 ------- .github/workflows/onboard-api.yml | 65 ------- .github/workflows/root.yml | 31 ---- .../workflows/tinlake-ui-deploy-to-dev.yml | 160 ------------------ .../workflows/tinlake-ui-deploy-to-prod.yml | 81 --------- .../tinlake-ui-deploy-to-staging.yml | 156 ----------------- .github/workflows/tinlake-ui-pull-request.yml | 93 +--------- 8 files changed, 3 insertions(+), 691 deletions(-) delete mode 100644 .github/workflows/e2e-tests.yml delete mode 100644 .github/workflows/onboard-api-staging.yml delete mode 100644 .github/workflows/onboard-api.yml delete mode 100644 .github/workflows/root.yml delete mode 100644 .github/workflows/tinlake-ui-deploy-to-dev.yml delete mode 100644 .github/workflows/tinlake-ui-deploy-to-prod.yml delete mode 100644 .github/workflows/tinlake-ui-deploy-to-staging.yml diff --git a/.github/workflows/e2e-tests.yml b/.github/workflows/e2e-tests.yml deleted file mode 100644 index ae35f35d9..000000000 --- a/.github/workflows/e2e-tests.yml +++ /dev/null @@ -1,45 +0,0 @@ -# name: 'e2e-tests' - -# this 'on' is only to avoid the annoying failure + email from github -# a github action needs a trigger. This will unlikely ever be triggered as is -on: - push: - branches: - - non-existent-branch-with-long-name -jobs: - test: - if: false - steps: - - run: echo "I shouldn't happen" -# on: -# push: -# branches: -# - main -# pull_request: -# paths: -# - 'e2e-tests/**' -# - 'tinlake-ui/**' - -# jobs: -# test: -# runs-on: ubuntu-latest - -# steps: -# - uses: actions/checkout@v2 -# - name: Docker build -# run: DOCKER_BUILDKIT=1 docker build -t tinlake-e2e-tests -f e2e-tests/docker/Dockerfile . -# - name: Docker run -# run: docker run -e GATEWAY_URL -e TINLAKE_URL -e RPC_URL -e ETH_ADMIN_ADDRESS -e ETH_ADMIN_PRIVATE_KEY -e ETH_BORROWER_ADDRESS -e ETH_BORROWER_PRIVATE_KEY -e POOL_ID -e NFT_REGISTRY -e CI -e CUCUMBER_PUBLISH_TOKEN tinlake-e2e-tests - -# env: -# GATEWAY_URL: "https://gateway.amber.centrifuge.io/" -# TINLAKE_URL: "https://kovan.staging.tinlake.centrifuge.io/" -# RPC_URL: "https://kovan.infura.io/v3/a4ba76cd4be643618572e7467a444e3a" -# ETH_ADMIN_ADDRESS: ${{ secrets.ETH_ADMIN_ADDRESS }} -# ETH_ADMIN_PRIVATE_KEY: ${{ secrets.ETH_ADMIN_PRIVATE_KEY }} -# ETH_BORROWER_ADDRESS: ${{ secrets.ETH_BORROWER_ADDRESS }} -# ETH_BORROWER_PRIVATE_KEY: ${{ secrets.ETH_BORROWER_PRIVATE_KEY }} -# POOL_ID: "0xc4084221Fb5D0f28f817c795435C2d17EAb6c389" -# NFT_REGISTRY: "0xaC0c1EF395290288028A0a9FDFc8FDebEbE54a24x" -# CI: true -# CUCUMBER_PUBLISH_TOKEN: ${{ secrets.CUCUMBER_PUBLISH_TOKEN }} diff --git a/.github/workflows/onboard-api-staging.yml b/.github/workflows/onboard-api-staging.yml deleted file mode 100644 index 448175019..000000000 --- a/.github/workflows/onboard-api-staging.yml +++ /dev/null @@ -1,63 +0,0 @@ -name: 'onboarding-api-staging' -on: - pull_request: - paths: - - 'onboarding-api/**' - - '.github/workflows/onboard-api-staging.yml' - -jobs: - build: - runs-on: ubuntu-latest - - steps: - # Setup - - uses: actions/checkout@v2 - - uses: actions/setup-node@v2-beta - with: - node-version: '12' - - # Cache - - name: Get yarn cache directory path - id: yarn-cache-dir-path - run: echo "::set-output name=dir::$(yarn config get cacheFolder)" - - - uses: actions/cache@v2 - id: yarn-cache - with: - path: ${{ steps.yarn-cache-dir-path.outputs.dir }} - key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }} - restore-keys: | - ${{ runner.os }}-yarn- - - run: yarn install - # Build - - run: yarn run build - working-directory: ./onboarding-api - - push: - runs-on: ubuntu-latest - needs: build - # if: github.ref == 'refs/heads/main' - - steps: - - name: Checkout - uses: actions/checkout@v2 - - name: Set up QEMU - uses: docker/setup-qemu-action@v1 - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v1 - - name: Login to DockerHub - uses: docker/login-action@v1 - with: - username: ${{ secrets.DOCKERHUB_USERNAME }} - password: ${{ secrets.DOCKERHUB_TOKEN }} - - name: Get image tag - id: tag - run: echo "::set-output name=TAG_NAME::$(echo "$(git rev-parse --abbrev-ref HEAD)-$(date +'%Y%m%d%H%M%S')-$(git rev-parse --short HEAD)")" - - name: Build and push - uses: docker/build-push-action@v2 - with: - context: . - file: ./onboarding-api/docker/Dockerfile - push: true - tags: centrifugeio/onboard-api:dev - # tags: centrifugeio/onboard-api:${{ steps.tag.outputs.TAG_NAME }} diff --git a/.github/workflows/onboard-api.yml b/.github/workflows/onboard-api.yml deleted file mode 100644 index 04d7eb229..000000000 --- a/.github/workflows/onboard-api.yml +++ /dev/null @@ -1,65 +0,0 @@ -name: 'onboarding-api' -on: - push: - branches: - - main - pull_request: - paths: - - 'onboarding-api/**' - -jobs: - build: - runs-on: ubuntu-latest - - steps: - # Setup - - uses: actions/checkout@v2 - - uses: actions/setup-node@v2-beta - with: - node-version: '12' - - # Cache - - name: Get yarn cache directory path - id: yarn-cache-dir-path - run: echo "::set-output name=dir::$(yarn config get cacheFolder)" - - - uses: actions/cache@v2 - id: yarn-cache - with: - path: ${{ steps.yarn-cache-dir-path.outputs.dir }} - key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }} - restore-keys: | - ${{ runner.os }}-yarn- - - run: yarn install - # Build - - run: yarn run build - working-directory: ./onboarding-api - - push: - runs-on: ubuntu-latest - needs: build - if: github.ref == 'refs/heads/main' - - steps: - - name: Checkout - uses: actions/checkout@v2 - - name: Set up QEMU - uses: docker/setup-qemu-action@v1 - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v1 - - name: Login to DockerHub - uses: docker/login-action@v1 - with: - username: ${{ secrets.DOCKERHUB_USERNAME }} - password: ${{ secrets.DOCKERHUB_TOKEN }} - - name: Get image tag - id: tag - run: echo "::set-output name=TAG_NAME::$(echo "$(git rev-parse --abbrev-ref HEAD)-$(date +'%Y%m%d%H%M%S')-$(git rev-parse --short HEAD)")" - - name: Build and push - uses: docker/build-push-action@v2 - with: - context: . - file: ./onboarding-api/docker/Dockerfile - push: true - tags: centrifugeio/onboard-api:latest - # tags: centrifugeio/onboard-api:${{ steps.tag.outputs.TAG_NAME }} diff --git a/.github/workflows/root.yml b/.github/workflows/root.yml deleted file mode 100644 index 771d55d3b..000000000 --- a/.github/workflows/root.yml +++ /dev/null @@ -1,31 +0,0 @@ -name: '.' -on: - pull_request - -jobs: - check-format: - runs-on: ubuntu-latest - - steps: - # Setup - - uses: actions/checkout@v2 - - uses: actions/setup-node@v2-beta - with: - node-version: '12' - - # Cache - - name: Get yarn cache directory path - id: yarn-cache-dir-path - run: echo "::set-output name=dir::$(yarn config get cacheFolder)" - - - uses: actions/cache@v2 - id: yarn-cache - with: - path: ${{ steps.yarn-cache-dir-path.outputs.dir }} - key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }} - restore-keys: | - ${{ runner.os }}-yarn- - - run: yarn install - - # Check formatting - - run: yarn format:check diff --git a/.github/workflows/tinlake-ui-deploy-to-dev.yml b/.github/workflows/tinlake-ui-deploy-to-dev.yml deleted file mode 100644 index c23c2b6a9..000000000 --- a/.github/workflows/tinlake-ui-deploy-to-dev.yml +++ /dev/null @@ -1,160 +0,0 @@ -name: 'tinlake-ui Deploy to Dev' -on: - push: - branches: - - main - paths: - - 'tinlake-ui/**' - - 'tinlake.js/**' - - '.github/workflows/tinlake-ui-deploy-to-dev.yml' - -jobs: - build-and-deploy-to-goerli: - runs-on: ubuntu-latest - - defaults: - run: - working-directory: tinlake-ui - - steps: - - name: Checkout - uses: actions/checkout@v2 - - - name: Setup Node - uses: actions/setup-node@v2 - with: - node-version: '12' - - - name: Get Yarn Cache Directory Path - id: yarn-cache-dir-path - run: echo "::set-output name=dir::$(yarn config get cacheFolder)" - - - name: Cache Yarn Dependencies - uses: actions/cache@v2 - with: - path: ${{ steps.yarn-cache-dir-path.outputs.dir }} - key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }} - restore-keys: | - ${{ runner.os }}-yarn- - - - name: Install Dependencies - run: yarn install - - - name: Cache Next.js Bundle - uses: actions/cache@v2 - with: - path: ${{ github.workspace }}/tinlake-ui/.next/cache - key: ${{ runner.os }}-nextjs-${{ hashFiles('**/yarn.lock') }} - - - name: Lint - run: yarn lint - - - name: Build - run: yarn export - env: - NEXT_PUBLIC_CENTRIFUGE_CHAIN_URL: 'wss://fullnode.catalyst.cntrfg.com' - NEXT_PUBLIC_CLAIM_CFG_CONTRACT_ADDRESS: '0x297237e17F327f8e5C8dEd78b15761A7D513353b' - NEXT_PUBLIC_ENV: 'demo' - NEXT_PUBLIC_ETHERSCAN_URL: 'https://goerli.etherscan.io' - NEXT_PUBLIC_FEATURE_FLAG_NEW_ONBOARDING: '0x5ca22a7cD0911c0b8279faEC3F3273AE94692E34,0xdA709C17ac67fA92d6cF6E92370809694fa9714a' - NEXT_PUBLIC_ONFINALITY_KEY: 0e1c049f-d876-4e77-a45f-b5afdf5739b2 - NEXT_PUBLIC_IPFS_GATEWAY: 'https://cloudflare-ipfs.com/ipfs/' - NEXT_PUBLIC_MULTICALL_CONTRACT_ADDRESS: '0x5BA1e12693Dc8F9c48aAD8770482f4739bEeD696' - NEXT_PUBLIC_ONBOARD_API_HOST: 'https://onboard-api.catalyst.cntrfg.com/' - NEXT_PUBLIC_RWA_MARKET_ONBOARD_RETURN_URL: 'https://dev.rwamarket.io' - NEXT_PUBLIC_POOL_REGISTRY: '0x46A01532De22Baa1DFDB58b5bB62845667146E5c' - NEXT_PUBLIC_POOLS_CONFIG: 'goerliStaging' - NEXT_PUBLIC_POOLS_IPFS_HASH_OVERRIDE: 'QmdUg4VgLQg6uDBHxPjiMXoawgPM3LpBzuZr3ejCQTkuet' - NEXT_PUBLIC_PORTIS_KEY: 'bc9e2922-2ebd-4e2b-86f6-7c7855bdf07f' - NEXT_PUBLIC_REWARDS_TREE_URL: 'https://storage.googleapis.com/rad-rewards-trees-kovan-staging/latest.json' - NEXT_PUBLIC_RPC_URL: 'https://eth-goerli.api.onfinality.io/rpc?apikey=0e1c049f-d876-4e77-a45f-b5afdf5739b2' - NEXT_PUBLIC_TINLAKE_DATA_BACKEND_URL: 'https://api.thegraph.com/subgraphs/name/offerijns/tinlake-goerli' - NEXT_PUBLIC_TRANSACTION_TIMEOUT: '3600' - - - name: Deploy To Netlify - uses: nwtgck/actions-netlify@v1.2.4 - with: - deploy-message: ${{ github.event.head_commit.message }} - enable-commit-comment: false - github-token: ${{ secrets.GITHUB_TOKEN }} - netlify-config-path: ./tinlake-ui/netlify.toml - production-deploy: true - publish-dir: ./tinlake-ui/out - env: - NETLIFY_AUTH_TOKEN: ${{ secrets.NETLIFY_AUTH_TOKEN }} - NETLIFY_SITE_ID: ${{ secrets.TINLAKE_UI_GOERLI_DEV_NETLIFY_SITE_ID }} - - build-and-deploy-to-mainnet: - runs-on: ubuntu-latest - - defaults: - run: - working-directory: tinlake-ui - - steps: - - name: Checkout - uses: actions/checkout@v2 - - - name: Setup Node - uses: actions/setup-node@v2 - with: - node-version: '12' - - - name: Get Yarn Cache Directory Path - id: yarn-cache-dir-path - run: echo "::set-output name=dir::$(yarn config get cacheFolder)" - - - name: Cache Yarn Dependencies - uses: actions/cache@v2 - with: - path: ${{ steps.yarn-cache-dir-path.outputs.dir }} - key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }} - restore-keys: | - ${{ runner.os }}-yarn- - - - name: Install Dependencies - run: yarn install - - - name: Cache Next.js Bundle - uses: actions/cache@v2 - with: - path: ${{ github.workspace }}/tinlake-ui/.next/cache - key: ${{ runner.os }}-nextjs-${{ hashFiles('**/yarn.lock') }} - - - name: Lint - run: yarn lint - - - name: Build - run: yarn export - env: - NEXT_PUBLIC_CENTRIFUGE_CHAIN_URL: 'wss://fullnode.parachain.centrifuge.io' - NEXT_PUBLIC_CLAIM_CFG_CONTRACT_ADDRESS: '0x1cA3B2E7FfCAF83d9228a64e4726402B1d5CC054' - NEXT_PUBLIC_ENV: 'PROD' - NEXT_PUBLIC_ETHERSCAN_URL: 'https://etherscan.io' - NEXT_PUBLIC_FEATURE_FLAG_NEW_ONBOARDING: '0x4B6CA198d257D755A5275648D471FE09931b764A,0xdB3bC9fB1893222d266762e9fF857EB74D75c7D6,0xfc2950dD337ca8496C18dfc0256Fb905A7E7E5c6,0x53b2d22d07E069a3b132BfeaaD275b10273d381E,0x0CED6166873038Ac0cc688e7E6d19E2cBE251Bf0,0x4cA805cE8EcE2E63FfC1F9f8F2731D3F48DF89Df,0x82B8617A16e388256617FeBBa1826093401a3fE5,0x560Ac248ce28972083B718778EEb0dbC2DE55740,0x3d167bd08f762FD391694c67B5e6aF0868c45538,0x3B03863BD553C4CE07eABF2278016533451c9101,0x09e43329552c9D81cF205Fd5f44796fBC40c822e,0xF96F18F2c70b57Ec864cC0C8b828450b82Ff63e3,0xd8486C565098360A24f858088a6D29a380dDF7ec' - NEXT_PUBLIC_ALCHEMY_KEY: lobQdgMiovZ4jK7rj8sFco32GKUeqUBi - NEXT_PUBLIC_IPFS_GATEWAY: 'https://cloudflare-ipfs.com/ipfs/' - NEXT_PUBLIC_MULTICALL_CONTRACT_ADDRESS: '0xeefba1e63905ef1d7acba5a8513c70307c1ce441' - NEXT_PUBLIC_ONBOARD_API_HOST: 'https://onboard-api.catalyst.cntrfg.com/' - NEXT_PUBLIC_RWA_MARKET_ONBOARD_RETURN_URL: 'https://rwamarket.io' - NEXT_PUBLIC_POOL_REGISTRY: '0xddf1c516cf87126c6c610b52fd8d609e67fb6033' - NEXT_PUBLIC_POOLS_CONFIG: 'mainnetProduction' - NEXT_PUBLIC_POOLS_IPFS_HASH_OVERRIDE: 'QmaMA1VYSKuuYhBcQCyf5Ek4VoiiEG6oLGp3iGbsQPGpkS' - NEXT_PUBLIC_PORTIS_KEY: 'bc9e2922-2ebd-4e2b-86f6-7c7855bdf07f' - NEXT_PUBLIC_REWARDS_TREE_URL: 'https://storage.googleapis.com/rad-rewards-trees-mainnet-production/latest.json' - NEXT_PUBLIC_RPC_URL: 'https://eth-mainnet.g.alchemy.com/v2/lobQdgMiovZ4jK7rj8sFco32GKUeqUBi' - NEXT_PUBLIC_TINLAKE_DATA_BACKEND_URL: 'https://api.goldsky.com/api/public/project_clhi43ef5g4rw49zwftsvd2ks/subgraphs/main/prod/gn' - NEXT_PUBLIC_TRANSACTION_TIMEOUT: '3600' - - - name: Deploy To Netlify - uses: nwtgck/actions-netlify@v1.2.4 - with: - deploy-message: ${{ github.event.head_commit.message }} - enable-commit-comment: false - github-token: ${{ secrets.GITHUB_TOKEN }} - netlify-config-path: ./tinlake-ui/netlify.toml - production-deploy: true - publish-dir: ./tinlake-ui/out - env: - NETLIFY_AUTH_TOKEN: ${{ secrets.NETLIFY_AUTH_TOKEN }} - NETLIFY_SITE_ID: ${{ secrets.TINLAKE_UI_MAINNET_DEV_NETLIFY_SITE_ID }} diff --git a/.github/workflows/tinlake-ui-deploy-to-prod.yml b/.github/workflows/tinlake-ui-deploy-to-prod.yml deleted file mode 100644 index 267f17910..000000000 --- a/.github/workflows/tinlake-ui-deploy-to-prod.yml +++ /dev/null @@ -1,81 +0,0 @@ -name: 'tinlake-ui Deploy to Prod' -on: - push: - tags: - - tinlake-ui/release-* - -jobs: - build-and-deploy: - runs-on: ubuntu-latest - - defaults: - run: - working-directory: tinlake-ui - - steps: - - name: Checkout - uses: actions/checkout@v2 - - - name: Setup Node - uses: actions/setup-node@v2 - with: - node-version: '12' - - - name: Get Yarn Cache Directory Path - id: yarn-cache-dir-path - run: echo "::set-output name=dir::$(yarn config get cacheFolder)" - - - name: Cache Yarn Dependencies - uses: actions/cache@v2 - with: - path: ${{ steps.yarn-cache-dir-path.outputs.dir }} - key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }} - restore-keys: | - ${{ runner.os }}-yarn- - - - name: Install Dependencies - run: yarn install - - - name: Cache Next.js Bundle - uses: actions/cache@v2 - with: - path: ${{ github.workspace }}/tinlake-ui/.next/cache - key: ${{ runner.os }}-nextjs-${{ hashFiles('**/yarn.lock') }} - - - name: Lint - run: yarn lint - - - name: Build - run: yarn export - env: - NEXT_PUBLIC_CENTRIFUGE_CHAIN_URL: 'wss://fullnode.parachain.centrifuge.io' - NEXT_PUBLIC_CLAIM_CFG_CONTRACT_ADDRESS: '0x1cA3B2E7FfCAF83d9228a64e4726402B1d5CC054' - NEXT_PUBLIC_ENV: 'PROD' - NEXT_PUBLIC_ETHERSCAN_URL: 'https://etherscan.io' - NEXT_PUBLIC_FEATURE_FLAG_NEW_ONBOARDING: '0x4B6CA198d257D755A5275648D471FE09931b764A,0xdB3bC9fB1893222d266762e9fF857EB74D75c7D6,0xfc2950dD337ca8496C18dfc0256Fb905A7E7E5c6,0x53b2d22d07E069a3b132BfeaaD275b10273d381E,0x0CED6166873038Ac0cc688e7E6d19E2cBE251Bf0,0x4cA805cE8EcE2E63FfC1F9f8F2731D3F48DF89Df,0x82B8617A16e388256617FeBBa1826093401a3fE5,0x560Ac248ce28972083B718778EEb0dbC2DE55740,0x3d167bd08f762FD391694c67B5e6aF0868c45538,0x3B03863BD553C4CE07eABF2278016533451c9101,0x09e43329552c9D81cF205Fd5f44796fBC40c822e,0xF96F18F2c70b57Ec864cC0C8b828450b82Ff63e3,0xd8486C565098360A24f858088a6D29a380dDF7ec' - NEXT_PUBLIC_ALCHEMY_KEY: lobQdgMiovZ4jK7rj8sFco32GKUeqUBi - NEXT_PUBLIC_IPFS_GATEWAY: 'https://cloudflare-ipfs.com/ipfs/' - NEXT_PUBLIC_MULTICALL_CONTRACT_ADDRESS: '0xeefba1e63905ef1d7acba5a8513c70307c1ce441' - NEXT_PUBLIC_ONBOARD_API_HOST: 'https://onboard-api.centrifuge.io/' - NEXT_PUBLIC_RWA_MARKET_ONBOARD_RETURN_URL: 'https://rwamarket.io' - NEXT_PUBLIC_POOL_REGISTRY: '0xddf1c516cf87126c6c610b52fd8d609e67fb6033' - NEXT_PUBLIC_POOLS_CONFIG: 'mainnetProduction' - NEXT_PUBLIC_POOLS_IPFS_HASH_OVERRIDE: 'QmaMA1VYSKuuYhBcQCyf5Ek4VoiiEG6oLGp3iGbsQPGpkS' - NEXT_PUBLIC_PORTIS_KEY: 'bc9e2922-2ebd-4e2b-86f6-7c7855bdf07f' - NEXT_PUBLIC_REWARDS_TREE_URL: 'https://storage.googleapis.com/rad-rewards-trees-mainnet-production/latest.json' - NEXT_PUBLIC_RPC_URL: 'https://eth-mainnet.g.alchemy.com/v2/lobQdgMiovZ4jK7rj8sFco32GKUeqUBi' - NEXT_PUBLIC_TINLAKE_DATA_BACKEND_URL: 'https://api.goldsky.com/api/public/project_clhi43ef5g4rw49zwftsvd2ks/subgraphs/main/prod/gn' - NEXT_PUBLIC_TRANSACTION_TIMEOUT: '3600' - - - name: Deploy To Netlify - uses: nwtgck/actions-netlify@v2.0.0 - with: - deploy-message: ${{ github.event.head_commit.message }} - enable-commit-comment: false - github-token: ${{ secrets.GITHUB_TOKEN }} - netlify-config-path: ./tinlake-ui/netlify.toml - production-deploy: true - publish-dir: ./tinlake-ui/out - env: - NETLIFY_AUTH_TOKEN: ${{ secrets.NETLIFY_AUTH_TOKEN }} - NETLIFY_SITE_ID: ${{ secrets.TINLAKE_UI_PROD_NETLIFY_SITE_ID }} diff --git a/.github/workflows/tinlake-ui-deploy-to-staging.yml b/.github/workflows/tinlake-ui-deploy-to-staging.yml deleted file mode 100644 index 084237027..000000000 --- a/.github/workflows/tinlake-ui-deploy-to-staging.yml +++ /dev/null @@ -1,156 +0,0 @@ -name: 'tinlake-ui Deploy to Staging' -on: - push: - branches: - - rc/tinlake-ui/release-* - -jobs: - build-and-deploy-to-goerli: - runs-on: ubuntu-latest - - defaults: - run: - working-directory: tinlake-ui - - steps: - - name: Checkout - uses: actions/checkout@v2 - - - name: Setup Node - uses: actions/setup-node@v2 - with: - node-version: '12' - - - name: Get Yarn Cache Directory Path - id: yarn-cache-dir-path - run: echo "::set-output name=dir::$(yarn config get cacheFolder)" - - - name: Cache Yarn Dependencies - uses: actions/cache@v2 - with: - path: ${{ steps.yarn-cache-dir-path.outputs.dir }} - key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }} - restore-keys: | - ${{ runner.os }}-yarn- - - - name: Install Dependencies - run: yarn install - - - name: Cache Next.js Bundle - uses: actions/cache@v2 - with: - path: ${{ github.workspace }}/tinlake-ui/.next/cache - key: ${{ runner.os }}-nextjs-${{ hashFiles('**/yarn.lock') }} - - - name: Lint - run: yarn lint - - - name: Build - run: yarn export - env: - NEXT_PUBLIC_CENTRIFUGE_CHAIN_URL: 'wss://fullnode.catalyst.cntrfg.com' - NEXT_PUBLIC_CLAIM_CFG_CONTRACT_ADDRESS: '0x297237e17F327f8e5C8dEd78b15761A7D513353b' - NEXT_PUBLIC_ENV: 'demo' - NEXT_PUBLIC_ETHERSCAN_URL: 'https://goerli.etherscan.io' - NEXT_PUBLIC_FEATURE_FLAG_NEW_ONBOARDING: '0x5ca22a7cD0911c0b8279faEC3F3273AE94692E34,0xdA709C17ac67fA92d6cF6E92370809694fa9714a' - NEXT_PUBLIC_ONFINALITY_KEY: 0e1c049f-d876-4e77-a45f-b5afdf5739b2 - NEXT_PUBLIC_IPFS_GATEWAY: 'https://cloudflare-ipfs.com/ipfs/' - NEXT_PUBLIC_MULTICALL_CONTRACT_ADDRESS: '0x5BA1e12693Dc8F9c48aAD8770482f4739bEeD696' - NEXT_PUBLIC_ONBOARD_API_HOST: 'https://onboard-api.catalyst.cntrfg.com/' - NEXT_PUBLIC_RWA_MARKET_ONBOARD_RETURN_URL: 'https://dev.rwamarket.io' - NEXT_PUBLIC_POOL_REGISTRY: '0x46A01532De22Baa1DFDB58b5bB62845667146E5c' - NEXT_PUBLIC_POOLS_CONFIG: 'goerliStaging' - NEXT_PUBLIC_POOLS_IPFS_HASH_OVERRIDE: 'QmdUg4VgLQg6uDBHxPjiMXoawgPM3LpBzuZr3ejCQTkuet' - NEXT_PUBLIC_PORTIS_KEY: 'bc9e2922-2ebd-4e2b-86f6-7c7855bdf07f' - NEXT_PUBLIC_REWARDS_TREE_URL: 'https://storage.googleapis.com/rad-rewards-trees-kovan-staging/latest.json' - NEXT_PUBLIC_RPC_URL: 'https://eth-goerli.api.onfinality.io/rpc?apikey=0e1c049f-d876-4e77-a45f-b5afdf5739b2' - NEXT_PUBLIC_TINLAKE_DATA_BACKEND_URL: 'https://api.thegraph.com/subgraphs/name/offerijns/tinlake-goerli' - NEXT_PUBLIC_TRANSACTION_TIMEOUT: '3600' - - - name: Deploy To Netlify - uses: nwtgck/actions-netlify@v1.2.4 - with: - deploy-message: ${{ github.event.head_commit.message }} - enable-commit-comment: false - github-token: ${{ secrets.GITHUB_TOKEN }} - netlify-config-path: ./tinlake-ui/netlify.toml - production-deploy: true - publish-dir: ./tinlake-ui/out - env: - NETLIFY_AUTH_TOKEN: ${{ secrets.NETLIFY_AUTH_TOKEN }} - NETLIFY_SITE_ID: ${{ secrets.TINLAKE_UI_GOERLI_STAGING_NETLIFY_SITE_ID }} - - build-and-deploy-to-mainnet: - runs-on: ubuntu-latest - - defaults: - run: - working-directory: tinlake-ui - - steps: - - name: Checkout - uses: actions/checkout@v2 - - - name: Setup Node - uses: actions/setup-node@v2 - with: - node-version: '12' - - - name: Get Yarn Cache Directory Path - id: yarn-cache-dir-path - run: echo "::set-output name=dir::$(yarn config get cacheFolder)" - - - name: Cache Yarn Dependencies - uses: actions/cache@v2 - with: - path: ${{ steps.yarn-cache-dir-path.outputs.dir }} - key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }} - restore-keys: | - ${{ runner.os }}-yarn- - - - name: Install Dependencies - run: yarn install - - - name: Cache Next.js Bundle - uses: actions/cache@v2 - with: - path: ${{ github.workspace }}/tinlake-ui/.next/cache - key: ${{ runner.os }}-nextjs-${{ hashFiles('**/yarn.lock') }} - - - name: Lint - run: yarn lint - - - name: Build - run: yarn export - env: - NEXT_PUBLIC_CENTRIFUGE_CHAIN_URL: 'wss://fullnode.parachain.centrifuge.io' - NEXT_PUBLIC_CLAIM_CFG_CONTRACT_ADDRESS: '0x1cA3B2E7FfCAF83d9228a64e4726402B1d5CC054' - NEXT_PUBLIC_ENV: 'PROD' - NEXT_PUBLIC_ETHERSCAN_URL: 'https://etherscan.io' - NEXT_PUBLIC_FEATURE_FLAG_NEW_ONBOARDING: '0x4B6CA198d257D755A5275648D471FE09931b764A,0xdB3bC9fB1893222d266762e9fF857EB74D75c7D6,0xfc2950dD337ca8496C18dfc0256Fb905A7E7E5c6,0x53b2d22d07E069a3b132BfeaaD275b10273d381E,0x0CED6166873038Ac0cc688e7E6d19E2cBE251Bf0,0x4cA805cE8EcE2E63FfC1F9f8F2731D3F48DF89Df,0x82B8617A16e388256617FeBBa1826093401a3fE5,0x560Ac248ce28972083B718778EEb0dbC2DE55740,0x3d167bd08f762FD391694c67B5e6aF0868c45538,0x3B03863BD553C4CE07eABF2278016533451c9101,0x09e43329552c9D81cF205Fd5f44796fBC40c822e,0xF96F18F2c70b57Ec864cC0C8b828450b82Ff63e3,0xd8486C565098360A24f858088a6D29a380dDF7ec' - NEXT_PUBLIC_ALCHEMY_KEY: lobQdgMiovZ4jK7rj8sFco32GKUeqUBi - NEXT_PUBLIC_IPFS_GATEWAY: 'https://cloudflare-ipfs.com/ipfs/' - NEXT_PUBLIC_MULTICALL_CONTRACT_ADDRESS: '0xeefba1e63905ef1d7acba5a8513c70307c1ce441' - NEXT_PUBLIC_ONBOARD_API_HOST: 'https://onboard-api.centrifuge.io/' - NEXT_PUBLIC_RWA_MARKET_ONBOARD_RETURN_URL: 'https://rwamarket.io' - NEXT_PUBLIC_POOL_REGISTRY: '0xddf1c516cf87126c6c610b52fd8d609e67fb6033' - NEXT_PUBLIC_POOLS_CONFIG: 'mainnetProduction' - NEXT_PUBLIC_POOLS_IPFS_HASH_OVERRIDE: 'QmaMA1VYSKuuYhBcQCyf5Ek4VoiiEG6oLGp3iGbsQPGpkS' - NEXT_PUBLIC_PORTIS_KEY: 'bc9e2922-2ebd-4e2b-86f6-7c7855bdf07f' - NEXT_PUBLIC_REWARDS_TREE_URL: 'https://storage.googleapis.com/rad-rewards-trees-mainnet-production/latest.json' - NEXT_PUBLIC_RPC_URL: 'https://eth-mainnet.g.alchemy.com/v2/lobQdgMiovZ4jK7rj8sFco32GKUeqUBi' - NEXT_PUBLIC_TINLAKE_DATA_BACKEND_URL: 'https://api.goldsky.com/api/public/project_clhi43ef5g4rw49zwftsvd2ks/subgraphs/main/prod/gn' - NEXT_PUBLIC_TRANSACTION_TIMEOUT: '3600' - - - name: Deploy To Netlify - uses: nwtgck/actions-netlify@v1.2.4 - with: - deploy-message: ${{ github.event.head_commit.message }} - enable-commit-comment: false - github-token: ${{ secrets.GITHUB_TOKEN }} - netlify-config-path: ./tinlake-ui/netlify.toml - production-deploy: true - publish-dir: ./tinlake-ui/out - env: - NETLIFY_AUTH_TOKEN: ${{ secrets.NETLIFY_AUTH_TOKEN }} - NETLIFY_SITE_ID: ${{ secrets.TINLAKE_UI_MAINNET_STAGING_NETLIFY_SITE_ID }} diff --git a/.github/workflows/tinlake-ui-pull-request.yml b/.github/workflows/tinlake-ui-pull-request.yml index 90113e37c..3f21e48d0 100644 --- a/.github/workflows/tinlake-ui-pull-request.yml +++ b/.github/workflows/tinlake-ui-pull-request.yml @@ -7,88 +7,12 @@ on: - '.github/workflows/tinlake-ui-pull-request.yml' jobs: - build-and-deploy-to-goerli: + build: runs-on: ubuntu-latest defaults: run: working-directory: tinlake-ui - - steps: - - name: Checkout - uses: actions/checkout@v2 - - - name: Setup Node - uses: actions/setup-node@v2 - with: - node-version: '12' - - - name: Get Yarn Cache Directory Path - id: yarn-cache-dir-path - run: echo "::set-output name=dir::$(yarn config get cacheFolder)" - - - name: Cache Yarn Dependencies - uses: actions/cache@v2 - with: - path: ${{ steps.yarn-cache-dir-path.outputs.dir }} - key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }} - restore-keys: | - ${{ runner.os }}-yarn- - - - name: Install Dependencies - run: yarn install - - - name: Cache Next.js Bundle - uses: actions/cache@v2 - with: - path: ${{ github.workspace }}/tinlake-ui/.next/cache - key: ${{ runner.os }}-nextjs-${{ hashFiles('**/yarn.lock') }} - - - name: Lint - run: yarn lint - - - name: Build - run: yarn export - env: - NEXT_PUBLIC_CENTRIFUGE_CHAIN_URL: 'wss://fullnode.catalyst.cntrfg.com' - NEXT_PUBLIC_CLAIM_CFG_CONTRACT_ADDRESS: '0x297237e17F327f8e5C8dEd78b15761A7D513353b' - NEXT_PUBLIC_ENV: 'demo' - NEXT_PUBLIC_ETHERSCAN_URL: 'https://goerli.etherscan.io' - NEXT_PUBLIC_FEATURE_FLAG_NEW_ONBOARDING: '0x5ca22a7cD0911c0b8279faEC3F3273AE94692E34,0xdA709C17ac67fA92d6cF6E92370809694fa9714a' - NEXT_PUBLIC_ONFINALITY_KEY: 0e1c049f-d876-4e77-a45f-b5afdf5739b2 - NEXT_PUBLIC_IPFS_GATEWAY: 'https://cloudflare-ipfs.com/ipfs/' - NEXT_PUBLIC_MULTICALL_CONTRACT_ADDRESS: '0x5BA1e12693Dc8F9c48aAD8770482f4739bEeD696' - NEXT_PUBLIC_ONBOARD_API_HOST: 'https://onboard-api.catalyst.cntrfg.com/' - NEXT_PUBLIC_RWA_MARKET_ONBOARD_RETURN_URL: 'https://dev.rwamarket.io' - NEXT_PUBLIC_POOL_REGISTRY: '0x46A01532De22Baa1DFDB58b5bB62845667146E5c' - NEXT_PUBLIC_POOLS_CONFIG: 'goerliStaging' - NEXT_PUBLIC_POOLS_IPFS_HASH_OVERRIDE: 'QmdUg4VgLQg6uDBHxPjiMXoawgPM3LpBzuZr3ejCQTkuet' - NEXT_PUBLIC_PORTIS_KEY: 'bc9e2922-2ebd-4e2b-86f6-7c7855bdf07f' - NEXT_PUBLIC_REWARDS_TREE_URL: 'https://storage.googleapis.com/rad-rewards-trees-kovan-staging/latest.json' - NEXT_PUBLIC_RPC_URL: 'https://eth-goerli.api.onfinality.io/rpc?apikey=0e1c049f-d876-4e77-a45f-b5afdf5739b2' - NEXT_PUBLIC_TINLAKE_DATA_BACKEND_URL: 'https://api.thegraph.com/subgraphs/name/offerijns/tinlake-goerli' - NEXT_PUBLIC_TRANSACTION_TIMEOUT: '3600' - - - name: Deploy To Netlify - uses: nwtgck/actions-netlify@v1.2.4 - with: - alias: pr-${{ github.event.pull_request.number }} - deploy-message: ${{ github.event.commit.message }} - enable-pull-request-comment: true - github-token: ${{ secrets.GITHUB_TOKEN }} - netlify-config-path: ./tinlake-ui/netlify.toml - publish-dir: ./tinlake-ui/out - env: - NETLIFY_AUTH_TOKEN: ${{ secrets.NETLIFY_AUTH_TOKEN }} - NETLIFY_SITE_ID: ${{ secrets.TINLAKE_UI_GOERLI_DEV_NETLIFY_SITE_ID }} - - build-and-deploy-to-mainnet: - runs-on: ubuntu-latest - - defaults: - run: - working-directory: tinlake-ui - steps: - name: Checkout uses: actions/checkout@v2 @@ -113,6 +37,8 @@ jobs: - name: Install Dependencies run: yarn install + - run: yarn format:check + - name: Cache Next.js Bundle uses: actions/cache@v2 with: @@ -143,16 +69,3 @@ jobs: NEXT_PUBLIC_RPC_URL: 'https://eth-mainnet.g.alchemy.com/v2/lobQdgMiovZ4jK7rj8sFco32GKUeqUBi' NEXT_PUBLIC_TINLAKE_DATA_BACKEND_URL: 'https://api.goldsky.com/api/public/project_clhi43ef5g4rw49zwftsvd2ks/subgraphs/main/prod/gn' NEXT_PUBLIC_TRANSACTION_TIMEOUT: '3600' - - - name: Deploy To Netlify - uses: nwtgck/actions-netlify@v1.2.4 - with: - alias: pr-${{ github.event.pull_request.number }} - deploy-message: ${{ github.event.commit.message }} - enable-pull-request-comment: true - github-token: ${{ secrets.GITHUB_TOKEN }} - netlify-config-path: ./tinlake-ui/netlify.toml - publish-dir: ./tinlake-ui/out - env: - NETLIFY_AUTH_TOKEN: ${{ secrets.NETLIFY_AUTH_TOKEN }} - NETLIFY_SITE_ID: ${{ secrets.TINLAKE_UI_MAINNET_DEV_NETLIFY_SITE_ID }} From 4dedb6b500b8a4a388f7b2c451a40cf119c75002 Mon Sep 17 00:00:00 2001 From: Guillermo Perez Date: Wed, 28 Aug 2024 14:07:41 +0200 Subject: [PATCH 2/3] fix IPFS gateway for PR check --- .github/workflows/tinlake-ui-pull-request.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/tinlake-ui-pull-request.yml b/.github/workflows/tinlake-ui-pull-request.yml index 3f21e48d0..3060f2042 100644 --- a/.github/workflows/tinlake-ui-pull-request.yml +++ b/.github/workflows/tinlake-ui-pull-request.yml @@ -57,7 +57,7 @@ jobs: NEXT_PUBLIC_ETHERSCAN_URL: 'https://etherscan.io' NEXT_PUBLIC_FEATURE_FLAG_NEW_ONBOARDING: '0x4B6CA198d257D755A5275648D471FE09931b764A,0xdB3bC9fB1893222d266762e9fF857EB74D75c7D6,0xfc2950dD337ca8496C18dfc0256Fb905A7E7E5c6,0x53b2d22d07E069a3b132BfeaaD275b10273d381E,0x0CED6166873038Ac0cc688e7E6d19E2cBE251Bf0,0x4cA805cE8EcE2E63FfC1F9f8F2731D3F48DF89Df,0x82B8617A16e388256617FeBBa1826093401a3fE5,0x560Ac248ce28972083B718778EEb0dbC2DE55740,0x3d167bd08f762FD391694c67B5e6aF0868c45538,0x3B03863BD553C4CE07eABF2278016533451c9101,0x09e43329552c9D81cF205Fd5f44796fBC40c822e,0xF96F18F2c70b57Ec864cC0C8b828450b82Ff63e3,0xd8486C565098360A24f858088a6D29a380dDF7ec' NEXT_PUBLIC_ALCHEMY_KEY: lobQdgMiovZ4jK7rj8sFco32GKUeqUBi - NEXT_PUBLIC_IPFS_GATEWAY: 'https://cloudflare-ipfs.com/ipfs/' + NEXT_PUBLIC_IPFS_GATEWAY: 'https://centrifuge.mypinata.cloud/ipfs/' NEXT_PUBLIC_MULTICALL_CONTRACT_ADDRESS: '0xeefba1e63905ef1d7acba5a8513c70307c1ce441' NEXT_PUBLIC_ONBOARD_API_HOST: 'https://onboard-api.catalyst.cntrfg.com/' NEXT_PUBLIC_RWA_MARKET_ONBOARD_RETURN_URL: 'https://rwamarket.io' From 9b0924088fe13442b0998f6529d403c0d581c39b Mon Sep 17 00:00:00 2001 From: Guillermo Perez Date: Wed, 28 Aug 2024 14:08:14 +0200 Subject: [PATCH 3/3] update example variables --- tinlake-ui/.env.mainnet-example | 34 ++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/tinlake-ui/.env.mainnet-example b/tinlake-ui/.env.mainnet-example index 0dab4cf09..68330de71 100644 --- a/tinlake-ui/.env.mainnet-example +++ b/tinlake-ui/.env.mainnet-example @@ -1,18 +1,18 @@ -# mainnet -NEXT_PUBLIC_CENTRIFUGE_CHAIN_URL=wss://fullnode.parachain.centrifuge.io -NEXT_PUBLIC_CLAIM_CFG_CONTRACT_ADDRESS=0x1cA3B2E7FfCAF83d9228a64e4726402B1d5CC054 -NEXT_PUBLIC_ENV=PROD -NEXT_PUBLIC_ETHERSCAN_URL=https://etherscan.io -NEXT_PUBLIC_FEATURE_FLAG_NEW_ONBOARDING=0x4B6CA198d257D755A5275648D471FE09931b764A,0xdB3bC9fB1893222d266762e9fF857EB74D75c7D6,0xfc2950dD337ca8496C18dfc0256Fb905A7E7E5c6,0x53b2d22d07E069a3b132BfeaaD275b10273d381E,0x0CED6166873038Ac0cc688e7E6d19E2cBE251Bf0,0x4cA805cE8EcE2E63FfC1F9f8F2731D3F48DF89Df,0x82B8617A16e388256617FeBBa1826093401a3fE5,0x560Ac248ce28972083B718778EEb0dbC2DE55740,0x3d167bd08f762FD391694c67B5e6aF0868c45538,0x3B03863BD553C4CE07eABF2278016533451c9101,0x09e43329552c9D81cF205Fd5f44796fBC40c822e,0xF96F18F2c70b57Ec864cC0C8b828450b82Ff63e3,0xd8486C565098360A24f858088a6D29a380dDF7ec +NEXT_PUBLIC_CENTRIFUGE_CHAIN_URL='wss://fullnode.parachain.centrifuge.io' +NEXT_PUBLIC_CLAIM_CFG_CONTRACT_ADDRESS='0x1cA3B2E7FfCAF83d9228a64e4726402B1d5CC054' +NEXT_PUBLIC_ENV='PROD' +NEXT_PUBLIC_ETHERSCAN_URL='https://etherscan.io' +NEXT_PUBLIC_FEATURE_FLAG_NEW_ONBOARDING='0x4B6CA198d257D755A5275648D471FE09931b764A,0xdB3bC9fB1893222d266762e9fF857EB74D75c7D6,0xfc2950dD337ca8496C18dfc0256Fb905A7E7E5c6,0x53b2d22d07E069a3b132BfeaaD275b10273d381E,0x0CED6166873038Ac0cc688e7E6d19E2cBE251Bf0,0x4cA805cE8EcE2E63FfC1F9f8F2731D3F48DF89Df,0x82B8617A16e388256617FeBBa1826093401a3fE5,0x560Ac248ce28972083B718778EEb0dbC2DE55740,0x3d167bd08f762FD391694c67B5e6aF0868c45538,0x3B03863BD553C4CE07eABF2278016533451c9101,0x09e43329552c9D81cF205Fd5f44796fBC40c822e,0xF96F18F2c70b57Ec864cC0C8b828450b82Ff63e3,0xd8486C565098360A24f858088a6D29a380dDF7ec' NEXT_PUBLIC_ALCHEMY_KEY=lobQdgMiovZ4jK7rj8sFco32GKUeqUBi -NEXT_PUBLIC_IPFS_GATEWAY=https://cloudflare-ipfs.com/ipfs/ -NEXT_PUBLIC_MULTICALL_CONTRACT_ADDRESS=0xeefba1e63905ef1d7acba5a8513c70307c1ce441 -NEXT_PUBLIC_ONBOARD_API_HOST=https://onboard-api.centrifuge.io/ -NEXT_PUBLIC_POOL_REGISTRY=0xddf1c516cf87126c6c610b52fd8d609e67fb6033 -NEXT_PUBLIC_POOLS_CONFIG=mainnetProduction -NEXT_PUBLIC_POOLS_IPFS_HASH_OVERRIDE=QmaMA1VYSKuuYhBcQCyf5Ek4VoiiEG6oLGp3iGbsQPGpkS -NEXT_PUBLIC_PORTIS_KEY=bc9e2922-2ebd-4e2b-86f6-7c7855bdf07f -NEXT_PUBLIC_REWARDS_TREE_URL=https://storage.googleapis.com/rad-rewards-trees-mainnet-production/latest.json -NEXT_PUBLIC_RPC_URL=https://eth-mainnet.g.alchemy.com/v2/lobQdgMiovZ4jK7rj8sFco32GKUeqUBi -NEXT_PUBLIC_TINLAKE_DATA_BACKEND_URL=https://api.goldsky.com/api/public/project_clhi43ef5g4rw49zwftsvd2ks/subgraphs/main/prod/gn -NEXT_PUBLIC_TRANSACTION_TIMEOUT=3600 \ No newline at end of file +NEXT_PUBLIC_IPFS_GATEWAY='https://centrifuge.mypinata.cloud/ipfs/' +NEXT_PUBLIC_MULTICALL_CONTRACT_ADDRESS='0xeefba1e63905ef1d7acba5a8513c70307c1ce441' +NEXT_PUBLIC_ONBOARD_API_HOST='https://onboard-api.catalyst.cntrfg.com/' +NEXT_PUBLIC_RWA_MARKET_ONBOARD_RETURN_URL='https://rwamarket.io' +NEXT_PUBLIC_POOL_REGISTRY='0xddf1c516cf87126c6c610b52fd8d609e67fb6033' +NEXT_PUBLIC_POOLS_CONFIG='mainnetProduction' +NEXT_PUBLIC_POOLS_IPFS_HASH_OVERRIDE='QmaMA1VYSKuuYhBcQCyf5Ek4VoiiEG6oLGp3iGbsQPGpkS' +NEXT_PUBLIC_PORTIS_KEY='bc9e2922-2ebd-4e2b-86f6-7c7855bdf07f' +NEXT_PUBLIC_REWARDS_TREE_URL='https://storage.googleapis.com/rad-rewards-trees-mainnet-production/latest.json' +NEXT_PUBLIC_RPC_URL='https://eth-mainnet.g.alchemy.com/v2/lobQdgMiovZ4jK7rj8sFco32GKUeqUBi' +NEXT_PUBLIC_TINLAKE_DATA_BACKEND_URL='https://api.goldsky.com/api/public/project_clhi43ef5g4rw49zwftsvd2ks/subgraphs/main/prod/gn' +NEXT_PUBLIC_TRANSACTION_TIMEOUT='3600' \ No newline at end of file