name: CI

permissions: {}

on:
  workflow_dispatch:
  pull_request:
  push:
    branches:
      - master

jobs:
  build:
    name: build +${{ matrix.toolchain }} ${{ matrix.flags }}
    runs-on: ubuntu-latest
    timeout-minutes: 10
    permissions:
      contents: read
    strategy:
      fail-fast: false
      matrix:
        toolchain: [stable, nightly]
        flags:
          - ""
          - --via-ir
          - --use solc:0.8.17 --via-ir
          - --use solc:0.8.17
          - --use solc:0.8.0
          - --use solc:0.7.6
          - --use solc:0.7.0
          - --use solc:0.6.2
          - --use solc:0.6.12
    steps:
      - uses: actions/checkout@v5
        with:
          persist-credentials: false
      - uses: foundry-rs/foundry-toolchain@v1
      - run: forge --version
      - run: |
          case "${{ matrix.flags }}" in
            *"solc:0.8.0"* | *"solc:0.7"* | *"solc:0.6"*)
              forge build --skip test --skip Config --skip StdConfig --skip LibVariable --deny-warnings ${{ matrix.flags }}
              ;;
            *)
              forge build --skip test --deny-warnings ${{ matrix.flags }}
              ;;
          esac
      # via-ir compilation time checks.
      - if: contains(matrix.flags, '--via-ir')
        run: forge build --skip test --deny-warnings ${{ matrix.flags }} --contracts 'test/compilation/*'

  test:
    runs-on: ubuntu-latest
    timeout-minutes: 10
    permissions:
      contents: read
    strategy:
      fail-fast: false
      matrix:
        toolchain: [stable, nightly]
    steps:
      - uses: actions/checkout@v5
        with:
          persist-credentials: false
      - uses: foundry-rs/foundry-toolchain@v1
        with:
          version: ${{ matrix.toolchain }}
      - run: forge --version
      - run: forge test -vvv

  fmt:
    runs-on: ubuntu-latest
    timeout-minutes: 10
    permissions:
      contents: read
    steps:
      - uses: actions/checkout@v5
        with:
          persist-credentials: false
      - uses: foundry-rs/foundry-toolchain@v1
      - run: forge --version
      - run: forge fmt --check

  typos:
    runs-on: ubuntu-latest
    timeout-minutes: 10
    permissions:
      contents: read
    steps:
      - uses: actions/checkout@v5
        with:
          persist-credentials: false
      - uses: crate-ci/typos@80c8a4945eec0f6d464eaf9e65ed98ef085283d1 # v1

  codeql:
    name: Analyze (${{ matrix.language }})
    runs-on: ubuntu-latest
    permissions:
      security-events: write
      actions: read
      contents: read
    strategy:
      fail-fast: false
      matrix:
        include:
          - language: actions
            build-mode: none
    steps:
      - name: Checkout repository
        uses: actions/checkout@v5
        with:
          persist-credentials: false
      - name: Initialize CodeQL
        uses: github/codeql-action/init@v4
        with:
          languages: ${{ matrix.language }}
          build-mode: ${{ matrix.build-mode }}
      - name: Perform CodeQL Analysis
        uses: github/codeql-action/analyze@v4
        with:
          category: "/language:${{matrix.language}}"

  ci-success:
    runs-on: ubuntu-latest
    if: always()
    needs:
      - build
      - test
      - fmt
      - typos
      - codeql
    timeout-minutes: 10
    steps:
      - name: Decide whether the needed jobs succeeded or failed
        uses: re-actors/alls-green@05ac9388f0aebcb5727afa17fcccfecd6f8ec5fe # release/v1
        with:
          jobs: ${{ toJSON(needs) }}
