From f7204fcd24417ed79bf48b205667eb35121c801c Mon Sep 17 00:00:00 2001 From: Maximiliano Duthey Date: Wed, 31 Dec 2025 11:00:40 -0300 Subject: [PATCH 1/2] feat: add support for cbor witnesses --- crates/trp/src/methods.rs | 58 +++++++++++++++++++++++++++++++-------- 1 file changed, 47 insertions(+), 11 deletions(-) diff --git a/crates/trp/src/methods.rs b/crates/trp/src/methods.rs index 40138b48..81e43788 100644 --- a/crates/trp/src/methods.rs +++ b/crates/trp/src/methods.rs @@ -1,8 +1,12 @@ use jsonrpsee::types::Params; -use pallas::{codec::utils::NonEmptySet, ledger::primitives::conway::VKeyWitness}; +use pallas::{ + codec::utils::NonEmptySet, + ledger::primitives::conway::{VKeyWitness, WitnessSet}, +}; +use serde::Deserialize; use std::sync::Arc; -use tx3_resolver::trp::{ResolveParams, SubmitParams, SubmitResponse, SubmitWitness, TxEnvelope}; +use tx3_resolver::{interop::BytesEnvelope, trp::{ResolveParams, SubmitResponse, SubmitWitness, TxEnvelope}}; use dolos_core::{facade::receive_tx, Domain, MempoolAwareUtxoStore, StateStore as _}; @@ -39,15 +43,49 @@ pub async fn trp_resolve( }) } -fn apply_witnesses(original: &[u8], witnesses: &[SubmitWitness]) -> Result, Error> { +// TODO: This should be moved to tx3-resolver crate +#[derive(Deserialize)] +#[serde(untagged)] +enum WitnessInput { + Object(SubmitWitness), + Hex(String), +} + +// TODO: This should be moved to tx3-resolver crate +#[derive(Deserialize)] +struct SubmitParamsInput { + #[serde(rename = "tx")] + pub tx: BytesEnvelope, + #[serde(rename = "witnesses")] + pub witnesses: Vec, +} + +fn apply_witnesses(original: &[u8], witnesses: &[WitnessInput]) -> Result, Error> { let tx = pallas::ledger::traverse::MultiEraTx::decode(original)?; let mut tx = tx.as_conway().ok_or(Error::UnsupportedTxEra)?.to_owned(); - let map_witness = |witness: &SubmitWitness| VKeyWitness { - vkey: Vec::::from(witness.key.clone()).into(), - signature: Vec::::from(witness.signature.clone()).into(), - }; + let mut new_vkeys = Vec::new(); + + for witness in witnesses { + match witness { + WitnessInput::Object(w) => { + new_vkeys.push(VKeyWitness { + vkey: Vec::::from(w.key.clone()).into(), + signature: Vec::::from(w.signature.clone()).into(), + }); + } + WitnessInput::Hex(h) => { + let bytes = hex::decode(h).map_err(|_| Error::InternalError("Invalid witness hex".into()))?; + let witness_set: WitnessSet = pallas::codec::minicbor::decode(&bytes) + .map_err(|_| Error::InternalError("Invalid witness set cbor".into()))?; + + if let Some(vkeys) = witness_set.vkeywitness { + new_vkeys.extend(vkeys.to_vec()); + } + } + } + } let mut witness_set = tx.transaction_witness_set.unwrap(); @@ -57,9 +95,7 @@ fn apply_witnesses(original: &[u8], witnesses: &[SubmitWitness]) -> Result = old.chain(new).collect(); + let all: Vec<_> = old.chain(new_vkeys).collect(); witness_set.vkeywitness = NonEmptySet::from_vec(all); @@ -72,7 +108,7 @@ pub async fn trp_submit( params: Params<'_>, context: Arc>, ) -> Result { - let params: SubmitParams = params.parse()?; + let params: SubmitParamsInput = params.parse()?; let mut bytes = Vec::::from(params.tx); From a041073f1a54b6a0419cb0f1d1fd76b8b1737999 Mon Sep 17 00:00:00 2001 From: Maximiliano Duthey Date: Mon, 5 Jan 2026 16:45:00 -0300 Subject: [PATCH 2/2] chore: use SubmitParams and WitnessInput from tx3_resolver --- crates/trp/src/methods.rs | 22 ++-------------------- 1 file changed, 2 insertions(+), 20 deletions(-) diff --git a/crates/trp/src/methods.rs b/crates/trp/src/methods.rs index 81e43788..9fa750eb 100644 --- a/crates/trp/src/methods.rs +++ b/crates/trp/src/methods.rs @@ -3,10 +3,9 @@ use pallas::{ codec::utils::NonEmptySet, ledger::primitives::conway::{VKeyWitness, WitnessSet}, }; -use serde::Deserialize; use std::sync::Arc; -use tx3_resolver::{interop::BytesEnvelope, trp::{ResolveParams, SubmitResponse, SubmitWitness, TxEnvelope}}; +use tx3_resolver::{trp::{ResolveParams, SubmitResponse, SubmitParams, WitnessInput, TxEnvelope}}; use dolos_core::{facade::receive_tx, Domain, MempoolAwareUtxoStore, StateStore as _}; @@ -43,23 +42,6 @@ pub async fn trp_resolve( }) } -// TODO: This should be moved to tx3-resolver crate -#[derive(Deserialize)] -#[serde(untagged)] -enum WitnessInput { - Object(SubmitWitness), - Hex(String), -} - -// TODO: This should be moved to tx3-resolver crate -#[derive(Deserialize)] -struct SubmitParamsInput { - #[serde(rename = "tx")] - pub tx: BytesEnvelope, - #[serde(rename = "witnesses")] - pub witnesses: Vec, -} - fn apply_witnesses(original: &[u8], witnesses: &[WitnessInput]) -> Result, Error> { let tx = pallas::ledger::traverse::MultiEraTx::decode(original)?; @@ -108,7 +90,7 @@ pub async fn trp_submit( params: Params<'_>, context: Arc>, ) -> Result { - let params: SubmitParamsInput = params.parse()?; + let params: SubmitParams = params.parse()?; let mut bytes = Vec::::from(params.tx);