name: Contracts

on:
  push:
    branches:
      - main
      - staging
      - develop
      - alpha
    paths:
      - 'contracts/**'
      - '.github/workflows/contracts.yaml'
  pull_request:
    types:
      - opened
      - reopened
      - synchronize
      - ready_for_review
    paths:
      - 'contracts/**'
      - '.github/workflows/contracts.yaml'

defaults:
  run:
    working-directory: 'contracts'

jobs:
  foundry:
    if: github.event.pull_request.draft == false
    runs-on: ubuntu-latest

    steps:
      - name: Checkout sources
        uses: actions/checkout@v3
        with:
          submodules: recursive

      - name: Install Foundry
        uses: foundry-rs/foundry-toolchain@v1
        with:
          version: nightly

      - name: Setup LCOV
        uses: hrishikesh-kadam/setup-lcov@v1

      - name: Install Node.js 14
        uses: actions/setup-node@v2
        with:
          node-version: '14'

      - name: Get yarn cache directory path
        id: yarn-cache-dir-path
        run: echo "::set-output name=dir::$(yarn cache dir)"

      - name: Cache yarn dependencies
        uses: actions/cache@v2
        id: yarn-cache # use this to check for `cache-hit` (`steps.yarn-cache.outputs.cache-hit != 'true'`)
        with:
          path: ${{ steps.yarn-cache-dir-path.outputs.dir }}
          key: ${{ runner.os }}-yarn-${{ hashFiles('contracts/yarn.lock') }}
          restore-keys: |
            ${{ runner.os }}-yarn-

      - name: Cache node_modules
        id: npm_cache
        uses: actions/cache@v2
        with:
          path: node_modules
          key: node_modules-${{ hashFiles('contracts/yarn.lock') }}

      - name: yarn install
        # if: steps.npm_cache.outputs.cache-hit != 'true'
        run: yarn install

      - name: Compile with foundry
        run: forge build

      - name: Run foundry tests
        run: forge test -vvv

      - name: Run foundry coverage
        run : forge coverage --report lcov

      - name : Prune coverage
        run : lcov --remove ./lcov.info -o ./lcov.info.pruned 'src/mocks/*' 'src/test/*' 'scripts/*' 'node_modules/*' 'lib/*'

      - name: Report code coverage
        uses: zgosalvez/github-actions-report-lcov@v3
        with:
          coverage-files: contracts/lcov.info.pruned
          minimum-coverage: 0
          artifact-name: code-coverage-report
          github-token: ${{ secrets.GITHUB_TOKEN }}
          working-directory: contracts
          update-comment: true

  hardhat:
    if: github.event.pull_request.draft == false
    runs-on: ubuntu-latest

    steps:
      - name: Checkout sources
        uses: actions/checkout@v3
        with:
          submodules: recursive

      - name: Install Node.js 14
        uses: actions/setup-node@v2
        with:
          node-version: '14'

      - name: Get yarn cache directory path
        id: yarn-cache-dir-path
        run: echo "::set-output name=dir::$(yarn cache dir)"

      - name: Cache yarn dependencies
        uses: actions/cache@v2
        id: yarn-cache # use this to check for `cache-hit` (`steps.yarn-cache.outputs.cache-hit != 'true'`)
        with:
          path: ${{ steps.yarn-cache-dir-path.outputs.dir }}
          key: ${{ runner.os }}-yarn-${{ hashFiles('contracts/yarn.lock') }}
          restore-keys: |
            ${{ runner.os }}-yarn-

      - name: Cache node_modules
        id: npm_cache
        uses: actions/cache@v2
        with:
          path: node_modules
          key: node_modules-${{ hashFiles('contracts/yarn.lock') }}

      - name: yarn install
        # if: steps.npm_cache.outputs.cache-hit != 'true'
        run: yarn install

      - name: Compile with hardhat
        run: npx hardhat compile

      - name: Run hardhat tests
        run: npx hardhat test
