neo-decompiler 0.11.0

Neo N3 NEF decompiler: parse, disassemble, lift bytecode to high-level pseudocode and C# skeletons, with a CLI, JSON reports, and optional WebAssembly bindings.
Documentation
name: CI

on:
  push:
    branches: [master, main]
  pull_request:
    branches: [master, main]

env:
  CARGO_TERM_COLOR: always

jobs:
  test:
    name: Test
    runs-on: ubuntu-latest
    timeout-minutes: 15
    # beta and nightly run for early warning but must not gate the build: their
    # clippy lint set changes with every toolchain release, so `-D warnings`
    # there fails on forward-looking lints unrelated to this crate. Only stable
    # (plus the separate MSRV job) gates. fail-fast is disabled so a beta/nightly
    # failure never cancels the stable run.
    continue-on-error: ${{ matrix.rust != 'stable' }}
    strategy:
      fail-fast: false
      matrix:
        rust:
          - stable
          - beta
          - nightly
    steps:
      - uses: actions/checkout@v4
      - name: Install Rust
        uses: dtolnay/rust-toolchain@master
        with:
          toolchain: ${{ matrix.rust }}
          components: rustfmt, clippy
      - name: Cache dependencies
        uses: actions/cache@v4
        with:
          path: |
            ~/.cargo/registry
            ~/.cargo/git
            target
          key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}
      - name: Run tests
        run: cargo test --verbose
      - name: Run tests (no default features)
        if: matrix.rust == 'stable'
        run: cargo test --no-default-features --verbose
      - name: Run clippy
        run: cargo clippy --all-targets --all-features -- -D warnings
      - name: Run clippy (no default features)
        if: matrix.rust == 'stable'
        run: cargo clippy --all-targets --no-default-features -- -D warnings
      - name: Check formatting
        run: cargo fmt --all -- --check
      - name: Build docs
        if: matrix.rust == 'stable'
        env:
          RUSTDOCFLAGS: -D warnings
        run: cargo doc --no-deps

  msrv:
    name: MSRV
    runs-on: ubuntu-latest
    timeout-minutes: 15
    steps:
      - uses: actions/checkout@v4
      - name: Install Rust
        uses: dtolnay/rust-toolchain@master
        with:
          toolchain: 1.86.0
      - name: Cache dependencies
        uses: actions/cache@v4
        with:
          path: |
            ~/.cargo/registry
            ~/.cargo/git
            target
          key: ${{ runner.os }}-cargo-msrv-${{ hashFiles('**/Cargo.lock') }}
      - name: Run tests
        run: cargo test --verbose
      - name: Run tests (no default features)
        run: cargo test --no-default-features --verbose

  benchmark:
    name: Benchmark
    runs-on: ubuntu-latest
    timeout-minutes: 15
    steps:
      - uses: actions/checkout@v4
      - name: Install Rust
        uses: dtolnay/rust-toolchain@stable
      - name: Cache dependencies
        uses: actions/cache@v4
        with:
          path: |
            ~/.cargo/registry
            ~/.cargo/git
            target
          key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}
      - name: Run benchmarks
        run: cargo bench

  deny:
    name: Cargo deny
    runs-on: ubuntu-latest
    timeout-minutes: 15
    steps:
      - uses: actions/checkout@v4
      - name: Install cargo-deny
        uses: taiki-e/install-action@cargo-deny
      - name: Run cargo deny
        run: cargo deny check

  security:
    name: Security audit
    runs-on: ubuntu-latest
    timeout-minutes: 15
    steps:
      - uses: actions/checkout@v4
      - name: Security audit
        uses: rustsec/audit-check@v1.4.1
        with:
          token: ${{ secrets.GITHUB_TOKEN }}

  artifact-sweep:
    name: Artifact sweep
    runs-on: ubuntu-latest
    timeout-minutes: 15
    steps:
      - uses: actions/checkout@v4
      - name: Install Rust
        uses: dtolnay/rust-toolchain@stable
      - name: Cache dependencies
        uses: actions/cache@v4
        with:
          path: |
            ~/.cargo/registry
            ~/.cargo/git
            target
          key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}
      - name: Run artifact sweep
        run: bash tools/ci/artifact_sweep.sh

  build:
    name: Build
    runs-on: ${{ matrix.os }}
    timeout-minutes: 15
    strategy:
      matrix:
        os: [ubuntu-latest, windows-latest, macos-latest]
    steps:
      - uses: actions/checkout@v4
      - name: Install Rust
        uses: dtolnay/rust-toolchain@stable
      - name: Cache dependencies
        uses: actions/cache@v4
        with:
          path: |
            ~/.cargo/registry
            ~/.cargo/git
            target
          key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}
      - name: Build
        run: cargo build --release --verbose
      - name: Upload artifacts
        uses: actions/upload-artifact@v4
        with:
          name: neo-decompiler-${{ matrix.os }}
          path: target/release/neo-decompiler*

  js-package:
    name: JS package
    runs-on: ubuntu-latest
    timeout-minutes: 10
    steps:
      - uses: actions/checkout@v4
      - name: Set up Node
        uses: actions/setup-node@v4
        with:
          node-version: 24
      - name: Run JS package tests
        working-directory: js
        run: npm test

  web-package:
    name: Web package
    runs-on: ubuntu-latest
    timeout-minutes: 20
    steps:
      - uses: actions/checkout@v4
      - name: Install Rust
        uses: dtolnay/rust-toolchain@stable
        with:
          targets: wasm32-unknown-unknown
      - name: Install wasm-pack
        run: cargo install wasm-pack --locked
      - name: Install wasm-bindgen-cli
        # Match the wasm-bindgen crate version in Cargo.lock, otherwise
        # `wasm-pack --mode no-install` fails with "Not able to find or install
        # a local wasm-bindgen". Derive it from the lockfile so it cannot drift.
        run: |
          version="$(grep -A1 '^name = "wasm-bindgen"$' Cargo.lock | sed -n 's/^version = "\(.*\)"/\1/p' | head -1)"
          echo "Installing wasm-bindgen-cli ${version} (matched to Cargo.lock)"
          cargo install wasm-bindgen-cli --version "${version}" --locked
      - name: Set up Node
        uses: actions/setup-node@v4
        with:
          node-version: 24
          cache: npm
          cache-dependency-path: web/package-lock.json
      - name: Install web dependencies
        working-directory: web
        run: npm ci
      - name: Run web package tests
        working-directory: web
        run: npm test
      - name: Verify web package version sync
        working-directory: web
        run: npm run version:check
      - name: Verify web package tarball contents
        working-directory: web
        run: npm run verify:pack