Add Constructor Support for Solang Solidity Contracts on Soroban #7024
Workflow file for this run
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: Build tests | |
on: | |
push: | |
branches: | |
- main | |
pull_request: | |
workflow_dispatch: | |
env: | |
LLVM_PROFILE_FILE: ${{ github.workspace }}/target/solang-%p-%10m.profraw | |
jobs: | |
repolinter: | |
name: Repolinter | |
runs-on: solang-ubuntu-latest | |
steps: | |
- name: Checkout sources | |
uses: actions/checkout@v4 | |
- name: Run repolinter | |
run: npx repolinter --rulesetUrl https://raw.githubusercontent.com/hyperledger-labs/hyperledger-community-management-tools/master/repo_structure/repolint.json | |
- uses: enarx/spdx@master | |
with: | |
licenses: Apache-2.0 MIT | |
docs: | |
name: Docs | |
runs-on: solang-ubuntu-latest | |
container: ubuntu:22.04 | |
steps: | |
- name: Install Python and git | |
run: | | |
apt-get update | |
apt-get install -y python3-pip git pkg-config libcairo-dev latexmk | |
- name: Checkout sources | |
uses: actions/checkout@v4 | |
with: | |
# docs/conf.py uses `git describe --tags` which requires full history | |
fetch-depth: 0 | |
- name: Build docs | |
working-directory: ./docs | |
run: | | |
# Without the --add safe.directory we get the following error: | |
# fatal: detected dubious ownership in repository at '/__w/solang/solang' | |
# actions/checkout@v4 is supposed to fix this, but it does not work | |
git config --global --add safe.directory "${GITHUB_WORKSPACE}" | |
pip install -r requirements.txt | |
make html epub | |
linux-x86-64: | |
name: Linux x86-64 | |
runs-on: solang-ubuntu-latest | |
container: ghcr.io/hyperledger/solang-llvm:ci-7 | |
env: | |
RUSTFLAGS: -C instrument-coverage -C llvm-args=--instrprof-atomic-counter-update-all --cfg=coverage --cfg=trybuild_no_target | |
CARGO_INCREMENTAL: 0 | |
CARGO_LLVM_COV: 1 | |
CARGO_LLVM_COV_TARGET_DIR: ${{ github.workspace }}/target | |
steps: | |
- name: Checkout sources | |
uses: actions/checkout@v4 | |
with: | |
submodules: recursive | |
- name: Install Rust | |
uses: dtolnay/rust-toolchain@master | |
with: | |
toolchain: 1.75.0 | |
components: | | |
llvm-tools | |
clippy | |
rustfmt | |
- name: cargo install cargo-llvm-cov | |
uses: taiki-e/install-action@cargo-llvm-cov | |
- name: Run cargo clippy | |
run: cargo clippy --workspace --tests --bins -- -D warnings | |
- name: Run cargo clippy without wasm_opt feature | |
run: cargo clippy --workspace --no-default-features --features language_server,llvm,soroban --bins -- -D warnings | |
- name: Run cargo clippy without llvm feature | |
run: cargo clippy --workspace --no-default-features --lib -- -D warnings | |
- name: Run cargo clippy with only soroban feature | |
run: cargo clippy --workspace --no-default-features --features soroban,llvm --lib -- -D warnings | |
- name: Run cargo doc | |
run: cargo doc --workspace --bins | |
- name: Run cargo fmt | |
run: cargo fmt --all -- --check | |
- name: Configure llvm-cov and build | |
if: always() | |
run: | | |
cargo llvm-cov clean --workspace | |
cargo build | |
- name: Run tests | |
if: always() | |
run: cargo llvm-cov --all-features --workspace --no-report --jobs 2 | |
- name: Upload binary | |
uses: actions/[email protected] | |
with: | |
name: solang-linux-x86-64 | |
path: ./target/debug/solang | |
- name: Compress test coverage files | |
run: | | |
rm -r bpf wasm tmp cxxbridge CACHEDIR.TAG | |
rm -r debug/build debug/deps debug/examples debug/incremental | |
tar -czvf rust-tests.tar.gz * | |
working-directory: ./target | |
- name: Upload test coverage files | |
uses: actions/[email protected] | |
with: | |
name: rust-tests.tar.gz | |
path: ./target/rust-tests.tar.gz | |
linux-arm: | |
name: Linux Arm | |
runs-on: solang-arm | |
if: ${{ github.repository_owner == 'hyperledger-solang' }} | |
steps: | |
- name: Checkout sources | |
uses: actions/checkout@v4 | |
with: | |
submodules: recursive | |
- name: Basic build tools | |
run: | | |
sudo apt-get update | |
sudo apt-get install -y gcc g++ make | |
- uses: dtolnay/[email protected] | |
- name: Get LLVM | |
run: curl -sSL --output llvm16.0-linux-arm64.tar.xz https://github.com/hyperledger-solang/solang-llvm/releases/download/llvm16-0/llvm16.0-linux-arm64.tar.xz | |
- name: Extract LLVM | |
run: tar Jxf llvm16.0-linux-arm64.tar.xz | |
- name: Add LLVM to Path | |
run: echo "$(pwd)/llvm16.0/bin" >> $GITHUB_PATH | |
- name: Build | |
run: cargo build --verbose | |
- name: Run tests | |
run: cargo test --verbose --workspace | |
- uses: actions/[email protected] | |
with: | |
name: solang-linux-arm64 | |
path: ./target/debug/solang | |
windows: | |
name: Windows | |
runs-on: windows-latest | |
steps: | |
- name: Checkout sources | |
uses: actions/checkout@v4 | |
with: | |
submodules: recursive | |
- name: Download LLVM | |
run: curl -sSL -o c:\llvm.zip https://github.com/hyperledger-solang/solang-llvm/releases/download/llvm16-0/llvm16.0-win.zip | |
- name: Extract LLVM | |
run: unzip c:\llvm.zip -d c:/ | |
- name: Add LLVM to Path | |
run: echo "c:\llvm16.0\bin" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 | |
# Use C:\ as D:\ might run out of space | |
- name: "Use C: for rust temporary files" | |
run: echo "CARGO_TARGET_DIR=C:\target" | Out-File -FilePath $Env:GITHUB_ENV -Encoding utf8 -Append | |
- uses: dtolnay/[email protected] | |
with: | |
components: clippy | |
# We run clippy on Linux in the lint job above, but this does not check #[cfg(windows)] items | |
- name: Run cargo clippy | |
run: cargo clippy --workspace --tests --bins -- -D warnings -D clippy::inconsistent-struct-constructor | |
- name: Build | |
run: cargo build --verbose | |
- name: Run tests | |
run: cargo test --verbose --workspace | |
- uses: actions/[email protected] | |
with: | |
name: solang.exe | |
path: C:/target/debug/solang.exe | |
# Print disk usage to debug disk space problems | |
- run: Get-PSDrive | |
if: always() | |
mac-arm: | |
name: Mac Arm | |
runs-on: macos-13-xlarge | |
steps: | |
- name: Checkout sources | |
uses: actions/checkout@v4 | |
with: | |
submodules: recursive | |
- uses: dtolnay/[email protected] | |
- name: Get LLVM | |
run: curl -sSL --output llvm16.0-mac-arm.tar.xz https://github.com/hyperledger-solang/solang-llvm/releases/download/llvm16-0/llvm16.0-mac-arm.tar.xz | |
- name: Extract LLVM | |
run: tar Jxf llvm16.0-mac-arm.tar.xz | |
- name: Add LLVM to Path | |
run: echo "$(pwd)/llvm16.0/bin" >> $GITHUB_PATH | |
- name: Build | |
run: cargo build --verbose | |
- name: Run tests | |
run: cargo test --verbose --workspace | |
- name: Run tests without wasm_opt | |
run: cargo test --verbose --workspace --no-default-features --features language_server,llvm,soroban | |
- uses: actions/[email protected] | |
with: | |
name: solang-mac-arm | |
path: ./target/debug/solang | |
mac-intel: | |
name: Mac Intel | |
runs-on: macos-12 | |
steps: | |
- name: Checkout sources | |
uses: actions/checkout@v4 | |
with: | |
submodules: recursive | |
- uses: dtolnay/[email protected] | |
- name: Get LLVM | |
run: wget -q -O llvm16.0-mac-intel.tar.xz https://github.com/hyperledger-solang/solang-llvm/releases/download/llvm16-0/llvm16.0-mac-intel.tar.xz | |
- name: Extract LLVM | |
run: tar Jxf llvm16.0-mac-intel.tar.xz | |
- name: Add LLVM to Path | |
run: echo "$(pwd)/llvm16.0/bin" >> $GITHUB_PATH | |
- name: Build | |
run: cargo build --verbose | |
- name: Run tests | |
run: cargo test --verbose --workspace | |
- uses: actions/[email protected] | |
with: | |
name: solang-mac-intel | |
path: ./target/debug/solang | |
mac-universal: | |
name: Mac Universal Binary | |
runs-on: macos-12 | |
needs: [mac-arm, mac-intel] | |
steps: | |
- uses: actions/[email protected] | |
with: | |
name: solang-mac-intel | |
- run: mv solang solang-mac-intel | |
- uses: actions/[email protected] | |
with: | |
name: solang-mac-arm | |
- run: mv solang solang-mac-arm | |
- run: lipo -create -output solang-mac solang-mac-intel solang-mac-arm | |
- uses: actions/[email protected] | |
with: | |
name: solang-mac | |
path: solang-mac | |
container: | |
name: Container Image | |
runs-on: solang-ubuntu-latest | |
steps: | |
- name: Checkout sources | |
uses: actions/checkout@v4 | |
- run: echo "push=--push" >> $GITHUB_OUTPUT | |
id: push | |
if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/main' }} | |
- run: | | |
echo ${{ secrets.GITHUB_TOKEN }} | docker login ghcr.io -u $GITHUB_ACTOR --password-stdin | |
docker buildx build . \ | |
${{steps.push.outputs.push}} \ | |
--tag ghcr.io/${GITHUB_REPOSITORY}:latest \ | |
--label org.opencontainers.image.description="Solidity Compiler for Solana and Polkadot version $(git describe --tags)" | |
anchor: | |
name: Anchor Integration test | |
runs-on: solang-ubuntu-latest | |
container: ghcr.io/hyperledger/solang-llvm:ci-7 | |
needs: linux-x86-64 | |
steps: | |
- name: Checkout sources | |
uses: actions/checkout@v4 | |
- uses: actions/setup-node@v4 | |
with: | |
node-version: '16' | |
- uses: dtolnay/[email protected] | |
- name: Setup yarn | |
run: npm install -g yarn | |
- uses: actions/[email protected] | |
with: | |
name: solang-linux-x86-64 | |
path: bin | |
- name: Solang Compiler | |
run: | | |
chmod 755 ./bin/solang | |
echo "$(pwd)/bin" >> $GITHUB_PATH | |
# Ensure nohup writes output to a file, not the terminal. | |
# If we don't, solana-test-validator might not be able to write its | |
# output and exit | |
- run: nohup solana-test-validator -q > validator.out & | |
- name: Build Anchor test program | |
run: | | |
yarn install | |
anchor build | |
working-directory: ./integration/anchor | |
- name: Deploy Anchor program | |
run: | | |
solana -ul airdrop -k id.json 10 | |
anchor deploy | |
working-directory: ./integration/anchor | |
- name: Create Solidity interface file for Anchor | |
run: yarn parse-idl | |
working-directory: ./integration/anchor | |
- name: Build Solang contracts | |
run: yarn build | |
working-directory: ./integration/anchor | |
- name: Test Anchor | |
run: anchor test --skip-local-validator | |
working-directory: ./integration/anchor | |
- name: Upload test coverage files | |
uses: actions/[email protected] | |
with: | |
name: anchor-tests | |
path: ./target/*.profraw | |
soroban: | |
name: Soroban Integration test | |
runs-on: solang-ubuntu-latest | |
container: ghcr.io/hyperledger/solang-llvm:ci-7 | |
needs: linux-x86-64 | |
steps: | |
- name: Checkout sources | |
uses: actions/checkout@v4 | |
- uses: actions/setup-node@v4 | |
with: | |
node-version: '16' | |
- uses: dtolnay/[email protected] | |
- uses: actions/[email protected] | |
with: | |
name: solang-linux-x86-64 | |
path: bin | |
- name: Solang Compiler | |
run: | | |
chmod 755 ./bin/solang | |
echo "$(pwd)/bin" >> $GITHUB_PATH | |
- name: Install Soroban | |
run: cargo install --locked soroban-cli --version 22.0.0 | |
- name: Add cargo install location to PATH | |
run: echo "$HOME/.cargo/bin" >> $GITHUB_PATH | |
- run: npm install | |
working-directory: ./integration/soroban | |
- name: Build Solang contracts | |
run: npm run build | |
working-directory: ./integration/soroban | |
- name: Setup Soroban enivronment | |
run: npm run setup | |
working-directory: ./integration/soroban | |
- name: Deploy and test contracts | |
run: npm run test | |
working-directory: ./integration/soroban | |
- name: Upload test coverage files | |
uses: actions/[email protected] | |
with: | |
name: soroban-tests | |
path: ./target/*.profraw | |
solana: | |
name: Solana Integration test | |
runs-on: solang-ubuntu-latest | |
container: ghcr.io/hyperledger/solang-llvm:ci-7 | |
needs: linux-x86-64 | |
steps: | |
- name: Checkout sources | |
uses: actions/checkout@v4 | |
- uses: actions/setup-node@v4 | |
with: | |
node-version: '16' | |
- uses: dtolnay/[email protected] | |
- uses: actions/[email protected] | |
with: | |
name: solang-linux-x86-64 | |
path: bin | |
- name: Solang Compiler | |
run: | | |
chmod 755 ./bin/solang | |
echo "$(pwd)/bin" >> $GITHUB_PATH | |
# Ensure nohup writes output to a file, not the terminal. | |
# If we don't, solana-test-validator might not be able to write its | |
# output and exit | |
- run: nohup solana-test-validator -q > validator.out & | |
- run: npm install | |
working-directory: ./integration/solana | |
- name: Build Solang contracts | |
run: npm run build | |
working-directory: ./integration/solana | |
- name: Deploy and test contracts | |
run: npm run test | |
working-directory: ./integration/solana | |
- name: Upload test coverage files | |
uses: actions/[email protected] | |
with: | |
name: solana-tests | |
path: ./target/*.profraw | |
polkadot: | |
name: Polkadot Integration test | |
runs-on: solang-ubuntu-latest | |
needs: linux-x86-64 | |
steps: | |
- name: Checkout sources | |
uses: actions/checkout@v4 | |
with: | |
submodules: recursive | |
# We can't run substrate node as a github actions service, since it requires | |
# command line arguments. See https://github.com/actions/runner/pull/1152 | |
- name: Start substrate contracts node | |
run: echo id=$(docker run -d -p 9944:9944 ghcr.io/hyperledger/solang-substrate-ci:62a8a6c substrate-contracts-node --dev --rpc-external -lwarn,runtime::contracts=trace) >> $GITHUB_OUTPUT | |
id: substrate | |
- uses: actions/[email protected] | |
with: | |
name: solang-linux-x86-64 | |
path: bin | |
- run: | | |
chmod 755 ./bin/solang | |
echo "$(pwd)/bin" >> $GITHUB_PATH | |
- uses: actions/setup-node@v4 | |
with: | |
node-version: '16' | |
- run: npm install | |
working-directory: ./integration/polkadot | |
- name: Build ink! contracts | |
run: npm run build-ink | |
working-directory: ./integration/polkadot | |
- name: Build Solang contracts | |
run: npm run build | |
working-directory: ./integration/polkadot | |
- name: Deploy and test contracts | |
run: npm run test | |
working-directory: ./integration/polkadot | |
- name: Upload test coverage files | |
uses: actions/[email protected] | |
with: | |
name: polkadot-tests | |
path: ./target/*.profraw | |
- name: cleanup | |
if: always() | |
run: docker kill ${{steps.substrate.outputs.id}} | |
polkadot-subxt: | |
name: Polkadot Integration test with subxt | |
runs-on: ubuntu-22.04 | |
needs: linux-x86-64 | |
steps: | |
- name: Checkout sources | |
uses: actions/checkout@v4 | |
# We can't run substrate node as a github actions service, since it requires | |
# command line arguments. See https://github.com/actions/runner/pull/1152 | |
- name: Start substrate | |
run: echo id=$(docker run -d -p 9944:9944 ghcr.io/hyperledger/solang-substrate-ci:62a8a6c substrate-contracts-node --dev --rpc-external -lwarn,runtime::contracts=trace) >> $GITHUB_OUTPUT | |
id: substrate | |
- uses: actions/[email protected] | |
with: | |
name: solang-linux-x86-64 | |
path: bin | |
- run: | | |
chmod 755 ./bin/solang | |
echo "$(pwd)/bin" >> $GITHUB_PATH | |
- name: Install latest rust toolchain | |
uses: dtolnay/rust-toolchain@stable | |
with: | |
toolchain: stable | |
- run: 'parallel solang compile -v --target polkadot --wasm-opt z -o ./contracts/ ::: ../polkadot/*.sol ../polkadot/test/*.sol' | |
working-directory: ./integration/subxt-tests | |
- name: Deploy and test contracts | |
run: cargo test -- --test-threads=1 | |
working-directory: ./integration/subxt-tests | |
- name: cleanup | |
if: always() | |
run: docker kill ${{steps.substrate.outputs.id}} | |
- name: Upload test coverage files | |
uses: actions/[email protected] | |
with: | |
name: polkadot-subxt-tests | |
path: ./target/*.profraw | |
vscode: | |
name: Visual Code Extension | |
runs-on: solang-ubuntu-latest | |
needs: linux-x86-64 | |
steps: | |
- name: Checkout | |
uses: actions/checkout@v4 | |
- uses: actions/[email protected] | |
with: | |
name: solang-linux-x86-64 | |
path: bin | |
- run: | | |
chmod 755 ./bin/solang | |
echo "$(pwd)/bin" >> $GITHUB_PATH | |
- name: Install Node.js | |
uses: actions/setup-node@v4 | |
with: | |
node-version: '>=18.17' | |
- run: npm install | |
working-directory: ./vscode | |
- run: npm run compile | |
working-directory: ./vscode | |
- name: Run headless test | |
run: xvfb-run npm test | |
working-directory: ./vscode | |
- run: npm install -g vsce | |
working-directory: ./vscode | |
- run: vsce package | |
working-directory: ./vscode | |
- name: Upload test coverage files | |
uses: actions/[email protected] | |
with: | |
name: vscode-tests | |
path: ./target/*.profraw | |
std-lib-tests: | |
name: Stdlib | |
runs-on: solang-ubuntu-latest | |
steps: | |
- name: Checkout sources | |
uses: actions/checkout@v4 | |
- name: Lints for stdlib | |
run: | | |
make lint | |
working-directory: ./stdlib | |
- name: Stdlib tests | |
run: | | |
make test | |
./test | |
working-directory: ./stdlib | |
coverage: | |
runs-on: ubuntu-latest | |
name: Coverage report | |
container: ghcr.io/hyperledger/solang-llvm:ci-7 | |
needs: [linux-x86-64, solana, anchor, polkadot, polkadot-subxt, vscode] | |
env: | |
RUSTFLAGS: -C instrument-coverage -C llvm-args=--instrprof-atomic-counter-update-all --cfg=coverage --cfg=trybuild_no_target | |
CARGO_INCREMENTAL: 0 | |
CARGO_LLVM_COV: 1 | |
CARGO_LLVM_COV_TARGET_DIR: ${{ github.workspace }}/target | |
steps: | |
- name: Checkout | |
uses: actions/checkout@v4 | |
with: | |
submodules: recursive | |
- name: Install Rust | |
uses: dtolnay/rust-toolchain@master | |
with: | |
toolchain: 1.75.0 | |
components: llvm-tools | |
- name: Install cargo-llvm-cov | |
uses: taiki-e/install-action@cargo-llvm-cov | |
- name: Download Rust coverage files | |
uses: actions/[email protected] | |
with: | |
name: rust-tests.tar.gz | |
path: ./target | |
- name: Download Solana coverage files | |
uses: actions/[email protected] | |
with: | |
name: solana-tests | |
path: ./target | |
- name: Download Polkadot coverage files | |
uses: actions/[email protected] | |
with: | |
name: polkadot-tests | |
path: ./target | |
- name: Download Polkadot subxt coverage files | |
uses: actions/[email protected] | |
with: | |
name: polkadot-subxt-tests | |
path: ./target | |
- name: Download Anchor coverage files | |
uses: actions/[email protected] | |
with: | |
name: anchor-tests | |
path: ./target | |
- name: Download VSCode coverage files | |
uses: actions/[email protected] | |
with: | |
name: vscode-tests | |
path: ./target | |
- name: Unpack test coverage files | |
run: tar -xf rust-tests.tar.gz | |
working-directory: ./target | |
- name: Generate code report | |
run: cargo llvm-cov report --lcov --output-path lcov.info | |
- name: Upload coverage report to codecov.io | |
uses: codecov/codecov-action@v3 | |
env: | |
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} | |
with: | |
fail_ci_if_error: false |