From 6ca91b18e1d260915e2ac889c383b4784e45de8f Mon Sep 17 00:00:00 2001 From: gusarsleeping186 Date: Mon, 20 May 2024 21:30:15 +0200 Subject: [PATCH 1/5] Implement RPC api calls for integrated address --- .gitignore | 1 + src/lib.rs | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+) diff --git a/.gitignore b/.gitignore index 6936990..d889fbf 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ /target **/*.rs.bk Cargo.lock +.idea diff --git a/src/lib.rs b/src/lib.rs index 863ee2a..e722978 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -814,6 +814,53 @@ impl WalletClient { Ok((rsp.address, rsp.address_index)) } + /// Make an integrated address from the wallet address and a payment id. + pub async fn make_integrated_address( + &self, + standard_address: Option, + payment_id: Option + ) -> anyhow::Result<(String, String)> { + #[derive(Deserialize)] + struct Rsp { + integrated_address: String, + payment_id: String, + } + + let params = empty() + .chain(standard_address.map(|v| ("standard_address", Value::String(v)))) + .chain(payment_id.map(|v| ("payment_id", Value::String(v)))); + + let rsp = self + .inner + .request::("make_integrated_address", RpcParams::map(params)) + .await?; + + Ok((rsp.integrated_address, rsp.payment_id)) + } + + /// Retrieve the standard address and payment id corresponding to an integrated address. + pub async fn split_integrated_address( + &self, + integrated_address: String + ) -> anyhow::Result<(bool, String, String)> { + #[derive(Deserialize)] + struct Rsp { + is_subaddress: bool, + payment: String, + standard_address: String + } + + let params = empty() + .chain(once(("integrated_address", integrated_address.into()))); + + let rsp = self + .inner + .request::("split_integrated_address", RpcParams::map(params)) + .await?; + + Ok((rsp.is_subaddress, rsp.payment, rsp.standard_address)) + } + /// Label an address. pub async fn label_address( &self, From 69f2266afd4db7a6f4b0ee0931c51b145762a94c Mon Sep 17 00:00:00 2001 From: gusarsleeping186 Date: Thu, 30 May 2024 14:03:30 +0200 Subject: [PATCH 2/5] Should be okay now --- src/lib.rs | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index e722978..a32e274 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -817,18 +817,18 @@ impl WalletClient { /// Make an integrated address from the wallet address and a payment id. pub async fn make_integrated_address( &self, - standard_address: Option, - payment_id: Option - ) -> anyhow::Result<(String, String)> { + standard_address: Option
, + payment_id: Option + ) -> anyhow::Result<(String, HashString>)> { #[derive(Deserialize)] struct Rsp { integrated_address: String, - payment_id: String, + payment_id: HashString>, } let params = empty() - .chain(standard_address.map(|v| ("standard_address", Value::String(v)))) - .chain(payment_id.map(|v| ("payment_id", Value::String(v)))); + .chain(standard_address.map(|v| ("standard_address", v.to_string().into()))) + .chain(payment_id.map(|v| ("payment_id", HashString(v).to_string().into()))); let rsp = self .inner @@ -841,17 +841,17 @@ impl WalletClient { /// Retrieve the standard address and payment id corresponding to an integrated address. pub async fn split_integrated_address( &self, - integrated_address: String - ) -> anyhow::Result<(bool, String, String)> { + integrated_address: Address + ) -> anyhow::Result<(bool, HashString>, String)> { #[derive(Deserialize)] struct Rsp { is_subaddress: bool, - payment: String, + payment: HashString>, standard_address: String } let params = empty() - .chain(once(("integrated_address", integrated_address.into()))); + .chain(once(("integrated_address", integrated_address.to_string().into()))); let rsp = self .inner From 1224f6c30b34bbd044d0bdcfede52c81690bb013 Mon Sep 17 00:00:00 2001 From: gusarsleeping186 Date: Thu, 30 May 2024 14:36:04 +0200 Subject: [PATCH 3/5] Types for address --- src/lib.rs | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index a32e274..6e89455 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -78,11 +78,13 @@ use std::{ ops::{Deref, RangeInclusive}, sync::Arc, }; +use std::str::FromStr; use tracing::*; use uuid::Uuid; #[cfg(feature = "rpc_authentication")] use diqwest::WithDigestAuth; +use hex::FromHex; enum RpcParams { Array(Box + Send + 'static>), @@ -819,7 +821,7 @@ impl WalletClient { &self, standard_address: Option
, payment_id: Option - ) -> anyhow::Result<(String, HashString>)> { + ) -> anyhow::Result<(Address, HashString>)> { #[derive(Deserialize)] struct Rsp { integrated_address: String, @@ -835,14 +837,14 @@ impl WalletClient { .request::("make_integrated_address", RpcParams::map(params)) .await?; - Ok((rsp.integrated_address, rsp.payment_id)) + Ok((Address::from_str(&rsp.integrated_address)?, rsp.payment_id)) } /// Retrieve the standard address and payment id corresponding to an integrated address. pub async fn split_integrated_address( &self, integrated_address: Address - ) -> anyhow::Result<(bool, HashString>, String)> { + ) -> anyhow::Result<(bool, PaymentId, Address)> { #[derive(Deserialize)] struct Rsp { is_subaddress: bool, @@ -858,7 +860,7 @@ impl WalletClient { .request::("split_integrated_address", RpcParams::map(params)) .await?; - Ok((rsp.is_subaddress, rsp.payment, rsp.standard_address)) + Ok((rsp.is_subaddress, PaymentId::from_hex(rsp.payment.to_string())?, Address::from_str(&rsp.standard_address)?)) } /// Label an address. From 122ba77659a0e4af3c714d30dc989614818671f8 Mon Sep 17 00:00:00 2001 From: gusarsleeping186 Date: Thu, 30 May 2024 14:38:40 +0200 Subject: [PATCH 4/5] fix --- src/lib.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 6e89455..45bced5 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -821,7 +821,7 @@ impl WalletClient { &self, standard_address: Option
, payment_id: Option - ) -> anyhow::Result<(Address, HashString>)> { + ) -> anyhow::Result<(Address, PaymentId)> { #[derive(Deserialize)] struct Rsp { integrated_address: String, @@ -837,7 +837,7 @@ impl WalletClient { .request::("make_integrated_address", RpcParams::map(params)) .await?; - Ok((Address::from_str(&rsp.integrated_address)?, rsp.payment_id)) + Ok((Address::from_str(&rsp.integrated_address)?, PaymentId::from_hex(rsp.payment_id.to_string())?)) } /// Retrieve the standard address and payment id corresponding to an integrated address. From 0d2cfd53d4188f17971e7b23ad1dd4db92604cf8 Mon Sep 17 00:00:00 2001 From: gusarsleeping186 Date: Thu, 30 May 2024 15:12:57 +0200 Subject: [PATCH 5/5] Fix formatting --- src/lib.rs | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 45bced5..a6a8973 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -69,6 +69,7 @@ use monero::{ }; use serde::{de::IgnoredAny, Deserialize, Deserializer, Serialize, Serializer}; use serde_json::{json, Value}; +use std::str::FromStr; use std::{ collections::HashMap, convert::TryFrom, @@ -78,7 +79,6 @@ use std::{ ops::{Deref, RangeInclusive}, sync::Arc, }; -use std::str::FromStr; use tracing::*; use uuid::Uuid; @@ -820,7 +820,7 @@ impl WalletClient { pub async fn make_integrated_address( &self, standard_address: Option
, - payment_id: Option + payment_id: Option, ) -> anyhow::Result<(Address, PaymentId)> { #[derive(Deserialize)] struct Rsp { @@ -837,30 +837,39 @@ impl WalletClient { .request::("make_integrated_address", RpcParams::map(params)) .await?; - Ok((Address::from_str(&rsp.integrated_address)?, PaymentId::from_hex(rsp.payment_id.to_string())?)) + Ok(( + Address::from_str(&rsp.integrated_address)?, + PaymentId::from_hex(rsp.payment_id.to_string())?, + )) } /// Retrieve the standard address and payment id corresponding to an integrated address. pub async fn split_integrated_address( &self, - integrated_address: Address + integrated_address: Address, ) -> anyhow::Result<(bool, PaymentId, Address)> { #[derive(Deserialize)] struct Rsp { is_subaddress: bool, payment: HashString>, - standard_address: String + standard_address: String, } - let params = empty() - .chain(once(("integrated_address", integrated_address.to_string().into()))); + let params = empty().chain(once(( + "integrated_address", + integrated_address.to_string().into(), + ))); let rsp = self .inner .request::("split_integrated_address", RpcParams::map(params)) .await?; - Ok((rsp.is_subaddress, PaymentId::from_hex(rsp.payment.to_string())?, Address::from_str(&rsp.standard_address)?)) + Ok(( + rsp.is_subaddress, + PaymentId::from_hex(rsp.payment.to_string())?, + Address::from_str(&rsp.standard_address)?, + )) } /// Label an address.