From 10000b4b34ebdac27571b05ebd2c6faf45af5595 Mon Sep 17 00:00:00 2001
From: Boog900 <boog900@tutanota.com>
Date: Wed, 8 Jan 2025 01:58:43 +0000
Subject: [PATCH 1/3] rpc/types: add missing defaults to fields (#361)

* add defaults to fields

* Update rpc/types/src/bin.rs

Co-authored-by: hinto-janai <hinto.janai@protonmail.com>

---------

Co-authored-by: hinto-janai <hinto.janai@protonmail.com>
---
 rpc/types/src/bin.rs | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/rpc/types/src/bin.rs b/rpc/types/src/bin.rs
index 414214ca..344aae33 100644
--- a/rpc/types/src/bin.rs
+++ b/rpc/types/src/bin.rs
@@ -132,8 +132,9 @@ define_request_and_response! {
         start_height: u64,
         current_height: u64,
         output_indices: Vec<BlockOutputIndices>,
-        daemon_time: u64,
-        pool_info: PoolInfo,
+        daemon_time: u64 = default_zero::<u64>(), "default_zero",
+        // FIXME: use `default()` after <https://github.com/Cuprate/cuprate/pull/355>
+        pool_info: PoolInfo = PoolInfo::None, "PoolInfo::default",
     }
 }
 

From 79e4789e6a89b3302b9e83c5d03e75ef40280a50 Mon Sep 17 00:00:00 2001
From: Boog900 <boog900@tutanota.com>
Date: Wed, 8 Jan 2025 03:49:59 +0000
Subject: [PATCH 2/3] rpc/types 32 bit support (#334)

* rpc/types 32 bit support

* fix docs

* add 32 bit check to CI

* remove `cuprate-types`

* add comments to CI

* Apply suggestions from code review

Co-authored-by: hinto-janai <hinto.janai@protonmail.com>

---------

Co-authored-by: hinto-janai <hinto.janai@protonmail.com>
---
 .github/workflows/ci.yml        | 29 +++++++++++++++++++++++++++++
 Cargo.lock                      |  1 -
 net/epee-encoding/Cargo.toml    |  1 -
 net/epee-encoding/src/lib.rs    | 12 +++++-------
 net/epee-encoding/src/value.rs  | 19 +++++--------------
 net/epee-encoding/src/varint.rs | 26 ++++++++++++++++----------
 6 files changed, 55 insertions(+), 33 deletions(-)

diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 367e8e14..9b9a1778 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -46,6 +46,35 @@ jobs:
     - name: Spell Check
       uses: crate-ci/typos@master
 
+  # Run 32-bit WASM support check separately.
+  wasm-32-bit-support:
+    runs-on: ubuntu-latest
+
+    strategy:
+      matrix:
+        # The list of crates to check for WASM 32 bit support
+        #  TODO: check features.
+        crate: [
+            cuprate-epee-encoding,
+            cuprate-rpc-types,
+            cuprate-fixed-bytes,
+        ]
+
+    steps:
+      - name: Checkout
+        uses: actions/checkout@v4
+        with:
+          submodules: recursive
+
+      - name: Install Rust
+        uses: dtolnay/rust-toolchain@master
+        with:
+          toolchain: stable
+          targets: wasm32-unknown-unknown
+
+      - name: Build WASM 32-bit
+        run: cargo build --target wasm32-unknown-unknown -p ${{ matrix.crate }}
+
   # All other CI.
   ci:
     runs-on: ${{ matrix.os }}
diff --git a/Cargo.lock b/Cargo.lock
index fda0fce4..1cd13f8b 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -884,7 +884,6 @@ version = "0.5.0"
 dependencies = [
  "bytes",
  "cuprate-fixed-bytes",
- "cuprate-helper",
  "hex",
  "paste",
  "ref-cast",
diff --git a/net/epee-encoding/Cargo.toml b/net/epee-encoding/Cargo.toml
index 4724e2d0..0270e7ef 100644
--- a/net/epee-encoding/Cargo.toml
+++ b/net/epee-encoding/Cargo.toml
@@ -15,7 +15,6 @@ default = ["std"]
 std = ["dep:thiserror", "bytes/std", "cuprate-fixed-bytes/std"]
 
 [dependencies]
-cuprate-helper      = { workspace = true, default-features = false, features = ["cast"] }
 cuprate-fixed-bytes = { workspace = true, default-features = false }
 
 paste = "1.0.15"
diff --git a/net/epee-encoding/src/lib.rs b/net/epee-encoding/src/lib.rs
index a6ff1b04..a814cac1 100644
--- a/net/epee-encoding/src/lib.rs
+++ b/net/epee-encoding/src/lib.rs
@@ -69,8 +69,6 @@ use core::str::from_utf8 as str_from_utf8;
 
 use bytes::{Buf, BufMut, Bytes, BytesMut};
 
-use cuprate_helper::cast::{u64_to_usize, usize_to_u64};
-
 pub mod container_as_blob;
 pub mod error;
 mod io;
@@ -89,7 +87,7 @@ pub use varint::{read_varint, write_varint};
 /// this binary serialization format.
 const HEADER: &[u8] = b"\x01\x11\x01\x01\x01\x01\x02\x01\x01";
 /// The maximum length a byte array (marked as a string) can be.
-const MAX_STRING_LEN_POSSIBLE: u64 = 2000000000;
+const MAX_STRING_LEN_POSSIBLE: usize = 2000000000;
 /// The maximum depth of skipped objects.
 const MAX_DEPTH_OF_SKIPPED_OBJECTS: u8 = 20;
 /// The maximum number of fields in an object.
@@ -248,7 +246,7 @@ pub fn write_bytes<T: AsRef<[u8]>, B: BufMut>(t: T, w: &mut B) -> Result<()> {
     let bytes = t.as_ref();
     let len = bytes.len();
 
-    write_varint(usize_to_u64(len), w)?;
+    write_varint(len, w)?;
 
     if w.remaining_mut() < len {
         return Err(Error::IO("Not enough capacity to write bytes"));
@@ -292,7 +290,7 @@ where
     I: Iterator<Item = T> + ExactSizeIterator,
     B: BufMut,
 {
-    write_varint(usize_to_u64(iterator.len()), w)?;
+    write_varint(iterator.len(), w)?;
     for item in iterator {
         item.write(w)?;
     }
@@ -337,7 +335,7 @@ fn skip_epee_value<B: Buf>(r: &mut B, skipped_objects: &mut u8) -> Result<()> {
 
     if let Some(size) = marker.inner_marker.size() {
         let bytes_to_skip = size
-            .checked_mul(u64_to_usize(len))
+            .checked_mul(len.try_into()?)
             .ok_or(Error::Value("List is too big".to_string()))?;
         return advance(bytes_to_skip, r);
     };
@@ -355,7 +353,7 @@ fn skip_epee_value<B: Buf>(r: &mut B, skipped_objects: &mut u8) -> Result<()> {
             | InnerMarker::U8
             | InnerMarker::Bool => unreachable!("These types are constant size."),
             InnerMarker::String => {
-                let len = u64_to_usize(read_varint(r)?);
+                let len = read_varint(r)?;
                 advance(len, r)?;
             }
             InnerMarker::Object => {
diff --git a/net/epee-encoding/src/value.rs b/net/epee-encoding/src/value.rs
index 4762c96a..c02e6da7 100644
--- a/net/epee-encoding/src/value.rs
+++ b/net/epee-encoding/src/value.rs
@@ -7,7 +7,6 @@ use core::fmt::Debug;
 use bytes::{Buf, BufMut, Bytes, BytesMut};
 
 use cuprate_fixed_bytes::{ByteArray, ByteArrayVec};
-use cuprate_helper::cast::u64_to_usize;
 
 use crate::{
     io::{checked_read_primitive, checked_write_primitive},
@@ -67,7 +66,7 @@ impl<T: EpeeObject> EpeeValue for Vec<T> {
                 "Marker is not sequence when a sequence was expected",
             ));
         }
-        let len = u64_to_usize(read_varint(r)?);
+        let len = read_varint(r)?;
 
         let individual_marker = Marker::new(marker.inner_marker);
 
@@ -168,8 +167,6 @@ impl EpeeValue for Vec<u8> {
             return Err(Error::Format("Byte array exceeded max length"));
         }
 
-        let len = u64_to_usize(len);
-
         if r.remaining() < len {
             return Err(Error::IO("Not enough bytes to fill object"));
         }
@@ -206,8 +203,6 @@ impl EpeeValue for Bytes {
             return Err(Error::Format("Byte array exceeded max length"));
         }
 
-        let len = u64_to_usize(len);
-
         if r.remaining() < len {
             return Err(Error::IO("Not enough bytes to fill object"));
         }
@@ -241,8 +236,6 @@ impl EpeeValue for BytesMut {
             return Err(Error::Format("Byte array exceeded max length"));
         }
 
-        let len = u64_to_usize(len);
-
         if r.remaining() < len {
             return Err(Error::IO("Not enough bytes to fill object"));
         }
@@ -274,13 +267,11 @@ impl<const N: usize> EpeeValue for ByteArrayVec<N> {
             return Err(Error::Format("Marker does not match expected Marker"));
         }
 
-        let len = read_varint(r)?;
+        let len = read_varint::<_, usize>(r)?;
         if len > MAX_STRING_LEN_POSSIBLE {
             return Err(Error::Format("Byte array exceeded max length"));
         }
 
-        let len = u64_to_usize(len);
-
         if r.remaining() < len {
             return Err(Error::IO("Not enough bytes to fill object"));
         }
@@ -310,7 +301,7 @@ impl<const N: usize> EpeeValue for ByteArray<N> {
             return Err(Error::Format("Marker does not match expected Marker"));
         }
 
-        let len = u64_to_usize(read_varint(r)?);
+        let len = read_varint::<_, usize>(r)?;
         if len != N {
             return Err(Error::Format("Byte array has incorrect length"));
         }
@@ -377,7 +368,7 @@ impl<const N: usize> EpeeValue for Vec<[u8; N]> {
             ));
         }
 
-        let len = u64_to_usize(read_varint(r)?);
+        let len = read_varint(r)?;
 
         let individual_marker = Marker::new(marker.inner_marker);
 
@@ -413,7 +404,7 @@ macro_rules! epee_seq {
                     ));
                 }
 
-                let len = u64_to_usize(read_varint(r)?);
+                let len = read_varint(r)?;
 
                 let individual_marker = Marker::new(marker.inner_marker.clone());
 
diff --git a/net/epee-encoding/src/varint.rs b/net/epee-encoding/src/varint.rs
index 3f191dc7..fc862dfd 100644
--- a/net/epee-encoding/src/varint.rs
+++ b/net/epee-encoding/src/varint.rs
@@ -12,14 +12,14 @@ const FITS_IN_FOUR_BYTES: u64 = 2_u64.pow(32 - SIZE_OF_SIZE_MARKER) - 1;
 /// ```rust
 /// use cuprate_epee_encoding::read_varint;
 ///
-/// assert_eq!(read_varint(&mut [252].as_slice()).unwrap(), 63);
-/// assert_eq!(read_varint(&mut [1, 1].as_slice()).unwrap(), 64);
-/// assert_eq!(read_varint(&mut [253, 255].as_slice()).unwrap(), 16_383);
-/// assert_eq!(read_varint(&mut [2, 0, 1, 0].as_slice()).unwrap(), 16_384);
-/// assert_eq!(read_varint(&mut [254, 255, 255, 255].as_slice()).unwrap(), 1_073_741_823);
-/// assert_eq!(read_varint(&mut [3, 0, 0, 0, 1, 0, 0, 0].as_slice()).unwrap(), 1_073_741_824);
+/// assert_eq!(read_varint::<_, u64>(&mut [252].as_slice()).unwrap(), 63);
+/// assert_eq!(read_varint::<_, u64>(&mut [1, 1].as_slice()).unwrap(), 64);
+/// assert_eq!(read_varint::<_, u64>(&mut [253, 255].as_slice()).unwrap(), 16_383);
+/// assert_eq!(read_varint::<_, u64>(&mut [2, 0, 1, 0].as_slice()).unwrap(), 16_384);
+/// assert_eq!(read_varint::<_, u64>(&mut [254, 255, 255, 255].as_slice()).unwrap(), 1_073_741_823);
+/// assert_eq!(read_varint::<_, u64>(&mut [3, 0, 0, 0, 1, 0, 0, 0].as_slice()).unwrap(), 1_073_741_824);
 /// ```
-pub fn read_varint<B: Buf>(r: &mut B) -> Result<u64> {
+pub fn read_varint<B: Buf, T: TryFrom<u64>>(r: &mut B) -> Result<T> {
     if !r.has_remaining() {
         return Err(Error::IO("Not enough bytes to build VarInt"));
     }
@@ -35,7 +35,8 @@ pub fn read_varint<B: Buf>(r: &mut B) -> Result<u64> {
     for i in 1..len {
         vi |= u64::from(r.get_u8()) << (((i - 1) * 8) + 6);
     }
-    Ok(vi)
+
+    vi.try_into().map_err(|_| Error::IO("VarInt is too big"))
 }
 
 /// Write an epee variable sized number into `w`.
@@ -58,7 +59,12 @@ pub fn read_varint<B: Buf>(r: &mut B) -> Result<u64> {
 ///     assert_eq!(buf.as_slice(), expected_bytes);
 /// }
 /// ```
-pub fn write_varint<B: BufMut>(number: u64, w: &mut B) -> Result<()> {
+pub fn write_varint<B: BufMut, T: TryInto<u64>>(number: T, w: &mut B) -> Result<()> {
+    let number = number
+        .try_into()
+        .map_err(|_| "Tried to write a varint bigger than 64-bits")
+        .unwrap();
+
     let size_marker = match number {
         0..=FITS_IN_ONE_BYTE => 0,
         64..=FITS_IN_TWO_BYTES => 1,
@@ -101,7 +107,7 @@ mod tests {
     }
 
     fn assert_varint_val(mut varint: &[u8], val: u64) {
-        assert_eq!(read_varint(&mut varint).unwrap(), val);
+        assert_eq!(read_varint::<_, u64>(&mut varint).unwrap(), val);
     }
 
     #[test]

From cebb71d7dccb9f7cf66293ea487e20bb29530e8c Mon Sep 17 00:00:00 2001
From: SyntheticBird <syntheticbirdxmr@protonmail.com>
Date: Tue, 14 Jan 2025 01:38:14 +0000
Subject: [PATCH 3/3] misc: Update SyntheticBird PGP key (#362)

Update SyntheticBird PGP key

I changed my email very recently (and hopefully stay on it).
This key is also used to sign my future commits.
---
 misc/gpg_keys/syntheticbird.asc | 23 ++++++++++++-----------
 1 file changed, 12 insertions(+), 11 deletions(-)

diff --git a/misc/gpg_keys/syntheticbird.asc b/misc/gpg_keys/syntheticbird.asc
index 963b7f73..a7e97316 100644
--- a/misc/gpg_keys/syntheticbird.asc
+++ b/misc/gpg_keys/syntheticbird.asc
@@ -1,14 +1,15 @@
 -----BEGIN PGP PUBLIC KEY BLOCK-----
 
-mDMEZb0y4RYJKwYBBAHaRw8BAQdAvMid+QsSxLULIkKPLf0XWgPxaoG89qPNiQ4S
-fXH0BfW0VlN5bnRoZXRpY0JpcmQ0NSAoQ3VwcmF0ZSdzIGRldmVsb3BlcikgPHNv
-bWVvbmVlbHNlLmlzX29uLmdpdGh1Yi5yaW83eEBzaW1wbGVsb2dpbi5jb20+iJME
-ExYKADsWIQQEmOfWc9FTBiAKoHnHaXP3SFIeEQUCZb0y4QIbAwULCQgHAgIiAgYV
-CgkICwIEFgIDAQIeBwIXgAAKCRDHaXP3SFIeEUx+AQDYd7t75+V4/aSTczLxMGuT
-A84qGRuYNStXUJzjV8F21wD/YVlybZcr9dDQ/+YOgh5aXBzo+oGm+XhhSbI3QdIX
-LAC4OARlvTLhEgorBgEEAZdVAQUBAQdAgRoSFUmnCqETElyry97kFwsdzlNyldk2
-ZPgH9J4fCHwDAQgHiHgEGBYKACAWIQQEmOfWc9FTBiAKoHnHaXP3SFIeEQUCZb0y
-4QIbDAAKCRDHaXP3SFIeETDSAP4k8+jUaStnjrkzN1jvRg136qNfwe8ZzjrsWJ0n
-FOS8zAEA/fwRjRyvEP28KJNiKdyhDYWYJTpyLGTiPP8b43NsHAM=
-=gqqy
+mDMEZ4GuPxYJKwYBBAHaRw8BAQdAQFWzCHuyJ9jWtUDQayE3MmWVREIusc2MVuzY
+dYetE+20V1N5bnRoZXRpY0JpcmQgKEN1cHJhdGUgZGV2ZWxvcGVyLCBNb25lcm8g
+Y29udHJpYnV0b3IpIDxzeW50aGV0aWNiaXJkeG1yQHByb3Rvbm1haWwuY29tPoiZ
+BBMWCgBBFiEEVnEONDQa+3BwEBfopfyUokH0BgwFAmeBrj8CGwMFCQPCZwAFCwkI
+BwICIgIGFQoJCAsCBBYCAwECHgcCF4AACgkQpfyUokH0BgxXnAEArUNk7MHclNDq
+Bt2NdKF4HUjstpascmONWDpS/m7MFtsBAJTQKja7NiJ6qrjgKDYoLGSDSmZr6hlb
+RMWf7taE444GuDgEZ4GuPxIKKwYBBAGXVQEFAQEHQMN4rVFJjFgnFvm+RVCaIgZ3
+59nzmAPrMWG1MEPz1k8AAwEIB4h+BBgWCgAmFiEEVnEONDQa+3BwEBfopfyUokH0
+BgwFAmeBrj8CGwwFCQPCZwAACgkQpfyUokH0Bgwt+QD/TuE65+AAS3nsnhhT9kgX
+9AfP3Ns3GDAcI7DkNBrEOF8A/0nZaezH3keuHTzsmRblV4nUD6Yqn4bbs8BGH4Ox
+k6EG
+=3x7Z
 -----END PGP PUBLIC KEY BLOCK-----