From 513a934ff6a57f562aeecdf4ceef2b5b6b66b43a Mon Sep 17 00:00:00 2001 From: Tyera Eulberg Date: Sun, 26 Aug 2018 22:14:20 -0600 Subject: [PATCH] Update request_airdrop utility function to pass along airdrop tx signature --- src/wallet.rs | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/src/wallet.rs b/src/wallet.rs index 399d30382a..cabd760bda 100644 --- a/src/wallet.rs +++ b/src/wallet.rs @@ -1,15 +1,18 @@ -use bincode::serialize; +use bincode::{deserialize, serialize}; use drone::DroneRequest; -use signature::Pubkey; +use signature::{Pubkey, Signature}; use std::error; -use std::io::Write; +use std::io::prelude::*; +use std::io::{Error, ErrorKind, Write}; +use std::mem::size_of; use std::net::{SocketAddr, TcpStream}; pub fn request_airdrop( drone_addr: &SocketAddr, id: &Pubkey, tokens: u64, -) -> Result<(), Box> { +) -> Result> { + // TODO: make this async tokio client let mut stream = TcpStream::connect(drone_addr)?; let req = DroneRequest::GetAirdrop { airdrop_request_amount: tokens, @@ -17,6 +20,16 @@ pub fn request_airdrop( }; let tx = serialize(&req).expect("serialize drone request"); stream.write_all(&tx).unwrap(); + let mut buffer = [0; size_of::()]; + stream + .read_exact(&mut buffer) + .or_else(|_| Err(Error::new(ErrorKind::Other, "Airdrop failed")))?; + let signature: Signature = deserialize(&buffer).or_else(|err| { + Err(Error::new( + ErrorKind::Other, + format!("deserialize signature in request_airdrop: {:?}", err), + )) + })?; // TODO: add timeout to this function, in case of unresponsive drone - Ok(()) + Ok(signature) }