mirror of
https://github.com/Qortal/piratewallet-light-cli.git
synced 2025-01-30 18:42:15 +00:00
Merge branch 'master' of github.com:adityapk00/zecwallet-light-cli
This commit is contained in:
commit
6cfbdaf60d
@ -1015,11 +1015,18 @@ impl LightClient {
|
|||||||
|
|
||||||
// Collect outgoing metadata
|
// Collect outgoing metadata
|
||||||
let outgoing_json = wtx.outgoing_metadata.iter()
|
let outgoing_json = wtx.outgoing_metadata.iter()
|
||||||
.map(|om|
|
.map(|om| {
|
||||||
object!{
|
let mut o = object!{
|
||||||
"address" => om.address.clone(),
|
"address" => om.address.clone(),
|
||||||
"value" => om.value,
|
"value" => om.value,
|
||||||
"memo" => LightWallet::memo_str(&Some(om.memo.clone())),
|
"memo" => LightWallet::memo_str(&Some(om.memo.clone())),
|
||||||
|
};
|
||||||
|
|
||||||
|
if include_memo_hex {
|
||||||
|
o.insert("memohex", hex::encode(om.memo.as_bytes())).unwrap();
|
||||||
|
}
|
||||||
|
|
||||||
|
return o;
|
||||||
}).collect::<Vec<JsonValue>>();
|
}).collect::<Vec<JsonValue>>();
|
||||||
|
|
||||||
object! {
|
object! {
|
||||||
|
@ -2074,22 +2074,12 @@ impl LightWallet {
|
|||||||
Some(s) => {
|
Some(s) => {
|
||||||
// If the string starts with an "0x", and contains only hex chars ([a-f0-9]+) then
|
// If the string starts with an "0x", and contains only hex chars ([a-f0-9]+) then
|
||||||
// interpret it as a hex
|
// interpret it as a hex
|
||||||
let s_bytes = if s.to_lowercase().starts_with("0x") {
|
match utils::interpret_memo_string(&s) {
|
||||||
match hex::decode(&s[2..s.len()]) {
|
Ok(m) => Some(m),
|
||||||
Ok(data) => data,
|
Err(e) => {
|
||||||
Err(_) => Vec::from(s.as_bytes())
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
Vec::from(s.as_bytes())
|
|
||||||
};
|
|
||||||
|
|
||||||
match Memo::from_bytes(&s_bytes) {
|
|
||||||
None => {
|
|
||||||
let e = format!("Error creating output. Memo {:?} is too long", s);
|
|
||||||
error!("{}", e);
|
error!("{}", e);
|
||||||
return Err(e);
|
return Err(e);
|
||||||
},
|
}
|
||||||
Some(m) => Some(m)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@ -2162,10 +2152,16 @@ impl LightWallet {
|
|||||||
None => Memo::default(),
|
None => Memo::default(),
|
||||||
Some(s) => {
|
Some(s) => {
|
||||||
// If the address is not a z-address, then drop the memo
|
// If the address is not a z-address, then drop the memo
|
||||||
if LightWallet::is_shielded_address(&addr.to_string(), &self.config) {
|
if !LightWallet::is_shielded_address(&addr.to_string(), &self.config) {
|
||||||
Memo::from_bytes(s.as_bytes()).unwrap()
|
|
||||||
} else {
|
|
||||||
Memo::default()
|
Memo::default()
|
||||||
|
} else {
|
||||||
|
match utils::interpret_memo_string(s) {
|
||||||
|
Ok(m) => m,
|
||||||
|
Err(e) => {
|
||||||
|
error!("{}", e);
|
||||||
|
Memo::default()
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -1412,6 +1412,16 @@ fn test_z_incoming_hex_memo() {
|
|||||||
let sent_tx = Transaction::read(&raw_tx[..]).unwrap();
|
let sent_tx = Transaction::read(&raw_tx[..]).unwrap();
|
||||||
let sent_txid = sent_tx.txid();
|
let sent_txid = sent_tx.txid();
|
||||||
|
|
||||||
|
// Make sure it is in the mempool properly
|
||||||
|
{
|
||||||
|
let mempool = wallet.mempool_txs.read().unwrap();
|
||||||
|
|
||||||
|
let wtx = mempool.get(&sent_txid).unwrap();
|
||||||
|
assert_eq!(wtx.outgoing_metadata.get(0).unwrap().address, my_address);
|
||||||
|
assert_eq!(wtx.outgoing_metadata.get(0).unwrap().value, AMOUNT1 - fee);
|
||||||
|
assert_eq!(wtx.outgoing_metadata.get(0).unwrap().memo.to_utf8().unwrap().unwrap(), orig_memo);
|
||||||
|
}
|
||||||
|
|
||||||
// Add it to a block
|
// Add it to a block
|
||||||
let mut cb3 = FakeCompactBlock::new(2, block_hash);
|
let mut cb3 = FakeCompactBlock::new(2, block_hash);
|
||||||
cb3.add_tx(&sent_tx);
|
cb3.add_tx(&sent_tx);
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
use std::io::{self, Read, Write};
|
use std::io::{self, Read, Write};
|
||||||
use byteorder::{LittleEndian, ReadBytesExt, WriteBytesExt};
|
use byteorder::{LittleEndian, ReadBytesExt, WriteBytesExt};
|
||||||
|
use zcash_primitives::note_encryption::Memo;
|
||||||
|
|
||||||
pub fn read_string<R: Read>(mut reader: R) -> io::Result<String> {
|
pub fn read_string<R: Read>(mut reader: R) -> io::Result<String> {
|
||||||
// Strings are written as <littleendian> len + bytes
|
// Strings are written as <littleendian> len + bytes
|
||||||
@ -18,4 +19,26 @@ pub fn write_string<W: Write>(mut writer: W, s: &String) -> io::Result<()> {
|
|||||||
// Strings are written as len + utf8
|
// Strings are written as len + utf8
|
||||||
writer.write_u64::<LittleEndian>(s.as_bytes().len() as u64)?;
|
writer.write_u64::<LittleEndian>(s.as_bytes().len() as u64)?;
|
||||||
writer.write_all(s.as_bytes())
|
writer.write_all(s.as_bytes())
|
||||||
|
}
|
||||||
|
|
||||||
|
// Interpret a string or hex-encoded memo, and return a Memo object
|
||||||
|
pub fn interpret_memo_string(memo_str: &String) -> Result<Memo, String> {
|
||||||
|
// If the string starts with an "0x", and contains only hex chars ([a-f0-9]+) then
|
||||||
|
// interpret it as a hex
|
||||||
|
let s_bytes = if memo_str.to_lowercase().starts_with("0x") {
|
||||||
|
match hex::decode(&memo_str[2..memo_str.len()]) {
|
||||||
|
Ok(data) => data,
|
||||||
|
Err(_) => Vec::from(memo_str.as_bytes())
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
Vec::from(memo_str.as_bytes())
|
||||||
|
};
|
||||||
|
|
||||||
|
match Memo::from_bytes(&s_bytes) {
|
||||||
|
None => {
|
||||||
|
let e = format!("Error creating output. Memo {:?} is too long", memo_str);
|
||||||
|
return Err(e);
|
||||||
|
},
|
||||||
|
Some(m) => Ok(m)
|
||||||
|
}
|
||||||
}
|
}
|
Loading…
Reference in New Issue
Block a user