cairo-native 0.2.6

A compiler to convert Cairo's intermediate representation Sierra code to MLIR.
name: Daily Block Run

on:
  schedule:
    # At the end of every day
    - cron: "0 0 * * *"

env:
  RANGE_SIZE: 25

jobs:
  run:
    runs-on: ubuntu-latest
    env:
      LLVM_SYS_191_PREFIX: /usr/lib/llvm-19/
      MLIR_SYS_190_PREFIX: /usr/lib/llvm-19/
      TABLEGEN_190_PREFIX: /usr/lib/llvm-19/
      RPC_ENDPOINT_TESTNET: ${{ secrets.RPC_ENDPOINT_TESTNET }}
      RPC_ENDPOINT_MAINNET: ${{ secrets.RPC_ENDPOINT_MAINNET }}
    strategy:
      max-parallel: 10
      matrix:
        block:
          - 740000
          - 741000
          - 742000
          - 743000
          - 744000
          - 745000
          - 746000
          - 747000
          - 748000
          - 749000
          - 800000
          - 800050
          - 800100
          - 800150
          - 800200
          - 800250
          - 800300
          - 800350
          - 800400
          - 800450
          - 900000
          - 900100
          - 900200
          - 900300
          - 900400
          - 900500
          - 900600
          - 900700
          - 900800
          - 900900
        runner:
          - native
          - vm
      fail-fast: false
    defaults:
      run:
        shell: bash
        working-directory: ./starknet-replay

    steps:
      # We checkout replay as it's the main repository for this workflow
      - name: Checkout Replay
        uses: actions/checkout@v4
        with:
          repository: lambdaclass/starknet-replay
          path: starknet-replay
      # We need native if we want to run with cairo native main
      - name: Checkout Native
        uses: actions/checkout@v4
        with:
          path: cairo_native
      # We need sequencer if we want to run with cairo native main
      - name: Checkout Native
        uses: actions/checkout@v4
        with:
          repository: lambdaclass/sequencer
          path: sequencer
          ref: replay

      # Install dependencies
      - uses: ./cairo_native/.github/actions/install-linux-deps
      - name: Setup rust env
        uses: dtolnay/rust-toolchain@1.83.0
      - name: Retreive cached dependecies
        uses: Swatinem/rust-cache@v2
        with:
          workspaces: "starknet-replay -> target"
          cache-directories: "cairo_native"

      - name: Build Cairo Native Runtime Library
        shell: bash
        run: |
          cd ../cairo_native
          make runtime
          echo "CAIRO_NATIVE_RUNTIME_LIBRARY=$(pwd)/libcairo_native_runtime.a" > $GITHUB_ENV

      - name: Patch replay dependencies
        run: |
          # Updates sequencer dependency to local path
          name='[[:alnum:]_-]+'
          sequencer_url='"https:\/\/github.com\/lambdaclass\/sequencer\.git"'
          rev='"[[:alnum:]]+"'
          new_path='"..\/sequencer\/crates\/\1"'
          sed -i'' -r "s/^($name) = \{ git = $sequencer_url, rev = $rev/\1 = { path = $new_path/" Cargo.toml

          # Updates native dependency to local path
          new_path='"..\/cairo_native"'
          sed -i'' -r "s/^cairo-native = .*/cairo-native.path = $new_path/" Cargo.toml

          git diff

      - name: Patch sequencer dependencies
        run: |
          cd ../sequencer

          # Updates native dependency to local path
          new_path='"..\/cairo_native"'
          sed -i'' -r "s/^cairo-native = .*/cairo-native.path = $new_path/" Cargo.toml

          # Update native submodule
          git rm crates/blockifier/cairo_native
          ln -s ../../../cairo_native/ crates/blockifier/cairo_native

          git diff

      - name: Run with Native
        if: ${{ matrix.runner == 'native' }}
        run: |
          BLOCK_START=${{ matrix.block }}
          BLOCK_END=$(($BLOCK_START + $RANGE_SIZE - 1))
          cargo run --release --features state_dump block-range $BLOCK_START $BLOCK_END mainnet
      - name: Run with VM
        if: ${{ matrix.runner == 'vm' }}
        run: |
          BLOCK_START=${{ matrix.block }}
          BLOCK_END=$(($BLOCK_START + $RANGE_SIZE - 1))
          cargo run --release --features state_dump,only_cairo_vm block-range $BLOCK_START $BLOCK_END mainnet

      # We always upload the dump, even if the job fails
      - name: Upload dumps
        uses: actions/upload-artifact@v4
        if: ${{ always() }}
        with:
          name: dump-${{matrix.block}}-${{matrix.runner}}
          path: starknet-replay/state_dumps/${{matrix.runner}}

  compare:
    needs: [run]
    runs-on: ubuntu-latest
    # We always run the compare job, to ensure that a single run job failing
    # would not cancel the whole comparison.
    if: ${{ always() }}
    defaults:
      run:
        shell: bash
    steps:
      - uses: actions/checkout@v4

      - name: Fetch Native dumps
        uses: actions/download-artifact@v4
        with:
          pattern: dump-*-native
          path: state_dumps/native
          merge-multiple: true
        continue-on-error: true
      - name: Fetch VM dumps
        uses: actions/download-artifact@v4
        with:
          pattern: dump-*-vm
          path: state_dumps/vm
          merge-multiple: true
        continue-on-error: true

      - name: Compare states
        run: |
          ./scripts/cmp_state_dumps.sh | tee output

      - name: Prepare env vars
        if: ${{ always() }}
        run: |
          # Save workflow url
          REPO_URL="${{ github.server_url }}/${{ github.repository }}"
          echo "WORKFLOW_URL=$REPO_URL/actions/runs/${{ github.run_id }}" | tee -a $GITHUB_ENV

          # Save output
          {
            echo 'OUTPUT<<EOF'
            cat output
            echo EOF
          } >> "$GITHUB_ENV"

      - name: Create Issue
        if: ${{ failure() }}
        uses: JasonEtco/create-an-issue@v2
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          COMMIT_SHA: ${{ github.sha }}
        with:
          filename: .github/ISSUE_TEMPLATE/daily_failure.md