name: checks

on:
  push:
    branches:
      - master
      - next-v*
      - release-v*
  pull_request: {}
  workflow_dispatch: {}

concurrency:
  group: checks-${{ github.ref }}
  cancel-in-progress: true

env:
  NODE_OPTIONS: --max_old_space_size=5120

jobs:
  lint:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Set up environment
        uses: ./.github/actions/setup
      - run: npm run lint

  tests:
    runs-on: ubuntu-latest
    env:
      FORCE_COLOR: 1
      GAS: true
    steps:
      - uses: actions/checkout@v4
      - name: Set up environment
        uses: ./.github/actions/setup
      - name: Run tests and generate gas report
        run: npm run test
      - name: Check linearisation of the inheritance graph
        run: npm run test:inheritance
      - name: Check proceduraly generated contracts are up-to-date
        run: npm run test:generation
      - name: Compare gas costs
        uses: ./.github/actions/gas-compare
        if: github.base_ref == 'master'
        with:
          token: ${{ github.token }}

  tests-upgradeable:
    runs-on: ubuntu-latest
    env:
      FORCE_COLOR: 1
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0 # Include history so patch conflicts are resolved automatically
      - name: Set up environment
        uses: ./.github/actions/setup
      - name: Copy non-upgradeable contracts as dependency
        run: |
          mkdir -p lib/openzeppelin-contracts
          cp -rnT contracts lib/openzeppelin-contracts/contracts
      - name: Transpile to upgradeable
        run: bash scripts/upgradeable/transpile.sh
      - name: Run tests
        run: npm run test
      - name: Check linearisation of the inheritance graph
        run: npm run test:inheritance
      - name: Check storage layout
        uses: ./.github/actions/storage-layout
        if: github.base_ref == 'master'
        continue-on-error: ${{ contains(github.event.pull_request.labels.*.name, 'breaking change') }}
        with:
          token: ${{ github.token }}

  tests-foundry:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with:
          submodules: recursive
      - name: Set up environment
        uses: ./.github/actions/setup
      - name: Run tests
        run: forge test -vv

  coverage:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Set up environment
        uses: ./.github/actions/setup
      - run: npm run coverage
      - uses: codecov/codecov-action@v3
        with:
          token: ${{ secrets.CODECOV_TOKEN }}

  slither:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Set up environment
        uses: ./.github/actions/setup
      - run: rm foundry.toml
      - uses: crytic/slither-action@v0.3.0
        with:
          node-version: 18.15

  codespell:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Run CodeSpell
        uses: codespell-project/actions-codespell@v2.0
        with:
          check_hidden: true
          check_filenames: true
          skip: package-lock.json,*.pdf
