fixed client crashing upon having bandwidth revoked

This commit is contained in:
Jędrzej Stuczyński
2024-07-23 12:07:43 +01:00
parent 78ca539018
commit db1ad4dcab
6 changed files with 416 additions and 237 deletions
@@ -49,8 +49,14 @@ impl ClientBandwidth {
pub(crate) fn log_bandwidth(&self, now: Option<OffsetDateTime>) {
let now = now.unwrap_or_else(OffsetDateTime::now_utc);
let remaining_bi2 = bibytes2(self.inner.available.load(Ordering::Relaxed) as f64);
log::info!("remaining bandwidth: {remaining_bi2}");
let remaining = self.remaining();
let remaining_bi2 = bibytes2(remaining as f64);
if remaining < 0 {
log::warn!("OUT OF BANDWIDTH. remaining: {remaining_bi2}");
} else {
log::info!("remaining bandwidth: {remaining_bi2}");
}
self.inner
.last_logged_ts
@@ -6,7 +6,7 @@ use crate::packet_router::PacketRouter;
pub use crate::packet_router::{
AcknowledgementReceiver, AcknowledgementSender, MixnetMessageReceiver, MixnetMessageSender,
};
use crate::socket_state::{ws_fd, PartiallyDelegated, SocketState};
use crate::socket_state::{ws_fd, PartiallyDelegatedHandle, SocketState};
use crate::traits::GatewayPacketRouter;
use crate::{cleanup_socket_message, try_decrypt_binary_message};
use futures::{SinkExt, StreamExt};
@@ -809,7 +809,7 @@ impl<C, St> GatewayClient<C, St> {
let partially_delegated =
match std::mem::replace(&mut self.connection, SocketState::Invalid) {
SocketState::Available(conn) => {
PartiallyDelegated::split_and_listen_for_mixnet_messages(
PartiallyDelegatedHandle::split_and_listen_for_mixnet_messages(
*conn,
self.packet_router.clone(),
Arc::clone(
+1 -4
View File
@@ -52,10 +52,7 @@ pub(crate) fn try_decrypt_binary_message(
BinaryResponse::PushedMixMessage(plaintext) => Some(plaintext),
},
Err(err) => {
warn!(
"message received from the gateway was malformed! - {:?}",
err
);
warn!("message received from the gateway was malformed! - {err}",);
None
}
}
@@ -1,6 +1,7 @@
// Copyright 2021-2023 - Nym Technologies SA <contact@nymtech.net>
// SPDX-License-Identifier: Apache-2.0
use crate::bandwidth::ClientBandwidth;
use crate::error::GatewayClientError;
use crate::packet_router::PacketRouter;
use crate::traits::GatewayPacketRouter;
@@ -10,11 +11,11 @@ use futures::stream::{SplitSink, SplitStream};
use futures::{SinkExt, StreamExt};
use log::*;
use nym_gateway_requests::registration::handshake::SharedKeys;
use nym_gateway_requests::ServerResponse;
use nym_gateway_requests::{ServerResponse, SimpleGatewayRequestsError};
use nym_task::TaskClient;
use std::os::raw::c_int as RawFd;
use std::sync::Arc;
use tungstenite::Message;
use tungstenite::{protocol::Message, Error as WsError};
#[cfg(unix)]
use std::os::fd::AsRawFd;
@@ -23,7 +24,6 @@ use tokio::net::TcpStream;
#[cfg(not(target_arch = "wasm32"))]
use tokio_tungstenite::{MaybeTlsStream, WebSocketStream};
use crate::bandwidth::ClientBandwidth;
#[cfg(target_arch = "wasm32")]
use wasm_utils::websocket::JSWebsocket;
@@ -39,6 +39,7 @@ type WsConn = JSWebsocket;
// by some other task, however, we can notify it to get the stream back.
type SplitStreamReceiver = oneshot::Receiver<Result<SplitStream<WsConn>, GatewayClientError>>;
type SplitStreamSender = oneshot::Sender<Result<SplitStream<WsConn>, GatewayClientError>>;
pub(crate) fn ws_fd(_conn: &WsConn) -> Option<RawFd> {
#[cfg(unix)]
@@ -51,85 +52,200 @@ pub(crate) fn ws_fd(_conn: &WsConn) -> Option<RawFd> {
}
#[derive(Debug)]
pub(crate) struct PartiallyDelegated {
pub(crate) struct PartiallyDelegatedHandle {
sink_half: SplitSink<WsConn, Message>,
// this could have been simplified by a notify as opposed to oneshot, but let's not change what ain't broke
delegated_stream: (SplitStreamReceiver, oneshot::Sender<()>),
ws_fd: Option<RawFd>,
}
impl PartiallyDelegated {
// fn try_recover_plaintext(ws_message: Message, shared_key: &SharedKeys, )
struct PartiallyDelegatedRouter {
packet_router: PacketRouter,
shared_key: Arc<SharedKeys>,
client_bandwidth: ClientBandwidth,
fn recover_received_plaintexts(
ws_msgs: Vec<Message>,
shared_key: &SharedKeys,
stream_return: SplitStreamSender,
stream_return_requester: oneshot::Receiver<()>,
}
impl PartiallyDelegatedRouter {
fn new(
packet_router: PacketRouter,
shared_key: Arc<SharedKeys>,
client_bandwidth: ClientBandwidth,
) -> Result<Vec<Vec<u8>>, GatewayClientError> {
let mut plaintexts = Vec::with_capacity(ws_msgs.len());
for ws_msg in ws_msgs {
match ws_msg {
Message::Binary(bin_msg) => {
// this function decrypts the request and checks the MAC
if let Some(plaintext) = try_decrypt_binary_message(bin_msg, shared_key) {
plaintexts.push(plaintext)
stream_return: SplitStreamSender,
stream_return_requester: oneshot::Receiver<()>,
) -> PartiallyDelegatedRouter {
PartiallyDelegatedRouter {
packet_router,
shared_key,
client_bandwidth,
stream_return,
stream_return_requester,
}
}
async fn run(mut self, mut split_stream: SplitStream<WsConn>, mut task_client: TaskClient) {
let mut chunked_stream = (&mut split_stream).ready_chunks(8);
let ret: Result<_, GatewayClientError> = loop {
tokio::select! {
biased;
// received system-wide shutdown
_ = task_client.recv() => {
log::trace!("GatewayClient listener: Received shutdown");
log::debug!("GatewayClient listener: Exiting");
return;
}
// received request to stop the task and return the stream
_ = &mut self.stream_return_requester => {
log::debug!("received request to return the split ws stream");
break Ok(())
}
socket_msgs = chunked_stream.next() => {
if let Err(err) = self.handle_socket_messages(socket_msgs) {
break Err(err)
}
}
// I think that in the future we should perhaps have some sequence number system, i.e.
// so each request/response pair can be easily identified, so that if messages are
// not ordered (for some peculiar reason) we wouldn't lose anything.
// This would also require NOT discarding any text responses here.
}
};
// TODO: those can return the "send confirmations" - perhaps it should be somehow worked around?
Message::Text(text) => {
trace!(
let return_res = match ret {
Err(err) => self.stream_return.send(Err(err)),
Ok(_) => {
self.packet_router.mark_as_success();
task_client.mark_as_success();
self.stream_return.send(Ok(split_stream))
}
};
if return_res.is_err() {
warn!("failed to return the split stream back on the oneshot channel")
}
}
fn handle_socket_messages(
&self,
msgs: Option<Vec<Result<Message, WsError>>>,
) -> Result<(), GatewayClientError> {
let ws_msgs = cleanup_socket_messages(msgs)?;
let plaintexts = self.recover_received_plaintexts(ws_msgs)?;
if !plaintexts.is_empty() {
self.packet_router.route_received(plaintexts)?
}
Ok(())
}
fn handle_binary_message(&self, binary_msg: Vec<u8>) -> Result<Vec<u8>, GatewayClientError> {
// this function decrypts the request and checks the MAC
match try_decrypt_binary_message(binary_msg, &self.shared_key) {
Some(plaintext) => Ok(plaintext),
None => {
error!("failed to decrypt and verify received message!");
Err(GatewayClientError::MalformedResponse)
}
}
}
// only returns an error on **critical** failures
fn handle_text_message(&self, text: String) -> Result<(), GatewayClientError> {
// if we fail to deserialise the response, return a hard error. we can't handle garbage
match ServerResponse::try_from(text).map_err(|_| GatewayClientError::MalformedResponse)? {
ServerResponse::Send {
remaining_bandwidth,
} => {
self.client_bandwidth
.update_and_maybe_log(remaining_bandwidth);
Ok(())
}
ServerResponse::Error { message } => {
error!("[1] gateway failure: {message}");
Err(GatewayClientError::GatewayError(message))
}
ServerResponse::TypedError { error } => {
match error {
SimpleGatewayRequestsError::OutOfBandwidth {
required,
available,
} => {
warn!("run out of bandwidth when attempting to send the message! we got {available}B available, but needed at least {required}B to send the previous message");
self.client_bandwidth.update_and_log(available);
// UNIMPLEMENTED: we should stop sending messages until we recover bandwidth
Ok(())
} // _ => {
// error!("[2] gateway failure: {error}");
// Err(GatewayClientError::TypedGatewayError(error))
// }
}
}
other => {
let name = other.name();
warn!("received illegal message of type '{name}' in an authenticated client");
Ok(())
}
}
}
fn recover_received_plaintext(
&self,
message: Message,
) -> Result<Option<Vec<u8>>, GatewayClientError> {
match message {
Message::Binary(bin_msg) => {
let plaintext = self.handle_binary_message(bin_msg)?;
Ok(Some(plaintext))
}
// I think that in the future we should perhaps have some sequence number system, i.e.
// so each request/response pair can be easily identified, so that if messages are
// not ordered (for some peculiar reason) we wouldn't lose anything.
// This would also require NOT discarding any text responses here.
// TODO: those can return the "send confirmations" - perhaps it should be somehow worked around?
Message::Text(text) => {
trace!(
"received a text message - probably a response to some previous query! - {text}",
);
match ServerResponse::try_from(text)
.map_err(|_| GatewayClientError::MalformedResponse)?
{
ServerResponse::Send {
remaining_bandwidth,
} => client_bandwidth.update_and_maybe_log(remaining_bandwidth),
ServerResponse::Error { message } => {
error!("[1] gateway failure: {message}");
return Err(GatewayClientError::GatewayError(message));
}
ServerResponse::TypedError { error } => {
error!("[2] gateway failure: {error}");
return Err(GatewayClientError::TypedGatewayError(error));
}
other => {
warn!(
"received illegal message of type {} in an authenticated client",
other.name()
)
}
}
self.handle_text_message(text)?;
Ok(None)
}
_ => {
debug!("received websocket message that's neither 'Binary' nor 'Text'. it's going to get ignored");
Ok(None)
}
}
}
continue;
}
_ => continue,
fn recover_received_plaintexts(
&self,
messages: Vec<Message>,
) -> Result<Vec<Vec<u8>>, GatewayClientError> {
let mut plaintexts = Vec::new();
for ws_msg in messages {
if let Some(plaintext) = self.recover_received_plaintext(ws_msg)? {
plaintexts.push(plaintext)
}
}
Ok(plaintexts)
}
fn route_socket_messages(
ws_msgs: Vec<Message>,
packet_router: &PacketRouter,
shared_key: &SharedKeys,
client_bandwidth: ClientBandwidth,
) -> Result<(), GatewayClientError> {
let plaintexts = Self::recover_received_plaintexts(ws_msgs, shared_key, client_bandwidth)?;
packet_router.route_received(plaintexts)
}
fn spawn(self, split_stream: SplitStream<WsConn>, task_client: TaskClient) {
let fut = async move { self.run(split_stream, task_client).await };
#[cfg(target_arch = "wasm32")]
wasm_bindgen_futures::spawn_local(fut);
#[cfg(not(target_arch = "wasm32"))]
tokio::spawn(fut);
}
}
impl PartiallyDelegatedHandle {
pub(crate) fn split_and_listen_for_mixnet_messages(
conn: WsConn,
mut packet_router: PacketRouter,
packet_router: PacketRouter,
shared_key: Arc<SharedKeys>,
client_bandwidth: ClientBandwidth,
mut shutdown: TaskClient,
shutdown: TaskClient,
) -> Self {
// when called for, it NEEDS TO yield back the stream so that we could merge it and
// read control request responses.
@@ -137,58 +253,18 @@ impl PartiallyDelegated {
let (stream_sender, stream_receiver) = oneshot::channel();
let ws_fd = ws_fd(&conn);
let (sink, stream) = conn.split();
let (sink, mut stream) = conn.split();
PartiallyDelegatedRouter::new(
packet_router,
shared_key,
client_bandwidth,
stream_sender,
notify_receiver,
)
.spawn(stream, shutdown);
let mixnet_receiver_future = async move {
let mut notify_receiver = notify_receiver;
let mut chunk_stream = (&mut stream).ready_chunks(8);
let ret_err = loop {
tokio::select! {
_ = shutdown.recv() => {
log::trace!("GatewayClient listener: Received shutdown");
log::debug!("GatewayClient listener: Exiting");
return;
}
_ = &mut notify_receiver => {
break Ok(());
}
msgs = chunk_stream.next() => {
let ws_msgs = match cleanup_socket_messages(msgs) {
Err(err) => break Err(err),
Ok(msgs) => msgs
};
if let Err(err) = Self::route_socket_messages(ws_msgs, &packet_router, shared_key.as_ref(), client_bandwidth.clone()) {
log::error!("Route socket messages failed: {err}");
break Err(err)
}
}
}
};
if match ret_err {
Err(err) => stream_sender.send(Err(err)),
Ok(_) => {
packet_router.mark_as_success();
shutdown.mark_as_success();
stream_sender.send(Ok(stream))
}
}
.is_err()
{
warn!("failed to send back `mixnet_receiver_future` result on the oneshot channel")
}
};
#[cfg(target_arch = "wasm32")]
wasm_bindgen_futures::spawn_local(mixnet_receiver_future);
#[cfg(not(target_arch = "wasm32"))]
tokio::spawn(mixnet_receiver_future);
PartiallyDelegated {
PartiallyDelegatedHandle {
ws_fd,
sink_half: sink,
delegated_stream: (stream_receiver, notify_sender),
@@ -257,7 +333,7 @@ impl PartiallyDelegated {
#[derive(Debug)]
pub(crate) enum SocketState {
Available(Box<WsConn>),
PartiallyDelegated(PartiallyDelegated),
PartiallyDelegated(PartiallyDelegatedHandle),
NotConnected,
Invalid,
}
@@ -26,7 +26,7 @@ use nym_credentials_interface::CredentialSpendingData;
use nym_gateway_requests::models::CredentialSpendingRequest;
use nym_gateway_requests::{
types::{BinaryRequest, ServerResponse},
ClientControlRequest, GatewayRequestsError,
ClientControlRequest, GatewayRequestsError, SimpleGatewayRequestsError,
};
use nym_sphinx::forwarding::packet::MixPacket;
use nym_task::TaskClient;
@@ -106,7 +106,19 @@ pub enum RequestHandlingError {
impl RequestHandlingError {
fn into_error_message(self) -> Message {
ServerResponse::new_error(self.to_string()).into()
let server_response = match self {
RequestHandlingError::OutOfBandwidth {
required,
available,
} => ServerResponse::TypedError {
error: SimpleGatewayRequestsError::OutOfBandwidth {
required,
available,
},
},
other => ServerResponse::new_error(other.to_string()),
};
server_response.into()
}
}
+205 -117
View File
@@ -284,6 +284,15 @@ version = "1.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b"
[[package]]
name = "bincode"
version = "1.3.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad"
dependencies = [
"serde",
]
[[package]]
name = "bip32"
version = "0.5.1"
@@ -332,18 +341,6 @@ version = "2.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b4682ae6287fcf752ecaabbfcc7b6f9b72aa33933dc23a554d853aea8eea8635"
[[package]]
name = "bitvec"
version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c"
dependencies = [
"funty",
"radium",
"tap",
"wyz",
]
[[package]]
name = "blake2"
version = "0.8.1"
@@ -392,13 +389,15 @@ dependencies = [
[[package]]
name = "bls12_381"
version = "0.8.0"
source = "git+https://github.com/jstuczyn/bls12_381?branch=feature/gt-serialization-0.8.0#c4543fde7d02efea6ecfcf22e14476ddb516b483"
source = "git+https://github.com/jstuczyn/bls12_381?branch=temp/experimental-serdect#22cd0a16b674af1629110a2dc8b6cf6c73ea4cd9"
dependencies = [
"digest 0.9.0",
"ff",
"group",
"pairing",
"rand_core 0.6.4",
"serde",
"serdect 0.3.0-pre.0",
"subtle 2.5.0",
"zeroize",
]
@@ -815,17 +814,17 @@ checksum = "32560304ab4c365791fd307282f76637213d8083c1a98490c35159cd67852237"
dependencies = [
"prost",
"prost-types",
"tendermint-proto",
"tendermint-proto 0.34.0",
]
[[package]]
name = "cosmos-sdk-proto"
version = "0.20.0"
source = "git+https://github.com/jstuczyn/cosmos-rust?branch=nym-temp/all-validator-features#67718aa27a96efb9881e927a8f998c94b885093c"
version = "0.22.0-pre"
source = "git+https://github.com/cosmos/cosmos-rust?rev=4b1332e6d8258ac845cef71589c8d362a669675a#4b1332e6d8258ac845cef71589c8d362a669675a"
dependencies = [
"prost",
"prost-types",
"tendermint-proto",
"tendermint-proto 0.37.0",
]
[[package]]
@@ -835,7 +834,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "47126f5364df9387b9d8559dcef62e99010e1d4098f39eb3f7ee4b5c254e40ea"
dependencies = [
"bip32",
"cosmos-sdk-proto 0.20.0 (registry+https://github.com/rust-lang/crates.io-index)",
"cosmos-sdk-proto 0.20.0",
"ecdsa",
"eyre",
"k256",
@@ -844,17 +843,17 @@ dependencies = [
"serde_json",
"signature",
"subtle-encoding",
"tendermint",
"tendermint 0.34.0",
"thiserror",
]
[[package]]
name = "cosmrs"
version = "0.15.0"
source = "git+https://github.com/jstuczyn/cosmos-rust?branch=nym-temp/all-validator-features#67718aa27a96efb9881e927a8f998c94b885093c"
version = "0.17.0-pre"
source = "git+https://github.com/cosmos/cosmos-rust?rev=4b1332e6d8258ac845cef71589c8d362a669675a#4b1332e6d8258ac845cef71589c8d362a669675a"
dependencies = [
"bip32",
"cosmos-sdk-proto 0.20.0 (git+https://github.com/jstuczyn/cosmos-rust?branch=nym-temp/all-validator-features)",
"cosmos-sdk-proto 0.22.0-pre",
"ecdsa",
"eyre",
"k256",
@@ -863,7 +862,7 @@ dependencies = [
"serde_json",
"signature",
"subtle-encoding",
"tendermint",
"tendermint 0.37.0",
"tendermint-rpc",
"thiserror",
]
@@ -1436,7 +1435,7 @@ dependencies = [
"digest 0.10.7",
"elliptic-curve",
"rfc6979",
"serdect",
"serdect 0.2.0",
"signature",
"spki",
]
@@ -1516,7 +1515,7 @@ dependencies = [
"pkcs8",
"rand_core 0.6.4",
"sec1",
"serdect",
"serdect 0.2.0",
"subtle 2.5.0",
"zeroize",
]
@@ -1705,12 +1704,6 @@ version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c8cbd1169bd7b4a0a20d92b9af7a7e0422888bd38a6f5ec29c1fd8c1558a272e"
[[package]]
name = "funty"
version = "2.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c"
[[package]]
name = "futf"
version = "0.1.5"
@@ -2652,6 +2645,15 @@ dependencies = [
"either",
]
[[package]]
name = "itertools"
version = "0.13.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186"
dependencies = [
"either",
]
[[package]]
name = "itoa"
version = "0.4.8"
@@ -3082,17 +3084,22 @@ name = "nym-api-requests"
version = "0.1.0"
dependencies = [
"bs58 0.5.1",
"cosmrs 0.15.0 (git+https://github.com/jstuczyn/cosmos-rust?branch=nym-temp/all-validator-features)",
"cosmrs 0.17.0-pre",
"cosmwasm-std",
"ecdsa",
"getset",
"nym-compact-ecash",
"nym-credentials-interface",
"nym-crypto",
"nym-ecash-time",
"nym-mixnet-contract-common",
"nym-node-requests",
"schemars",
"serde",
"tendermint",
"serde-helpers",
"sha2 0.10.8",
"tendermint 0.37.0",
"thiserror",
"time",
]
@@ -3109,26 +3116,6 @@ dependencies = [
"vergen",
]
[[package]]
name = "nym-coconut"
version = "0.5.0"
dependencies = [
"bls12_381",
"bs58 0.5.1",
"digest 0.9.0",
"ff",
"getrandom 0.2.10",
"group",
"itertools 0.12.1",
"nym-dkg",
"nym-pemstore",
"rand 0.8.5",
"serde",
"serde_derive",
"sha2 0.9.9",
"thiserror",
]
[[package]]
name = "nym-coconut-bandwidth-contract-common"
version = "0.1.0"
@@ -3151,6 +3138,26 @@ dependencies = [
"nym-multisig-contract-common",
]
[[package]]
name = "nym-compact-ecash"
version = "0.1.0"
dependencies = [
"bincode",
"bls12_381",
"bs58 0.5.1",
"cfg-if",
"digest 0.9.0",
"ff",
"group",
"itertools 0.12.1",
"nym-pemstore",
"rand 0.8.5",
"serde",
"sha2 0.9.9",
"thiserror",
"zeroize",
]
[[package]]
name = "nym-config"
version = "0.1.0"
@@ -3183,9 +3190,12 @@ name = "nym-credentials-interface"
version = "0.1.0"
dependencies = [
"bls12_381",
"nym-coconut",
"nym-compact-ecash",
"nym-ecash-time",
"rand 0.8.5",
"serde",
"thiserror",
"time",
]
[[package]]
@@ -3206,24 +3216,23 @@ dependencies = [
]
[[package]]
name = "nym-dkg"
name = "nym-ecash-contract-common"
version = "0.1.0"
dependencies = [
"bitvec",
"bls12_381",
"bs58 0.5.1",
"ff",
"group",
"lazy_static",
"nym-pemstore",
"rand 0.8.5",
"rand_chacha 0.3.1",
"rand_core 0.6.4",
"serde",
"serde_derive",
"sha2 0.9.9",
"cosmwasm-schema",
"cosmwasm-std",
"cw-controllers",
"cw-utils",
"nym-multisig-contract-common",
"thiserror",
"zeroize",
]
[[package]]
name = "nym-ecash-time"
version = "0.1.0"
dependencies = [
"time",
]
[[package]]
@@ -3365,11 +3374,11 @@ name = "nym-types"
version = "1.0.0"
dependencies = [
"base64 0.21.4",
"cosmrs 0.15.0 (git+https://github.com/jstuczyn/cosmos-rust?branch=nym-temp/all-validator-features)",
"cosmrs 0.17.0-pre",
"cosmwasm-std",
"eyre",
"hmac",
"itertools 0.12.1",
"itertools 0.13.0",
"log",
"nym-config",
"nym-crypto",
@@ -3397,7 +3406,7 @@ dependencies = [
"bip32",
"bip39",
"colored 2.0.4",
"cosmrs 0.15.0 (git+https://github.com/jstuczyn/cosmos-rust?branch=nym-temp/all-validator-features)",
"cosmrs 0.17.0-pre",
"cosmwasm-std",
"cw-controllers",
"cw-utils",
@@ -3407,14 +3416,15 @@ dependencies = [
"eyre",
"flate2",
"futures",
"itertools 0.12.1",
"itertools 0.13.0",
"log",
"nym-api-requests",
"nym-coconut",
"nym-coconut-bandwidth-contract-common",
"nym-coconut-dkg-common",
"nym-compact-ecash",
"nym-config",
"nym-contracts-common",
"nym-ecash-contract-common",
"nym-group-contract-common",
"nym-http-api-client",
"nym-mixnet-contract-common",
@@ -3428,6 +3438,7 @@ dependencies = [
"sha2 0.9.9",
"tendermint-rpc",
"thiserror",
"time",
"tokio",
"url",
"wasmtimer",
@@ -3465,7 +3476,7 @@ dependencies = [
name = "nym-wallet-types"
version = "1.0.0"
dependencies = [
"cosmrs 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)",
"cosmrs 0.15.0",
"cosmwasm-std",
"hex-literal",
"nym-config",
@@ -3504,7 +3515,7 @@ dependencies = [
"bip39",
"cfg-if",
"colored 2.0.4",
"cosmrs 0.15.0 (git+https://github.com/jstuczyn/cosmos-rust?branch=nym-temp/all-validator-features)",
"cosmrs 0.17.0-pre",
"cosmwasm-std",
"dirs 4.0.0",
"dotenvy",
@@ -3760,9 +3771,9 @@ checksum = "8835116a5c179084a830efb3adc117ab007512b535bc1a21c991d3b32a6b44dd"
[[package]]
name = "peg"
version = "0.7.0"
version = "0.8.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "07c0b841ea54f523f7aa556956fbd293bcbe06f2e67d2eb732b7278aaf1d166a"
checksum = "295283b02df346d1ef66052a757869b2876ac29a6bb0ac3f5f7cd44aebe40e8f"
dependencies = [
"peg-macros",
"peg-runtime",
@@ -3770,9 +3781,9 @@ dependencies = [
[[package]]
name = "peg-macros"
version = "0.7.0"
version = "0.8.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b5aa52829b8decbef693af90202711348ab001456803ba2a98eb4ec8fb70844c"
checksum = "bdad6a1d9cf116a059582ce415d5f5566aabcd4008646779dab7fdc2a9a9d426"
dependencies = [
"peg-runtime",
"proc-macro2",
@@ -3781,9 +3792,9 @@ dependencies = [
[[package]]
name = "peg-runtime"
version = "0.7.0"
version = "0.8.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c719dcf55f09a3a7e764c6649ab594c18a177e3599c467983cdf644bfc0a4088"
checksum = "e3aeb8f54c078314c2065ee649a7241f46b9d8e418e1a9581ba0546657d7aa3a"
[[package]]
name = "pem"
@@ -4072,7 +4083,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919"
dependencies = [
"once_cell",
"toml_edit",
"toml_edit 0.19.14",
]
[[package]]
@@ -4176,12 +4187,6 @@ dependencies = [
"proc-macro2",
]
[[package]]
name = "radium"
version = "0.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09"
[[package]]
name = "rand"
version = "0.7.3"
@@ -4701,7 +4706,7 @@ dependencies = [
"der",
"generic-array 0.14.7",
"pkcs8",
"serdect",
"serdect 0.2.0",
"subtle 2.5.0",
"zeroize",
]
@@ -4785,6 +4790,15 @@ dependencies = [
"serde_derive",
]
[[package]]
name = "serde-helpers"
version = "0.1.0"
dependencies = [
"base64 0.21.4",
"bs58 0.5.1",
"serde",
]
[[package]]
name = "serde-json-wasm"
version = "0.5.0"
@@ -4900,6 +4914,16 @@ dependencies = [
"serde",
]
[[package]]
name = "serdect"
version = "0.3.0-pre.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "791ef964bfaba6be28a5c3f0c56836e17cb711ac009ca1074b9c735a3ebf240a"
dependencies = [
"base16ct",
"serde",
]
[[package]]
name = "serialize-to-javascript"
version = "0.1.1"
@@ -5333,7 +5357,7 @@ dependencies = [
"scopeguard",
"serde",
"unicode-segmentation",
"uuid 1.4.1",
"uuid 1.10.0",
"windows 0.39.0",
"windows-implement",
"x11-dl",
@@ -5408,7 +5432,7 @@ dependencies = [
"time",
"tokio",
"url",
"uuid 1.4.1",
"uuid 1.10.0",
"webkit2gtk",
"webview2-com",
"windows 0.39.0",
@@ -5453,7 +5477,7 @@ dependencies = [
"tauri-utils",
"thiserror",
"time",
"uuid 1.4.1",
"uuid 1.10.0",
"walkdir",
]
@@ -5486,7 +5510,7 @@ dependencies = [
"serde_json",
"tauri-utils",
"thiserror",
"uuid 1.4.1",
"uuid 1.10.0",
"webview2-com",
"windows 0.39.0",
]
@@ -5504,7 +5528,7 @@ dependencies = [
"raw-window-handle",
"tauri-runtime",
"tauri-utils",
"uuid 1.4.1",
"uuid 1.10.0",
"webkit2gtk",
"webview2-com",
"windows 0.39.0",
@@ -5578,22 +5602,53 @@ dependencies = [
"signature",
"subtle 2.5.0",
"subtle-encoding",
"tendermint-proto",
"tendermint-proto 0.34.0",
"time",
"zeroize",
]
[[package]]
name = "tendermint"
version = "0.37.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "954496fbc9716eb4446cdd6d00c071a3e2f22578d62aa03b40c7e5b4fda3ed42"
dependencies = [
"bytes",
"digest 0.10.7",
"ed25519",
"ed25519-consensus",
"flex-error",
"futures",
"k256",
"num-traits",
"once_cell",
"prost",
"prost-types",
"ripemd",
"serde",
"serde_bytes",
"serde_json",
"serde_repr",
"sha2 0.10.8",
"signature",
"subtle 2.5.0",
"subtle-encoding",
"tendermint-proto 0.37.0",
"time",
"zeroize",
]
[[package]]
name = "tendermint-config"
version = "0.34.0"
version = "0.37.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5a25dbe8b953e80f3d61789fbdb83bf9ad6c0ef16df5ca6546f49912542cc137"
checksum = "f84b11b57d20ee4492a1452faff85f5c520adc36ca9fe5e701066935255bb89f"
dependencies = [
"flex-error",
"serde",
"serde_json",
"tendermint",
"toml 0.5.11",
"tendermint 0.37.0",
"toml 0.8.2",
"url",
]
@@ -5616,10 +5671,26 @@ dependencies = [
]
[[package]]
name = "tendermint-rpc"
version = "0.34.0"
name = "tendermint-proto"
version = "0.37.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dfbf0a4753b46a190f367337e0163d0b552a2674a6bac54e74f9f2cdcde2969b"
checksum = "dc87024548c7f3da479885201e3da20ef29e85a3b13d04606b380ac4c7120d87"
dependencies = [
"bytes",
"flex-error",
"prost",
"prost-types",
"serde",
"serde_bytes",
"subtle-encoding",
"time",
]
[[package]]
name = "tendermint-rpc"
version = "0.37.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dfdc2281e271277fda184d96d874a6fe59f569b130b634289257baacfc95aa85"
dependencies = [
"async-trait",
"bytes",
@@ -5628,6 +5699,7 @@ dependencies = [
"getrandom 0.2.10",
"peg",
"pin-project",
"rand 0.8.5",
"reqwest 0.11.22",
"semver 1.0.22",
"serde",
@@ -5635,15 +5707,15 @@ dependencies = [
"serde_json",
"subtle 2.5.0",
"subtle-encoding",
"tendermint",
"tendermint 0.37.0",
"tendermint-config",
"tendermint-proto",
"tendermint-proto 0.37.0",
"thiserror",
"time",
"tokio",
"tracing",
"url",
"uuid 0.8.2",
"uuid 1.10.0",
"walkdir",
]
@@ -5843,7 +5915,19 @@ dependencies = [
"serde",
"serde_spanned",
"toml_datetime",
"toml_edit",
"toml_edit 0.19.14",
]
[[package]]
name = "toml"
version = "0.8.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "185d8ab0dfbb35cf1399a6344d8484209c088f75f8f68230da55d48d95d43e3d"
dependencies = [
"serde",
"serde_spanned",
"toml_datetime",
"toml_edit 0.20.2",
]
[[package]]
@@ -5868,6 +5952,19 @@ dependencies = [
"winnow",
]
[[package]]
name = "toml_edit"
version = "0.20.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "396e4d48bbb2b7554c944bde63101b5ae446cff6ec4a24227428f15eb72ef338"
dependencies = [
"indexmap 2.0.0",
"serde",
"serde_spanned",
"toml_datetime",
"winnow",
]
[[package]]
name = "tower"
version = "0.4.13"
@@ -6084,9 +6181,9 @@ checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7"
[[package]]
name = "uuid"
version = "1.4.1"
version = "1.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "79daa5ed5740825c40b389c5e50312b9c86df53fccd33f281df655642b43869d"
checksum = "81dfa00651efa65069b0b6b651f4aaa31ba9e3c3ce0137aaad053604ee7e0314"
dependencies = [
"getrandom 0.2.10",
]
@@ -6782,15 +6879,6 @@ dependencies = [
"windows-implement",
]
[[package]]
name = "wyz"
version = "0.5.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed"
dependencies = [
"tap",
]
[[package]]
name = "x11"
version = "2.21.0"