Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
63 commits
Select commit Hold shift + click to select a range
ad39aef
Update CCL to 0.7.2
Jun 10, 2026
16f93c1
Standardize on Oracle GraalVM 25.0.3
Jun 10, 2026
108469d
Add categorized TODO.md backlog
Jun 10, 2026
89fa331
Pin CI/release to Oracle GraalVM 25.0.3
Jun 10, 2026
0e937e7
Correct JS parity item in TODO after source verification
Jun 10, 2026
89e0db7
Add Python wrapper README and runnable offline examples
Jun 10, 2026
aa67ffe
Add Go wrapper README and runnable offline examples
Jun 10, 2026
7427105
Add Rust wrapper README and runnable offline examples
Jun 10, 2026
1ddd92e
Add JS wrapper README and offline examples
Jun 10, 2026
94b783e
Check off per-wrapper README/examples in TODO
Jun 10, 2026
679a3fc
Note JS examples now verified running under Bun
Jun 10, 2026
03012e8
Fix CI: set up Go and Rust toolchains
Jun 10, 2026
29c7b50
Set native-image -R:StackSize=16m for Go cgo on Linux
Jun 10, 2026
aab4395
CI: make Linux Go test non-blocking (known cgo thread-affinity issue)
Jun 10, 2026
bc2fa6f
Fix Go wrapper thread affinity; restore blocking Linux Go CI
Jun 10, 2026
efd3acc
Mark Go thread-affinity fixed; update Go README threading note
Jun 10, 2026
3b98f07
CI/release: build libccl.dll on Windows
Jun 10, 2026
b4258d4
Mark Windows DLL build done; add Windows wrapper-test follow-up
Jun 10, 2026
394c450
CI: run wrapper integration tests against Yaci DevKit
Jun 10, 2026
828dd27
DEBUG: dump DevKit protocol params in integration workflow
Jun 10, 2026
d06626e
Fill Conway gov param defaults from the Yaci provider
Jun 10, 2026
119fefd
test: fund governance proposal accounts above the 1000 ADA deposit
Jun 10, 2026
48ad9e3
Fix register_pool reward account; surface tx-submit errors
Jun 10, 2026
0c6eade
Fix remaining governance integration tests
Jun 10, 2026
c1213ca
Fix JS governance integration tests (mirror Python)
Jun 10, 2026
7f3c7b2
TODO: add consumer-experience smoothness items
Jun 11, 2026
3ea31d4
Add Javadoc to the public C-API surface
Jun 11, 2026
ddbea3d
TODO: add Satya's wishlist (TxPlan YAML, client-side UTxO selection, …
Jun 11, 2026
d2ad9e2
Core: replace bespoke JSON tx-spec with CCL TxPlan (YAML), build offline
Jun 11, 2026
c633e2c
Go wrapper: thin TxPlan YAML build + native reflection config
Jun 11, 2026
b90494b
Go tests: migrate QuickTx tests to the TxPlan YAML API
Jun 11, 2026
041870a
Return the build result as YAML instead of JSON
Jun 11, 2026
843707e
Python wrapper: migrate to thin TxPlan YAML build
Jun 11, 2026
5ea5344
Rust wrapper: migrate to thin TxPlan YAML build
Jun 11, 2026
e4fb1c0
JS wrapper: migrate to thin TxPlan YAML build
Jun 11, 2026
1133d53
CI: run on develop too (push + pull_request)
Jun 11, 2026
1c4c0c0
docs: rewrite quicktx.md for TxPlan (YAML)
Jun 11, 2026
270b946
CI: install wrapper YAML deps (pyyaml, bun yaml)
Jun 11, 2026
3412bdd
Test metadata intent (verified shape) + document it
Jun 11, 2026
60c5876
Plutus script transactions: offline build via caller-supplied exec units
Jun 11, 2026
2698794
Test governance/staking/DRep/voting intents end-to-end (Go + fixtures)
Jun 12, 2026
7ec4eff
Cover stake pools end-to-end (Go) + register cert reflection
Jun 12, 2026
4d454ba
Cover Plutus script spend (script_collect_from) end-to-end (Go)
Jun 12, 2026
f2cc845
Cover native mint / native-script / explicit + reference inputs (Go E2E)
Jun 12, 2026
8ec0ecc
Cover Plutus script mint end-to-end (Go) — full intent parity
Jun 12, 2026
64fff8a
Cover metadata intent end-to-end (Go) — 100% intent parity
Jun 12, 2026
c35624e
Intent E2E parity across all wrappers (Python, Rust, JS) + shared fix…
Jun 12, 2026
ba4552b
docs: update CCL version references to 0.8.0-pre4
Jun 12, 2026
5e143cf
Cover compose mode (multiple senders -> one tx) end-to-end
Jun 12, 2026
f356ef6
Stake/DRep-key signing: ccl_account_sign_tx_multi + wrappers
Jun 12, 2026
7eeb3a6
DevKit submit-tests for 6 intents (build -> sign -> submit -> on-chain)
Jun 12, 2026
f7f8cdf
DevKit submit-tests: verify via node acceptance; fix donation + deposits
Jun 12, 2026
a575dbb
DevKit submit-tests: set Conway deposits unconditionally
Jun 12, 2026
b8b7177
DevKit submit-tests: register stake address before the info proposal
Jun 12, 2026
2c294b1
DevKit submit-test for native mint (no-signature policy)
Jun 12, 2026
4154be7
DevKit submit-test for Plutus spend (lock-then-spend)
Jun 12, 2026
a34020c
DevKit submit-tests for the prerequisite-heavy intents
Jun 12, 2026
c058657
DevKit submit-tests: fix stake withdrawal/delegation + add depth checks
Jun 12, 2026
1310a3a
Merge pull request #2 from bloxbean/feature/txplan-yaml
matiwinnetou Jun 12, 2026
57340d1
TODO: track client-side chain-data provider helpers (§2c)
Jun 25, 2026
9c7541d
Portable Linux libccl.so (glibc ≥ 2.17 baseline build) (#3)
matiwinnetou Jun 26, 2026
a773333
docs: introduce Architecture Decision Records (ADRs) (#4)
matiwinnetou Jun 26, 2026
746b51a
test(js): cover Plutus/script paths (lock fixture + DevKit mint round…
matiwinnetou Jun 26, 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
33 changes: 28 additions & 5 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
name: CI
on:
push:
branches: [main]
branches: [main, develop]
pull_request:
branches: [main]
branches: [main, develop]

jobs:
test:
Expand All @@ -19,11 +19,15 @@ jobs:
- uses: actions/checkout@v4
- uses: graalvm/setup-graalvm@v1
with:
java-version: '25'
java-version: '25.0.3'
distribution: 'graalvm'
- uses: oven-sh/setup-bun@v2
- name: Install pytest
run: python3 -m pip install --break-system-packages pytest
- uses: actions/setup-go@v5
with:
go-version: 'stable'
- uses: dtolnay/rust-toolchain@stable
- name: Install Python test deps
run: python3 -m pip install --break-system-packages pytest pyyaml
- name: Build native library
run: ./gradlew :core:nativeCompile
- name: Run JVM tests
Expand All @@ -38,3 +42,22 @@ jobs:
run: ./gradlew :wrappers:rust:test
- name: Run JS tests
run: ./gradlew :wrappers:js:test

# Windows: verify the native library (libccl.dll) builds and core logic passes.
# Wrapper test coverage on Windows (Go cgo, C Makefile, etc.) is tracked separately
# in TODO.md.
windows:
runs-on: windows-latest
defaults:
run:
shell: bash
steps:
- uses: actions/checkout@v4
- uses: graalvm/setup-graalvm@v1
with:
java-version: '25.0.3'
distribution: 'graalvm'
- name: Build native library (libccl.dll)
run: ./gradlew :core:nativeCompile
- name: Run JVM tests
run: ./gradlew :core:test
76 changes: 76 additions & 0 deletions .github/workflows/integration-tests.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
name: Integration Tests (DevKit)

# Runs the wrappers' integration tests against a local Yaci DevKit Cardano devnet.
# These exercise real build -> sign -> submit round trips. The devnet's admin API is
# exposed on :10000. Heavier than the unit CI, so it runs on PRs to main/develop and on demand.
on:
pull_request:
branches: [main, develop]
workflow_dispatch:

jobs:
integration-tests:
name: Integration Tests (Cardano Dev-Net)
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: graalvm/setup-graalvm@v1
with:
java-version: '25.0.3'
distribution: 'graalvm'
- uses: oven-sh/setup-bun@v2
- uses: actions/setup-go@v5
with:
go-version: 'stable'
- uses: dtolnay/rust-toolchain@stable
# Node.js is needed for the npm-based yaci-devkit CLI.
- uses: actions/setup-node@v4
with:
node-version: '20'
- name: Install Python test deps
run: python3 -m pip install --break-system-packages pytest pyyaml

- name: Install Yaci DevKit
run: npm install -g @bloxbean/yaci-devkit

# Start the devnet in the background; it warms up while the native lib builds.
- name: Start Yaci DevKit
run: nohup yaci-devkit up --enable-yaci-store > devkit.log 2>&1 &

- name: Build native library
run: ./gradlew :core:nativeCompile

- name: Wait for DevKit admin API (:10000)
run: |
echo "Waiting for Yaci DevKit admin API..."
for i in $(seq 1 60); do
if curl -sf http://localhost:10000/local-cluster/api/admin/devnet >/dev/null 2>&1; then
echo "DevKit is ready (attempt $i)."
exit 0
fi
echo "Attempt $i/60 - not ready yet, waiting 5s..."
sleep 5
done
echo "DevKit did not become ready in time." >&2
exit 1

- name: Python integration tests
run: ./gradlew :wrappers:python:integrationTest

# The Go and Rust test tasks already include their integration tests, which
# skip themselves when DevKit is down and run when it is up.
- name: Go integration tests
run: ./gradlew :wrappers:go:test

- name: Rust integration tests
run: ./gradlew :wrappers:rust:test

- name: JS integration tests
run: ./gradlew :wrappers:js:integrationTest

- name: Upload DevKit log on failure
if: failure()
uses: actions/upload-artifact@v4
with:
name: devkit-log
path: devkit.log
116 changes: 116 additions & 0 deletions .github/workflows/portable-linux-lib.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,116 @@
name: Portable Linux lib (glibc baseline)

# Guards the distro-portability of the shipped libccl.so. native-image can't emit a static library
# (oracle/graal#3053), so portability is achieved by building the .so against an OLD glibc baseline:
# inside manylinux_2_28 the resulting lib references no symbol newer than GLIBC_2.17, so it runs on
# RHEL/CentOS 7+, Amazon Linux 2, Ubuntu 18.04+, Debian 9+ and every newer distro. See
# docs/adr/0008-linux-glibc-baseline-portability.md. This builds it, asserts the glibc floor, proves it
# actually runs on glibc 2.17 (centos:7) — catching any regression that pulls in a newer symbol.

on:
pull_request:
push:
branches: [develop, main]
workflow_dispatch:

jobs:
glibc-baseline:
name: Build libccl.so on glibc 2.28 baseline (manylinux_2_28)
runs-on: ubuntu-latest
container:
image: quay.io/pypa/manylinux_2_28_x86_64
env:
GRAALVM_URL: https://download.oracle.com/graalvm/25/archive/graalvm-jdk-25.0.3_linux-x64_bin.tar.gz
# The guarantee: the .so must require no glibc symbol newer than the builder's glibc (2.28).
# (In practice native-image tops out at 2.17 — the centos:7 job below enforces that strictly.)
BASELINE: "2.28"
steps:
- uses: actions/checkout@v4

- name: Show build-container glibc
run: ldd --version | head -1

- name: Ensure build prerequisites (gcc toolset, zlib headers)
run: |
set -eux
gcc --version | head -1 || dnf install -y gcc
dnf install -y zlib-devel || true

- name: Install Oracle GraalVM 25.0.3
run: |
set -eux
mkdir -p /opt/graalvm
curl -fsSL -o /tmp/graalvm.tar.gz "$GRAALVM_URL"
tar xzf /tmp/graalvm.tar.gz -C /opt/graalvm --strip-components=1
echo "JAVA_HOME=/opt/graalvm" >> "$GITHUB_ENV"
echo "/opt/graalvm/bin" >> "$GITHUB_PATH"

- name: Toolchain versions
run: |
set -eux
"$JAVA_HOME/bin/java" -version
"$JAVA_HOME/bin/native-image" --version

- name: Build native library
run: ./gradlew :core:nativeCompile --no-daemon --stacktrace

- name: Assert glibc floor (<= 2.28)
run: |
set -eux
SO=core/build/native/nativeCompile/libccl.so
test -f "$SO"
objdump -T "$SO" | grep -oE 'GLIBC_[0-9]+\.[0-9]+(\.[0-9]+)?' | sort -uV > /tmp/syms.txt
echo "---- GLIBC symbol versions required ----"; cat /tmp/syms.txt
MAX=$(sed 's/GLIBC_//' /tmp/syms.txt | sort -V | tail -1)
echo "---- Max required: GLIBC_$MAX (guarantee: <= $BASELINE) ----"
HIGHER=$(printf '%s\n%s\n' "$MAX" "$BASELINE" | sort -V | tail -1)
if [ "$HIGHER" != "$BASELINE" ]; then
echo "FAIL: libccl.so requires GLIBC_$MAX, newer than baseline GLIBC_$BASELINE"
exit 1
fi
echo "PASS: libccl.so runs on any system with glibc >= $MAX"

- name: Compile the smoke harness against libccl.so
run: |
set -eux
ND=core/build/native/nativeCompile
gcc native-test/src/smoke.c -I"$ND" -L"$ND" -lccl -Wl,-rpath,'$ORIGIN' -o "$ND/smoke"

- name: Stage runnable artifact (lib + harness together)
run: |
set -eux
mkdir -p dist
cp core/build/native/nativeCompile/libccl.so dist/
cp core/build/native/nativeCompile/smoke dist/

- uses: actions/upload-artifact@v4
with:
name: libccl-glibc-baseline
path: dist/

run-on-old-distro:
name: Run libccl.so on glibc 2.17 (centos:7)
needs: glibc-baseline
runs-on: ubuntu-latest
steps:
- uses: actions/download-artifact@v4
with:
name: libccl-glibc-baseline
path: dist

# Run the prebuilt binary inside centos:7 (glibc 2.17) WITHOUT installing anything. This is a
# strict run-on-2.17 guard: if some change pushes the required glibc above 2.17, the loader
# here fails. We don't use a `container:` for the job because GitHub's node-based actions can't
# run inside glibc 2.17; `docker run` keeps the actions on the modern runner.
- name: Load + run on centos:7
run: |
set -eux
chmod +x dist/smoke
docker run --rm -v "$PWD/dist:/work" -w /work centos:7 bash -c '
set -eux
ldd --version | head -1
echo "---- libccl.so shared-lib deps on this host ----"
ldd ./libccl.so
echo "---- running harness ----"
./smoke
'
63 changes: 56 additions & 7 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,37 +4,86 @@ on:
tags: ['v*']

jobs:
build:
# macOS + Windows: stable ABIs, no glibc-portability concern. Built on the native runner.
build-native:
strategy:
matrix:
include:
- os: macos-14
platform: macos-aarch64
ext: dylib
- os: ubuntu-latest
platform: linux-x86_64
ext: so
- os: windows-latest
platform: windows-x86_64
ext: dll
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v4
- uses: graalvm/setup-graalvm@v1
with:
java-version: '25'
java-version: '25.0.3'
distribution: 'graalvm'
- name: Build native library
run: ./gradlew :core:nativeCompile
- name: Package
shell: bash
run: |
cd core/build/native/nativeCompile
# On Windows native-image also emits an import library (libccl.lib) needed
# to link against the DLL; include it when present.
EXTRA=""
[ -f libccl.lib ] && EXTRA="libccl.lib"
tar czf ccl-bridge-${{ github.ref_name }}-${{ matrix.platform }}.tar.gz \
libccl.${{ matrix.ext }} libccl.h graal_isolate.h
libccl.${{ matrix.ext }} libccl.h graal_isolate.h $EXTRA
- uses: actions/upload-artifact@v4
with:
name: ccl-bridge-${{ matrix.platform }}
path: core/build/native/nativeCompile/ccl-bridge-*.tar.gz

# Linux: built in an OLD-glibc container (manylinux_2_28) so the shipped libccl.so runs on
# glibc >= 2.17 (RHEL/CentOS 7+, Amazon Linux 2, Ubuntu 18.04+, Debian 9+) instead of only the
# very newest distros. Portability is verified continuously by portable-linux-lib.yml; here we
# re-assert the floor before shipping. See docs/adr/0008-linux-glibc-baseline-portability.md.
build-linux:
name: build (linux-x86_64, glibc 2.17 baseline)
runs-on: ubuntu-latest
container:
image: quay.io/pypa/manylinux_2_28_x86_64
env:
GRAALVM_URL: https://download.oracle.com/graalvm/25/archive/graalvm-jdk-25.0.3_linux-x64_bin.tar.gz
steps:
- uses: actions/checkout@v4
- name: Ensure build prerequisites
run: dnf install -y zlib-devel || true
- name: Install Oracle GraalVM 25.0.3
run: |
set -eux
mkdir -p /opt/graalvm
curl -fsSL -o /tmp/graalvm.tar.gz "$GRAALVM_URL"
tar xzf /tmp/graalvm.tar.gz -C /opt/graalvm --strip-components=1
echo "JAVA_HOME=/opt/graalvm" >> "$GITHUB_ENV"
echo "/opt/graalvm/bin" >> "$GITHUB_PATH"
- name: Build native library
run: ./gradlew :core:nativeCompile --no-daemon --stacktrace
- name: Assert glibc floor (<= 2.28)
run: |
set -eux
SO=core/build/native/nativeCompile/libccl.so
MAX=$(objdump -T "$SO" | grep -oE 'GLIBC_[0-9]+\.[0-9]+(\.[0-9]+)?' | sed 's/GLIBC_//' | sort -V | tail -1)
echo "libccl.so max required: GLIBC_$MAX"
HIGHER=$(printf '%s\n2.28\n' "$MAX" | sort -V | tail -1)
[ "$HIGHER" = "2.28" ] || { echo "FAIL: requires GLIBC_$MAX > 2.28"; exit 1; }
- name: Package
run: |
cd core/build/native/nativeCompile
tar czf ccl-bridge-${{ github.ref_name }}-linux-x86_64.tar.gz \
libccl.so libccl.h graal_isolate.h
- uses: actions/upload-artifact@v4
with:
name: ccl-bridge-linux-x86_64
path: core/build/native/nativeCompile/ccl-bridge-*.tar.gz

release:
needs: build
needs: [build-native, build-linux]
runs-on: ubuntu-latest
permissions:
contents: write
Expand Down
2 changes: 1 addition & 1 deletion CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,4 @@

- **Cardano Client Lib (CCL)**: https://github.com/bloxbean/cardano-client-lib
- **Local CCL source**: `/Users/satya/work/bloxbean/reference/cardano-client-lib`
- **Target CCL version**: 0.7.1
- **Target CCL version**: 0.8.0-pre4
11 changes: 8 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ ccl-bridge/
**For core developers** (building from source):
- **[GraalVM 25+](https://www.graalvm.org/)** (includes `native-image`)
```bash
sdk install java 25.0.2-graal # via SDKMAN
sdk install java 25.0.3-graal # Oracle GraalVM, via SDKMAN
```

**Language runtimes (install whichever you need):**
Expand Down Expand Up @@ -138,6 +138,11 @@ curl -L https://github.com/bloxbean/ccl-bridge/releases/latest/download/ccl-brid
curl -L https://github.com/bloxbean/ccl-bridge/releases/latest/download/ccl-bridge-v0.1.0-linux-x86_64.tar.gz | tar xz -C /usr/local/lib/
```

> The Linux `libccl.so` is built against an old **glibc 2.17** baseline (in a `manylinux_2_28`
> container), so it runs on any glibc ≥ 2.17 — RHEL/CentOS 7+, Amazon Linux 2, Ubuntu 18.04+,
> Debian 9+, and all newer distros. (It does **not** run on musl-only systems such as Alpine; a
> musl variant is a possible future addition.) See [ADR-0008](docs/adr/0008-linux-glibc-baseline-portability.md) for the why.

Then set the library path:

```bash
Expand Down Expand Up @@ -396,8 +401,8 @@ bridge.close();

## Upstream

- **Cardano Client Lib**: [bloxbean/cardano-client-lib](https://github.com/bloxbean/cardano-client-lib) v0.7.1
- **GraalVM**: 25.0.2 (`native-image --shared`)
- **Cardano Client Lib**: [bloxbean/cardano-client-lib](https://github.com/bloxbean/cardano-client-lib) v0.8.0-pre4
- **GraalVM**: Oracle GraalVM 25.0.3 (`native-image --shared`)

## License

Expand Down
Loading
Loading