May 23, 10-11 AM (1)
May 23, 11-12 PM (5)
May 23, 12-1 PM (1)
May 23, 1-2 PM (6)
May 23, 2-3 PM (5)
May 23, 3-4 PM (5)
May 23, 4-5 PM (4)
May 23, 5-6 PM (0)
May 23, 6-7 PM (3)
May 23, 7-8 PM (23)
May 23, 8-9 PM (1)
May 23, 9-10 PM (9)
May 23, 10-11 PM (21)
May 23, 11-12 AM (27)
May 24, 12-1 AM (9)
May 24, 1-2 AM (0)
May 24, 2-3 AM (1)
May 24, 3-4 AM (1)
May 24, 4-5 AM (0)
May 24, 5-6 AM (3)
May 24, 6-7 AM (1)
May 24, 7-8 AM (2)
May 24, 8-9 AM (2)
May 24, 9-10 AM (4)
May 24, 10-11 AM (4)
May 24, 11-12 PM (1)
May 24, 12-1 PM (7)
May 24, 1-2 PM (46)
May 24, 2-3 PM (5)
May 24, 3-4 PM (3)
May 24, 4-5 PM (18)
May 24, 5-6 PM (2)
May 24, 6-7 PM (4)
May 24, 7-8 PM (13)
May 24, 8-9 PM (10)
May 24, 9-10 PM (15)
May 24, 10-11 PM (34)
May 24, 11-12 AM (42)
May 25, 12-1 AM (9)
May 25, 1-2 AM (5)
May 25, 2-3 AM (6)
May 25, 3-4 AM (1)
May 25, 4-5 AM (6)
May 25, 5-6 AM (14)
May 25, 6-7 AM (17)
May 25, 7-8 AM (17)
May 25, 8-9 AM (32)
May 25, 9-10 AM (43)
May 25, 10-11 AM (64)
May 25, 11-12 PM (33)
May 25, 12-1 PM (43)
May 25, 1-2 PM (40)
May 25, 2-3 PM (20)
May 25, 3-4 PM (27)
May 25, 4-5 PM (16)
May 25, 5-6 PM (6)
May 25, 6-7 PM (7)
May 25, 7-8 PM (11)
May 25, 8-9 PM (12)
May 25, 9-10 PM (16)
May 25, 10-11 PM (44)
May 25, 11-12 AM (26)
May 26, 12-1 AM (12)
May 26, 1-2 AM (11)
May 26, 2-3 AM (8)
May 26, 3-4 AM (11)
May 26, 4-5 AM (6)
May 26, 5-6 AM (9)
May 26, 6-7 AM (26)
May 26, 7-8 AM (43)
May 26, 8-9 AM (39)
May 26, 9-10 AM (42)
May 26, 10-11 AM (45)
May 26, 11-12 PM (59)
May 26, 12-1 PM (34)
May 26, 1-2 PM (50)
May 26, 2-3 PM (50)
May 26, 3-4 PM (18)
May 26, 4-5 PM (20)
May 26, 5-6 PM (13)
May 26, 6-7 PM (20)
May 26, 7-8 PM (12)
May 26, 8-9 PM (15)
May 26, 9-10 PM (15)
May 26, 10-11 PM (35)
May 26, 11-12 AM (30)
May 27, 12-1 AM (16)
May 27, 1-2 AM (8)
May 27, 2-3 AM (9)
May 27, 3-4 AM (5)
May 27, 4-5 AM (32)
May 27, 5-6 AM (9)
May 27, 6-7 AM (49)
May 27, 7-8 AM (65)
May 27, 8-9 AM (38)
May 27, 9-10 AM (74)
May 27, 10-11 AM (83)
May 27, 11-12 PM (30)
May 27, 12-1 PM (50)
May 27, 1-2 PM (39)
May 27, 2-3 PM (53)
May 27, 3-4 PM (37)
May 27, 4-5 PM (11)
May 27, 5-6 PM (18)
May 27, 6-7 PM (21)
May 27, 7-8 PM (25)
May 27, 8-9 PM (17)
May 27, 9-10 PM (15)
May 27, 10-11 PM (29)
May 27, 11-12 AM (27)
May 28, 12-1 AM (9)
May 28, 1-2 AM (3)
May 28, 2-3 AM (5)
May 28, 3-4 AM (2)
May 28, 4-5 AM (9)
May 28, 5-6 AM (34)
May 28, 6-7 AM (31)
May 28, 7-8 AM (84)
May 28, 8-9 AM (33)
May 28, 9-10 AM (54)
May 28, 10-11 AM (50)
May 28, 11-12 PM (21)
May 28, 12-1 PM (46)
May 28, 1-2 PM (50)
May 28, 2-3 PM (23)
May 28, 3-4 PM (43)
May 28, 4-5 PM (86)
May 28, 5-6 PM (13)
May 28, 6-7 PM (31)
May 28, 7-8 PM (43)
May 28, 8-9 PM (34)
May 28, 9-10 PM (17)
May 28, 10-11 PM (36)
May 28, 11-12 AM (32)
May 29, 12-1 AM (12)
May 29, 1-2 AM (13)
May 29, 2-3 AM (4)
May 29, 3-4 AM (3)
May 29, 4-5 AM (0)
May 29, 5-6 AM (2)
May 29, 6-7 AM (5)
May 29, 7-8 AM (16)
May 29, 8-9 AM (37)
May 29, 9-10 AM (34)
May 29, 10-11 AM (69)
May 29, 11-12 PM (25)
May 29, 12-1 PM (44)
May 29, 1-2 PM (66)
May 29, 2-3 PM (60)
May 29, 3-4 PM (25)
May 29, 4-5 PM (26)
May 29, 5-6 PM (79)
May 29, 6-7 PM (11)
May 29, 7-8 PM (19)
May 29, 8-9 PM (9)
May 29, 9-10 PM (8)
May 29, 10-11 PM (27)
May 29, 11-12 AM (7)
May 30, 12-1 AM (8)
May 30, 1-2 AM (1)
May 30, 2-3 AM (1)
May 30, 3-4 AM (3)
May 30, 4-5 AM (2)
May 30, 5-6 AM (11)
May 30, 6-7 AM (0)
May 30, 7-8 AM (2)
May 30, 8-9 AM (11)
May 30, 9-10 AM (11)
May 30, 10-11 AM (4)
3,679 commits this week May 23, 2026 - May 30, 2026
chore(deps): Bump google.golang.org/api from 0.267.0 to 0.282.0
Bumps [google.golang.org/api](https://github.com/googleapis/google-api-go-client) from 0.267.0 to 0.282.0.
- [Release notes](https://github.com/googleapis/google-api-go-client/releases)
- [Changelog](https://github.com/googleapis/google-api-go-client/blob/main/CHANGES.md)
- [Commits](https://github.com/googleapis/google-api-go-client/compare/v0.267.0...v0.282.0)

---
updated-dependencies:
- dependency-name: google.golang.org/api
  dependency-version: 0.274.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <[email protected]>
chore(deps): Bump github.com/go-playground/validator/v10
Bumps [github.com/go-playground/validator/v10](https://github.com/go-playground/validator) from 10.30.1 to 10.30.3.
- [Release notes](https://github.com/go-playground/validator/releases)
- [Commits](https://github.com/go-playground/validator/compare/v10.30.1...v10.30.3)

---
updated-dependencies:
- dependency-name: github.com/go-playground/validator/v10
  dependency-version: 10.30.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <[email protected]>
chore(deps): Bump docker/build-push-action from 7.0.0 to 7.2.0
Bumps [docker/build-push-action](https://github.com/docker/build-push-action) from 7.0.0 to 7.2.0.
- [Release notes](https://github.com/docker/build-push-action/releases)
- [Commits](https://github.com/docker/build-push-action/compare/d08e5c354a6adb9ed34480a06d141179aa583294...f9f3042f7e2789586610d6e8b85c8f03e5195baf)

---
updated-dependencies:
- dependency-name: docker/build-push-action
  dependency-version: 7.2.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <[email protected]>
chore(deps): Bump github.com/blinklabs-io/gouroboros (#480)
Bumps [github.com/blinklabs-io/gouroboros](https://github.com/blinklabs-io/gouroboros) from 0.160.3 to 0.179.0.
- [Release notes](https://github.com/blinklabs-io/gouroboros/releases)
- [Changelog](https://github.com/blinklabs-io/gouroboros/blob/main/RELEASE_NOTES.md)
- [Commits](https://github.com/blinklabs-io/gouroboros/compare/v0.160.3...v0.179.0)

---
updated-dependencies:
- dependency-name: github.com/blinklabs-io/gouroboros
  dependency-version: 0.163.5
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Dedupe identical consecutive watch events per peer key
Under heavy packet loss (pumba 90% in CI), 'broadcastMessages' retries
'putMessage' on transient GrpcDeadlineExceeded. The original put often
already committed server-side, so the retry creates a second etcd
revision with the same key and same value. The watcher delivers both,
HeadLogic processes the same ReqTx twice, and the second one emits
TxInvalid with reason 'ConwayMempoolFailure "All inputs are spent.
Transaction has probably already been included"'. The bench's invalid
counter goes non-zero and runSingle exits 1.

Hydra never legitimately re-broadcasts identical content from the same
peer (each msg has unique tx id / snapshot number / etc.), so a
content-equal watch event for a key whose last value we already
delivered is unambiguously a transport retry. Track lastValuesVar in
waitMessages and silently drop those duplicates.

Also fix the NetworkSpec 'handles compaction and lost local state' test
off-by-one (forM_ [5..100] overlapped the [1..5] batch above, so the
second msg=5 was a legitimate dedup target).

Co-Authored-By: Claude Opus 4.7 (1M context) <[email protected]>
refactor: use ScrubbedBytes for plaintext key material buffers
Four internal ByteString allocations held the raw 128-byte extended
private key (ed25519 scalar || public key || chain code) in memory
without guaranteed zeroing on GC.  Switch them to ScrubbedBytes so
the memory package zeroes the pages when they are collected.

  - keyMaterialFromLegacyBytes: avoids an intermediate full :: ByteString
    carrying all 128 bytes; slices secret/pub/cc directly from ScrubbedBytes
  - legacyMaterialFromSecret / legacyMaterialFromMasterKey / legacyDerivePrivate:
    type annotations changed from ByteString to ScrubbedBytes so B.allocRet
    allocates scrubbed pages from the start

No public API or serialisation changes.
refactor: use MLockedSizedBytes for secret key material
The plaintext 64-byte ed25519 scalar is now held in sodium_malloc'd
memory (MLockedSizedBytes 64) throughout its lifetime:
- locked against swapping (mlock)
- never moved by the GC
- zeroed on release via mlsbFinalize

ScrubbedBytes (GC-heap, moveable, swappable) is no longer used for
any secret key material.  The wrapping key (Argon2id output) remains
in ScrubbedBytes for now.

All public crypto operations are now IO (Either XPrvError X).  The
unsafePerformIO facade is gone except for:
- the two global IORef initialisations (runtimeKdfParamsRef, randomModeRef)
- encryptedDerivePublic (pure EC math, no secret key involved)

Callers of encryptedKeyMaterial receive a MLockedSizedBytes 64 and
are responsible for calling mlsbFinalize when done with it.

Adds cardano-crypto-class to library build-depends.
fix: address cryptographer review of encrypted_sign.c and FFI bindings
- secure_clear secret_key on the error path in cardano_wallet_encrypted_from_secret
- change cardano_wallet_encrypted_sign and cardano_wallet_encrypted_derive_private
  from void to int so Haskell callers can detect failures
- update FFI declarations from IO () to IO CInt and propagate errors as
  Left XPrvInternalError in encryptedSign and legacyDerivePrivate
Address lehins review feedback on cardano-crypto-wallet
- Rename testlib module Instances -> Arbitrary per project convention
- Use genByteString instead of replicateM in Arbitrary instances
- Align C/FFI types with libsodium (CULLong/CSize, no intermediate casts)
- Add TypeApplications annotations on fromIntegral at FFI call sites
- Fix async exception safety in encryptedChangePass/Sign/DerivePrivate
- Replace if/else pure () with when in CBOR decoders
- Replace tuple KDF param comparison with || conditions
- Add MasterKeyPtr newtype for 96-byte master key
- Use aroundAll_ in test harness for correct hspec setup
- Update copyright years to 2026