diff --git a/common/client-libs/gateway-client/src/bandwidth.rs b/common/client-libs/gateway-client/src/bandwidth.rs index 3dfe78e37a..f232c004ec 100644 --- a/common/client-libs/gateway-client/src/bandwidth.rs +++ b/common/client-libs/gateway-client/src/bandwidth.rs @@ -49,8 +49,14 @@ impl ClientBandwidth { pub(crate) fn log_bandwidth(&self, now: Option) { 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 diff --git a/common/client-libs/gateway-client/src/client.rs b/common/client-libs/gateway-client/src/client.rs index 76269e8f89..0f55b4b16b 100644 --- a/common/client-libs/gateway-client/src/client.rs +++ b/common/client-libs/gateway-client/src/client.rs @@ -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 GatewayClient { 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( diff --git a/common/client-libs/gateway-client/src/lib.rs b/common/client-libs/gateway-client/src/lib.rs index e74b6aeddb..e293553732 100644 --- a/common/client-libs/gateway-client/src/lib.rs +++ b/common/client-libs/gateway-client/src/lib.rs @@ -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 } } diff --git a/common/client-libs/gateway-client/src/socket_state.rs b/common/client-libs/gateway-client/src/socket_state.rs index cd5259d47a..d2411480c9 100644 --- a/common/client-libs/gateway-client/src/socket_state.rs +++ b/common/client-libs/gateway-client/src/socket_state.rs @@ -1,6 +1,7 @@ // Copyright 2021-2023 - Nym Technologies SA // 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, GatewayClientError>>; +type SplitStreamSender = oneshot::Sender, GatewayClientError>>; pub(crate) fn ws_fd(_conn: &WsConn) -> Option { #[cfg(unix)] @@ -51,85 +52,200 @@ pub(crate) fn ws_fd(_conn: &WsConn) -> Option { } #[derive(Debug)] -pub(crate) struct PartiallyDelegated { +pub(crate) struct PartiallyDelegatedHandle { sink_half: SplitSink, + // 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, } -impl PartiallyDelegated { - // fn try_recover_plaintext(ws_message: Message, shared_key: &SharedKeys, ) +struct PartiallyDelegatedRouter { + packet_router: PacketRouter, + shared_key: Arc, + client_bandwidth: ClientBandwidth, - fn recover_received_plaintexts( - ws_msgs: Vec, - shared_key: &SharedKeys, + stream_return: SplitStreamSender, + stream_return_requester: oneshot::Receiver<()>, +} + +impl PartiallyDelegatedRouter { + fn new( + packet_router: PacketRouter, + shared_key: Arc, client_bandwidth: ClientBandwidth, - ) -> Result>, 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, 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>>, + ) -> 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) -> Result, 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>, 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, + ) -> Result>, 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, - 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, 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, 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), - PartiallyDelegated(PartiallyDelegated), + PartiallyDelegated(PartiallyDelegatedHandle), NotConnected, Invalid, } diff --git a/gateway/src/node/client_handling/websocket/connection_handler/authenticated.rs b/gateway/src/node/client_handling/websocket/connection_handler/authenticated.rs index fa31cc6960..cd68f126d8 100644 --- a/gateway/src/node/client_handling/websocket/connection_handler/authenticated.rs +++ b/gateway/src/node/client_handling/websocket/connection_handler/authenticated.rs @@ -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() } } diff --git a/nym-wallet/Cargo.lock b/nym-wallet/Cargo.lock index c61e778d75..1b15e0acb2 100644 --- a/nym-wallet/Cargo.lock +++ b/nym-wallet/Cargo.lock @@ -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"