35 lines
1.1 KiB
Rust
35 lines
1.1 KiB
Rust
use bincode::{deserialize, serialize};
|
|
use drone::DroneRequest;
|
|
use signature::{Pubkey, Signature};
|
|
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<Signature, Error> {
|
|
// TODO: make this async tokio client
|
|
let mut stream = TcpStream::connect(drone_addr)?;
|
|
let req = DroneRequest::GetAirdrop {
|
|
airdrop_request_amount: tokens,
|
|
client_pubkey: *id,
|
|
};
|
|
let tx = serialize(&req).expect("serialize drone request");
|
|
stream.write_all(&tx)?;
|
|
let mut buffer = [0; size_of::<Signature>()];
|
|
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(signature)
|
|
}
|