diff --git a/Cargo.lock b/Cargo.lock index 82896d6281..0c95e60e59 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1223,7 +1223,7 @@ checksum = "754b69d351cdc2d8ee09ae203db831e005560fc6030da058f86ad60c92a9cb0a" dependencies = [ "cssparser-macros", "dtoa-short", - "itoa", + "itoa 0.4.8", "matches", "phf 0.8.0", "proc-macro2", @@ -1250,7 +1250,7 @@ checksum = "22813a6dc45b335f9bade10bf7271dc477e81113e89eb251a0bc2a8a81c536e1" dependencies = [ "bstr", "csv-core", - "itoa", + "itoa 0.4.8", "ryu", "serde", ] @@ -2809,7 +2809,7 @@ checksum = "1323096b05d41827dadeaee54c9981958c0f94e670bc94ed80037d1a7b8b186b" dependencies = [ "bytes", "fnv", - "itoa", + "itoa 0.4.8", ] [[package]] @@ -2881,7 +2881,7 @@ dependencies = [ "http-body", "httparse", "httpdate", - "itoa", + "itoa 0.4.8", "pin-project-lite", "socket2", "tokio", @@ -3149,6 +3149,12 @@ version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4" +[[package]] +name = "itoa" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1aab8fc367588b89dcee83ab0fd66b72b50b72fa1904d7095045ace2b0c81c35" + [[package]] name = "javascriptcore-rs" version = "0.14.0" @@ -3271,9 +3277,9 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libc" -version = "0.2.102" +version = "0.2.113" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2a5ac8f984bfcf3a823267e5fde638acc3325f6496633a5da6bb6eb2171e103" +checksum = "eef78b64d87775463c549fbd80e19249ef436ea3bf1de2a1eb7e717ec7fab1e9" [[package]] name = "libgit2-sys" @@ -3499,7 +3505,7 @@ dependencies = [ "serde", "serde_repr", "thiserror", - "time 0.3.5", + "time 0.3.6", "ts-rs", ] @@ -3626,7 +3632,7 @@ dependencies = [ "cfg-if 1.0.0", "hex-literal", "serde", - "time 0.3.5", + "time 0.3.6", "url", ] @@ -3757,6 +3763,15 @@ dependencies = [ "syn", ] +[[package]] +name = "num_threads" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71a1eb3a36534514077c1e079ada2fb170ef30c47d203aa6916138cf882ecd52" +dependencies = [ + "libc", +] + [[package]] name = "nym-client" version = "0.12.1" @@ -3958,7 +3973,7 @@ dependencies = [ "serde_json", "sqlx", "thiserror", - "time 0.3.5", + "time 0.3.6", "tokio", "topology", "url", @@ -5810,7 +5825,7 @@ version = "1.0.68" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0f690853975602e1bfe1ccbf50504d67174e3bcf340f23b5ea9992e0587a52d8" dependencies = [ - "itoa", + "itoa 0.4.8", "ryu", "serde", ] @@ -5833,7 +5848,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ec5d77e2d4c73717816afac02670d5c4f534ea95ed430442cad02e7a6e32c97" dependencies = [ "dtoa", - "itoa", + "itoa 0.4.8", "serde", "url", ] @@ -5845,7 +5860,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "edfa57a7f8d9c1d260a549e7224100f6c43d43f9103e06dd8b4095a9b2b43ce9" dependencies = [ "form_urlencoded", - "itoa", + "itoa 0.4.8", "ryu", "serde", ] @@ -6175,7 +6190,7 @@ dependencies = [ "futures-util", "hashlink", "hex", - "itoa", + "itoa 0.4.8", "libc", "libsqlite3-sys", "log", @@ -6870,7 +6885,7 @@ dependencies = [ "subtle 2.4.1", "subtle-encoding", "tendermint-proto", - "time 0.3.5", + "time 0.3.6", "zeroize", ] @@ -6903,7 +6918,7 @@ dependencies = [ "serde", "serde_bytes", "subtle-encoding", - "time 0.3.5", + "time 0.3.6", ] [[package]] @@ -6931,7 +6946,7 @@ dependencies = [ "tendermint-config", "tendermint-proto", "thiserror", - "time 0.3.5", + "time 0.3.6", "tokio", "tracing", "url", @@ -7031,12 +7046,13 @@ dependencies = [ [[package]] name = "time" -version = "0.3.5" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41effe7cfa8af36f439fac33861b66b049edc6f9a32331e2312660529c1c24ad" +checksum = "c8d54b9298e05179c335de2b9645d061255bcd5155f843b3e328d2cfe0a5b413" dependencies = [ - "itoa", + "itoa 1.0.1", "libc", + "num_threads", "serde", "time-macros 0.2.3", ] diff --git a/common/cosmwasm-smart-contracts/mixnet-contract/Cargo.toml b/common/cosmwasm-smart-contracts/mixnet-contract/Cargo.toml index 611e3be2c2..c7d0b93591 100644 --- a/common/cosmwasm-smart-contracts/mixnet-contract/Cargo.toml +++ b/common/cosmwasm-smart-contracts/mixnet-contract/Cargo.toml @@ -18,7 +18,7 @@ network-defaults = { path = "../../network-defaults" } fixed = { version = "1.1", features = ["serde"] } az = "1.1" log = "0.4.14" -time = { version = "0.3.5", features = ["serde"] } +time = { version = "0.3.6", features = ["parsing", "formatting"] } contracts-common = { path = "../contracts-common" } diff --git a/common/cosmwasm-smart-contracts/mixnet-contract/src/interval.rs b/common/cosmwasm-smart-contracts/mixnet-contract/src/interval.rs index 1f77b90eab..78434a5082 100644 --- a/common/cosmwasm-smart-contracts/mixnet-contract/src/interval.rs +++ b/common/cosmwasm-smart-contracts/mixnet-contract/src/interval.rs @@ -8,10 +8,59 @@ use std::fmt::{Display, Formatter}; use std::time::Duration; use time::OffsetDateTime; +// internally, since version 0.3.6, time uses deserialize_any for deserialization, which can't be handled +// by serde wasm. We could just downgrade to 0.3.5 and call it a day, but then it would break +// when we decided to upgrade it at some point in the future. And then it would have been more problematic +// to fix it, since the data would have already been stored inside the contract. +// Hence, an explicit workaround to use string representation of Rfc3339-formatted datetime. +pub(crate) mod string_rfc3339_offset_date_time { + use serde::de::Visitor; + use serde::ser::Error; + use serde::{Deserializer, Serialize, Serializer}; + use std::fmt::Formatter; + use time::format_description::well_known::Rfc3339; + use time::OffsetDateTime; + + struct Rfc3339OffsetDateTimeVisitor; + + impl<'de> Visitor<'de> for Rfc3339OffsetDateTimeVisitor { + type Value = OffsetDateTime; + + fn expecting(&self, formatter: &mut Formatter) -> std::fmt::Result { + formatter.write_str("an rfc3339 `OffsetDateTime`") + } + + fn visit_str(self, value: &str) -> Result + where + E: serde::de::Error, + { + OffsetDateTime::parse(value, &Rfc3339).map_err(E::custom) + } + } + + pub(crate) fn deserialize<'de, D>(deserializer: D) -> Result + where + D: Deserializer<'de>, + { + deserializer.deserialize_str(Rfc3339OffsetDateTimeVisitor) + } + + pub(crate) fn serialize(datetime: &OffsetDateTime, serializer: S) -> Result + where + S: Serializer, + { + datetime + .format(&Rfc3339) + .map_err(S::Error::custom)? + .serialize(serializer) + } +} + /// Representation of rewarding interval. #[derive(Clone, Copy, Debug, Deserialize, PartialEq, PartialOrd, Serialize)] pub struct Interval { id: u32, + #[serde(with = "string_rfc3339_offset_date_time")] start: OffsetDateTime, length: Duration, } @@ -171,15 +220,17 @@ impl Interval { impl Display for Interval { fn fmt(&self, f: &mut Formatter) -> std::fmt::Result { - let length = self.length(); - let hours = length.as_secs_f32() / 3600.0; + let length = self.length().as_secs(); + let full_hours = length / 3600; + let rem = length % 3600; write!( f, - "Interval {}: {} - {} ({:.1} hours)", + "Interval {}: {} - {} ({}h {}s)", self.id, self.start(), self.end(), - hours + full_hours, + rem ) } } diff --git a/contracts/Cargo.lock b/contracts/Cargo.lock index 4e99ffc019..dba9ee5542 100644 --- a/contracts/Cargo.lock +++ b/contracts/Cargo.lock @@ -853,7 +853,7 @@ dependencies = [ "schemars", "serde", "thiserror", - "time 0.3.5", + "time 0.3.6", "vergen", "vesting-contract", ] @@ -872,7 +872,7 @@ dependencies = [ "serde", "serde_repr", "thiserror", - "time 0.3.5", + "time 0.3.6", ] [[package]] @@ -882,7 +882,7 @@ dependencies = [ "cfg-if", "hex-literal", "serde", - "time 0.3.5", + "time 0.3.6", "url", ] @@ -906,6 +906,15 @@ dependencies = [ "libm", ] +[[package]] +name = "num_threads" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71a1eb3a36534514077c1e079ada2fb170ef30c47d203aa6916138cf882ecd52" +dependencies = [ + "libc", +] + [[package]] name = "nymsphinx-types" version = "0.1.0" @@ -1405,12 +1414,13 @@ dependencies = [ [[package]] name = "time" -version = "0.3.5" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41effe7cfa8af36f439fac33861b66b049edc6f9a32331e2312660529c1c24ad" +checksum = "c8d54b9298e05179c335de2b9645d061255bcd5155f843b3e328d2cfe0a5b413" dependencies = [ + "itoa", "libc", - "serde", + "num_threads", "time-macros", ] diff --git a/nym-wallet/Cargo.lock b/nym-wallet/Cargo.lock index 1bbc007c31..57440a2ba5 100644 --- a/nym-wallet/Cargo.lock +++ b/nym-wallet/Cargo.lock @@ -2609,7 +2609,7 @@ dependencies = [ "serde", "serde_repr", "thiserror", - "time 0.3.5", + "time 0.3.6", "ts-rs", ] @@ -2684,7 +2684,7 @@ dependencies = [ "cfg-if 1.0.0", "hex-literal", "serde", - "time 0.3.5", + "time 0.3.6", "url", ] @@ -2795,6 +2795,15 @@ dependencies = [ "syn", ] +[[package]] +name = "num_threads" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71a1eb3a36534514077c1e079ada2fb170ef30c47d203aa6916138cf882ecd52" +dependencies = [ + "libc", +] + [[package]] name = "nym_wallet" version = "0.1.0" @@ -4896,7 +4905,7 @@ dependencies = [ "subtle 2.4.1", "subtle-encoding", "tendermint-proto", - "time 0.3.5", + "time 0.3.6", "zeroize", ] @@ -4929,7 +4938,7 @@ dependencies = [ "serde", "serde_bytes", "subtle-encoding", - "time 0.3.5", + "time 0.3.6", ] [[package]] @@ -4957,7 +4966,7 @@ dependencies = [ "tendermint-config", "tendermint-proto", "thiserror", - "time 0.3.5", + "time 0.3.6", "tokio", "tracing", "url", @@ -5023,12 +5032,13 @@ dependencies = [ [[package]] name = "time" -version = "0.3.5" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41effe7cfa8af36f439fac33861b66b049edc6f9a32331e2312660529c1c24ad" +checksum = "c8d54b9298e05179c335de2b9645d061255bcd5155f843b3e328d2cfe0a5b413" dependencies = [ + "itoa 1.0.1", "libc", - "serde", + "num_threads", "time-macros", ]