Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
45 commits
Select commit Hold shift + click to select a range
0829976
build: version releases automatically instead of shipping versionCode…
aruokhai Aug 13, 2026
8fc8f97
refactor(cosigner): delete the actor registry, serve one wallet over …
aruokhai Sep 12, 2026
00cdf87
refactor(cosigner): strip SharedServices, port the last ceremonies to…
aruokhai Sep 12, 2026
b19652f
refactor(cosigner): rename the crate to `cosigner`, merge the actor i…
aruokhai Sep 12, 2026
4c7fbdb
refactor(cosigner): drop the transaction log, rename SharedServices t…
aruokhai Sep 12, 2026
141c29f
refactor(cosigner): drop the lookup RPCs, fix ark's signing/client fe…
aruokhai Sep 12, 2026
026d7b4
refactor(cosigner): the caller drives the ASP; the cosigner signs
aruokhai Sep 12, 2026
f339351
refactor(cosigner): DKG as one bidirectional session, two exchanges
aruokhai Sep 12, 2026
fbf1561
refactor(cosigner): one onboarding file under handlers, contracts gon…
aruokhai Sep 12, 2026
42b1245
refactor(cosigner): delete CosignerState, the projection of a split t…
aruokhai Sep 12, 2026
4ba1330
refactor(cosigner): push goes to the host; no outbound sockets left
aruokhai Sep 12, 2026
61a648a
refactor(cosigner): one Store — upstreams and kv_store merged into it
aruokhai Sep 12, 2026
f176bab
refactor(cosigner): one service, one gRPC surface
aruokhai Sep 12, 2026
52e5705
fix(cosigner): authenticate the ceremony streams; one VTXO set, not two
aruokhai Sep 13, 2026
0448c58
fix(cosigner): the caller supplies its VTXO set; the cosigner validat…
aruokhai Sep 13, 2026
2a86be7
refactor(app-core): prune the client surface the cosigner no longer has
aruokhai Sep 13, 2026
f8f30ca
feat(cosigner): a settle watch, against enclave-runtime's tasks and n…
aruokhai Sep 13, 2026
7fbf5f5
chore: remove the Nitro EIF deployment
aruokhai Sep 13, 2026
bb90be3
refactor(cosigner): a wasm32-wasip2 component, without tonic or SQLite
aruokhai Sep 13, 2026
51b89e5
feat(app-core,app): the client and app onto the gRPC cosigner
aruokhai Sep 13, 2026
e0e411b
feat(cosigner,protocol): the runtime authenticates, and the cosigner …
aruokhai Sep 16, 2026
c792cc5
feat(enclave-client): verify what enclave-runtime actually attests
aruokhai Sep 16, 2026
45a4f60
feat(app-core,e2e): an attested gate, a pinned channel, and the suite…
aruokhai Sep 16, 2026
91335c7
feat(cli): a Dart REPL against the cosigner in a dev enclave
aruokhai Sep 16, 2026
ec42e60
feat(app): passkeys through the enclave gate
aruokhai Sep 16, 2026
f4f8fa9
build: up-enclave, e2e-enclave, and a phone build pinned to the runni…
aruokhai Sep 16, 2026
d961090
feat(cosigner,protocol): the cosigner renews funds itself, from a sea…
aruokhai Sep 16, 2026
c61a3e2
feat(app-core,e2e): seal a delegate on the way out of every send and …
aruokhai Sep 16, 2026
0f2614b
feat(app): a fingerprint only when the user acts, and funds that rene…
aruokhai Sep 16, 2026
c2b69b4
feat(cli): protect, delegate status, and wallets that outlive an encl…
aruokhai Sep 16, 2026
4577e06
build: a dev enclave that keeps its store and lets the cosigner reach…
aruokhai Sep 16, 2026
bb17995
feat(app): Ark history from the indexer, and one fingerprint per action
aruokhai Sep 16, 2026
2b1d6f3
feat(infra): the MutinyNet cosigner in an emulated enclave on EC2
aruokhai Sep 17, 2026
00d0875
feat: an Ark-only wallet, with a unilateral exit the owner holds
aruokhai Sep 19, 2026
eb8c69a
feat: a wallet derived from its passkey, recoverable on any device
aruokhai Sep 19, 2026
fc2c8c5
feat: nothing secret at rest — the share is rebuilt from the passkey …
aruokhai Sep 19, 2026
b8b9805
feat: an escrow a service can be paid from, without the payer present
aruokhai Sep 20, 2026
11cb32e
feat: a card programme reimbursed from an escrow, proved end to end
aruokhai Sep 22, 2026
3938cab
feat(app): receiving is boarding — one way in, and it says what arrived
aruokhai Sep 23, 2026
18e5695
fix: align wallet copy with current app behavior
aruokhai Sep 23, 2026
144438d
feat(app): show what the enclave measured to, on the home screen
aruokhai Sep 23, 2026
50f9bd0
Imrpoved Readme
aruokhai Sep 26, 2026
32fb10a
fix: the PR #55 review — escrow ceremonies that cancel, and seal befo…
aruokhai Sep 26, 2026
bb79eab
build: boot the enclave e2e from a prebuilt dev enclave, in CI too
aruokhai Sep 26, 2026
30b8b80
fix(ci): pin protoc_plugin to the protobuf 3 generator
aruokhai Sep 26, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
The diff you're trying to view is too large. We only load the first 3000 changed files.
169 changes: 169 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,169 @@
# Four jobs. Three run on any runner: the cosigner's tests (on the host — the component's wasm
# build proves nothing more), the threshold and FFI crates, every Dart package's analysis and
# tests, and the app under Flutter. The fourth is the enclave e2e — the only thing that proves the
# ceremonies end to end — booted from a prebuilt dev enclave (enclave-bundle.lock, a release of
# enclave-runtime with the QEMU image inside it) on a hosted runner's KVM, exactly as
# enclave-runtime's own CI boots one. Nested virtualisation there works but is not something
# GitHub supports, so that job is the one that can fail for reasons outside this repository; its
# logs are uploaded when it does.
name: CI

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

# A superseded push's run is not worth finishing.
concurrency:
group: ci-${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true

env:
CARGO_TERM_COLOR: always

jobs:
rust:
name: Rust (cosigner, threshold, ffi)
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
- name: Install protoc
run: sudo apt-get update && sudo apt-get install -y protobuf-compiler
- uses: actions/cache@v4
with:
path: |
~/.cargo/registry
~/.cargo/git
cosigner/target
crates/threshold/target
ffi/target
key: rust-${{ hashFiles('**/Cargo.lock', '**/Cargo.toml') }}
restore-keys: rust-
- name: cosigner tests
run: cd cosigner && cargo test
- name: threshold tests
run: cd crates/threshold && cargo test --features std
- name: ffi build and tests
run: |
cargo build --release --manifest-path ffi/Cargo.toml
cargo test --release --manifest-path ffi/Cargo.toml
- name: Share the FFI library with the Dart job
uses: actions/upload-artifact@v4
with:
name: ffi
retention-days: 1
path: ffi/target/release/libmpcwallet_ffi.so

dart:
name: Dart (protocol, app-core, cli, e2e)
needs: rust
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/download-artifact@v4
with:
name: ffi
# Where `app-core/lib/threshold/src/native_library.dart` looks, walking up from cwd.
path: ffi/target/release
- uses: dart-lang/setup-dart@v1
with:
sdk: '3.12.2'
- name: Install protoc and the Dart plugin
run: |
sudo apt-get update && sudo apt-get install -y protobuf-compiler
# Pinned: the generator must match the protobuf runtime `protocol` pins (^3.1.0). The
# latest plugin emits code for protobuf 6, which does not analyze against 3.
dart pub global activate protoc_plugin 21.1.2
# The generated Dart is not checked in.
- name: Generate protocol stubs
run: make proto
- name: Analyze every package
run: |
for pkg in protocol app-core cli e2e; do
(cd $pkg && dart pub get && dart analyze)
done
- name: app-core tests
run: cd app-core && dart test

flutter:
name: Flutter (analyze, test)
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: subosito/flutter-action@v2
with:
channel: stable
- name: Install protoc and the Dart plugin
run: |
sudo apt-get update && sudo apt-get install -y protobuf-compiler
# Pinned: the generator must match the protobuf runtime `protocol` pins (^3.1.0). The
# latest plugin emits code for protobuf 6, which does not analyze against 3.
dart pub global activate protoc_plugin 21.1.2
- name: Generate protocol stubs
run: make proto
- name: Analyze and test
run: |
cd app
flutter pub get
# Infos are style, and there are a few dozen pre-existing ones; errors and warnings fail.
flutter analyze --no-fatal-infos
flutter test

enclave-e2e:
name: Enclave e2e (prebuilt dev enclave, KVM)
needs: rust
runs-on: ubuntu-latest
timeout-minutes: 60
env:
# The bundle, once fetched. Absolute: the harness runs the enclave from it.
ENCLAVE_RUNTIME: ${{ github.workspace }}/.enclave
# The FFI comes from the rust job; do not build it again.
FFI_DEP: ""
steps:
- uses: actions/checkout@v4
- uses: actions/download-artifact@v4
with:
name: ffi
path: ffi/target/release
- uses: dtolnay/rust-toolchain@stable
with:
targets: wasm32-wasip2
- uses: actions/cache@v4
with:
path: |
~/.cargo/registry
~/.cargo/git
cosigner/target
key: enclave-e2e-${{ hashFiles('cosigner/Cargo.lock', 'cosigner/Cargo.toml') }}
restore-keys: enclave-e2e-
- uses: dart-lang/setup-dart@v1
with:
sdk: '3.12.2'
- name: Install protoc and the Dart plugin
run: |
sudo apt-get update && sudo apt-get install -y protobuf-compiler
# Pinned: the generator must match the protobuf runtime `protocol` pins (^3.1.0). The
# latest plugin emits code for protobuf 6, which does not analyze against 3.
dart pub global activate protoc_plugin 21.1.2
- name: Let this user open KVM, and load the vsock loopback transport
# What enclave-runtime's scripts/ci-e2e.sh does on the same runners: /dev/kvm exists but is
# root-owned, and the harness forwards the enclave's vsock to host loopback.
run: |
if [ -e /dev/kvm ] && [ ! -r /dev/kvm ]; then
echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' \
| sudo tee /etc/udev/rules.d/99-kvm4all.rules >/dev/null
sudo udevadm control --reload-rules
sudo udevadm trigger --name-match=kvm
fi
[ -e /dev/vsock ] || sudo modprobe vsock_loopback
- name: Fetch the pinned dev enclave, wasi-sdk, and the protocol stubs
run: make enclave-bundle wasi-sdk proto
- name: The suite, against the enclave
run: make e2e-enclave E2E_TIMEOUT=30m
- uses: actions/upload-artifact@v4
if: failure()
with:
name: enclave-e2e-logs
path: .enclave/target/qemu-nitro/merlin/*.log
99 changes: 0 additions & 99 deletions .github/workflows/e2e.yml

This file was deleted.

109 changes: 0 additions & 109 deletions .github/workflows/release-eif.yml

This file was deleted.

Loading
Loading