Skip to content

Commit f69c752

Browse files
Merge branch 'next' into sergerad-readiness-endpoint
2 parents f1c8f78 + 7d5957e commit f69c752

8 files changed

Lines changed: 151 additions & 52 deletions

File tree

CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,12 @@
22

33
## Unreleased
44

5+
- Improved `GetAccount` performance if number of vault assets exceeds the limit. ([#2227](https://github.com/0xMiden/node/pull/2227)).
6+
7+
## v0.15.0-rc.4 (2026-06-09)
8+
59
- Fixed missing certificates in the Docker runtime image ([#2221](https://github.com/0xMiden/node/pull/2221)).
10+
- Accept header is now forwarded to the upstream on full nodes ([#2225](https://github.com/0xMiden/node/pull/2225)).
611

712
## v0.15.0-rc.3 (2026-06-08)
813

Cargo.lock

Lines changed: 19 additions & 19 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ license = "MIT"
3333
readme = "README.md"
3434
repository = "https://github.com/0xMiden/node"
3535
rust-version = "1.93"
36-
version = "0.15.0-rc.3"
36+
version = "0.15.0-rc.4"
3737

3838
# Optimize the cryptography for faster tests involving account creation.
3939
[profile.test.package.miden-crypto]
@@ -44,20 +44,20 @@ debug = true
4444

4545
[workspace.dependencies]
4646
# Workspace crates.
47-
miden-large-smt-backend-rocksdb = { path = "crates/large-smt-backend-rocksdb", version = "0.15.0-rc.3" }
48-
miden-node-block-producer = { path = "crates/block-producer", version = "0.15.0-rc.3" }
49-
miden-node-db = { path = "crates/db", version = "0.15.0-rc.3" }
50-
miden-node-grpc-error-macro = { path = "crates/grpc-error-macro", version = "0.15.0-rc.3" }
51-
miden-node-proto = { path = "crates/proto", version = "0.15.0-rc.3" }
52-
miden-node-proto-build = { path = "proto", version = "0.15.0-rc.3" }
53-
miden-node-rpc = { path = "crates/rpc", version = "0.15.0-rc.3" }
54-
miden-node-store = { path = "crates/store", version = "0.15.0-rc.3" }
47+
miden-large-smt-backend-rocksdb = { path = "crates/large-smt-backend-rocksdb", version = "0.15.0-rc.4" }
48+
miden-node-block-producer = { path = "crates/block-producer", version = "0.15.0-rc.4" }
49+
miden-node-db = { path = "crates/db", version = "0.15.0-rc.4" }
50+
miden-node-grpc-error-macro = { path = "crates/grpc-error-macro", version = "0.15.0-rc.4" }
51+
miden-node-proto = { path = "crates/proto", version = "0.15.0-rc.4" }
52+
miden-node-proto-build = { path = "proto", version = "0.15.0-rc.4" }
53+
miden-node-rpc = { path = "crates/rpc", version = "0.15.0-rc.4" }
54+
miden-node-store = { path = "crates/store", version = "0.15.0-rc.4" }
5555
miden-node-test-macro = { path = "crates/test-macro" }
56-
miden-node-utils = { path = "crates/utils", version = "0.15.0-rc.3" }
57-
miden-remote-prover-client = { path = "crates/remote-prover-client", version = "0.15.0-rc.3" }
56+
miden-node-utils = { path = "crates/utils", version = "0.15.0-rc.4" }
57+
miden-remote-prover-client = { path = "crates/remote-prover-client", version = "0.15.0-rc.4" }
5858
# Temporary workaround until <https://github.com/rust-rocksdb/rust-rocksdb/pull/1029>
5959
# is part of `rocksdb-rust` release
60-
miden-node-rocksdb-cxx-linkage-fix = { path = "crates/rocksdb-cxx-linkage-fix", version = "0.15.0-rc.3" }
60+
miden-node-rocksdb-cxx-linkage-fix = { path = "crates/rocksdb-cxx-linkage-fix", version = "0.15.0-rc.4" }
6161

6262
# miden-protocol dependencies. These should be updated in sync.
6363
# Requires the v0.15.2 patch release, which carries the network-account tx-script

crates/proto/src/clients/mod.rs

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,9 @@ impl tonic::service::Interceptor for Interceptor {
108108
request = otel.call(request)?;
109109
}
110110

111-
request.metadata_mut().insert(ACCEPT.as_str(), self.accept.clone());
111+
if request.metadata().get(ACCEPT.as_str()).is_none() {
112+
request.metadata_mut().insert(ACCEPT.as_str(), self.accept.clone());
113+
}
112114

113115
if let Some(value) = &self.auth_header_value {
114116
request.metadata_mut().insert(Self::NETWORK_TX_AUTH_HEADER_NAME, value.clone());
@@ -118,6 +120,38 @@ impl tonic::service::Interceptor for Interceptor {
118120
}
119121
}
120122

123+
#[cfg(test)]
124+
mod tests {
125+
use super::*;
126+
127+
#[test]
128+
fn interceptor_preserves_existing_accept_metadata() {
129+
let original_accept =
130+
AsciiMetadataValue::from_static("application/vnd.miden; version=1.2; genesis=0x1234");
131+
let mut request = Request::new(());
132+
request.metadata_mut().insert(ACCEPT.as_str(), original_accept.clone());
133+
134+
let mut interceptor = Interceptor::new(false, Some("9.9"), Some("0xabcd"), None);
135+
let request = tonic::service::Interceptor::call(&mut interceptor, request)
136+
.expect("interceptor should succeed");
137+
138+
assert_eq!(request.metadata().get(ACCEPT.as_str()), Some(&original_accept));
139+
}
140+
141+
#[test]
142+
fn interceptor_inserts_accept_metadata_when_missing() {
143+
let mut interceptor = Interceptor::new(false, Some("9.9"), Some("0xabcd"), None);
144+
145+
let request = tonic::service::Interceptor::call(&mut interceptor, Request::new(()))
146+
.expect("interceptor should succeed");
147+
148+
assert_eq!(
149+
request.metadata().get(ACCEPT.as_str()).and_then(|value| value.to_str().ok()),
150+
Some("application/vnd.miden; version=9.9, genesis=0xabcd"),
151+
);
152+
}
153+
}
154+
121155
// TYPE ALIASES TO AID LEGIBILITY
122156
// ================================================================================================
123157

crates/proto/src/domain/account.rs

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ use miden_protocol::account::{
1313
StorageSlotName,
1414
StorageSlotType,
1515
};
16-
use miden_protocol::asset::{Asset, AssetVault};
16+
use miden_protocol::asset::Asset;
1717
use miden_protocol::block::BlockNumber;
1818
use miden_protocol::block::account_tree::AccountWitness;
1919
use miden_protocol::crypto::merkle::SparseMerklePath;
@@ -367,14 +367,6 @@ impl AccountVaultDetails {
367367
/// more assets will have `LimitExceeded` variant.
368368
pub const MAX_RETURN_ENTRIES: usize = 1000;
369369

370-
pub fn new(vault: &AssetVault) -> Self {
371-
if vault.assets().nth(Self::MAX_RETURN_ENTRIES).is_some() {
372-
Self::LimitExceeded
373-
} else {
374-
Self::Assets(Vec::from_iter(vault.assets()))
375-
}
376-
}
377-
378370
pub fn empty() -> Self {
379371
Self::Assets(Vec::new())
380372
}
@@ -706,7 +698,9 @@ fn storage_slot_type_from_raw(slot_type: u32) -> Result<StorageSlotType, Convers
706698
Ok(match slot_type {
707699
0 => StorageSlotType::Value,
708700
1 => StorageSlotType::Map,
709-
_ => return Err(ConversionError::message("enum variant discriminant out of range")),
701+
_ => {
702+
return Err(ConversionError::message("enum variant discriminant out of range"));
703+
},
710704
})
711705
}
712706

crates/rpc/src/server/api.rs

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ use std::task::{Context as TaskContext, Poll};
55
use std::time::Duration;
66

77
use anyhow::Context as AnyhowContext;
8+
use http::header::ACCEPT;
89
use miden_node_block_producer::{BlockProducerStatus, MempoolStats as BlockProducerMempoolStats};
910
use miden_node_proto::clients::NtxBuilderClient;
1011
use miden_node_proto::decode::{
@@ -723,6 +724,7 @@ impl api_server::Api for RpcService {
723724
debug!(target: COMPONENT, request = ?request.get_ref());
724725

725726
let is_authorized_network_tx = self.is_authorized_network_tx(request.metadata());
727+
let original_accept = request.metadata().get(ACCEPT.as_str()).cloned();
726728

727729
let request = request.into_inner();
728730

@@ -799,7 +801,11 @@ impl api_server::Api for RpcService {
799801
(block_producer.as_ref(), validator.as_ref())
800802
},
801803
RpcMode::FullNode { source_rpc, .. } => {
802-
return source_rpc.as_ref().clone().submit_proven_tx(request).await;
804+
let mut forwarded_request = Request::new(request);
805+
if let Some(accept) = original_accept {
806+
forwarded_request.metadata_mut().insert(ACCEPT.as_str(), accept);
807+
}
808+
return source_rpc.as_ref().clone().submit_proven_tx(forwarded_request).await;
803809
},
804810
};
805811

@@ -826,6 +832,7 @@ impl api_server::Api for RpcService {
826832
request: tonic::Request<proto::transaction::TransactionBatch>,
827833
) -> Result<tonic::Response<proto::blockchain::BlockNumber>, Status> {
828834
let is_authorized_network_tx = self.is_authorized_network_tx(request.metadata());
835+
let original_accept = request.metadata().get(ACCEPT.as_str()).cloned();
829836
let request = request.into_inner();
830837

831838
let proven_batch = ProvenBatch::read_from_bytes(&request.batch_proof).map_err(|err| {
@@ -916,7 +923,11 @@ impl api_server::Api for RpcService {
916923
(block_producer.as_ref(), validator.as_ref())
917924
},
918925
RpcMode::FullNode { source_rpc, .. } => {
919-
return source_rpc.as_ref().clone().submit_proven_tx_batch(request).await;
926+
let mut forwarded_request = Request::new(request);
927+
if let Some(accept) = original_accept {
928+
forwarded_request.metadata_mut().insert(ACCEPT.as_str(), accept);
929+
}
930+
return source_rpc.as_ref().clone().submit_proven_tx_batch(forwarded_request).await;
920931
},
921932
};
922933

0 commit comments

Comments
 (0)