Jun 05, 7-8 AM (12)
Jun 05, 8-9 AM (8)
Jun 05, 9-10 AM (11)
Jun 05, 10-11 AM (12)
Jun 05, 11-12 PM (8)
Jun 05, 12-1 PM (52)
Jun 05, 1-2 PM (61)
Jun 05, 2-3 PM (26)
Jun 05, 3-4 PM (24)
Jun 05, 4-5 PM (17)
Jun 05, 5-6 PM (7)
Jun 05, 6-7 PM (14)
Jun 05, 7-8 PM (12)
Jun 05, 8-9 PM (6)
Jun 05, 9-10 PM (2)
Jun 05, 10-11 PM (20)
Jun 05, 11-12 AM (9)
Jun 06, 12-1 AM (6)
Jun 06, 1-2 AM (0)
Jun 06, 2-3 AM (3)
Jun 06, 3-4 AM (4)
Jun 06, 4-5 AM (0)
Jun 06, 5-6 AM (24)
Jun 06, 6-7 AM (1)
Jun 06, 7-8 AM (2)
Jun 06, 8-9 AM (3)
Jun 06, 9-10 AM (0)
Jun 06, 10-11 AM (3)
Jun 06, 11-12 PM (6)
Jun 06, 12-1 PM (2)
Jun 06, 1-2 PM (2)
Jun 06, 2-3 PM (2)
Jun 06, 3-4 PM (18)
Jun 06, 4-5 PM (1)
Jun 06, 5-6 PM (6)
Jun 06, 6-7 PM (0)
Jun 06, 7-8 PM (6)
Jun 06, 8-9 PM (0)
Jun 06, 9-10 PM (1)
Jun 06, 10-11 PM (27)
Jun 06, 11-12 AM (9)
Jun 07, 12-1 AM (14)
Jun 07, 1-2 AM (2)
Jun 07, 2-3 AM (0)
Jun 07, 3-4 AM (0)
Jun 07, 4-5 AM (1)
Jun 07, 5-6 AM (1)
Jun 07, 6-7 AM (3)
Jun 07, 7-8 AM (0)
Jun 07, 8-9 AM (0)
Jun 07, 9-10 AM (1)
Jun 07, 10-11 AM (2)
Jun 07, 11-12 PM (2)
Jun 07, 12-1 PM (5)
Jun 07, 1-2 PM (35)
Jun 07, 2-3 PM (2)
Jun 07, 3-4 PM (4)
Jun 07, 4-5 PM (2)
Jun 07, 5-6 PM (4)
Jun 07, 6-7 PM (0)
Jun 07, 7-8 PM (0)
Jun 07, 8-9 PM (17)
Jun 07, 9-10 PM (1)
Jun 07, 10-11 PM (21)
Jun 07, 11-12 AM (9)
Jun 08, 12-1 AM (9)
Jun 08, 1-2 AM (5)
Jun 08, 2-3 AM (3)
Jun 08, 3-4 AM (4)
Jun 08, 4-5 AM (2)
Jun 08, 5-6 AM (9)
Jun 08, 6-7 AM (5)
Jun 08, 7-8 AM (25)
Jun 08, 8-9 AM (36)
Jun 08, 9-10 AM (40)
Jun 08, 10-11 AM (24)
Jun 08, 11-12 PM (22)
Jun 08, 12-1 PM (40)
Jun 08, 1-2 PM (48)
Jun 08, 2-3 PM (33)
Jun 08, 3-4 PM (27)
Jun 08, 4-5 PM (12)
Jun 08, 5-6 PM (23)
Jun 08, 6-7 PM (14)
Jun 08, 7-8 PM (3)
Jun 08, 8-9 PM (6)
Jun 08, 9-10 PM (19)
Jun 08, 10-11 PM (29)
Jun 08, 11-12 AM (8)
Jun 09, 12-1 AM (5)
Jun 09, 1-2 AM (3)
Jun 09, 2-3 AM (1)
Jun 09, 3-4 AM (3)
Jun 09, 4-5 AM (26)
Jun 09, 5-6 AM (5)
Jun 09, 6-7 AM (23)
Jun 09, 7-8 AM (50)
Jun 09, 8-9 AM (35)
Jun 09, 9-10 AM (45)
Jun 09, 10-11 AM (51)
Jun 09, 11-12 PM (46)
Jun 09, 12-1 PM (86)
Jun 09, 1-2 PM (84)
Jun 09, 2-3 PM (36)
Jun 09, 3-4 PM (38)
Jun 09, 4-5 PM (16)
Jun 09, 5-6 PM (18)
Jun 09, 6-7 PM (18)
Jun 09, 7-8 PM (19)
Jun 09, 8-9 PM (16)
Jun 09, 9-10 PM (16)
Jun 09, 10-11 PM (28)
Jun 09, 11-12 AM (10)
Jun 10, 12-1 AM (11)
Jun 10, 1-2 AM (16)
Jun 10, 2-3 AM (11)
Jun 10, 3-4 AM (19)
Jun 10, 4-5 AM (5)
Jun 10, 5-6 AM (2)
Jun 10, 6-7 AM (46)
Jun 10, 7-8 AM (82)
Jun 10, 8-9 AM (18)
Jun 10, 9-10 AM (59)
Jun 10, 10-11 AM (46)
Jun 10, 11-12 PM (134)
Jun 10, 12-1 PM (48)
Jun 10, 1-2 PM (33)
Jun 10, 2-3 PM (32)
Jun 10, 3-4 PM (28)
Jun 10, 4-5 PM (35)
Jun 10, 5-6 PM (12)
Jun 10, 6-7 PM (12)
Jun 10, 7-8 PM (38)
Jun 10, 8-9 PM (11)
Jun 10, 9-10 PM (9)
Jun 10, 10-11 PM (20)
Jun 10, 11-12 AM (7)
Jun 11, 12-1 AM (10)
Jun 11, 1-2 AM (2)
Jun 11, 2-3 AM (0)
Jun 11, 3-4 AM (2)
Jun 11, 4-5 AM (8)
Jun 11, 5-6 AM (12)
Jun 11, 6-7 AM (34)
Jun 11, 7-8 AM (106)
Jun 11, 8-9 AM (36)
Jun 11, 9-10 AM (20)
Jun 11, 10-11 AM (105)
Jun 11, 11-12 PM (25)
Jun 11, 12-1 PM (38)
Jun 11, 1-2 PM (37)
Jun 11, 2-3 PM (14)
Jun 11, 3-4 PM (20)
Jun 11, 4-5 PM (5)
Jun 11, 5-6 PM (7)
Jun 11, 6-7 PM (26)
Jun 11, 7-8 PM (90)
Jun 11, 8-9 PM (11)
Jun 11, 9-10 PM (5)
Jun 11, 10-11 PM (25)
Jun 11, 11-12 AM (5)
Jun 12, 12-1 AM (8)
Jun 12, 1-2 AM (2)
Jun 12, 2-3 AM (2)
Jun 12, 3-4 AM (4)
Jun 12, 4-5 AM (7)
Jun 12, 5-6 AM (15)
Jun 12, 6-7 AM (40)
Jun 12, 7-8 AM (1)
3,132 commits this week Jun 05, 2026 - Jun 12, 2026
Bump next from 15.3.2 to 15.5.18 in /examples/bootcamp/10-web3-services
Bumps [next](https://github.com/vercel/next.js) from 15.3.2 to 15.5.18.
- [Release notes](https://github.com/vercel/next.js/releases)
- [Changelog](https://github.com/vercel/next.js/blob/canary/release.js)
- [Commits](https://github.com/vercel/next.js/compare/v15.3.2...v15.5.18)

---
updated-dependencies:
- dependency-name: next
  dependency-version: 15.5.18
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <[email protected]>
Lessons update and example framework (#1803)
* Add examples/ folder with bootcamp companion code

* Restructure smart contract lessons into Theory and Practical tracks

Replace the eight flat lessons with their updated versions under a Practical
group, add a 15-lesson Theory track before them, and give each track a course
overview landing page (Blockchain Theory, Hello Cardano). Wire both groups in
the sidebar and redirect the old lesson URLs to their new paths.

* Add Pyth oracle integration doc

Document Pyth Pro price feeds on Cardano and add the page to the Oracles
sidebar. Drop the now-redundant Related footers from charli3 and orcfax.

* Fix broken link in the governance lesson

Point the end-of-course next step to the Hello Cardano overview instead of the
old curriculum path.

* Fix broken link in the token registry docs

Link the Token Registry Server page via its .md file so it resolves from the
question-named page, instead of nesting under it.

* Credit Cardano Builders and point the wallet link to cardano.org/apps

Add a one-line attribution to the Theory and Practical course overviews, and
swap the multisig lesson's old developer-showcase wallet link for the CIP30
wallet filter on cardano.org/apps.
Update contra-tracer SRP: inline runTracerA to fix Hydra OOM
Bumps the pinned tag to include the runTracerA INLINE fix.

Without INLINE, every traceWith call with a nullTracer (Squelching
constructor) allocates a fresh Kleisli wrapper via arr (const ()).  In
the network-mux bearer hot path this amounts to 5 such calls per SDU.
With messages chunked into 1260-byte SDUs, a single 3 MB payload
generates thousands of SDUs and therefore thousands of spurious Kleisli
allocations per traceWith call, producing hundreds of MB of short-lived
GC pressure that pushes the test suite past the 900 MB Hydra limit.

With INLINE on runTracerA and the existing INLINE on traceWith, GHC
reduces traceWith nullTracer x to pure () at the call site: zero
allocation, no GC overhead.
fix(governance): detect on-chain DRep registration in Hydra budget vote (#279)
HydraBudgetVote gated the vote UI on `multisigWallet.getDRepId()` being
truthy, but that is a local key/script derivation that always succeeds —
it is NOT proof of on-chain registration. So a wallet that is a fully
registered, active DRep (shown correctly by the DRep Information card)
was still told to "Register this wallet as a DRep first."

Detect registration the same way the DRep Information card does: look up
the DRep on-chain and check `active === true`. Done via a React Query
hit to Blockfrost `/governance/dreps/{cip105}` (the same endpoint and
getDRepIds helper the global wallet-data loader uses), which also gives a
clean loading state so we no longer flash "register first" before the
status is known. While the wallet or registration lookup is resolving we
show "Checking DRep registration…" instead of the register prompt.

Co-authored-by: Claude Fable 5 <[email protected]>
fix(governance): detect on-chain DRep registration in Hydra budget vote
HydraBudgetVote gated the vote UI on `multisigWallet.getDRepId()` being
truthy, but that is a local key/script derivation that always succeeds —
it is NOT proof of on-chain registration. So a wallet that is a fully
registered, active DRep (shown correctly by the DRep Information card)
was still told to "Register this wallet as a DRep first."

Detect registration the same way the DRep Information card does: look up
the DRep on-chain and check `active === true`. Done via a React Query
hit to Blockfrost `/governance/dreps/{cip105}` (the same endpoint and
getDRepIds helper the global wallet-data loader uses), which also gives a
clean loading state so we no longer flash "register first" before the
status is known. While the wallet or registration lookup is resolving we
show "Checking DRep registration…" instead of the register prompt.

Co-Authored-By: Claude Fable 5 <[email protected]>
refactor(wallet): consolidate all wallet ops on the Mesh 1.9 bridge + ESLint guardrail (#278)
* fix(auth): use Mesh 1.9 wallet so signData args aren't swapped (VESPR -2)

WalletAuthModal signed the nonce with react-2.0's useWallet().wallet, a
low-level CIP-30 wallet whose signData(address, payload) argument order
is swapped relative to Mesh 1.9's signData(payload, address). The call
signData(nonce, address) therefore passed the nonce as the *address* and
the address as the *payload*, so VESPR tried to sign with a bogus signing
address and returned CIP-30 InternalError {code: -2}. (It also explains
the wallet dialog showing the address as the "Nachricht".)

Switch to the 1.9 BrowserWallet via useMeshWallet — the same instance and
(payload, address) order every other signing flow in the app uses. The
UTXOS MeshWallet path is also payload-first, so the single
signData(nonce, address) call is now correct for both wallet types.

Co-Authored-By: Claude Fable 5 <[email protected]>

* refactor(wallet): route all wallet ops through the Mesh 1.9 bridge + guardrail

Every signing/wallet call must use useMeshWallet()/useActiveWallet() (the
Mesh 1.9 IWallet), never react-2.0's useWallet().wallet — the latter is a
low-level CIP-30 wallet whose signData(address, payload) / signTx(tx,
partialSign) signatures differ from 1.9, so a wrong-order call compiles
but signs the wrong bytes.

Fixes 3 live latent copies of that bug (same root cause as the WalletAuth
modal fix):
- HydraBudgetVote: signData on the react-2.0 wallet — the likely source of
  the ballot witness/body-hash divergence.
- instance-tab (cross-instance import): would fail with CIP-30 -2 on VESPR.
- api-docs bearer-token generation: same swapped-args failure.

Also migrates the remaining read-only useWallet().wallet sites (address /
network-id lookups, identical across versions) to the bridge so the
boundary is uniform, and adds null guards where the bridge wallet is
transiently null while enabling.

Guardrail: an ESLint no-restricted-syntax rule makes destructuring
`wallet` from useWallet() a build error, so this bug class can't regress.
useWallet() stays allowed for connection state (name/connected/connect/
disconnect). Verified the rule fires on a violation and passes the bridge.

Co-Authored-By: Claude Fable 5 <[email protected]>

---------

Co-authored-by: Claude Fable 5 <[email protected]>