From 9e03e020fdb38415b4dd3f97d602ec99655dc863 Mon Sep 17 00:00:00 2001 From: ghassmo Date: Thu, 14 Oct 2021 10:24:31 +0300 Subject: [PATCH] bridge: reverse truncate when withdraw the token --- src/service/bridge.rs | 11 ++++++++--- src/service/btc.rs | 2 +- src/service/sol.rs | 29 ++++++++++++++++++++++++----- 3 files changed, 33 insertions(+), 9 deletions(-) diff --git a/src/service/bridge.rs b/src/service/bridge.rs index 5b8cd99c8..9d26e6872 100644 --- a/src/service/bridge.rs +++ b/src/service/bridge.rs @@ -53,7 +53,7 @@ pub struct TokenNotification { pub token_id: jubjub::Fr, pub drk_pub_key: jubjub::SubgroupPoint, pub received_balance: u64, - pub decimals: u16 + pub decimals: u16, } pub struct Bridge { @@ -178,7 +178,7 @@ impl Bridge { } }, BridgeRequestsPayload::Send(addr, amount) => { - client.send(addr, amount).await?; + client.send(addr, mint_address, amount).await?; let res = BridgeResponse { error: BridgeResponseError::NoError, payload: BridgeResponsePayload::Send, @@ -210,5 +210,10 @@ pub trait NetworkClient { async fn get_notifier(self: Arc) -> Result>; - async fn send(self: Arc, address: Vec, amount: u64) -> Result<()>; + async fn send( + self: Arc, + address: Vec, + mint: Option, + amount: u64, + ) -> Result<()>; } diff --git a/src/service/btc.rs b/src/service/btc.rs index 8bfd3bf8a..1f2774933 100644 --- a/src/service/btc.rs +++ b/src/service/btc.rs @@ -392,7 +392,7 @@ impl NetworkClient for BtcClient { async fn get_notifier(self: Arc) -> Result> { Ok(self.notify_channel.1.clone()) } - async fn send(self: Arc, address: Vec, amount: u64) -> Result<()> { + async fn send(self: Arc, address: Vec, _mint: Option, amount: u64) -> Result<()> { // address is not a btc address, so derive the btc address let client = &self.client; let public_key = deserialize(&address)?; diff --git a/src/service/sol.rs b/src/service/sol.rs index a6d8976e0..d993af316 100644 --- a/src/service/sol.rs +++ b/src/service/sol.rs @@ -26,7 +26,7 @@ use tungstenite::Message; use super::bridge::{NetworkClient, TokenNotification, TokenSubscribtion}; use crate::rpc::{jsonrpc, jsonrpc::JsonResult, websockets, websockets::WsStream}; use crate::serial::{deserialize, serialize, Decodable, Encodable}; -use crate::util::{generate_id, NetworkName}; +use crate::util::{generate_id, NetworkName, parse::truncate}; use crate::{Error, Result}; pub const SOL_NATIVE_TOKEN_ID: &str = "So11111111111111111111111111111111111111112"; @@ -235,7 +235,7 @@ impl SolClient { token_id: generate_id(&mint.unwrap().to_string(), &NetworkName::Solana)?, drk_pub_key, received_balance: amnt, - decimals: decimals as u16 + decimals: decimals as u16, }) .await .map_err(Error::from)?; @@ -252,7 +252,7 @@ impl SolClient { token_id: generate_id(SOL_NATIVE_TOKEN_ID, &NetworkName::Solana)?, drk_pub_key, received_balance: amnt, - decimals: decimals as u16 + decimals: decimals as u16, }) .await .map_err(Error::from)?; @@ -297,7 +297,7 @@ impl SolClient { keypair: &Keypair, ) -> SolResult { debug!(target: "SOL BRIDGE", "Sending {} {:?} tokens to main wallet", - amount / u64::pow(10, decimals as u32), mint); + amount / u64::pow(10, decimals as u32), mint); // The token account from our main wallet let main_tok_pk = get_associated_token_address(&self.main_keypair.pubkey(), mint); @@ -464,9 +464,28 @@ impl NetworkClient for SolClient { Ok(self.notify_channel.1.clone()) } - async fn send(self: Arc, address: Vec, amount: u64) -> Result<()> { + async fn send( + self: Arc, + address: Vec, + mint: Option, + amount: u64, + ) -> Result<()> { let rpc = RpcClient::new(self.rpc_server.to_string()); let address: Pubkey = deserialize(&address)?; + + let mut decimals = 9; + + if mint.is_some() { + let mint_address: Option = self.check_mint_address(mint)?; + if let Some(mint_addr) = mint_address { + let tkn = rpc.get_token_supply(&mint_addr).map_err(SolFailed::from)?; + decimals = tkn.decimals; + }; + } + + // reverse truncate + truncate(amount, decimals as u16, 8)?; + let instruction = system_instruction::transfer(&self.main_keypair.pubkey(), &address, amount);