Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
221 changes: 221 additions & 0 deletions .github/workflows/contract.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,221 @@
name: Smart Contract CI

on:
push:
branches: [main, develop]
paths:
- 'stellar-contract/**'
- 'packages/contracts/**'
- 'Cargo.toml'
- 'Cargo.lock'
pull_request:
branches: [main]
paths:
- 'stellar-contract/**'
- 'packages/contracts/**'
- 'Cargo.toml'
- 'Cargo.lock'
workflow_dispatch:

env:
CARGO_TERM_COLOR: always
RUSTFLAGS: -D warnings

jobs:
# ============================================
# Lint Job
# ============================================
lint:
name: Lint
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4

- name: Install Rust toolchain
uses: actions-rs/toolchain@v1
with:
toolchain: stable
components: rustfmt, clippy
target: wasm32-unknown-unknown
override: true

- name: Cache Cargo registry
uses: actions/cache@v3
with:
path: |
~/.cargo/registry
~/.cargo/git
key: ${{ runner.os }}-cargo-registry-${{ hashFiles('**/Cargo.lock') }}
restore-keys: |
${{ runner.os }}-cargo-registry-

- name: Cache Cargo target
uses: actions/cache@v3
with:
path: target
key: ${{ runner.os }}-cargo-target-${{ hashFiles('**/Cargo.lock') }}
restore-keys: |
${{ runner.os }}-cargo-target-

- name: Run cargo fmt
run: cargo fmt --all -- --check

- name: Run cargo clippy
run: cargo clippy --all-targets --all-features -- -D warnings

# ============================================
# Test Job
# ============================================
test:
name: Test
runs-on: ubuntu-latest
needs: lint
steps:
- name: Checkout code
uses: actions/checkout@v4

- name: Install Rust toolchain
uses: actions-rs/toolchain@v1
with:
toolchain: stable
target: wasm32-unknown-unknown
override: true

- name: Cache Cargo registry
uses: actions/cache@v3
with:
path: |
~/.cargo/registry
~/.cargo/git
key: ${{ runner.os }}-cargo-registry-${{ hashFiles('**/Cargo.lock') }}
restore-keys: |
${{ runner.os }}-cargo-registry-

- name: Cache Cargo target
uses: actions/cache@v3
with:
path: target
key: ${{ runner.os }}-cargo-target-${{ hashFiles('**/Cargo.lock') }}
restore-keys: |
${{ runner.os }}-cargo-target-

- name: Run cargo test
run: cargo test --workspace --verbose

- name: Upload test results
uses: actions/upload-artifact@v4
if: always()
with:
name: test-results
path: target/debug/

# ============================================
# Build Job
# ============================================
build:
name: Build WASM
runs-on: ubuntu-latest
needs: test
steps:
- name: Checkout code
uses: actions/checkout@v4

- name: Install Rust toolchain
uses: actions-rs/toolchain@v1
with:
toolchain: stable
target: wasm32-unknown-unknown
override: true

- name: Cache Cargo registry
uses: actions/cache@v3
with:
path: |
~/.cargo/registry
~/.cargo/git
key: ${{ runner.os }}-cargo-registry-${{ hashFiles('**/Cargo.lock') }}
restore-keys: |
${{ runner.os }}-cargo-registry-

- name: Cache Cargo target
uses: actions/cache@v3
with:
path: target
key: ${{ runner.os }}-cargo-target-${{ hashFiles('**/Cargo.lock') }}
restore-keys: |
${{ runner.os }}-cargo-target-

- name: Build WASM
run: |
cargo build --target wasm32-unknown-unknown --release
cargo build --workspace --release

- name: List built artifacts
run: |
echo "📦 Built artifacts:"
find target/wasm32-unknown-unknown/release -name "*.wasm" -type f | while read -r file; do
echo " - $file ($(du -h "$file" | cut -f1))"
done

- name: Upload WASM artifacts
uses: actions/upload-artifact@v4
with:
name: wasm-artifacts
path: target/wasm32-unknown-unknown/release/*.wasm

# ============================================
# Coverage Job
# ============================================
coverage:
name: Coverage
runs-on: ubuntu-latest
needs: test
steps:
- name: Checkout code
uses: actions/checkout@v4

- name: Install Rust toolchain
uses: actions-rs/toolchain@v1
with:
toolchain: stable
target: wasm32-unknown-unknown
override: true

- name: Cache Cargo registry
uses: actions/cache@v3
with:
path: |
~/.cargo/registry
~/.cargo/git
key: ${{ runner.os }}-cargo-registry-${{ hashFiles('**/Cargo.lock') }}
restore-keys: |
${{ runner.os }}-cargo-registry-

- name: Cache Cargo target
uses: actions/cache@v3
with:
path: target
key: ${{ runner.os }}-cargo-target-${{ hashFiles('**/Cargo.lock') }}
restore-keys: |
${{ runner.os }}-cargo-target-

- name: Install cargo-tarpaulin
run: cargo install cargo-tarpaulin

- name: Run coverage
run: cargo tarpaulin --workspace --out Xml --output-dir coverage/

- name: Upload coverage report
uses: actions/upload-artifact@v4
with:
name: coverage-report
path: coverage/

- name: Upload coverage to Codecov
uses: codecov/codecov-action@v3
with:
files: coverage/cobertura.xml
flags: unittests
name: codecov-umbrella
fail_ci_if_error: false
53 changes: 8 additions & 45 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -288,51 +288,14 @@ MIT — see [LICENSE](./LICENSE) for details.

*Built with ❤️ on the Stellar network. Inspired by [StrellerMinds](https://github.com/StarkMindsHQ) by StarkMindsHQ.*

## Development Setup
## CI Status

### Prerequisites
[![Smart Contract CI](https://github.com/BrainTease/Brain-Storm/actions/workflows/contract.yml/badge.svg)](https://github.com/BrainTease/Brain-Storm/actions/workflows/contract.yml)

- Rust stable (latest)
- Soroban SDK v20.0.0+
- Stellar CLI v20.0.0+
The CI workflow runs on every push and PR, ensuring code quality and functionality.

### Installation

```bash
# Install Rust
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

# Install Soroban CLI
cargo install soroban-cli

# Install wasm-opt (optional, for optimization)
# macOS
brew install binaryen

# Ubuntu
sudo apt-get install binaryen
# Build all contracts
cargo build --target wasm32-unknown-unknown --release

# Build specific contract
cd stellar-contract
cargo build --target wasm32-unknown-unknown --release
# Deploy contract
soroban contract deploy \
--wasm target/wasm32-unknown-unknown/release/scavenger_contract.wasm \
--network testnet \
--source-account $DEPLOYER_SECRET

# Initialize contract
soroban contract invoke \
--id CONTRACT_ID \
--network testnet \
--source-account $DEPLOYER_SECRET \
-- initialize \
--admin $ADMIN_ADDRESS
# Deploy to mainnet
soroban contract deploy \
--wasm target/wasm32-unknown-unknown/release/scavenger_contract.wasm \
--network mainnet \
--source-account $DEPLOYER_SECRET
git status
### Workflow Steps
1. **Lint** - `cargo fmt` and `cargo clippy`
2. **Test** - `cargo test` with coverage
3. **Build** - WASM compilation
4. **Coverage** - Code coverage reporting
39 changes: 39 additions & 0 deletions scripts/ci-local.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
#!/bin/bash
# Run CI checks locally before pushing

set -e

GREEN='\033[0;32m'
YELLOW='\033[1;33m'
RED='\033[0;31m'
NC='\033[0m'

echo -e "${YELLOW}🔍 Running CI checks locally...${NC}"

# Check Rust installation
if ! command -v cargo &> /dev/null; then
echo -e "${RED}❌ Rust not found. Please install Rust first.${NC}"
exit 1
fi

# Run fmt
echo -e "${YELLOW}📝 Checking formatting...${NC}"
cargo fmt --all -- --check
echo -e "${GREEN}✅ Formatting check passed${NC}"

# Run clippy
echo -e "${YELLOW}🔎 Running clippy...${NC}"
cargo clippy --all-targets --all-features -- -D warnings
echo -e "${GREEN}✅ Clippy check passed${NC}"

# Run tests
echo -e "${YELLOW}🧪 Running tests...${NC}"
cargo test --workspace --verbose
echo -e "${GREEN}✅ Tests passed${NC}"

# Build WASM
echo -e "${YELLOW}🔨 Building WASM...${NC}"
cargo build --target wasm32-unknown-unknown --release
echo -e "${GREEN}✅ Build passed${NC}"

echo -e "${GREEN}🎉 All CI checks passed locally!${NC}"
Loading