mirror of
https://github.com/Cuprate/cuprate.git
synced 2025-03-12 09:29:11 +00:00
fix hack + enable it for cuprate-database
This commit is contained in:
parent
95c0d8b4bf
commit
372d5cce20
26 changed files with 96 additions and 72 deletions
2
.github/workflows/hack.yml
vendored
2
.github/workflows/hack.yml
vendored
|
@ -32,4 +32,4 @@ jobs:
|
|||
|
||||
- name: Hack Check
|
||||
# TODO: remove the exclude when `cuprate-database` errors are fixed
|
||||
run: cargo hack --workspace --exclude cuprate-database check --feature-powerset --no-dev-deps
|
||||
run: cargo hack --workspace check --feature-powerset --no-dev-deps
|
1
Cargo.lock
generated
1
Cargo.lock
generated
|
@ -933,7 +933,6 @@ dependencies = [
|
|||
"tempfile",
|
||||
"thiserror",
|
||||
"tokio",
|
||||
"tower 0.5.1",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
|
|
@ -9,7 +9,7 @@ name = "cuprate-fast-sync-create-hashes"
|
|||
path = "src/create.rs"
|
||||
|
||||
[dependencies]
|
||||
cuprate-blockchain = { workspace = true }
|
||||
cuprate-blockchain = { workspace = true, features = ["service"] }
|
||||
cuprate-consensus = { workspace = true }
|
||||
cuprate-consensus-rules = { workspace = true }
|
||||
cuprate-consensus-context = { workspace = true }
|
||||
|
|
|
@ -17,7 +17,7 @@ asynch = ["dep:futures", "dep:rayon"]
|
|||
cast = []
|
||||
constants = []
|
||||
crypto = ["dep:curve25519-dalek", "dep:monero-serai", "std"]
|
||||
fs = ["dep:dirs"]
|
||||
fs = ["dep:dirs", "std"]
|
||||
num = []
|
||||
map = ["cast", "dep:monero-serai", "dep:cuprate-constants"]
|
||||
time = ["dep:chrono", "std"]
|
||||
|
|
|
@ -1,3 +1,5 @@
|
|||
use alloc::{string::ToString, vec, vec::Vec};
|
||||
|
||||
use bytes::{Buf, BufMut, Bytes, BytesMut};
|
||||
use ref_cast::RefCast;
|
||||
|
||||
|
|
|
@ -64,6 +64,7 @@ use hex as _;
|
|||
|
||||
extern crate alloc;
|
||||
|
||||
use alloc::string::ToString;
|
||||
use core::str::from_utf8 as str_from_utf8;
|
||||
|
||||
use bytes::{Buf, BufMut, Bytes, BytesMut};
|
||||
|
|
|
@ -9,7 +9,7 @@ authors = ["Boog900"]
|
|||
[dependencies]
|
||||
cuprate-constants = { workspace = true }
|
||||
cuprate-pruning = { workspace = true }
|
||||
cuprate-p2p-core = { workspace = true }
|
||||
cuprate-p2p-core = { workspace = true, features = ["borsh"] }
|
||||
|
||||
tower = { workspace = true, features = ["util"] }
|
||||
tokio = { workspace = true, features = ["time", "fs", "rt"]}
|
||||
|
|
|
@ -10,7 +10,7 @@ default = []
|
|||
borsh = ["dep:borsh"]
|
||||
|
||||
[dependencies]
|
||||
cuprate-constants = { workspace = true }
|
||||
cuprate-constants = { workspace = true, features = ["block"] }
|
||||
|
||||
thiserror = { workspace = true }
|
||||
|
||||
|
|
|
@ -10,20 +10,20 @@ keywords = ["cuprate", "rpc", "interface"]
|
|||
|
||||
[features]
|
||||
default = ["dummy", "serde"]
|
||||
dummy = []
|
||||
dummy = ["dep:cuprate-helper", "dep:futures"]
|
||||
|
||||
[dependencies]
|
||||
cuprate-epee-encoding = { workspace = true, default-features = false }
|
||||
cuprate-json-rpc = { workspace = true, default-features = false }
|
||||
cuprate-rpc-types = { workspace = true, features = ["serde", "epee"], default-features = false }
|
||||
cuprate-helper = { workspace = true, features = ["asynch"], default-features = false }
|
||||
cuprate-helper = { workspace = true, features = ["asynch"], default-features = false, optional = true }
|
||||
|
||||
anyhow = { workspace = true }
|
||||
axum = { version = "0.7.5", features = ["json"], default-features = false }
|
||||
serde = { workspace = true, optional = true }
|
||||
tower = { workspace = true }
|
||||
tower = { workspace = true, features = ["util"] }
|
||||
paste = { workspace = true }
|
||||
futures = { workspace = true }
|
||||
futures = { workspace = true, optional = true }
|
||||
|
||||
[dev-dependencies]
|
||||
cuprate-test-utils = { workspace = true }
|
||||
|
|
|
@ -20,12 +20,14 @@ use cuprate_types::BlockCompleteEntry;
|
|||
|
||||
use crate::{
|
||||
base::AccessResponseBase,
|
||||
defaults::{default_false, default_zero},
|
||||
macros::{define_request, define_request_and_response, define_request_and_response_doc},
|
||||
misc::{BlockOutputIndices, GetOutputsOut, OutKeyBin, PoolInfoExtent, PoolTxInfo, Status},
|
||||
misc::{BlockOutputIndices, GetOutputsOut, OutKeyBin, PoolTxInfo, Status},
|
||||
rpc_call::RpcCallValue,
|
||||
};
|
||||
|
||||
#[cfg(any(feature = "epee", feature = "serde"))]
|
||||
use crate::defaults::{default_false, default_zero};
|
||||
|
||||
//---------------------------------------------------------------------------------------------------- Definitions
|
||||
define_request_and_response! {
|
||||
get_blocks_by_heightbin,
|
||||
|
@ -137,15 +139,15 @@ define_request! {
|
|||
core_rpc_server_commands_defs, h, 162, 262,
|
||||
)]
|
||||
///
|
||||
/// This response's variant depends upon [`PoolInfoExtent`].
|
||||
/// This response's variant depends upon [`crate::misc::PoolInfoExtent`].
|
||||
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
|
||||
#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
|
||||
pub enum GetBlocksResponse {
|
||||
/// Will always serialize a [`PoolInfoExtent::None`] field.
|
||||
/// Will always serialize a [`crate::misc::PoolInfoExtent::None`] field.
|
||||
PoolInfoNone(GetBlocksResponsePoolInfoNone),
|
||||
/// Will always serialize a [`PoolInfoExtent::Incremental`] field.
|
||||
/// Will always serialize a [`crate::misc::PoolInfoExtent::Incremental`] field.
|
||||
PoolInfoIncremental(GetBlocksResponsePoolInfoIncremental),
|
||||
/// Will always serialize a [`PoolInfoExtent::Full`] field.
|
||||
/// Will always serialize a [`crate::misc::PoolInfoExtent::Full`] field.
|
||||
PoolInfoFull(GetBlocksResponsePoolInfoFull),
|
||||
}
|
||||
|
||||
|
@ -254,7 +256,7 @@ pub struct __GetBlocksResponseEpeeBuilder {
|
|||
pub current_height: Option<u64>,
|
||||
pub output_indices: Option<Vec<BlockOutputIndices>>,
|
||||
pub daemon_time: Option<u64>,
|
||||
pub pool_info_extent: Option<PoolInfoExtent>,
|
||||
pub pool_info_extent: Option<crate::misc::PoolInfoExtent>,
|
||||
pub added_pool_txs: Option<Vec<PoolTxInfo>>,
|
||||
pub remaining_added_pool_txids: Option<ByteArrayVec<32>>,
|
||||
pub removed_pool_txids: Option<ByteArrayVec<32>>,
|
||||
|
@ -304,7 +306,7 @@ impl EpeeObjectBuilder<GetBlocksResponse> for __GetBlocksResponseEpeeBuilder {
|
|||
let pool_info_extent = self.pool_info_extent.ok_or(ELSE)?;
|
||||
|
||||
let this = match pool_info_extent {
|
||||
PoolInfoExtent::None => {
|
||||
crate::misc::PoolInfoExtent::None => {
|
||||
GetBlocksResponse::PoolInfoNone(GetBlocksResponsePoolInfoNone {
|
||||
status,
|
||||
untrusted,
|
||||
|
@ -315,7 +317,7 @@ impl EpeeObjectBuilder<GetBlocksResponse> for __GetBlocksResponseEpeeBuilder {
|
|||
daemon_time,
|
||||
})
|
||||
}
|
||||
PoolInfoExtent::Incremental => {
|
||||
crate::misc::PoolInfoExtent::Incremental => {
|
||||
GetBlocksResponse::PoolInfoIncremental(GetBlocksResponsePoolInfoIncremental {
|
||||
status,
|
||||
untrusted,
|
||||
|
@ -329,7 +331,7 @@ impl EpeeObjectBuilder<GetBlocksResponse> for __GetBlocksResponseEpeeBuilder {
|
|||
removed_pool_txids: self.removed_pool_txids.ok_or(ELSE)?,
|
||||
})
|
||||
}
|
||||
PoolInfoExtent::Full => {
|
||||
crate::misc::PoolInfoExtent::Full => {
|
||||
GetBlocksResponse::PoolInfoFull(GetBlocksResponsePoolInfoFull {
|
||||
status,
|
||||
untrusted,
|
||||
|
@ -353,7 +355,7 @@ impl EpeeObject for GetBlocksResponse {
|
|||
type Builder = __GetBlocksResponseEpeeBuilder;
|
||||
|
||||
fn number_of_fields(&self) -> u64 {
|
||||
// [`PoolInfoExtent`] + inner struct fields.
|
||||
// [`crate::misc::PoolInfoExtent`] + inner struct fields.
|
||||
let inner_fields = match self {
|
||||
Self::PoolInfoNone(s) => s.number_of_fields(),
|
||||
Self::PoolInfoIncremental(s) => s.number_of_fields(),
|
||||
|
@ -367,15 +369,27 @@ impl EpeeObject for GetBlocksResponse {
|
|||
match self {
|
||||
Self::PoolInfoNone(s) => {
|
||||
s.write_fields(w)?;
|
||||
write_field(PoolInfoExtent::None.to_u8(), "pool_info_extent", w)?;
|
||||
write_field(
|
||||
crate::misc::PoolInfoExtent::None.to_u8(),
|
||||
"pool_info_extent",
|
||||
w,
|
||||
)?;
|
||||
}
|
||||
Self::PoolInfoIncremental(s) => {
|
||||
s.write_fields(w)?;
|
||||
write_field(PoolInfoExtent::Incremental.to_u8(), "pool_info_extent", w)?;
|
||||
write_field(
|
||||
crate::misc::PoolInfoExtent::Incremental.to_u8(),
|
||||
"pool_info_extent",
|
||||
w,
|
||||
)?;
|
||||
}
|
||||
Self::PoolInfoFull(s) => {
|
||||
s.write_fields(w)?;
|
||||
write_field(PoolInfoExtent::Full.to_u8(), "pool_info_extent", w)?;
|
||||
write_field(
|
||||
crate::misc::PoolInfoExtent::Full.to_u8(),
|
||||
"pool_info_extent",
|
||||
w,
|
||||
)?;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -8,10 +8,6 @@ use serde::{Deserialize, Serialize};
|
|||
|
||||
use crate::{
|
||||
base::{AccessResponseBase, ResponseBase},
|
||||
defaults::{
|
||||
default_false, default_height, default_one, default_string, default_true, default_vec,
|
||||
default_zero,
|
||||
},
|
||||
macros::define_request_and_response,
|
||||
misc::{
|
||||
AuxPow, BlockHeader, ChainInfo, ConnectionInfo, Distribution, GetBan,
|
||||
|
@ -21,6 +17,12 @@ use crate::{
|
|||
rpc_call::RpcCallValue,
|
||||
};
|
||||
|
||||
#[cfg(any(feature = "epee", feature = "serde"))]
|
||||
use crate::defaults::{
|
||||
default_false, default_height, default_one, default_string, default_true, default_vec,
|
||||
default_zero,
|
||||
};
|
||||
|
||||
//---------------------------------------------------------------------------------------------------- Macro
|
||||
/// Adds a (de)serialization doc-test to a type in `json.rs`.
|
||||
///
|
||||
|
|
|
@ -6,6 +6,7 @@
|
|||
)]
|
||||
|
||||
mod constants;
|
||||
#[cfg(any(feature = "serde", feature = "epee"))]
|
||||
mod defaults;
|
||||
mod free;
|
||||
mod macros;
|
||||
|
|
|
@ -20,8 +20,8 @@ use cuprate_epee_encoding::{
|
|||
"rpc/core_rpc_server_commands_defs.h",
|
||||
45..=55
|
||||
)]
|
||||
#[cfg(feature = "epee")]
|
||||
fn compress_integer_array(_: &[u64]) -> error::Result<Vec<u8>> {
|
||||
#[cfg(any(feature = "epee", feature = "serde"))]
|
||||
fn compress_integer_array(_: &[u64]) -> Vec<u8> {
|
||||
todo!()
|
||||
}
|
||||
|
||||
|
@ -33,6 +33,7 @@ fn compress_integer_array(_: &[u64]) -> error::Result<Vec<u8>> {
|
|||
"rpc/core_rpc_server_commands_defs.h",
|
||||
57..=72
|
||||
)]
|
||||
#[cfg(any(feature = "epee", feature = "serde"))]
|
||||
fn decompress_integer_array(_: &[u8]) -> Vec<u64> {
|
||||
todo!()
|
||||
}
|
||||
|
@ -135,12 +136,7 @@ fn serialize_distribution_as_compressed_data<S>(v: &Vec<u64>, s: S) -> Result<S:
|
|||
where
|
||||
S: serde::Serializer,
|
||||
{
|
||||
match compress_integer_array(v) {
|
||||
Ok(compressed_data) => compressed_data.serialize(s),
|
||||
Err(_) => Err(serde::ser::Error::custom(
|
||||
"error compressing distribution array",
|
||||
)),
|
||||
}
|
||||
compress_integer_array(v).serialize(s)
|
||||
}
|
||||
|
||||
/// Deserializer function for [`DistributionCompressedBinary::distribution`].
|
||||
|
@ -256,7 +252,7 @@ impl EpeeObject for Distribution {
|
|||
distribution,
|
||||
amount,
|
||||
}) => {
|
||||
let compressed_data = compress_integer_array(&distribution)?;
|
||||
let compressed_data = compress_integer_array(&distribution);
|
||||
|
||||
start_height.write(w)?;
|
||||
base.write(w)?;
|
||||
|
|
|
@ -11,10 +11,10 @@ use serde::{Deserialize, Serialize};
|
|||
#[cfg(feature = "epee")]
|
||||
use cuprate_epee_encoding::epee_object;
|
||||
|
||||
use crate::{
|
||||
defaults::{default_string, default_zero},
|
||||
macros::monero_definition_link,
|
||||
};
|
||||
use crate::macros::monero_definition_link;
|
||||
|
||||
#[cfg(any(feature = "epee", feature = "serde"))]
|
||||
use crate::defaults::default_zero;
|
||||
|
||||
//---------------------------------------------------------------------------------------------------- Macros
|
||||
/// This macro (local to this file) defines all the misc types.
|
||||
|
@ -148,7 +148,7 @@ define_struct_and_impl_epee! {
|
|||
)]
|
||||
/// Used in [`crate::json::SetBansRequest`].
|
||||
SetBan {
|
||||
#[cfg_attr(feature = "serde", serde(default = "default_string"))]
|
||||
#[cfg_attr(feature = "serde", serde(default = "crate::defaults::default_string"))]
|
||||
host: String,
|
||||
#[cfg_attr(feature = "serde", serde(default = "default_zero"))]
|
||||
ip: u32,
|
||||
|
|
|
@ -8,7 +8,6 @@ use serde::{Deserialize, Serialize};
|
|||
|
||||
use crate::{
|
||||
base::{AccessResponseBase, ResponseBase},
|
||||
defaults::{default_false, default_string, default_true, default_vec, default_zero},
|
||||
macros::define_request_and_response,
|
||||
misc::{
|
||||
GetOutputsOut, OutKey, Peer, PublicNode, SpentKeyImageInfo, Status, TxEntry, TxInfo,
|
||||
|
@ -17,6 +16,9 @@ use crate::{
|
|||
RpcCallValue,
|
||||
};
|
||||
|
||||
#[cfg(any(feature = "serde", feature = "epee"))]
|
||||
use crate::defaults::{default_false, default_string, default_true, default_vec, default_zero};
|
||||
|
||||
//---------------------------------------------------------------------------------------------------- Macro
|
||||
/// Adds a (de)serialization doc-test to a type in `other.rs`.
|
||||
///
|
||||
|
|
|
@ -15,24 +15,25 @@ default = ["heed", "service"]
|
|||
heed = ["cuprate-database/heed"]
|
||||
redb = ["cuprate-database/redb"]
|
||||
redb-memory = ["cuprate-database/redb-memory"]
|
||||
service = ["dep:thread_local", "dep:rayon", "cuprate-helper/thread"]
|
||||
service = ["dep:tower", "dep:thread_local", "dep:rayon", "dep:rand", "cuprate-helper/thread"]
|
||||
serde = ["dep:serde", "cuprate-database/serde", "cuprate-database-service/serde"]
|
||||
|
||||
[dependencies]
|
||||
cuprate-database = { workspace = true }
|
||||
cuprate-database-service = { workspace = true }
|
||||
cuprate-helper = { workspace = true, features = ["fs", "map", "crypto"] }
|
||||
cuprate-helper = { workspace = true, features = ["fs", "map", "crypto", "tx"] }
|
||||
cuprate-types = { workspace = true, features = ["blockchain"] }
|
||||
cuprate-pruning = { workspace = true }
|
||||
|
||||
bitflags = { workspace = true, features = ["std", "serde", "bytemuck"] }
|
||||
bytemuck = { workspace = true, features = ["must_cast", "derive", "min_const_generics", "extern_crate_alloc"] }
|
||||
curve25519-dalek = { workspace = true }
|
||||
rand = { workspace = true }
|
||||
rand = { workspace = true, features = ["std", "std_rng"], optional = true }
|
||||
monero-serai = { workspace = true, features = ["std"] }
|
||||
serde = { workspace = true, optional = true }
|
||||
|
||||
# `service` feature.
|
||||
tower = { workspace = true }
|
||||
tower = { workspace = true, optional = true }
|
||||
thread_local = { workspace = true, optional = true }
|
||||
rayon = { workspace = true, optional = true }
|
||||
|
||||
|
|
|
@ -9,10 +9,10 @@ repository = "https://github.com/Cuprate/cuprate/tree/main/storage/database"
|
|||
keywords = ["cuprate", "database"]
|
||||
|
||||
[features]
|
||||
# default = ["heed"]
|
||||
default = ["heed"]
|
||||
# default = ["redb"]
|
||||
# default = ["redb-memory"]
|
||||
heed = ["dep:heed"]
|
||||
heed = []
|
||||
redb = ["dep:redb"]
|
||||
redb-memory = ["redb"]
|
||||
|
||||
|
@ -25,7 +25,7 @@ paste = { workspace = true }
|
|||
thiserror = { workspace = true }
|
||||
|
||||
# Optional features.
|
||||
heed = { version = "0.20.5", features = ["read-txn-no-tls"], optional = true }
|
||||
heed = { version = "0.20.5", features = ["read-txn-no-tls"] }
|
||||
redb = { version = "2.1.3", optional = true }
|
||||
serde = { workspace = true, optional = true }
|
||||
|
||||
|
|
|
@ -4,6 +4,8 @@ cfg_if::cfg_if! {
|
|||
// If both backends are enabled, fallback to `heed`.
|
||||
// This is useful when using `--all-features`.
|
||||
if #[cfg(all(feature = "redb", not(feature = "heed")))] {
|
||||
use heed as _;
|
||||
|
||||
mod redb;
|
||||
pub use redb::ConcreteEnv;
|
||||
} else {
|
||||
|
|
|
@ -8,14 +8,20 @@ authors = ["Boog900"]
|
|||
repository = "https://github.com/Cuprate/cuprate/tree/main/storage/service"
|
||||
keywords = ["cuprate", "service", "database"]
|
||||
|
||||
[features]
|
||||
default = ["heed"]
|
||||
heed = ["cuprate-database/heed"]
|
||||
redb = ["cuprate-database/redb"]
|
||||
redb-memorey = ["cuprate-database/redb-memory"]
|
||||
|
||||
[dependencies]
|
||||
cuprate-database = { workspace = true }
|
||||
cuprate-helper = { workspace = true, features = ["fs", "thread", "map"] }
|
||||
cuprate-helper = { workspace = true, features = ["fs", "thread", "map", "asynch"] }
|
||||
|
||||
serde = { workspace = true, optional = true }
|
||||
rayon = { workspace = true }
|
||||
tower = { workspace = true }
|
||||
futures = { workspace = true }
|
||||
futures = { workspace = true, features = ["std"] }
|
||||
crossbeam = { workspace = true, features = ["std"] }
|
||||
|
||||
[lints]
|
||||
|
|
|
@ -9,18 +9,17 @@ repository = "https://github.com/Cuprate/cuprate/tree/main/storage/txpool"
|
|||
keywords = ["cuprate", "txpool", "transaction", "pool", "database"]
|
||||
|
||||
[features]
|
||||
default = ["heed", "service"]
|
||||
default = ["heed"]
|
||||
# default = ["redb", "service"]
|
||||
# default = ["redb-memory", "service"]
|
||||
heed = ["cuprate-database/heed"]
|
||||
redb = ["cuprate-database/redb"]
|
||||
redb-memory = ["cuprate-database/redb-memory"]
|
||||
service = ["dep:tower", "dep:rayon", "dep:cuprate-database-service"]
|
||||
serde = ["dep:serde", "cuprate-database/serde", "cuprate-database-service/serde"]
|
||||
|
||||
[dependencies]
|
||||
cuprate-database = { workspace = true, features = ["heed"] }
|
||||
cuprate-database-service = { workspace = true, optional = true }
|
||||
cuprate-database-service = { workspace = true }
|
||||
cuprate-types = { workspace = true }
|
||||
cuprate-helper = { workspace = true, default-features = false, features = ["constants"] }
|
||||
|
||||
|
@ -28,10 +27,9 @@ monero-serai = { workspace = true, features = ["std"] }
|
|||
bytemuck = { workspace = true, features = ["must_cast", "derive", "min_const_generics", "extern_crate_alloc"] }
|
||||
bitflags = { workspace = true, features = ["std", "serde", "bytemuck"] }
|
||||
thiserror = { workspace = true }
|
||||
hex = { workspace = true }
|
||||
hex = { workspace = true, features = ["std"] }
|
||||
|
||||
tower = { workspace = true, optional = true }
|
||||
rayon = { workspace = true, optional = true }
|
||||
rayon = { workspace = true }
|
||||
|
||||
serde = { workspace = true, optional = true }
|
||||
|
||||
|
|
|
@ -7,7 +7,6 @@
|
|||
pub mod config;
|
||||
mod free;
|
||||
pub mod ops;
|
||||
#[cfg(feature = "service")]
|
||||
pub mod service;
|
||||
pub mod tables;
|
||||
mod tx;
|
||||
|
@ -20,8 +19,6 @@ pub use tx::TxEntry;
|
|||
//re-exports
|
||||
pub use cuprate_database;
|
||||
|
||||
// TODO: remove when used.
|
||||
use tower as _;
|
||||
#[cfg(test)]
|
||||
mod test {
|
||||
use cuprate_test_utils as _;
|
||||
|
|
|
@ -12,21 +12,23 @@ keywords = ["cuprate", "types"]
|
|||
default = ["blockchain", "epee", "serde", "json", "hex"]
|
||||
blockchain = []
|
||||
epee = ["dep:cuprate-epee-encoding"]
|
||||
serde = ["dep:serde"]
|
||||
serde = ["dep:serde", "hex"]
|
||||
proptest = ["dep:proptest", "dep:proptest-derive"]
|
||||
json = ["hex", "dep:cuprate-helper"]
|
||||
hex = ["dep:hex"]
|
||||
# We sadly have no choice but to enable serde here as otherwise we will get warnings from the `hex` dep being unused.
|
||||
# This isn't too bad as `HexBytes` only makes sense with serde anyway.
|
||||
hex = ["serde", "dep:hex"]
|
||||
|
||||
[dependencies]
|
||||
cuprate-epee-encoding = { workspace = true, optional = true, features = ["std"] }
|
||||
cuprate-helper = { workspace = true, optional = true, features = ["cast"] }
|
||||
cuprate-fixed-bytes = { workspace = true }
|
||||
cuprate-fixed-bytes = { workspace = true, features = ["std", "serde"] }
|
||||
|
||||
bytes = { workspace = true }
|
||||
curve25519-dalek = { workspace = true }
|
||||
monero-serai = { workspace = true }
|
||||
hex = { workspace = true, features = ["serde", "alloc"], optional = true }
|
||||
serde = { workspace = true, features = ["derive"], optional = true }
|
||||
serde = { workspace = true, features = ["std", "derive"], optional = true }
|
||||
strum = { workspace = true, features = ["derive"] }
|
||||
thiserror = { workspace = true }
|
||||
|
||||
|
|
|
@ -22,6 +22,7 @@ pub struct HexBytes<const N: usize>(
|
|||
#[cfg_attr(feature = "serde", serde(with = "hex::serde"))] pub [u8; N],
|
||||
);
|
||||
|
||||
#[cfg(feature = "serde")]
|
||||
impl<'de, const N: usize> Deserialize<'de> for HexBytes<N>
|
||||
where
|
||||
[u8; N]: hex::FromHex,
|
||||
|
|
|
@ -51,17 +51,17 @@ impl From<block::Block> for Block {
|
|||
/// [`Block::miner_tx`].
|
||||
#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
|
||||
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
|
||||
#[serde(untagged)]
|
||||
#[cfg_attr(feature = "serde", serde(untagged))]
|
||||
pub enum MinerTransaction {
|
||||
V1 {
|
||||
/// This field is [flattened](https://serde.rs/field-attrs.html#flatten).
|
||||
#[serde(flatten)]
|
||||
#[cfg_attr(feature = "serde", serde(flatten))]
|
||||
prefix: MinerTransactionPrefix,
|
||||
signatures: [(); 0],
|
||||
},
|
||||
V2 {
|
||||
/// This field is [flattened](https://serde.rs/field-attrs.html#flatten).
|
||||
#[serde(flatten)]
|
||||
#[cfg_attr(feature = "serde", serde(flatten))]
|
||||
prefix: MinerTransactionPrefix,
|
||||
rct_signatures: MinerTransactionRctSignatures,
|
||||
},
|
||||
|
|
|
@ -20,7 +20,7 @@ pub struct Output {
|
|||
/// [`Output::target`].
|
||||
#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
|
||||
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
|
||||
#[serde(untagged)]
|
||||
#[cfg_attr(feature = "serde", serde(untagged))]
|
||||
pub enum Target {
|
||||
Key { key: HexBytes<32> },
|
||||
TaggedKey { tagged_key: TaggedKey },
|
||||
|
|
|
@ -24,17 +24,17 @@ use crate::{
|
|||
/// - [`/get_transaction_pool` -> `tx_json`](https://www.getmonero.org/resources/developer-guides/daemon-rpc.html#get_transaction_pool)
|
||||
#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
|
||||
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
|
||||
#[serde(untagged)]
|
||||
#[cfg_attr(feature = "serde", serde(untagged))]
|
||||
pub enum Transaction {
|
||||
V1 {
|
||||
/// This field is [flattened](https://serde.rs/field-attrs.html#flatten).
|
||||
#[serde(flatten)]
|
||||
#[cfg_attr(feature = "serde", serde(flatten))]
|
||||
prefix: TransactionPrefix,
|
||||
signatures: Vec<HexBytes<64>>,
|
||||
},
|
||||
V2 {
|
||||
/// This field is [flattened](https://serde.rs/field-attrs.html#flatten).
|
||||
#[serde(flatten)]
|
||||
#[cfg_attr(feature = "serde", serde(flatten))]
|
||||
prefix: TransactionPrefix,
|
||||
rct_signatures: RctSignatures,
|
||||
/// This field is [`Some`] if [`Self::V2::rct_signatures`]
|
||||
|
|
Loading…
Reference in a new issue