Home / Pragma / amaru
Jun 24, 2-3 PM (1)
Jun 24, 3-4 PM (2)
Jun 24, 4-5 PM (0)
Jun 24, 5-6 PM (0)
Jun 24, 6-7 PM (0)
Jun 24, 7-8 PM (1)
Jun 24, 8-9 PM (1)
Jun 24, 9-10 PM (0)
Jun 24, 10-11 PM (0)
Jun 24, 11-12 AM (0)
Jun 25, 12-1 AM (0)
Jun 25, 1-2 AM (0)
Jun 25, 2-3 AM (0)
Jun 25, 3-4 AM (0)
Jun 25, 4-5 AM (0)
Jun 25, 5-6 AM (1)
Jun 25, 6-7 AM (2)
Jun 25, 7-8 AM (0)
Jun 25, 8-9 AM (0)
Jun 25, 9-10 AM (4)
Jun 25, 10-11 AM (0)
Jun 25, 11-12 PM (0)
Jun 25, 12-1 PM (0)
Jun 25, 1-2 PM (0)
Jun 25, 2-3 PM (1)
Jun 25, 3-4 PM (0)
Jun 25, 4-5 PM (0)
Jun 25, 5-6 PM (10)
Jun 25, 6-7 PM (0)
Jun 25, 7-8 PM (0)
Jun 25, 8-9 PM (0)
Jun 25, 9-10 PM (0)
Jun 25, 10-11 PM (2)
Jun 25, 11-12 AM (3)
Jun 26, 12-1 AM (0)
Jun 26, 1-2 AM (0)
Jun 26, 2-3 AM (0)
Jun 26, 3-4 AM (0)
Jun 26, 4-5 AM (6)
Jun 26, 5-6 AM (0)
Jun 26, 6-7 AM (0)
Jun 26, 7-8 AM (2)
Jun 26, 8-9 AM (0)
Jun 26, 9-10 AM (0)
Jun 26, 10-11 AM (0)
Jun 26, 11-12 PM (1)
Jun 26, 12-1 PM (1)
Jun 26, 1-2 PM (1)
Jun 26, 2-3 PM (2)
Jun 26, 3-4 PM (0)
Jun 26, 4-5 PM (16)
Jun 26, 5-6 PM (1)
Jun 26, 6-7 PM (0)
Jun 26, 7-8 PM (1)
Jun 26, 8-9 PM (0)
Jun 26, 9-10 PM (1)
Jun 26, 10-11 PM (0)
Jun 26, 11-12 AM (0)
Jun 27, 12-1 AM (0)
Jun 27, 1-2 AM (0)
Jun 27, 2-3 AM (0)
Jun 27, 3-4 AM (0)
Jun 27, 4-5 AM (0)
Jun 27, 5-6 AM (0)
Jun 27, 6-7 AM (0)
Jun 27, 7-8 AM (0)
Jun 27, 8-9 AM (0)
Jun 27, 9-10 AM (0)
Jun 27, 10-11 AM (0)
Jun 27, 11-12 PM (0)
Jun 27, 12-1 PM (2)
Jun 27, 1-2 PM (0)
Jun 27, 2-3 PM (3)
Jun 27, 3-4 PM (0)
Jun 27, 4-5 PM (0)
Jun 27, 5-6 PM (0)
Jun 27, 6-7 PM (0)
Jun 27, 7-8 PM (0)
Jun 27, 8-9 PM (2)
Jun 27, 9-10 PM (1)
Jun 27, 10-11 PM (0)
Jun 27, 11-12 AM (0)
Jun 28, 12-1 AM (0)
Jun 28, 1-2 AM (0)
Jun 28, 2-3 AM (0)
Jun 28, 3-4 AM (0)
Jun 28, 4-5 AM (0)
Jun 28, 5-6 AM (0)
Jun 28, 6-7 AM (0)
Jun 28, 7-8 AM (0)
Jun 28, 8-9 AM (0)
Jun 28, 9-10 AM (0)
Jun 28, 10-11 AM (0)
Jun 28, 11-12 PM (0)
Jun 28, 12-1 PM (0)
Jun 28, 1-2 PM (0)
Jun 28, 2-3 PM (0)
Jun 28, 3-4 PM (0)
Jun 28, 4-5 PM (0)
Jun 28, 5-6 PM (0)
Jun 28, 6-7 PM (0)
Jun 28, 7-8 PM (0)
Jun 28, 8-9 PM (0)
Jun 28, 9-10 PM (0)
Jun 28, 10-11 PM (0)
Jun 28, 11-12 AM (0)
Jun 29, 12-1 AM (0)
Jun 29, 1-2 AM (0)
Jun 29, 2-3 AM (0)
Jun 29, 3-4 AM (0)
Jun 29, 4-5 AM (0)
Jun 29, 5-6 AM (0)
Jun 29, 6-7 AM (0)
Jun 29, 7-8 AM (0)
Jun 29, 8-9 AM (0)
Jun 29, 9-10 AM (0)
Jun 29, 10-11 AM (0)
Jun 29, 11-12 PM (0)
Jun 29, 12-1 PM (0)
Jun 29, 1-2 PM (0)
Jun 29, 2-3 PM (0)
Jun 29, 3-4 PM (0)
Jun 29, 4-5 PM (0)
Jun 29, 5-6 PM (0)
Jun 29, 6-7 PM (0)
Jun 29, 7-8 PM (0)
Jun 29, 8-9 PM (0)
Jun 29, 9-10 PM (0)
Jun 29, 10-11 PM (0)
Jun 29, 11-12 AM (0)
Jun 30, 12-1 AM (0)
Jun 30, 1-2 AM (0)
Jun 30, 2-3 AM (0)
Jun 30, 3-4 AM (0)
Jun 30, 4-5 AM (0)
Jun 30, 5-6 AM (0)
Jun 30, 6-7 AM (1)
Jun 30, 7-8 AM (0)
Jun 30, 8-9 AM (0)
Jun 30, 9-10 AM (0)
Jun 30, 10-11 AM (0)
Jun 30, 11-12 PM (0)
Jun 30, 12-1 PM (0)
Jun 30, 1-2 PM (2)
Jun 30, 2-3 PM (0)
Jun 30, 3-4 PM (0)
Jun 30, 4-5 PM (0)
Jun 30, 5-6 PM (1)
Jun 30, 6-7 PM (0)
Jun 30, 7-8 PM (1)
Jun 30, 8-9 PM (0)
Jun 30, 9-10 PM (0)
Jun 30, 10-11 PM (0)
Jun 30, 11-12 AM (0)
Jul 01, 12-1 AM (0)
Jul 01, 1-2 AM (0)
Jul 01, 2-3 AM (0)
Jul 01, 3-4 AM (0)
Jul 01, 4-5 AM (0)
Jul 01, 5-6 AM (0)
Jul 01, 6-7 AM (1)
Jul 01, 7-8 AM (2)
Jul 01, 8-9 AM (0)
Jul 01, 9-10 AM (0)
Jul 01, 10-11 AM (0)
Jul 01, 11-12 PM (1)
Jul 01, 12-1 PM (2)
Jul 01, 1-2 PM (0)
Jul 01, 2-3 PM (0)
79 commits this week Jun 24, 2025 - Jul 01, 2025
chore: move import_ledger_state into ledger + avoid direct dependency on indicatif
  It makes more sense for this logic to live in the ledger since it's about ... decoding the ledger state (albeit, the Haskell's one).  I've extracted some of the base types to the Kernel, though.

  Also, moving this piece of code to either the ledger or the store would introduce undesirable dependencies there (i.e. 'indicatif'). So we now have to add an indirection through a trait, to ensure that we only introduce shiny progress bars when executing this in the terminal. For testing, we can simply display no progress whatsoever (other than what the test runner provides).

Signed-off-by: KtorZ <[email protected]>
chore: cleanup scripts rules implementation
  The logic was a bit all over the place, to the point where we juggled between inconsistent data-structures and felt to clearly show the validations. Putting chunks of validations into smaller functions help making those incoherences more visible, makes the code more readable and also, more efficient as we can avoid re-doing the same steps multiple times.

  Note that I didn't touch the part that's collecting the redeemers, because I know someone else is currently touching part of this code, and it would create needless conflict at this point, but I intend to.

Signed-off-by: KtorZ <[email protected]>
fix: bump upper bound for PreProd era ending.
  This is only pushing the problem to later, but the 'end' bound of the
  last era summary is actually dynamic and changes every time we gain
  confidence that there will be no hard fork in the next epoch.

  We'll need some logic to handle this ever evolving era boundary. For
  now, I am simply bumping this manually to get the synchronization
  further than epoch ~207, where time horizon errors start occuring.

Signed-off-by: KtorZ <[email protected]>
fix: conflate bootstrap witness' roots and verification key hashes
This is weird. Let's talk. Here's a simplified version of the situation:

To verify witnesses, the Haskell node creates two sets:

1. One contains all "public key hashes" collected from looking at addresses.
2. The other contains all "public key hashes" collected from the both the (normal) verification key witnesses, and the bootstrap witnesses.

However, Byron addresses do not contain public key hashes; but a "root", which is a double-hash of some CBOR structure (which somewhere inside, has a public key; but it is impossible to retrieve it from a 'root').

Also, when collecting witnesses, what's being collected in the case of bootstrap witnesses aren't public key hashes, but those re-computed roots.

Now the problem is that this puts in a set (in either case), two objects that have different semantic, and treat them uniformly; all because they are structurally equivalent (28 bytes of data).

Yet, one can now artifically craft a Byron addresses that holds a public key hash instead of a root; and still spend from it by providing a normal verification key witness. From the outside, the transaction appears as missing bootstrap witnesses, but internally, since both witnesses types are conflated, this is approved by the node.

This phenomenon can be witnessed ( :D ! ) on the following PreProd transaction:

- 0c22edee0ffd7c8f32d2fe4da1f144e9ef78dfb51e1678d5198493a83d6cf8ec

which is spending from what looks like Icarus addresses (i.e. gen 2 bootstrap addresses), but doesn't contain any bootstrap witness whatsoever. It does however contains a normal signature witness (even though it's not spending from any standard pub key address). If we hash the key for that witness, we indeed find the root within the address.

Signed-off-by: KtorZ <[email protected]>
feat: add support for inline datums when assessing known/missing datums.
  Funny enough... this doesn't solve the problem I was originally chasing. I wrongly assumed that was the cause, but looking further into the transaction, it seems that there's simply no script being executed in the transaction. So, there shouldn't be any required datum to begin with.

Signed-off-by: KtorZ <[email protected]>