Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
87 commits
Select commit Hold shift + click to select a range
5eb9e7c
feat: WIP removal of pallas from core
nicolasLuduena Mar 16, 2026
56036ed
feat: create hash struct
nicolasLuduena Mar 16, 2026
a3a4714
fix: config & point compiling
nicolasLuduena Mar 16, 2026
e5fa7cf
wip: bytesvec in eracbor. restricted archive store error
nicolasLuduena Mar 16, 2026
1620c3f
wip: state compiling
nicolasLuduena Mar 16, 2026
4c47ca6
wip: archive compiling
nicolasLuduena Mar 16, 2026
fbf3113
feat: successfully removed pallas from mempool
nicolasLuduena Mar 16, 2026
b547666
feat: async_query compiling
nicolasLuduena Mar 16, 2026
773320a
feat: bootstrap compiling
nicolasLuduena Mar 16, 2026
ca284ad
feat: import compiling
nicolasLuduena Mar 16, 2026
6e273ad
feat: sync compilign
nicolasLuduena Mar 16, 2026
f94062c
feat: crawl submit workunit all take in chain specific errors as params
nicolasLuduena Mar 16, 2026
00c233e
feat(core/builtnin/noop): get chain specific error here as well
nicolasLuduena Mar 16, 2026
48de650
feat(core/builtnin/noop): get chain specific error here as well
nicolasLuduena Mar 16, 2026
65eb2de
chore: add minicbor to core cargo toml and remove pallas
nicolasLuduena Mar 16, 2026
489ad19
feat: lib.rs and validate migrated to new architecture
nicolasLuduena Mar 16, 2026
f4f4f59
feat: add hash from methods to hash to reduce errors
nicolasLuduena Mar 16, 2026
7344ac2
feat(cardano/utils): compiling
nicolasLuduena Mar 16, 2026
e7b3d49
feat(cardano/utxoset): compiling
nicolasLuduena Mar 16, 2026
b13815c
feat(forks): compiling
nicolasLuduena Mar 16, 2026
56b1fa3
feat(owned): compiling
nicolasLuduena Mar 16, 2026
4302c76
fix(cardano/model): map errors to ChainSpecific errors
nicolasLuduena Mar 16, 2026
022f88c
fix(core): restrict domain in specific functions
nicolasLuduena Mar 16, 2026
5096368
fix(cardano/lib): restrcit domain to build
nicolasLuduena Mar 16, 2026
efc7c63
fix(cardano/eras): fix error type
nicolasLuduena Mar 16, 2026
e8ab901
remove plan
nicolasLuduena Mar 16, 2026
11bb69f
feat(cardano/estart): fix error constraints
nicolasLuduena Mar 17, 2026
063bbbc
feat(cardano/ewrap): fix error constraints
nicolasLuduena Mar 17, 2026
443084b
fix(cardano/genesis): type constraints ok
nicolasLuduena Mar 17, 2026
37ca6a8
fix(cardano/configs): genesis
nicolasLuduena Mar 17, 2026
d1757a7
fix(indexes/delta): bytes & txo_ref
nicolasLuduena Mar 17, 2026
75f2de0
fix(cardano/indexes): query fix
nicolasLuduena Mar 17, 2026
2eae04f
fix(cardano): same strategy as before
nicolasLuduena Mar 17, 2026
652c30e
fix(crates/redb3): compile redb3
nicolasLuduena Mar 17, 2026
cb74c6f
fix(minibf): compiling with the new setup
nicolasLuduena Mar 17, 2026
0a561b3
fix: clippy
nicolasLuduena Mar 17, 2026
efedd9a
fix(minikupo): compiling
nicolasLuduena Mar 17, 2026
60a3da7
fix(trp): compiling
nicolasLuduena Mar 17, 2026
bc407a0
fix: prelude cardano error
nicolasLuduena Mar 17, 2026
7c1bd0c
fix: era_cbor_from_output use pallas From
nicolasLuduena Mar 17, 2026
03c2ea1
feat(adapters): mapping errors and types to core
nicolasLuduena Mar 17, 2026
d905e40
fix: rest of compilation issues on main solved by claude (they are al…
nicolasLuduena Mar 17, 2026
35eb654
fix: core & archive have generic chain error (even if infallible)
nicolasLuduena Mar 17, 2026
982b474
fix: tests & format rest of crates
nicolasLuduena Mar 18, 2026
7281b9f
chore: remove useless chain_id from genesis
nicolasLuduena Mar 20, 2026
48b6fe8
feat: dolos core without minicbore
nicolasLuduena Mar 20, 2026
6ca9197
Merge branch 'main' into refactor/agnostic-core
nicolasLuduena Apr 1, 2026
5d3548c
Merge branch 'main' into refactor/agnostic-core
nicolasLuduena Apr 1, 2026
da8603e
fix: some critical missing code
nicolasLuduena Apr 1, 2026
471ce0d
feat: add missing type constraints
nicolasLuduena Apr 2, 2026
1e4e22f
fix: rejec malfored intersect hashes
nicolasLuduena Apr 2, 2026
be1c545
fix: archive typo
nicolasLuduena Apr 2, 2026
b402dbc
fix: reuse of chain point to pallas
nicolasLuduena Apr 2, 2026
d1feb19
feat: introduce CardanoDomain to cleanup code a bit
nicolasLuduena Apr 4, 2026
3641230
fix: use stack allocated mem for processing inputs
nicolasLuduena Apr 4, 2026
c91d32a
fix: use CardanoDomain on roll workunit
nicolasLuduena Apr 6, 2026
82b8288
fix: remove TODO
nicolasLuduena Apr 6, 2026
fa846fc
fix: handle errors gracefully
nicolasLuduena Apr 6, 2026
6e2cb73
fix: simplified txo_ref bytes representation
nicolasLuduena Apr 6, 2026
43ab837
fix: type issue on total output on era start
nicolasLuduena Apr 6, 2026
34746e8
fix: add static to ArchiveStore error
nicolasLuduena Apr 6, 2026
469cc65
fix: handle decoding failures on tx_produces and tx_consumes
nicolasLuduena Apr 6, 2026
9de4a35
fix: handle network id missing on trp from genesis
nicolasLuduena Apr 6, 2026
7874e4b
fix: use deduplicated refs for wal shortcircuite
nicolasLuduena Apr 6, 2026
a52a139
fix: add evaluation report as associated type
nicolasLuduena Apr 6, 2026
8bdc38f
fix: remove report from mempool
nicolasLuduena Apr 6, 2026
351a2ee
fix: remove report from mempool
nicolasLuduena Apr 6, 2026
4dbcfd0
feat(dolos-cardano): implement eval report with pallas
nicolasLuduena Apr 6, 2026
6a074f8
fix: utxorpc uses the new refactor
nicolasLuduena Apr 6, 2026
6db064b
refactor: eracbor is now tagged payload
nicolasLuduena Apr 6, 2026
baac09b
fix: dont return before committing written pools
nicolasLuduena Apr 7, 2026
4ef537e
fix: use rupd time registration snapshot
nicolasLuduena Apr 7, 2026
cce804d
fix: handle genesis missing fields
nicolasLuduena Apr 7, 2026
e197c22
fix: handle genesis missing fields
nicolasLuduena Apr 7, 2026
5bdaabb
fix: return typed validation error on missing chain context
nicolasLuduena Apr 7, 2026
9c5a4ed
fix: remove commented out error
nicolasLuduena Apr 7, 2026
76fd39a
fix: cleanup cardano errors from core
nicolasLuduena Apr 7, 2026
a29aee8
fix: add static to chainspecificerror on chainlogic and workunit
nicolasLuduena Apr 7, 2026
23d15c8
fix: core uses TxHash for methods that take TxHash as input
nicolasLuduena Apr 7, 2026
4d932bc
fix: dont truncate slot in test helper
nicolasLuduena Apr 7, 2026
a2af8cb
fix: remove commented out code
nicolasLuduena Apr 7, 2026
5e23a27
fix: simply error mapping
nicolasLuduena Apr 7, 2026
5b30918
fix: simplify import
nicolasLuduena Apr 7, 2026
2898a85
fix: mempool checks if tagged payload is array of two on decoding
nicolasLuduena Apr 7, 2026
7f51f19
fix: fail gracefully
nicolasLuduena Apr 7, 2026
cd3e1ad
fix: remove pointless boxed error
nicolasLuduena Apr 7, 2026
47cfdc3
fix: handle point conversion errors
nicolasLuduena Apr 7, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

16 changes: 10 additions & 6 deletions crates/cardano/src/eras.rs
Original file line number Diff line number Diff line change
Expand Up @@ -187,7 +187,9 @@ impl ChainSummary {
}
}

pub fn load_era_summary<D: Domain>(state: &D::State) -> Result<ChainSummary, ChainError> {
pub fn load_era_summary<D: Domain>(
state: &D::State,
) -> Result<ChainSummary, ChainError<D::ChainSpecificError>> {
let eras = state.iter_entities_typed(EraSummary::NS, None)?;

let mut chain = ChainSummary::default();
Expand All @@ -201,7 +203,9 @@ pub fn load_era_summary<D: Domain>(state: &D::State) -> Result<ChainSummary, Cha
Ok(chain)
}

pub fn load_chain_summary_from_state(state: &impl StateStore) -> Result<ChainSummary, ChainError> {
pub fn load_chain_summary_from_state(
state: &impl StateStore,
) -> Result<ChainSummary, ChainError<crate::CardanoError>> {
let eras = state.iter_entities_typed(EraSummary::NS, None)?;

let mut chain = ChainSummary::default();
Expand Down Expand Up @@ -237,9 +241,9 @@ pub fn log_epoch_range_to_key_range(
(start_slot, end_slot, range)
}

pub fn load_active_era<D: Domain>(
pub fn load_active_era<D: Domain<ChainSpecificError = crate::CardanoError>>(
state: &D::State,
) -> Result<(EraProtocol, EraSummary), ChainError> {
) -> Result<(EraProtocol, EraSummary), ChainError<crate::CardanoError>> {
let eras = state.iter_entities_typed::<EraSummary>(EraSummary::NS, None)?;

match eras.last() {
Expand All @@ -248,8 +252,8 @@ pub fn load_active_era<D: Domain>(
let protocol = EraProtocol::from(key);
Ok((protocol, summary))
}
Err(_) => Err(ChainError::EraNotFound),
Err(_) => Err(ChainError::ChainSpecific(crate::CardanoError::EraNotFound)),
},
None => Err(ChainError::EraNotFound),
None => Err(ChainError::ChainSpecific(crate::CardanoError::EraNotFound)),
}
}
16 changes: 9 additions & 7 deletions crates/cardano/src/estart/commit.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,11 @@
//! in memory.

use dolos_core::{
ArchiveStore, ArchiveWriter, BlockSlot, BrokenInvariant, ChainError, ChainPoint, Domain,
Entity, EntityDelta as _, EntityKey, LogKey, NsKey, StateStore, StateWriter, TemporalKey,
ArchiveStore, ArchiveWriter, BlockSlot, BrokenInvariant, ChainError, ChainPoint, Entity,
EntityDelta as _, EntityKey, LogKey, NsKey, StateStore, StateWriter, TemporalKey,
};

use crate::CardanoDomain;
use tracing::{debug, instrument, trace, warn};

use crate::{
Expand All @@ -31,7 +33,7 @@ impl super::WorkContext {
fn collect_era_transition(
&self,
state: &impl StateStore,
) -> Result<Option<EraTransitionData>, ChainError> {
) -> Result<Option<EraTransitionData>, ChainError<crate::CardanoError>> {
let Some(transition) = self.ended_state().pparams.era_transition() else {
return Ok(None);
};
Expand Down Expand Up @@ -75,9 +77,9 @@ impl super::WorkContext {
&mut self,
state: &D::State,
writer: &<D::State as StateStore>::Writer,
) -> Result<(), ChainError>
) -> Result<(), ChainError<crate::CardanoError>>
where
D: Domain,
D: CardanoDomain,
E: Entity + FixedNamespace + Into<CardanoEntity>,
{
let records = state.iter_entities_typed::<E>(E::NS, None)?;
Expand Down Expand Up @@ -109,12 +111,12 @@ impl super::WorkContext {
}

#[instrument(skip_all)]
pub fn commit<D: Domain>(
pub fn commit<D: CardanoDomain>(
&mut self,
state: &D::State,
archive: &D::Archive,
slot: BlockSlot,
) -> Result<(), ChainError> {
) -> Result<(), ChainError<crate::CardanoError>> {
debug!("committing estart changes");

// Collect era transition data first (only 1-2 entities, not a memory concern)
Expand Down
47 changes: 26 additions & 21 deletions crates/cardano/src/estart/loading.rs
Original file line number Diff line number Diff line change
@@ -1,14 +1,19 @@
use std::sync::Arc;

use dolos_core::{ChainError, Domain, Genesis, StateStore, TxoRef};
use dolos_core::{ChainError, StateStore, TxoRef};

use crate::CardanoDomain;

use crate::{
estart::BoundaryVisitor, load_era_summary, roll::WorkDeltas, AccountState, DRepState,
EraProtocol, FixedNamespace as _, PoolState, ProposalState,
};

impl super::WorkContext {
pub fn compute_deltas<D: Domain>(&mut self, state: &D::State) -> Result<(), ChainError> {
pub fn compute_deltas<D: CardanoDomain>(
&mut self,
state: &D::State,
) -> Result<(), ChainError<crate::CardanoError>> {
let mut visitor_nonces = super::nonces::BoundaryVisitor;
let mut visitor_reset = super::reset::BoundaryVisitor::default();

Expand Down Expand Up @@ -57,38 +62,38 @@ impl super::WorkContext {
/// Compute the value of unredeemed AVVM UTxOs at the Shelley→Allegra
/// boundary. These UTxOs are removed from the UTxO set and their value
/// returned to reserves, matching the Haskell ledger's `translateEra`.
fn compute_avvm_reclamation<D: Domain>(
fn compute_avvm_reclamation<D: CardanoDomain>(
state: &D::State,
genesis: &Genesis,
) -> Result<u64, ChainError> {
genesis: &crate::CardanoGenesis,
) -> Result<u64, ChainError<crate::CardanoError>> {
let avvm_utxos = pallas::ledger::configs::byron::genesis_avvm_utxos(&genesis.byron);

// Collect all Byron genesis AVVM UTxO refs (bootstrap redeemer addresses)
let refs: Vec<TxoRef> = avvm_utxos.iter().map(|(tx, _, _)| TxoRef(*tx, 0)).collect();
let refs: Vec<TxoRef> = avvm_utxos
.iter()
.map(|(tx, _, _)| TxoRef(crate::pallas_hash_to_core(*tx), 0))
.collect();

// Query the UTxO set to find which are still unspent
let remaining = state.get_utxos(refs)?;

// Sum the remaining values
let total: u64 = remaining
.values()
.map(|utxo| {
pallas::ledger::traverse::MultiEraOutput::try_from(utxo.as_ref())
.map(|o| o.value().coin())
.unwrap_or(0)
})
.sum();

tracing::debug!(
remaining_count = remaining.len(),
total_avvm = total,
"AVVM reclamation at Shelley→Allegra boundary"
);
let mut total = 0u64;

for utxo in remaining.values() {
total += crate::multi_era_output_from_era_cbor(utxo.as_ref())
.map_err(ChainError::ChainSpecific)?
.value()
.coin();
}

Ok(total)
}

pub fn load<D: Domain>(state: &D::State, genesis: Arc<Genesis>) -> Result<Self, ChainError> {
pub fn load<D: CardanoDomain>(
state: &D::State,
genesis: Arc<crate::CardanoGenesis>,
) -> Result<Self, ChainError<crate::CardanoError>> {
let ended_state = crate::load_epoch::<D>(state)?;
let chain_summary = load_era_summary::<D>(state)?;
let active_protocol = EraProtocol::from(chain_summary.edge().protocol);
Expand Down
14 changes: 7 additions & 7 deletions crates/cardano/src/estart/mod.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
use std::sync::Arc;

use dolos_core::{ChainError, EntityKey, Genesis};
use dolos_core::{ChainError, EntityKey};

use crate::{
eras::ChainSummary, roll::WorkDeltas, AccountState, CardanoDelta, CardanoEntity, DRepState,
Expand All @@ -24,7 +24,7 @@ pub trait BoundaryVisitor {
ctx: &mut WorkContext,
id: &PoolId,
pool: &PoolState,
) -> Result<(), ChainError> {
) -> Result<(), ChainError<crate::CardanoError>> {
Ok(())
}

Expand All @@ -34,7 +34,7 @@ pub trait BoundaryVisitor {
ctx: &mut WorkContext,
id: &AccountId,
account: &AccountState,
) -> Result<(), ChainError> {
) -> Result<(), ChainError<crate::CardanoError>> {
Ok(())
}

Expand All @@ -44,7 +44,7 @@ pub trait BoundaryVisitor {
ctx: &mut WorkContext,
id: &DRepId,
drep: &DRepState,
) -> Result<(), ChainError> {
) -> Result<(), ChainError<crate::CardanoError>> {
Ok(())
}

Expand All @@ -54,12 +54,12 @@ pub trait BoundaryVisitor {
ctx: &mut WorkContext,
id: &ProposalId,
proposal: &ProposalState,
) -> Result<(), ChainError> {
) -> Result<(), ChainError<crate::CardanoError>> {
Ok(())
}

#[allow(unused_variables)]
fn flush(&mut self, ctx: &mut WorkContext) -> Result<(), ChainError> {
fn flush(&mut self, ctx: &mut WorkContext) -> Result<(), ChainError<crate::CardanoError>> {
Ok(())
}
}
Expand All @@ -75,7 +75,7 @@ pub struct WorkContext {

pub active_protocol: EraProtocol,
pub chain_summary: ChainSummary,
pub genesis: Arc<Genesis>,
pub genesis: Arc<crate::CardanoGenesis>,

/// Unredeemed AVVM UTxOs reclaimed at the Shelley→Allegra boundary.
pub avvm_reclamation: u64,
Expand Down
15 changes: 10 additions & 5 deletions crates/cardano/src/estart/nonces.rs
Original file line number Diff line number Diff line change
Expand Up @@ -34,11 +34,13 @@ impl EntityDelta for NonceTransition {
}
}

fn next_largest_stable_slot(ctx: &super::WorkContext) -> BlockSlot {
let stability_window = nonce_stability_window(ctx.active_protocol.into(), &ctx.genesis);
fn next_largest_stable_slot(
ctx: &super::WorkContext,
) -> Result<BlockSlot, ChainError<crate::CardanoError>> {
let stability_window = nonce_stability_window(ctx.active_protocol.into(), &ctx.genesis)?;
let epoch_finish_slot = ctx.chain_summary.epoch_start(ctx.starting_epoch_no() + 1);

sub!(epoch_finish_slot, stability_window)
Ok(sub!(epoch_finish_slot, stability_window))
}

fn initial_nonces(ctx: &super::WorkContext) -> Option<Nonces> {
Expand All @@ -65,8 +67,11 @@ fn next_nonce(ctx: &super::WorkContext) -> Option<Nonces> {
pub struct BoundaryVisitor;

impl super::BoundaryVisitor for BoundaryVisitor {
fn flush(&mut self, ctx: &mut super::WorkContext) -> Result<(), ChainError> {
let next_slot = next_largest_stable_slot(ctx);
fn flush(
&mut self,
ctx: &mut super::WorkContext,
) -> Result<(), ChainError<crate::CardanoError>> {
let next_slot = next_largest_stable_slot(ctx)?;
let next_nonce = next_nonce(ctx);

ctx.deltas.add_for_entity(NonceTransition {
Expand Down
10 changes: 5 additions & 5 deletions crates/cardano/src/estart/reset.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
use std::sync::Arc;

use dolos_core::{ChainError, Genesis, NsKey};
use dolos_core::{ChainError, NsKey};
use pallas::ledger::primitives::Epoch;
use serde::{Deserialize, Serialize};

Expand Down Expand Up @@ -87,7 +87,7 @@ pub struct EpochTransition {
era_transition: Option<EraTransition>,

#[serde(skip)]
genesis: Option<Arc<Genesis>>,
genesis: Option<Arc<crate::CardanoGenesis>>,
}

impl std::fmt::Debug for EpochTransition {
Expand Down Expand Up @@ -252,7 +252,7 @@ impl super::BoundaryVisitor for BoundaryVisitor {
ctx: &mut super::WorkContext,
id: &AccountId,
_: &AccountState,
) -> Result<(), ChainError> {
) -> Result<(), ChainError<crate::CardanoError>> {
self.change(AccountTransition::new(id.clone(), ctx.starting_epoch_no()));

Ok(())
Expand All @@ -263,13 +263,13 @@ impl super::BoundaryVisitor for BoundaryVisitor {
ctx: &mut super::WorkContext,
id: &PoolId,
_: &PoolState,
) -> Result<(), ChainError> {
) -> Result<(), ChainError<crate::CardanoError>> {
self.change(PoolTransition::new(id.clone(), ctx.starting_epoch_no()));

Ok(())
}

fn flush(&mut self, ctx: &mut WorkContext) -> Result<(), ChainError> {
fn flush(&mut self, ctx: &mut WorkContext) -> Result<(), ChainError<crate::CardanoError>> {
for delta in self.deltas.drain(..) {
ctx.add_delta(delta);
}
Expand Down
Loading