Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
90 commits
Select commit Hold shift + click to select a range
bb88f3e
feat: generate runtime signer and init validation checks (#4) (#6)
jimmy-claw Feb 20, 2026
474c0ff
feat: support external Instruction enum via #[nssa_program(instructio…
jimmy-claw Feb 20, 2026
40ab93a
feat: support arg-based and multi-seed PDA derivation (#1) (#8)
jimmy-claw Feb 20, 2026
5e3ed33
feat: support variable-length account lists via Vec<AccountWithMetada…
jimmy-claw Feb 20, 2026
1a0eefb
chore: add smoke test script
jimmy-claw Feb 20, 2026
1c6724e
fix: codegen bugs from merged PRs #6 and #9
jimmy-claw Feb 20, 2026
dc79736
feat: migrate all deps from schouhy/full-bedrock-integration to lssa …
jimmy-claw Feb 20, 2026
2b7518c
fix: smoke test finds guest binary in correct path (#12)
jimmy-claw Feb 20, 2026
6395eca
feat: smoke test with sequencer deploy/submit (#14)
jimmy-claw Feb 20, 2026
8b61cab
fix: use nssa_framework:: instead of nssa_framework_core:: in macro c…
jimmy-claw Feb 20, 2026
7f15ec3
Rename nssa-framework → lez-framework (#17)
jimmy-claw Feb 23, 2026
aa6f64b
feat: add lez-client-gen crate for IDL-based client/FFI codegen (#20)
jimmy-claw Feb 24, 2026
f812d36
feat: extend IDL with lssa-lang compatible fields (#18)
jimmy-claw Feb 25, 2026
ece5ad0
fix: cfg-gate generated main() to enable inline unit tests (#25)
danisharora099 Feb 25, 2026
5f4ef34
fix: recognize AccountId as a known IDL type (#28)
jimmy-claw Feb 25, 2026
d5101bb
feat: e2e test suite for scaffold → build → IDL → FFI → test pipeline…
jimmy-claw Feb 25, 2026
8b0d088
fix: replace PDA XOR with SHA-256 concat to match on-chain derivation…
jimmy-claw Feb 25, 2026
5c21f41
feat(ffi-codegen): emit tx-building FFI that calls generated client (…
jimmy-claw Feb 25, 2026
b73b950
fix: pin lssa deps to dee3f7fa (matches logos-scaffold template)
Feb 25, 2026
3476a0b
fix: pin lssa deps to 767b5afd (lssa main HEAD 2026-02-24)
Feb 25, 2026
1e14697
Merge pull request #33 from jimmy-claw/jimmy/pin-lssa-rev
jimmy-claw Feb 25, 2026
c73378a
fix: emit instruction_type in IDL for external instruction enums (#35)
jimmy-claw Feb 26, 2026
d82b485
feat: lez-client-gen generates PDA compute helpers from IDL (#40)
jimmy-claw Feb 26, 2026
a41c9de
feat: lez-client-gen supports u64 arg seeds in PDA helpers
jimmy-claw Feb 26, 2026
7129ac5
fix: emit .to_le_bytes() for u64 arg seeds in instruction builder PDA
jimmy-claw Feb 26, 2026
28a1676
Fix: skip rest:true accounts in required args check (execute without …
Feb 27, 2026
801478f
Fix: skip rest:true accounts in tx building when not provided
Feb 27, 2026
8a276a5
fix: handle rest accounts with 0 entries in display and account_ids
Feb 27, 2026
8149afc
feat(lez-cli): add pda subcommand to compute PDAs from IDL (#47)
jimmy-claw Feb 27, 2026
a041fc4
feat(lez-cli): raw pda command — compute arbitrary PDA without IDL (#49)
jimmy-claw Feb 27, 2026
0d2ee3e
fix: make rest accounts optional in CLI (#43)
jimmy-claw Feb 27, 2026
a567481
fix(lez-cli): raw pda dispatch — program-id consumed by global parser…
jimmy-claw Feb 27, 2026
864fbb5
fix(serialize): handle Vec<u32> — both U32Array and Raw CSV string fo…
jimmy-claw Feb 27, 2026
7b2104b
fix: parse and serialize Vec<u8> and Vec<u32> properly (#53)
jimmy-claw Feb 27, 2026
eed4ad7
fix: correct program-id endianness in hex parsing and PDA derivation …
jimmy-claw Feb 28, 2026
eefd20d
docs: rename to SPEL, update README with acronym and ecosystem table
Feb 28, 2026
233a066
docs: fix SPEL acronym — Smart Program Engine for Logos
Feb 28, 2026
3276fa8
chore: update URLs for logos-co org transfer
Mar 6, 2026
d6992d4
Merge pull request #58 from logos-co/jimmy/logos-co-transfer-urls
vpavlin Mar 9, 2026
976d103
docs: add pda subcommand, Vec types, and --program-id flag to README
Mar 9, 2026
0678a16
Merge pull request #59 from jimmy-claw/jimmy/readme-pda-docs
vpavlin Mar 9, 2026
7cd8189
chore: add PR template with README checklist
jimmy-claw Mar 10, 2026
c117260
feat: add `inspect` subcommand for account data decoding (#60)
Mar 15, 2026
ced4bb6
Merge pull request #72 from jimmy-claw/jimmy/inspect-command
vpavlin Mar 15, 2026
6dd72f6
chore: add PR template with README checklist
jimmy-claw Mar 10, 2026
aa7d5a1
chore: add MIT and Apache-2.0 license files
Mar 15, 2026
b488a91
chore: add PR template with README checklist
jimmy-claw Mar 10, 2026
bebe8c2
feat: expose generic compute_pda() utility in lez-framework-core
Mar 15, 2026
f0a9213
Merge pull request #71 from jimmy-claw/jimmy/expose-compute-pda
vpavlin Mar 15, 2026
8c942d6
Merge branch 'main' into jimmy/pr-template
vpavlin Mar 15, 2026
d64955b
Merge pull request #67 from jimmy-claw/jimmy/pr-template
vpavlin Mar 15, 2026
54fc4f4
fix(init): fix scaffolded projects failing cargo risczero build (#73)
Mar 15, 2026
6465f70
Merge pull request #74 from jimmy-claw/jimmy/fix-init-template
vpavlin Mar 15, 2026
fe457db
Merge branch 'main' into jimmy/add-license-files
vpavlin Mar 16, 2026
021041d
fix(cli)!: remove `-account` suffix
0x-r4bbit Mar 18, 2026
f4370bf
feat(lez-cli): add `generate-idl` subcommand for runtime IDL generation
0x-r4bbit Mar 18, 2026
68e5f6a
fix(init): extract project name from path to support absolute paths
Mar 20, 2026
689207d
Merge pull request #77 from 0x-r4bbit/feat/idl-generation
vpavlin Mar 20, 2026
6674fd0
Merge branch 'main' into fix/remove-account-suffix
vpavlin Mar 20, 2026
5f17f71
Merge branch 'main' into jimmy/fix-init-absolute-path
vpavlin Mar 20, 2026
2785438
feat(client-gen): generate PDA compute and state query helpers
Mar 16, 2026
2953fb1
Merge pull request #76 from 0x-r4bbit/fix/remove-account-suffix
vpavlin Mar 20, 2026
68965b2
Merge branch 'main' into jimmy/fix-init-absolute-path
vpavlin Mar 20, 2026
83e1712
Merge branch 'main' into jimmy/issue-39
vpavlin Mar 20, 2026
046b39a
Merge pull request #80 from jimmy-claw/jimmy/fix-init-absolute-path
vpavlin Mar 20, 2026
4e3396d
Merge branch 'main' into jimmy/issue-39
vpavlin Mar 20, 2026
eb05263
fix(client-gen): use lez_framework_core::pda::compute_pda for correct…
Mar 20, 2026
9d2cd3c
test(fixture): add arg and multi-seed PDA examples to fixture program
Mar 20, 2026
600ea8a
fix(e2e): update instruction count after adding PDA fixtures
Mar 20, 2026
2d6f08b
Merge pull request #75 from jimmy-claw/jimmy/issue-39
vpavlin Mar 20, 2026
bf289dc
Merge branch 'main' into jimmy/add-license-files
vpavlin Mar 20, 2026
d5df688
Merge pull request #69 from jimmy-claw/jimmy/add-license-files
vpavlin Mar 20, 2026
034a39b
rename: lez-* crates to spel-*, binary as spel (fixes #57)
Mar 20, 2026
e45857e
Merge pull request #81 from jimmy-claw/jimmy/issue-57
vpavlin Mar 25, 2026
3621a26
feat: update to latest LEZ (ffcbc159) and fix spel-client-gen API
Mar 31, 2026
e595485
Merge pull request #91 from jimmy-claw/jimmy/update-lssa-latest-clean
vpavlin Mar 31, 2026
57201f6
feat(spel-cli): detect Private/ prefix, build PrivacyPreservingTransa…
jimmy-claw Apr 1, 2026
8f059c2
ci(release): PR-based flow with categorized changelog (#95)
jimmy-claw Apr 1, 2026
d3ccd60
fix(release): add logos-blockchain-circuits to release workflow (#96)
jimmy-claw Apr 1, 2026
93c9aff
fix(release): use gh pr create instead of peter-evans action (#97)
jimmy-claw Apr 1, 2026
05ec85b
fix(release): fix broken YAML in gh pr create body (#98)
jimmy-claw Apr 1, 2026
dc933d9
fix(release): delete stale remote branch before push (#99)
jimmy-claw Apr 1, 2026
8a67c6b
fix(release): create issue with PR link instead of PR directly (#100)
jimmy-claw Apr 1, 2026
c0aabe9
chore: release v0.2.0 (#101)
vpavlin Apr 1, 2026
72fc226
fix(release): split publish into separate workflow triggered on PR me…
jimmy-claw Apr 1, 2026
201fae4
fix(release): fix grep patterns for categorized changelog (#103)
jimmy-claw Apr 1, 2026
16f45bc
feat(spel-cli): detect Private/ prefix, build PrivacyPreservingTransa…
Mar 25, 2026
50baf30
docs: add privacy-preserving programs guide
Mar 25, 2026
b4cf232
docs(privacy): fix outdated types, remove unimplemented sections, add…
Apr 1, 2026
31b344d
docs(privacy): address review comments - fix heading, correct program…
Apr 1, 2026
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
12 changes: 12 additions & 0 deletions .github/PULL_REQUEST_TEMPLATE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
## Description
<!-- What does this PR do? Why? -->

## Changes
<!-- List key changes -->

## Checklist
- [ ] Builds cleanly (`make build` or `cmake --build`)
- [ ] Tests pass (`make test` or `ctest -V`)
- [ ] README updated if new features, CLI commands, or behaviour changed
- [ ] New public methods have doc comments
- [ ] Branch is off `main` (not another feature branch)
113 changes: 107 additions & 6 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,15 +5,116 @@ on:
push:
branches: [main]

env:
CARGO_TERM_COLOR: always

jobs:
test:
name: Tests
unit-tests:
name: Unit Tests
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
- uses: Swatinem/rust-cache@v2
with:
prefix-key: "unit"
- name: Build (framework + codegen)
run: cargo build -p spel-framework -p spel-framework-core -p spel-framework-macros -p spel-client-gen
- name: Unit tests
run: cargo test -p spel-framework-core -p spel-framework-macros -p spel-client-gen

e2e-tests:
name: E2E Tests
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
- uses: Swatinem/rust-cache@v2
- name: Build (core + macros)
run: cargo build -p nssa-framework -p nssa-framework-core -p nssa-framework-macros
- name: Test (core + macros)
run: cargo test -p nssa-framework -p nssa-framework-core -p nssa-framework-macros
with:
prefix-key: "e2e"
- name: Install logos-blockchain-circuits
run: |
curl -sSL https://raw.githubusercontent.com/logos-blockchain/logos-blockchain/main/scripts/setup-logos-blockchain-circuits.sh | bash
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Build (all packages including spel)
run: cargo build -p spel-framework -p spel-framework-core -p spel-framework-macros -p spel-client-gen -p spel
- name: E2E tests
run: cargo test -p spel-framework

privacy-smoke-test:
name: Privacy Smoke Test
runs-on: ubuntu-latest
timeout-minutes: 30
env:
RISC0_VERSION: "3.0.5"
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
- uses: Swatinem/rust-cache@v2
with:
prefix-key: "privacy"

- name: Generate Cargo.lock
run: cargo generate-lockfile
- name: Extract LEZ commit from spel-framework/Cargo.toml
id: lez-ref
run: |
LEZ_REV=$(grep 'nssa_core' spel-framework/Cargo.toml | grep -o 'rev = "[^"]*"' | cut -d'"' -f2)
echo "LEZ_REV=$LEZ_REV" >> $GITHUB_OUTPUT
echo "Using LEZ commit: $LEZ_REV"

- name: Install risc0 toolchain
run: |
curl -L https://risczero.com/install | bash
echo "$HOME/.risc0/bin" >> $GITHUB_PATH
export PATH="$HOME/.risc0/bin:$PATH"
rzup install cargo-risczero ${{ env.RISC0_VERSION }}
rzup install rust

- name: Install logos-blockchain-circuits
run: |
curl -sSL https://raw.githubusercontent.com/logos-blockchain/logos-blockchain/main/scripts/setup-logos-blockchain-circuits.sh | bash
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

- name: Install spel
run: cargo install --path spel-cli --locked

- name: Clone LEZ at correct commit
run: |
git clone --depth 1 https://github.com/logos-blockchain/logos-execution-zone.git /tmp/lssa || true
cd /tmp/lssa
git fetch --depth 1 origin ${{ steps.lez-ref.outputs.LEZ_REV }}
git checkout ${{ steps.lez-ref.outputs.LEZ_REV }}

- name: Cache sequencer
id: cache-seq
uses: actions/cache@v4
with:
path: /tmp/lssa/target/release/sequencer_service
key: sequencer-${{ steps.lez-ref.outputs.LEZ_REV }}

- name: Build sequencer
if: steps.cache-seq.outputs.cache-hit != 'true'
run: |
cd /tmp/lssa
cargo build --release --features standalone -p sequencer_service

- name: Build wallet
run: |
cd /tmp/lssa
cargo build --release -p wallet

- name: Setup wallet
run: |
mkdir -p /tmp/wallet
echo '{"sequencer_addr":"http://127.0.0.1:3040","seq_poll_timeout":"30s","seq_tx_poll_max_blocks":15,"seq_poll_max_retries":10,"seq_block_poll_max_amount":100,"initial_accounts":[{"Public":{"account_id":"CbgR6tj5kWx5oziiFptM7jMvrQeYY3Mzaao6ciuhSr2r","pub_sign_key":"7f273098f25b71e6c005a9519f2678da8d1c7f01f6a27778e2d9948abdf901fb"}},{"Public":{"account_id":"2RHZhw9h534Zr3eq2RGhQete2Hh667foECzXPmSkGni2","pub_sign_key":"f434f8741720014586ae43356d2aec6257da086222f604ddb75d69733b86fc4c"}}]}' > /tmp/wallet/wallet_config.json

- name: Run privacy smoke test
env:
NSSA_WALLET_HOME_DIR: /tmp/wallet
LSSA_DIR: /tmp/lssa
run: |
export PATH="/tmp/lssa/target/release:$PATH"
scripts/smoke-test-privacy.sh /tmp/privacy-smoke
104 changes: 104 additions & 0 deletions .github/workflows/lez-compat.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
name: LEZ Compatibility Check

on:
schedule:
# Every Monday at 06:00 UTC
- cron: '0 6 * * 1'
workflow_dispatch:
inputs:
lez_ref:
description: 'LEZ commit/branch to test against (default: main)'
required: false
default: 'main'

env:
CARGO_TERM_COLOR: always

jobs:
lez-compat:
name: Check SPEL against latest LEZ
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- uses: dtolnay/rust-toolchain@stable

- uses: Swatinem/rust-cache@v2
with:
prefix-key: "lez-compat"

- name: Get latest LEZ commit
id: lez
run: |
REF="${{ github.event.inputs.lez_ref || 'main' }}"
COMMIT=$(git ls-remote https://github.com/logos-blockchain/logos-execution-zone.git "$REF" | head -1 | cut -f1)
echo "commit=$COMMIT" >> "$GITHUB_OUTPUT"
echo "ref=$REF" >> "$GITHUB_OUTPUT"
echo "🔍 Testing against LEZ $REF ($COMMIT)"

- name: Update LEZ deps to latest
run: |
COMMIT="${{ steps.lez.outputs.commit }}"
echo "Updating all LEZ deps to $COMMIT"

# Find all Cargo.toml files with LEZ git deps
find . -name Cargo.toml -exec grep -l 'logos-execution-zone\|logos-blockchain/lssa' {} \; | while read f; do
# Update rev= pins
sed -i "s|rev = \"[a-f0-9]\{40\}\"|rev = \"$COMMIT\"|g" "$f"
# Ensure URL points to new repo name
sed -i "s|logos-blockchain/lssa\.git|logos-blockchain/logos-execution-zone.git|g" "$f"
echo " Updated: $f"
done

- name: cargo check (spel-cli)
run: cargo check -p spel-cli

- name: cargo check (spel-framework)
run: cargo check -p spel-framework

- name: cargo check (spel-framework-core)
run: cargo check -p spel-framework-core

- name: Report
if: always()
run: |
echo "## LEZ Compatibility Report" >> "$GITHUB_STEP_SUMMARY"
echo "- **LEZ ref:** ${{ steps.lez.outputs.ref }}" >> "$GITHUB_STEP_SUMMARY"
echo "- **LEZ commit:** \`${{ steps.lez.outputs.commit }}\`" >> "$GITHUB_STEP_SUMMARY"
echo "- **SPEL ref:** \`$(git rev-parse HEAD)\`" >> "$GITHUB_STEP_SUMMARY"

- name: Create issue on failure
if: failure()
uses: actions/github-script@v7
with:
script: |
const commit = '${{ steps.lez.outputs.commit }}';
const ref = '${{ steps.lez.outputs.ref }}';
const title = `LEZ compatibility broken (${ref}: ${commit.slice(0, 8)})`;

// Check for existing open issue
const existing = await github.rest.issues.listForRepo({
owner: context.repo.owner,
repo: context.repo.repo,
state: 'open',
labels: 'lez-compat',
per_page: 1,
});

if (existing.data.length > 0) {
// Comment on existing issue
await github.rest.issues.createComment({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: existing.data[0].number,
body: `Still broken as of LEZ \`${commit}\` (${ref}).\n\nRun: ${context.serverUrl}/${context.repo.owner}/${context.repo.repo}/actions/runs/${context.runId}`,
});
} else {
await github.rest.issues.create({
owner: context.repo.owner,
repo: context.repo.repo,
title,
labels: ['lez-compat'],
body: `The weekly LEZ compatibility check failed.\n\n- **LEZ ref:** ${ref}\n- **LEZ commit:** \`${commit}\`\n- **Run:** ${context.serverUrl}/${context.repo.owner}/${context.repo.repo}/actions/runs/${context.runId}\n\nPlease update SPEL to match the latest LEZ API changes.`,
});
}
45 changes: 45 additions & 0 deletions .github/workflows/publish.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
name: Publish Release

on:
pull_request:
types: [closed]
branches: [main]

jobs:
publish-release:
name: Publish Release
runs-on: ubuntu-latest
if: github.event.pull_request.merged == true && startsWith(github.head_ref, 'release/v')
permissions:
contents: write

steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0

- name: Extract version from branch
id: version
run: |
VERSION=${GITHUB_HEAD_REF#release/v}
echo "version=$VERSION" >> $GITHUB_OUTPUT
echo "Extracted version: $VERSION"

- name: Create GitHub Release
uses: softprops/action-gh-release@v2
with:
tag_name: v${{ steps.version.outputs.version }}
name: v${{ steps.version.outputs.version }}
body: |
## v${{ steps.version.outputs.version }}

See [CHANGELOG.md](https://github.com/logos-co/spel/blob/main/CHANGELOG.md) for full details.

---

**Installation** (Cargo.toml):
```toml
spel-framework = { git = "https://github.com/logos-co/spel.git", tag = "v${{ steps.version.outputs.version }}" }
```
draft: false
prerelease: false
Loading