cairo-native 0.8.0

A compiler to convert Cairo's IR Sierra code to MLIR and execute it.
name: Daily Block Run

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

env:
  RANGE_SIZE: 20

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: 25
      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
          - 1000400
          - 1000500
          - 1002000
          - 1003000
          - 1004000
          - 1005000
          - 1006000
          - 1007000
          - 1008000
          - 1009000
          - 1100400
          - 1100500
          - 1102000
          - 1103000
          - 1104000
          - 1105000
          - 1106000
          - 1107000
          - 1108000
          - 1109000
        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: main-v0.14.1

      - name: Restore RPC Calls
        id: restore-rpc-calls
        uses: actions/cache/restore@v4.2.0
        with:
          path: starknet-replay/cache
          key: cache-${{matrix.block}}-${{ github.run_id }}
          restore-keys: |
            cache-${{matrix.block}}

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

      - 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

          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 --bin replay --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 --bin replay --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}}

      - name: Save RPC Calls
        uses: actions/cache/save@v4.2.0
        if: ${{ always() && matrix.runner == 'vm' }}
        with:
          path: starknet-replay/cache
          key: ${{ steps.restore-rpc-calls.outputs.cache-primary-key }}

  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: python ./scripts/cmp_state_dumps.py | tee output

      - name: Upload Compare Results
        id: upload_compare_results
        uses: actions/upload-artifact@v4
        if: ${{ always() }}
        with:
          name: output-result
          path: 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
          echo "COMPARISON_RESULT=$REPO_URL/actions/runs/${{ github.run_id }}/artifacts/${{ steps.upload_compare_results.outputs.artifact-id }}" | tee -a $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