Ecosystem metrics
- New Repos
- 26
- up 4.0%
- Commits
- 887
- up 20.8%
- Releases
- 11
- up 120.0%
- Contributors
- 60
- up 25.0%
- Merges
- 13
- down 60.6%
Activity Overview
Commits and releases over time
- Commits
- Releases
- Authors
Repository Explorer
No repositories match that filter.
10608 commits in all time
May 14, 2026 11:18 – Aug 12, 2026 11:18 UTC
fix: address final review findings
7d30f921
pull/30/head
9/287 ++ 19 --
feat(react-native-keystore): track legacy passkey flagging as migration 0001
BREAKING CHANGE: legacy passkey flagging no longer runs automatically on engine start. It is now revision 0001 of the package's migration manifest and requires WithMigrations from @algorandfoundation/provider-migrations to be installed on the provider. Applications that do not add it will never flag legacy passkeys.
7ab0e90f
pull/30/head
12/247 ++ 47 --
feat(example): wire the migrations engine into the react-native wallet
ad0a2f43
pull/30/head
7/142 ++ 38 --
feat(react-native-keystore): gate engine hydration behind an optional `before` promise
af602290
pull/30/head
2/88 ++ 10 --
test(react-native-keystore): pin storage identity between migration context and engine
Code review flagged that the migration-registration test never exercised the real createReactNativeKeyStore path, so nothing asserted that the migration's context() returns the very same storage object the engine reads/writes. Adds a test that constructs the real engine and checks reference identity; verified it fails when the invariant is broken.
c446a22f
pull/30/head
1/29 ++ 0 --
chore: apply oxfmt formatting
323a0265
pull/30/head
4/29 ++ 16 --
feat(migrations): add manifest validation
22b44d73
pull/30/head
2/89 ++ 0 --
feat(migrations): scaffold provider-migrations package with types and errors
d99a1a2b
pull/30/head
11/549 ++ 2 --
test(migrations): cover failure isolation, downgrades, hooks and scratch lifetime
9a801205
pull/30/head
1/381 ++ 1 --
feat(migrations): add the migration runner with per-revision ledger writes
9c022269
pull/30/head
2/415 ++ 4 --
test(migrations): guard catch-only assertions with an explicit rejects check
5c99ecd1
pull/30/head
1/5 ++ 0 --
feat(migrations): add run-scoped secure scratch for material in flight
75c5edce
pull/30/head
2/208 ++ 0 --
feat(migrations): add WithMigrations provider extension
6b5610c6
pull/30/head
3/338 ++ 0 --
feat(migrations): add assertIdempotent testing helper
c3310885
pull/30/head
2/244 ++ 0 --
feat(migrations): add in-memory and key/value revision ledgers
9bb20c34
pull/30/head
2/188 ++ 0 --
Merge 24031544ab4724f39c8925a9f72d62a3e092b0b0 into 2bb186e0a27bcf0b321e530f202ed6b7ecc5d1f0
7a6dc257
pull/12/merge
4/289 ++ 13 --
Reconstruct M from the artifact hash, not from the record header
Step [5] is the reviewer's "byte-exact reconstruction of the message M a
live inscription must have signed". It read the wrong bytes.
InscriptionRecord is an arc4.Struct, so the ARC4 head packs fixed-size
fields in declaration order:
version UInt8 rec[0:1]
cell_id UInt64 rec[1:9]
artifact_hash StaticArray[Byte,32] rec[9:41] <- the signed bytes
inscribed_round UInt64 rec[41:49]
inscriber Address rec[49:81]
payload_uri DynamicBytes rec[81:83] -> tail
The code used rec[0:32], which is version || cell_id || the first 23 bytes
of the hash. Confirmed against live TestNet cell 763809098: rec[0] == 1 and
rec[1:9] == 763809098, matching the box name exactly, so the layout is not
in doubt. The script displayed
rec[0:32] = 01000000002d86cd4a5680fc4ddf9d331b585198239ab41bdc768e3192efc477
rec[9:41] = 5680fc4ddf9d331b585198239ab41bdc768e3192efc477793a9daa1445dd4574
and rebuilt M from the first. No signature has ever covered those bytes.
It went unnoticed because the sole assertion was len(M_live) == 102, and
build_message validates both inputs are 32 bytes and then concatenates
fixed-width fields - so it either raises or returns exactly 102. The check
could not observe a wrong hash. Same shape as the approval-program pin
this branch already replaced: an assertion with no reachable failure.
Replaced with checks that can fail:
- version == 1
- the cell_id INSIDE the record equals the cell_id in the box NAME. Two
independent sources for one claim, and the check that actually pins the
offsets above. Mutation-tested: reading rec[0:8] instead of rec[1:9]
yields "record 72057594040911565 vs box 763809098" and fails.
- M matches the spec layout at every field offset, so a drift in
build_message surfaces instead of being absorbed.
Note the tempting check is NOT sufficient: comparing M's embedded hash to
art32 would have passed under the old bug too, since both sides shift
together. That is why the layout is pinned by the cross-source comparison.
Also states plainly that M is reconstructed, not verified: the signature is
a call argument the AVM checks, and is not stored on-chain, so no local
signature verification is possible from box state alone.
Live: 17 passed, 1 failed (the failure is the deployment drift). Standalone,
without the committed artifact: 17 passed, 0 failed.
Found by an adversarial claim-vs-enforcement sweep (TCE-02).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
24031544
fix/non-circular-deployment-verification
1/30 ++ 4 --
Merge 609869bec3b88224002130546b9a4e827e6dae8d into 337211c9b279ae7ee811998064b3de3f0ced7f73
cb992068
pull/387/merge
2/11 ++ 19 --
refactor: change to settle function
609869be
optimize
2/11 ++ 19 --
Merge 8aea860f77ba13385416e8a9a0be94875abcc1df into 2bb186e0a27bcf0b321e530f202ed6b7ecc5d1f0
b3ae7285
pull/14/merge
1/49 ++ 1 --
Export the audited symbols from the Windows Falcon DLL
Adding the previous step revealed why the Windows leg was skipping: the DLL built, linked and loaded with an EMPTY export table. MSVC exports nothing from a DLL without __declspec(dllexport) or an explicit /EXPORT, whereas ELF and Mach-O export every non-static symbol. The upstream Falcon sources carry no dllexport annotations. Evidence from the failing run: the linker never printed "Creating library", which MSVC emits only when at least one symbol is exported. So on Windows every ctypes lookup raised, _lib_available() caught it under a bare `except Exception`, and the tests skipped with the reason "FALCON_DET1024_LIB not built/set" - which was FALSE. The log shows the variable set correctly to a real file that exists. The diagnostic named the one thing that was not wrong. Consequence: the Windows leg of the 3-OS byte-identity matrix has verified nothing since it was written, while reporting green. The cross-platform reproducibility claim it exists to support (reviewer Q11/Q7, and the "byte-identical on Linux, macOS and Windows" language in the KAT header) held on two platforms of the three it names. S2.6 forbids editing the audited reference, so the exports are declared at link time rather than by annotating the C sources. The four names are exactly the SDK's audited binding surface, which makes the Windows export table an enforcement of that allowlist: a binding added without a matching export now fails loudly here. Not reproducible locally - no MSVC on this machine - so CI is the verification. The preceding step's grep is what will confirm it: if the exports work, no test can report "FALCON_DET1024_LIB not" and the job goes green having actually run the cryptography on Windows. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
8aea860f
fix/lib-gated-security-tests-never-run
1/22 ++ 1 --
Merge 6d7d771eab682c853503f4c2037cf909e24ea906 into 2bb186e0a27bcf0b321e530f202ed6b7ecc5d1f0
68bead22
pull/14/merge
1/27 ++ 0 --
Run the lib-gated security tests, which never ran in CI
Thirteen tests behind skipif(not _lib_available()) had never executed in
CI, on any event, since the workflow was written. The two jobs each had
half of what was needed and neither had both:
wire-format runs `pytest tests` (the whole suite) but never builds
the Falcon C library, so every lib-gated test skipped.
signature-kat builds the library on 3 OSes but ran only
`pytest tests/test_signature_kat.py`.
testnet-e2e builds the library, runs no pytest, and is manual-gated.
The intersection was empty. The never-run set is not incidental - it is
where the constitution's hardest crypto rules are actually enforced:
test_seal_wipes_private_key_buffer S2.3 zeroization
test_worker_stdout_carries_only_public_values S2.3 no secrets in output
test_isolated_result_has_no_private_key
test_isolated_require_locked_fails_closed_when_mlockall_unavailable
test_bad_build_fails_closed_without_consuming_cell
test_seal_signature_verifies_and_has_0xBA_header
test_second_seal_of_same_cell_raises
test_isolated_seal_produces_verifying_signature
test_isolated_second_seal_raises
+ 3 signature fuzzers and 1 interop cross-verify
Every green CI run has reported success while the private-key
zeroization check and the secret-leak-to-stdout check did not run.
This adds one step to signature-kat, the only job that builds the
library, running the full suite there.
The grep is not belt-and-braces, it is the substance: without it a failed
library build silently returns all thirteen tests to "skipped" and the job
goes green again, reintroducing this exact defect in the exact place it
was removed from. Passing must require that they RAN, not merely that
nothing failed. Same reasoning as TRELYAN_REQUIRE_KAT one step above,
which was applied to the KAT and never extended to its neighbours.
set -o pipefail so the tee does not swallow pytest's exit code.
Found by an adversarial sweep for claims that nothing mechanically
enforces; this was the highest-severity survivor.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
6d7d771e
fix/lib-gated-security-tests-never-run
1/27 ++ 0 --
Merge eefb222d8b88bc9a994e560ef453a45155a0e8b2 into 2bb186e0a27bcf0b321e530f202ed6b7ecc5d1f0
f2841d3e
pull/13/merge
1/154 ++ 0 --
Make the Falcon "unreachable" risk acceptance enforceable
The pinned build (ce15e75b = tag v0.1.0, the release go-algorand vendors) has a confirmed size_t underflow in falcon_det1024_convert_compressed_to_ct giving an unbounded read. TRELYAN's documented position is accept-and- document, and it rests on exactly one fact: the SDK never binds that function. The pin is deliberately NOT bumped - ce15e75b is the network's release, and the untagged fix commit would make TRELYAN stricter than the deployed on-chain verifier for no reachable benefit. That makes the acceptance only as durable as the binding surface, and nothing was watching it. A later commit adding CT-format support would convert a documented non-issue into a live out-of-bounds read silently. sdk/tests/test_binding_surface.py derives the bound symbol set by parsing the AST of _bind() and compares it to a declared allowlist. Note this is NOT the tautology it resembles: the two sides come from independent sources - one parsed from the source, one the security policy - so it can fail. A constant compared against itself cannot. The correct response to a failure is to justify the binding, not to edit the allowlist green. A second test sweeps all shipped sources textually, catching dynamic access (getattr(lib, ...)) that the AST check on _bind() alone would miss. A third asserts the extraction itself works, so the guard cannot pass vacuously. Static only - no shared library is loaded, so it runs in the no-native-lib CI job. Verified by mutation, not just by passing: injecting lib.falcon_det1024_convert_compressed_to_ct into _bind() turns both guards red with the quarantine reason attached; reverting turns them green. Full SDK suite 24 passed / 18 skipped (skips are the native-lib tests). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
eefb222d
test/falcon-binding-surface-guard
1/154 ++ 0 --