Payment URI
This commit is contained in:
parent
b8c41fe9b3
commit
7d37177bec
|
@ -32,6 +32,10 @@ use zcash_primitives::memo::Memo;
|
||||||
use std::str::FromStr;
|
use std::str::FromStr;
|
||||||
use crate::contact::{Contact, serialize_contacts};
|
use crate::contact::{Contact, serialize_contacts};
|
||||||
use lazycell::AtomicLazyCell;
|
use lazycell::AtomicLazyCell;
|
||||||
|
use zcash_client_backend::zip321::{Payment, TransactionRequest};
|
||||||
|
use crate::coin::TICKER;
|
||||||
|
use std::convert::TryFrom;
|
||||||
|
use serde::Serialize;
|
||||||
|
|
||||||
const DEFAULT_CHUNK_SIZE: u32 = 100_000;
|
const DEFAULT_CHUNK_SIZE: u32 = 100_000;
|
||||||
|
|
||||||
|
@ -524,6 +528,61 @@ impl Wallet {
|
||||||
pub fn truncate_data(&self) -> anyhow::Result<()> {
|
pub fn truncate_data(&self) -> anyhow::Result<()> {
|
||||||
self.db.truncate_data()
|
self.db.truncate_data()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn make_payment_uri(address: &str, amount: u64, memo: &str) -> anyhow::Result<String> {
|
||||||
|
let addr = RecipientAddress::decode(&NETWORK, address).ok_or_else(|| anyhow::anyhow!("Invalid address"))?;
|
||||||
|
let payment = Payment {
|
||||||
|
recipient_address: addr,
|
||||||
|
amount: Amount::from_u64(amount).map_err(|_| anyhow::anyhow!("Invalid amount"))?,
|
||||||
|
memo: Some(Memo::from_str(memo)?.into()),
|
||||||
|
label: None,
|
||||||
|
message: None,
|
||||||
|
other_params: vec![]
|
||||||
|
};
|
||||||
|
let treq = TransactionRequest {
|
||||||
|
payments: vec![payment],
|
||||||
|
};
|
||||||
|
let uri = treq.to_uri(&NETWORK).ok_or_else(|| anyhow::anyhow!("Cannot build Payment URI"))?;
|
||||||
|
let uri = format!("{}{}", TICKER, &uri[5..]); // hack to replace the URI scheme
|
||||||
|
Ok(uri)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn parse_payment_uri(uri: &str) -> anyhow::Result<String> {
|
||||||
|
if uri[..5].ne(TICKER) {
|
||||||
|
anyhow::bail!("Invalid Payment URI");
|
||||||
|
}
|
||||||
|
let uri = format!("zcash{}", &uri[5..]); // hack to replace the URI scheme
|
||||||
|
let treq = TransactionRequest::from_uri(&NETWORK, &uri).map_err(|_| anyhow::anyhow!("Invalid Payment URI"))?;
|
||||||
|
if treq.payments.len() != 1 { anyhow::bail!("Invalid Payment URI") }
|
||||||
|
let payment = &treq.payments[0];
|
||||||
|
let memo = match payment.memo {
|
||||||
|
Some(ref memo) => {
|
||||||
|
let memo = Memo::try_from(memo.clone())?;
|
||||||
|
match memo {
|
||||||
|
Memo::Text(text) => Ok(text.to_string()),
|
||||||
|
Memo::Empty => Ok(String::new()),
|
||||||
|
_ => Err(anyhow::anyhow!("Invalid Memo")),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
None => Ok(String::new())
|
||||||
|
}?;
|
||||||
|
let payment = MyPayment {
|
||||||
|
address: payment.recipient_address.encode(&NETWORK),
|
||||||
|
amount: u64::from(payment.amount),
|
||||||
|
memo,
|
||||||
|
};
|
||||||
|
|
||||||
|
let payment_json = serde_json::to_string(&payment)?;
|
||||||
|
|
||||||
|
Ok(payment_json)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Serialize)]
|
||||||
|
struct MyPayment {
|
||||||
|
address: String,
|
||||||
|
amount: u64,
|
||||||
|
memo: String,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
|
|
Loading…
Reference in New Issue