Testnet fixtures and score stubs for evaluating Gryd Lock - so the tool can be tested end to end without a live scoring backend.
Gryd Lock's warning layer is only useful if it can be measured. This repo provides the labelled inputs and stub scores that make the evaluation in grydlock-research actually executable on Stellar testnet.
- Labelled Destinations: Stellar testnet addresses and assets tagged clean, suspicious, or malicious
- Sample Transactions: unsigned transaction XDRs covering payment, path payment, change trust
- Score Stubs: lookup table mapping each destination to a 0-100 score for deterministic offline scoring
grydlock-testkit/ README.md LICENSE package.json .github/workflows/ci.yml destinations.json scores.json scripts/validate-fixtures.mjs transactions/ payment.xdr path_payment.xdr change_trust.xdr
npm run validate
Checks that every destination in destinations.json has a matching entry in scores.json, every score is an integer in 0-100, and every label is one of clean, suspicious, or malicious.
- grydlock-oracle-adapter loads scores.json in its StubOracle to return scores without a live backend
- The extension is pointed at the stub oracle during development, so the full path - decode, score, tier, warning - runs entirely offline
- grydlock-research runs the extension across every entry in destinations.json and measures how often the assigned tier matches the label
grydlock-oracle-adapter's StubOracle reads a vendored copy of scores.json/destinations.json (checked in under its own src/fixtures/testkit/, shape-checked at module load). A change here - a new entity type, a schema-versioning change, a scores.json shape change - could break StubOracle's assumptions in a way nothing in this repo would otherwise catch, since this repo has no automated way to exercise that downstream code.
.github/workflows/consumer-contract-test.yml is a "consumer contract test": it checks out grydlock-oracle-adapter at a pinned commit, copies this repo's current scores.json/destinations.json over the adapter's vendored copies, and runs a small vitest check asserting StubOracle.getScore() resolves to a finite 0-100 number for every destination in destinations.json with no throw.
- Trigger: manual (
workflow_dispatch) or a weekly schedule - deliberately not on every push, to avoid a hard cross-repo CI coupling on every PR here. - Purpose: catch a testkit change that's breaking-for-consumers before it ships in a tagged release, rather than discovering it later in
grydlock-oracle-adapterorgrydlock-research. - Limitations: it's only as good as the pinned
grydlock-oracle-adapterref (ORACLE_ADAPTER_REFin the workflow file) - it does not track that repo'smainbranch, so it can miss adapter-side changes made after the pin. It also only checks the fixture shape the adapter expects, not scoring correctness (that'sgrydlock-research's job). - Updating the pin: edit
ORACLE_ADAPTER_REFat the top of.github/workflows/consumer-contract-test.ymlto a new commit SHA (or tag) ofgrydlock-oracle-adapter, ideally whenever that repo cuts a release or changes its fixture-loading code.
Consumers should pin to a specific tagged release rather than tracking the main branch. This ensures fixture changes do not silently alter evaluation results.
Example: grydlock-oracle-adapter pins to v0.1.0 by referencing the tag in its dependency configuration or downloading the release asset:
git clone --branch v0.1.0 https://github.com/Gryd-lock/grydlock-testkit.git
Releases are tagged with semantic versions matching package.json and CHANGELOG.md. Each release includes notes from the corresponding CHANGELOG section.
| Repo | Role |
|---|---|
| grydlock-extension | Browser extension that warns before signing risky Stellar transactions |
| grydlock-oracle-adapter | Fetches on-chain risk scores via Soroban; StubOracle reads scores.json from this repo |
| grydlock-research | Design study, threat model, and evaluation methodology |
| grydlock-testkit (this repo) | Testnet fixtures, labelled destinations, and score stubs |
MIT