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..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, @@ -83,6 +84,7 @@ use uuid::Uuid; #[cfg(feature = "rpc_authentication")] use diqwest::WithDigestAuth; +use hex::FromHex; enum RpcParams { Array(Box + Send + 'static>), @@ -814,6 +816,62 @@ 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<(Address, PaymentId)> { + #[derive(Deserialize)] + struct Rsp { + integrated_address: String, + payment_id: HashString>, + } + + let params = empty() + .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 + .request::("make_integrated_address", RpcParams::map(params)) + .await?; + + 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, + ) -> anyhow::Result<(bool, PaymentId, Address)> { + #[derive(Deserialize)] + struct Rsp { + is_subaddress: bool, + payment: HashString>, + standard_address: String, + } + + 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)?, + )) + } + /// Label an address. pub async fn label_address( &self,