Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
113 commits
Select commit Hold shift + click to select a range
7d806a5
feat: avoid reentrancy attacks on PRT
guidanoli Apr 6, 2026
66f1014
docs: add NatSpec to ITournament errors
guidanoli Apr 1, 2026
5336437
refactor: rename ITournament error parameters
guidanoli Apr 1, 2026
140dd50
refactor!: rename ITournament errors
guidanoli Apr 1, 2026
071b79a
refactor!: deduplicate ITournament errors
guidanoli Apr 1, 2026
308ef68
refactor: call Tournament.canBeEliminated internally
guidanoli Apr 1, 2026
af96bcb
refactor!: define custom errors for Clock lib
guidanoli Apr 1, 2026
5fcc034
refactor!: define custom errors for Match lib
guidanoli Apr 1, 2026
378feb9
refactor!: define custom errors for Tree lib
guidanoli Apr 2, 2026
9f6a3c5
feat!: bump `rollups-contracts` from 2.2.0 to 3.0.0-alpha.3
guidanoli Apr 3, 2026
19fe91e
feat: bump emulator to 0.20
ZzzzHui Jan 14, 2026
f82fafc
fix: update to newest machine json schema
GCdePaula Apr 22, 2026
d66006a
refactor: harden v0.20 bindings against schema drift
GCdePaula Apr 22, 2026
c2b4979
feat: bump rollups-contracts from 3.0.0-alpha.3 to 3.0.0-alpha.4
guidanoli Apr 29, 2026
5d791d9
fix: bump dependencies
guidanoli May 6, 2026
ffad978
feat: make ci always build node
guidanoli May 6, 2026
b150cfc
Bump rollups-contracts from 3.0.0-alpha.4 to 3.0.0-alpha.5
guidanoli May 19, 2026
61c63bf
Distribute deterministic deployment addresses
guidanoli May 19, 2026
59d2708
Dry-run contract artifacts release job
guidanoli May 19, 2026
1fccdb3
feat: bump rollups-contracts from 3.0.0-alpha.5 to 3.0.0-alpha.6
guidanoli May 21, 2026
fec056e
ci: lock GH actions by digest
endersonmaia May 6, 2026
56f5004
refactor: remove dependency from Cannon and pnpm
guidanoli Jun 19, 2026
dbfd8a6
chore: bump Foundry from 1.4.3 to 1.5.1
guidanoli Jul 1, 2026
e0eceeb
chore: bump Honeypot from 3.0.0 to 3.0.1
guidanoli Jul 1, 2026
48fcc2d
feat!: tournament result staging
guidanoli Jul 1, 2026
604de20
feat!: add sentries to DaveConsensus
guidanoli Jul 9, 2026
82b576c
feat!: add sentry rotation to DaveConsensus
guidanoli Jul 10, 2026
b839e7e
chore: bump Solidity pragma to ^0.8.30
guidanoli Jul 13, 2026
863b69c
feat!: index epochNumber in Epoch{Sealed,Staged}
guidanoli Jul 13, 2026
270d261
feat(node)!: rewrite the rollups node on one engine
GCdePaula Jul 20, 2026
34b50b2
test(e2e): rework the Lua harness - scenarios, battery, primitives
GCdePaula Jul 20, 2026
2976d4f
build: the just gate, doctor, devnet scripts, and CI wiring
GCdePaula Jul 20, 2026
db0d171
docs: the node knowledge base and campaign plans
GCdePaula Jul 20, 2026
b4ffd26
build: CI triggers and caching, and exit-code-honest tooling
GCdePaula Jul 20, 2026
4f40882
docs(prt): map the dispute game and record review findings
GCdePaula Jul 16, 2026
38fa06c
fix(prt): make terminal bond settlement bounded and idempotent
GCdePaula Jul 16, 2026
c5c4539
fix(prt): make clock phases and timeout settlement explicit
GCdePaula Jul 17, 2026
3f7b24a
test(prt): decouple coverage from canonical tournament geometry
GCdePaula Jul 18, 2026
4c0e9a6
fix(prt): reject nonexistent inner matches
GCdePaula Jul 18, 2026
7852863
chore(prt): remove stale time and deployment assumptions
GCdePaula Jul 18, 2026
e24a94b
fix(prt): isolate tournament progress from recipient behavior
GCdePaula Jul 18, 2026
587f973
fix(prt): calibrate dispute-action refund ceilings
GCdePaula Jul 18, 2026
55e94d7
fix(prt): make Match existence state-backed
GCdePaula Jul 18, 2026
2907ee0
test(prt): add reproducible gas and lifecycle harnesses
GCdePaula Jul 18, 2026
661d793
refactor(prt): centralize Match phases and bisection
GCdePaula Jul 18, 2026
cfa51f5
test(prt): close recursive accounting and callback gaps
GCdePaula Jul 18, 2026
71ed758
fix(prt): validate tournament dependencies and dimensions
GCdePaula Jul 18, 2026
cd71e8a
fix(prt): complete refund calibration and derive bonds from work reserve
GCdePaula Jul 19, 2026
d706d2b
refactor(prt): enforce one-place Clock and Match invariants
GCdePaula Jul 20, 2026
0fa20d1
docs(prt): publish the final audit and verification record
GCdePaula Jul 20, 2026
222d6c7
chore(prt): align gas calibration with Foundry 1.5.1
GCdePaula Jul 20, 2026
6d4a911
docs(prt): record post-rebase release verification
GCdePaula Jul 20, 2026
58b9c23
docs(prt): archive the contract review and promote living guidance
GCdePaula Jul 21, 2026
51fcb64
fix(prt): prevent sealed-leaf censorship amplification
GCdePaula Jul 23, 2026
c9f4753
refactor(prt): clarify pipelined match descent
GCdePaula Jul 23, 2026
6b08142
test(prt): align and pin timeout gas witnesses
GCdePaula Jul 23, 2026
1afde59
refactor(prt): factor terminal reserve families
GCdePaula Jul 23, 2026
12197ce
test(prt): pin recursive clock delegation invariants
GCdePaula Jul 23, 2026
31c80ab
test(prt): pin Ethereum clock calibration
GCdePaula Jul 23, 2026
4845264
docs(prt): align the clock specification with code
GCdePaula Jul 23, 2026
1d919e7
fix(client-lua): encode revert checkpoint proofs
GCdePaula Jul 23, 2026
586704a
fix(prt): calibrate canonical leaf proof subsidy
GCdePaula Jul 23, 2026
f3087db
refactor(prt): make Match and Clock semantics explicit
GCdePaula Jul 26, 2026
f4695f4
refactor(tooling): extract reproducible PRT leaf gas runners
GCdePaula Jul 26, 2026
e2ada52
test(prt): pin post-refactor gas headroom
GCdePaula Jul 26, 2026
49335dd
docs(prt): record post-refactor gas calibration
GCdePaula Jul 26, 2026
0d305a3
refactor(prt)!: tighten tournament API semantics
GCdePaula Aug 1, 2026
f947a90
fix(prt): size bonds by tournament role
GCdePaula Aug 1, 2026
54f81db
test(prt): consolidate deferred bond recovery coverage
GCdePaula Aug 1, 2026
59db235
refactor(prt): name clock assertions explicitly
GCdePaula Aug 1, 2026
8c3f56e
refactor(prt): complete the semantic contract-client interface
GCdePaula Jul 22, 2026
c73b0d7
chore: overhaul agent guidance and repository tooling
GCdePaula Jul 25, 2026
648f3f3
refactor(prt)!: ossify the tournament interface
GCdePaula Aug 5, 2026
614d1d2
feat(prt)!: make bond recovery explicit and bounty the winner
GCdePaula Aug 5, 2026
eac48b4
docs(prt): freeze the interface campaign and serialize the FFI gate
GCdePaula Aug 5, 2026
3f61940
fix(node): report the reverted post-state when proving the closing slot
GCdePaula Aug 5, 2026
56b3a81
feat(prt): expose the bond recovery capability view
GCdePaula Aug 5, 2026
5b333c9
docs(plans): settle the batch-submission and recovery design
GCdePaula Aug 5, 2026
4098695
chore: make a mid-rebuild devnet bundle name its fix
GCdePaula Aug 5, 2026
433b14e
refactor(node): reduce the transaction lane to its stateless kernel
GCdePaula Aug 5, 2026
88a17e3
feat(node): compose one wave per tick
GCdePaula Aug 5, 2026
97e38c9
feat(node): recover bonds through the wave's tail
GCdePaula Aug 5, 2026
9bf8a19
fix(node): close the round-2 audit findings
GCdePaula Aug 5, 2026
c083f22
refactor(node): derive recovery candidates by provenance
GCdePaula Aug 5, 2026
fb1c0f5
refactor(prt): make matchTimeoutStatus total
GCdePaula Aug 5, 2026
d9bcde6
refactor(prt): sharpen tournament observation and recovery
GCdePaula Aug 9, 2026
10c723a
refactor(prt): derive dispute state recursively from events
GCdePaula Aug 10, 2026
fb8a6aa
refactor(prt): simplify timeout classification
GCdePaula Aug 10, 2026
edccb27
chore: prune superseded design records
GCdePaula Aug 10, 2026
bd6408d
docs: consolidate project papers
GCdePaula Aug 10, 2026
b6e6a5d
test: centralize end-to-end harness
GCdePaula Aug 10, 2026
29ef477
refactor(prt): make storage layout internal
GCdePaula Aug 10, 2026
0aa0ddc
docs(node): clarify retry and RPC trust assumptions
GCdePaula Aug 11, 2026
83863ab
feat(prt): expose tournament geometry
GCdePaula Aug 14, 2026
66df5a7
build: centralize the Foundry version pin
GCdePaula Aug 14, 2026
c9e3b2a
build: normalize the Foundry version pin
GCdePaula Aug 15, 2026
b7f3b2b
feat(machine): complete the Cartesi Machine v0.21 upgrade
GCdePaula Aug 16, 2026
634bcee
docs(prt): record v0.21 STF gas calibration
GCdePaula Aug 16, 2026
b87cd9a
feat(machine): expose durable stored snapshot operations
GCdePaula Aug 11, 2026
e9d3c98
feat(node): publish snapshots at durable batch boundaries
GCdePaula Aug 11, 2026
5c59bb8
test(stf): harden terminal and composed-witness coverage
GCdePaula Aug 16, 2026
7551d8f
build: make repository tooling explicit and composable
GCdePaula Aug 16, 2026
1e193ed
test: harden v0.21 conformance and maintenance workflows
GCdePaula Aug 16, 2026
0095393
fix(machine): handle empty cleanup state under Bash 3.2
GCdePaula Aug 16, 2026
b7cbfaf
docs(prt): record post-274 gas calibration
GCdePaula Aug 16, 2026
c6dd2be
refactor(stf): make transition branches explicit
GCdePaula Aug 16, 2026
aeacd10
feat(machine): enforce state transition compatibility
GCdePaula Aug 17, 2026
c64ad6c
docs(prt): record STF composition gas calibration
GCdePaula Aug 17, 2026
5d85900
docs(ci): clarify full E2E dispatch availability
GCdePaula Aug 17, 2026
d935105
docs(node): record recovery scheduling follow-up
GCdePaula Aug 17, 2026
3ac810c
fix(node): enforce durable snapshot cursor invariants
GCdePaula Aug 18, 2026
f324238
ci: npx actions-up
endersonmaia Aug 21, 2026
34d8417
fix(script): drop --offline flag passed to cargo
guidanoli Aug 21, 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
  •  
  •  
  •  
6 changes: 0 additions & 6 deletions .cargo/config.toml

This file was deleted.

37 changes: 37 additions & 0 deletions .claude/skills/add-e2e-scenario/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
---
name: add-e2e-scenario
description: Add or wire a new e2e test scenario for the PRT rollups harness (test/e2e/rollups). Use when creating a scenario, adding a sybil scenario, or wiring an existing scenario into suites, CI, or the battery.
---

# Add an e2e scenario

Full harness context: `docs/test-harness.md` (anatomy, oracle doctrine,
patch chains, kill markers). The wiring checklist, complete:

1. Pick or build a machine program under `test/programs/` (see its
justfile). Existing: echo, yield, honeypot; `compute` builds but is
not yet wired into any scenario.
2. Write `test/e2e/rollups/scenarios/<name>.lua`: require `test_env`,
spawn blockchain and node, drive epochs with `run_epoch` or
hand-rolled sybils with patch lists. Copy the shape of a sibling
scenario (`simple.lua` for honest runs, `kill_*.lua` for kill points,
`multi_sybil.lua` for concurrent matches).
3. Wire a justfile alias if it should run in a suite
(`test/e2e/rollups/justfile`). Give the recipe a self-contained
final comment line - `just --list` shows only that line.
4. Add it to `battery.sh`'s `SCENARIOS` array if it should run in the
full parallel battery. The array is independent of the justfile
aliases and does not inherit from them; a scenario missing here is
omitted from execution and produces only a non-fatal warning. If the
scenario is deliberately excluded, add its bare script name to
`EXCLUDED_SCENARIOS` and put the reason in an adjacent comment.
5. If it should gate PRs, add the just target to
`.github/workflows/build.yml` - CI calls just targets by name, never
inline commands.

Run it: `just rollups-tests::test <program> <name>`, or with
`TEST_INSTANCE=<free port>` for an isolated parallel lane. Read
results honestly with `just logged`. Use the same `TEST_INSTANCE=<id>`
when running `just view-rollups-logs`; without it, that recipe follows
the default `dave.log`. Sweep with `just rollups-tests::sweep` after
reading results.
44 changes: 44 additions & 0 deletions .claude/skills/contract-change-gate/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
---
name: contract-change-gate
description: Pre- and post-change gate for production Solidity changes under prt/contracts or cartesi-rollups/contracts. Use before editing any src/ contract file there, and again before declaring the change done.
---

# Contract change gate

The authoritative context is the directory's `AGENTS.md`
(`prt/contracts/AGENTS.md` or `cartesi-rollups/contracts/AGENTS.md`):
its reading table, invariants, and guardrails. This skill is the
mechanical checklist wrapped around them.

Before editing:

1. Read the directory's `AGENTS.md` reading-table rows for your change
type, and the docs they name.
2. For `prt/contracts`: run
`just prt-contracts::compatibility-hashes` and save the output.

After editing, before declaring done:

1. `prt/contracts`: re-run `just prt-contracts::compatibility-hashes`
and inspect EVERY difference against the change's intent. Hashes are
comparison aids, not approval to update a snapshot mechanically.
2. Run the directory's gate:
- `just prt-contracts::check-fmt` and `just prt-contracts::test-all`
(or the focused suites the AGENTS.md lists), or
- `just rollups-contracts::check-fmt` and
`just rollups-contracts::test`.
3. Match the change to its required extra evidence (from AGENTS.md):
Clock changes need the one-clock tests, the MatchClocks matrix, and
Tournament composition; Match changes need white-box representation tests
and an independent oracle; gas-affecting changes need the
gas-calibration skill; geometry changes need the whole-table
validator plus coordinated cross-implementation work.
4. If the ABI, events, errors, or clone-argument encoding changed, stop and
confirm the task explicitly authorizes a new deployment generation;
regenerate bindings (`just bind`) and deployment artifacts. If storage or
raw Match or Clock encodings changed, inspect the impact and update
white-box probes without treating the old representation as a
wire-compatibility promise.
5. Cross-implementation seams (state transition, commitment geometry,
provider behavior): confirm the Rust node, the Lua client, and the
docs were updated in the same change, or say explicitly why not.
38 changes: 38 additions & 0 deletions .claude/skills/doc-drift-check/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
---
name: doc-drift-check
description: Verify a documentation file against the code it describes and fix pointer rot. Use when asked to review, audit, or update docs, after a refactor that renamed modules or functions, or periodically as maintenance.
---

# Doc drift check

The repo's docs state invariants (stable) and reference code by path,
symbol, and count (volatile). Empirically, the invariants hold and the
pointers rot - so check the pointers.

Procedure, per document:

1. Extract every pointer-type claim: file paths, module names, function
and type names, table/schema lists, command names, counts ("21
scenarios"), and cross-references to other docs.
2. Verify each against the tree (Glob/Grep, `just --list`). For claims
about behavior shape (control flow, gating, ordering), read the
named code - do not trust the doc's paraphrase.
3. Fix what drifted. Prefer fixes that cannot rot again: replace counts
with "see <file> for the current list", link the authoritative file
instead of restating its contents.
4. Check status headers: a plan whose own completion criteria are met
should be marked frozen per the policy in `docs/README.md`; a
"known debts" entry describing code that no longer exists should be
marked retired with the date, matching the sibling entries' style.
5. For invariant-type claims that look wrong, do not silently "fix" the
doc: the code is the source of truth, but a disagreement may be a
code bug. Verify deeply, then either fix the doc with evidence or
raise the discrepancy.

Sweep order when doing general maintenance: the AGENTS.md files, then
docs/README.md's reading list, then the doc nearest the most recent
refactor (git log tells you where the churn was).

Conventions for any doc fix: ASCII only, concise, state invariants and
reasons rather than restating code structure, and update docs in the
same change as the code that invalidated them.
27 changes: 27 additions & 0 deletions .claude/skills/gas-calibration/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
---
name: gas-calibration
description: Run or validate PRT refund-gas calibration. Use when changing Gas.sol allocations, Bond.sol formulas, anything that shifts measured action gas (contract logic on refunded paths), or when a gas witness test fails. Also when asked to "calibrate gas" or "measure gas".
---

# PRT refund-gas calibration

The maintained procedure is `docs/runbooks/prt-refund-gas-calibration.md`.
Read it before acting; this skill only routes and states the gate.

Non-negotiables:

- A gas-affecting change must follow the runbook even when the selected
allocation remains unchanged. Never calibrate under coverage
instrumentation.
- The accepted gate is `just measure-prt-gas` under the pinned release
environment the runbook describes. It combines the PRT Tournament-only
matrix with the serialized full-stack FFI leaf-proof matrix.
- Witness validation (fast, no re-measurement): `just test-prt-gas`.
- Trace any allocation change through `Bond.sol` into bonds and
deployment artifacts; the runbook shows how.
- Accepted calibrations are archived as dated records under
`docs/reviews/` (see the 2026-07-23 gas-calibration records for the
expected shape of the evidence).

Use `just logged <file> <cmd...>` for the measurement runs so a display
pipeline cannot hide the real exit code.
9 changes: 5 additions & 4 deletions .dockerignore
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,11 @@

**/target/

**/_state/
**/_state*/
**/_oracle*/
**/_battery/
**/dave*.log*
**/anvil*.log*
**/snapshots/
**/compute_data/
**/rollups_data/
Expand All @@ -21,9 +25,6 @@ test/programs/**/machine-image/
cartesi-rollups/contracts/bindings-rs/src/contract/
prt/contracts/bindings-rs/src/contract/

prt/tests/compute/outputs/
prt/tests/compute/pixels/

machine/emulator/**/*.o
machine/emulator/**/*.swp
machine/emulator/**/*.d
Expand Down
18 changes: 16 additions & 2 deletions .github/actions/cartesi-machine/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ inputs:
version:
description: 'Version of Cartesi Machine to install'
required: false
default: 0.19.0
default: 0.21.0
suffix-version:
description: 'Suffix of Cartesi Machine to install'
required: false
Expand All @@ -13,10 +13,18 @@ inputs:
description: 'Architecture of Cartesi Machine to install'
required: false
default: 'amd64'
archive-sha256:
description: 'SHA-256 of the Cartesi Machine Debian package; override with version, suffix, or arch'
required: false
default: '5f13034f43454c340062c677146daabe77c587cee1bd60342c95b8ad8f1463a3'
xgenext2fs-version:
description: 'Version of xgenext2fs to install'
required: false
default: '1.5.6'
xgenext2fs-sha256:
description: 'SHA-256 of the xgenext2fs Debian package; override with version or arch'
required: false
default: '996e4e68a638b5dc5967d3410f92ecb8d2f41e32218bbe0f8b4c4474d7eebc59'
runs:
using: composite
steps:
Expand All @@ -28,13 +36,14 @@ runs:
run: |
sudo apt-get update
sudo apt-get install -y --no-install-recommends \
build-essential git wget \
build-essential curl git wget \
libslirp-dev \
libclang-dev \
liblua5.4-dev lua5.4 \
xxd jq sqlite3 libc6 clang libarchive13

wget -O xgenext2fs.deb https://github.com/cartesi/genext2fs/releases/download/v${XGENEXT2_VERSION}/xgenext2fs_${ARCH}.deb
echo "${{ inputs.xgenext2fs-sha256 }} xgenext2fs.deb" | sha256sum --check
sudo apt-get install -y ./xgenext2fs.deb
rm ./xgenext2fs.deb
xgenext2fs --version
Expand All @@ -43,10 +52,15 @@ runs:
shell: bash
run: |
curl -fsSL https://github.com/cartesi/machine-emulator/releases/download/v${{ inputs.version }}${{ inputs.suffix-version }}/machine-emulator_${{ inputs.arch }}.deb -o /tmp/cartesi-machine.deb
echo "${{ inputs.archive-sha256 }} /tmp/cartesi-machine.deb" | sha256sum --check

- name: Install Cartesi Machine
shell: bash
run: |
sudo apt-get install -y /tmp/cartesi-machine.deb
rm -v /tmp/cartesi-machine.deb
cartesi-machine --version
test -f /usr/lib/libcartesi.a
test -f /usr/include/cartesi-machine/cm.h
echo "LIBCARTESI_PATH=/usr/lib" >> "$GITHUB_ENV"
echo "INCLUDECARTESI_PATH=/usr/include/cartesi-machine" >> "$GITHUB_ENV"
43 changes: 18 additions & 25 deletions .github/actions/setup-tools/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,15 +8,13 @@ inputs:
rust-version:
description: 'Rust version to install (if Rust is setup)'
required: false
default: '1.86'
foundry-version:
description: 'Foundry version to install'
required: false
default: 'v1.4.3'
# Keep in step with the release container (rust:1.90-trixie in
# build.yml); the workspace uses post-1.86 std APIs.
default: '1.90'
setup-qemu:
description: 'Whether to setup QEMU for riscv support'
required: false
default: 'true'
default: 'false'
setup-rust:
description: 'Whether to setup Rust'
required: false
Expand All @@ -29,40 +27,35 @@ runs:
using: composite
steps:
- name: Set up QEMU for riscv support
uses: docker/setup-qemu-action@v3
uses: docker/setup-qemu-action@96fe6ef7f33517b61c61be40b68a1882f3264fb8 # v4.2.0
if: ${{ inputs.setup-qemu == 'true' }}

- name: Install Rust
uses: actions-rust-lang/setup-rust-toolchain@v1
uses: actions-rust-lang/setup-rust-toolchain@166cdcfd11aee3cb47222f9ddb555ce30ddb9659 # v1.17.0
if: ${{ inputs.setup-rust == 'true' }}
with:
components: rustfmt
components: rustfmt,clippy
target: ${{ inputs.target }}
toolchain: ${{ inputs.rust-version }}
cache-on-failure: false
cache-bin: false

- name: Install just
uses: extractions/setup-just@53165ef7e734c5c07cb06b3c8e7b647c5aa16db3 # v4.0.0
with:
# Pinned like the other toolchain components: a floating "latest"
# upgrades CI's toolchain silently mid-week (1.56 -> 1.57
# landed between two runs of this workflow and muddied a
# two-day CI hunt). Bump deliberately.
just-version: "1.57.0"

- name: Set Foundry version
id: set-foundry-version
shell: bash
run: |
echo "version=${{ inputs.foundry-version }}" >> $GITHUB_OUTPUT
echo "version=$(just print-foundry-version)" >> "$GITHUB_OUTPUT"

- name: Install Foundry
uses: foundry-rs/foundry-toolchain@v1
uses: foundry-rs/foundry-toolchain@908c540300062bd5a7e473851cdb4282204cee09 # v1.9.1
with:
version: ${{ steps.set-foundry-version.outputs.version }}

- name: Install just
uses: extractions/setup-just@v3

- name: Install pnpm
uses: pnpm/action-setup@v4
with:
package_json_file: 'prt/contracts/package.json'

- uses: actions/setup-node@v4
with:
node-version: 22
cache: 'pnpm'
cache-dependency-path: 'prt/contracts/pnpm-lock.yaml'
Loading
Loading